{"version":3,"file":"all.min.js","sources":["../../node_modules/@progress-wad/site-polyfills/build/polyfills.js","../../node_modules/@progress-wad/data-attr-parser/index.mjs","../../src/js/modules/dataloader.js","../../src/js/modules/details-summary.js","../../src/js/modules/scroll-to-item.js","../../src/js/modules/support-css-property.js","../../src/js/modules/section-banner.js","../../src/js/modules/section-patch.js","../../src/js/modules/nav.js","../../src/js/modules/scroll-anchors.js","../../src/js/modules/scroll-to-form.js","../../node_modules/@progress-wad/social-share/src/social-share.js","../../src/js/modules/sharer.js","../../src/js/modules/toggle.js","../../src/js/modules/toggle-self.js","../../src/js/modules/tabs.js","../../src/js/modules/site-specific.js","../../node_modules/@progress-wad/litebox/src/litebox.js","../../src/js/modules/replacement-query-parameter.js","../../src/js/modules/randomized-slider.js","../../node_modules/dayjs/dayjs.min.js","../../src/js/modules/interactive.js","../../src/js/modules/local-date-time.js","../../src/js/modules/forms.js","../../src/js/modules/overlay-boxes.js","../../node_modules/@progress-wad/siema-slider/src/siema.js","../../node_modules/@progress-wad/sticky-element/index.js","../../node_modules/@progress-wad/site-search/build/index.es6.js","../../node_modules/@progress-wad/site-search/build/init.es6.js","../../node_modules/@progress-wad/youtube-lite-embed/youtube-lite-embed.js","../../node_modules/@progress-wad/multi-select/src/multi-select-item.js","../../node_modules/@progress-wad/multi-select/src/multi-select.js","../../src/js/all.mjs"],"sourcesContent":["(() => {\n // node_modules/compute-scroll-into-view/dist/index.js\n var t = (t2) => \"object\" == typeof t2 && null != t2 && 1 === t2.nodeType, e = (t2, e3) => (!e3 || \"hidden\" !== t2) && (\"visible\" !== t2 && \"clip\" !== t2), n = (t2, n2) => {\n if (t2.clientHeight < t2.scrollHeight || t2.clientWidth < t2.scrollWidth) {\n const o3 = getComputedStyle(t2, null);\n return e(o3.overflowY, n2) || e(o3.overflowX, n2) || ((t3) => {\n const e3 = ((t4) => {\n if (!t4.ownerDocument || !t4.ownerDocument.defaultView) return null;\n try {\n return t4.ownerDocument.defaultView.frameElement;\n } catch (t5) {\n return null;\n }\n })(t3);\n return !!e3 && (e3.clientHeight < t3.scrollHeight || e3.clientWidth < t3.scrollWidth);\n })(t2);\n }\n return false;\n }, o = (t2, e3, n2, o3, l2, r2, i, s) => r2 < t2 && i > e3 || r2 > t2 && i < e3 ? 0 : r2 <= t2 && s <= n2 || i >= e3 && s >= n2 ? r2 - t2 - o3 : i > e3 && s < n2 || r2 < t2 && s > n2 ? i - e3 + l2 : 0, l = (t2) => {\n const e3 = t2.parentElement;\n return null == e3 ? t2.getRootNode().host || null : e3;\n }, r = (e3, r2) => {\n var i, s, d, h;\n if (\"undefined\" == typeof document) return [];\n const { scrollMode: c, block: f, inline: u, boundary: a, skipOverflowHiddenElements: g } = r2, p = \"function\" == typeof a ? a : (t2) => t2 !== a;\n if (!t(e3)) throw new TypeError(\"Invalid target\");\n const m = document.scrollingElement || document.documentElement, w = [];\n let W = e3;\n for (; t(W) && p(W); ) {\n if (W = l(W), W === m) {\n w.push(W);\n break;\n }\n null != W && W === document.body && n(W) && !n(document.documentElement) || null != W && n(W, g) && w.push(W);\n }\n const b = null != (s = null == (i = window.visualViewport) ? void 0 : i.width) ? s : innerWidth, H = null != (h = null == (d = window.visualViewport) ? void 0 : d.height) ? h : innerHeight, { scrollX: y, scrollY: M } = window, { height: v, width: E, top: x, right: C, bottom: I, left: R } = e3.getBoundingClientRect(), { top: T, right: B, bottom: F, left: V } = ((t2) => {\n const e4 = window.getComputedStyle(t2);\n return { top: parseFloat(e4.scrollMarginTop) || 0, right: parseFloat(e4.scrollMarginRight) || 0, bottom: parseFloat(e4.scrollMarginBottom) || 0, left: parseFloat(e4.scrollMarginLeft) || 0 };\n })(e3);\n let k = \"start\" === f || \"nearest\" === f ? x - T : \"end\" === f ? I + F : x + v / 2 - T + F, D = \"center\" === u ? R + E / 2 - V + B : \"end\" === u ? C + B : R - V;\n const L = [];\n for (let t2 = 0; t2 < w.length; t2++) {\n const e4 = w[t2], { height: n2, width: l2, top: r3, right: i2, bottom: s2, left: d2 } = e4.getBoundingClientRect();\n if (\"if-needed\" === c && x >= 0 && R >= 0 && I <= H && C <= b && x >= r3 && I <= s2 && R >= d2 && C <= i2) return L;\n const h2 = getComputedStyle(e4), a2 = parseInt(h2.borderLeftWidth, 10), g2 = parseInt(h2.borderTopWidth, 10), p2 = parseInt(h2.borderRightWidth, 10), W2 = parseInt(h2.borderBottomWidth, 10);\n let T2 = 0, B2 = 0;\n const F2 = \"offsetWidth\" in e4 ? e4.offsetWidth - e4.clientWidth - a2 - p2 : 0, V2 = \"offsetHeight\" in e4 ? e4.offsetHeight - e4.clientHeight - g2 - W2 : 0, S = \"offsetWidth\" in e4 ? 0 === e4.offsetWidth ? 0 : l2 / e4.offsetWidth : 0, X = \"offsetHeight\" in e4 ? 0 === e4.offsetHeight ? 0 : n2 / e4.offsetHeight : 0;\n if (m === e4) T2 = \"start\" === f ? k : \"end\" === f ? k - H : \"nearest\" === f ? o(M, M + H, H, g2, W2, M + k, M + k + v, v) : k - H / 2, B2 = \"start\" === u ? D : \"center\" === u ? D - b / 2 : \"end\" === u ? D - b : o(y, y + b, b, a2, p2, y + D, y + D + E, E), T2 = Math.max(0, T2 + M), B2 = Math.max(0, B2 + y);\n else {\n T2 = \"start\" === f ? k - r3 - g2 : \"end\" === f ? k - s2 + W2 + V2 : \"nearest\" === f ? o(r3, s2, n2, g2, W2 + V2, k, k + v, v) : k - (r3 + n2 / 2) + V2 / 2, B2 = \"start\" === u ? D - d2 - a2 : \"center\" === u ? D - (d2 + l2 / 2) + F2 / 2 : \"end\" === u ? D - i2 + p2 + F2 : o(d2, i2, l2, a2, p2 + F2, D, D + E, E);\n const { scrollLeft: t3, scrollTop: h3 } = e4;\n T2 = 0 === X ? 0 : Math.max(0, Math.min(h3 + T2 / X, e4.scrollHeight - n2 / X + V2)), B2 = 0 === S ? 0 : Math.max(0, Math.min(t3 + B2 / S, e4.scrollWidth - l2 / S + F2)), k += h3 - T2, D += t3 - B2;\n }\n L.push({ el: e4, top: T2, left: B2 });\n }\n return L;\n };\n\n // node_modules/scroll-into-view-if-needed/dist/index.js\n var o2 = (t2) => false === t2 ? { block: \"end\", inline: \"nearest\" } : ((t3) => t3 === Object(t3) && 0 !== Object.keys(t3).length)(t2) ? t2 : { block: \"start\", inline: \"nearest\" };\n function e2(e3, r2) {\n if (!e3.isConnected || !((t2) => {\n let o3 = t2;\n for (; o3 && o3.parentNode; ) {\n if (o3.parentNode === document) return true;\n o3 = o3.parentNode instanceof ShadowRoot ? o3.parentNode.host : o3.parentNode;\n }\n return false;\n })(e3)) return;\n const n2 = ((t2) => {\n const o3 = window.getComputedStyle(t2);\n return { top: parseFloat(o3.scrollMarginTop) || 0, right: parseFloat(o3.scrollMarginRight) || 0, bottom: parseFloat(o3.scrollMarginBottom) || 0, left: parseFloat(o3.scrollMarginLeft) || 0 };\n })(e3);\n if (((t2) => \"object\" == typeof t2 && \"function\" == typeof t2.behavior)(r2)) return r2.behavior(r(e3, r2));\n const l2 = \"boolean\" == typeof r2 || null == r2 ? void 0 : r2.behavior;\n for (const { el: a, top: i, left: s } of r(e3, o2(r2))) {\n const t2 = i - n2.top + n2.bottom, o3 = s - n2.left + n2.right;\n a.scroll({ top: t2, left: o3, behavior: l2 });\n }\n }\n\n // index.mjs\n if (!Element.prototype.scrollIntoViewIfNeeded) {\n Element.prototype.scrollIntoViewIfNeeded = function scrollIntoViewIfNeededPolyfill(center) {\n center = center == null ? true : !!center;\n e2(this, {\n scrollMode: \"if-needed\",\n block: center ? \"center\" : \"nearest\"\n });\n };\n }\n})();\n","const rejson = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/;\n\nexport function isNumber(num) {\n var number = +num;\n\n if ((number - number) !== 0) {\n // Discard Infinity and NaN\n return false;\n }\n\n if (number === num) {\n return true;\n }\n\n if (typeof num === 'string') {\n // String parsed, both a non-empty whitespace string and an empty string\n // will have been coerced to 0. If 0 trim the string and see if its empty.\n if (number === 0 && num.trim() === '') {\n return false;\n }\n return true;\n }\n return false;\n};\n\nexport function hyphenToCamelCase(hyphen) {\n return hyphen.replace(/-([a-z])/g, function(match) {\n return match[1].toUpperCase();\n });\n}\n\nexport function camelCaseToHyphen(camelCase) {\n return camelCase.replace(/[A-Z]/g, '-$1').toLowerCase();\n}\n\nexport function attributeToCamelCase(attribute) {\n return hyphenToCamelCase(attribute.replace(/^(data-)?(.*)/, '$2'));\n}\n\nexport function camelCaseToAttribute(camelCase) {\n return 'data-' + camelCaseToHyphen(camelCase);\n}\n\nexport function stringToCamelCase(string) {\n return string.replace(/(?:^\\w|[A-Z]|\\b\\w)/g, function(letter, index) {\n return index == 0 ? letter.toLowerCase() : letter.toUpperCase();\n }).replace(/\\s+/g, '');\n}\n\nexport class DataAttrParser {\n /**\n * @param {DOMStringMap} dataset\n * @param {Array} _prefixes\n */\n static parse(dataset, _prefixes = []) {\n let result = {};\n const keys = Object.keys(dataset);\n const grouping = _prefixes.length;\n const prefixes = _prefixes.map(hyphenToCamelCase);\n\n for (let i = 0; i < keys.length; i++) {\n let key = keys[i];\n let value = dataset[key];\n\n if (value === 'true') {\n result[key] = true;\n continue;\n }\n\n if (value === 'false') {\n result[key] = false;\n continue;\n }\n\n if (isNumber(value)) {\n result[key] = Number(value);\n continue;\n }\n\n if (value === 'null') {\n result[key] = null;\n continue;\n }\n\n if (rejson.test(value)) {\n result[key] = JSON.parse(value);\n continue;\n }\n\n // @String\n result[key] = value;\n }\n\n // Group result object\n prefixes.forEach(prefix => {\n let subResult = {};\n\n Object.keys(result)\n .filter(key => key.startsWith(prefix))\n .forEach(key => {\n let slicedKey = stringToCamelCase(key.replace(prefix, ''));\n if (slicedKey === '') slicedKey = prefix;\n subResult[slicedKey] = result[key];\n delete result[key];\n });\n\n result[prefix] = subResult;\n });\n\n return result;\n }\n}\n","import $ from 'jquery';\nimport { DataAttrParser } from '@progress-wad/data-attr-parser';\n\n/**\n * Init prgs/tlrk jquery plugins from data attrs\n *\n * @param {String} selector - data attr name - example \"data-tlrk-plugin\" or \"data-prgs-plugin\"\n */\nfunction init(selector) {\n const elements = Array.from(document.querySelectorAll(`[${selector}]`));\n\n elements.forEach(element => {\n const $element = $(element);\n const plugins = element.getAttribute(selector).split(' ');\n\n plugins.forEach(plugin => {\n if ($.isFunction($.fn[plugin])) {\n const group = plugin.toLowerCase();\n const options = DataAttrParser.parse(element.dataset, [group]);\n $element[plugin](options[group]);\n }\n });\n });\n}\n\n$(document).ready(() => {\n // init('data-tlrk-plugin');\n // init('data-prgs-plugin');\n // init('data-ipswitch-plugin');\n init('data-kemp-plugin');\n});\n","class Accordion {\n constructor(el) {\n // Store the
element\n this.el = el;\n // Store the element\n this.summary = el.querySelector('summary');\n // Store the
element\n this.content = el.querySelector('summary + *');\n\n // Store the animation object (so we can cancel it if needed)\n this.animation = null;\n // Store if the element is closing\n this.isClosing = false;\n // Store if the element is expanding\n this.isExpanding = false;\n // Detect user clicks on the summary element\n this.summary.addEventListener('click', (e) => this.onClick(e));\n }\n\n onClick(e) {\n // Stop default behaviour from the browser\n e.preventDefault();\n // Add an overflow on the
to avoid content overflowing\n this.el.style.overflow = 'hidden';\n // Check if the element is being closed or is already closed\n if (this.isClosing || !this.el.open) {\n this.open();\n // Check if the element is being openned or is already open\n } else if (this.isExpanding || this.el.open) {\n this.shrink();\n }\n }\n\n shrink() {\n // Set the element as \"being closed\"\n this.isClosing = true;\n \n // Store the current height of the element\n const startHeight = `${this.el.offsetHeight}px`;\n // Calculate the height of the summary\n const endHeight = `${this.summary.offsetHeight}px`;\n \n // If there is already an animation running\n if (this.animation) {\n // Cancel the current animation\n this.animation.cancel();\n }\n \n // Start a WAAPI animation\n this.animation = this.el.animate({\n // Set the keyframes from the startHeight to endHeight\n height: [startHeight, endHeight]\n }, {\n duration: 400,\n easing: 'ease-out'\n });\n \n // When the animation is complete, call onAnimationFinish()\n this.animation.onfinish = () => this.onAnimationFinish(false);\n // If the animation is cancelled, isClosing variable is set to false\n this.animation.oncancel = () => this.isClosing = false;\n }\n\n open() {\n // Apply a fixed height on the element\n this.el.style.height = `${this.el.offsetHeight}px`;\n // Force the [open] attribute on the details element\n this.el.open = true;\n // Wait for the next frame to call the expand function\n window.requestAnimationFrame(() => this.expand());\n }\n\n expand() {\n // Set the element as \"being expanding\"\n this.isExpanding = true;\n // Get the current fixed height of the element\n const startHeight = `${this.el.offsetHeight}px`;\n // Calculate the open height of the element (summary height + content height)\n const endHeight = `${this.summary.offsetHeight + this.content.offsetHeight}px`;\n \n // If there is already an animation running\n if (this.animation) {\n // Cancel the current animation\n this.animation.cancel();\n }\n \n // Start a WAAPI animation\n this.animation = this.el.animate({\n // Set the keyframes from the startHeight to endHeight\n height: [startHeight, endHeight]\n }, {\n duration: 400,\n easing: 'ease-out'\n });\n // When the animation is complete, call onAnimationFinish()\n this.animation.onfinish = () => this.onAnimationFinish(true);\n // If the animation is cancelled, isExpanding variable is set to false\n this.animation.oncancel = () => this.isExpanding = false;\n }\n\n onAnimationFinish(open) {\n // Set the open attribute based on the parameter\n this.el.open = open;\n // Clear the stored animation\n this.animation = null;\n // Reset isClosing & isExpanding\n this.isClosing = false;\n this.isExpanding = false;\n // Remove the overflow hidden and the fixed height\n this.el.style.height = this.el.style.overflow = '';\n }\n}\n\ndocument.querySelectorAll('details').forEach((el) => {\n new Accordion(el);\n});\n","export function scrollToItem(el) {\n if (el) {\n window.setTimeout( () => {\n let nav = document.querySelector('.Nav')\n let navHeight = (nav) ? nav.getBoundingClientRect().height : 0\n let scrollToPos = window.scrollY + el.getBoundingClientRect().top - navHeight\n\n window.scrollTo({\n top: scrollToPos,\n behavior: 'smooth'\n })\n }, 500)\n }\n}\n","import $ from 'jquery';\n\n/* eslint-disable */\n$.support.cssProperty = (function supportCssPropertyFactory() {\n return function supportCssProperty(a, e) {\n const d = (document.body || document.documentElement).style;\n let c;\n\n if (typeof d === 'undefined') {\n return !1;\n }\n\n if (typeof d[a] === 'string') {\n return e ? a : !0;\n }\n\n const b = 'Moz Webkit Khtml O ms Icab'.split(' ');\n\n for (a = a.charAt(0).toUpperCase() + a.substr(1), c = 0; c < b.length; c++) {\n if (typeof d[b[c] + a] === 'string') {\n return e ? b[c] + a : !0;\n }\n }\n };\n})();\n/* eslint-enable */\n","import $ from 'jquery';\n\n(() => {\n if (!$.support.cssProperty('object-fit')) {\n $('.Section-bg img, img.-contain').each(function each() {\n var $this = $(this);\n const $container = $this.parent();\n const imgUrl = $this.prop('src');\n const imgClasses = $this.attr('class');\n if (imgUrl) {\n if ($this.hasClass('-contain')) {\n $container\n .css('backgroundImage', 'url(' + imgUrl + ')')\n .addClass('compat-object-contain');\n } else {\n $container\n .css('backgroundImage', 'url(' + imgUrl + ')')\n .addClass('compat-object-fit')\n .addClass(imgClasses);\n // fix for ie's missing background color behind the banner image\n if ($container.hasClass('-bg-black')) {\n $container.parent().addClass('-tint-black');\n }\n }\n }\n });\n }\n})();\n","(() => {\n function findCousin(elements, nextOrPrev, selector) {\n // Reference the last of the selected elements\n const reference = elements[elements.length - 1];\n\n // Set of all elements matching the selector\n const set = Array.from(document.querySelectorAll(selector));\n\n // Fins the position of the reference element in the set of all elements\n const pos = set.indexOf(reference);\n\n // If the element does not match the selector for cousin elements return null\n if (set.length === (pos - 1)) return null;\n\n // Return the next or previous cousin to the reference\n return set[pos + (nextOrPrev === 'next' ? 1 : (-1))];\n }\n\n // do not execute in edit mode\n const url = window.location.href.toLowerCase();\n\n if (url.indexOf('/action/edit') > 0 || url.indexOf('/action/inedit') > 0) {\n return;\n }\n\n let resizing = false;\n\n function calculateOffsets() {\n document.querySelectorAll('.Section--patch').forEach(patch => {\n const patchHalfHeight = `${Math.ceil(patch.offsetHeight / 2)}px`;\n const isSmall = patch.classList.contains('Section--s');\n\n if (document.body.offsetWidth > (isSmall ? 1360 : 1460)) {\n const containers = patch.querySelectorAll('.container');\n const prevCousin = findCousin(containers, 'prev', '.container, .PRGS-container');\n const nextCousin = findCousin(containers, 'next', '.container, .PRGS-container');\n\n patch.classList.add('is-active');\n\n patch.setAttribute('style', `margin-top: -${patchHalfHeight}; margin-bottom: -${patchHalfHeight}`);\n\n const customPaddingClass = isSmall ? 'has-custom-padding-s' : 'has-custom-padding';\n\n if (prevCousin) {\n prevCousin.classList.add(customPaddingClass);\n prevCousin.style.paddingBottom = patchHalfHeight;\n }\n\n if (nextCousin) {\n nextCousin.classList.add(customPaddingClass);\n nextCousin.style.paddingTop = patchHalfHeight;\n }\n }\n });\n }\n\n if (!document.querySelector('.sfPageEditor') && document.querySelector('.Section--patch')) {\n window.addEventListener('resize', () => {\n resizing = true;\n });\n\n window.setInterval(() => {\n if (resizing) {\n calculateOffsets();\n resizing = false;\n }\n }, 500);\n\n calculateOffsets();\n }\n})();\n","(() => {\n const mobButtonNav = document.querySelector('#mobile-nav');\n const bodyClass = document.body.classList;\n const buttonLang = document.querySelector('#mob-language-button');\n const buttonSearch = document.querySelector('#mob-search-button');\n const navLang = document.querySelector('.js-nav-language');\n\n function toggleAriaExpanded(selector) {\n const el = document.querySelector(selector);\n if (el.getAttribute('aria-expanded') == 'false') {\n el.setAttribute('aria-expanded', 'true');\n return;\n }\n el.setAttribute('aria-expanded', 'false');\n }\n\n function closeAllMobileMenus() {\n bodyClass.remove('is-mobilemenu-visible', 'is-search-visible', 'is-lang-visible');\n if (mobButtonNav) mobButtonNav.setAttribute('aria-expanded', 'false');\n if (buttonLang) buttonLang.setAttribute('aria-expanded', 'false');\n if (buttonSearch) buttonSearch.setAttribute('aria-expanded', 'false');\n }\n\n function langClickHandler() {\n toggleAriaExpanded('#mob-language-button');\n bodyClass.remove('is-mobilemenu-visible');\n bodyClass.toggle('is-lang-visible');\n bodyClass.remove('is-search-visible');\n }\n\n function searchClickHandler() {\n toggleAriaExpanded('#mob-search-button');\n bodyClass.remove('is-mobilemenu-visible');\n bodyClass.remove('is-lang-visible');\n bodyClass.toggle('is-search-visible');\n }\n\n if (mobButtonNav) {\n mobButtonNav.addEventListener('click', () => {\n toggleAriaExpanded('#mobile-nav');\n bodyClass.toggle('is-mobilemenu-visible');\n bodyClass.remove('is-lang-visible');\n bodyClass.remove('is-search-visible');\n });\n }\n\n if (buttonLang) buttonLang.addEventListener('click', langClickHandler);\n\n if (buttonSearch) buttonSearch.addEventListener('click', searchClickHandler);\n\n function cloneMobileNav() {\n const mobComplementaryNav = document.querySelector('.js-mob-complementary-nav');\n if (!mobComplementaryNav) return;\n\n if (buttonLang) {\n const buttonLangCopy = buttonLang.cloneNode(true);\n buttonLangCopy.setAttribute('id', null);\n buttonLangCopy.addEventListener('click', langClickHandler);\n mobComplementaryNav.appendChild(buttonLangCopy);\n }\n\n if (buttonSearch) {\n const buttonSearchCopy = buttonSearch.cloneNode(true);\n buttonSearchCopy.setAttribute('id', null);\n buttonSearchCopy.addEventListener('click', searchClickHandler);\n mobComplementaryNav.appendChild(buttonSearchCopy);\n }\n\n if (navLang) {\n const navLangCopy = navLang.cloneNode(true);\n const innerEl = navLangCopy.querySelector('#language-dropdown');\n innerEl.removeAttribute('id');\n mobComplementaryNav.appendChild(navLangCopy);\n }\n }\n\n function getCultureDataFromDOM() {\n const map = new Map();\n const nav = document.querySelector('#js-culture-links');\n \n if (!nav) return map;\n \n const links = Array.from(nav.querySelectorAll('a'));\n \n links.forEach(link => map.set(link.dataset.culture, {\n url: link.href,\n text: link.innerText.trim(),\n active: link.classList.contains('is-active'),\n culture: link.dataset.culture\n }));\n \n return map;\n }\n \n function populateNavLocaleLinks() {\n const locales = getCultureDataFromDOM();\n const localeMenus = Array.from(document.querySelectorAll('.js-nav-language, #language-dropdown'));\n \n if (!locales.size || localeMenus.length === 0) return;\n \n localeMenus.forEach(function(localeMenu) {\n const localeLinks = Array.from(localeMenu.querySelectorAll('a'));\n \n localeLinks.forEach(function(link) {\n const { culture } = link.dataset;\n if (!locales.get(culture)) return;\n \n const { url, active } = locales.get(culture);\n link.href = url;\n \n if (active) {\n link.classList.add('is-active');\n link.setAttribute('aria-label', 'Selected Language');\n };\n });\n });\n }\n\n // click on modal\n const navModal = document.querySelector('.Nav-Modal');\n if (navModal) {\n navModal.addEventListener('click', ()=> {\n closeAllMobileMenus()\n });\n }\n\n function init() {\n cloneMobileNav();\n populateNavLocaleLinks();\n }\n\n // click on nav bar\n document.body.addEventListener('click', function(e) {\n if (e.target.classList.contains('Nav-Container') || e.target.classList.contains('Nav') || e.target.classList.contains('Nav-Complementary')) {\n closeAllMobileMenus();\n }\n });\n\n // click on body\n document.body.addEventListener('click', function(e) {\n if (document.querySelector('.PAGE-Content').contains(e.target)) {\n closeAllMobileMenus();\n }\n });\n\n document.addEventListener('keydown', function(e) {\n if (e.key === 'Escape') closeAllMobileMenus();\n });\n\n window.addEventListener('DOMContentLoaded', init);\n})();\n","import $ from 'jquery';\n\n(() => {\n const $anchorLinks = $(\"a[href^='#']:not([href='#'])\").not('.litebox, .js-noanchor, .js-noanchor a, .TabsNav a');\n let target = [];\n let hash = '';\n const $page = $('html, body');\n\n if (!$anchorLinks.length) {\n return;\n }\n\n $anchorLinks.on('click', function onClick(e) {\n let navHeight = document.querySelector('.Nav').getBoundingClientRect().height || 0;\n hash = this.getAttribute('href');\n\n if (hash.length >= 2) {\n target = $(hash).length ? $(hash) : $(`[name='${hash.slice(1)}']`);\n }\n\n if (target.length) {\n $page.not(':animated').animate({ scrollTop: (target.offset().top - navHeight) }, 500);\n e.preventDefault();\n }\n });\n})();\n","import { scrollToItem } from './scroll-to-item.js';\n\n(() => {\n let triggers = document.querySelectorAll('[data-sf-role=\"form-container\"] button:not(.js-no-scroll)')\n\n triggers.forEach(trigger => {\n trigger.addEventListener('click', e => {\n let el = e.target\n let closestForm = el.closest('.FormHolder') || el.closest('[data-sf-role=\"form-container\"]')\n scrollToItem(closestForm)\n });\n })\n\n})();\n","export const defaultOptions = {\n width: 560,\n height: 400,\n media: 'twitter',\n url: window.location.href,\n text: document.title,\n};\n\nclass SocialShare {\n /**\n * @constructor\n */\n constructor(options) {\n this.options = { ...defaultOptions, ...options };\n\n this.element = this.options.element;\n this.media = this.options.media;\n this.url = this.options.url || window.location.href;\n this.text = this.options.text || document.title;\n\n if (!this.element) {\n throw new Error('Social share anchor element is required');\n }\n\n this.populateLink();\n\n this.element.addEventListener('click', this.onLinkClick.bind(this));\n }\n\n /**\n * Populate the link href\n */\n populateLink() {\n const hashtag = this.options.hashtag ? `&hashtags=${this.options.hashtag}` : '';\n const encodedUrl = encodeURIComponent(this.url);\n const encodedText = encodeURIComponent(this.text);\n\n switch (this.media) {\n case 'facebook':\n this.element.href = `https://www.facebook.com/sharer.php?u=${encodedUrl}`;\n break;\n case 'twitter':\n this.element.href = `https://twitter.com/share?url=${encodedUrl}&text=${encodedText}${hashtag}`;\n break;\n case 'linkedin':\n this.element.href = `https://www.linkedin.com/shareArticle?mini=true&url=${encodedUrl}&title=${encodedText}`;\n break;\n case 'reddit':\n this.element.href = `https://reddit.com/submit?url=${encodedUrl}&title=${encodedText}`;\n break;\n case 'mail':\n case 'email':\n this.element.href = `mailto:?subject=${encodedText}&body=${encodedUrl}`;\n }\n }\n\n /**\n * @param {Event} - click event\n */\n onLinkClick(event) {\n const medias = ['facebook', 'twitter', 'linkedin', 'reddit'];\n\n if (medias.includes(this.media)) {\n event.preventDefault();\n this.openPopup(event.currentTarget.href);\n }\n }\n\n /**\n * open popup window\n */\n openPopup(url, title = 'Share') {\n const top = (window.innerHeight - this.options.height) / 2;\n const left = (window.innerWidth - this.options.width) / 2;\n const status = 1;\n const windowOptions = `status=${status},width=${this.options.width},height=${this.options.height},top=${top},left=${left}`;\n\n window.open(url, title, windowOptions);\n }\n}\n\nexport default SocialShare;\n","import SocialShare from '@progress-wad/social-share';\n\n(() => {\n const socialLinks = Array.from(document.querySelectorAll('[class*=\"js-social-\"]'));\n\n socialLinks.forEach(element => {\n const classList = element.classList + ' ';\n const media = classList.split('js-social-')[1].split(' ')[0];\n const url = element.hasAttribute('data-article-link') ? document.location.host + element.getAttribute('data-article-link') : null;\n const text = element.getAttribute('data-article-title');\n\n new SocialShare({\n element,\n media,\n ...url ? { url } : {},\n ...text ? { text } : {}\n });\n });\n})();\n","const pluginName = 'toggle';\n\nconst defaultOptions = {\n className: '-dn'\n};\n\n/**\n * Toggle plugin that applies side effects to elements (hides, shows, toggles)\n * Can be extended to support multiple effects and does not cache elements on DOM load\n */\nexport class Toggle {\n constructor(element, options) {\n this.element = element;\n this.options = {\n ...defaultOptions,\n ...options\n };\n this.attachEventListeners();\n\n this.hashChangeHandler();\n if (this.options.hash && this.hashArgv !== null && this.hashArgv.includes(this.options.hash)) {\n this.currentHash = this.options.hash;\n }\n }\n\n attachEventListeners() {\n this.element.addEventListener('click', this.effects.bind(this));\n window.addEventListener('hashchange', this.hashChangeHandler.bind(this));\n }\n\n static parseHash() {\n let windowHash = window.location.hash;\n if (!windowHash) return null;\n [, windowHash] = windowHash.split('#');\n if (windowHash.includes(',')) {\n return windowHash.split(',');\n }\n return [windowHash];\n }\n\n hashChangeHandler() {\n if (this.skipHashHandler) {\n this.skipHashHandler = false;\n return;\n }\n\n this.hashArgv = Toggle.parseHash();\n if (this.hashArgv === null) return;\n this.hashArgv.forEach(hash => {\n if (hash === this.options.hash) {\n this.effects(null, true);\n }\n });\n }\n\n updateScopes() {\n const scopeElements = document.querySelectorAll(this.element.dataset.scope);\n if (scopeElements.length === 0) {\n this.scopes = [document];\n return;\n }\n this.scopes = scopeElements;\n }\n\n updateTargets() {\n let hideTargets = [];\n let showTargets = [];\n let toggleTargets = [];\n\n this.scopes.forEach(scope => {\n hideTargets = [\n ...hideTargets,\n ...Array.from(scope.querySelectorAll(this.element.dataset.hide))\n ];\n\n showTargets = [\n ...showTargets,\n ...Array.from(scope.querySelectorAll(this.element.dataset.show))\n ];\n\n toggleTargets = [\n ...toggleTargets,\n ...Array.from(scope.querySelectorAll(this.element.dataset.toggle))\n ];\n });\n\n this.hideTargets = hideTargets;\n this.showTargets = showTargets;\n this.toggleTargets = toggleTargets;\n }\n\n toggleHash() {\n if (!this.currentHash || this.currentHash !== this.options.hash) {\n this.skipHashHandler = true;\n window.location.hash = this.options.hash;\n this.currentHash = this.options.hash;\n return;\n }\n\n if (this.toggleTargets.length) {\n window.history.pushState(null, null, ' ');\n this.currentHash = null;\n }\n }\n\n effects(event, hashChange) {\n this.updateScopes();\n this.updateTargets();\n this.hideTargets.forEach(element => (element.classList.add(this.options.className)));\n this.showTargets.forEach(element => (element.classList.remove(this.options.className)));\n this.toggleTargets.forEach(element => (element.classList.toggle(this.options.className)));\n\n // the hash should be toggled only if there are toggle targets as the show/hide operations are\n // only executed once and if a hash is provided, they are already executed\n if (!hashChange && this.options.hash) {\n this.toggleHash();\n }\n\n const changeEvent = new Event('change');\n changeEvent.hideTargets = this.hideTargets;\n changeEvent.showTargets = this.showTargets;\n changeEvent.toggleTargets = this.toggleTargets;\n\n this.element.dispatchEvent(changeEvent);\n\n // The synthetic event below is useful in some cases when working with other plugins\n window.dispatchEvent(new Event('resize'));\n }\n}\n\n$.fn[pluginName] = function(options) {\n return this.each(function() {\n if (!$.data(this, `plugin_${pluginName}`)) {\n new Toggle(this, options);\n }\n });\n};\n","(() => {\n function listenForClicks(e) {\n e.addEventListener(\"click\", function(e) {\n let el = e.currentTarget;\n if (el != e.target && el != e.target.parentElement) return; // do nothing if a grandchild element is clicked (needed for nav)\n let newClass = el.getAttribute(\"class\").split(\"js-tglslf-\")[1].split(\" \")[0];\n el.classList.toggle(newClass);\n })\n }\n document.querySelectorAll(\"[class*='js-tglslf-']\").forEach(function(e) {\n listenForClicks(e)\n });\n})();\n","import { DataAttrParser } from '@progress-wad/data-attr-parser';\nimport { scrollToItem } from './scroll-to-item.js';\n\nconst defaultOptions = {\n tabButtonsSelector: ':scope > button',\n tabsContentSelector: '.TabsContent',\n tabsContentItemSelector: ':scope > .TabsContent-item',\n activeClass: 'is-open',\n activeMobileClass: 'is-mob-open',\n elementIndex: 0,\n hash: false\n};\n\nclass TabsNav {\n constructor(element, options) {\n this.element = element;\n\n this.options = {\n ...defaultOptions,\n ...options,\n ...DataAttrParser.parse(this.element.dataset, ['tabs']).tabs\n };\n\n this.tabButtons = Array.from(element.querySelectorAll(this.options.tabButtonsSelector));\n\n // By default tabs work with the tabs content with the same index (order in the DOM)\n this.tabsContent = document.querySelectorAll(this.options.tabsContentSelector)[this.options.elementIndex];\n\n if (!this.tabsContent) return;\n\n this.tabs = this.tabsContent.querySelectorAll(this.options.tabsContentItemSelector);\n\n this.buttonClickHandler = this.buttonClickHandler.bind(this);\n this.mobileButtonClickHandler = this.mobileButtonClickHandler.bind(this);\n\n this.init();\n }\n\n init() {\n this.tabButtonsMobile = this.createMobileButtons();\n this.attachEventListeners();\n this.initFromHash();\n }\n\n attachEventListeners() {\n this.tabButtons.forEach((tabButton, index) => {\n tabButton.addEventListener('click', this.buttonClickHandler(index));\n this.tabButtonsMobile[index].addEventListener('click', this.mobileButtonClickHandler(index));\n });\n }\n\n /**\n * @returns {Array} the mobile buttons\n */\n createMobileButtons() {\n return this.tabButtons.map((button, index) => {\n const newButton = document.createElement('button');\n newButton.setAttribute('type', 'button');\n newButton.setAttribute('data-id', button.dataset.id);\n newButton.setAttribute('class', button.getAttribute('class'));\n newButton.textContent = button.textContent;\n\n // Prepend the mobile tab button to the corresponding tab content\n this.tabs[index].prepend(newButton);\n\n return newButton;\n });\n }\n\n /**\n * @param {HTMLButtonElement} button \n */\n setActiveButton(button) {\n this.tabButtons.forEach(button => {\n button.classList.remove(this.options.activeClass);\n button.removeAttribute('aria-label');\n });\n button.classList.add(this.options.activeClass);\n button.setAttribute('aria-label', 'Selected');\n }\n\n showTab(index) {\n this.tabs.forEach(tab => tab.classList.remove(this.options.activeClass));\n this.tabs[index].classList.add(this.options.activeClass);\n }\n\n toggleMobileTab(index) {\n const currentTab = this.tabs[index];\n currentTab.classList.toggle(this.options.activeMobileClass); \n \n // scroll to the item when it opens on mobile\n if (currentTab.classList.contains(this.options.activeMobileClass)) {\n scrollToItem(currentTab);\n }\n }\n\n initFromHash() {\n if (!window.location.hash) return;\n\n const selector = window.location.hash.toString().replace('#', '');\n const button = document.querySelector(`[data-id=\"${selector}\"]`);\n if (button) button.click();\n }\n\n /**\n * @param {HTMLButtonElement} button \n */\n setHash(button) {\n if (!this.options.hash) return;\n\n window.location.hash = button.dataset.id; \n }\n\n /**\n * @param {Number} index \n * @returns {Function} event listener\n */\n buttonClickHandler(index) {\n return (event) => {\n event.preventDefault();\n\n this.setActiveButton(event.currentTarget);\n this.showTab(index);\n this.setHash(event.currentTarget);\n };\n }\n\n /**\n * @param {Number} index \n * @returns {Function} event listener\n */\n mobileButtonClickHandler(index) {\n return (event) => {\n event.preventDefault();\n\n this.toggleMobileTab(index);\n };\n }\n}\n\nwindow.addEventListener('DOMContentLoaded', () => {\n document.querySelectorAll('.TabsNav').forEach((element, index) => new TabsNav(element, { elementIndex: index }));\n});\n\nwindow.TabsNav = TabsNav;\n","// required class for forms\n(() => {\n document.querySelectorAll('input[required], select[required], textarea[required]').forEach(function(e) {\n let prevEl = e.previousElementSibling;\n // \"Country\" dropdown label fix\n while (prevEl) {\n if (prevEl.tagName.toLowerCase() == 'label') {\n prevEl.classList.add('required');\n }\n prevEl = prevEl.previousElementSibling;\n }\n });\n})();\n\n// litebox fix\n(() => {\n const liteboxImageLinks = Array.from(document.querySelectorAll('a[href*=\".jpg\"], a[href*=\".jpeg\"], a[href*=\".png\"], a[href*=\".svg\"], a[href*=\".gif\"], .litebox-button'));\n liteboxImageLinks.forEach((link) => {\n link.classList.add('litebox');\n link.setAttribute('data-lite-info', \"image\");\n });\n})();\n\n// disable current link\n(() => {\n document.querySelectorAll(`.-disable-current [href=\"${window.location.pathname}\"]`).forEach(el => el.classList.add('-c-inherit', '-pen'));\n})();\n\n//