{"version":3,"file":"esnext.min.js","sources":["js/i18n/datepicker/jquery.ui.datepicker-de.js","js/lib/gettext.js","js/i18n/de.js","js/lib/polyfills/url-search-params.js","js/lib/text-utils.js","js/lib/errors.js","js/lib/tokens.js","js/lib/baby-lisp.js","js/lib/lenses.js","js/lib/functional.js","js/lib/baby-lisp-apply.js","js/lib/booleanbucket.js","js/lib/mode.js","js/lib/collect-values.js","js/lib/vars.js","js/lib/case-exit.js","js/lib/a11y-user-detect.js","js/lib/a11y.js","js/lib/escape.js","js/lib/notify.js","js/lib/conf.js","js/lib/location.js","js/lib/ajax.js","js/lib/settled.js","js/lib/bbi.js","js/lib/control-helpers.js","js/lib/quotable.js","js/lib/dates.js","js/lib/feature-queries.js","js/lib/form-widgets.js","js/lib/dynprops.js","js/lib/hooks.js","js/lib/control.js","js/lib/types.js","js/lib/groupings.js","js/lib/font-classes.js","js/lib/names.js","js/lib/form-groups.js","node_modules/lit-html/lit-html.js","node_modules/@lit/reactive-element/css-tag.js","node_modules/@lit/reactive-element/reactive-element.js","node_modules/lit-element/lit-element.js","node_modules/@cahmoraes93/maybe/dist/index.js","js/lib/numerals.js","js/lib/url-utils.js","js/lib/form-widgets-definitions.js","js/lib/utils.js","js/lib/jumplist.js","js/lib/user-info.js","js/lib/permissions.js","js/json.js","js/lib/$.scrollTo.js","js/lib/control-validation.js","plugins/a11y-describedby/a11y-describedby.js","plugins/Dialogue/Dialogue.js","plugins/array._groupby/array._groupby.js","plugins/asterisk/asterisk.js","plugins/mustache/mustache.js","plugins/case-template/case-template.js","plugins/change-nav-text/change-nav-text.js","plugins/close-caseslist/close-caseslist.js","plugins/custom-checkboxes/custom-checkboxes.js","node_modules/print-js/dist/print.js","plugins/end-tools/end-tools.js","js/lib/getmetadata.js","plugins/has-no-next/has-no-next.js","plugins/headings/headings.js","plugins/history/history.js","plugins/showdown/showdown.js","plugins/showdown-converter/showdown-converter.js","plugins/info-inline/info-inline.js","plugins/language-auto-switch/language-auto-switch.js","plugins/md-labels/md-labels.js","plugins/model-filter/model-filter.js","plugins/modelinfo/modelinfo.js","plugins/modelitem/modelitem.js","plugins/non-indenting-jumplist/non-indenting-jumplist.js","plugins/reset-password/reset-password.js","plugins/shout-out-resize/shout-out-resize.js","plugins/show-server-side-validation/show-server-side-validation.js"],"sourcesContent":["/* German initialisation for the jQuery UI date picker plugin. */\n/* Written by Milian Wolff (mail@milianw.de). */\njQuery(function($){\n\t$.datepicker.regional['de'] = {\n\t\tcloseText: 'Schließen',\n\t\tprevText: '<Zurück',\n\t\tnextText: 'Vor>',\n\t\tcurrentText: 'Heute',\n\t\tmonthNames: ['Januar','Februar','März','April','Mai','Juni',\n\t\t'Juli','August','September','Oktober','November','Dezember'],\n\t\tmonthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',\n\t\t'Jul','Aug','Sep','Okt','Nov','Dez'],\n\t\tdayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],\n\t\tdayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],\n\t\tdayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],\n\t\tweekHeader: 'KW',\n\t\tdateFormat: 'dd.mm.yy',\n\t\tfirstDay: 1,\n\t\tisRTL: false,\n\t\tshowMonthAfterYear: false,\n\t\tyearSuffix: ''};\n\t$.datepicker.setDefaults($.datepicker.regional['de']);\n});\n","/******* Translations ******/\n\nconst dicts = {};\n\nlet dict = {};\n\n// gettext stub\nfunction _(s, fb) {\n return dict[s] || fb || s;\n}\n\n_.tagged = (strings, ...values) =>\n strings.reduce((acc, cur, idx) => acc + cur + _(values[idx] || \"\"), \"\");\n\n_.taggedWithin =\n prefix =>\n (strings, ...values) =>\n strings.reduce(\n (acc, cur, idx) =>\n acc +\n cur +\n (_(prefix, { [values[idx]]: values[idx] })[values[idx]] ||\n values[idx] ||\n \"\"),\n \"\"\n );\n\n_.set = function (ob) {\n const lang = ob[\"lang\"] || _(\"lang\"); // Either provided or current lang?\n if (!dicts[lang]) {\n dicts[lang] = {};\n }\n for (let [key, val] of Object.entries(ob)) {\n // Set only if not set before (by _.set, or by _.addTranslations)\n dicts[lang][key] || (dicts[lang][key] = val);\n }\n dict = dicts[lang];\n};\n\n_.addTranslations = function (translations) {\n for (var term in translations) {\n if (translations.hasOwnProperty(term))\n for (var lang in translations[term]) {\n if (!dicts[lang]) dicts[lang] = {};\n // Always override what has been set before\n dicts[lang][term] = translations[term][lang];\n }\n }\n};\n\nObject.freeze(_);\n\nexport { _ };\n","import { _ } from \"$json/lib/gettext\";\n/* -*- coding: utf-8 -*- */\nconst strings = {\n \"lang\": \"de\",\n \"Input required\": \"Eingabe erforderlich\",\n \"Date required\":\n \"Datumeingabe erforderlich; verwenden Sie das Format TT.MM.JJJJ\",\n \"Choice required\": \"Wahl erforderlich\",\n \"Doubleclick to go back to this question\":\n \"Doubleclick om zu dieser Frage rück zu kehren\",\n \"create a new case\": \"eine neue Casus erstellen\",\n \"new\": \"neu\",\n \"Delete\": \"Löschen\",\n \"case\": \"Casus\",\n \"cases\": \"Casus\",\n \"Last opened\": \"Letzte Mal benutzt\",\n \"created\": \"erstellt\",\n \"report\": \"Rapport\",\n \"Sun\": \"So\",\n \"Mon\": \"Mo\",\n \"Tue\": \"Di\",\n \"Wed\": \"Mi\",\n \"Thu\": \"Do\",\n \"Fri\": \"Fr\",\n \"Sat\": \"Sa\",\n \"Jan\": \"Jan\",\n \"Feb\": \"Feb\",\n \"Mar\": \"März\",\n \"Apr\": \"April\",\n \"May\": \"Mai\",\n \"June\": \"Juni\",\n \"July\": \"Juli\",\n \"Aug\": \"Aug\",\n \"Sep\": \"Sep\",\n \"Oct\": \"Okt\",\n \"Nov\": \"Nov\",\n \"Dec\": \"Dez\",\n \"press enter to accept\": \"Eingabetaste akzeptiert\",\n \"filter cases by name\": \"suche Casus bei Name\",\n \"field--value\": \"die Zahl\",\n \"field--date\": \"dieser Datum\",\n \"field--field\": \"diese Angabe\",\n \"field--list\": \"diese Optionen\",\n \"quoted--value\": \"die Zahl „{quotable}“\",\n \"quoted--date\": \"der Datum „{quotable}“\",\n \"quoted--field\": \"die Angabe „{quotable}“\",\n \"quoted--list\": \"die Optionen in der Liste „{quotable}“\",\n \"Value has to lie between {minimum} and {maximum}\":\n \"{quotable--init} soll sich zwischen {minimum} und {maximum} befinden\",\n \"A date before {minimum} is not allowed\":\n \"{quotable--init} darf nicht eher sein wie {minimum}; verwenden Sie das Format TT.MM.JJJJ\",\n \"Negative number or zero expected\":\n \"{quotable--init} soll negativ oder Null sein\",\n \"Negative number expected\": \"{quotable--init} soll negativ sein\",\n \"Value has to lie below {maximum}\":\n \"{quotable--init} soll unter {maximum+1} liegen\",\n \"Positive number or zero expected\":\n \"{quotable--init} soll Null oder höher sein\",\n \"Positive number expected\":\n \"{quotable--init} ist nicht eine Positive Zahl. Gebe eine positive Zahl ein.\",\n \"Value has to lie above {minimum-1}\":\n \"{quotable--init} ist nicht höher als {minimum}. Gebe eine Zahl ein höher als {minumum}.\",\n \"A date after {maximum} is not allowed\":\n \"{quotable--init} darf nicht nach dem {maximum} liegen; verwenden Sie das Format TT.MM.JJJJ\",\n \"Date has to lie between {minimum} and {maximum}\":\n \"{quotable--init} soll sich zwischen {minimum} und {maximum} befinden; verwenden Sie das Format TT.MM.JJJJ\",\n \"Invalid date\":\n \"{quotable--init} ist kein gültiger Datum; verwenden Sie das Format TT.MM.JJJJ\",\n \"Text length exceeds the maximum of {maxlength} characters\":\n \"Maximum für {quotable}: {maxlength} Karakter\",\n \"Maximum allowed characters: {0}\": \"Maximum: {0} Karakter\",\n \"click for more...\": \"Zeige mir mehr...\",\n \" (click to open link)\": \" (Klicken Sie um dieser Seite zu öffnen)\",\n \"Are you sure? This will reset all values.\":\n \"Sind sie sicher? Dadurch weden alle Werte gelöscht.\",\n \"Yesterday\": \"Gestern\",\n \"No valid session\": \"Benutzer oder Passwort ungültig\",\n \"No interfaces to show\":\n \"Keine sichtbare Elemente (Fragen, Tekstfelder...) verfügbar\",\n \"Interface has failed (probably a failing SOAP or database connection)\":\n \"Schnittstelle ist ausgefallen (wahrscheinlich ein fehlerhafte SOAP- oder Datenbank-Verbindung)\",\n \"Choose...\": \"Wählen Sie...\",\n \"Choose or type...\": \"Wählen oder tippen Sie...\",\n \"cUMWrongUserNamePassword\": \"Benutzer oder Passwort ungültig\",\n \"cWebCaseIsRunning\":\n \"Kann diese Casus nicht öffnen, weil diese Casus schon auf eine andere Stelle geöffnet ist\",\n \"The model you are trying to open does not exist\": \"Modell existiert nicht\",\n \"You may now safely close this window\":\n \"Sie können jetzt dieses Fenster schließen\",\n \"user name\": \"Benutzer\",\n \"password\": \"Passwort\",\n \"Your models\": \"Ihre Modelle\",\n \"Your sessions\": \"Ihre Sessionen\",\n \"log in\": \"einloggen\",\n \"Choose the session file you saved earlier\":\n \"Wählen sie die Session-Datei, die Sie zuvor gespeichert haben\",\n \"Error loading session (wrong data)\": \"Fehler beim Laden (falsche Daten).\",\n \"Please login\": \"Bitte einloggen\",\n \"open\": \"öffnen\",\n 'You have no tickets left for model \"{0}\"':\n 'Sie haben keine Tickets mehr für das Modell \"{0}\"',\n \"__digitgroupingchar__\": \"'\",\n \"__radixpoint__\": \",\",\n \"__digitgroupingrules__\": [3],\n \"Invalid number\": \"Ungültige Zahl\",\n \"attachments\": \"Anlagen\",\n \"your documents\": \"Ihre Dokumente\",\n \"saved sessions\": \"gespeicherte Sessionen\",\n \"We are currently updating. Please try again later.\":\n \"Wir sind derzeit zu aktualisieren. Bitte versuchen Sie es später noch einmal.\",\n \"case name\": \"Casusname\",\n \"dateplaceholder\": \"TT.MM.JJJJ\",\n \"Error: No response from server, server probably down\":\n \"Der Server reagiert nicht.\",\n \"Session has timed out. Please log in again.\":\n \"Die Session ist abgelaufen. Bitte melden Sie sich erneut an.\",\n \"first {0} results\": \"erste {0} Resultaten\",\n \"previous {0} results\": \"vorige {0} Resultaten\",\n \"next {0} results\": \"nächste {0} Resultaten\",\n \"last {0} results\": \"letzte {0} Resultaten\",\n \"add row\": \"Zeile hinzufügen\",\n \"insert row\": \"Zeile einfügen\",\n \"delete row\": \"diese Zeile löschen\",\n \"There are errors, please double check your answers.\":\n \"Es gibt Fehler, bitte kontrollieren sie ihre Antworten.\",\n \"cancel\": \"stornieren\",\n \"Something went wrong; see the server log for more information.\":\n \"Es ist etwas schief gelaufen; weitere Informationen finden Sie im Serverprotokoll.\"\n};\n\n_.set(strings);\n\nexport { strings };\n","/*! (c) Andrea Giammarchi - ISC */\nvar self = window || /* istanbul ignore next */ {};\ntry {\n (function (URLSearchParams, plus) {\n if (\n new URLSearchParams(\"q=%2B\").get(\"q\") !== plus ||\n new URLSearchParams({ q: plus }).get(\"q\") !== plus ||\n new URLSearchParams([[\"q\", plus]]).get(\"q\") !== plus ||\n new URLSearchParams(\"q=\\n\").toString() !== \"q=%0A\" ||\n new URLSearchParams({ q: \" &\" }).toString() !== \"q=+%26\" ||\n new URLSearchParams({ q: \"%zx\" }).toString() !== \"q=%25zx\"\n )\n throw URLSearchParams;\n self.URLSearchParams = URLSearchParams;\n })(URLSearchParams, \"+\");\n} catch (URLSearchParams) {\n (function (Object, String, isArray) {\n \"use strict\";\n var create = Object.create;\n var defineProperty = Object.defineProperty;\n var find = /[!'\\(\\)~]|%20|%00/g;\n var findPercentSign = /%(?![0-9a-fA-F]{2})/g;\n var plus = /\\+/g;\n var replace = {\n \"!\": \"%21\",\n \"'\": \"%27\",\n \"(\": \"%28\",\n \")\": \"%29\",\n \"~\": \"%7E\",\n \"%20\": \"+\",\n \"%00\": \"\\x00\"\n };\n var proto = {\n append: function (key, value) {\n appendTo(this._ungap, key, value);\n },\n delete: function (key) {\n delete this._ungap[key];\n },\n get: function (key) {\n return this.has(key) ? this._ungap[key][0] : null;\n },\n getAll: function (key) {\n return this.has(key) ? this._ungap[key].slice(0) : [];\n },\n has: function (key) {\n return key in this._ungap;\n },\n set: function (key, value) {\n this._ungap[key] = [String(value)];\n },\n forEach: function (callback, thisArg) {\n var self = this;\n for (var key in self._ungap) self._ungap[key].forEach(invoke, key);\n function invoke(value) {\n callback.call(thisArg, value, String(key), self);\n }\n },\n toJSON: function () {\n return {};\n },\n toString: function () {\n var query = [];\n for (var key in this._ungap) {\n var encoded = encode(key);\n for (var i = 0, value = this._ungap[key]; i < value.length; i++) {\n query.push(encoded + \"=\" + encode(value[i]));\n }\n }\n return query.join(\"&\");\n }\n };\n for (var key in proto)\n defineProperty(URLSearchParams.prototype, key, {\n configurable: true,\n writable: true,\n value: proto[key]\n });\n self.URLSearchParams = URLSearchParams;\n function URLSearchParams(query) {\n var dict = create(null);\n defineProperty(this, \"_ungap\", { value: dict });\n switch (true) {\n case !query:\n break;\n case typeof query === \"string\":\n if (query.charAt(0) === \"?\") {\n query = query.slice(1);\n }\n for (\n var pairs = query.split(\"&\"), i = 0, length = pairs.length;\n i < length;\n i++\n ) {\n var value = pairs[i];\n var index = value.indexOf(\"=\");\n if (-1 < index) {\n appendTo(\n dict,\n decode(value.slice(0, index)),\n decode(value.slice(index + 1))\n );\n } else if (value.length) {\n appendTo(dict, decode(value), \"\");\n }\n }\n break;\n case isArray(query):\n for (var i = 0, length = query.length; i < length; i++) {\n var value = query[i];\n appendTo(dict, value[0], value[1]);\n }\n break;\n case \"forEach\" in query:\n query.forEach(addEach, dict);\n break;\n default:\n for (var key in query) appendTo(dict, key, query[key]);\n }\n }\n\n function addEach(value, key) {\n appendTo(this, key, value);\n }\n\n function appendTo(dict, key, value) {\n var res = isArray(value) ? value.join(\",\") : value;\n if (key in dict) dict[key].push(res);\n else dict[key] = [res];\n }\n\n function decode(str) {\n return decodeURIComponent(\n str.replace(findPercentSign, \"%25\").replace(plus, \" \")\n );\n }\n\n function encode(str) {\n return encodeURIComponent(str).replace(find, replacer);\n }\n\n function replacer(match) {\n return replace[match];\n }\n })(Object, String, Array.isArray);\n}\n\n(function (URLSearchParamsProto) {\n var iterable = false;\n try {\n iterable = !!Symbol.iterator;\n } catch (o_O) {}\n\n /* istanbul ignore else */\n if (!(\"forEach\" in URLSearchParamsProto)) {\n URLSearchParamsProto.forEach = function forEach(callback, thisArg) {\n var self = this;\n var names = Object.create(null);\n this.toString()\n .replace(/=[\\s\\S]*?(?:&|$)/g, \"=\")\n .split(\"=\")\n .forEach(function (name) {\n if (!name.length || name in names) return;\n (names[name] = self.getAll(name)).forEach(function (value) {\n callback.call(thisArg, value, name, self);\n });\n });\n };\n }\n\n /* istanbul ignore else */\n if (!(\"keys\" in URLSearchParamsProto)) {\n URLSearchParamsProto.keys = function keys() {\n return iterator(this, function (value, key) {\n this.push(key);\n });\n };\n }\n\n /* istanbul ignore else */\n if (!(\"values\" in URLSearchParamsProto)) {\n URLSearchParamsProto.values = function values() {\n return iterator(this, function (value, key) {\n this.push(value);\n });\n };\n }\n\n /* istanbul ignore else */\n if (!(\"entries\" in URLSearchParamsProto)) {\n URLSearchParamsProto.entries = function entries() {\n return iterator(this, function (value, key) {\n this.push([key, value]);\n });\n };\n }\n\n /* istanbul ignore else */\n if (iterable && !(Symbol.iterator in URLSearchParamsProto)) {\n URLSearchParamsProto[Symbol.iterator] = URLSearchParamsProto.entries;\n }\n\n /* istanbul ignore else */\n if (!(\"sort\" in URLSearchParamsProto)) {\n URLSearchParamsProto.sort = function sort() {\n var entries = this.entries(),\n entry = entries.next(),\n done = entry.done,\n keys = [],\n values = Object.create(null),\n i,\n key,\n value;\n while (!done) {\n value = entry.value;\n key = value[0];\n keys.push(key);\n if (!(key in values)) {\n values[key] = [];\n }\n values[key].push(value[1]);\n entry = entries.next();\n done = entry.done;\n }\n // not the champion in efficiency\n // but these two bits just do the job\n keys.sort();\n for (i = 0; i < keys.length; i++) {\n this.delete(keys[i]);\n }\n for (i = 0; i < keys.length; i++) {\n key = keys[i];\n this.append(key, values[key].shift());\n }\n };\n }\n\n function iterator(self, callback) {\n var items = [];\n self.forEach(callback, items);\n return iterable\n ? items[Symbol.iterator]()\n : {\n next: function () {\n var value = items.shift();\n return { done: value === undefined, value: value };\n }\n };\n }\n\n /* istanbul ignore next */\n (function (Object) {\n var dP = Object.defineProperty,\n gOPD = Object.getOwnPropertyDescriptor,\n createSearchParamsPollute = function (search) {\n function append(name, value) {\n URLSearchParamsProto.append.call(this, name, value);\n name = this.toString();\n search.set.call(this._usp, name ? \"?\" + name : \"\");\n }\n function del(name) {\n URLSearchParamsProto.delete.call(this, name);\n name = this.toString();\n search.set.call(this._usp, name ? \"?\" + name : \"\");\n }\n function set(name, value) {\n URLSearchParamsProto.set.call(this, name, value);\n name = this.toString();\n search.set.call(this._usp, name ? \"?\" + name : \"\");\n }\n return function (sp, value) {\n sp.append = append;\n sp.delete = del;\n sp.set = set;\n return dP(sp, \"_usp\", {\n configurable: true,\n writable: true,\n value: value\n });\n };\n },\n createSearchParamsCreate = function (polluteSearchParams) {\n return function (obj, sp) {\n dP(obj, \"_searchParams\", {\n configurable: true,\n writable: true,\n value: polluteSearchParams(sp, obj)\n });\n return sp;\n };\n },\n updateSearchParams = function (sp) {\n var append = sp.append;\n sp.append = URLSearchParamsProto.append;\n URLSearchParams.call(sp, sp._usp.search.slice(1));\n sp.append = append;\n },\n verifySearchParams = function (obj, Class) {\n if (!(obj instanceof Class))\n throw new TypeError(\n \"'searchParams' accessed on an object that \" +\n \"does not implement interface \" +\n Class.name\n );\n },\n upgradeClass = function (Class) {\n var ClassProto = Class.prototype,\n searchParams = gOPD(ClassProto, \"searchParams\"),\n href = gOPD(ClassProto, \"href\"),\n search = gOPD(ClassProto, \"search\"),\n createSearchParams;\n if (!searchParams && search && search.set) {\n createSearchParams = createSearchParamsCreate(\n createSearchParamsPollute(search)\n );\n Object.defineProperties(ClassProto, {\n href: {\n get: function () {\n return href.get.call(this);\n },\n set: function (value) {\n var sp = this._searchParams;\n href.set.call(this, value);\n if (sp) updateSearchParams(sp);\n }\n },\n search: {\n get: function () {\n return search.get.call(this);\n },\n set: function (value) {\n var sp = this._searchParams;\n search.set.call(this, value);\n if (sp) updateSearchParams(sp);\n }\n },\n searchParams: {\n get: function () {\n verifySearchParams(this, Class);\n return (\n this._searchParams ||\n createSearchParams(\n this,\n new URLSearchParams(this.search.slice(1))\n )\n );\n },\n set: function (sp) {\n verifySearchParams(this, Class);\n createSearchParams(this, sp);\n }\n }\n });\n }\n };\n try {\n upgradeClass(HTMLAnchorElement);\n if (/^function|object$/.test(typeof URL) && URL.prototype)\n upgradeClass(URL);\n } catch (meh) {}\n })(Object);\n})(self.URLSearchParams.prototype, Object);\nexport default self.URLSearchParams;\n","/******* positionalFormat() BEGIN ******/\n\n/* https://github.com/pft/javascript/blob/master/positionalformat.js\n *\n * Copyright (C) 2006-2013 Niels Giesen.\n *\n * Contact: \n *\n * Author: Niels Giesen\n * Keywords: JavaScript, formatting, String\n *\n * This file is dual-licensed under either the BSD license or the\n * GNU Affero General Public License.\n *\n * positionalFormat enables you to replace numbers enclosed in curly braces (C# format\n * apparently) with positional arguments (that can be reused), like\n * this:\n *\n * positionalFormat('argument { 1 } (or is it { 2 }, or { 0 }?) comes { 1 }',3,'first',1)\n *\n * evals to:\n *\n * \"argument first (or is it 1, or 3?) comes first\"\n */\n\nexport function positionalFormat(str) {\n var args = arguments;\n return str.replace(/{\\s*(\\d+)\\s*}/g, function (match, num) {\n return args[parseInt(num) + 1] !== undefined\n ? args[parseInt(num) + 1]\n : match;\n });\n}\n\n/******* positionalFormat() END ******/\n\nexport function format(str, ob = {}) {\n return str.replace(/{\\s*([^{]+?)\\s*}/g, function (match, sub) {\n return ob[sub] !== undefined ? ob[sub] : sub;\n });\n}\n\n// export function formatPlus(str, ob = {}) {\n// return str.replace(/{\\s*([^{]+?)\\s*}/g, function (match, subwithstuff) {\n// const subs = subwithstuff.split(/\\|/);\n// console.log(subs);\n// return subs.reduce((acc, cur) => {\n// if (ob[cur] === undefined) return acc;\n// return ob[cur];\n// }, subs[0]);\n// // if (ob[sub] === undefined) return sub;\n// // if (!directives) return ob[sub] !== undefined ? ob[sub] : sub;\n// // if (\n// // directives.startsWith(\"+\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // if (\n// // directives.startsWith(\"-\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // const [sub, directives] = subwithstuff.split(/\\|/);\n// // if (ob[sub] === undefined) return sub;\n// // if (!directives) return ob[sub] !== undefined ? ob[sub] : sub;\n// // if (\n// // directives.startsWith(\"+\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // if (\n// // directives.startsWith(\"-\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// return ob[sub];\n// });\n// }\n\nexport const formatPlus = format;\n\n// (str, ob = {}) {\n// return str.replace(/{\\s*([^{]+?)\\s*}/g, function (match, subwithstuff) {\n// const subs = subwithstuff.split(/\\|/);\n// console.log(subs);\n// return subs.reduceRight((acc, cur) => {\n// if (ob[cur] === undefined) return acc;\n// return ob[cur];\n// }, subs[0]);\n// // if (ob[sub] === undefined) return sub;\n// // if (!directives) return ob[sub] !== undefined ? ob[sub] : sub;\n// // if (\n// // directives.startsWith(\"+\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // if (\n// // directives.startsWith(\"-\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // const [sub, directives] = subwithstuff.split(/\\|/);\n// // if (ob[sub] === undefined) return sub;\n// // if (!directives) return ob[sub] !== undefined ? ob[sub] : sub;\n// // if (\n// // directives.startsWith(\"+\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // if (\n// // directives.startsWith(\"-\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// return ob[sub];\n// });\n// }\n","import { positionalFormat } from \"./text-utils.js\";\nimport { _ } from \"./gettext.js\";\n\nconst CODES = {\n cException: 1,\n cHTMLFormLoadCaseNotFound: 2,\n cHTMLMenuFileNotFound: 3,\n cWebModelIDDifferent: 4,\n cWebPleaseLogin: 5,\n cGetFileNotAllowed: 6,\n cGetDocumentNotFound: 7,\n cUMWrongUserNamePassword: 8,\n cWebSessionTimeOut: 9,\n cWebNoModelID: 10,\n cWebIllegalAccess: 11,\n cWebModelNotFound: 12,\n cWebCaseIsRunning: 13,\n cEngineLoadCaseFailed: 14, // Was: 3\n cEngineUpgrading: 15,\n cEngineNoInterfacesToShow: 16,\n cEngineLoadCaseFailedNotFound: 17,\n cEngineLoadCaseFailedWrongType: 18,\n cEngineLoadCaseFailedWrongData: 19,\n cWebOpenIsCalledWithUniqueID: 20,\n cTechGraphVizNotInstalled: 21,\n cGraphVizSessionNotFound: 22,\n cUMUserNotFound: 23,\n cUMModelNotFound: 24,\n cUMCaseNotFound: 25,\n cWebAdminNotAllowed: 26,\n cEngineGotoNodeFailed: 27,\n cPreviewNoCaseFound: 28,\n cTechUploadedFileToLarge: 29,\n cWebSaveCaseNotAllowed: 30,\n cWebSaveCaseFailed: 31,\n cInvalidUpload: 53\n};\n\nconst CODESREV = Object.fromEntries(\n Object.entries(CODES).map(([key, value]) => [value, key])\n);\n\n// Translate error - put translation in message property, return\n// error.\nfunction translate(_error) {\n const error = Object.assign({}, _error);\n // New API\n switch (error.code) {\n case CODES.cException:\n error.message = _(\n \"Something went wrong; see the server log for more information.\"\n );\n break;\n case CODES.cWebSessionTimeOut:\n error.message = _(\"Session has timed out. Please log in again.\");\n break;\n case CODES.cEngineLoadCaseFailed:\n switch (error.subcode) {\n case 1004:\n error.message = positionalFormat(\n _('You have no tickets left for model \"{0}\"'),\n error.summary\n .substring(56, error.summary.length - 1)\n .replace(/_/g, \" \")\n );\n break;\n default:\n error.message = error.summary; // Won't translate for now, may be st. like \"Loading case failed (xxx.mdl)\"\n }\n break;\n case CODES.cEngineLoadCaseFailedWrongData:\n error.message = _(\"Error loading session (wrong data)\");\n break;\n default:\n switch (error.subcode) {\n case 1002:\n error.message = _(\n \"We are currently updating. Please try again later.\"\n );\n break;\n case 1009:\n case 1025:\n error.message = positionalFormat(\n _('Infinite loop detected in {0}\"'),\n // Might be embedded though (in 1 or in 14...)\n error.summary.slice(18, error.summary.indexOf(\", infinite\"))\n );\n break;\n case 1010:\n error.message = _(\n \"Interface has failed (probably a failing SOAP or database connection)\"\n );\n break;\n default:\n error.message = _(CODESREV[error.code], _(error.summary));\n }\n }\n return error;\n}\n\nexport { CODES, translate };\n","let _token;\n\nexport const setToken = token => {\n _token = token;\n};\n\nexport async function digestMessage(message) {\n if (!(\"crypto\" in window)) return null;\n const msgUint8 = new TextEncoder().encode(message); // encode as (utf-8) Uint8Array\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", msgUint8); // hash the message\n const hashArray = Array.from(new Uint8Array(hashBuffer)); // convert buffer to byte array\n const hashHex = hashArray.map(b => b.toString(16).padStart(2, \"0\")).join(\"\"); // convert bytes to hex string\n return hashHex;\n}\n\nexport const tokenChannel =\n \"BroadcastChannel\" in window ? new BroadcastChannel(\"token\") : \"\";\n\nexport const token = {\n addEventListener: (...args) =>\n tokenChannel && tokenChannel.addEventListener(...args),\n removeEventListener: (...args) =>\n tokenChannel && tokenChannel.removeEventListener(...args),\n getHash: () => digestMessage(_token),\n setToken,\n postMessage: message =>\n token.getHash().then(\n tokenHash =>\n // digestMessage will return null on missing crypto on older\n // browsers\n tokenHash &&\n tokenChannel &&\n tokenChannel.postMessage({ tokenHash, ...message })\n )\n};\n","// https://gist.github.com/jameslaneconkling/24acb8ea326a1c8fdf64225aa7d0f44e\nconst rules = [\n { type: \"space\", regex: /^\\s/ },\n { type: \"lParen\", regex: /^\\(/ },\n { type: \"rParen\", regex: /^\\)/ },\n { type: \"number\", regex: /^[0-9.]+/ },\n { type: \"string\", regex: /^\".*?\"/ },\n { type: \"variable\", regex: /^[^\\s()]+/ } // take from the beginning 1+ characters until you hit a ' ', '(', or ')' // TODO - support escaped double quote\n];\n\nconst tokenizer = rules => input => {\n for (let i = 0; i < rules.length; i += 1) {\n let tokenized = rules[i].regex.exec(input);\n if (tokenized) {\n return {\n token: tokenized[0],\n type: rules[i].type,\n rest: input.slice(tokenized[0].length)\n };\n }\n }\n\n throw new Error(`no matching tokenize rule for ${JSON.stringify(input)}`);\n};\n\nconst parser = tokenize =>\n function parse(input, ast, parents = []) {\n if (input === \"\") {\n return ast;\n }\n\n const { token, type, rest } = tokenize(input);\n\n if (type === \"space\") {\n // do nothing\n return parse(rest, ast, parents);\n } else if (type === \"variable\") {\n ast.push(token);\n return parse(rest, ast, parents);\n } else if (type === \"number\") {\n ast.push(Number(token));\n return parse(rest, ast, parents);\n } else if (type === \"string\") {\n ast.push(token.replace(/(^\"|\"$)/g, \"'\"));\n return parse(rest, ast, parents);\n } else if (type === \"lParen\") {\n parents.push(ast);\n return parse(rest, [], parents);\n } else if (type === \"rParen\") {\n const parentAst = parents.pop();\n if (parentAst) {\n parentAst.push(ast);\n return parse(rest, parentAst, parents);\n }\n\n return parse(rest, ast, parents);\n }\n\n throw new Error(`Missing parse logic for rule ${JSON.stringify(type)}`);\n };\n\nexport default parser(tokenizer(rules));\n","const Identity = x => ({ x, map: fn => Identity(fn(x)) });\n\nconst Const = x => ({ x, map: fn => Const(x) });\n\nconst lens = (getter, setter) => functor => target =>\n functor(getter(target)).map(focus => setter(focus, target));\n\nconst over = (lens, fn, obj) => lens(x => Identity(fn(x)))(obj).x;\n\nconst set = (lens, val, obj) => over(lens, () => val, obj);\n\nconst view = (lens, obj) => lens(Const)(obj).x;\n\nexport { lens, over, set, view };\n","/** Map fn on array, then join it with joiner */\nimport * as Lenses from \"./lenses.js\";\n\nexport const applyTo = arg => fn => fn(arg);\n\nconst _apply = (fn, args) => fn(...args);\n\nexport const dec = arg => arg - 1;\n\nexport const inc = arg => arg + 1;\n\nexport function mapConcat(arr, fn, joiner) {\n return arr.map(fn).join(joiner);\n}\n\nexport const identity = x => x;\n\nexport const isNil = x => x == null;\n\nexport const not = a => !a;\n\n/**\n Differs from Ramda in that the first function in the pipe chain is\n called with a single argument.\n */\nexport const pipe =\n (...fns) =>\n value =>\n fns.reduce((acc, cur) => cur(acc), value);\n\n/**\n Differs from Ramda in that the first function in the compose chain is\n called with a single argument.\n */\nexport const compose =\n (...fns) =>\n value =>\n fns.reduceRight((acc, cur) => cur(acc), value);\n\n/**\n Same as Ramda compose() in that the first function in the compose\n chain may be called with more than one argument.\n */\nexport const composeX =\n (...fns) =>\n (...value) =>\n fns.reduceRight((acc, cur) => [cur.apply(null, acc)], value);\n\nexport const curry = (fn, ...args) => {\n if (args.length >= fn.length) return fn(...args);\n return (...args2) => curry(fn, ...[...args, ...args2]);\n};\n\nexport const join = curry((sep, arr) => arr.join(sep));\n\nexport const split = curry((sep, arr) => arr.split(sep));\n\nexport const reverse = arr => [...arr].reverse();\n\nexport const type = compose(\n s => s.slice(8, -1),\n ob => Object.prototype.toString.call(ob)\n);\n\nexport const always = value => () => value;\n\nexport const F = always(false);\n\nexport const T = always(true);\n\nexport const propOr = curry((or, prop, obj) => {\n try {\n return ifElse(isNil, () => or, identity)(obj[prop]);\n } catch (_) {\n return or;\n }\n});\n\nexport const prop = propOr(undefined);\nexport const pathOr = curry((or, pathArg, obj) =>\n reduce((acc, cur) => propOr(or, cur, acc), obj, pathArg)\n);\n\nexport const path = pathOr(undefined);\n\nexport const tail = arr => Array.prototype.slice.call(arr, 1);\n\nconst _nth = (i, arr) => arr[i];\n\nexport const head = arr => arr[0];\n\nexport const last = arr => arr[arr.length - 1];\n\nexport const cond = curry((rules, ob) => {\n const cur = rules[0];\n if (!cur) return undefined;\n return ifElse(cur[0], cur[1], cond(tail(rules)))(ob);\n});\n\nexport const choose = curry((rules, ob) => {\n const cur = rules[0];\n if (!cur) return undefined;\n return cur[0](ob) ? cur[1] : choose(tail(rules))(ob);\n});\n\nexport const length = prop(\"length\");\n\nexport const strictUniq = arr =>\n reduce((acc, cur) => (acc.indexOf(cur) > -1 ? acc : [...acc, cur]), [])(arr);\n\nexport const any = curry((fn, arr) => {\n return arr.length === 0\n ? false\n : compose(fn, head)(arr)\n ? true\n : any(fn, tail(arr));\n});\n\nexport const find = curry((fn, arr) => {\n return arr.length === 0\n ? undefined\n : fn(head(arr))\n ? head(arr)\n : find(fn, tail(arr));\n});\n\nconst _findIndex = (fn, arr) => arr.findIndex(fn);\n/**\n * Returns a function applying all arguments to a *manually* curried function.\n *\n * Behaves a bit strange (see tests), so keeping it private-ish\n **/\nexport const _uncurry =\n fn =>\n (...args) =>\n args.reduce((acc, cur) => {\n return acc(cur);\n }, fn);\n\n/** Curriable functions **/\n\n/**\n * Takes a function and two values and returns true if the values map\n * to the same value; false otherwise.\n */\nconst _eqBy = (fn, a, b) => _equals(fn(a), fn(b));\n\nconst _all = (fn, arr) =>\n reduce((acc, cur) => (acc ? fn(cur) : acc), true, arr);\n\nconst _none = (fn, arr) =>\n reduce((acc, cur) => (fn(cur) ? false : acc), true, arr);\n\nconst _append = (arg, arr) => [...((arr instanceof Array && arr) || []), arg];\n\nconst _test = (regex, string) => regex.test(string);\n\nconst _match = (regex, string) => string.match(regex) || [];\n\n// https://raphacmartin.medium.com/deep-equality-in-javascript-objects-1eea8abb3649\n/**\n *\n * @param a Object\n * @param b Object\n * @returns {boolean}\n */\nfunction _equals(a, b) {\n if (!(a instanceof Object) || !(b instanceof Object)) return a === b;\n // if the number of keys is different, they are different\n if (Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n\n for (const key in a) {\n const a_value = a[key];\n const b_value = b[key];\n // If the value is an object, check if they're different objects\n // If it isn't, uses !== to check\n if (\n (a_value instanceof Object && !_equals(a_value, b_value)) ||\n (!(a_value instanceof Object) && a_value !== b_value)\n ) {\n return false;\n }\n }\n return true;\n}\n\nconst _eqProps = (prop, a, b) => _equals(a[prop], b[prop]);\n\nconst _hasPath = (p, ob) => {\n if (p.length === 0) return true;\n return has(p[0], ob) && _hasPath(tail(p), prop(p[0], ob));\n};\n\n/** Associate prop with val in obj */\nfunction _assoc(prop, val, obj) {\n var result = {};\n for (var p in obj) {\n result[p] = obj[p];\n }\n result[prop] = val;\n return result;\n}\n\nconst _assocPath = (path, val, obj) => {\n if (path.length === 0) {\n return val;\n }\n var idx = path[0];\n if (path.length > 1) {\n var nextObj =\n !isNil(obj) && Object.prototype.hasOwnProperty.call(obj, idx)\n ? obj[idx]\n : Number.isInteger(path[1])\n ? []\n : {};\n val = assocPath(Array.prototype.slice.call(path, 1), val, nextObj);\n }\n if (Number.isInteger(idx) && Array.isArray(obj)) {\n var arr = [].concat(obj);\n arr[idx] = val;\n return arr;\n } else {\n return assoc(idx, val, obj);\n }\n};\n\n/**\n * Apply fun to all but first argN args */\nconst _consume =\n (fn, argN) =>\n (...args) => {\n return fn(...args.slice(argN));\n };\n\nconst _propEq = (key, value, ob) => _equals(prop(key, ob), value);\n\nconst _propSatisfies = (fn, key, ob) => fn(prop(key, ob));\n\nconst _pathEq = (key, value, ob) => _equals(path(key, ob), value);\n\nconst _has = (prop, ob) =>\n complement(isNil)(ob) && Object.prototype.hasOwnProperty.call(ob, prop);\n\nconst _tryCatch = (tryer, catcher) => arg => {\n try {\n return tryer(arg);\n } catch (e) {\n return catcher(e, arg);\n }\n};\n\n/**\n Call arr.map(fn)\n\n Note: differs from Ramda, in that the callback will receive both the item, the index and the list.\n\n If you want the callback function `fn` to read only the first parameter, wrap `fn` in `unary(fn)`.\n */\nconst _map = (fn, arr) => arr.map(fn);\n\n/**\n Call arr.filter(fn)\n\n Note: differs from Ramda, in that the callback will receive both the item, the index and the list.\n\n If you want the callback function `fn` to read only the first parameter, wrap `fn` in `unary(fn)`.\n */\nconst _filter = (fn, arr) => arr.filter(fn);\n\nconst _when = (predicate, whenTrueFn, arg) =>\n predicate(arg) ? whenTrueFn(arg) : arg;\n\nconst _ifElse = (predicate, whenTrueFn, whenFalseFn, arg) =>\n predicate(arg) ? whenTrueFn(arg) : whenFalseFn(arg);\n\nconst _either = (fn1, fn2, arg) => fn1(arg) || fn2(arg);\n\nconst _allPass = (fns, arg) =>\n fns.reduce((mem, cur) => (!mem ? false : cur(arg)), true);\n\nconst _anyPass = (fns, arg) =>\n fns.reduce((mem, cur) => (mem ? true : cur(arg)), false);\n\nconst _both = (fn1, fn2, arg) => _allPass([fn1, fn2], arg);\n\nconst _complement = (fn, arg) => !fn(arg);\n\nconst _includes = (item, c) => c.includes(item);\n\nconst _lte = (first, second) => first <= second;\n\nconst _lt = (first, second) => first < second;\n\nconst _gte = (first, second) => first >= second;\n\nconst _gt = (first, second) => first > second;\n\n/**\n Call arr.reduce(fn, into);\n\n Note: differs from Ramda, in that the callback will receive the\n accumular, the item, the index and the list.\n\n If you want the callback function `fn` to read only the first two\n parameters, as with Ramda, wrap `fn` in `binary(fn)`.\n */\nconst _reduce = (fn, into, arr) => arr.reduce(fn, into);\n\nconst _tap = (fn, value) => (fn(value), value);\n\nconst _groupWith = (fn, arr) =>\n reduce(\n (acc, cur, index, arr) =>\n index === 0 || !fn(cur, arr[index - 1])\n ? [...acc, [cur]]\n : [...acc.slice(0, acc.length - 1), [...acc[acc.length - 1], cur]],\n []\n )(arr);\n\nconst _groupBy = (fn, arr) =>\n reduce((acc, cur) => over(lensProp(fn(cur)), append(cur), acc), {})(arr);\n\nconst _nthArg = (n, arg1, ...args) => [arg1, ...args][n];\n\n/** Dissociate props from obj */\nconst _omit = (props, obj) => {\n var result = {};\n for (var p in obj) {\n if (!props.includes(p)) result[p] = obj[p];\n }\n return result;\n};\n\nconst _pickBy = (pred, obj) => {\n var result = {};\n for (var k in obj) {\n if (pred(obj[k], k)) result[k] = obj[k];\n }\n return result;\n};\n\nconst _pick = (props, obj) => {\n var result = {};\n props.forEach(prop => {\n if (prop in obj) result[prop] = obj[prop];\n });\n return result;\n};\n\nconst _pickAll = (props, obj) => {\n var result = {};\n props.forEach(prop => {\n result[prop] = obj[prop];\n });\n return result;\n};\n\nfunction _dissoc(prop, obj) {\n return _omit([prop], obj);\n}\n\nconst _infichain = (fns, arg) =>\n fns.reduce(\n (acc, cur, index) => (index === 0 ? cur(arg) : cur(acc, arg)),\n null\n );\n\nconst _mergeRight = (ob1, ob2) => Object.assign({}, ob1, ob2);\n\nconst _mergeLeft = (ob1, ob2) => Object.assign({}, ob2, ob1);\n\nconst _strictWithout = (items, list) =>\n list.reduce((acc, cur) => (items.includes(cur) ? acc : [...acc, cur]), []);\n\nconst _unary = fn => arg => fn(arg);\n\nconst _binary = fn => (arg1, arg2) => fn(arg1, arg2);\n\nconst _strictDifference = (list1, list2) => {\n const out = new Set();\n const s1 = new Set(list1);\n const s2 = new Set(list2);\n for (let item of s1) {\n if (!s2.has(item)) out.add(item);\n }\n return [...out];\n};\n\nconst _mapWithRest = (fn, arr, rest1, ...rest) =>\n arr.map((cur, i, list) => fn(cur, i, list, rest1, ...rest));\n\nconst _andThen = (fn, promise) => Promise.resolve(promise).then(fn);\nconst _otherwise = (fn, promise) => promise.then(null, fn);\n\n/**\n * @param {Funcion} f f(await g(val), val)\n * @param {Funtion} g g(val) => Promise\n * @return Promise\n */\nconst _fChain = (f, g, val) => g(val).then(x => f(x, val));\n\nconst _chain = (f, g, val) => f(g(val), val);\n\nconst _juxt = (arr, arg1, ...argN) => {\n return arr.map(fn => fn(arg1, ...argN));\n};\n\nconst _slice = (from, to, arr) => arr.slice(from, to);\n\nexport const toLower = s => s.toLowerCase();\nexport const toUpper = s => s.toUpperCase();\n\nexport const maybeNumber = string =>\n Number.isInteger(Number(string)) ? Number(string) : string;\n\nconst _applySpec =\n specs =>\n (...args) => {\n if (specs instanceof Function) {\n return specs(...args);\n }\n if (specs instanceof Array) {\n return specs.map(fn => _applySpec(fn)(...args));\n }\n const out = {};\n for (let [key, value] of Object.entries(specs)) {\n out[key] = _applySpec(value)(...args);\n }\n return out;\n };\n\nexport const applySpec = curry((specs, arg, ...args) =>\n _applySpec(specs)(arg, ...args)\n);\n\nexport const all = curry(_all),\n nthArg = curry(_nthArg),\n andThen = curry(_andThen),\n append = curry(_append),\n apply = curry(_apply),\n assoc = curry(_assoc),\n assocPath = curry(_assocPath),\n anyPass = curry(_anyPass),\n both = curry(_both),\n consume = curry(_consume),\n chain = curry(_chain),\n strictDifference = curry(_strictDifference),\n dissoc = curry(_dissoc),\n eqProps = curry(_eqProps),\n equals = curry(_equals),\n filter = curry(_filter),\n has = curry(_has),\n hasPath = curry(_hasPath),\n juxt = curry(_juxt),\n map = curry(_map),\n nth = curry(_nth),\n otherwise = curry(_otherwise),\n propEq = curry(_propEq),\n propSatisfies = curry(_propSatisfies),\n tryCatch = curry(_tryCatch),\n when = curry(_when),\n ifElse = curry(_ifElse),\n either = curry(_either),\n allPass = curry(_allPass),\n complement = curry(_complement),\n includes = curry(_includes),\n infichain = curry(_infichain),\n mapWithRest = curry(_mapWithRest),\n mergeLeft = curry(_mergeLeft),\n mergeRight = curry(_mergeRight),\n omit = curry(_omit),\n pathEq = curry(_pathEq),\n pick = curry(_pick),\n pickBy = curry(_pickBy),\n pickAll = curry(_pickAll),\n lt = curry(_lt),\n lte = curry(_lte),\n fChain = curry(_fChain),\n gt = curry(_gt),\n gte = curry(_gte),\n reduce = curry(_reduce),\n groupBy = curry(_groupBy),\n groupWith = curry(_groupWith),\n tap = curry(_tap),\n eqBy = curry(_eqBy),\n lens = curry(Lenses.lens),\n over = curry(Lenses.over),\n set = curry(Lenses.set),\n view = curry(Lenses.view),\n test = curry(_test),\n match = curry(_match),\n none = curry(_none),\n findIndex = curry(_findIndex),\n slice = curry(_slice),\n strictWithout = curry(_strictWithout),\n unary = curry(_unary),\n binary = curry(_binary),\n lensPath = p => Lenses.lens(path(p), assocPath(p)),\n lensProp = p => Lenses.lens(prop(p), assoc(p));\n\nexport const uncurried = {\n all: _all,\n apply: _apply,\n append: _append,\n assoc: _assoc,\n assocPath: _assocPath,\n both: _both,\n filter: _filter,\n propEq: _propEq,\n consume: _consume,\n tryCatch: _tryCatch,\n when: _when,\n ifElse: _ifElse,\n either: _either,\n allPass: _allPass,\n complement: _complement,\n includes: _includes,\n lt: _lt,\n lte: _lte,\n gt: _gt,\n gte: _gte,\n has: _has,\n hasPath: _hasPath,\n tap: _tap,\n groupBy: _groupBy,\n groupWith: _groupWith,\n nth: _nth,\n eqBy: _eqBy,\n eqProps: _eqProps,\n equals: _equals,\n omit: _omit,\n pathEq: _pathEq,\n pick: _pick,\n pickBy: _pickBy,\n pickAll: _pickAll,\n dissoc: _dissoc,\n test: _test,\n match: _match,\n mergeLeft: _mergeLeft,\n mergeRight: _mergeRight,\n strictWithout: _strictWithout,\n unary: _unary,\n binary: _binary,\n slice: _slice,\n findIndex: _findIndex,\n toLower,\n toUpper,\n ...Lenses\n};\n","import parse from \"./baby-lisp.js\";\nimport * as L from \"./functional.js\";\n\n/**\n * @typedef {Object} Bucket\n * @property {method} get Method to get key\n */\n\n/**\n * Test string against a bucket's contents\n * @function\n * @param {Bucket} bucket with a get(key) method returning a Boolean\n * or undefined.\n * @param {String} string Lispy string to test against the bucket\n */\nexport const stringSaysDo = (bucket, string) => {\n const ast = parse(`(${string})`);\n return astSaysDo(bucket)(ast);\n};\n\n/**\n * Test ast against bucket's contents\n * @function\n * @param {Bucket} bucket with a get(key) method returning a Boolean\n * or undefined.\n * @param {Object} AST Lispy AST (nested array of strings) to test against the bucket\n */\nconst astSaysDo = bucket => ast => {\n if (ast instanceof Array) {\n if (ast[0] === \"and\") {\n return L.compose(L.all(astSaysDo(bucket)), L.tail)(ast);\n }\n if (ast[0] === \"or\") {\n return L.compose(L.any(astSaysDo(bucket)), L.tail)(ast);\n }\n if (ast[0] === \"not\") {\n return L.compose(L.not, L.any(astSaysDo(bucket)), L.tail)(ast);\n }\n return L.compose(L.any(astSaysDo(bucket)))(ast);\n } else {\n return bucket.get(ast);\n }\n};\n","export class BooleanBucket {\n constructor() {\n this.booleans = [];\n }\n /**\n * @param {String} key Key to get\n */\n get(key) {\n return this.booleans[key];\n }\n /**\n * @param {String} key Key to set\n */\n set(key) {\n return this.toggle(key, true);\n }\n /**\n * @param {String} key Key to unset\n */\n unset(key) {\n return this.toggle(key, false);\n }\n /**\n * @param {String} key Key to toggle\n * @param {Boolean} [bool] New value\n */\n toggle(key, bool) {\n bool = typeof bool === \"boolean\" ? bool : !this.get(key);\n if (bool !== this.get(key)) {\n this.booleans[key] = bool;\n return [true, bool];\n } else {\n return [false, bool];\n }\n }\n}\n","/* global $ */\nimport { stringSaysDo } from \"./baby-lisp-apply.js\";\nimport { BooleanBucket } from \"./booleanbucket.js\";\n\nclass BucketWithConsequences extends BooleanBucket {\n /**\n * @param {String} key Key to toggle\n * @param {Boolean} [bool] New value\n * @param {Boolean} [reflect] Reflect the key as a class in the \n\n * Will hide or show any element which has somewhere inside data-when or data-hide-when attribute.\n * Whether or not to show or hide is based on the parsing of those attributes.\n *\n * See baby-lisp.test.js for examples.\n */\n toggle(mode, bool, reflect = true) {\n if (mode.includes('\"')) {\n console.warn(\n \"Mode contains a double quote, that is not allowed - used in querySelectorAll\"\n );\n return this;\n }\n const [changedOrAdded, bool2] = super.toggle(mode, bool);\n // Refrain from unnecessary redraw (by checking previous value):\n if (changedOrAdded) {\n $(document).trigger(\"bb:mode:\" + mode, bool2);\n if (reflect) $(\"body\").toggleClass(mode, bool2);\n {\n [\n ...document.querySelectorAll(\n '[data-when*=\"' + mode + '\"], [data-hide-when*=\"' + mode + '\"]'\n )\n ].forEach(elt => {\n let hidden = false;\n const hideWhen = elt.dataset[\"hideWhen\"];\n if (hideWhen) {\n hidden = stringSaysDo(this, hideWhen);\n }\n // hideWhen is absent or yields false, so still shown, and\n // when becomes the judge:\n if (!hidden) {\n const when = elt.dataset[\"when\"];\n // If there is no when, still show.\n if (when) {\n hidden = !stringSaysDo(this, when);\n }\n }\n elt.hidden = hidden;\n });\n }\n }\n return this;\n }\n}\n\nconst Mode = new BucketWithConsequences();\n\nexport { Mode };\n","/* global URLSearchParams FormData */\n\nimport { mapConcat, either, when } from \"./functional.js\";\n\nconst ATTR_SNAME = \"data-server-name\";\nconst ATTR_SVALUE = \"data-server-value\";\nconst CONTAINER_SELECTOR = \"#bb-q .group.selected\";\n\nconst INPUT_SELECTOR = mapConcat(\n [\"input\", \"textarea\", \"select\"],\n function (c) {\n return c + \"[name]:not([disabled])\";\n },\n \", \"\n);\n\nconst inputsOf = container => container.querySelectorAll(INPUT_SELECTOR);\n\nconst isEmptyRadioValue = val => val === null;\nconst isEmptyCheckboxValue = val => val === false;\nconst isCheckedCheckboxValue = val => val === true;\n\nfunction collectWithin({\n params = null, // Object with an .append method, taking two params\n flavor = URLSearchParams, // Constructor for an object with an .append method, taking two params, used when params is not provided\n container = document.querySelector(CONTAINER_SELECTOR),\n omitFn = isEmptyCheckboxValue,\n changeFn = when(isCheckedCheckboxValue, () => \"on\"),\n collector = inputsOf\n} = {}) {\n return _collectAll(\n collector(container),\n params || new flavor(),\n omitFn,\n changeFn\n );\n}\n\nfunction _collectAll(nodeList, params, omitFn, changeFn) {\n for (const node of nodeList) {\n const val = valueOf(node),\n name = node.getAttribute(ATTR_SNAME) || node.getAttribute(\"name\");\n if (!either(isEmptyRadioValue, omitFn, val)) {\n params.append(name, changeFn(val));\n }\n }\n return params;\n}\n\nfunction valueOf(node) {\n if (node.hasAttribute(ATTR_SVALUE)) return node.getAttribute(ATTR_SVALUE);\n switch (node.type) {\n case \"radio\":\n return node.checked ? node.value : null; // Do not collect unchecked radios -- stripped in collectAll.\n case \"checkbox\":\n /* Collect unchecked checkboxes as false -- goes against usual form submission,\n but we need this for Studio API (using JSON). Stripped out by collectAll() unless provided with a omitFn. */\n if (!node.checked) return false;\n return node.hasAttribute(\"value\") // NOT the property -- this would still be \"on\".\n ? node.value // A checkbox should send either its value or\n : true; // Return Boolean true instead of \"on\", to be changed by collectAll() with changeFn,\n // or leave it at true (for JSON communication for instance) */\n default:\n return String(node.value).replace(/\\r?\\n/g, \"\\r\\n\");\n }\n}\n\nconst serializeQuestions = () =>\n collectWithin({}).toString().replace(/\\r?\\n/g, \"%0D%0A\");\n\nexport { valueOf, serializeQuestions, collectWithin };\n","/* global $ FormData URLSearchParams */\nlet _vars = {};\n\nconst SESSION_KEYS = [\"dbname\", \"sessionid\", \"uniqueid\"];\nconst NAV_KEYS = [\"screenid\", ...SESSION_KEYS];\n\nObject.freeze(SESSION_KEYS);\nObject.freeze(NAV_KEYS);\n\nfunction setValueInVars(data, key) {\n if (typeof data[key] != \"undefined\") _vars[key] = data[key];\n}\n\nexport function setVars(data) {\n setValueInVars(data, \"version\");\n setValueInVars(data, \"uniqueid\");\n setValueInVars(data, \"replyserveraddress\");\n setValueInVars(data, \"replyserverport\");\n setValueInVars(data, \"proxyredirect\");\n setValueInVars(data, \"sessionid\");\n setValueInVars(data, \"modelname\");\n setValueInVars(data, \"dbname\");\n setValueInVars(data, \"modelid\");\n setValueInVars(data, \"showdeleteinmenu\");\n setValueInVars(data, \"showdatecreated\");\n setValueInVars(data, \"showreport\");\n setValueInVars(data, \"userinfo\");\n setValueInVars(data, \"showcopycase\");\n setValueInVars(data, \"screenid\");\n var version = getVar(\"version\");\n if (typeof version === \"string\") _vars[\"version\"] = version.split(\".\");\n}\n\nexport function getVar(string, obj) {\n return $.extend({}, _vars, obj)[string];\n}\n\n/**\n * Unset either all vars, or only those present in param vars\n *\n * @param {Array} vars An array of variable keys to delete\n *\n **/\nfunction unsetVars(arr) {\n if (!arr) return (_vars = {});\n arr.forEach(function (key) {\n delete _vars[key];\n });\n return _vars;\n}\n\nfunction collect(keys, collector = new FormData(), obj) {\n function append(key) {\n const val = getVar(key, obj);\n if (val !== undefined) collector.append(key, getVar(key, obj));\n }\n if (Array.isArray(keys)) {\n keys.forEach(append);\n } else {\n append(keys);\n }\n return collector;\n}\n\nfunction querify(keys, obj) {\n const usp = collect(keys, new URLSearchParams(), obj);\n return usp.toString();\n}\n\nexport default {\n querify,\n setVars,\n getVar,\n unsetVars,\n collect,\n NAV_KEYS,\n SESSION_KEYS\n};\n","/* global URLSearchParams */\nimport \"./polyfills/url-search-params.js\";\nimport { Mode } from \"./mode.js\";\nimport { serializeQuestions } from \"./collect-values.js\";\nimport Vars from \"./vars.js\";\n\nexport const shouldExit = () =>\n Mode.get(\"hasModel\") && Boolean(Vars.getVar(\"sessionid\"));\n\nexport const onEnd = () => {\n if (!shouldExit()) return;\n if (!navigator.sendBeacon) return;\n const data = [\n \"step=exitdelayed\",\n Vars.querify(Vars.NAV_KEYS),\n \"fmt=json\",\n serializeQuestions()\n ]\n .filter(Boolean)\n .join(\"&\");\n\n const usp = new URLSearchParams(data);\n\n navigator.sendBeacon(\"/action\", usp);\n};\n\nfunction addEndListener() {\n // Update state before navigating away, but do not logout\n if (\"onpagehide\" in window) {\n window.addEventListener(\"pagehide\", onEnd);\n } else {\n window.addEventListener(\"unload\", onEnd, false);\n }\n}\n\nexport function removeEndListener() {\n // Update state before navigating away, but do not logout\n if (\"onpagehide\" in window) {\n window.removeEventListener(\"pagehide\", onEnd);\n } else {\n window.removeEventListener(\"unload\", onEnd, false);\n }\n}\n\naddEndListener();\n","/* a11y-user-detect:\n *\n * \"User Detect\" will dynamically toggle between\n * a-keyboard-user & a-mouse-user (described in a11y.less)\n * depending on user interaction on document.\n *\n * The idea is to give keyboard users more visual queues,\n * without effecting the aesthetics for non-keyboard users.\n *\n * Author: Tim Bauwens\n * Copyright 2017 Berkeley Bridge\n *\n */\n\nimport { Mode } from \"$json/lib/mode\";\n\nexport const isKeyboardUser = () => Mode.get(\"a-keyboard-user\");\n\nexport const isMouseUser = () => Mode.get(\"a-mouse-user\");\n\nexport const setKeyboardUser = () => {\n Mode.set(\"a-keyboard-user\");\n Mode.unset(\"a-mouse-user\");\n};\n\nexport const setMouseUser = () => {\n Mode.unset(\"a-keyboard-user\");\n Mode.set(\"a-mouse-user\");\n};\n\n$(function () {\n let openingMatch, mouse;\n try {\n // Could have no opener, or opener could be X-Origin\n if (window.opener.document.body) {\n openingMatch = window.opener.document.body.className.match(\n /\\ba-(keyboard|mouse)-user\\b/\n );\n if (openingMatch) mouse = openingMatch[1] === \"mouse\";\n }\n } catch (e) {\n mouse = false;\n }\n if (mouse) {\n setMouseUser();\n } else {\n setKeyboardUser();\n }\n $(document.body).on(\"mousedown touchstart\", function () {\n setMouseUser();\n });\n $(document.body).on(\"keydown\", function (e) {\n if (\n e.key === \"Tab\" ||\n e.target.matches(`input[type=\"radio\"], input[type=\"checkbox\"]`)\n ) {\n setKeyboardUser();\n }\n });\n});\n","/* global $ */\nimport \"./a11y-user-detect.js\";\nimport { _ } from \"./gettext.js\";\n\n/*** A11y BEGIN ***/\nexport const A11y = {\n log: function (message) {\n var logdiv = document.getElementById(\"a-logdiv\");\n if (logdiv) logdiv.innerHTML = \"
\" + message + \"
\";\n }\n};\n\n/**\n * Datepicker a11y enhancements\n */\nexport const observeDatepickers = (function () {\n var init = false;\n return function initDateObservance() {\n var picker, observer;\n\n if (init || !(\"MutationObserver\" in window)) {\n init = true;\n return;\n }\n\n $(document).on(\"blur\", '[data-type=\"datetimepicker\"]', function () {\n A11y.log(\"\");\n });\n\n function observation(records, instance) {\n try {\n var infocus =\n document.activeElement.className.split(\" \").indexOf(\"hasDatepicker\") >\n -1;\n } catch (e) {\n // there mayn't be an activeElement, in which case className is undefined.\n }\n if (infocus) {\n var message = [\n $(\".ui-state-hover\").text(),\n $(\".ui-datepicker-month [selected]\").text(),\n $(\".ui-datepicker-year [selected]\").text()\n ].join(\" \");\n A11y.log(message + \", \" + _(\"press enter to accept\"));\n }\n }\n\n picker = document.getElementById(\"ui-datepicker-div\");\n\n if (picker) {\n observer = new window.MutationObserver(observation);\n observer.observe(picker, { attributes: true });\n init = true;\n }\n };\n})();\n","let escapeHTML = (function () {\n var entityMap = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n \"/\": \"/\"\n };\n var re = new RegExp(\"[&<>\\\"'/]\", \"g\");\n return function escapeHTML(string) {\n return String(string).replace(re, function (s) {\n return entityMap[s];\n });\n };\n})();\n\nconst escaped = (strings, ...values) =>\n strings.reduce(\n (acc, cur, idx) =>\n acc + cur + (values.length > idx ? escapeHTML(values[idx]) : \"\"),\n \"\"\n );\n\nexport { escapeHTML, escaped };\n","import { Mode } from \"./mode.js\";\n\n/*** NOTIFICATIONS BEGIN ***/\nlet message;\n// Notification can either be a String or an object with a message\n// property. When supplying an object, the message property will be\n// shown to the user, but the entire object will be given to\n// console.error.\nfunction notify(options = { keepalive: false, html: false }, notification) {\n if (!notification) return;\n var text = notification.message || notification,\n timeout = 5000;\n if (\n typeof console !== \"undefined\" &&\n console &&\n typeof console.error === \"function\"\n )\n console.error(notification);\n message = { notification, options };\n Mode.set(\"hasMessage\");\n if (options.html) {\n document\n .querySelectorAll(\".bb-notification\")\n .forEach(area => (area.innerHTML = text));\n } else {\n document\n .querySelectorAll(\".bb-notification\")\n .forEach(area => (area.textContent = text));\n }\n if (!options.keepalive)\n window.setTimeout(Mode.unset.bind(Mode, \"hasMessage\"), timeout);\n}\n\nexport { notify, message };\n/*** NOTIFICATIONS END ***/\n","/*** CONFIG BEGIN ***/\n\nimport conf from \"$conf.json\";\nimport { has } from \"./functional.js\";\n\nconf.a11y = Object.assign(\n {\n captions: false,\n optionfieldsets: false,\n strictlegends: false\n },\n conf.a11y\n);\n\nfunction propFinder(ob, prefix) {\n if (prefix) ob = find(prefix);\n\n function find(prop, fallback) {\n if (ob === undefined) return fallback;\n if (prop === undefined) return fallback;\n var leafs = prop.split(\".\").filter(Boolean),\n leaf = ob;\n while (has(leafs[0], leaf)) {\n leaf = leaf[leafs.shift()];\n }\n if (leafs.length === 0) return leaf;\n return fallback;\n }\n\n return find;\n}\n\nexport { conf, propFinder };\n\n/*** CONFIG END ***/\n","import { conf } from \"./conf\";\nexport const fromApiServer = s =>\n s.startsWith(\"http://\") || s.startsWith(\"https://\")\n ? s\n : [conf.apiserver, s].filter(Boolean).join(\"/\");\n","/* global jQuery */\nlet $ = jQuery;\n\nimport { escapeHTML } from \"./escape.js\";\nimport { notify } from \"./notify.js\";\nimport { _ } from \"./gettext.js\";\nimport { fromApiServer } from \"./location.js\";\n\n/**\n * Keep track of ajax requests + some convenience\n *\n * Exports busy and replace to bb.ajax object for plugins to use.\n */\nvar Ajax = {\n busy: false,\n last: null,\n direction: null,\n\n defaultOptions: {\n dataType: \"json\",\n type: \"POST\",\n url: \"action\",\n cache: false,\n async: true,\n success: checkJSON,\n error: onJSONError\n },\n\n post: function (options) {\n const _options = Object.assign({}, Ajax.defaultOptions, options, {\n url: fromApiServer(options.url || Ajax.defaultOptions.url)\n });\n $(document).trigger(\"bb:prePost\", _options);\n return $.ajax(_options);\n },\n\n replace: function (obj) {\n Ajax.last && Ajax.last.abort();\n Ajax.last = Ajax.post(obj);\n return Ajax.last;\n },\n\n release: function () {\n Ajax.busy = false;\n $(\".group.selected\").prop(\"disabled\", false);\n }\n};\n\n/**\n * Convenience method, like getJSON, but with POST\n *\n * @param {String} url URL where we POST to\n * @param {Object|String} data POST data\n *\n * Use Ajax.post instead if you want to overrule any default\n * settings from Ajax.defaultOptions.\n */\n$.postJSON = function (url, data) {\n return Ajax.post({ url: url, data: data });\n};\n\n/**\n * The default JSON error handler.\n *\n * Set appropriate flags, let user now what went wrong (as good as\n * possible).\n *\n * Trigger custom 'bb:jsonError' event on document.\n *\n * @param {Object} data XMLHTTPRequest object\n * @param {String} err Error message\n */\nfunction onJSONError(data, err) {\n Ajax.release();\n $(document).trigger(\"bb:jsonError\", data, err);\n if (data.responseText === undefined) {\n if (data.statusText === \"abort\");\n else {\n notify(\n { html: false, keepalive: true },\n _(\"Error: No response from server, server probably down\")\n );\n }\n } else if ($.trim(data.responseText) === \"\") {\n notify(\n { html: false, keepalive: true },\n _(\"Error: No response from server, server probably down\")\n );\n } else {\n notify(\n { html: true, keepalive: true },\n \"Error: \" +\n escapeHTML(err) +\n \"
Response was:
\" +\n \"
\" +\n        escapeHTML(data.responseText) +\n        \"
\"\n );\n }\n}\n\n/**\n * Indicate further processing ought to be skipped when this symbol is\n * set on JSON data.\n * @example\n import { stopDispatches } from \"$json/lib/ajax\";\n $(document).on(\"bb:preHandleData\", (event, data) => {\n event.stopImmediatePropagation(); // prevent further bb:preHandleData handlers.\n data[stopDispatches] = true;\n })\n * @constant\n * @type {Symbol}\n */\nexport const stopDispatches = Symbol(\"Skip all further dispatches\");\n\n/**\n Set this symbol to a promise on ajax data, and it shall be awaited\n before the next *handleData is run.\n*/\nconst awaiting = Symbol(\"awaiting promise\");\n\n/**\n * The default AJAX success handler. Perform actions on data.\n\n *\n * If data is not a JSON object, do nothing.\n *\n * @todo Either check data against JSON API, in some way or the\n * other, or make sure this function doesn't get called in the\n * first place when we're dealing with a non-core request; as\n * checkJSON is currently bound to ALL $.ajax requests,\n * this function may also fire for non-core requests.\n *\n * @param {Object} data 'JSON object according to BB JSON API'\n * @param {String} status Status of XHR\n * @param {Object} req The XHR object retrieving the resource\n *\n * @return undefined\n */\nasync function checkJSON(data, status, req) {\n if (typeof req.responseJSON !== \"undefined\") {\n // Since subsequent events may mess with the responseJSON\n // object, give (debuggers) the option to see the raw stuff.\n // Could be solved with a service worker instead.\n $(document).trigger(\"bb:responseText\", req.responseText);\n // use bb:preHandleData to change the JSON object for later invocations\n $(document).trigger(\"bb:preHandleData\", data);\n if (data[stopDispatches]) return;\n await data[awaiting];\n // handleData has the main stuff - the core rendering\n $(document).trigger(\"bb:handleData\", data);\n if (data[stopDispatches]) return;\n await data[awaiting];\n\n // use bb:postHandleData to change the DOM after initial rendering\n $(document).trigger(\"bb:postHandleData\", data);\n if (data[stopDispatches]) return;\n await data[awaiting];\n\n // finalHandleData may not change the DOM, but set focus for instance.\n $(document).trigger(\"bb:finalHandleData\", data);\n if (data[stopDispatches]) return;\n }\n}\n\nexport { Ajax, checkJSON, awaiting };\n","import { Mode } from \"./mode.js\";\n\nexport const setSettled = () => Mode.set(\"isSettled\");\n","/* global $, URLSearchParams */\nimport { setSettled } from \"./settled.js\";\nimport { removeEndListener } from \"./case-exit.js\";\n\nfunction BBI(options) {\n options = options || {};\n if (options.redirect_uri) {\n /** Example response:\n *\n * {\n * \"bbis\" : \"test\",\n * \"authid\" : \"Stubby\",\n * \"redirect_uri\" : \"https:\\/\\/HOST:8078\\/login?returnurl=http%3A%2F%2Fhost%3A80%2Fbbisreturns%3Fbbis%3Dtest&state=1507301556%3AGUID&authid=Stubby\",\n * \"url\": \"http:\\/\\/HOST:80\\/bbisreturns?bbis=test\",\n * \"state\": \"1507301556:6F2146D3-E0E6-4EB2-9DE4-2F31670B80D6\"\n * }\n *\n */\n var path = window.location.pathname.split(\"/\"),\n template = path.pop() || \"inlog.html\",\n returnurl =\n window.location.origin +\n path.concat(template).join(\"/\") +\n \"?\" +\n $.param({ bbis: options.bbis }),\n server = options.redirect_uri.split(\"?\")[0]; // The identity server sans params\n this.params = Object.assign({}, options.extraparams, {\n returnurl,\n authid: options.authid,\n // Add specific HTML page to state:\n state: options.state\n });\n this.url = server + \"?\" + $.param(this.params);\n this.stage = 1;\n } else {\n this.params = $.extend($.parseQuery(), { fmt: \"json\" });\n this.stage = 2;\n }\n return this;\n}\n\nBBI.prototype.authenticate = function () {\n if (!this.stage) throw \"BBI was not properly initialized\";\n if (this.stage === 1) {\n removeEndListener();\n window.location.href = this.url;\n } else if (this.stage === 2) {\n $.postJSON(\"bbisreturns\", this.params).then(setSettled);\n }\n};\n\nexport { BBI };\n","import { escapeHTML } from \"./escape.js\";\nimport {\n allPass,\n anyPass,\n both,\n complement,\n compose,\n either,\n F,\n has,\n ifElse,\n pipe,\n prop,\n propEq,\n type\n} from \"./functional.js\";\nexport const isOptional = allPass([\n complement(prop(\"notnull\")),\n either(\n complement(prop(\"stringmask\")),\n pipe(prop(\"stringmask\"), RegExp, re => re.test(\"\"))\n )\n]);\n\nexport const isVisible = prop(\"visible\");\n\nexport const isLabel = either(\n propEq(\"name\", \"label\"),\n propEq(\"controltype\", \"label\")\n);\n\nexport const isOption = either(\n propEq(\"controltype\", \"radio\"),\n propEq(\"controltype\", \"checkbox\")\n);\n\nexport const isLink = propEq(\"name\", \"linklabel\");\n\nexport const isTextual = either(isLabel, isLink);\n\nexport const isPicture = propEq(\"controltype\", \"picture\");\n\nexport const isQuestion = complement(either(isTextual, isPicture));\n\nexport const isReadOnly = both(\n isQuestion,\n either(\n ifElse(has(\"originalreadonly\"), prop(\"originalreadonly\"), prop(\"readonly\")),\n propEq(\"visible\", false)\n )\n);\n\nexport const isValidatable = ifElse(\n either(isReadOnly, propEq(\"visible\", false)),\n F,\n anyPass([\n has(\"minimum\"),\n has(\"maximum\"),\n both(has(\"maxlength\"), complement(propEq(\"maxlength\", 0))),\n prop(\"notnull\"),\n compose(s => s === \"string\", type, prop(\"stringmask\"))\n ])\n);\n\nexport const renderAttribs = attr =>\n Object.entries(attr).reduce(\n (acc, [key, value]) => acc + ` ${key}=\"${escapeHTML(value)}\"`,\n \"\"\n );\n\nexport const setAttribs = (elt, attr) =>\n Object.entries(attr).forEach(([key, value]) => elt.setAttribute(key, value));\n\nexport const bbmClass = stylename =>\n `bbm-${stylename.toLowerCase().replace(/[^a-z0-9]/g, \"-\")}`;\n","import {\n assoc,\n hasPath,\n chain,\n compose,\n either,\n path,\n prop,\n toLower,\n toUpper,\n ifElse,\n juxt,\n when\n} from \"./functional.js\";\nimport { format } from \"./text-utils.js\";\nimport { _ } from \"./gettext.js\";\n\nconst fieldDesignators = {\n datetimepicker: \"field--date\",\n numedit: \"field--value\",\n radio: \"field--list\",\n checkmultilist: \"field--list\",\n customlist: \"field--list\",\n combobox: \"field--list\",\n listbox: \"field--list\",\n multilist: \"field--list\",\n any: \"field--field\"\n};\n\nconst fieldKey = compose(\n controltype => fieldDesignators[controltype] || fieldDesignators[\"any\"],\n prop(\"controltype\")\n);\n\nconst generic = compose(key => _(key), fieldKey);\n\nconst genericQuoted = compose(\n key => _(key), // Runtime!\n key => key.replace(\"field--\", \"quoted--\"),\n fieldKey\n);\nexport const quotable = compose(\n when(\n prop(\"quotable\"),\n chain(\n assoc(\"quotable--init\"),\n compose(s => s.slice(0, 1).toUpperCase() + s.slice(1), prop(\"quotable\"))\n )\n ),\n when(\n prop(\"quotable\"),\n chain(assoc(\"quotable--upper\"), compose(toUpper, prop(\"quotable\")))\n ),\n when(\n prop(\"quotable\"),\n chain(assoc(\"quotable--lower\"), compose(toLower, prop(\"quotable\")))\n ),\n chain(assoc(\"quotable\"), either(path([\"metadata\", \"quotable\"]), generic)),\n ifElse(\n hasPath([\"metadata\", \"quotable\"]),\n compose(assoc(\"<<\", _(\"<<\", \"«\")), assoc(\">>\", _(\">>\", \"»\"))),\n compose(assoc(\"<<\", \"\"), assoc(\">>\", \"\"))\n ),\n chain(\n assoc(\"quoted--init\"),\n compose(s => s.slice(0, 1).toUpperCase() + s.slice(1), prop(\"quoted\"))\n ),\n ifElse(\n hasPath([\"metadata\", \"quotable\"]),\n chain(\n assoc(\"quoted\"),\n compose(\n arr => format(...arr),\n juxt([\n genericQuoted,\n compose(quotable => ({ quotable }), path([\"metadata\", \"quotable\"]))\n ])\n )\n ),\n chain(assoc(\"quoted\"), generic)\n )\n);\n","/* global $ */\nimport { quotable } from \"./quotable.js\";\nimport {\n apply,\n assoc,\n cond,\n compose,\n dec,\n equals,\n identity,\n lensPath,\n mergeLeft,\n match,\n over,\n path,\n pipe,\n tail,\n test,\n T\n} from \"./functional.js\";\nimport { _ } from \"./gettext.js\";\nimport { format, formatPlus } from \"./text-utils.js\";\n\n/*** DATE UTILITIES BEGIN ***/\nDate.prototype.toHoursAndMinutes = function () {\n var hours = this.getHours();\n var minutes = this.getMinutes();\n if (hours < 10) hours = \"0\" + hours;\n if (minutes < 10) minutes = \"0\" + minutes;\n return hours + \":\" + minutes;\n};\nconst dateTimeRe = /^\\/Date\\((-?\\d+)\\)\\/$/,\n pureDateRe = /^(\\d{4})-(\\d{2})-(\\d{2})$/,\n ISO8601DateTimeInZuluRe =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{3})?)?Z$/;\n\n/*\n * Convert JSON date string to a Date object and return it.\n *\n * @{datestring}:\n *\n * An ISO-8601 datetime string in Zulu Time\n *\n * OR\n *\n * a JSON date string of the form\n *\n * \"/Date(102938293293)/\"\n *\n * where the numerical part is\n * seconds from epoch\n *\n * OR:\n *\n * a date formatted as \"yyyy-mm-dd\"\n *\n * OR:\n *\n * undefined -> undefined\n *\n */\nconst date = (...args) => new Date(...args);\n\nexport const parseDate = cond([\n [equals(0), () => undefined],\n [equals(undefined), identity],\n [equals(\"\"), identity],\n [\n test(pureDateRe),\n // Note if we were to pass pureDates to new Date as a valid\n // DateStamp, the engine will interpret it as 0:00 Zulu\n // time. Which, in this very case, is probably not what we\n // want. We want the date as in the minds of the case (min/max in\n // a calendar etc). It should be represented 'as is' to the user,\n // so 2022-02-09 may never become 2022-02-08 in users TZ, so\n // interpret it according in users TZ.\n pipe(match(pureDateRe), tail, over(lensPath([1]), dec), apply(date))\n ],\n [test(ISO8601DateTimeInZuluRe), date],\n [test(dateTimeRe), pipe(match(dateTimeRe), path([1]), parseInt, date)],\n [\n T,\n thing => {\n throw `Not a date in our book: ${thing}`;\n }\n ]\n]);\n\nexport const leadWithZeroes = string =>\n string.replace(/([^0-9]|^)([0-9]{3})([^0-9]|$)/, \"$10$2$3\");\n\n/**\n *\n * @param {Object} spec Object describing a control conforming to the BB json api.\n * @param {String} value The value to be checked\n * @returns {Boolean|Error} true when value is according to spec\n * @throws Localized error message\n */\nexport function checkDate(spec = { notnull: false }, value) {\n const UIFormat = $.datepicker._defaults.dateFormat;\n const formatDate = $.datepicker.formatDate.bind($.datepicker);\n var date, mindate, maxdate;\n if (!spec.notnull && value.trim() === \"\") {\n return true;\n }\n const metadata = spec.metadata || {};\n try {\n date = valueToDate(UIFormat, value); // $.datepicker.parseDate(UIFormat, value); // This line may throw an error.\n } catch (e) {\n //couldn't parse - throw a translatable error message\n throw formatPlus(\n metadata.errdateinvalid || _(\"Invalid date\"),\n compose(assoc(\"value\", value), quotable)(spec)\n );\n }\n if (date === null) {\n if (spec.notnull) {\n throw format(\n metadata.errrequired || _(\"Date required\"),\n compose(assoc(\"value\", value), quotable)(spec)\n );\n }\n return true;\n }\n (mindate = parseDate(spec.minimum)), (maxdate = parseDate(spec.maximum));\n if (!(mindate || maxdate)) return true; // Neither is set\n const fmindate = formatDate(UIFormat, mindate),\n fmaxdate = formatDate(UIFormat, maxdate);\n const quotableDate = compose(\n mergeLeft({\n value,\n minimum: fmindate,\n maximum: fmaxdate\n }),\n quotable\n )(spec);\n try {\n if (mindate && !maxdate && date < mindate)\n throw (\n metadata.errdatebeforemimimum ||\n _(\"A date before {minimum} is not allowed\")\n );\n else if (mindate && maxdate && (date < mindate || maxdate < date))\n throw (\n metadata.errdatenotinrange ||\n _(\"Date has to lie between {minimum} and {maximum}\")\n );\n else if (maxdate && !mindate && maxdate < date)\n throw (\n metadata.errdateaftermaximum ||\n _(\"A date after {maximum} is not allowed\")\n );\n } catch (e) {\n throw format(e, quotableDate);\n }\n return true;\n}\n\nexport const valueToDate = (format, value) => {\n let date;\n try {\n date = $.datepicker.parseDate(format, value);\n } catch (e) {\n const yyyycleanformat = format.replace(/[^mdy]/g, \"\").replace(\"yy\", \"yyyy\"),\n clean = value.replace(/[^0-9]/g, \"\");\n date = new Date();\n const yearindex = yyyycleanformat.indexOf(\"yyyy\");\n // If year was less than 4 digits, and not at end, adjust indices of other fields.\n const adjustment = yearindex === 0 ? clean.length - 8 : 0;\n let year = Number(clean.substr(yearindex, 4 + adjustment));\n if (year <= 99) {\n const cutoffyear = Number.isInteger(\n $.datepicker._defaults.shortYearCutoff\n )\n ? $.datepicker._defaults.shortYearCutoff\n : (date.getYear() % 100) +\n Number($.datepicker._defaults.shortYearCutoff);\n // Note: this will become odd if current year approaches end of\n // century. Let's say we live in 2099. User enters 98 -> fine.\n // Is below 109. User enters 02 => not fine. Still below 109.\n // But jQuery UI should also fix this. And it's still a long time.\n const century = (date.getFullYear() / 100) >> 0;\n if (year <= cutoffyear) {\n year += century * 100;\n } else {\n year += (century - 1) * 100;\n }\n }\n const month = Math.max(\n 0,\n Number(clean.substr(yyyycleanformat.indexOf(\"mm\") + adjustment, 2)) - 1\n );\n const dom = Number(\n clean.substr(yyyycleanformat.indexOf(\"dd\") + adjustment, 2)\n );\n date.setFullYear(year);\n date.setMonth(month);\n date.setDate(dom);\n if (\n date.getFullYear() !== year ||\n date.getMonth() !== month ||\n date.getDate() !== dom\n ) {\n throw \"invalid date\";\n }\n }\n return date;\n};\n\nexport const onChangeDate = ev => {\n let date;\n try {\n date = valueToDate($.datepicker._defaults.dateFormat, ev.target.value);\n } catch (e) {\n // ignore\n } finally {\n if (date) {\n ev.target.value = leadWithZeroes(\n $.datepicker.formatDate($.datepicker._defaults.dateFormat, date)\n );\n }\n }\n};\n\nexport const humanDate = (function () {\n var now = new Date();\n var hour0 = now.setHours(0, 0, 0, 0);\n var dayinms = 1000 * 60 * 60 * 24;\n var hour24 = hour0 + dayinms;\n var thisyear = now.getYear();\n var daysofweek = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"].map(\n function (day) {\n return _(day);\n }\n );\n var monthsofyear = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"June\",\n \"July\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\"\n ].map(function (month) {\n return _(month);\n });\n function isToday(ms) {\n return ms > hour0 && ms < hour24;\n }\n function isYesterday(ms) {\n return hour0 > ms && ms > hour0 - dayinms;\n }\n function isLastWeek(ms) {\n return ms > hour0 - dayinms * 6;\n }\n function isThisYear(date) {\n return thisyear == date.getYear();\n }\n function humanDate(date) {\n if (!(date instanceof Date)) throw \"Expects a Date object\";\n var ms = date.valueOf();\n var hm = \"\";\n hm = date.toHoursAndMinutes();\n if (isToday(ms)) {\n return hm;\n }\n if (isYesterday(ms)) {\n return _(\"Yesterday\") + \", \" + hm;\n }\n if (isLastWeek(ms)) {\n return daysofweek[date.getDay()] + \" \" + hm;\n }\n return (\n date.getDate() +\n \" \" +\n monthsofyear[date.getMonth()] +\n (isThisYear(date) ? \"\" : \" \" + date.getFullYear()) +\n \", \" +\n hm\n );\n }\n return humanDate;\n})();\n","import { compose, either, isNil, not, path } from \"./functional.js\";\n\n/* editPolicy may be \"return\", \"stay\", or undefined, meaning off */\nexport const editPolicy = path([\"arbitrary\", \"core\", \"editPolicy\"]);\n\nexport const canEditEarlier = compose(not, isNil, editPolicy);\n\nconst isLabelValueDynamic = compose(\n value => value === true,\n path([\"arbitrary\", \"core\", \"isLabelValueDynamic\"])\n);\n\nconst preferUpdate = compose(\n value => value === true,\n path([\"arbitrary\", \"core\", \"preferUpdate\"])\n);\n\nexport const mustUpdate = either(preferUpdate, canEditEarlier);\n\nexport const updateLabels = either(mustUpdate, isLabelValueDynamic);\n","const _Widgets = {};\n\nexport function registerWidget(options) {\n _Widgets[options.name] = options;\n}\nexport function getWidget(name) {\n return _Widgets[name];\n}\n","/* global $ */\n\nimport { parseDate } from \"./dates\";\nimport { isReadOnly, isValidatable } from \"./control-helpers\";\nimport { updateLabels } from \"./feature-queries.js\";\nimport { conf } from \"./conf.js\";\nimport { getWidget } from \"./form-widgets.js\";\nimport { anyPass, has, prop } from \"./functional.js\";\nconst Dynprops = {};\n\n// Update the control element\nDynprops.update = function ($widget, control, Updates, requestor) {\n if (!$widget.get(0)) return;\n const oldval = $widget.val();\n\n const updates = Object.keys(Updates);\n const definition = getWidget(control.controltype);\n $widget.removeData([\"validated\"]);\n\n /** isForNotNull **/\n if (has(\"isForNotNull\", Updates)) {\n $widget.toggleClass(\"bb-for-required\", Boolean(control.isForNotNull));\n $widget.toggleClass(\"bb-for-optional\", !control.isForNotNull);\n }\n\n /** Placeholder **/\n if (has(\"placeholder\", Updates) > -1) {\n $widget.attr(\"placeholder\", control.placeholder);\n }\n\n /** Visible **/\n if (has(\"visible\", Updates)) {\n if (control.identifier === \"gformulier.gegevens.geschil_partner\")\n $widget.attr(\"aria-hidden\", !control.visible);\n $widget.attr(\"data-visible\", control.visible);\n\n if (control.visible) {\n window.setTimeout(function () {\n $widget.removeAttr(\"hidden\");\n }, 80);\n } else {\n window.setTimeout(function () {\n $widget.attr(\"hidden\", !control.visible);\n }, 80);\n }\n }\n\n /** Value **/\n if (has(\"value\", Updates)) {\n if (updateLabels(conf)) {\n /**\n @done: linklabel, listlabel, checkmultilist, memo, combobox, radio,\n checkbox, numedit, datetimepicker, edit, grid, multilist(?), listbox(?)\n @todo: freebox.\n\n NOTE: A widget currently can change itself *only* if\n they are registered with allowUpdatingSelf : true\n\n Widgets within a grid can update other widgets in a grid.\n */\n if (definition.setValue) {\n definition.setValue($widget.get(0), control.value, requestor, Updates);\n }\n }\n }\n\n /** Readonly **/\n if (\n anyPass([has(\"readonly\"), has(\"originalreadonly\"), has(\"visible\")], Updates)\n ) {\n const readonly = isReadOnly(control);\n if (typeof definition.onreadonly === \"function\") {\n definition.onreadonly($widget.get(0), readonly);\n } else {\n $widget.prop(\"disabled\", readonly);\n }\n }\n\n /** Minimum **/\n if (has(\"minimum\", Updates)) {\n $widget.attr(\"min\", control.minimum);\n if (control.controltype === \"datetimepicker\") {\n if (control.minimum) {\n $widget.datepicker(\"option\", \"minDate\", parseDate(control.minimum));\n }\n }\n }\n\n /** Maximum **/\n if (has(\"maximum\", Updates)) {\n $widget.attr(\"max\", control.maximum);\n if (control.controltype === \"datetimepicker\") {\n if (control.maximum) {\n $widget.datepicker(\"option\", \"maxDate\", parseDate(control.maximum));\n }\n }\n }\n\n /** Maxlength **/\n if (has(\"maxlength\", Updates)) {\n if (control.maxlength === 0) $widget.removeAttr(\"maxlength\");\n else $widget.attr(\"maxlength\", control.maxlength);\n }\n\n /** Let user know something changed perhaps against their intent. **/\n if (oldval !== $widget.val()) {\n $widget.addClass(\"bb-programmatically-changed\");\n $widget.trigger(\"change\", { programmatically: true });\n self.setTimeout(function () {\n $widget.removeClass(\"bb-programmatically-changed\");\n }, 1000);\n }\n\n /** Notnull **/\n if (has(\"notnull\", Updates)) {\n if (typeof definition.onrequired === \"function\") {\n definition.onrequired($widget.get(0), control.notnull);\n } else {\n $widget.attr(\"aria-required\", control.notnull);\n }\n if (control.notnull) {\n $widget.addClass(\"notnull\");\n } else {\n $widget.removeClass(\"notnull\");\n }\n }\n\n if (isValidatable(control)) {\n $widget.attr(\"aria-errormessage\", `${control.id}--error`);\n $widget.addClass(\"validatable\");\n } else {\n $widget.removeAttr(\"aria-errormessage\");\n $widget.removeClass(\"validatable\");\n }\n\n if (updates.length > 0) {\n const event = new CustomEvent(\"bb:updatedControl\", {\n detail: { control, Updates },\n bubbles: true\n });\n $widget.get(0).dispatchEvent(event);\n $(document).trigger(\"bb:updated\", [$widget, control, updates]);\n }\n};\n\n$.fn.extend({\n updateControl: function (controls, requestor) {\n return this.each(function () {\n const $this = $(this),\n control = $this.data(\"control\");\n if (\n this === requestor &&\n !prop(\"allowUpdatingSelf\", getWidget(control.controltype))\n ) {\n // This was the one requesting an update\n return this;\n }\n if (!control) throw (\"No updateControl defined for\", $this);\n const id = control.id,\n update = controls.find(function (c) {\n return c.id === id;\n }),\n // updates = [],\n Updates = {},\n props = [\n \"maxlength\",\n \"isForNotNull\",\n \"minimum\",\n \"maximum\",\n \"notnull\",\n \"readonly\",\n \"originalreadonly\",\n \"placeholder\",\n \"precision\",\n \"stringmask\",\n \"errortext\",\n \"visible\",\n \"value\",\n \"columns\",\n \"text\"\n ];\n // Caron-syntax used in label, therefore no (text) interface\n // returned -- should not mix and match dynprops with empty\n // labels! Do not allow this to error on the user though!\n\n // Does also handle (cause to ignore) labels within a grid!\n if (typeof update === \"undefined\") {\n return this;\n // update = $.extend({}, control, {visible: false});\n }\n for (var i in props) {\n if (control[props[i]] !== update[props[i]]) {\n Updates[props[i]] = { from: control[props[i]], to: update[props[i]] };\n control[props[i]] = update[props[i]];\n // updates.push(props[i]);\n }\n }\n Dynprops.update($this, control, Updates, requestor);\n return this;\n });\n }\n});\n\nexport { Dynprops };\n","const Hooks = new Map();\n\nexport const registerHook = key => hook => {\n if (typeof hook !== \"function\") throw \"Can only add a function as a hook\";\n Hooks.set(key, hook);\n};\n\nexport const runHook =\n key =>\n (...args) => {\n if (Hooks.has(key)) Hooks.get(key)(...args);\n };\n","/* global $ */\nimport { bbmClass, isReadOnly, renderAttribs } from \"./control-helpers\";\nimport { Dynprops } from \"./dynprops\";\nimport { escaped, escapeHTML } from \"./escape.js\";\nimport { conf, propFinder } from \"./conf\";\nimport { getWidget } from \"./form-widgets.js\";\nimport {\n assoc,\n both,\n compose,\n complement,\n has,\n hasPath,\n isNil,\n not,\n prop\n} from \"./functional.js\";\nimport { runHook } from \"./hooks.js\";\nimport { Mode } from \"./mode.js\";\n\nconst arbitraryCoreProp = propFinder(conf, \"arbitrary.core\");\n\n/**\n * Create a control widget, then insert it into the DOM\n *\n * @param {Object} control A control object as defined in the JSON API. The one to render + add.\n * @param {Object} group The group object to which this control belongs.\n * @param {Element} wGroup Element whereto this control should be added. *NOTE* that this need not be a .bb-group\n *\n * @return undefined\n *\n * @todo Simplify parameter list.\n */\nfunction wControl(control, group, wGroup) {\n control._group = group;\n let attribs = {};\n let widget;\n const enabled = group.current || complement(isReadOnly)(control);\n // Has been rendered\n if (control.$elt) {\n $(wGroup).append(control.$elt);\n return control.$elt;\n }\n if (compose(has(\"fixup\"), getWidget)(control.controltype))\n compose(fn => fn(control), prop(\"fixup\"), getWidget)(control.controltype);\n\n if (control.datatype) attribs[\"data-datatype\"] = control.datatype;\n\n if (control.meta)\n for (let d in control.meta) {\n if (both(has(d), compose(not, isNil, prop(d)))(control.meta))\n attribs[\"data-\" + d] = escape(control.meta[d]);\n }\n if (control.metadata) {\n attribs[\"data-metadata-keys\"] = Object.keys(control.metadata)\n .map(s => s.replace(/\\s/g, \"-\"))\n .join(\" \");\n }\n if (control.aria)\n for (let a in control.aria) {\n if (has(a, control.aria)) attribs[\"aria-\" + a] = control.aria[a];\n }\n\n if (control.name) {\n attribs[\"name\"] = control.name;\n }\n\n const wdef = getWidget(control.controltype);\n if (!wdef) {\n console.warn(`No widget definition for ${control.controltype}`);\n return null;\n }\n const tagName = wdef.tagName;\n attribs = wdef.attribs(attribs, control, enabled);\n\n attribs[\"data-type\"] = control.controltype;\n if (tagName) {\n widget = $(\"<\" + tagName + \" \" + renderAttribs(attribs) + \"/>\");\n } else {\n widget = $(wdef.render(control, group, attribs));\n if (!widget) return null;\n }\n\n if (control.className) {\n widget.addClass(control.className);\n }\n control.$elt = widget;\n control._elt = widget.get(0);\n\n if (wdef && wdef.tagName) {\n /**\n Okay, some (older) definitions have a tagName definition ->\n from which a quite empty skeleton widget is created.\n\n Afterwards, they fill that very widget with a render function\n of a different signature than usual:\n\n Instead of (control (plain object), group (plain object), attribs (array)), they get\n (control (plain object), widget (jQuery collection), group (plain object))).\n\n */\n wdef.render(control, widget, group);\n }\n\n // attach an id whenever meaningful:\n // if (control.id && /\\d+$/.test(control.id))\n if (control.id) {\n // id used not to be safe, but now we prepend the groupid, making it safe.\n widget.attr(\"id\", control.id);\n }\n if (control._originalid) {\n // Use data-id for stuff refering to the interface, no matter in which group it is, such as informationsources.\n widget.attr(\"data-id\", control._originalid);\n }\n\n if (hasPath([\"metadata\", \"autocomplete\"], control)) {\n widget\n .attr(\"data-server-name\", control.name)\n .attr(\"name\", control.metadata.autocomplete)\n .attr(\"autocomplete\", control.metadata.autocomplete);\n }\n\n $(wGroup).append(widget);\n\n /* Insert a space between elements so that elements are reasonably\n * well-placed when CSS is disabled.\n */\n $(wGroup).append(\" \");\n\n // Tooltips:\n if (control.hint) {\n if (enabled) Mode.set(\"hasHints\");\n runHook(\"hinter\")(widget, assoc(\"enabled\", enabled, control));\n }\n widget.data(\"control\", control);\n\n /**\n * Dynamic properties\n */\n var dynprops = [\n \"maxlength\",\n \"minimum\",\n \"maximum\",\n \"notnull\",\n \"isForNotNull\",\n \"readonly\",\n \"precision\",\n \"stringmask\",\n \"errortext\",\n \"placeholder\"\n ],\n dynpropsforus = {};\n\n for (var ii in dynprops) {\n if (has(dynprops[ii], control))\n dynpropsforus[dynprops[ii]] = { to: control[dynprops[ii]] }; // .push(dynprops[ii]);\n }\n\n if (has(\"visible\", control) && control.visible === false) {\n dynpropsforus[\"visible\"] = { to: false }; // .push(dynprops[ii]);\n }\n // dynpropsforus.push(\"visible\");\n\n widget.data(\"anchor\", widget);\n\n if (wdef && wdef.afterRender) {\n wdef.afterRender(widget, control);\n }\n\n if (shouldWrap(control)) {\n wrapInlineInput(widget);\n }\n\n /* Allow class-based styling */\n if (control[\"font-class\"]) {\n widget.addClass(bbmClass(control[\"font-class\"]));\n }\n\n /**\n * Two things:\n * - Put control tags in data-tags of Element.\n * - Make TAG known to CSS as bb-tagged-TAG.\n */\n if (control[\"tags\"] instanceof Array) {\n $(widget).data(\"tags\", control[\"tags\"]);\n $.each(control[\"tags\"], function (i, tag) {\n widget.addClass(\"bb-tagged-\" + tag);\n });\n }\n\n Dynprops.update(widget, control, dynpropsforus);\n\n return widget;\n}\n\nfunction shouldWrap(control) {\n return (\n control.prelabel ||\n control.postlabel ||\n (arbitraryCoreProp(\"wrapAllSingleLiners\") === true &&\n compose(prop(\"couldWrap\"), getWidget)(control.controltype)) ||\n (control.placeholder &&\n arbitraryCoreProp(\"accessiblePlaceholders\") === true &&\n compose(prop(\"couldWrap\"), getWidget)(control.controltype))\n );\n}\n\nfunction wrapInlineInput(widget) {\n var control = widget.data(\"control\"),\n prelabel = control.prelabel,\n postlabel = control.postlabel;\n var anchor = widget.data(\"anchor\");\n var wraptag = \"span\";\n if (anchor.get(0).nodeName === \"DIV\") wraptag = \"div\";\n anchor.wrapAll(\n \"<\" +\n wraptag +\n ' data-wraps-type=\"' +\n control.controltype +\n '\" class=\"bb-input-wrap\">\"\n );\n anchor = anchor.parent();\n widget.data(\"anchor\", anchor);\n anchor.data({\n control: control,\n type: control.controltype\n });\n if (prelabel)\n anchor.prepend(\n '' +\n escapeHTML(prelabel) +\n \"\"\n );\n if (control.placeholder && arbitraryCoreProp(\"accessiblePlaceholders\")) {\n widget\n .get(0)\n .setAttribute(\n \"aria-describedby\",\n (\n (widget.get(0).getAttribute(\"aria-describedby\") || \"\") +\n ` ${control.id}--placeholder`\n ).trim()\n );\n anchor.append(\n `${escapeHTML(control.placeholder)}`\n );\n }\n if (postlabel)\n anchor.append(\n '' +\n escapeHTML(postlabel) +\n \"\"\n );\n}\n\nconst getControl = elt => $.data(elt, \"control\");\n\nexport { getControl, wControl };\n","export const listtypes = {\n radio: \"LIST\",\n checkmultilist: \"LIST\",\n customlist: \"LIST\",\n combobox: \"BOX\",\n listbox: \"BOX\",\n multilist: \"BOX\"\n};\n","import {\n groupWith,\n map,\n filter,\n pipe,\n path,\n strictUniq,\n lensPath\n} from \"./functional.js\";\n\nconst pathToGroup = [\"metadata\", \"group\"];\nexport const pathGroup = path(pathToGroup);\nexport const lensGroup = lensPath([\"metadata\", \"group\"]);\n\nconst areOfOneQuestion = (a, b) => a.isfor === b.id || b.isfor === a.id;\n\nexport const groupInner = groupWith(areOfOneQuestion);\n\nconst InfinityIfMinus1 = num => (num + 1 || Infinity) - 1;\nconst indexOfOrInfinity = (sub, s) => InfinityIfMinus1(s.indexOf(sub));\nexport const baseGroup = s => s.substr(0, indexOfOrInfinity(\".\", s));\nexport const tailGroup = s => s.substr(indexOfOrInfinity(\".\", s) + 1);\n\nconst belongTogether = (a, b) =>\n areOfOneQuestion(a, b) ||\n (pathGroup(a) &&\n pathGroup(b) &&\n baseGroup(pathGroup(a)) === baseGroup(pathGroup(b)));\n\nexport const groupOuter = groupWith(belongTogether);\n\nexport const groupClasses = pipe(\n map(path[(\"metadata\", \"groupClasses\")]),\n filter(Boolean),\n strictUniq\n);\n\nexport const doGrouping = path([\"arbitrary\", \"core\", \"form-group\", \"on\"]);\n","export const normalize = s => s.toLowerCase().replace(/[^a-z0-9]/g, \"-\");\n","import { path, either, compose, prop } from \"./functional.js\";\nimport { conf } from \"./conf.js\";\n\n/**\n\nName keys follow this pattern:\n\n__\n\n is any of:\n\n- GROUPING: subgroup of questions and/or texts and/or links\n- ITEM: a question and/or text and/or link\n- QUESTION: a question (is also an item)\n- TEXT: a top level text (not a label for a question)\n- LINK: a top level link (so: not inside markdown)\n- PICTURE: a top level image (so : nto inside markdown)\n\nGROUPING ::= ITEM+\nITEM ::= QUESTION | TEXT | LINK | PICTURE\n\n is any of:\n\n- _CLASS_ : the css class to put on this type \n- _PREFIX_: a css class prefix\n- _DATA_: a data- attribute\n\nwhere can be anything.\n\nThe default values for those keys, thus the strings that willl be used\nin the generated DOM, are provided in nameDefaults. They can be\noverwritten in the `conf.json` file in the property\n`core.form-group.names` in order to retrofit older or other naming\nschemes.\n\n*/\n\nexport const /* A grouping groups items */\n GROUPING_CLASS = \"grouping-class\", // Class of grouping\n GROUPING_PREFIX_TYPE = \"grouping-prefix-type\", // prefix for -question, -text or -author\n GROUPING_DATA_NAME = \"grouping-data-name\", // data attribute conveying author provided group name\n GROUPING_DATA_LEVEL = \"grouping-data-level\", // grouping level, 1-based\n ITEM_PREFIX_AUTHORCLASS = \"item-prefix-authorclass\", // prefix for author class set with cssclasses on the metadata\n QUESTION_CLASS = \"question-class\", //: \"bb-questionlabelgroup\",\n QUESTION_PREFIX_TYPE = \"question-prefix-type\", //: \"bb-itype\",\n QUESTION_PREFIX_PROPERTY = \"question-prefix-property\", //: \"bb-itype\",\n QUESTION_DATA_LAYOUT = \"question-data-layout\", //: \"data-form-group-layout\",\n QUESTION_PREFIX_AUTHORSTYLE = \"question-prefix-authorstyle\", //: \"bb-g-\",\n QUESTION_CLASS_NOLABEL = \"question-class-nolabel\"; //: \"form-group__question--no-label\",\n\nconst nameDefaults = {\n [GROUPING_CLASS]: \"form-group\",\n [GROUPING_PREFIX_TYPE]: \"form-group-\",\n [GROUPING_DATA_NAME]: \"data-form-group-name\",\n [GROUPING_DATA_LEVEL]: \"data-form-group-level\",\n [ITEM_PREFIX_AUTHORCLASS]: \"form-group__item--author-class-\",\n [QUESTION_CLASS]: \"bb-questionlabelgroup\",\n [QUESTION_PREFIX_TYPE]: \"bb-itype\",\n [QUESTION_PREFIX_PROPERTY]: \"question-\", //: \"bb-itype\",\n [QUESTION_DATA_LAYOUT]: \"data-form-group-layout\",\n [QUESTION_PREFIX_AUTHORSTYLE]: \"bb-g-\",\n [QUESTION_CLASS_NOLABEL]: \"form-group__question--no-label\"\n};\n\n// const fg = {\n// [GROUPING_CLASS]: \"no-form-group-outer\",\n// [GROUPING_PREFIX_TYPE]: \"form-group-\",\n// [QUESTION_CLASS]: \"bb-questionlabelgroup p-form-group\",\n// [QUESTION_PREFIX_TYPE]: \"bb-itype-\",\n// [QUESTION_DATA_LAYOUT]: \"data-p-form-group-layout-type\",\n// [QUESTION_CLASS_NOLABEL]: \"p-form-group-orphaned\"\n// };\n\n// const bem_example = {\n// [GROUPING_CLASS]: \"form-group\",\n// [GROUPING_PREFIX_TYPE]: \"form-group-\",\n// [ITEM_PREFIX_AUTHORCLASS]: \"form-group__item--author-class-\",\n// [QUESTION_CLASS]: \"bb-questionlabelgroup\",\n// [QUESTION_PREFIX_TYPE]: \"form-group__question-\",\n// [QUESTION_DATA_LAYOUT]: \"data-form-group-layout\",\n// [QUESTION_PREFIX_AUTHORSTYLE]: \"form-group__question--author-style-\"\n// };\n\nconst pathToNames = path([\"arbitrary\", \"core\", \"form-group\", \"names\"]);\n\nexport const names = propArg =>\n either(compose(prop(propArg), pathToNames), _ => prop(propArg, nameDefaults))(\n conf\n );\n","/* global $ */\nimport {\n all,\n both,\n curry,\n filter,\n has,\n compose,\n ifElse,\n head,\n path,\n prop,\n propEq,\n any,\n find,\n pathOr,\n split,\n join,\n map,\n when,\n tap,\n cond,\n not\n} from \"./functional.js\";\nimport {\n isTextual,\n isPicture,\n isQuestion,\n isVisible\n} from \"./control-helpers.js\";\nimport { groupOuter, baseGroup, tailGroup, pathGroup } from \"./groupings\";\nimport { normalize } from \"./font-classes\";\nimport { getWidget } from \"./form-widgets.js\";\nimport { conf } from \"./conf\";\nimport * as n from \"./names.js\";\nimport { names } from \"./names.js\";\n\nconst doTopLevel = pathOr(true, [\n \"arbitrary\",\n \"core\",\n \"form-group\",\n \"toplevel\"\n]);\n\nconst doLegends = pathOr(true, [\n \"arbitrary\",\n \"core\",\n \"form-group\",\n \"doLegends\"\n]);\n\nconst getLayout = type =>\n pathOr(compose(prop(\"layout\"), getWidget)(type), [\n \"arbitrary\",\n \"form-group\",\n type\n ]);\n\nconst getGroupName = compose(when(Boolean, baseGroup), pathGroup, head);\n\n// Interface Font Style\nconst questionGroupClass = compose(\n s => names(n.QUESTION_PREFIX_AUTHORSTYLE) + s,\n normalize,\n prop(\"font-class\")\n);\n\n// interface metadata: cssclasses=\nexport const extraClasses = prefix =>\n compose(\n when(\n Boolean,\n compose(\n join(\" \"),\n map(compose(s => names(prefix) + s, normalize)),\n split(\" \")\n )\n ),\n path([\"metadata\", \"cssclasses\"])\n );\n\nconst asciify = s => s.replace(/[^a-z-]/g, \"-\");\n\nconst areAllInvisible = compose(not, any(isVisible));\nconst areAllReadonly = both(\n any(both(isQuestion, isVisible)),\n compose(all(prop(\"originalreadonly\")), filter(both(isQuestion, isVisible)))\n);\n\nconst areAllNotNull = both(\n any(both(isQuestion, isVisible)),\n compose(all(prop(\"notnull\")), filter(both(isQuestion, isVisible)))\n);\n\nconst updateClassWhen = curry((className, fn, controls, elt) => {\n elt.classList.toggle(className, fn(controls));\n});\n\nconst setReadonlyFGClass = updateClassWhen(\n names(n.GROUPING_PREFIX_TYPE) + \"-readonly\",\n areAllReadonly\n);\nconst setEmptyFGClass = updateClassWhen(\n names(n.GROUPING_PREFIX_TYPE) + \"-empty\",\n areAllInvisible\n);\nconst setRequiredFGClass = updateClassWhen(\n names(n.GROUPING_PREFIX_TYPE) + \"-required\",\n areAllNotNull\n);\n\nconst setReadonlyQClass = updateClassWhen(\n names(n.QUESTION_PREFIX_PROPERTY) + \"-readonly\",\n areAllReadonly\n);\nconst setEmptyQClass = updateClassWhen(\n names(n.QUESTION_PREFIX_PROPERTY) + \"-empty\",\n areAllInvisible\n);\nconst setRequiredQClass = updateClassWhen(\n names(n.QUESTION_PREFIX_PROPERTY) + \"-required\",\n areAllNotNull\n);\n\nexport const createFormGroup = (wControl, group, level) => c => {\n let formGroup;\n const groupName = getGroupName(c);\n\n if (\n groupName ||\n (doTopLevel(conf) &&\n (doLegends(conf) || !all(propEq(\"controltype\", \"legend\"))(c)))\n ) {\n formGroup = document.createElement(\"div\");\n formGroup.className = names(n.GROUPING_CLASS);\n formGroup.setAttribute(names(n.GROUPING_DATA_LEVEL), level);\n setEmptyFGClass(c, formGroup);\n setReadonlyFGClass(c, formGroup);\n setRequiredFGClass(c, formGroup);\n formGroup.addEventListener(\"bb:updatedControl\", ({ detail }) => {\n if (has(\"visible\", detail.Updates)) {\n setEmptyFGClass(c, formGroup);\n }\n if (has(\"readonly\", detail.Updates)) {\n setReadonlyFGClass(c, formGroup);\n }\n if (has(\"notnull\", detail.Updates)) {\n setRequiredFGClass(c, formGroup);\n }\n });\n if (groupName) {\n formGroup.setAttribute(names(n.GROUPING_DATA_NAME), asciify(groupName));\n formGroup.classList.add(names(n.GROUPING_PREFIX_TYPE) + \"-author\");\n } else if (find(isQuestion, c)) {\n formGroup.classList.add(names(n.GROUPING_PREFIX_TYPE) + \"-interface\");\n } else if (compose(isPicture, head)(c)) {\n formGroup.classList.add(names(n.GROUPING_PREFIX_TYPE) + \"-picture\");\n } else if (compose(isTextual, head)(c)) {\n formGroup.classList.add(names(n.GROUPING_PREFIX_TYPE) + \"-text\");\n }\n } else {\n formGroup = document.createDocumentFragment();\n }\n\n const cWithin = compose(\n groupOuter,\n map(\n when(\n pathGroup,\n tap(control =>\n compose(\n ifElse(\n s => s === \"\",\n () => delete control.metadata.group,\n group => (control.metadata.group = group)\n ),\n tailGroup\n )(control.metadata.group)\n )\n )\n )\n )(c);\n cWithin.forEach(\n cond([\n [\n getGroupName,\n compose(\n n => formGroup.appendChild(n),\n createFormGroup(wControl, group, level + 1)\n )\n ],\n [\n any(isQuestion),\n controls => {\n const answer = find(isQuestion, controls);\n const classes = [\n names(n.QUESTION_CLASS),\n `${names(n.QUESTION_PREFIX_TYPE)}-${answer.controltype}`,\n questionGroupClass(answer),\n extraClasses(n.ITEM_PREFIX_AUTHORCLASS)(answer),\n controls.length === 1 && names(n.QUESTION_CLASS_NOLABEL)\n ].filter(Boolean);\n const qlg = document.createElement(\"div\");\n qlg.setAttribute(\n names(n.QUESTION_DATA_LAYOUT),\n answer._layout || getLayout(answer.controltype)(conf)\n );\n qlg.className = classes.join(\" \");\n setEmptyQClass(controls, qlg);\n setReadonlyQClass(controls, qlg);\n setRequiredQClass(controls, qlg);\n qlg.addEventListener(\"bb:updatedControl\", ({ detail }) => {\n if (has(\"visible\", detail.Updates)) {\n setEmptyQClass(controls, qlg);\n }\n if (has(\"readonly\", detail.Updates)) {\n setReadonlyQClass(controls, qlg);\n }\n if (has(\"notnull\", detail.Updates)) {\n setRequiredQClass(controls, qlg);\n }\n });\n controls.forEach(c => wControl(c, group, $(qlg)));\n formGroup.appendChild(qlg);\n }\n ],\n [\n () => true,\n map(c => {\n const $widget = wControl(c, group, $(formGroup));\n if ($widget)\n $widget.addClass(extraClasses(n.ITEM_PREFIX_AUTHORCLASS)(c));\n })\n ]\n ])\n );\n return formGroup;\n};\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nvar t,i,s,e;const o=globalThis.trustedTypes,l=o?o.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,n=`lit$${(Math.random()+\"\").slice(9)}$`,h=\"?\"+n,r=`<${h}>`,u=document,c=(t=\"\")=>u.createComment(t),d=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,v=Array.isArray,a=t=>{var i;return v(t)||\"function\"==typeof(null===(i=t)||void 0===i?void 0:i[Symbol.iterator])},f=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=/>|[ \t\\n\f\\r](?:([^\\s\"'>=/]+)([ \t\\n\f\\r]*=[ \t\\n\f\\r]*(?:[^ \t\\n\f\\r\"'`<>=]|(\"|')|))|$)/g,$=/'/g,g=/\"/g,y=/^(?:script|style|textarea)$/i,b=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),T=b(1),x=b(2),w=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),P=new WeakMap,V=(t,i,s)=>{var e,o;const l=null!==(e=null==s?void 0:s.renderBefore)&&void 0!==e?e:i;let n=l._$litPart$;if(void 0===n){const t=null!==(o=null==s?void 0:s.renderBefore)&&void 0!==o?o:null;l._$litPart$=n=new C(i.insertBefore(c(),t),t,void 0,s)}return n.I(t),n},E=u.createTreeWalker(u,129,null,!1),M=(t,i)=>{const s=t.length-1,e=[];let o,h=2===i?\"\":\"\",u=f;for(let i=0;i\"===c[0]?(u=null!=o?o:f,d=-1):void 0===c[1]?d=-2:(d=u.lastIndex-c[2].length,l=c[1],u=void 0===c[3]?p:'\"'===c[3]?g:$):u===g||u===$?u=p:u===_||u===m?u=f:(u=p,o=void 0);const a=u===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";h+=u===f?s+r:d>=0?(e.push(l),s.slice(0,d)+\"$lit$\"+s.slice(d)+n+a):s+n+(-2===d?(e.push(void 0),i):a)}const c=h+(t[s]||\"\")+(2===i?\"\":\"\");return[void 0!==l?l.createHTML(c):c,e]};class N{constructor({strings:t,_$litType$:i},s){let e;this.parts=[];let l=0,r=0;const u=t.length-1,d=this.parts,[v,a]=M(t,i);if(this.el=N.createElement(v,s),E.currentNode=this.el.content,2===i){const t=this.el.content,i=t.firstChild;i.remove(),t.append(...i.childNodes)}for(;null!==(e=E.nextNode())&&d.length0){e.textContent=o?o.emptyScript:\"\";for(let s=0;s2||\"\"!==s[0]||\"\"!==s[1]?(this.H=Array(s.length-1).fill(A),this.strings=s):this.H=A}get tagName(){return this.element.tagName}I(t,i=this,s,e){const o=this.strings;let l=!1;if(void 0===o)t=S(this,t,i,0),l=!d(t)||t!==this.H&&t!==w,l&&(this.H=t);else{const e=t;let n,h;for(t=o[0],n=0;nnew n(t+\"\",e),o=new Map,r=(t,...s)=>{const r=s.reduce(((e,s,o)=>e+(t=>{if(t instanceof n)return t.cssText;if(\"number\"==typeof t)return t;throw Error(`Value passed to 'css' function must be a 'css' function result: ${t}. Use 'unsafeCSS' to pass non-literal values, but\\n take care to ensure page security.`)})(s)+t[o+1]),t[0]);let i=o.get(r);return void 0===i&&o.set(r,i=new n(r,e)),i},i=(e,n)=>{t?e.adoptedStyleSheets=n.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet)):n.forEach((t=>{const n=document.createElement(\"style\");n.textContent=t.cssText,e.appendChild(n)}))},S=t?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const n of t.cssRules)e+=n.cssText;return s(e)})(t):t;export{n as CSSResult,i as adoptStyles,r as css,S as getCompatibleStyle,t as supportsAdoptingStyleSheets,s as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as i}from\"./css-tag.js\";export{CSSResult,adoptStyles,css,getCompatibleStyle,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */var s,e,h,r;const o={toAttribute(t,i){switch(i){case Boolean:t=t?\"\":null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,i){let s=t;switch(i){case Boolean:s=null!==t;break;case Number:s=null===t?null:Number(t);break;case Object:case Array:try{s=JSON.parse(t)}catch(t){s=null}}return s}},n=(t,i)=>i!==t&&(i==i||t==t),l={attribute:!0,type:String,converter:o,reflect:!1,hasChanged:n};class a extends HTMLElement{constructor(){super(),this.Πi=new Map,this.Πo=void 0,this.Πl=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this.Πh=null,this.u()}static addInitializer(t){var i;null!==(i=this.v)&&void 0!==i||(this.v=[]),this.v.push(t)}static get observedAttributes(){this.finalize();const t=[];return this.elementProperties.forEach(((i,s)=>{const e=this.Πp(s,i);void 0!==e&&(this.Πm.set(e,s),t.push(e))})),t}static createProperty(t,i=l){if(i.state&&(i.attribute=!1),this.finalize(),this.elementProperties.set(t,i),!i.noAccessor&&!this.prototype.hasOwnProperty(t)){const s=\"symbol\"==typeof t?Symbol():\"__\"+t,e=this.getPropertyDescriptor(t,s,i);void 0!==e&&Object.defineProperty(this.prototype,t,e)}}static getPropertyDescriptor(t,i,s){return{get(){return this[i]},set(e){const h=this[t];this[i]=e,this.requestUpdate(t,h,s)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)||l}static finalize(){if(this.hasOwnProperty(\"finalized\"))return!1;this.finalized=!0;const t=Object.getPrototypeOf(this);if(t.finalize(),this.elementProperties=new Map(t.elementProperties),this.Πm=new Map,this.hasOwnProperty(\"properties\")){const t=this.properties,i=[...Object.getOwnPropertyNames(t),...Object.getOwnPropertySymbols(t)];for(const s of i)this.createProperty(s,t[s])}return this.elementStyles=this.finalizeStyles(this.styles),!0}static finalizeStyles(i){const s=[];if(Array.isArray(i)){const e=new Set(i.flat(1/0).reverse());for(const i of e)s.unshift(t(i))}else void 0!==i&&s.push(t(i));return s}static Πp(t,i){const s=i.attribute;return!1===s?void 0:\"string\"==typeof s?s:\"string\"==typeof t?t.toLowerCase():void 0}u(){var t;this.Πg=new Promise((t=>this.enableUpdating=t)),this.L=new Map,this.Π_(),this.requestUpdate(),null===(t=this.constructor.v)||void 0===t||t.forEach((t=>t(this)))}addController(t){var i,s;(null!==(i=this.ΠU)&&void 0!==i?i:this.ΠU=[]).push(t),void 0!==this.renderRoot&&this.isConnected&&(null===(s=t.hostConnected)||void 0===s||s.call(t))}removeController(t){var i;null===(i=this.ΠU)||void 0===i||i.splice(this.ΠU.indexOf(t)>>>0,1)}Π_(){this.constructor.elementProperties.forEach(((t,i)=>{this.hasOwnProperty(i)&&(this.Πi.set(i,this[i]),delete this[i])}))}createRenderRoot(){var t;const s=null!==(t=this.shadowRoot)&&void 0!==t?t:this.attachShadow(this.constructor.shadowRootOptions);return i(s,this.constructor.elementStyles),s}connectedCallback(){var t;void 0===this.renderRoot&&(this.renderRoot=this.createRenderRoot()),this.enableUpdating(!0),null===(t=this.ΠU)||void 0===t||t.forEach((t=>{var i;return null===(i=t.hostConnected)||void 0===i?void 0:i.call(t)})),this.Πl&&(this.Πl(),this.Πo=this.Πl=void 0)}enableUpdating(t){}disconnectedCallback(){var t;null===(t=this.ΠU)||void 0===t||t.forEach((t=>{var i;return null===(i=t.hostDisconnected)||void 0===i?void 0:i.call(t)})),this.Πo=new Promise((t=>this.Πl=t))}attributeChangedCallback(t,i,s){this.K(t,s)}Πj(t,i,s=l){var e,h;const r=this.constructor.Πp(t,s);if(void 0!==r&&!0===s.reflect){const n=(null!==(h=null===(e=s.converter)||void 0===e?void 0:e.toAttribute)&&void 0!==h?h:o.toAttribute)(i,s.type);this.Πh=t,null==n?this.removeAttribute(r):this.setAttribute(r,n),this.Πh=null}}K(t,i){var s,e,h;const r=this.constructor,n=r.Πm.get(t);if(void 0!==n&&this.Πh!==n){const t=r.getPropertyOptions(n),l=t.converter,a=null!==(h=null!==(e=null===(s=l)||void 0===s?void 0:s.fromAttribute)&&void 0!==e?e:\"function\"==typeof l?l:null)&&void 0!==h?h:o.fromAttribute;this.Πh=n,this[n]=a(i,t.type),this.Πh=null}}requestUpdate(t,i,s){let e=!0;void 0!==t&&(((s=s||this.constructor.getPropertyOptions(t)).hasChanged||n)(this[t],i)?(this.L.has(t)||this.L.set(t,i),!0===s.reflect&&this.Πh!==t&&(void 0===this.Πk&&(this.Πk=new Map),this.Πk.set(t,s))):e=!1),!this.isUpdatePending&&e&&(this.Πg=this.Πq())}async Πq(){this.isUpdatePending=!0;try{for(await this.Πg;this.Πo;)await this.Πo}catch(t){Promise.reject(t)}const t=this.performUpdate();return null!=t&&await t,!this.isUpdatePending}performUpdate(){var t;if(!this.isUpdatePending)return;this.hasUpdated,this.Πi&&(this.Πi.forEach(((t,i)=>this[i]=t)),this.Πi=void 0);let i=!1;const s=this.L;try{i=this.shouldUpdate(s),i?(this.willUpdate(s),null===(t=this.ΠU)||void 0===t||t.forEach((t=>{var i;return null===(i=t.hostUpdate)||void 0===i?void 0:i.call(t)})),this.update(s)):this.Π$()}catch(t){throw i=!1,this.Π$(),t}i&&this.E(s)}willUpdate(t){}E(t){var i;null===(i=this.ΠU)||void 0===i||i.forEach((t=>{var i;return null===(i=t.hostUpdated)||void 0===i?void 0:i.call(t)})),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}Π$(){this.L=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this.Πg}shouldUpdate(t){return!0}update(t){void 0!==this.Πk&&(this.Πk.forEach(((t,i)=>this.Πj(i,this[i],t))),this.Πk=void 0),this.Π$()}updated(t){}firstUpdated(t){}}a.finalized=!0,a.shadowRootOptions={mode:\"open\"},null===(e=(s=globalThis).reactiveElementPlatformSupport)||void 0===e||e.call(s,{ReactiveElement:a}),(null!==(h=(r=globalThis).reactiveElementVersions)&&void 0!==h?h:r.reactiveElementVersions=[]).push(\"1.0.0-rc.1\");export{a as ReactiveElement,o as defaultConverter,n as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","import{ReactiveElement as t}from\"@lit/reactive-element\";export*from\"@lit/reactive-element\";import{render as e,noChange as r}from\"lit-html\";export*from\"lit-html\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */var i,l,o,s,n,a;const c=t;(null!==(i=(a=globalThis).litElementVersions)&&void 0!==i?i:a.litElementVersions=[]).push(\"3.0.0-rc.1\");class h extends t{constructor(){super(...arguments),this.renderOptions={host:this},this.Φt=void 0}createRenderRoot(){var t,e;const r=super.createRenderRoot();return null!==(t=(e=this.renderOptions).renderBefore)&&void 0!==t||(e.renderBefore=r.firstChild),r}update(t){const r=this.render();super.update(t),this.Φt=e(r,this.renderRoot,this.renderOptions)}connectedCallback(){var t;super.connectedCallback(),null===(t=this.Φt)||void 0===t||t.setConnected(!0)}disconnectedCallback(){var t;super.disconnectedCallback(),null===(t=this.Φt)||void 0===t||t.setConnected(!1)}render(){return r}}h.finalized=!0,h._$litElement$=!0,null===(o=(l=globalThis).litElementHydrateSupport)||void 0===o||o.call(l,{LitElement:h}),null===(n=(s=globalThis).litElementPlatformSupport)||void 0===n||n.call(s,{LitElement:h});const u={K:(t,e,r)=>{t.K(e,r)},L:t=>t.L};export{h as LitElement,c as UpdatingElement,u as _Φ};\n//# sourceMappingURL=lit-element.js.map\n","\"use strict\";var u=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var c=(t,a)=>{for(var l in a)u(t,l,{get:a[l],enumerable:!0})},o=(t,a,l,r)=>{if(a&&typeof a==\"object\"||typeof a==\"function\")for(let i of s(a))!p.call(t,i)&&i!==l&&u(t,i,{get:()=>a[i],enumerable:!(r=n(a,i))||r.enumerable});return t};var T=t=>o(u({},\"__esModule\",{value:!0}),t);var b={};c(b,{Maybe:()=>e});module.exports=T(b);var e=class{constructor(a){this.value=a}static of(a){return new e(a)}map(a){return this.isEmpty()?e.of(null):e.of(a(this.value))}chain(a){let l=this.map(a).join();return l===null?e.of(null):l}getOrElse(a){return this.isEmpty()?a:this.value}join(){return this.value}isEmpty(){return this.value===null||this.value===void 0}};0&&(module.exports={Maybe});\n//# sourceMappingURL=index.js.map","import { _ } from \"./gettext\";\n\n/*** NUMBER UTILITIES BEGIN ***/\n\nexport function forceInRange(num, min, max) {\n if (typeof min == \"undefined\" && typeof max == \"undefined\") return num;\n if (typeof min == \"undefined\") return Math.min(max, num);\n if (typeof max == \"undefined\") return Math.max(min, num);\n if (min === max) return min;\n return Math.max(Math.min(max, num), min);\n}\n\nexport const Numerals = (function () {\n /**\n * Create a getter for array, consuming items, repeating the last one\n * indefinitely.\n *\n * @param {Array} arr The array to make a repeater for\n * @return {Function()} Gets next item in arr, repeating last item indefinitely\n */\n function makeLastItemRepeater(arr) {\n var _a = arr.slice();\n var _last;\n return function getIter() {\n _last = _a.shift() || _last;\n return _last;\n };\n }\n /**\n * Create a formatting function for (arabic-hindu) numerals.\n *\n * @param {String} radixPoint String (character) used as radix point.\n * @param {String} groupingChar String (character) used for grouping\n * digits before the radix point.\n * @param {Array} groupingRules (optional) Array defining\n * grouping rules. Each element in this array stands for a group,\n * tracking leftwards from the radix point. When no more elements\n * remain, the last element will be repeated indefinitely.\n *\n * Most language use [3] (the default). For Indian, use [3,2]; for Chinese (and\n * Japanese?), use [4].\n *\n * Besides these rules, the special case of formatting\n * four digits in a row without grouping and no\n * fractional part is supported, and cannot be overruled.\n *\n * @return {Function()} Formatting function.\n */\n function makeFormatter(radixPoint, groupingChar, groupingRules) {\n return function formatter(num) {\n var idx = makeLastItemRepeater(groupingRules || [3]);\n var split = num.toString().split(\".\");\n var integralPart = split[0];\n var fractionalPart = split[1];\n var neg = (integralPart[0] === \"-\" && \"-\") || \"\";\n if (neg) integralPart = integralPart.substr(1);\n var th,\n out = \"\";\n if (integralPart) {\n // The four-digit exception rule (such as in years):\n if (!fractionalPart && integralPart.length === 4) out = integralPart;\n else {\n integralPart = integralPart.split(\"\").reverse();\n while ((th = integralPart.splice(0, idx()))[0]) {\n out = th.reverse().join(\"\") + (out ? groupingChar : \"\") + out;\n }\n }\n }\n if (fractionalPart) return neg + out + radixPoint + fractionalPart;\n return neg + out;\n };\n }\n function makeParser(radixPoint, groupingChar) {\n /**\n * Match anything not a digit or negative sign\n */\n var thre = /[^0-9-]/g;\n /**\n * Match only optional leading minus digits,\n * radixPoint, groupingChar and space characters.\n */\n var testre = new RegExp(\"^s?-?[0-9 \" + radixPoint + groupingChar + \"]*$\");\n\n return function parser(s) {\n if (!testre.test(s)) throw new Error(_(\"Invalid number\"));\n var split = s.split(radixPoint);\n var integralPart = split[0].replace(thre, \"\");\n if (!/^-?[0-9]*$/.test(integralPart))\n throw new Error(_(\"Invalid number\"));\n var fractionalPart = split[1];\n if (fractionalPart) fractionalPart = fractionalPart.replace(/\\s/g, \"\");\n if (!fractionalPart) fractionalPart = \"0\";\n if (!/^[0-9]*$/.test(fractionalPart))\n throw new Error(_(\"Invalid number\"));\n // Room for errors here.\n return new Number(integralPart + \".\" + fractionalPart) + 0;\n };\n }\n\n return {\n parser: makeParser(\n _(\"__radixpoint__\", \".\"),\n _(\"__digitgroupingchar__\", \",\")\n ),\n formatter: makeFormatter(\n _(\"__radixpoint__\", \".\"),\n _(\"__digitgroupingchar__\", \",\"),\n _(\"__digitgroupingrules__\", [3])\n ),\n makeFormatter: makeFormatter,\n makeParse: makeParser,\n refresh: () => {\n // console.log(this);\n Numerals.parser = makeParser(\n _(\"__radixpoint__\", \".\"),\n _(\"__digitgroupingchar__\", \",\")\n );\n Numerals.formatter = makeFormatter(\n _(\"__radixpoint__\", \".\"),\n _(\"__digitgroupingchar__\", \",\"),\n _(\"__digitgroupingrules__\", [3])\n );\n }\n };\n})();\n/*** NUMBER UTILITIES END ***/\n","import { fromApiServer } from \"./location.js\";\nimport Vars from \"./vars.js\";\n\nif (!window.location.origin) {\n window.location.origin =\n window.location.protocol +\n \"//\" +\n window.location.hostname +\n (window.location.port ? \":\" + window.location.port : \"\");\n}\n\n/*** URL UTILITIES BEGIN ***/\nexport const urlutils = (function () {\n var mimetypes = {\n xsl: \"text/html\",\n html: \"text/html\",\n docx: \"application/msword\",\n pdf: \"application/pdf\",\n odt: \"application/vnd.oasis.opendocument.text\",\n rtf: \"application/rtf\",\n doc: \"application/msword\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\"\n };\n function caseReport(casus) {\n return fromApiServer(\"report?\" + Vars.querify(Vars.SESSION_KEYS, casus));\n }\n function getFiles(casus) {\n return \"getfiles?\" + Vars.querify(Vars.SESSION_KEYS, casus);\n }\n function isJS(url) {\n return url.match(/javascript:/);\n }\n function isEmptyish(url) {\n return url[0] === \"?\";\n }\n var JSAlertMessage =\n \"ALERT:\\nIt looks like someone is trying to eavesdrop on you,\" +\n \" trying to evaluate JavaScript code. \" +\n \"This person may want to steal private information \" +\n \"from you or other persons. \" +\n \"For your safety and that of others, \" +\n \"please contact this website \" +\n \"to report this message.\";\n return {\n isJS,\n isEmptyish,\n JSAlertMessage,\n getFiles,\n caseReport,\n mimetype: function (url) {\n const absoluteURL = new URL(\n fromApiServer(url),\n `${location.protocol}${location.host}${location.pathname}`\n );\n const filename = absoluteURL.pathname.endsWith(\"/getfile\")\n ? new URLSearchParams(absoluteURL.search).get(\"filename\")\n : absoluteURL.pathname.split(\"/\").pop();\n if (!filename) return null;\n const ext = filename.match(/\\.([^?.]+)$/),\n mimetype = ext && mimetypes[ext[1]];\n if (!mimetype) return null;\n return {\n mimetype: mimetype,\n ext: ext[1]\n };\n }\n };\n})();\n/*** URL UTILITIES END ***/\n","/* global $ */\nimport { html, render } from \"lit\";\nimport { Maybe } from \"@cahmoraes93/maybe\";\nimport { A11y, observeDatepickers } from \"./a11y.js\";\nimport { conf, propFinder } from \"./conf.js\";\nimport { wControl, getControl } from \"./control.js\";\nimport { quotable } from \"./quotable.js\";\nimport {\n isLabel,\n isOption,\n isQuestion,\n isReadOnly,\n renderAttribs,\n setAttribs\n} from \"./control-helpers.js\";\nimport { checkDate, onChangeDate, parseDate, leadWithZeroes } from \"./dates.js\";\nimport { escapeHTML } from \"./escape.js\";\nimport { registerWidget } from \"./form-widgets.js\";\nimport {\n allPass,\n always,\n applyTo,\n both,\n compose,\n chain,\n dec,\n dissoc,\n find,\n F,\n gt,\n head,\n has,\n ifElse,\n inc,\n join,\n map,\n mergeLeft,\n path,\n propEq,\n when,\n pathEq,\n reverse,\n pipe,\n lensPath,\n lensProp,\n over,\n append,\n assoc,\n infichain,\n toLower,\n omit,\n nth,\n prop,\n propOr,\n equals,\n tap\n} from \"./functional.js\";\n\nimport { _ } from \"./gettext.js\";\nimport { fromApiServer } from \"./location.js\";\nimport { forceInRange, Numerals } from \"./numerals.js\";\nimport { format, formatPlus } from \"./text-utils.js\";\nimport { urlutils } from \"./url-utils.js\";\n\nconst arbitraryCoreProp = propFinder(conf, \"arbitrary.core\");\n\nfunction disconnectValue({ input, value, filter = x => x }) {\n input.setAttribute(\"data-server-value\", value);\n $(input).on(\"change\", function () {\n try {\n var newVal = filter(input.value, input);\n } catch (e) {\n //\n } finally {\n if (typeof newVal !== \"undefined\") {\n input.setAttribute(\"data-server-value\", newVal);\n }\n }\n });\n}\n\nconst noAttribs = always({});\n\nconst omitName = dissoc(\"name\");\nconst omitRequired = dissoc(\"aria-required\");\n\nconst emptyTag = (tagName, attribs) => {\n const elt = document.createElement(tagName);\n setAttribs(elt, attribs);\n return elt;\n};\nconst valueInside = (control, attribs, tagName) => {\n const elt = emptyTag(tagName, attribs);\n if (tagName === \"textarea\") {\n elt.value = control.value;\n } else {\n elt.innerHTML =\n control.text || escapeHTML(control.value).replace(/\\r?\\n/g, \"
\");\n }\n return elt;\n};\n\nconst checkbox = {\n name: \"checkbox\",\n render: (control, group, attribs) => {\n return emptyTag(\"input\", attribs);\n },\n attribs: (attr, control, enabled) =>\n Object.assign(\n {},\n attr,\n {\n type: \"checkbox\"\n },\n //Interface already has got a value server-side, so not\n //sending it back poses no problem.\n control.value && { checked: true }\n ),\n setValue: (input, value, requestor) => {\n input.checked = value;\n },\n layout: \"inline\"\n};\n\nregisterWidget(checkbox);\n\nconst picture = {\n name: \"picture\",\n render: (control, group, attribs) => emptyTag(\"img\", attribs),\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n alt: control.alttext,\n src: fromApiServer(control.filename)\n })\n};\n\nregisterWidget(picture);\n\nexport const edit = {\n name: \"edit\",\n couldWrap: true,\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n type: \"text\",\n autocomplete: \"off\",\n value: control.value\n }),\n render: (control, group, attribs) => emptyTag(\"input\", attribs),\n setValue: (input, value) => {\n input.value = value;\n },\n layout: \"aside\"\n};\n\nregisterWidget(edit);\n\nconst memo = {\n name: \"memo\",\n attribs: (attr, control, enabled) => {\n // const attribs = [\"name\", control.name];\n // if (control.width && control.height && control[\"font-size\"]) {\n // attribs.cols= parseInt(control.width / (control[\"font-size\"] * 0.75))\n // attribs.rows = parseInt(control.height / (control[\"font-size\"] * 1.5))\n // }\n // return [...attr, ...attribs];\n return attr;\n },\n render: (control, group, attribs) => {\n return valueInside(control, attribs, \"textarea\");\n },\n setValue: edit.setValue,\n layout: \"below\"\n};\n\nregisterWidget(memo);\n\nconst label = {\n name: \"label\",\n fixup: control => {\n control.value = (control.value || \"\").replace(/\\r\\n/g, \"\\n\"); // Normalize Windows-style (typewriter) newlines\n return control;\n },\n attribs: (attr, control, enabled) =>\n Object.assign(\n omitName(attr),\n enabled && control.isFor && { for: control.isFor },\n {\n class: `${\n control.isfor || has(\"colname\", control) ? \"bb-label\" : \"bb-text\"\n } bb-md-able`\n }\n ),\n render: (control, group, attribs) => {\n return valueInside(\n control,\n attribs,\n control._subtype === \"heading\"\n ? \"h\" + Math.min(6, control._level || 2)\n : control.isFor\n ? \"label\"\n : \"div\"\n );\n },\n setValue: (input, value) => {\n input.innerHTML = escapeHTML(value).replace(/\\r?\\n/g, \"
\");\n }\n};\n\nregisterWidget(label);\n\nexport const linklabel = {\n name: \"linklabel\",\n fixup: control => {\n control.value = control.value.trim();\n // Fix 'empty' or JS-links\n if (urlutils.isEmptyish(control.url) || urlutils.isJS(control.url)) {\n if (urlutils.isJS(control.url)) control.value = urlutils.JSAlertMessage;\n delete control.url;\n }\n return control;\n },\n attribs: (attr, control, enabled) => {\n let linkClassName = \"\";\n\n if (control.url) {\n attr[\"href\"] = fromApiServer(control.url);\n if (control.url.match(/mailto:/)) {\n attr[\"type\"] = \"email\";\n linkClassName = \"mail\";\n } else {\n linkClassName = \"bb-external\";\n if (control.isreport) linkClassName += \" report\";\n var mimetype = control.mimetype || urlutils.mimetype(control.url);\n if (mimetype) {\n attr[\"type\"] = mimetype.mimetype;\n linkClassName += \" \" + mimetype.ext;\n }\n }\n if (control.url[0] !== \"#\") attr[\"target\"] = \"_blank\";\n }\n linkClassName += \" bb-text\";\n attr[\"class\"] = linkClassName;\n return omitName(attr);\n },\n render: (control, group, attribs) => {\n return valueInside(control, attribs, \"a\");\n },\n setValue: (input, value) => {\n input.innerHTML = escapeHTML(value).replace(/\\r?\\n/g, \"
\");\n },\n layout: \"below\"\n};\n\nregisterWidget(linklabel);\n\nconst listlabel = {\n name: \"listlabel\",\n attribs: compose(\n omitName,\n omitRequired,\n mergeLeft({\n type: \"listlabel\",\n class: \"listlabel\"\n })\n ),\n item: item =>\n `
  • ${escapeHTML(item).replace(/\\\\n/g, \"
    \")}
  • `,\n render: (control, group, attribs) => {\n const value = control.value;\n const items = compose(join(\"\"), map(listlabel.item))(value);\n const widget = `
      \n${items}
    `;\n return $(widget);\n },\n setValue: (input, value, requestor) => {\n input.innerHTML = compose(join(\"\"), map(listlabel.item))(value);\n $.fn.showdown && $(input).find(\"li\").showdown();\n },\n layout: \"below\"\n};\n\nregisterWidget(listlabel);\n\nconst optionbox = {\n render: (control, group, attribs) => {\n const value = control.value;\n const widget = $(``);\n // Set head of drop-down list to an empty item.\n // If value[0].value is already the empty string, the server\n // has already done this for us (pre 4.7 or dataset-based\n // drop-down).\n // If one of the options has already been selected, do *not*\n // add this empty option.\n // @todo: remove this code once server release 4.7 or higher\n // runs everywhere.\n if (\n control.controltype === \"combobox\" &&\n value.length > 0 &&\n value[0].value !== \"\" &&\n !value.some(function (value) {\n return value.selected === true;\n })\n ) {\n value.unshift({ option: \"\", value: \"\" });\n }\n optionbox.setValue(widget.get(0), value);\n return widget;\n },\n setValue: (input, value) => {\n const options = [...input.querySelectorAll(\"option\")];\n const len = options.length;\n const newLen = value.length;\n const newOptions = input.append ? [] : null;\n let selectedValue = \"\";\n for (let i = 0; i < newLen; i++) {\n const option = value[i];\n const optionElt = options[i] || document.createElement(\"option\");\n optionElt.value = option.value;\n optionElt.textContent =\n value[i].value === \"\" ? _(\"Choose...\") : option.option;\n optionElt.classList.toggle(\"bb-valueless\", option.value === \"\");\n if (option.selected) {\n selectedValue = option.value;\n }\n if (i > len - 1) {\n if (newOptions) {\n newOptions.push(optionElt);\n } else {\n input.appendChild(optionElt);\n }\n }\n }\n if (newOptions.length) {\n input.append(...newOptions);\n } else if (newLen < len) {\n [...input.querySelectorAll(`option:nth-child(1n+${newLen + 1})`)].forEach(\n input => input.parentNode.removeChild(input)\n );\n }\n input.value = selectedValue;\n }\n};\n\nconst combobox = {\n name: \"combobox\",\n // fixup: control => {\n // if (control.freetext === true) {\n // control.controltype = \"edit\";\n // control.datalist = control.value.map(({ option }) => option);\n // control.placeholder = _(\"Choose or type...\");\n // let val = control.value.find(v => v.selected);\n // if (val) control.value = val.option;\n // else control.value = \"\";\n // }\n // return control;\n // },\n fixup: control => {\n if (control.freetext === true) {\n control.controltype = \"freebox\";\n\n // control.datalist = control.value.map(({ option }) => option);\n // control.placeholder = _(\"Choose or type...\");\n // let val = control.value.find(v => v.selected);\n // if (val) control.value = val.option;\n // else control.value = \"\";\n }\n return control;\n },\n couldWrap: true,\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n name: control.name,\n size: 1\n }),\n render: optionbox.render,\n setValue: optionbox.setValue,\n layout: \"below\"\n};\n\nregisterWidget(combobox);\n\nconst listbox = {\n name: \"listbox\",\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n name: control.name,\n size: control.value.length\n }),\n render: optionbox.render,\n setValue: optionbox.setValue,\n layout: \"below\"\n};\n\nregisterWidget(listbox);\n\nconst multilist = {\n name: \"multilist\",\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n name: control.name,\n size: control.value.length,\n multiple: \"multiple\"\n }),\n render: optionbox.render,\n setValue: (input, value, requestor) => {\n const selected = value.find(option => option.selected === true);\n input.value = selected.value;\n },\n layout: \"below\"\n};\n\nregisterWidget(multilist);\n\nconst optionlist = {\n render: (control, group, attribs) => {\n const value = control.value;\n if (value.length === 0) return null;\n const widget = $(`
      `);\n for (let i = 0; i < value.length; i++) {\n let id = control.id + \"-\" + i;\n var option = $(`\n
    • \n \n
    • \n `);\n widget.append(option);\n widget.find(\"input:last\").val(value[i].value);\n }\n return widget;\n },\n onrequired: (input, required) => {\n // $(input).find(\"input\").attr(\"aria-required\", required);\n },\n onreadonly: (list, readonly) => {\n list.classList.toggle(\"bb-disabled\", readonly);\n [...list.querySelectorAll(\"input\")].forEach(input => {\n input.disabled = readonly;\n });\n }\n};\n\nconst checklist = {\n name: \"checkmultilist\",\n attribs: compose(omitRequired, assoc(\"class\", \"checklist bb-option-list\")),\n render: optionlist.render,\n onrequired: optionlist.onrequired,\n onreadonly: optionlist.onreadonly,\n allowUpdatingSelf: true,\n setValue: (input, value, requestor) => {\n const control = $(input).data(\"control\");\n value.forEach(({ selected }, index) => {\n const option = input.querySelector(`[id=\"${control.id}-${index}\"]`);\n if (!option) return;\n if (option.checked !== selected) option.checked = selected;\n $(option).trigger(\"programmatically-changed\");\n });\n },\n layout: \"below\"\n};\n\nregisterWidget(checklist);\n\nconst radiolist = {\n name: \"radio\",\n attribs: compose(omitRequired, assoc(\"class\", \"radiogroup bb-option-list\")),\n render: optionlist.render,\n allowUpdatingSelf: true,\n onrequired: optionlist.onrequired,\n onreadonly: optionlist.onreadonly,\n setValue: (input, value, requestor) => {\n const control = $(input).data(\"control\");\n const index = value.findIndex(option => option.selected === true);\n if (index === -1) {\n input.querySelectorAll(`[id|=\"${control.id}\"]`).forEach(i => {\n i.checked = false;\n i.closest(\".bb-option\").classList.remove(\"checked\");\n });\n return;\n }\n const option = input.querySelector(`[id=\"${control.id}-${index}\"]`);\n option.checked = true;\n $(option).trigger(\"programmatically-changed\");\n },\n layout: \"below\"\n};\n\nregisterWidget(radiolist);\n\nconst datepicker = {\n name: \"datetimepicker\",\n couldWrap: true,\n fixup: control => {\n control.placeholder = _(\"dateplaceholder\");\n return control;\n },\n serverToWidgetValue: value =>\n $.datepicker.formatDate(\n $.datepicker._defaults.dateFormat,\n parseDate(value)\n ),\n widgetToServerValue: input =>\n leadWithZeroes(\n $.datepicker.formatDate(\"yy-mm-dd\", $(input).datepicker(\"getDate\"))\n ),\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n value: datepicker.serverToWidgetValue(control.value),\n autocomplete: \"off\",\n placeholder: _(\"dateplaceholder\", _(\"select date\")),\n type: \"text\"\n }),\n render: (control, group, attribs) => {\n return emptyTag(\"input\", attribs);\n },\n afterRender: (widget, control) => {\n if (!control.originalreadonly || control.dynamic) {\n widget.datepicker();\n observeDatepickers();\n\n control._elt.addEventListener(\"change\", onChangeDate);\n control._elt.addEventListener(\n \"keydown\",\n when(propEq(\"key\", \"Enter\"), () => {\n const ev = new InputEvent(\"change\", {\n bubbles: true,\n cancelable: true,\n view: window\n });\n control._elt.dispatchEvent(ev);\n })\n );\n\n disconnectValue({\n input: widget.get(0),\n filter: function (value, input) {\n return datepicker.widgetToServerValue(input);\n },\n value: control.value\n });\n widget.datepicker(\"widget\").hide();\n }\n },\n setValue: (input, value) => {\n input.setAttribute(\"data-server-value\", value);\n input.value = datepicker.serverToWidgetValue(value);\n },\n validate: (control, value) => {\n if (!control.notnull && (value || \"\").trim() === \"\") {\n // Side effect\n $($(control.$elt).datepicker(\"option\", \"altField\")).attr(\"value\", \"\");\n }\n return checkDate(control, value);\n },\n layout: \"aside\"\n};\n\nregisterWidget(datepicker);\n\nconst numedit = {\n name: \"numedit\",\n couldWrap: true,\n getMaxChars: control => {\n var max, min;\n if (has(\"maximum\", control))\n max = Numerals.formatter(\n control.maximum.toFixed(control.precision)\n ).length;\n if (has(\"minimum\", control))\n min = Numerals.formatter(\n control.minimum.toFixed(control.precision)\n ).length;\n if (typeof min === \"undefined\") return max;\n if (typeof max === \"undefined\") return undefined;\n return Math.max(max, min);\n },\n serverToWidgetValue: value => Numerals.formatter(value),\n // widgetToServerValue: input => input.value,\n attribs: (attr, control, enabled) => {\n const maxchars = numedit.getMaxChars(control);\n return Object.assign(\n {},\n attr,\n {\n type: \"text\",\n class: \"numedit\",\n autocomplete: \"off\",\n name: control.name, // Prevent bug (in JSON grid) (see mantis#5416)\n // value = control.value = parseFloat(control.value || 0);\n value: parseFloat(control.value || 0).toFixed(control.precision)\n },\n // maxchars -- not to be confused with maxlength, which used\n // for validation. This is just to aid layout decisions.\n maxchars && { \"data-maxchars\": maxchars }\n );\n },\n render: (control, group, attribs) => emptyTag(\"input\", attribs),\n afterRender: (widget, control) => {\n widget.data(\"anchor\", widget.spinner(control));\n },\n setValue: (input, value) => {\n const control = $.data(input, \"control\");\n input.value = numedit.serverToWidgetValue(\n parseFloat(value || 0).toFixed(control.precision)\n );\n },\n validate: function (control, value) {\n if (control.controltype !== \"numedit\")\n throw \"_validateNumber called on something not a number\";\n const metadata = control.metadata || {};\n var val;\n try {\n val = Numerals.parser(value);\n } catch (e) {\n throw new Error(\n format(\n metadata.errnuminvalid || _(\"Invalid number\"),\n compose(assoc(\"value\", value), numedit.quotable)(control)\n )\n );\n }\n control.hasMax = has(\"maximum\", control);\n control.hasMin = has(\"minimum\", control);\n try {\n if (typeof val !== \"number\")\n throw metadata.errnuminvalid || _(\"Invalid number\");\n if (control.hasMax && control.hasMin) {\n if (val < control.minimum || val > control.maximum) {\n throw (\n metadata.errnumnotinrange ||\n _(\"Value has to lie between {minimum} and {maximum}\")\n );\n }\n } else if (control.hasMax) {\n if (val > control.maximum) {\n if (control.maximum === 0)\n throw (\n metadata.errnumnotnegativeorzero ||\n _(\"Negative number or zero expected\")\n );\n else if (control.maximum === -1)\n throw metadata.errnumnotnegative || _(\"Negative number expected\");\n else\n throw (\n metadata.errnumabovemaximum ||\n _(\"Value has to lie below {maximum}\")\n );\n }\n } else if (control.hasMin) {\n if (val < control.minimum) {\n if (control.minimum === 0)\n throw (\n metadata.errnumnotpositiveorzero ||\n _(\"Positive number or zero expected\")\n );\n else if (control.minimum === 1)\n throw metadata.errnumnotpositive || _(\"Positive number expected\");\n else\n throw (\n metadata.errnumbelowminimum ||\n _(\"Value has to lie above {minimum}\")\n );\n }\n }\n } catch (e) {\n throw formatPlus(\n e,\n compose(assoc(\"value\", value), numedit.quotable)(control)\n );\n }\n\n return true;\n },\n quotable: compose(\n when(has(\"minimum\"), over(lensProp(\"minimum\"), Numerals.formatter)),\n when(has(\"maximum\"), over(lensProp(\"maximum\"), Numerals.formatter)),\n when(\n has(\"minimum\"),\n chain(assoc(\"minimum-1\"), compose(dec, prop(\"minimum\")))\n ),\n when(\n has(\"maximum\"),\n chain(assoc(\"maximum+1\"), compose(inc, prop(\"maximum\")))\n ),\n quotable\n ),\n layout: \"aside\"\n};\n\nregisterWidget(numedit);\n\nconst freebox = {\n name: \"freebox\",\n couldWrap: true,\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n \"type\": \"text\",\n \"data-type\": control.controltype,\n \"list\": `${control.id}-list`,\n \"placeholder\": _(\"Choose...\"),\n \"value\": freebox._realValue(control.value)\n }),\n _realValue: compose(propOr(\"\", \"option\"), find(prop(\"selected\"))),\n setValue: function (input, value, requestor) {\n input.value = freebox._realValue(value);\n },\n render: (control, group, attribs) => emptyTag(\"input\", attribs),\n afterRender: (widget, control) => {\n control._elt.insertAdjacentHTML(\n \"afterEnd\",\n `\n${control.value\n .map(({ option }) => `\n`\n );\n },\n layout: \"aside\"\n};\n\nregisterWidget(freebox);\n\nconst _radioButtonWidget = {\n name: \"radiobutton\",\n tagName: \"input\",\n attribs: (attr, control, enabled) =>\n Object.assign(\n {},\n attr,\n { type: \"radio\", value: control.value },\n control.selected && { checked: \"checked\" }\n ),\n render: $.noop\n};\n\nregisterWidget(_radioButtonWidget);\n\nconst _rangeWidget = {\n name: \"range\",\n tagName: \"input\",\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n type: \"range\",\n value: control.value\n }),\n render: $.noop,\n layout: \"aside\"\n};\n\nregisterWidget(_rangeWidget);\n\nconst _buttonWidget = {\n name: \"button\",\n attribs: (attr, control, enabled) =>\n Object.assign(\n {},\n attr,\n { type: \"submit\", value: control.value },\n control.label && { \"aria-label\": control.label }\n ),\n render: (control, group, attribs) => valueInside(control, attribs, \"button\"),\n setValue: (elt, value, requestor, Updates) => {\n if (has(\"text\", Updates)) elt.innerHTML = Updates.text.to;\n if (has(\"value\", Updates)) elt.value = Updates.value.to;\n elt.classList.toggle(\"bb-record-del\", Updates.value.to.endsWith(\"-\"));\n elt.classList.toggle(\"bb-record-add\", Updates.value.to.endsWith(\"+\"));\n }\n};\n\nregisterWidget(_buttonWidget);\n\nconst _legendWidget = {\n name: \"legend\",\n tagName: \"legend\",\n attribs: noAttribs,\n\n render: function (control, widget, group) {\n var level;\n if (!conf.a11y.strictlegends && control._subtype === \"heading\") {\n level = Math.min(6, control._level || 2);\n // Trim value and control.value itself as well.\n widget.html(\n \"' +\n escapeHTML(control.value.trim()) +\n \"\"\n );\n } else {\n widget.text(control.value);\n widget.addClass(\"bb-md-able\");\n }\n }\n};\n\nregisterWidget(_legendWidget);\n\nconst _captionWidget = {\n name: \"caption\",\n tagName: \"caption\",\n attribs: noAttribs,\n render: function (control, widget, group) {\n widget.text(control.value.trim());\n widget.addClass(\"bb-md-able\");\n }\n};\n\nregisterWidget(_captionWidget);\n\nconst _alertWidget = {\n name: \"alert\",\n tagName: \"p\",\n attribs: noAttribs,\n render: function (control, widget, group) {\n widget.text(control.value);\n // Yup, this widget exists mainly for this\n // side-effect -- setting role=\"alert\",\n // aria-live=\"assertive\" does not do the\n // trick - and forcing focus looks ugly too.\n A11y.log(control.value);\n }\n};\n\nregisterWidget(_alertWidget);\n\nexport const grid = {\n name: \"grid\",\n attribs: compose(omitRequired, omitName),\n item: item =>\n `
    • ${escapeHTML(item).replace(/\\\\n/g, \"
      \")}
    • `,\n renderable: control => {\n const copy = assoc(\n \"addPlacement\",\n !control.addallowed\n ? \"none\"\n : control.value.length === 0 ||\n arbitraryCoreProp(\"putAddRowButtonBelowGrid\")\n ? \"below\"\n : \"insert\",\n control\n );\n return pipe(\n when(\n propEq(\"addPlacement\", \"insert\"),\n compose(\n over(\n lensProp(\"columns\"),\n append({\n controltype: \"button\",\n text: `${\n (control.metadata && control.metadata.insertbuttontext) ||\n _(\"insert row\")\n }+`,\n name: \"update\",\n className: \"bb-record-add\",\n readonly: false,\n label: _(\"insert row\")\n })\n ),\n over(\n lensProp(\"value\"),\n map((row, i) =>\n append(\n {\n value:\n control.name +\n \".\" +\n ((control.offset || 0) + i + 1) +\n \".\" +\n \"+\"\n },\n row\n )\n )\n )\n )\n ),\n when(\n propEq(\"deleteallowed\", true),\n compose(\n over(\n lensProp(\"columns\"),\n append({\n controltype: \"button\",\n name: \"update\",\n className: \"bb-record-del\",\n readonly:\n !control.notnull ||\n control.value.length > 1 ||\n (control.showcolumns && control.addallowed)\n ? false\n : true,\n text: `${\n (control.metadata && control.metadata.deletebuttontext) ||\n _(\"delete row\")\n }-`\n })\n ),\n over(\n lensProp(\"value\"),\n map((row, i) =>\n append(\n {\n value:\n control.name + \".\" + ((control.offset || 0) + i) + \".\" + \"-\"\n },\n row\n )\n )\n )\n )\n ),\n infichain([\n prop(\"columns\"),\n (columns, grid) => {\n return over(\n lensProp(\"value\"),\n map((row, row_i) =>\n map((cell, cell_i) =>\n compose(\n when(\n both(prop(\"colname\"), isQuestion),\n assoc(\"aria\", { labelledby: `${control.id}-col-${cell_i}` })\n ),\n when(prop(\"colname\"), cell =>\n assoc(\"meta\", { label: cell.colname }, cell)\n ),\n cell =>\n Object.assign(\n {},\n columns[cell_i],\n {\n id:\n control.id +\n \"-\" +\n ((control.offset || 0) + row_i) +\n \"-\" +\n cell_i\n },\n cell\n ),\n assoc(\"_row_index\", (control.offset || 0) + row_i),\n assoc(\"_cell_index\", cell_i)\n )(cell)\n )(row)\n ),\n grid\n );\n }\n ]),\n over(\n lensProp(\"columns\"),\n map((col, col_i) => assoc(\"id\", `${control.id}-col-${col_i}`, col))\n ),\n over(\n lensProp(\"value\"),\n map(\n map((cell, cell_i, cells) =>\n compose(\n assoc(\"_tag\", grid.cellTag(cell, cells)),\n when(\n allPass([\n isLabel,\n pipe(prop(\"_cell_index\"), gt, applyTo(0)),\n () => isOption(cells[cell_i - 1])\n ]),\n cell => assoc(\"isFor\", cells[cell_i - 1].id, cell)\n ),\n when(\n allPass([\n isOption,\n propEq(\"_cell_index\", 0),\n () => isLabel(cells[cell_i + 1])\n ]),\n cell =>\n over(\n lensPath([\"aria\", \"labelledby\"]),\n col_id => `${cells[cell_i + 1].id} ${col_id || \"\"}`,\n cell\n )\n )\n )(cell)\n )\n )\n )\n )(copy);\n },\n cellTag: (cell, row) => {\n return cell.value === null\n ? null\n : cell._rowspan && cell._cell_index === 0 && row.length > 1\n ? \"th\"\n : \"td\";\n },\n columnheader: column => {\n const header = document.createElement(\"th\");\n header.classList.add(\"bb-md-able\");\n header.setAttribute(\"data-rowtype\", column.controltype);\n header.setAttribute(\"data-rowreadonly\", Boolean(column.readonly));\n if (has(\"colname\", column)) {\n header.innerText = column.colname;\n header.id = column.id;\n }\n return header;\n },\n colheaderids: ifElse(\n prop(\"showcolumns\"),\n compose(\n map(ifElse(propEq(\"controltype\", \"button\"), F, prop(\"id\"))),\n prop(\"columns\")\n ),\n compose(map(F), prop(\"columns\"))\n ),\n rowheaderid: (rows, i) => {\n const rows_up_to_here = rows.slice(0, i + 1);\n return compose(\n prop(\"value\"),\n map(compose(id => `${id}--cell`, prop(\"id\"), head)),\n Maybe.of,\n find(pathEq([0, \"_tag\"], \"th\")),\n reverse\n )(rows_up_to_here);\n },\n cell: cell => {\n const tag = cell._tag;\n const e_cell =\n tag === null\n ? document.createComment(\"empty cell\")\n : document.createElement(tag);\n if (tag === \"th\") {\n e_cell.id = `${cell.id}--cell`;\n }\n return e_cell;\n },\n cellSetAttributes: (e_cell, cell) => {\n if (cell._tag === null) return e_cell;\n if (cell._tag === \"th\") e_cell.setAttribute(\"scope\", \"row\");\n if (cell._rowspan > 1) e_cell.setAttribute(\"rowspan\", cell._rowspan);\n else e_cell.removeAttribute(\"rowspan\");\n if (cell.headers) e_cell.setAttribute(\"headers\", cell.headers);\n else e_cell.removeAttribute(\"headers\");\n if (typeof cell.colname !== \"undefined\")\n e_cell.setAttribute(\"data-column\", cell.colname);\n else e_cell.removeAttribute(\"data-column\");\n e_cell.classList.add(\"nth-child-\" + (cell._cell_index + 1));\n if (cell.value === \"\")\n e_cell.classList.toggle(\n \"empty\",\n cell.controltype === \"label\" && cell.value === \"\"\n ); // IE8 does not support :empty\n\n e_cell.classList.add(\"bb-celltype-\" + cell.controltype);\n return e_cell;\n },\n render: (control, group, attribs) => {\n const widget = $(`
      `);\n control = grid.renderable(control);\n if (control.value.length === 0) {\n widget.addClass(\"bb-empty\");\n }\n if (control.caption) {\n wControl(\n control.caption,\n group,\n widget //append hereto\n );\n }\n if (control.showcolumns) {\n // widget.append($(\"\".repeat(control.columns.length)));\n const thead = document.createElement(\"thead\");\n const tr = document.createElement(\"tr\");\n thead.append(tr);\n widget.append(thead);\n if (control.value.length > 0)\n tr.append(...control.columns.map(grid.columnheader));\n }\n const e_body = document.createElement(\"tbody\");\n widget.append(e_body);\n const colheaders = grid.colheaderids(control);\n control.value.forEach(function (row, i, rows) {\n // NOTE: control.offset is set by global plugin split-grid.\n // const i = idx + (control.offset || 0);\n const last_spanning_cell_id = grid.rowheaderid(rows, i);\n const e_row = document.createElement(\"tr\");\n if (row.length === 0) return;\n e_row.classList.toggle(\"bb-newscope\", row[0]._tag === \"th\");\n e_body.appendChild(e_row);\n row.forEach(function (cell, icol) {\n const rowheader = cell._tag === \"td\" ? last_spanning_cell_id : false;\n const headers = [rowheader, colheaders[icol]].filter(Boolean).join(\" \");\n const cellWithHeaders = {\n ...cell,\n headers\n };\n if (cell.value !== null) {\n const e_cell = grid.cell(cell);\n grid.cellSetAttributes(e_cell, cellWithHeaders);\n e_row.appendChild(e_cell);\n wControl(\n cell,\n control._group,\n e_cell //append hereto\n );\n } else {\n e_row.appendChild(document.createComment(\"empty cell\"));\n }\n });\n });\n\n return $(widget);\n },\n afterRender: (widget, control) => {\n const addPlacement = !control.addallowed\n ? \"none\"\n : control.value.length === 0 ||\n arbitraryCoreProp(\"putAddRowButtonBelowGrid\")\n ? \"below\"\n : \"insert\";\n if (addPlacement === \"below\") {\n const gridAddButton = ``;\n widget.get(0).insertAdjacentHTML(\"afterEnd\", gridAddButton);\n // $(widget.in.append(widget, gridAddButton);\n }\n },\n setValue: (e_grid, value, requestor, updates) => {\n // if (grid.contains(requestor))\n const control = $.data(e_grid, \"control\");\n const old = compose(\n grid.renderable,\n assoc(\"value\", updates[\"value\"].from),\n assoc(\"columns\", updates[\"columns\"].from)\n )(control);\n\n const now = grid.renderable(control);\n // Remove spurious row\n [\n ...e_grid.querySelectorAll(\n `tbody tr:nth-child(1n + ${now.value.length + 1})`\n )\n ].forEach(row => row.remove());\n // Remove spurious 'cells' (also empty cell comments)\n [...e_grid.querySelectorAll(`tbody tr`)].forEach(row => {\n let cell;\n while (((cell = row.childNodes[now.columns.length]), cell)) {\n cell.remove();\n }\n });\n\n if (\n !equals(old.columns, now.columns) ||\n (old.value.length === 0 && now.value.length !== 0) ||\n (old.value.length !== 0 && now.value.length === 0)\n ) {\n // Remove ALL column headers (re-created)\n [...e_grid.querySelectorAll(`thead tr th`)].forEach(colheader =>\n colheader.remove()\n );\n\n if (now.showcolumns && now.value.length > 0)\n now.columns // .slice(old.columns.length)\n .forEach(function (column) {\n e_grid.querySelector(\"thead tr\").append(grid.columnheader(column));\n });\n }\n\n const colheaders = grid.colheaderids(now);\n now.value.forEach((row, irow, rows) => {\n let e_row = e_grid.querySelector(`tbody tr:nth-child(${irow + 1})`);\n if (e_row === null) {\n e_row = document.createElement(\"tr\");\n e_grid.tBodies[0].append(e_row);\n }\n e_row.classList.toggle(\"bb-newscope\", row[0]._tag === \"th\");\n const last_spanning_cell_id = grid.rowheaderid(rows, irow);\n row.forEach((cell, icol) => {\n const cellInput = e_grid.querySelector(`[id=\"${cell.id}\"]`);\n const oldcell = old.value[irow] && old.value[irow][icol];\n const rowheader = cell._tag === \"td\" ? last_spanning_cell_id : false;\n const headers = [rowheader, colheaders[icol]].filter(Boolean).join(\" \");\n const cellWithHeaders = {\n ...cell,\n headers\n };\n const spot = e_row.childNodes[icol];\n if (!spot) {\n // NEW => Add at end\n const e_cell = grid.cell(cell);\n grid.cellSetAttributes(e_cell, cellWithHeaders);\n e_row.appendChild(e_cell);\n wControl(cell, control._group, e_cell);\n return;\n }\n if (\n cell.controltype !== oldcell.controltype ||\n cell._tag !== oldcell._tag\n ) {\n // REPLACE\n let e_cell;\n if (cell._tag !== oldcell._tag) {\n e_cell = grid.cell(cell);\n spot.replaceWith(e_cell);\n } else {\n // Re-use old cell\n e_cell = spot;\n if (cell._tag !== null) {\n e_cell.classList.remove(\"bb-celltype-\" + oldcell.controltype);\n e_cell.innerHTML = \"\";\n }\n }\n if (cell._tag !== null) {\n grid.cellSetAttributes(e_cell, cellWithHeaders);\n wControl(cell, control._group, e_cell);\n }\n return;\n }\n if (cell._tag === null) return;\n // UPDATE\n grid.cellSetAttributes(spot, cellWithHeaders);\n const cellControl = $.data(cellInput, \"control\");\n if (!cellControl) return;\n if (cell.value !== cellControl.value) {\n $(cellInput).updateControl(\n [\n Object.assign({}, cellControl, {\n value: cell.value,\n text: cell.text\n })\n ],\n requestor\n );\n }\n });\n });\n },\n onrequired: (grid, required) => {},\n onreadonly: (grid, readonly) => {\n grid.classList.toggle(\"bb-disabled\", readonly);\n [...grid.querySelectorAll(\"input, textarea, button\")].forEach(input => {\n input.disabled =\n readonly || compose(ifElse(Boolean, isReadOnly, F), getControl)(input);\n });\n },\n layout: \"below\"\n};\n\nregisterWidget(grid);\n\n$.fn.extend({\n /**\n * Widgetize as numedit\n */\n spinner: function (control) {\n control = control || {};\n var _interval = 250,\n interval = _interval,\n timer = null,\n me = this,\n val = Numerals.formatter(me.val()),\n $this = $(this),\n $anchor = $this;\n\n function mustAddButtons() {\n return !(arbitraryCoreProp(\"skipNumButtons\") === true);\n }\n\n function addButtons($input, control) {\n var buttontemplate =\n '
      ' +\n '
      ' +\n '
      ' +\n \"
      \";\n $input\n .wrapAll('
      ')\n .after(buttontemplate);\n $input.parents(\".bb-num\").data(\"control\", control);\n $input\n .next()\n .find(\".bb-num-down, .bb-num-up\")\n .on(\"click\", adjustOnce)\n .on(\"mousedown\", keepAdjusting)\n .on(\"mouseup mouseout\", stopAdjusting);\n\n return $input.parent();\n }\n\n function adjust(diff) {\n var parsed, val;\n try {\n parsed = Numerals.parser(me.val());\n } catch (err) {\n $this.validate(); // Let validate() handle\n // showing of errors\n }\n if (typeof parsed === \"undefined\") return;\n // A diff of 0 is just used for the sake of formatting - so do\n // not force the number to be in range.\n val = (\n diff === 0\n ? parseFloat(parsed - diff)\n : forceInRange(\n parseFloat(parsed - diff),\n control.minimum,\n control.maximum\n )\n ).toFixed(control.precision || 0);\n\n me.val(Numerals.formatter(val));\n\n //if (val == \"NaN\") val = \"\";\n $this.validate(); // Validate just for the sake\n // of getting away the error\n // message\n if (me.data(\"orgval\") !== me.val()) me.trigger(\"change\");\n $this.data(\"orgval\", $this.val());\n }\n\n $this\n .data(\"orgval\", val) // Remember the original value\n .val(val)\n .on(\"keydown\", function (e) {\n var key = e.keyCode;\n if (key === 38 || key === 40) {\n var diff = key === 38 ? -1 : 1;\n adjust(diff);\n }\n if (key === 13) {\n adjust(0);\n }\n })\n .on(\"click\", function () {\n let parsed;\n try {\n parsed = Numerals.parser(me.val());\n } catch (err) {\n //\n } finally {\n if (parsed === 0) $this.val(\"\");\n }\n })\n .on(\"blur\", function () {\n let orgval = $this.val();\n adjust(0);\n if ($this.val() !== orgval) {\n $this.addClass(\"bb-programmatically-changed\");\n window.setTimeout(function () {\n $this.removeClass(\"bb-programmatically-changed\");\n }, 1000);\n }\n // Set orgval for future changes.\n $this.data(\"orgval\", $this.val());\n });\n\n function keepAdjusting() {\n var thing = $(this);\n var diff = thing.hasClass(\"bb-num-down\") ? 1 : -1;\n timer = window.setTimeout(function () {\n adjust(diff);\n if (interval > 20) interval = interval - 10;\n thing.trigger(\"mousedown\");\n }, interval);\n }\n\n function adjustOnce() {\n var diff = $(this).hasClass(\"bb-num-down\") ? 1 : -1;\n adjust(diff);\n }\n\n function stopAdjusting() {\n window.clearTimeout(timer);\n interval = _interval;\n return false; // prevent text selection\n }\n\n if (mustAddButtons()) $anchor = addButtons($this, control);\n\n disconnectValue({\n input: $this.get(0),\n filter: Numerals.parser,\n value: control.value\n });\n $this.on(\"change\", function (_event, data) {\n if (!prop(\"programmatically\", data)) $this.validate();\n });\n return $anchor;\n }\n});\n","import { compose, find, propEq, prop, map, filter, when } from \"./functional\";\n\nexport const collectAttributes = (prefix, elt) =>\n compose(\n Object.fromEntries,\n map(({ name, value }) => [name.substr(prefix.length), value]),\n filter(({ name, value }) => name.startsWith(prefix)),\n x => [...x]\n )(elt.attributes);\n\nexport const currentGroup = compose(\n when(Boolean, find(propEq(\"current\", true))),\n prop(\"groups\")\n);\n","import { escapeHTML } from \"./escape.js\";\nimport {\n choose,\n compose,\n equals,\n findIndex,\n T,\n identity,\n slice\n} from \"$json/lib/functional.js\";\n\nconst times = (string, integer) => string.repeat(integer);\n\n/*** JUMPLIST BEGIN ***/\nfunction hasselectedbelowlevel(jumplist, level) {\n if (jumplist.length == 0) return false;\n if (jumplist[0].level <= level) return false;\n if (jumplist[0].status == \"selected\") return true;\n return hasselectedbelowlevel(jumplist.slice(1), jumplist[0].level);\n}\nfunction hasselectedbelow(jumplist) {\n return hasselectedbelowlevel(jumplist.slice(1), jumplist[0].level);\n}\n\nconst ariaCurrentAttrib = jumplist =>\n jumplist.status === \"selected\" ? ` aria-current=\"step\"` : \"\";\n\nconst chapterDataAttrib = jumplist =>\n !jumplist.ischapter ? \"\" : `data-chapterstatus=${jumplist.chapterstatus}`;\n\nfunction bakeInnerList(jumplist, level = 0, containsselection) {\n if (!(jumplist instanceof Array)) {\n return (\n (jumplist.level > level\n ? times(\n `<${Jumplist.type}>
    • `,\n jumplist.level - level\n )\n : jumplist.level < level\n ? times(`
    • `, level - jumplist.level) +\n `
    • `\n : `
    • `) +\n `${escapeHTML(\n jumplist.screentitle.trim()\n )}`\n );\n }\n if (jumplist.length == 0)\n return \"
    • \" + times(``, level);\n return (\n bakeInnerList(\n jumplist[0],\n level,\n hasselectedbelow(jumplist, jumplist[0].level)\n ) + bakeInnerList(jumplist.slice(1), jumplist[0].level)\n );\n}\nexport const bakeAsListitems = jumplist => {\n let html = bakeInnerList(jumplist);\n // Odd case of indentation sans parent:\n if ([\"u\", \"o\"].includes(html.charAt(1)))\n return '
    • ' + html + \"
    • \";\n return html;\n};\nfunction bakeAsDropDown(jumplist, level = 0, containsselection) {\n // Implemented recursively so we can make the 'chapter' selected\n if (!(jumplist instanceof Array)) {\n return (\n \"\" +\n times(\" \", level * 2) +\n escapeHTML(jumplist.screentitle.trim()) +\n \"\"\n );\n }\n if (jumplist.length == 0) return \"\";\n return (\n bakeAsDropDown(\n jumplist[0],\n level,\n hasselectedbelow(jumplist, jumplist[0].level)\n ) + bakeAsDropDown(jumplist.slice(1), jumplist[0].level)\n );\n}\n\nconst findCurrentIndex = compose(\n i => (i === -1 ? Infinity : i),\n findIndex(({ status }) => status === \"future\")\n);\n\nexport var Jumplist = new (function () {\n var _jumplist = []; //Save last jumplist\n this.type = \"ul\";\n this.draw = function draw(jumplist) {\n jumplist = jumplist || _jumplist;\n if (jumplist) _jumplist = jumplist;\n $(\n `.bb-jumplist ${Jumplist.type}, .bb-jumplist li, .bb-jumplist-dropdown select`\n ).remove();\n if (jumplist.length) {\n if (\n $(\".bb-jumplist:visible, .bb-jumplist-dropdown:visible\").length === 0\n ) {\n // If we can't rely on CSS to decide the appropriate type\n // of jumplist (happens sometimes onload), draw them both\n drawAsList(jumplist);\n drawAsDropDown(jumplist);\n } else {\n // Draw our standard list:\n if ($(\".bb-jumplist\").is(\":visible\")) drawAsList(jumplist);\n // Also draw the dropdown:\n if ($(\".bb-jumplist-dropdown\").is(\":visible\")) drawAsDropDown(jumplist);\n }\n }\n };\n\n function drawAsList(jumplist) {\n const currentIndex = findCurrentIndex(jumplist);\n $(\".bb-jumplist\").map((i, l) => {\n const slicetype = l.dataset[\"slice\"];\n const itemizer = choose([\n [equals(\"before\"), slice(0, currentIndex)],\n [equals(\"after\"), slice(currentIndex, Infinity)],\n [T, identity]\n ])(slicetype);\n\n const html = bakeAsListitems(itemizer(jumplist));\n $(l).append(\n `<${Jumplist.type} aria-describedby=\"a-jumplist-title\">${html}`\n );\n });\n $(\".bb-jumplist a:last\").addClass(\"last\");\n $(\".bb-jumplist li:last-child\").addClass(\"last-child\"); // aid older browsers\n }\n function drawAsDropDown(jumplist) {\n if (jumplist.length) {\n var html = bakeAsDropDown(jumplist, 0);\n $(\".bb-jumplist-dropdown\").append(\"\");\n }\n }\n\n return this;\n})();\n","import { getVar } from \"./vars.js\";\n\nexport const userinfo = () => getVar(\"userinfo\") || {};\n","import { userinfo } from \"./user-info.js\";\nimport {\n compose,\n either,\n includes,\n prop,\n strictDifference\n} from \"./functional.js\";\n\nexport const PERM_ACCESSALLMODELS = \"accessallmodels\",\n // Allow to access all models\n PERM_ALLOWACCESSCASES = \"allowaccesscases\",\n // Allow to access to all the cases on the server\n PERM_ALLOWACCESSCASESFROMDOMAIN = \"allowaccesscasesfromdomain\",\n // Allow to access all the cases in the same domain on the server\n PERM_ALLOWALLCASEOVERVIEWDOMAIN = \"allowallcaseoverviewdomain\",\n // Allow to see all the cases in same domain on the server\n PERM_ALLOWALLCASESOVERVIEW = \"allowallcasesoverview\",\n // Allow to see all the cases made on the server\n PERM_ALLOWCASEOVERVIEW = \"allowcaseoverview\",\n // Allow to see the cases made by the user on the server\n PERM_ALLOWDOWNLOADCASE = \"allowdownloadcase\",\n // Allow user to download a case from the server\n PERM_ALLOWIPLOGTOUSER = \"allowiplogtouser\",\n // Allow the IP log to be send to the user\n PERM_ALLOWLOGTOUSER = \"allowlogtouser\",\n // Allow the WHOLE log of the server to be send to the user\n\n PERM_ALLOWMISALL = \"allowmisall\",\n // Allow all the MIS data to be shown\n PERM_ALLOWMISDOCUMENTS = \"allowmisdocuments\",\n // Allow the documents of the case to be opened\n PERM_ALLOWMISDOMAIN = \"allowmisdomain\",\n // Allow the MIS data within the same domain to be shown\n PERM_ALLOWMISOWNCASES = \"allowmisowncases\",\n // Allow the MIS data of the own cases to be shown\n\n PERM_ALLOWSAVECASE = \"allowsavecase\",\n // Allow to save a case on the server\n PERM_ALLOWSESSIONLOGTOUSER = \"allowsessionlogtouser\",\n // Allow the log concerning a case to be send to the user\n\n PERM_ALLOWSTARTCASES = \"allowstartcases\",\n // Allow to create a new case on the server\n PERM_PUBLISHMODEL = \"publishmodel\",\n // Allow to publish models to the server\n PERM_SAASCLIENTLOGICWRITABLE = \"saasclientlogicwritable\",\n // Allow users to change texts and logic in SAAS\tNeeds either updatemodels or updateownmodel to have effect\n PERM_SAASCLIENTWRITABLE = \"saasclientwritable\",\n // Allow users to change texts of the model in SAAS\tNeeds either updatemodels or updateownmodel to have effect\n PERM_SAASMANAGEPUBLISHINGSERVERS = \"saasmanagepublishingservers\",\n // Allow management of the publishing servers in server\n PERM_UPDATEDOMAINS = \"updatedomains\",\n // Allow to update or delete all the domains on the server (needs update users and models)\n PERM_UPDATEMODELS = \"updatemodels\",\n // Allow to update or delete all the models on the server\n PERM_UPDATEOWNMODEL = \"updateownmodel\",\n // Allow update or delete the models owned by user\n PERM_UPDATEOWNUSER = \"updateownuser\",\n // Allow to update the own user on the server, need this for webadmin access\n PERM_UPDATEROLES = \"updateroles\",\n // Allow to update or delete all the roles on the server\n PERM_UPDATESETTINGS = \"updatesettings\",\n // Allow to update the settings of the server\n PERM_UPDATEUSERS = \"updateusers\",\n // Allow to update or delete all the users on the server\n PERM_GETDATASOURCELIST = \"getdatasourcelist\",\n // Allow retrieving a sparse list of datasources\n PERM_MANAGEDATASOURCES = \"managedatasources\";\n// Allow retrieving, posting, updating, and deleting datasource specs and file\n\n// 4.12 equivalents\nconst oldperms = {\n guest: [PERM_ALLOWSTARTCASES],\n user: [\n PERM_PUBLISHMODEL,\n PERM_UPDATEOWNMODEL,\n PERM_UPDATEOWNUSER,\n PERM_ALLOWCASEOVERVIEW,\n PERM_ALLOWSTARTCASES,\n PERM_ALLOWSAVECASE,\n PERM_ALLOWMISOWNCASES // ,\n // PERM_SAASCLIENTWRITABLE,\n // PERM_SAASCLIENTLOGICWRITABLE\n ],\n administrator: [\n PERM_PUBLISHMODEL,\n PERM_ACCESSALLMODELS,\n PERM_UPDATEOWNMODEL,\n PERM_UPDATEDOMAINS,\n PERM_UPDATESETTINGS,\n PERM_UPDATEMODELS,\n PERM_UPDATEUSERS,\n // PERM_UPDATEROLES,\n PERM_UPDATEOWNUSER,\n PERM_ALLOWCASEOVERVIEW,\n PERM_ALLOWACCESSCASESFROMDOMAIN,\n PERM_ALLOWACCESSCASES,\n PERM_ALLOWSTARTCASES,\n PERM_ALLOWSAVECASE,\n PERM_ALLOWMISOWNCASES,\n PERM_ALLOWMISDOCUMENTS,\n // PERM_SAASCLIENTWRITABLE,\n // PERM_SAASCLIENTLOGICWRITABLE,\n // PERM_SAASMANAGEPUBLISHINGSERVERS,\n // PERM_SAASCLIENTWRITABLE,\n PERM_ALLOWDOWNLOADCASE // ,\n // PERM_MANAGEDATASOURCES\n ],\n viewer: [PERM_ALLOWMISDOMAIN],\n manager: [\n PERM_UPDATEOWNUSER,\n PERM_ALLOWCASEOVERVIEW,\n PERM_ALLOWACCESSCASESFROMDOMAIN,\n PERM_ALLOWACCESSCASES,\n PERM_ALLOWSAVECASE,\n PERM_ALLOWMISOWNCASES // ,\n // PERM_SAASCLIENTWRITABLE\n ],\n vieweradmin: [PERM_ALLOWMISALL, PERM_ALLOWMISDOMAIN, PERM_ALLOWMISDOCUMENTS],\n any: []\n};\n\nexport const permissions = () =>\n compose(\n either(\n prop(\"permissions\"),\n compose(role => oldperms[role] || oldperms[\"any\"], prop(\"role\"))\n ),\n userinfo\n )(null);\n\nexport const hasPermission = perm =>\n perm instanceof Array\n ? strictDifference(perm, permissions()).length === 0\n : includes(perm, permissions());\n\nexport const webadminMakesSense = permissions =>\n permissions.some(perm => perm.startsWith(\"update\"));\n","/* global $, URLSearchParams */\n\nif (\"bb\" in window) {\n throw \"bb was already loaded\";\n}\nimport \"./lib/polyfills/url-search-params.js\";\nimport * as Errors from \"./lib/errors.js\";\nimport { token } from \"./lib/tokens.js\";\nimport { shouldExit } from \"./lib/case-exit.js\";\nimport { A11y } from \"./lib/a11y\";\nimport { Ajax, checkJSON } from \"./lib/ajax.js\";\nimport { BBI } from \"./lib/bbi.js\";\nimport { collectWithin, serializeQuestions } from \"./lib/collect-values.js\";\nimport { conf, propFinder } from \"./lib/conf\";\nimport { wControl, getControl } from \"./lib/control.js\";\nimport { validateInput } from \"./lib/control-validation.js\";\nimport { parseDate, humanDate } from \"./lib/dates\";\nimport { escapeHTML } from \"./lib/escape.js\";\nimport {\n editPolicy,\n mustUpdate,\n canEditEarlier\n} from \"./lib/feature-queries.js\";\nimport { createFormGroup } from \"./lib/form-groups.js\";\nimport \"./lib/form-widgets-definitions.js\";\nimport { setSettled } from \"./lib/settled.js\";\nimport { collectAttributes } from \"./lib/utils\";\nimport {\n any,\n both,\n complement,\n compose,\n either,\n find,\n has,\n ifElse,\n includes,\n map,\n path,\n pathEq,\n prop,\n propEq,\n propOr,\n tap,\n when\n} from \"./lib/functional\";\nimport { doGrouping, groupOuter } from \"./lib/groupings\";\nimport { Jumplist } from \"./lib/jumplist\";\nimport { fromApiServer } from \"./lib/location.js\";\nimport { Mode } from \"./lib/mode.js\";\nimport { Numerals } from \"./lib/numerals.js\";\nimport { notify } from \"./lib/notify.js\";\nimport { permissions, webadminMakesSense } from \"./lib/permissions.js\";\nimport { _ } from \"./lib/gettext.js\";\nimport { positionalFormat } from \"./lib/text-utils\";\nimport { urlutils } from \"./lib/url-utils.js\";\nimport Vars from \"./lib/vars.js\";\nimport \"./lib/$.scrollTo.js\";\n\n$(\"html\").removeClass(\"no-js\");\n\nconst arbitraryCoreProp = propFinder(conf, \"arbitrary.core\");\n/**\n * Copyright (c) 2010 Conrad Irwin MIT license.\n * Based loosely on original: Copyright (c) 2008 mkmanning MIT license.\n *\n * Parses CGI query strings into javascript objects.\n *\n * See the README for details.\n **/\n$.parseQuery = function (options) {\n var config = { query: window.location.search || \"\" },\n params = {};\n\n if (typeof options === \"string\") {\n options = { query: options };\n }\n $.extend(config, $.parseQuery, options);\n config.query = config.query.replace(/^\\?/, \"\");\n\n $.each(config.query.split(config.separator), function (i, param) {\n var pair = param.split(\"=\"),\n key = config.decode(pair.shift(), null).toString(),\n value = config.decode(pair.length ? pair.join(\"=\") : null, key);\n\n if (\n config.array_keys.test\n ? config.array_keys.test(key)\n : config.array_keys(key)\n ) {\n params[key] = params[key] || [];\n params[key].push(value);\n } else {\n params[key] = value;\n }\n });\n delete params[\"\"];\n return params;\n};\n$.parseQuery.decode = $.parseQuery.default_decode = function (string) {\n return decodeURIComponent((string || \"\").replace(/\\+/g, \" \"));\n};\n$.parseQuery.array_keys = function () {\n return false;\n};\n$.parseQuery.separator = \"&\";\n\n// thanks http://web.enavu.com/daily-tip/maxlength-for-textarea-with-jquery/\n$(document).on(\"keyup\", \"textarea[maxlength]\", function () {\n var $this = $(this);\n //get the limit from maxlength attribute\n var limit = parseInt($this.prop(\"maxlength\"));\n //get the current text inside the textarea\n var text = $this.val();\n //count the number of characters in the text\n var chars = text.length;\n\n //check if there are more characters then allowed\n if (chars > limit) {\n //and if there are use substr to get the text before the limit\n var new_text = text.substr(0, limit);\n\n //and change the current text with the new text\n $this.val(new_text);\n $this.addClass(\"bb-programmatically-changed\");\n window.setTimeout(function () {\n $this.removeClass(\"bb-programmatically-changed\");\n }, 1000);\n }\n});\n\nlet bb = { Mode, conf };\n\n/*** TEXT UTILITIES BEGIN ***/\n\n/******* compareVersions ******/\nfunction compareVersions(a, b) {\n var i, l, d;\n\n a = a.toLowerCase().split(/(\\d+)/);\n b = b.toLowerCase().split(/(\\d+)/);\n l = Math.min(a.length, b.length);\n\n for (i = 0; i < l; i++) {\n d = a[i] - b[i];\n if (isNaN(d)) {\n if (a[i] === b[i]) d = 0;\n else if (a[i] < b[i]) {\n d = -1;\n } else d = 1;\n }\n if (d !== 0) return d;\n }\n\n return a.length - b.length;\n}\n\nfunction compareVersionsOn(prop, a, b) {\n return compareVersions(String(a[prop]), String(b[prop]));\n}\n/*** TEXT UTILITIES END ***/\n\n/*** DATEPICKER BEGIN ***/\n\n// Defaults jQuery datepicker BEGIN\n$(function () {\n $.datepicker.setDefaults(\n $.extend(\n true,\n $.datepicker._defaults,\n {\n showAnim: \"\",\n changeYear: true,\n changeMonth: true,\n yearRange: \"c-150:c+150\"\n }, // RFC\n arbitraryCoreProp(\"datepicker.defaults\") || {},\n { altFormat: \"yy-mm-dd\" }\n )\n );\n});\n// Defaults jQuery datepicker END\n\n/*** DATEPICKER END ***/\n\n/*** MISC jQUERY UTILITIES BEGIN ***/\n\n// thanks http://jqueryfordesigners.com/video.php?f=queue.flv\n$.fn.pause = function (n) {\n return this.queue(function () {\n var el = this;\n window.setTimeout(function () {\n return $(el).dequeue();\n }, n);\n });\n};\n\n$.fn.sort = function () {\n return this.pushStack($.makeArray([].sort.apply(this, arguments)));\n};\n\n$.fn.extend({\n insertAtCaret: function (myValue) {\n return this.each(function () {\n if (document.selection) {\n //For browsers like Internet Explorer\n this.focus();\n var sel = document.selection.createRange();\n sel.text = myValue;\n this.focus();\n } else if (this.selectionStart || this.selectionStart == \"0\") {\n //For browsers like Firefox and Webkit based\n var startPos = this.selectionStart;\n var endPos = this.selectionEnd;\n var scrollTop = this.scrollTop;\n this.value =\n this.value.substring(0, startPos) +\n myValue +\n this.value.substring(endPos, this.value.length);\n this.focus();\n this.selectionStart = startPos + myValue.length;\n this.selectionEnd = startPos + myValue.length;\n this.scrollTop = scrollTop;\n } else {\n this.value += myValue;\n this.focus();\n }\n return this;\n });\n },\n selectAllText: function () {\n var el = this.get(0);\n if (el) {\n if (typeof el.selectionStart === \"number\") {\n (el.selectionStart = 0), (el.selectionEnd = el.value.length);\n } else if (typeof el.createTextRange !== \"undefined\") {\n el.focus();\n var range = el.createTextRange();\n range.select();\n }\n }\n return this;\n }\n});\n\n/** Add resizeEnd event.\n *\n * Thanks Carlos Martinez on\n * http://stackoverflow.com/questions/2854407/\n * javascript-jquery-window-resize-how-to-fire-after-the-resize-is-completed\n *\n * I did put this in a closure so as not to pollute the global\n * namespace.\n */\n(function () {\n var _to = null,\n _delay = 500;\n $(window).on(\"resize\", function () {\n if (_to) window.clearTimeout(_to);\n _to = window.setTimeout(function () {\n $(this).trigger(\"resizeEnd\");\n }, _delay);\n });\n})();\n/*** MISC jQUERY UTILITIES END ***/\n\n/*** KEYMAP BEGIN ***/\nvar KEYS = {\n BACKSPACE: 8,\n TAB: 9,\n ENTER: 13,\n SPACE: 32,\n ESC: 27,\n UP: 38,\n DOWN: 40,\n KP_RADIX: 110\n};\n\n// Navigation\nvar maps = {\n questions: function (ev) {\n if (!Mode.get(\"hasModel\")) return undefined;\n if (ev.originalEvent.target && ev.originalEvent.target.tagName === \"TR\") {\n if (!gridKeys(ev)) return false;\n }\n var $target = $(ev.target);\n switch (ev.keyCode) {\n case KEYS.ENTER:\n if ($target.hasClass(\"bb-prior\")) {\n step(\"prior\");\n return false;\n }\n if ($target.hasClass(\"bb-skip\")) {\n step(\"skip\");\n return false;\n }\n if (!Mode.get(\"hasNoNext\")) {\n if (\n ev.shiftKey ||\n $target.hasClass(\"bb-next\") ||\n $target.is('input[type=\"text\"]') ||\n $target.is('input[type=\"radio\"]') ||\n $target.is('input[type=\"checkbox\"]') ||\n $target.is('input[type=\"checkbox\"]') ||\n $target.is('select[data-type=\"listbox\"]') ||\n $target.is(\"fieldset\")\n ) {\n step(\"next\");\n return false;\n }\n if (ev.target.tagName === \"TEXTAREA\") {\n ev.stopImmediatePropagation();\n break;\n }\n }\n if (ev.target.tagName === \"A\") {\n if (ev.target.href.substr(-1) !== \"#\")\n // A true link\n break;\n }\n break;\n case KEYS.SPACE:\n if ($target.is('[role=\"button\"]')) {\n $target.trigger(\"click\");\n return false;\n }\n break;\n case KEYS.BACKSPACE:\n return dispatchBackspace(ev);\n // Escape from modal window\n case KEYS.ESC:\n $(\".closable\").hide();\n break;\n case KEYS.KP_RADIX:\n if ($target.data(\"type\") === \"numedit\") {\n $target.insertAtCaret(_(\"__radixpoint__\", \".\"));\n return false;\n }\n }\n return undefined;\n }\n};\n\nfunction gridKeys(ev) {\n var target = ev.originalEvent.target,\n $target = $(target);\n switch (ev.keyCode) {\n case KEYS.UP:\n $(ev.target).prev().trigger(\"focus\");\n return false;\n case KEYS.DOWN:\n case KEYS.TAB:\n if ($target.find(\":input, a\").length !== 1) {\n return true;\n }\n if (\n $target.find(\n \"a, :input\" + ':not([type=\"checkbox\"])' + ':not([type=\"radio\"])'\n ).length\n ) {\n return true;\n }\n if (ev.shiftKey) $target.prev().trigger(\"focus\");\n else $target.next().trigger(\"focus\");\n return false;\n case KEYS.SPACE:\n var $inputs = $target.find(\n 'input[type=\"checkbox\"], ' + 'input[type=\"radio\"]'\n ),\n $input = $inputs.filter(\":nth(0)\");\n if ($inputs.length > 2) return true;\n else $input.prop(\"checked\", !$input.is(\":checked\"));\n return false;\n }\n return true;\n}\n\nfunction aintTheEnterKey(ev) {\n return ev.type === \"keydown\" && ev.keyCode !== KEYS.ENTER;\n}\n\nfunction dispatchBackspace(ev) {\n if (!ev.shiftKey) return true;\n if (Mode.get(\"hasNoPrior\")) return false;\n step(\"prior\");\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n}\n\n$(document).on(\"keydown\", maps.questions);\n\n$(document).on(\"keydown\", \".bb-btn\", function (ev) {\n if (ev.keyCode === 13) {\n // Dispatch to click handler on ENTER.\n $(this).trigger(\"click\");\n return false;\n }\n return true;\n});\n/*** KEYMAP END ***/\n\n/*** ROLES BEGIN ***/\n\nfunction setRole() {\n var userinfo = Vars.getVar(\"userinfo\") || {};\n\n Mode.toggle(\"isAdmin\", userinfo.role === \"administrator\");\n Mode.toggle(\"isUser\", userinfo.role === \"user\");\n Mode.toggle(\"isViewer\", userinfo.role === \"viewer\");\n Mode.toggle(\"isVieweradmin\", userinfo.role === \"vieweradmin\");\n Mode.toggle(\"isGuest\", userinfo.role === \"guest\");\n Mode.toggle(\"isAnonymous\", userinfo.fullname === \"anonymous\");\n const perms = permissions();\n perms.forEach(p => {\n Mode.toggle(p, true, false);\n });\n Mode.toggle(\"webadminMakesSense\", webadminMakesSense(perms), false);\n}\n\n/*** ROLES END ***/\n\n/*** INITIALIZATION BEGIN ***/\n\n$(function () {\n $(\"body\").attr(\"data-modus\", \"none\");\n\n document.addEventListener(\"submit\", function (ev) {\n var action = ev.target.getAttribute(\"action\");\n if (!action) {\n ev.preventDefault();\n return false;\n }\n return undefined;\n });\n\n $(document).on(\"submit\", \"form#bb-login\", function () {\n // Serialize form as array\n var params = $(this).serializeArray(),\n action = this.getAttribute(\"action\");\n // Trim values and set the desired format\n $.each(params, function (_, val) {\n if (val.name === \"fmt\") val.value = \"json\";\n else val.value = (val.value || \"\").trim();\n });\n $.postJSON(\n action,\n [$.param(params), window.location.search.substring(1)].join(\"&\")\n );\n return false;\n });\n\n var formfocus = window.setTimeout(function () {\n $(\"form#bb-login input[name=username]\").trigger(\"focus\");\n }, 0);\n\n bb.Router = function router(params) {\n if (\n (typeof params.username !== \"undefined\" &&\n typeof params.password !== \"undefined\") ||\n params.uniqueid ||\n params.modelid ||\n params.modelname ||\n params.dbname ||\n params.state ||\n params.request ||\n params.bsid\n ) {\n Mode.set(\"isDeepLinked\");\n hideLogin();\n if (params.bsid) new BBI().authenticate();\n else if (!bb.autologinrewritten) {\n var action;\n if (\n typeof params.username !== \"undefined\" &&\n typeof params.password !== \"undefined\"\n )\n action = \"login\";\n if (params.uniqueid) action = \"menu\";\n // Studio deeplink\n if (typeof params.uniqueid === \"undefined\" && params.modelid)\n action = \"open\";\n if (params.uniqueid && (params.modelid || params.dbname))\n action = \"action\";\n if (params.modelname) action = \"open\";\n if (params.request) {\n action = params.request;\n delete params.request;\n }\n $.postJSON(action, $.param(params) + \"&fmt=json\").then(setSettled);\n }\n window.clearTimeout(formfocus);\n }\n };\n\n if (window.location.search.length > 1) {\n bb.Router($.parseQuery());\n } else setSettled();\n\n $(document).on(\"bb:renderQuestions\", renderGroups);\n});\n\n/**\n * Set the effect to be used when re-showing login form.\n *\n * @param {String} effect One of 'show', 'fadeIn' or 'slideDown'\n */\nfunction safeResetEffect(effect = \"slideDown\") {\n if (typeof effect !== \"string\") {\n console.warn(\"Argument effect should be a string\");\n return \"slideDown\";\n }\n if (!/^(show|fadeIn|slideDown)$/.test(effect)) {\n console.warn(\"Invalid effect: \" + effect);\n return \"slideDown\";\n }\n return effect;\n}\n\nresetLogin.effect = safeResetEffect(\n arbitraryCoreProp(\"loginResetEffect\", \"slideDown\")\n);\n\nfunction resetLogin() {\n $(\"#bb-login\")[resetLogin.effect]();\n}\n\n/*** INITIALIZATION END ***/\n/*** JUMPLIST BEGIN ***/\n$(document).on(\"change\", \".bb-jumplist-dropdown select\", function () {\n bb.gotonode($(this).val());\n});\n\n$(document).on(\"click\", \"[data-groupid]\", function () {\n var $this = $(this),\n groupid = $this.attr(\"data-groupid\");\n bb.gotonode(groupid);\n});\n\n/*** JUMPLIST END ***/\n\n/*** CASES BEGIN ***/\n$.fn.deleteme = function () {\n if (\n confirm(\n _(\"Delete\") + \" \" + (this.length == 1 ? _(\"case\") : _(\"cases\")) + \"?\"\n )\n ) {\n return this.each(function () {\n var me = $(this);\n if (me.hasClass(\"bb-case\")) {\n var casus = {\n dbname: me.data(\"dbname\"),\n sessionid: me.data(\"sessionid\")\n };\n deleteCase(casus.dbname, casus.sessionid, Vars.getVar(\"uniqueid\"));\n if (isCaseCurrent(casus)) {\n $(\"#bb-q\").empty();\n Mode.unset(\"hasModel\");\n }\n }\n });\n }\n return this;\n};\n\nvar Cases = (function () {\n var _cases = [];\n var _unfilteredcases = [];\n var _MAX = 10;\n var _idx = 0;\n var _filtertext = _(\"filter cases by name\");\n\n function update(cases) {\n _unfilteredcases = cases || [];\n _cases = cases || [];\n if (cases && cases.length > 0) {\n cases.sort(function (a, b) {\n return a.dateenter > b.dateenter ? -1 : 1;\n });\n var $controls = $(\"#bb-cases-controls\");\n if ($controls.is(\":empty\")) {\n $controls.html(\n ' ' +\n ' ' +\n ' 1-10' +\n ' ' +\n ' ' +\n ''\n );\n $controls.attr(\"data-unbound\", true);\n }\n if ($controls.attr(\"data-unbound\")) {\n $controls.removeAttr(\"data-unbound\");\n $(\"#bb-cases-prev\").click(prevSlice);\n $(\"#bb-cases-next\").click(nextSlice);\n $(\"#bb-cases-first\").click(showSlice.bind(null, 0));\n $(\"#bb-cases-last\").click(\n showSlice.bind(null, Math.floor((_cases.length - 1) / _MAX))\n );\n\n $(\"#bb-cases-filter\", $controls).keyup(function (ev) {\n if (ev.keyCode === KEYS.TAB) return true;\n var $this = $(this),\n val = ($this.val() || \"\").trim();\n if (val != \"\") {\n var re = new RegExp(val, \"i\");\n _cases = _unfilteredcases.filter(function (e) {\n return re.test(e.name);\n });\n } else _cases = _unfilteredcases;\n showSlice(0);\n return false;\n });\n }\n showSlice(0);\n } else {\n empty();\n }\n }\n function showSlice(idx) {\n _idx = idx;\n var caselen = _cases.length;\n\n $(\"#bb-cases .bb-case\").remove();\n\n $(_cases.slice(_idx * _MAX, (_idx + 1) * _MAX)).each(function (i) {\n wCasus(_cases[i + _idx * _MAX]).appendTo(\"#bb-cases-table\");\n });\n if (_cases.length) {\n $(\n '' +\n '\" +\n \"\" +\n \"\" +\n (bb.Plugins.newname\n ? '' +\n '' +\n '' +\n \"\" +\n \"\"\n : \"\") +\n \"\"\n ).prependTo(\"#bb-cases-table\");\n\n // Some browsers do leave thead and tbody in place, even when\n // $().empty-ing the table, so:\n $(\"#bb-cases-table thead~thead\").remove();\n }\n\n $(\"#bb-cases-currentslice\")\n .text(\n _idx * _MAX +\n 1 +\n \"-\" +\n Math.min(caselen, (_idx + 1) * _MAX) +\n \"/\" +\n caselen\n )\n .attr(\n \"aria-label\",\n positionalFormat(\n _(\"results {0} to {1} from {2}\"),\n _idx * _MAX + 1,\n Math.min(caselen, (_idx + 1) * _MAX),\n caselen\n )\n );\n\n $(\"#bb-cases-prev, #bb-cases-first\").prop(\"disabled\", _idx == 0);\n var hasNoNext = _idx == Math.floor((caselen - 1) / _MAX);\n $(\"#bb-cases-next, #bb-cases-last\").prop(\"disabled\", hasNoNext);\n\n $(\"#bb-cases\").trigger(\"bb:rendered\");\n }\n function nextSlice() {\n var divident = Math.floor(_cases.length / _MAX);\n showSlice(Math.min(_idx + 1, divident));\n }\n function prevSlice() {\n showSlice(Math.max(_idx - 1, 0));\n }\n function empty() {\n $(\"#bb-cases-table\").empty();\n }\n return {\n empty: empty,\n update: update\n };\n})();\n\nfunction howManyColumns() {\n var base = 2;\n return (\n $.grep([\"showreport\", \"showdeleteinmenu\", \"showcopycase\"], Vars.getVar)\n .length + base\n );\n}\n\nfunction wCasus(casus) {\n var cas = $.extend(\n {},\n casus,\n // Turn into JavaScript dates, and normalize as good as we can:\n {\n dateenter: casus.dateenter && parseDate(casus.dateenter),\n datecreate:\n Vars.getVar(\"showdatecreated\") &&\n casus.datecreate &&\n parseDate(casus.datecreate)\n },\n {\n showcopycase: Vars.getVar(\"showcopycase\"),\n showdeleteinmenu: Vars.getVar(\"showdeleteinmenu\")\n }\n );\n if (Vars.getVar(\"showreport\")) cas.reporturl = urlutils.caseReport(casus);\n // Turn into JavaScript dates, and normalize as good as we can:\n if (cas.datecreate) cas.firstrun = humanDate(cas.datecreate);\n if (cas.dateenter) cas.lastaccess = humanDate(cas.dateenter);\n var html = bb.createCaseItem(cas);\n\n var $case = $(html);\n\n $case.find(\".bb-case-name\").bind(\"click keydown\", function (ev) {\n if (aintTheEnterKey(ev)) return;\n Ajax.replace({\n url: \"action\",\n data: {\n dbname: casus.dbname,\n sessionid: casus.sessionid,\n uniqueid: Vars.getVar(\"uniqueid\"),\n fmt: \"json\"\n }\n });\n });\n $case.find(\".bb-case-copy\").bind(\"click keydown\", function (ev) {\n if (aintTheEnterKey(ev)) return;\n Ajax.replace({\n url: \"action\",\n data: {\n dbname: casus.dbname,\n templateindex: casus.sessionid,\n uniqueid: Vars.getVar(\"uniqueid\"),\n fmt: \"json\"\n }\n });\n });\n $case.data(\"sessionid\", casus.sessionid);\n $case.data(\"dbname\", casus.dbname);\n return $case;\n}\n\nbb.createCaseItem =\n bb.createCaseItem ||\n function (casus) {\n var dateTitle,\n dateSpan = \"\",\n copySpan = \"\",\n reportSpan = \"\",\n deleteSpan = \"\",\n classes = [\"bb-case\"];\n dateTitle = _(\"Last opened\") + \": \" + casus.lastaccess;\n if (Vars.getVar(\"showdatecreated\")) {\n dateTitle += \", \" + _(\"created\") + \": \" + casus.firstrun;\n }\n dateSpan =\n '' +\n casus.lastaccess +\n \"\";\n if (Vars.getVar(\"showreport\")) {\n reportSpan =\n '' +\n '' +\n ' ' +\n _(\"report\") +\n \"\";\n }\n if (Vars.getVar(\"showdeleteinmenu\")) {\n deleteSpan =\n \"\" +\n '\" +\n \"\";\n }\n\n if (Vars.getVar(\"showcopycase\")) {\n copySpan =\n \"\" +\n '\" +\n \"\";\n }\n\n if (isCaseCurrent(casus)) {\n classes.push(\"current\");\n }\n\n return (\n '' +\n \"\" +\n '\" +\n dateSpan +\n reportSpan +\n deleteSpan +\n copySpan +\n \"\"\n );\n };\n\nfunction isCaseCurrent(casus) {\n return (\n casus.sessionid == Vars.getVar(\"sessionid\") &&\n casus.dbname == Vars.getVar(\"dbname\")\n );\n}\n\nfunction deleteCase(dbname, sessionid, uniqueid) {\n // Ajax.last && Ajax.last.abort();\n // todo: voeg nieuwe waarden toe aan object.\n Ajax.post({\n url: \"delete\",\n data: {\n dbname,\n sessionid,\n uniqueid,\n fmt: \"json\"\n }\n });\n}\n\n$(document).on(\"click keydown\", \".bb-case-delete\", function (ev) {\n if (ev.type === \"keydown\" && ev.keyCode !== KEYS.ENTER) return;\n $(this).parents(\".bb-case\").deleteme();\n});\n\nfunction newcase(dbname, newname, params = {}) {\n const data = Object.assign(\n {},\n Object(params) === params && params,\n {\n dbname: dbname,\n uniqueid: Vars.getVar(\"uniqueid\"),\n step: \"open\",\n fmt: \"json\"\n },\n newname && { newname }\n );\n if (Vars.getVar(\"sessionid\"))\n step(\"exit\", function (jsondata) {\n Ajax.busy = false;\n if (jsondata.status === \"Ready\") {\n Ajax.replace({ data: data });\n }\n });\n else {\n Ajax.replace({ data: data });\n }\n}\n\n$(document).on(\"click keydown\", \".bb-newname\", function (ev) {\n if (ev.type === \"click\" || aintTheEnterKey(ev)) ev.stopPropagation();\n return true;\n});\n\n$(document).on(\"click keydown\", \".bb-newcase\", function (ev) {\n if (aintTheEnterKey(ev)) return true;\n const $this = $(this),\n dbname =\n this.getAttribute(\"data-bb:dbname\") ||\n $this.parents(\".bb-model\").attr(\"data-bb:dbname\"),\n newname = $this.find(\".bb-newname\").val(),\n params = collectAttributes(\"data-bb:params-\", this);\n newcase(dbname, newname, params);\n return false;\n});\n\n/*** CASES END ***/\n\n/*** MODELS BEGIN ***/\nvar Models = {\n selector: \"#bb-models\",\n modelitem: function (model) {\n model.uniqueid = Vars.getVar(\"uniqueid\");\n return (\n (bb.createModelItem && bb.createModelItem(model)) ||\n (function (model) {\n var dbname = model.dbname;\n return (\n '' +\n \"\" +\n '\" +\n \"\" +\n '\" +\n \"\"\n );\n })(model)\n );\n },\n // Enhance Model with extra computed properties:\n enhanceModel: function (model) {\n model._selectedclass = model.selected ? \"selected\" : \"\";\n model._nicename = model.modelname.replace(/_/g, \" \");\n if (model.lastupdate) {\n model._date = parseDate(model.lastupdate);\n model._humandate = humanDate(model._date);\n }\n if (model.modelinfo) {\n model._liner_notes = model.modelinfo.split(/(?:\\r?\\n|\\\\r\\\\n|\\\\n)/);\n }\n if (model.authorinfo) {\n model._author_notes = model.authorinfo.split(/(?:\\r?\\n|\\\\r\\\\n|\\\\n)/);\n }\n return model;\n },\n update: function (data) {\n var models = data.models;\n models.sort(compareVersionsOn.bind(null, \"modelname\"));\n\n var explicit = models.filter(function (m) {\n return typeof m[\"order\"] === \"number\";\n });\n if (explicit[0]) {\n explicit.sort(function (a, b) {\n return (\n a[\"order\"] - b[\"order\"] ||\n compareVersions(String(a[\"order\"]), String(b[\"order\"]))\n );\n });\n models = models.filter(function (m) {\n // absent (undefined) or the empty string\n return typeof m[\"order\"] !== \"number\";\n });\n models = explicit.concat(models);\n }\n\n this.empty();\n var self = this;\n $(this.selector).append(\n $.map(models, function (model) {\n return self.modelitem(self.enhanceModel(model));\n })\n );\n },\n empty: function () {\n $(this.selector).empty();\n }\n};\n\n$(document).on(\"click keydown\", \".bb-model-cases\", function (ev) {\n if (aintTheEnterKey(ev)) return;\n var $this = $(this),\n dbname =\n this.getAttribute(\"data-bb:dbname\") ||\n $this.parents(\".bb-model\").attr(\"data-bb:dbname\");\n Ajax.replace({\n url: \"menu\",\n data: {\n dbname: dbname,\n uniqueid: Vars.getVar(\"uniqueid\"),\n fmt: \"json\"\n },\n dataType: \"json\"\n });\n});\n/*** MODELS END ***/\n\n/*** NAVIGATION, REQUESTS BEGIN ***/\n\n/**\n * Request 'action'\n *\n * @param {String} direction One of 'prior', 'next', 'exit', 'runtonode', 'gotonode', 'update' or 'updatemis'\n * @param {Function} cb Callback function to run on succes, defaults to checkJSON()\n * @param {Object} options Object, with possible keys: 'fullnodename' : 'graph.node',\n * 'groupid' : 'groupid-iteration',\n * 'sync' : Boolean\n */\nfunction step(direction, cb, options = {}) {\n Validation.reset();\n if (Ajax.busy) return;\n\n Ajax.last && Ajax.last.abort();\n Ajax.direction = direction;\n Ajax.row = Ajax.direction === \"update\" && options && options.update;\n\n try {\n if (\n [\"next\", \"skip\"].includes(direction) &&\n $(\"#bb-q .group:not([disabled]) .validatable:visible\")\n .validate({ silent: false, justhide: false, requestUpdate: false })\n .filter(\"[aria-invalid=true]\").length > 0\n )\n throw new Error(\"There are errors, please double check your answers.\");\n\n const container = either(prop(\"groupElt\"), () =>\n document.querySelector(\".group.selected\")\n )(options);\n const screenid = Vars.getVar(\"screenid\");\n const groupid = $.data(container).groupid;\n Ajax.groupid = groupid;\n\n // todo: voeg nieuwe waarden toe aan object.\n if (!(direction === \"prior\" && Mode.get(\"hasNoPrior\"))) {\n const ajaxOptions = {\n async: true && (!options || !options.sync), //See noted render() as a reason for this.\n data: [\n \"step=\" + direction,\n direction === \"update\" && options && options.update\n ? \"update=\" + encodeURIComponent(options.update)\n : \"\",\n direction === \"runtonode\"\n ? \"fullnodename=\" + options.fullnodename\n : \"\",\n direction === \"gotonode\" ? \"groupid=\" + options.groupid : \"\",\n Vars.querify(Vars.SESSION_KEYS),\n \"screenid=\" + groupid,\n \"fmt=json\",\n collectWithin({\n container,\n params: new URLSearchParams(options.extraparams)\n })\n .toString()\n .replace(/\\r?\\n/g, \"%0D%0A\")\n ]\n .filter(Boolean)\n .join(\"&\"),\n success: function (data, status, req) {\n data._direction = direction;\n data._passed = options && options.pass;\n data._isUpdate = propEq(\"isUpdate\", true, options);\n // if (direction === \"update\" && groupid !== screenid && editPolicy(conf) === \"stay\") {\n // container.classList.remove(\"unselected\");\n // container.classList.add(\"selected\");\n\n // // Do not render, just update\n // Ajax.release();\n // Vars.setVars(data);\n // updateDynProps(data);\n // } else\n\n if (groupid !== screenid && editPolicy(conf) === \"return\") {\n // Do not render, we're going back again. This would be\n // nice, but we do need some values to be rerendered -\n // warranting redraw of nodes after the edited one.\n\n Ajax.release();\n Vars.setVars(data);\n } else if (options && options.cbIsAdditional) {\n options.cbIsAdditional === \"before\" && cb && cb(data, status, req);\n checkJSON(data, status, req);\n options.cbIsAdditional !== \"before\" && cb && cb(data, status, req);\n } else {\n (cb || checkJSON)(data, status, req);\n }\n if (\n Ajax.row &&\n groupid === screenid &&\n compose(\n when(Boolean, any(propEq(\"dynamic\", true))),\n prop(\"groups\")\n )(data)\n ) {\n console.info(\n \"Requesting an extra update for dynprops. Should be handled by server instead\"\n );\n window.setTimeout(bb.update, 0);\n }\n }\n };\n\n if (\n screenid !== undefined &&\n direction !== \"update\" &&\n groupid !== screenid\n ) {\n console.warn(\n `groupid ${groupid} is not the current screenid ${screenid}, but no update was requested`\n );\n }\n if (direction === \"update\" && groupid !== screenid) {\n // Hold your breath, first go back, so as to put server pointer at the right node.\n bb.gotonode(\n // Will get the .selected\n groupid,\n data => {\n Ajax.release();\n Vars.setVars(data); // Sets screenid\n Ajax.direction = direction;\n // Is always \"update\", actually;\n Ajax.row = direction === \"update\" && options && options.update;\n Ajax.groupid = groupid;\n const req = Ajax.post(ajaxOptions); // Gets the original callback, if any.\n if (editPolicy(conf) === \"return\")\n req.then(data => {\n Ajax.release();\n Vars.setVars(data);\n\n bb.gotonode(\n screenid,\n () => {\n // The gotonode invocation just overwrote the direction and row.\n Ajax.direction = direction;\n Ajax.row =\n direction === \"update\" && options && options.update;\n if (!Ajax.row) cb && cb();\n },\n {\n cbIsAdditional: \"before\",\n groupElt: container,\n isUpdate: true\n }\n );\n });\n },\n { sync: false, cbIsAdditional: false }\n );\n } else {\n Ajax.post(ajaxOptions);\n }\n }\n } catch (e) {\n $(document).trigger(\"bb:userError\", e.message);\n A11y.log(_(e.message));\n }\n}\n\nlet lastUpdateRequest;\n\nfunction requestDynProps(input) {\n if (Ajax.busy) return;\n\n var thisUpdateRequest;\n\n Ajax.last && Ajax.last.abort();\n Ajax.direction = \"update\";\n // Ajax.row = Ajax.direction === 'update' && options && options.update;\n\n const ajaxOptions = {\n async: true,\n data: [\n \"step=update\",\n Vars.querify(Vars.NAV_KEYS),\n \"fmt=json\",\n serializeQuestions()\n ]\n .filter(Boolean)\n .join(\"&\"),\n success: (...args) => {\n if (thisUpdateRequest === lastUpdateRequest) {\n $(document).trigger(\"bb:preHandleData\", ...args);\n updateDynProps(args[0], input);\n }\n }\n };\n lastUpdateRequest = thisUpdateRequest = Ajax.post(ajaxOptions);\n}\n\n// bb:prePost handler always goes off on bb.ajax.post.\n$(document).on(\"bb:prePost\", function (event, options) {\n if (includes(options.url, [\"action\", \"open\", \"bbisreturns\"]))\n if (!includes(Ajax.direction, [\"update\", \"updatemis\"]))\n $(document).trigger(\"bb:preStep\", options);\n});\n\n// bb:preStep handler goes off after user-initiated, possibly\n// expensive, actions.\n$(document).on(\"bb:preStep\", function () {\n Ajax.busy = true;\n // Hide lingering calendars\n $(\".group.selected .hasDatepicker\").datepicker(\"hide\");\n A11y.log(\"\");\n});\n\n// Save\n$(document).on(\"click\", \".bb-save\", function () {\n step(\"save\", null);\n});\n\n// Update\n$(document).on(\"click\", \"[name=update]\", function (ev) {\n step(\"update\", null, {\n update: $(this).val(),\n groupElt: ev.target.closest(\".group\")\n });\n});\n\n// Prior\n$(document).on(\"click\", \".bb-prior\", function () {\n step(\"prior\");\n});\n\n// Next\n$(document).on(\"click\", \".bb-next\", function (ev) {\n bb.next();\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n});\n\n// Skip\n$(document).on(\"click\", \".bb-skip\", function (ev) {\n bb.skip();\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n});\n\n$(document).on(\"keydown\", \".group a\", function (ev) {\n if (\n ev.shiftKey &&\n ev.keyCode === KEYS.ENTER &&\n ev.target.href.substr(-1) !== \"#\"\n ) {\n // true link BUT SHIFT + ENTER\n bb.next();\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n }\n return true;\n});\n\n// Close\n$(document).on(\"click\", \".bb-close\", function () {\n logout();\n self.close();\n $(\"body\").html(_(\"You may now safely close this window\"));\n});\n\n// Restart\n$(document).on(\"click\", \".bb-restart\", function (event) {\n if (\n \"noconfirm\" in event.currentTarget.dataset ||\n confirm(_(\"Are you sure? This will reset all values.\"))\n )\n bb.restart();\n return false;\n});\n\n/**\n * Log out\n *\n * @param {Boolean} ev Either a jQuery event or not\n * @param {Function} cb Callback function to be run after logout.\n * Supercedes default action on Ajax request. @see Ajax.post.\n */\n\nconst timedOutResponse = () => ({\n error: {\n code: 9 //Errors.CODES.cWebSessionTimeOut\n }\n});\n\nfunction logout(ev, cb) {\n if (Vars.getVar(\"uniqueid\")) {\n exit(function () {\n const options = {\n url: \"logout\",\n data: \"fmt=json&\" + Vars.querify(\"uniqueid\"),\n async: false\n };\n // When called directly, which\n if (cb instanceof Function) {\n options.success = options.error = cb;\n }\n Ajax.post(options);\n });\n } else {\n console && console.info && console.info(\"Fake logging out, ID is missing\");\n const mockResponse = timedOutResponse();\n ((cb instanceof Function && cb) || checkJSON)(mockResponse, 200, {\n responseJSON: mockResponse,\n responseText: JSON.stringify(mockResponse)\n });\n }\n return false;\n}\n\n$(document).on(\"click\", \".bb-logout\", logout);\n$(document).on(\"keydown\", \".bb-logout\", function (ev) {\n if (ev.keyCode !== KEYS.ENTER && ev.keyCode !== KEYS.SPACE) return true;\n logout(ev);\n return false;\n});\n\n/** Exit\n *\n * Exit the current case;\n * @param {Function} fun Function to execute after having exited.\n * If exiting isn't necessary, still execute fun.\n */\nfunction exit(fun, sync = true) {\n if (typeof fun !== \"function\")\n // Could be an event object on .bb-stop\n fun = undefined;\n if (shouldExit()) {\n step(\"exit\", fun, { sync });\n } else fun && fun();\n}\n\n$(document).on(\"click\", \".bb-stop\", exit);\n\n// Request 'getuserinfo'\nfunction getUserInfo() {\n $.postJSON(\"getuserinfo\", Vars.querify(\"uniqueid\") + \"&fmt=json\");\n}\n\n/*** NAVIGATION, REQUESTS END ***/\n\n/*** MENU BEGIN ***/\n\nfunction setupMenu() {\n $(\".bb-settings\").attr({ target: \"blank\" });\n}\n\n// Open WebAdmin (in new page)\nfunction openSettings() {\n var href = fromApiServer(\"webadmin\" + \"?\" + Vars.querify(\"uniqueid\"));\n window.open(href);\n return false;\n}\n\n$(document).on(\"click\", \".bb-settings\", openSettings);\n$(document).on(\"keydown\", \".bb-settings\", function (ev) {\n if (ev.keyCode !== KEYS.ENTER && ev.keyCode !== KEYS.SPACE) return true;\n openSettings(ev);\n return false;\n});\n\n/** menu\n *\n * Open menu (model overview)\n * @param {String|Object|undefined} creds Optional credentials,\n * defaults to fmt:json and uniqueid\n */\nfunction menu(creds) {\n return $.postJSON(\n \"menu\",\n creds || {\n fmt: \"json\",\n uniqueid: Vars.getVar(\"uniqueid\")\n }\n );\n}\n\n/** exitthenmenu\n *\n * Exit a case, then open a menu\n * @param {Event} ev Optional event whose propagation will be stopped\n */\nfunction exitthenmenu(ev) {\n exit(function () {\n menu();\n });\n ev && ev.stopPropagation && ev.stopPropagation();\n}\n\n$(document).on(\"click\", \".bb-openmodels\", exitthenmenu);\n$(document).on(\"keydown\", \".bb-openmodels\", function (ev) {\n if (ev.keyCode !== KEYS.ENTER) return;\n exitthenmenu(ev);\n});\n\n/*** MENU END ***/\n\n/*** MISC UI BEGIN ***/\n\nfunction hideLogin() {\n $(\"form#bb-login\").hide();\n}\n\n/**\n * Simple class toggling to implement collapsing/expanding widgets.\n *\n * Needs CSS styling and / or Event handler registered on custom\n * jQuery 'bb:collapsing' Event.\n */\n$(document).on(\"click keydown\", \".bb-collapsable .bb-collapser\", function (ev) {\n if (aintTheEnterKey(ev) || ev.shiftKey) return true;\n $(this)\n .closest(\".bb-collapsable\")\n .toggleClass(\"bb-collapsed\")\n .trigger(\"bb:collapsing\");\n return false;\n});\n\n/*** MISC UI END ***/\n\n/*** DATA HANDLERS BEGIN ***/\n\n/**\n * Default handlers for JSON object.\n *\n * Order in which these handlers are executed are:\n *\n * bb:preHandleData\n * bb:handleData\n * bb:postHandleData\n * bb:finalHandleData\n */\n\n$(document).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.groups) {\n data.groups.forEach(function (group) {\n const groupid = group.groupid;\n group.controls.forEach(function (control) {\n control._originalid = control.id;\n control.id = groupid + \"-\" + control.id;\n if (control.isfor) {\n control._originalisfor = control.isfor;\n control.isfor = groupid + \"-\" + control.isfor;\n }\n if (control.controltype === \"label\") {\n control.value = control.value.trim();\n if (control.isfor && control.value)\n control.value = control.value + \" \";\n }\n if (\n control.controltype === \"memo\" &&\n control.maxlength > 0 &&\n !control.placeholder\n ) {\n control.placeholder = positionalFormat(\n _(\"Maximum allowed characters: {0}\"),\n control.maxlength\n );\n }\n });\n });\n }\n});\n/**\n * Default handler for JSON object.\n *\n * Sets mode, variables, calls functions to update UI.\n *\n */\nfunction onHandleData(event, data) {\n // Save previous modus - it will be the next modus if unset.\n var modus = $(\"body\").attr(\"data-modus\"); // Either 'model', 'menu', or 'none'\n\n Mode.unset(\"hasMessage\");\n if (typeof data == \"undefined\") return;\n if (typeof document.selection != \"undefined\")\n try {\n document.selection.removeAllRanges();\n } catch (e) {\n // tryCatch was there for IE's sake. probably because we were\n // using Selection.empty()\n }\n\n // Fix error objects - they are a mess\n if (data.error) {\n data.error = Errors.translate(data.error);\n // Do not throw the error just yet - we may need it to\n // get in the right mode\n }\n\n Vars.setVars(data);\n\n if (data.userinfo) {\n Mode.set(\"isLoggedIn\");\n setRole();\n setupMenu();\n return;\n }\n\n if (\n data.error &&\n ([\n Errors.CODES.cWebPleaseLogin,\n Errors.CODES.cUMWrongUserNamePassword,\n Errors.CODES.cWebSessionTimeOut\n ].indexOf(data.error.code) > -1 ||\n data.error.code === \"UNAUTHORIZED\")\n ) {\n // Do nothing\n } else if (has(\"bbis\", data)) {\n // Authenticate through BBI\n new BBI(data).authenticate();\n return;\n } else if (Vars.getVar(\"uniqueid\")) {\n // We are apparently logged in\n hideLogin();\n if (!Vars.getVar(\"userinfo\")) {\n // Get user information\n getUserInfo();\n }\n }\n\n // \"DrawScreen: end\"\n /* Only set modus if this is possibly mode-changing data (e.g.\n * DON'T even go here when data.userinfo is true).\n */\n if (data.status || data.groups || data.cases || data.models || data.error) {\n if (data.groups) modus = \"model\";\n else if (\n data.models ||\n data.cases ||\n (data.status && data.status == \"Ready\")\n ) {\n modus = \"menu\";\n } else if (data.status && data.status == \"logout successful\") {\n modus = \"none\";\n } else if (data.error && data.error.code === Errors.CODES.cWebPleaseLogin) {\n modus = \"none\";\n } else if (\n data.error &&\n data.error.code === Errors.CODES.cUMWrongUserNamePassword\n ) {\n modus = \"none\";\n } else if (\n data.error &&\n data.error.code === Errors.CODES.cWebSessionTimeOut\n ) {\n modus = \"none\";\n } else if (data.error && data.error.code === \"READY\") {\n modus = \"menu\";\n }\n $(\"body\").attr(\"data-modus\", modus);\n // Set current modus\n\n // Clean up state vars that were left over\n if (modus === \"menu\") {\n Vars.unsetVars([\"sessionid\", \"screenid\"]); // Session specific data\n }\n if (modus === \"none\") {\n const perms = permissions();\n Vars.unsetVars();\n perms.forEach(p => {\n Mode.toggle(p, false, false);\n });\n }\n\n // Will need to be seen with every control\n Mode.unset(\"hasHints\");\n\n if (!data.error)\n Mode.toggle(\"hasNoModelsShown\", modus !== \"menu\")\n\n .toggle(\"hasModel\", modus === \"model\")\n\n .toggle(\"hasMenu\", modus === \"menu\")\n\n .toggle(\n \"hasModels\",\n modus === \"menu\" && !!data.models && !!data.models.length\n )\n\n .toggle(\n \"hasCases\",\n modus === \"menu\" && !!data.cases && !!data.cases.length\n )\n\n .toggle(\n \"hasJumplist\",\n modus === \"model\" && !!data.jumplist && !!data.jumplist.length\n )\n\n .toggle(\n \"hasInformationsources\",\n modus === \"model\" &&\n data.informationsources &&\n !!data.informationsources.length\n )\n\n .toggle(\"hasNoPrior\", modus === \"model\" && !data.hasprevious)\n\n .toggle(\"hasNoNext\", modus === \"model\" && !data.hasnext);\n\n Mode.toggle(\"isLoggedIn\", modus !== \"none\");\n\n if (modus === \"none\") {\n Mode.unset(\"isDeepLinked\");\n setRole(); // Sets Mode\n }\n if (modus !== \"model\") {\n Mode.unset(\"isValidated\");\n }\n }\n\n if (\n data.error &&\n !includes(data.error.code, propOr([], \"ignoredErrorCodes\", conf))\n ) {\n notify(\n {\n keepalive: path([\"arbitrary\", \"core\", \"notify\", \"keepalive\"], conf),\n html: false\n },\n data.error\n );\n }\n\n // View updates\n if (data.modeldescription) {\n $(\".bb-modelname\")\n .text(data.modeldescription.replace(/_/g, \" \"))\n .attr(\"lang\", data.modellanguage);\n } else if (modus !== \"model\") {\n $(\".bb-modelname\").text(\"\");\n }\n\n if (modus !== \"model\") {\n $(\"#bb-q\").empty();\n }\n\n if (modus !== \"menu\") {\n Cases.empty();\n Models.empty();\n }\n\n if (modus === \"none\") {\n resetLogin();\n }\n\n if (modus === \"none\") {\n Mode.unset(\"hasModel\")\n .unset(\"hasNoModelsShown\")\n .unset(\"hasMenu\")\n .unset(\"hasModels\")\n .unset(\"hasCases\")\n .unset(\"hasJumplist\")\n .unset(\"hasInformationsources\")\n .unset(\"hasNoPrior\")\n .unset(\"hasNoNext\");\n }\n\n if (modus === \"menu\") {\n if (data.models && !!data.models.length) {\n Models.update(data);\n }\n if (data.cases && !!data.cases.length) {\n Cases.update(data.cases);\n }\n }\n\n if (modus === \"model\") {\n if (data.groups) {\n Validation.reset();\n $(document).trigger(\"bb:renderQuestions\", data);\n }\n Validation.setMode(); // Sets Mode\n\n $(\".bb-openattachments\").attr(\"href\", urlutils.getFiles());\n\n // if (data.informationsources){\n // runHook(\"informationsources\")(data.informationsources);\n // }\n if (data.jumplist) {\n Jumplist.type = arbitraryCoreProp(\"jumplist.type\") || \"ul\";\n Jumplist.draw(data.jumplist);\n }\n }\n}\n\n$(document).on(\"bb:handleData\", onHandleData);\n\n/**\n * Default final handler for JSON object.\n *\n * Runs after any DOM updates. Should only be used for focusing or non-UI stuff.\n *\n * Do not override (unless you know exactly what you are doing) --\n * just augment it if need be.\n *\n */\n$(document).on(\"bb:finalHandleData\", function () {\n bb.ajax.release();\n});\n\nlet returnfocusto, returnSelection;\n\nconst $document = $(document);\n\n$document.on(\"focus\", \":input\", ev => {\n const activeElement = ev.target;\n returnfocusto = activeElement.getAttribute(\"id\");\n if (activeElement.value)\n returnSelection = {\n selectionStart: 0,\n selectionEnd: activeElement.value.length,\n selectionDirection: \"forward\"\n };\n});\n\n$document.on(\"keydown\", \":input\", ev => {\n const activeElement = ev.target;\n const { selectionStart, selectionEnd, selectionDirection } = activeElement;\n returnSelection = { selectionStart, selectionEnd, selectionDirection };\n});\n\nfunction returnfocus() {\n try {\n let elt = document.querySelector(`[id=\"${returnfocusto}\"]`);\n if (elt) {\n elt.focus();\n if (elt.classList.contains(\"hasDatepicker\")) {\n $(elt).datepicker(\"widget\").hide();\n }\n let { selectionStart, selectionEnd, selectionDirection } =\n returnSelection;\n elt.setSelectionRange(selectionStart, selectionEnd, selectionDirection);\n }\n } catch (e) {\n // Checkbox throw an error that some object is not or no\n // longer usable. But how may we check?\n\n // Number inputs and such\n e.select && e.select();\n return true;\n }\n return false;\n}\n\nfunction focusHandler(event, data) {\n if (data.groups) {\n window.setTimeout(function () {\n const [grid, row] = (Ajax.row || \"\").split(\".\");\n var $input,\n focusstring = \":input:visible:enabled:not([readonly]):last\";\n if (row) {\n if (row === \"+\") {\n // Addbutton for entire grid\n $input = $(`.group [name=\"update\"][value=\"${grid}.+\"]`);\n } else {\n $input = $(\n '.group [name=\"' +\n grid +\n '\"] tbody tr:nth(' +\n row +\n \") \" +\n focusstring\n );\n // Might've been the last row - then focus the butlast one\n if (!$input.length)\n $input = $(\n '.group [name=\"' +\n grid +\n '\"] tbody tr:nth(' +\n (parseInt(row) - 1) +\n \") \" +\n focusstring\n );\n // Empty table? Focus addbutton\n if (!$input.length)\n $input = $(`.group [name=\"update\"][value=\"${grid}.+\"]`);\n }\n if ($input.length) {\n $input.trigger(\"focus\");\n }\n } else {\n // focus was lost\n if (\n both(\n complement(propEq(\"_isUpdate\", true)),\n complement(propEq(\"_direction\", \"update\"))\n )(data) ||\n (Mode.get(\"a-keyboard-user\") &&\n document.activeElement === document.body &&\n !returnfocus())\n ) {\n $(\".group.selected\").trigger(\"focus\");\n const e_group = document.querySelector(\".group.selected\");\n if (e_group === null) return;\n e_group.focus();\n if (doScrollToSelected(conf)) {\n if (e_group.previousElementSibling) {\n e_group.scrollIntoView({\n behavior: window.matchMedia(\"(prefers-reduced-motion: reduce)\")\n .matches\n ? \"auto\"\n : \"smooth\"\n });\n }\n }\n }\n }\n }, 0);\n return;\n }\n if (data.models && (!data.cases || !data.cases.length)) {\n $(\".bb-model-name:first\").trigger(\"focus\");\n $(\".bb-model.selected .bb-model-name:first\").trigger(\"focus\");\n return;\n }\n if (data.cases) {\n $(\"#bb-cases tbody .bb-case .bb-case-name:first\").trigger(\"focus\");\n return;\n }\n $(\"form#bb-login input[name=username]\").trigger(\"focus\");\n}\n\nfunction setupFocusHandler(event, data) {\n if (data.uniqueid) {\n $(document).on(\"bb:finalHandleData\", focusHandler);\n $(document).off(\"bb:finalHandleData\", setupFocusHandler);\n }\n}\n\n$(document).on(\"bb:finalHandleData\", setupFocusHandler);\n\nfunction updateDynProps(fulldata, input) {\n var data = {\n groups: fulldata.groups\n };\n $(document).trigger(\"bb:willUpdate\", fulldata);\n if (data && data.groups) {\n var group = data.groups.filter(function (group) {\n return group.current;\n })[0];\n let controls = sortControls(group.controls.slice(0), []);\n $(\n '.group [data-datatype^=\"datades:\"], .group [data-type=\"label\"]'\n ).updateControl(controls, input);\n Validation.setMode();\n }\n $(document).trigger(\"bb:hasUpdated\", fulldata);\n}\n\n$(document).on(\"bb:updated\", function (event, $widget, control, updates) {\n if (updates.indexOf(\"visible\") > -1 && control.identifier) {\n var $parent = $widget.parents(\".bb-questionlabelgroup\");\n if (control.visible) {\n $parent.attr(\"data-visible\", control.visible);\n window.setTimeout(function () {\n $parent.removeAttr(\"hidden\").attr(\"data-visible\", control.visible);\n }, 80);\n } else {\n $parent.attr(\"data-visible\", control.visible);\n window.setTimeout(function () {\n $parent.attr(\"hidden\", true);\n }, 80);\n }\n }\n});\n\n/*** DATA HANDLERS END ***/\n\n/*** VALIDATION BEGIN ***/\n\n/**\n * @Class Validation object.\n *\n */\nvar Validation = {\n /**\n * @member @private {Array} Stack of to-be-validated elemenents\n */\n _stack: [],\n /**\n * @member {Function}\n * @return undefined\n */\n reset: function () {\n this._stack = [];\n },\n /**\n * @member {Function}\n * @return {Element} Next Element eligible for validation\n */\n next: function () {\n return this._stack.pop();\n },\n /**\n * @member {Function}\n * @param {Element} el Element we want to be validated in due time\n */\n add: function (el) {\n this._stack.push(el);\n }\n};\n\n/**\n * Are all inputs valid?\n * @return {Boolean} Whether all inputs pass the test\n */\nValidation.allValid = function () {\n return (\n $.grep(\n $(\n '.group:not([disabled]) .validatable, .group:not([disabled]) [data-datatype^=\"datades:\"]'\n )\n .validate({ silent: true })\n .map(function () {\n return $(this).data(\"validated\");\n }),\n function (val) {\n return val === false;\n }\n ).length === 0\n );\n};\n\n/**\n * Update isValidated Mode\n * @return undefined\n */\nValidation.setMode = function () {\n Mode.toggle(\"isValidated\", Validation.allValid());\n};\n\n/**\n * Live Validation instructions\n */\n$(document).on(\"keyup change\", \"body.hasModel\", Validation.setMode);\n\n// Push the input just left onto the validation stack\n$(document).on(\"focusout\", \"#bb-q .group .validatable\", function () {\n var me = $(this);\n Validation.add(me[0]);\n});\n\n$.fn.extend({\n geterrorelt: function () {\n var $this = $(this);\n return $this.data(\"$error\") || $();\n },\n showValidation: function (options, ok, error) {\n var $this = $(this),\n node = $this.get(0);\n\n var errortext;\n if (error instanceof Error) errortext = error.message;\n else errortext = error;\n\n if (!document.body.contains(node)) {\n // console.log('Trying to validate unconnected', this)\n return;\n }\n $this.data(\"validated\", ok);\n\n if (!ok) {\n var $error = $this.geterrorelt(),\n $anchor = $this.is(\"input[type=checkbox]\")\n ? $this.next()\n : $this.data(\"anchor\");\n\n $this.attr(\"aria-invalid\", true);\n\n if ($error.length === 0) {\n if (!options.silent && !options.justhide) {\n $error = $(\n ``\n );\n $this.data(\"$error\", $error);\n }\n }\n // If there was already an error element, and the input is\n // still invalid but (reason and therefore) the errortext\n // has changed, change the error text shown to the user.\n if ($error.length > 0) {\n if ($error.data(\"lasterrortext\") !== errortext) {\n $error.data(\"lasterrortext\", errortext);\n $error.text(errortext);\n }\n }\n if (!options.silent && !options.justhide) {\n $this.addClass(\"error invalid\");\n // (re-)attach $error.\n $anchor.after($error);\n // This may be necessary:\n $(\"#bb-wrapmodel\").scrollTo($error);\n // Allow complicated widgets to fix stuff afterwards\n $this.trigger(\"bb:errorOn\", [errortext, $anchor, $error]);\n }\n } else {\n $this.attr(\"aria-invalid\", false);\n $this.geterrorelt().remove();\n $this.removeClass(\"error invalid\");\n $this.addClass(\"validated\");\n // Allow complicated widgets to fix stuff afterwards\n $this.trigger(\"bb:errorOff\");\n\n if (!options.silent && options.requestUpdate) {\n if (Mode.get(\"hasDynamicInterfaces\")) {\n requestDynProps(node);\n }\n }\n }\n },\n // Validate input\n // OPTIONS: silent, justhide\n validate: function (options) {\n if (!options) {\n options = {};\n }\n if (options.silent === undefined) {\n options.silent = false;\n }\n if (options.justhide === undefined) {\n options.justhide = false;\n }\n // requestUpdate needs to be false whenever validation is done\n // upon node navigation (next, skip), in order to avoid useless\n // server requests. Also, on validating for just showing errors\n // on tabbing away, we want not to request an update - that is\n // already taken care of by the onChange event\n if (options.requestUpdate === undefined) {\n options.requestUpdate = true;\n }\n\n // Argument noui says: do not update the ui (i.e. do not show nor hide any errors).\n return $(this).each(function () {\n var $this = $(this),\n ok = true,\n errortext;\n\n try {\n // Let actual validation be performed by other method.\n ok = validateInput($this);\n } catch (err) {\n ok = false;\n errortext = err;\n }\n\n return $this.showValidation(options, ok, errortext);\n });\n }\n});\n\n// Check when tabbing / clicking to new input - we want to show\n// validation while tabbing through, but not tabbing. onChange we want\n// to hide validation errors, but not show them immediately.\n$(document).on(\"focusin\", \":input\", function () {\n let validatable;\n while ((validatable = Validation.next())) {\n validatable = $(validatable);\n if ($(this).is(\":radio\")) {\n //Only validate when really outside of the radiogroup\n if (!$(this).parent(\".radiogroup\").has(validatable))\n validatable.validate({ requestUpdate: false });\n } else {\n if (validatable.get(0) != $(this).get(0))\n validatable.validate({ requestUpdate: false });\n }\n }\n});\n\n$(document).on(\n \"change\",\n \"#bb-q .group.selected :input:not(button)\",\n function () {\n var $this = $(this),\n options = { silent: false, justhide: true };\n if ($this.is(\":radio\")) {\n // validating radio???\n $this.parents(\".radiogroup\").validate(options);\n } else {\n $this.validate(options);\n }\n }\n);\n\n// Always check checkboxes onchange\n$(document).on(\"change\", \"#bb-q .group :checkbox\", function () {\n $(this).parents(\".checklist\").validate();\n});\n\nfunction debounce(func, wait, immediate) {\n var timeout;\n return function () {\n var context = this,\n args = arguments;\n var later = function () {\n timeout = null;\n if (!immediate) func.apply(context, args);\n };\n var callNow = immediate && !timeout;\n window.clearTimeout(timeout);\n timeout = window.setTimeout(later, wait);\n if (callNow) func.apply(context, args);\n };\n}\n\nconst eltControltype = compose(prop(\"controltype\"), getControl);\n\nconst doChangeOnKeyDown = elt => {\n const setting = path([\"arbitrary\", \"core\", \"update-on-typing\"])(conf);\n return (\n setting === \"always\" ||\n (setting instanceof Array && includes(eltControltype(elt), setting))\n );\n};\n\nfunction keyDown() {\n if (doChangeOnKeyDown(this)) $(this).data(\"valBefore\", $(this).val());\n}\n\n$(document).on(\n \"keydown\",\n \"#bb-q .group.selected :input:not(button)\",\n debounce(keyDown, 32, true)\n);\n\n$(document).on(\n \"keyup\",\n \"#bb-q .group.selected :input:not(button)\",\n function () {\n if (doChangeOnKeyDown(this)) {\n var $this = $(this),\n before = $this.data(\"valBefore\"),\n val = $this.val();\n if (before !== undefined && before !== val) {\n $this.trigger(\"change\");\n $this.removeData(\"valBefore\");\n }\n }\n }\n);\n/*** VALIDATION END ***/\n\n/*** HINTS, TOOLTIPS BEGIN ***/\n// Move to plugin core:tooltips\n/*** HINTS, TOOLTIPS END ***/\n\n/*** RENDERING 'ENGINE' BEGIN ***/\nconst doScrollToSelected = compose(\n val => val !== false,\n path([\"arbitrary\", \"core\", \"scrollToSelectedGroup\"])\n);\nconst setDynamicMode = tap(\n group =>\n group.current && Mode.toggle(\"hasDynamicInterfaces\", Boolean(group.dynamic))\n);\n\n/**\n * Render questions / labels (i.o.w. the main interaction\n * interface) This function is only called when there are actually\n * screens in need of rendering. Therefore, it need not check the JSON\n * object\n *\n * @param ev {Event} The event that triggered this function\n * @param data {Object} 'JSON'-object conforming to BB JSON API.\n */\nfunction renderGroups(ev, data) {\n // Save previous id\n var previd = $(\"#bb-q\" + \" .group.selected\").data(\"groupid\"),\n groups = data.groups,\n $bbq = $(\"#bb-q\");\n\n // Begin -- Only update what is new or was .selected before! There\n // is a problem with $.ajax calls when fast-clicking => therefore\n // step has {async: false}\n //\n // FIXME: when user press next, while\n // there is no next, a node too many is inserted. This can be\n // fixed now the server passes along the node id of a group.\n\n groups.forEach(setGroupTitle);\n if (![\"open\", \"exit\"].includes(Ajax.direction) && mustUpdate(conf)) {\n // Prepare DOM -- remove unneeded or to be re-rendered .groups\n for (let group of document.querySelectorAll(\".group\")) {\n if (complement(any(propEq(\"groupid\", group.dataset[\"gid\"])))(groups)) {\n // Remove a group if not in response\n group.parentNode.removeChild(group);\n } else if (Ajax.row && group.dataset[\"gid\"] === Ajax.groupid) {\n // When adding/deleting rows, safe the space where the group\n // was (entire group will be re-rendered)\n const gob = find(propEq(\"groupid\", group.dataset[\"gid\"]))(groups);\n const tempNode = document.createComment(\"group\");\n group.parentNode.replaceChild(tempNode, group);\n gob._tempNode = tempNode;\n }\n }\n compose(\n map(\n compose(\n ifElse(\n ({ groupid }) =>\n document.querySelector(`.group[data-gid=\"${groupid}\"]`),\n group => {\n updateDynProps({\n groups: [{ current: true, controls: group.controls }]\n });\n const elt = document.querySelector(\n `.group[data-gid=\"${group.groupid}\"]`\n );\n setSelectedStateAttributes(elt, group);\n },\n renderGroup\n ),\n setDynamicMode\n )\n ),\n sortGroups\n )(groups);\n } else {\n // Always remove .selected:\n $(\".group.selected\", $bbq).remove();\n if (Ajax.direction == \"next\" && groups.length > 1) {\n // Re-render only previous group and current group\n groups = groups.filter(function (group) {\n return group.current || group.groupid === previd;\n });\n } else if (\n Ajax.direction == \"prior\" &&\n $(\"#bb-q .group\").length > 0 &&\n groups.length > 1\n ) {\n // Re-render only current group\n groups = groups.filter(function (group) {\n return group.current;\n });\n } else $bbq.empty();\n // End -- Only update what is new!\n\n $bbq.hide();\n compose(map(compose(renderGroup, setDynamicMode)), sortGroups)(groups);\n }\n $bbq.attr(\"lang\", data.modellanguage).show();\n\n // Old questionlabelgroup plugin:\n if (!doGrouping(conf)) {\n (bb.questionlabelgroup || questionlabelgroup)();\n\n $('.bb-questionlabelgroup:has([data-datatype][data-visible=\"false\"])').attr(\n {\n \"data-visible\": false,\n \"hidden\": true\n }\n );\n }\n}\n\nfunction sortGroups(groups) {\n // Fix insertion order\n return groups.sort(function (a, b) {\n return a.order - b.order;\n });\n}\n\nfunction sortControls(a, b) {\n if (!a[0]) return b.reverse();\n var ac = a.shift(),\n bc = b[0];\n if (\n bc &&\n ac.controltype === \"label\" &&\n !ac.datatype && // Label with a datatype is a text interface\n bc._sorted === undefined &&\n bc.controltype !== \"label\" &&\n (bc.controltype !== \"linklabel\" || bc.isreport) &&\n bc.controltype !== \"checkbox\"\n ) {\n // Reverse input with label\n b.shift();\n bc._sorted = true; // Instruct next recursion not to touch the control\n if (has(\"notnull\", bc)) ac.isForNotNull = bc.notnull;\n if (has(\"readonly\", bc)) ac.readonly = bc.readonly;\n ac.dynamic = bc.dynamic = /^datades:/.test(bc.datatype);\n ac.metadata = Object.assign({}, bc.metadata, ac.metadata);\n bc.meta = bc.meta || {}; // Associate input with label\n bc.meta.label = (ac.value || \"\").trim();\n bc.aria = bc.aria || {}; // Associate input with label\n if (bc.notnull) bc.aria.required = true;\n if (ac.notnull) ac.aria.required = true;\n // Associate input (group) with label.\n if (\n [\"radio\", \"checkmultilist\", \"listbox\", \"multilist\"].includes(\n bc.controltype\n )\n ) {\n if (bb.conf.a11y.optionfieldsets) {\n ac.controltype = \"legend\";\n ac.className = \"bb-label\";\n } else {\n bc.aria.labelledby = ac.id;\n }\n } else if (bc.controltype === \"grid\") {\n if (bb.conf.a11y.captions) {\n ac.controltype = \"caption\";\n bc.caption = ac;\n } else {\n bc.aria.labelledby = ac.id;\n }\n } else {\n ac.isFor = bc.id;\n }\n return sortControls(a, [bc, ac].concat(b));\n } else {\n if (\n bc &&\n ac.controltype === \"label\" &&\n !ac.datatype && // Label with a datatype is a text interface\n bc.controltype === \"checkbox\"\n ) {\n ac.isFor = bc.id; // Associate label with checkbox (that comes before)\n if (has(\"notnull\", bc)) ac.isForNotNull = bc.notnull;\n if (has(\"readonly\", bc)) ac.readonly = bc.readonly;\n ac.dynamic = /^datades:/.test(bc.datatype);\n ac.metadata = Object.assign({}, bc.metadata, ac.metadata);\n bc.meta = bc.meta || {}; // Associate input with label\n bc.meta.label = (ac.value || \"\").trim();\n bc.aria = bc.aria || {};\n if (bc.notnull) bc.aria.required = true;\n if (ac.notnull) ac.aria.required = true;\n }\n return sortControls(a, [ac].concat(b));\n }\n}\n\nfunction setGroupTitle(group) {\n var controls = group.controls;\n // It's a title, if:\n // there are two 1st is label Not a 'text' interface 1st doesnt control any\n if (\n controls[1] &&\n controls[0].controltype === \"label\" &&\n !controls[0].datatype &&\n !controls[0].isfor\n ) {\n controls[0].controltype = \"legend\";\n group.screentitle = controls[0].value;\n }\n}\n\nconst setSelectedStateAttributes = (elt, group) => {\n elt.classList.toggle(\"selected\", group.current);\n elt.classList.toggle(\"unselected\", !group.current);\n if (group.current || canEditEarlier(conf)) {\n elt.removeAttribute(\"aria-hidden\");\n elt.removeAttribute(\"disabled\");\n } else {\n elt.setAttribute(\"aria-hidden\", true);\n elt.setAttribute(\"disabled\", \"disabled\");\n }\n};\n\nconst hasStatusRole = pathEq([\"metadata\", \"role\"], \"status\");\n\nfunction renderGroup(group) {\n var controls = group.controls,\n wGroup = $(\n '
      \"\n );\n\n // If this has a dupe, first remove the old one:\n $(\".group\").each(function () {\n if ($(this).data(\"groupid\") === group.groupid) $(this).remove();\n });\n\n const elt = wGroup.get(0);\n elt.dataset[\"gid\"] = group[\"groupid\"];\n wGroup.data(\"groupid\", group[\"groupid\"]);\n\n controls = sortControls(controls.slice(0), []);\n\n if (doGrouping(conf)) controls = groupOuter(controls);\n\n $(controls).each(function (i, c) {\n if (doGrouping(conf)) {\n elt.appendChild(createFormGroup(wControl, group, 1)(c));\n } else wControl(c, group, elt);\n });\n\n elt.classList.add(\"bb-screenmode-\" + group.screenmode);\n elt.setAttribute(\"data-node\", group.name);\n if (!bb.getVar(\"wrongOrder\")) elt.setAttribute(\"data-bb:order\", group.order);\n\n setSelectedStateAttributes(elt, group);\n\n if (group._tempNode) {\n group._tempNode.parentNode.replaceChild(elt, group._tempNode);\n delete group._tempNode;\n } else {\n if (group.screenmode == \"addtop\") $(\"#bb-q\").prepend(elt);\n else $(\"#bb-q\").append(elt);\n }\n}\n\n/**\n * Wrap questions + accompanying labels in a single group\n *\n * This function may be overriden by assigning a function to bb.questionlabelgroup\n * @see Plugin questionlabelgroup-ng\n *\n * @return undefined\n */\nfunction questionlabelgroup() {\n $(\".group:not(:has(.bb-questionlabelgroup))>.bb-label\").each(function () {\n var $this = $(this);\n var input = $this.next(\n \":not(label):not(a):not([type=checkbox]):not(img):not(.clearfix)\"\n );\n var itype = input.data(\"type\");\n var questionandlabel = $this.add(input);\n\n if (questionandlabel.length > 1)\n questionandlabel.wrapAll(\n '
      '\n );\n else {\n questionandlabel = $this.prev(\"[type=checkbox]\").add(this);\n if (questionandlabel.length > 1)\n questionandlabel.wrapAll(\n '
      '\n );\n }\n questionandlabel\n .parent(\".bb-questionlabelgroup\")\n .append('
      ');\n $.each(\n questionandlabel.parent(\".bb-questionlabelgroup\").find(\"[data-type]\"),\n function () {\n var $this = $(this);\n if ($this.attr(\"class\")) {\n var classname = $this.attr(\"class\").match(/\\bbbm-[a-z0-9-]+\\b/);\n if (classname) {\n classname = classname[0].replace(/\\bbbm-/, \"bb-g-\");\n $this.parents(\".bb-questionlabelgroup\").addClass(classname);\n }\n }\n }\n );\n });\n}\n\n/*** RENDERING 'ENGINE' END ***/\n\n/*** 'COMPLEX' WIDGET BEHAVIOUR BEGIN ***/\n\n/**\n * Radiogroup and checklist enhancements\n */\n\n$(document)\n .on(\"change programmatically-changed\", \".bb-option\", function (ev) {\n var $this = $(this);\n $this.toggleClass(\"checked\", ev.target.checked);\n if (ev.target.type === \"radio\" && ev.target.checked) {\n $this.siblings().removeClass(\"checked\");\n }\n })\n .on(\"focus\", \".bb-option\", function (ev) {\n $(this).addClass(\"focus\");\n if (ev.target.type === \"radio\") {\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n }\n return true;\n })\n .on(\"blur\", \".bb-option\", function () {\n $(this).removeClass(\"focus\");\n })\n .on(\n \"keydown\",\n \".radiogroup .bb-option\",\n // Fix the odd default behaviour of selecting upon focus\n function (ev) {\n var $other,\n chars = [37, 38, 39, 40],\n // left, up, right, down\n idx = chars.indexOf(ev.keyCode);\n if (idx === -1) return true;\n\n $other =\n idx < 2 // 'prev' chars\n ? $(this).prev().find('input[type=\"radio\"]')\n : $(this).next().find('input[type=\"radio\"]');\n\n // At beginning or end... go around (Edge selects otherwise...).\n if (!$other.length) {\n $other =\n idx < 2 // 'prev' chars\n ? $(this).siblings().last().find('input[type=\"radio\"]')\n : $(this).siblings().first().find('input[type=\"radio\"]');\n }\n if ($other.length) {\n $other.trigger(\"focus\");\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n }\n return true;\n }\n );\n\n/*** 'COMPLEX' WIDGET BEHAVIOUR END ***/\n\n/*** LINKS BEGIN ***/\n\n/**\n * Original code moved to plugin rewrite-links\n *\n */\n\n/*** LINKS END ***/\n\n/*** TOKENCHANNEL BEGIN ***/\n\n$(document).on(\"bb:preHandleData\", (_, data) => {\n if (has(\"uniqueid\", data)) {\n token.setToken(prop(\"uniqueid\", data));\n }\n});\n\n$(document).on(\"bb:preHandleData\", (_, data) => {\n // document.body.dispatchEvent(new customEvent(\"bb:storeToken\", { bubbles: true, })\n if (has(\"uniqueid\", data)) {\n token.setToken(prop(\"uniqueid\", data));\n }\n});\n\n$(document).on(\"bb:mode:isLoggedIn\", (_event, bool) => {\n if (!bool) {\n token\n .getHash()\n .then(tokenHash => token.postMessage({ tokenHash, type: \"loggedOut\" }));\n }\n});\n\ntoken.addEventListener(\"message\", message => {\n token.getHash().then(hash => {\n if (message.data.tokenHash === hash) {\n if (message.data.type === \"loggedOut\") window.close() || logout();\n }\n });\n});\n\n/*** TOKENCHANNEL END ***/\n\n/*** EXPORTS BEGIN ***/\n\nbb.escapeHTML = escapeHTML;\nbb.exit = exit;\nbb.deleteCase = deleteCase;\nbb.logout = logout;\nbb.menu = menu;\n\nbb.authenticate = token => Vars.setVars({ uniqueid: token });\nbb.newcase = newcase;\nbb.step = step;\nbb.restart = function restart() {\n newcase(Vars.getVar(\"dbname\"));\n};\nbb.rewind = function rewind(cb, options) {\n step(\"rewind\", cb, options);\n};\nbb.update = function update(cb, options) {\n step(\"update\", cb, options);\n};\nbb.updatemis = function updatemis(options) {\n step(\"updatemis\", $.noop, options);\n};\nbb.next = function next(cb, options) {\n step(\"next\", cb, options);\n};\nbb.prior = function prior(cb, options) {\n step(\"prior\", cb, options);\n};\nbb.skip = function skip(cb, options) {\n step(\"skip\", cb, options);\n};\nbb.gotonode = function gotonode(groupid, cb, options = null) {\n step(\"gotonode\", cb, Object.assign({}, { groupid }, options));\n};\nbb.runtonode = function runtonode(nodename, cb) {\n step(\"runtonode\", cb, { fullnodename: nodename });\n};\nbb.getVar = Vars.getVar;\nbb.notify = notify.bind(null, {});\nbb.ajax = {\n replace: Ajax.replace,\n busy: function () {\n return Ajax.busy;\n },\n release: Ajax.release,\n post: Ajax.post,\n direction: function () {\n return Ajax.direction;\n }\n};\nbb.URL = urlutils;\nbb.Numerals = Numerals;\nbb.Plugins = bb.Plugins || {};\nbb.Validation = Validation;\nbb.positionalFormat = positionalFormat;\nbb.humanDate = humanDate;\nbb.propFinder = propFinder;\nbb.requestDynProps = requestDynProps;\n// Window-export some stuff used in bookmarklets.\nwindow.bb = {\n restart: bb.restart,\n getVar: bb.getVar,\n requestDynProps: bb.requestDynProps,\n Mode,\n menu\n};\n\n/*** EXPORTS END ***/\n\nexport { bb, _, _ as gt };\n","/**\n * https://github.com/flesler/jquery.scrollTo\n * Copyright (c) 2007-2013 Ariel Flesler - afleslergmailcom | http://flesler.blogspot.com\n * Dual licensed under MIT and GPL.\n * @author Ariel Flesler\n * @version 1.4.6\n */\n(function ($) {\n var h = ($.scrollTo = function (a, b, c) {\n $(window).scrollTo(a, b, c);\n });\n h.defaults = {\n axis: \"xy\",\n duration: parseFloat($.fn.jquery) >= 1.3 ? 0 : 1,\n limit: true\n };\n h.window = function (a) {\n return $(window)._scrollable();\n };\n $.fn._scrollable = function () {\n return this.map(function () {\n var a = this,\n isWin =\n !a.nodeName ||\n $.inArray(a.nodeName.toLowerCase(), [\n \"iframe\",\n \"#document\",\n \"html\",\n \"body\"\n ]) != -1;\n if (!isWin) return a;\n var b = (a.contentWindow || a).document || a.ownerDocument || a;\n return /webkit/i.test(navigator.userAgent) || b.compatMode == \"BackCompat\"\n ? b.body\n : b.documentElement;\n });\n };\n $.fn.scrollTo = function (e, f, g) {\n if (typeof f == \"object\") {\n g = f;\n f = 0;\n }\n if (typeof g == \"function\") g = { onAfter: g };\n if (e == \"max\") e = 9e9;\n g = $.extend({}, h.defaults, g);\n f = f || g.duration;\n g.queue = g.queue && g.axis.length > 1;\n if (g.queue) f /= 2;\n g.offset = both(g.offset);\n g.over = both(g.over);\n return this._scrollable()\n .each(function () {\n if (e == null) return;\n var d = this,\n $elem = $(d),\n targ = e,\n toff,\n attr = {},\n win = $elem.is(\"html,body\");\n switch (typeof targ) {\n case \"number\":\n case \"string\":\n if (/^([+-]=?)?\\d+(\\.\\d+)?(px|%)?$/.test(targ)) {\n targ = both(targ);\n break;\n }\n targ = $(targ, this);\n if (!targ.length) return;\n case \"object\":\n if (targ.is || targ.style) toff = (targ = $(targ)).offset();\n }\n $.each(g.axis.split(\"\"), function (i, a) {\n var b = a == \"x\" ? \"Left\" : \"Top\",\n pos = b.toLowerCase(),\n key = \"scroll\" + b,\n old = d[key],\n max = h.max(d, a);\n if (toff) {\n attr[key] = toff[pos] + (win ? 0 : old - $elem.offset()[pos]);\n if (g.margin) {\n attr[key] -= parseInt(targ.css(\"margin\" + b)) || 0;\n attr[key] -= parseInt(targ.css(\"border\" + b + \"Width\")) || 0;\n }\n attr[key] += g.offset[pos] || 0;\n if (g.over[pos])\n attr[key] += targ[a == \"x\" ? \"width\" : \"height\"]() * g.over[pos];\n } else {\n var c = targ[pos];\n attr[key] =\n c.slice && c.slice(-1) == \"%\" ? (parseFloat(c) / 100) * max : c;\n }\n if (g.limit && /^\\d+$/.test(attr[key]))\n attr[key] = attr[key] <= 0 ? 0 : Math.min(attr[key], max);\n if (!i && g.queue) {\n if (old != attr[key]) animate(g.onAfterFirst);\n delete attr[key];\n }\n });\n animate(g.onAfter);\n function animate(a) {\n $elem.animate(\n attr,\n f,\n g.easing,\n a &&\n function () {\n a.call(this, targ, g);\n }\n );\n }\n })\n .end();\n };\n h.max = function (a, b) {\n var c = b == \"x\" ? \"Width\" : \"Height\",\n scroll = \"scroll\" + c;\n if (!$(a).is(\"html,body\")) return a[scroll] - $(a)[c.toLowerCase()]();\n var d = \"client\" + c,\n html = a.ownerDocument.documentElement,\n body = a.ownerDocument.body;\n return Math.max(html[scroll], body[scroll]) - Math.min(html[d], body[d]);\n };\n function both(a) {\n return typeof a == \"object\" ? a : { top: a, left: a };\n }\n})(jQuery);\n","/* global $ */\nimport { getWidget } from \"./form-widgets.js\";\nimport {\n always,\n assoc,\n either,\n tap,\n cond,\n path,\n propEq,\n T\n} from \"./functional.js\";\nimport { _ } from \"./gettext.js\";\nimport { format, formatPlus } from \"./text-utils.js\";\nimport { listtypes } from \"./types.js\";\nimport { compose } from \"./functional.js\";\nimport { quotable } from \"./quotable.js\";\n\n// Validate actual input, return true if it's ok, throw an error otherwise.\nexport function validateInput(node) {\n const $node = $(node),\n control = $node.data(\"control\");\n let ok = true,\n re,\n errortext,\n val,\n category;\n\n if (control === undefined) {\n throw \"Not a BB widget\";\n }\n\n if (control.visible === false) {\n return true;\n }\n category = listtypes[control.controltype];\n\n val = $node.val();\n\n if (control.stringmask) {\n re = new RegExp(control.stringmask);\n if (!re.test(val))\n throw format(\n control.errortext,\n compose(assoc(\"value\", val), quotable)(control)\n );\n }\n if (control.notnull) {\n if (category === \"LIST\") {\n ok = $node.is(\":has(:checked)\");\n } else if (category === \"BOX\") {\n // There could be a faux, checked, option telling us to\n // fill in the field. That is the second check here.\n ok = val !== null && val !== \"\";\n } else if (control.controltype == \"checkbox\") {\n ok = $node.is(\":checked\");\n } else if (control.controltype === \"grid\") {\n if (control.addallowed === false) {\n const checkable = control.columns.find(\n either(\n propEq(\"controltype\", \"radiobutton\"),\n propEq(\"controltype\", \"checkbox\")\n )\n );\n if (checkable) {\n ok = $node.is(\":has(:checked)\");\n }\n } else {\n // A required grid should have at least one row.\n // But if no rows **can** be added it would be rude and confusing to complain to the end-user.\n ok = control.value.length > 0 || control.addallowed === false;\n }\n } else {\n re = /\\S/;\n ok = re.test(val);\n }\n if (!ok) {\n throw cond([\n [path([\"metadata\", \"errrequired\"]), path([\"metadata\", \"errrequired\"])],\n [\n propEq(\"controltype\", \"datetimepicker\"),\n compose(c => formatPlus(_(\"Date required\"), c), quotable)\n ],\n [\n always([\"BOX\", \"LIST\"].indexOf(category) > -1),\n compose(c => format(_(\"Choice required\"), c), quotable)\n ],\n [T, compose(c => format(_(\"Field required\"), c), quotable)]\n ])(control);\n }\n }\n if (control.maxlength && control.maxlength > 0) {\n ok = val.length <= control.maxlength;\n if (!ok) {\n throw format(\n path([\"metadata\", \"errtexttoolong\"])(control) ||\n _(\"Text length exceeds the maximum of {maxlength} characters\"),\n quotable(control)\n );\n }\n }\n if (getWidget(control.controltype).validate) {\n return getWidget(control.controltype).validate(control, val);\n }\n return true;\n}\n","/* a11y-describedby:\n *\n * - Describe group with all its standard remarks\n * - Describe input by any non-standard remark labels directly\n * preceding it\n *\n * Author: Niels Giesen\n * Copyright 2016 Berkeley Bridge\n *\n */\nimport { tap, when, compose, prop, path, find } from \"$json/lib/functional\";\n\n$(document).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.groups) {\n $.each(data.groups, function (_, group) {\n var remarks = [],\n pretexts = [];\n $.each(group.controls, function (idx, control) {\n if (control[\"font-class\"].toLowerCase() === \"standard remark\") {\n remarks.push(control.id);\n } else if (control.datatype && control.controltype === \"label\") {\n pretexts.push(control.id);\n }\n const explicitId = path([\"metadata\", \"describedby\"], control);\n if (explicitId) {\n compose(\n when(\n Boolean,\n compose(id => pretexts.push(id), prop(\"id\"))\n ),\n find(c => c.identifier && c.identifier.endsWith(`.${explicitId}`)),\n prop(\"controls\")\n )(group);\n }\n if (control.datatype && control.controltype !== \"label\") {\n maybeSetDescription(control, pretexts);\n pretexts = [];\n }\n });\n maybeSetDescription(group, remarks);\n });\n }\n});\n\nfunction maybeSetDescription(thing, description_ids) {\n if (description_ids.length) {\n thing.aria = thing.aria || {};\n thing.aria.describedby = description_ids.join(\" \");\n }\n}\n","import { _ } from \"$json\";\n\nconst DICTIONARY = {\n \"close this infomation box\": {\n \"en\": \"close this infomation box\",\n \"nl\": \"sluit dit informatievak\",\n \"en-GB\": \"close this infomation box\"\n },\n \"Send link popup\": {\n \"en\": \"Send link popup\",\n \"nl\": \"Pop-up voor koppeling verzenden\",\n \"en-GB\": \"Send link popup\"\n }\n};\n\n_.addTranslations(DICTIONARY);\n\nclass Listener {\n constructor(id) {\n this[id] = event => {\n if (event.isComposing || event.keyCode !== 27) {\n return;\n } else {\n // No need to be specific, just destroy the most recent one.\n Array.from(document.querySelectorAll(\".p-dialogue-container\"))\n .pop()\n .click();\n }\n };\n }\n}\n\nexport default class Dialogue {\n constructor(props = {}, parent) {\n this.id = `dialogue-${Date.now()}-${Math.floor(Math.random() * 10000)}`;\n this.parent =\n parent !== undefined && typeof parent === \"object\" && \"nodeType\" in parent\n ? parent\n : document.getElementsByTagName(\"body\")[0];\n this.elemprops = props;\n this.rtnfocus = document.children[0];\n }\n\n destroy(human = true) {\n let me = document.getElementById(this.id);\n if (me) this.parent.removeChild(me);\n\n // Remove keyup listener\n this.handler &&\n document.removeEventListener(`keyup`, this.handler[this.id], false);\n\n // Untrap focus\n document.querySelectorAll(\"[data-hushed-by-dialogue]\").forEach(elem => {\n let prev = elem.getAttribute(\"data-previous-tabindex\");\n elem.removeAttribute(\"tabindex\");\n if (prev !== \"none\") {\n elem.setAttribute(\"tabindex\", prev);\n }\n elem.removeAttribute(\"data-previous-tabindex\");\n elem.removeAttribute(\"data-hushed-by-tabindex\");\n });\n\n // Unhide ARIA\n document\n .querySelectorAll(\"[data-aria-hidden-by-dialogue]\")\n .forEach(elem => {\n let prev = elem.getAttribute(\"data-previous-aria\");\n elem.removeAttribute(\"aria-hidden\");\n if (prev !== \"none\") {\n elem.setAttribute(\"aria-hidden\", prev);\n }\n elem.removeAttribute(\"data-previous-aria\");\n elem.removeAttribute(\"data-aria-hidden-by-dialogue\");\n });\n\n // Return focus, but not if this was called by the render method,\n // otherwise we will override the activeElement with the initial\n // rtnfocus value (document.children[0])\n human && this.rtnfocus.focus();\n }\n\n render(elem) {\n // Remove dialogue if it already exists.\n this.destroy(false);\n\n // Remove all other focusable elements from tabindex on the DOM,\n // so we can truly trap the focus for all users w/o trapping\n // keyboard user out of the browser controls.\n document\n .querySelectorAll(\n \"a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]\"\n )\n .forEach(elem => {\n elem.setAttribute(\"data-hushed-by-dialogue\", true);\n elem.setAttribute(\n \"data-previous-tabindex\",\n elem.getAttribute(\"tabindex\") || \"none\"\n );\n elem.setAttribute(\"tabindex\", \"-1\");\n });\n\n // ARIA hide everything to avoid screen readers keyboard\n // shortcuts gaining access outside of the dialogue.\n document.querySelectorAll(\"*:not(body):not(html)\").forEach(elem => {\n elem.setAttribute(\"data-aria-hidden-by-dialogue\", true);\n elem.setAttribute(\n \"data-previous-aria\",\n elem.getAttribute(\"aria-hidden\") || \"none\"\n );\n elem.setAttribute(\"aria-hidden\", \"true\");\n });\n\n // Create elements.\n let container = document.createElement(\"div\");\n container.className = \"p-dialogue-container\";\n container.style.cssText = `\n background-color: rgba(0,0,0,.5);\n height: 100%;\n left: 0;\n position: fixed;\n text-align: center;\n top: 0;\n width: 100%;\n z-index: 100;\n `;\n container.id = this.id;\n container.setAttribute(\"role\", \"dialog\");\n // container.setAttribute(\"aria-label\", \"dialog\"); // BAD A11Y - more accessible label should be given by class caller.\n Object.keys(this.elemprops).forEach(prop => {\n prop === \"class\"\n ? (container.className += \" \" + this.elemprops[prop])\n : container.setAttribute(prop, this.elemprops[prop]);\n });\n container.addEventListener(\"click\", e => {\n this.destroy();\n });\n\n let inner = document.createElement(\"div\");\n inner.className = \"inner\";\n inner.style.cssText = `\n display: inline-block;\n margin: 10vh 25px auto 25px;\n overflow: auto;\n `;\n inner.addEventListener(\"click\", e => {\n e.stopPropagation();\n });\n\n let closer = document.createElement(\"button\");\n let x = document.createTextNode(\"+\");\n closer.append(x);\n closer.className = \"dialogue-close\";\n closer.style.cssText = `\n font-size: 2.2rem;\n line-height: 1.2rem;\n padding: 5px;\n position: absolute;\n right: 5px;\n top: 5px;\n transform-origin: top;\n transform: rotate(45deg);\n `;\n closer.addEventListener(\"click\", e => this.destroy());\n closer.setAttribute(\"aria-label\", _(\"close this infomation box\"));\n\n // Add to DOM\n inner.appendChild(closer);\n inner.appendChild(elem);\n container.appendChild(inner);\n this.parent.appendChild(container);\n\n // Set the rtnfocus, then focus inside dialogue.\n this.rtnfocus = document.activeElement;\n closer.focus();\n\n this.handler = new Listener(this.id);\n\n document.addEventListener(`keyup`, this.handler[this.id], false);\n }\n}\n","/* array.groupby:\n *\n * Extend Array prototype with _groupby(function) method.\n *\n * Author: Niels Giesen\n * Copyright 2016 Berkeley Bridge\n *\n */\nArray.prototype._groupby = function (hash) {\n var _hash = hash\n ? hash\n : function (o) {\n return o;\n };\n\n var _map = {};\n var put = function (map, key, value) {\n if (!map[_hash(key)]) {\n map[_hash(key)] = [];\n }\n map[_hash(key)].push(value);\n };\n\n this.map(function (obj) {\n put(_map, obj, obj);\n });\n\n var out = [];\n for (var key in _map) {\n out.push(_map[key]);\n }\n return out;\n};\n","/* asterisk:\n *\n * Add asterisk to labels for required fields\n *\n * Author: Niels Giesen\n * Copyright 2015 Berkeley Bridge\n *\n */\n(function ($, win, doc) {\n function appendAsterisk(child) {\n if (child.nodeType === 3 /* Node.TEXT_NODE */) {\n var val = child.nodeValue,\n space = \"\",\n words = val.split(\" \"),\n lastword = words.pop();\n // json.js adds a space for visual purposes\n if (lastword === \"\") {\n space = \" \";\n lastword = words.pop();\n }\n child.nodeValue = words.join(\" \");\n child.parentNode.insertAdjacentHTML(\n \"beforeEnd\",\n ' ' +\n lastword +\n ` *` +\n \"\" +\n space\n );\n } else if (child.nodeType === 1 /* Node.ELEMENT_NODE */) {\n if (child.lastChild) appendAsterisk(child.lastChild);\n }\n }\n\n $(doc).on(\"bb:updated\", function (event, $widget, control, updates) {\n if (updates.indexOf(\"isForNotNull\") > -1) {\n if (control.isForNotNull) {\n appendAsterisk($widget.get(0).lastChild);\n } else {\n const $stick = $widget.find(\".bb-p-asterisk-stick\");\n if (!$stick.get(0)) return;\n $stick.find(\"sup\").remove();\n const textnode = $stick.get(0).childNodes[0];\n if (textnode) $(textnode).unwrap();\n }\n }\n });\n})(jQuery, window, document);\n","/*!\n * mustache.js - Logic-less {{mustache}} templates with JavaScript\n * http://github.com/janl/mustache.js\n */\n\n/*global define: false Mustache: true*/\n\nfunction mustacheFactory(mustache) {\n var objectToString = Object.prototype.toString;\n var isArray =\n Array.isArray ||\n function isArrayPolyfill(object) {\n return objectToString.call(object) === \"[object Array]\";\n };\n\n function isFunction(object) {\n return typeof object === \"function\";\n }\n\n /**\n * More correct typeof string handling array\n * which normally returns typeof 'object'\n */\n function typeStr(obj) {\n return isArray(obj) ? \"array\" : typeof obj;\n }\n\n function escapeRegExp(string) {\n return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\");\n }\n\n /**\n * Null safe way of checking whether or not an object,\n * including its prototype, has a given property\n */\n function hasProperty(obj, propName) {\n return obj != null && typeof obj === \"object\" && propName in obj;\n }\n\n // Workaround for https://issues.apache.org/jira/browse/COUCHDB-577\n // See https://github.com/janl/mustache.js/issues/189\n var regExpTest = RegExp.prototype.test;\n function testRegExp(re, string) {\n return regExpTest.call(re, string);\n }\n\n var nonSpaceRe = /\\S/;\n function isWhitespace(string) {\n return !testRegExp(nonSpaceRe, string);\n }\n\n var entityMap = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n \"/\": \"/\",\n \"`\": \"`\",\n \"=\": \"=\"\n };\n\n function escapeHtml(string) {\n return String(string).replace(/[&<>\"'`=\\/]/g, function fromEntityMap(s) {\n return entityMap[s];\n });\n }\n\n var whiteRe = /\\s*/;\n var spaceRe = /\\s+/;\n var equalsRe = /\\s*=/;\n var curlyRe = /\\s*\\}/;\n var tagRe = /#|\\^|\\/|>|\\{|&|=|!/;\n\n /**\n * Breaks up the given `template` string into a tree of tokens. If the `tags`\n * argument is given here it must be an array with two string values: the\n * opening and closing tags used in the template (e.g. [ \"<%\", \"%>\" ]). Of\n * course, the default is to use mustaches (i.e. mustache.tags).\n *\n * A token is an array with at least 4 elements. The first element is the\n * mustache symbol that was used inside the tag, e.g. \"#\" or \"&\". If the tag\n * did not contain a symbol (i.e. {{myValue}}) this element is \"name\". For\n * all text that appears outside a symbol this element is \"text\".\n *\n * The second element of a token is its \"value\". For mustache tags this is\n * whatever else was inside the tag besides the opening symbol. For text tokens\n * this is the text itself.\n *\n * The third and fourth elements of the token are the start and end indices,\n * respectively, of the token in the original template.\n *\n * Tokens that are the root node of a subtree contain two more elements: 1) an\n * array of tokens in the subtree and 2) the index in the original template at\n * which the closing tag for that section begins.\n */\n function parseTemplate(template, tags) {\n if (!template) return [];\n\n var sections = []; // Stack to hold section tokens\n var tokens = []; // Buffer to hold the tokens\n var spaces = []; // Indices of whitespace tokens on the current line\n var hasTag = false; // Is there a {{tag}} on the current line?\n var nonSpace = false; // Is there a non-space char on the current line?\n\n // Strips all whitespace tokens array for the current line\n // if there was a {{#tag}} on it and otherwise only space.\n function stripSpace() {\n if (hasTag && !nonSpace) {\n while (spaces.length) delete tokens[spaces.pop()];\n } else {\n spaces = [];\n }\n\n hasTag = false;\n nonSpace = false;\n }\n\n var openingTagRe, closingTagRe, closingCurlyRe;\n function compileTags(tagsToCompile) {\n if (typeof tagsToCompile === \"string\")\n tagsToCompile = tagsToCompile.split(spaceRe, 2);\n\n if (!isArray(tagsToCompile) || tagsToCompile.length !== 2)\n throw new Error(\"Invalid tags: \" + tagsToCompile);\n\n openingTagRe = new RegExp(escapeRegExp(tagsToCompile[0]) + \"\\\\s*\");\n closingTagRe = new RegExp(\"\\\\s*\" + escapeRegExp(tagsToCompile[1]));\n closingCurlyRe = new RegExp(\n \"\\\\s*\" + escapeRegExp(\"}\" + tagsToCompile[1])\n );\n }\n\n compileTags(tags || mustache.tags);\n\n var scanner = new Scanner(template);\n\n var start, type, value, chr, token, openSection;\n while (!scanner.eos()) {\n start = scanner.pos;\n\n // Match any text between tags.\n value = scanner.scanUntil(openingTagRe);\n\n if (value) {\n for (var i = 0, valueLength = value.length; i < valueLength; ++i) {\n chr = value.charAt(i);\n\n if (isWhitespace(chr)) {\n spaces.push(tokens.length);\n } else {\n nonSpace = true;\n }\n\n tokens.push([\"text\", chr, start, start + 1]);\n start += 1;\n\n // Check for whitespace on the current line.\n if (chr === \"\\n\") stripSpace();\n }\n }\n\n // Match the opening tag.\n if (!scanner.scan(openingTagRe)) break;\n\n hasTag = true;\n\n // Get the tag type.\n type = scanner.scan(tagRe) || \"name\";\n scanner.scan(whiteRe);\n\n // Get the tag value.\n if (type === \"=\") {\n value = scanner.scanUntil(equalsRe);\n scanner.scan(equalsRe);\n scanner.scanUntil(closingTagRe);\n } else if (type === \"{\") {\n value = scanner.scanUntil(closingCurlyRe);\n scanner.scan(curlyRe);\n scanner.scanUntil(closingTagRe);\n type = \"&\";\n } else {\n value = scanner.scanUntil(closingTagRe);\n }\n\n // Match the closing tag.\n if (!scanner.scan(closingTagRe))\n throw new Error(\"Unclosed tag at \" + scanner.pos);\n\n token = [type, value, start, scanner.pos];\n tokens.push(token);\n\n if (type === \"#\" || type === \"^\") {\n sections.push(token);\n } else if (type === \"/\") {\n // Check section nesting.\n openSection = sections.pop();\n\n if (!openSection)\n throw new Error('Unopened section \"' + value + '\" at ' + start);\n\n if (openSection[1] !== value)\n throw new Error(\n 'Unclosed section \"' + openSection[1] + '\" at ' + start\n );\n } else if (type === \"name\" || type === \"{\" || type === \"&\") {\n nonSpace = true;\n } else if (type === \"=\") {\n // Set the tags for the next time around.\n compileTags(value);\n }\n }\n\n // Make sure there are no open sections when we're done.\n openSection = sections.pop();\n\n if (openSection)\n throw new Error(\n 'Unclosed section \"' + openSection[1] + '\" at ' + scanner.pos\n );\n\n return nestTokens(squashTokens(tokens));\n }\n\n /**\n * Combines the values of consecutive text tokens in the given `tokens` array\n * to a single token.\n */\n function squashTokens(tokens) {\n var squashedTokens = [];\n\n var token, lastToken;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n token = tokens[i];\n\n if (token) {\n if (token[0] === \"text\" && lastToken && lastToken[0] === \"text\") {\n lastToken[1] += token[1];\n lastToken[3] = token[3];\n } else {\n squashedTokens.push(token);\n lastToken = token;\n }\n }\n }\n\n return squashedTokens;\n }\n\n /**\n * Forms the given array of `tokens` into a nested tree structure where\n * tokens that represent a section have two additional items: 1) an array of\n * all tokens that appear in that section and 2) the index in the original\n * template that represents the end of that section.\n */\n function nestTokens(tokens) {\n var nestedTokens = [];\n var collector = nestedTokens;\n var sections = [];\n\n var token, section;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n token = tokens[i];\n\n switch (token[0]) {\n case \"#\":\n case \"^\":\n collector.push(token);\n sections.push(token);\n collector = token[4] = [];\n break;\n case \"/\":\n section = sections.pop();\n section[5] = token[2];\n collector =\n sections.length > 0\n ? sections[sections.length - 1][4]\n : nestedTokens;\n break;\n default:\n collector.push(token);\n }\n }\n\n return nestedTokens;\n }\n\n /**\n * A simple string scanner that is used by the template parser to find\n * tokens in template strings.\n */\n function Scanner(string) {\n this.string = string;\n this.tail = string;\n this.pos = 0;\n }\n\n /**\n * Returns `true` if the tail is empty (end of string).\n */\n Scanner.prototype.eos = function eos() {\n return this.tail === \"\";\n };\n\n /**\n * Tries to match the given regular expression at the current position.\n * Returns the matched text if it can match, the empty string otherwise.\n */\n Scanner.prototype.scan = function scan(re) {\n var match = this.tail.match(re);\n\n if (!match || match.index !== 0) return \"\";\n\n var string = match[0];\n\n this.tail = this.tail.substring(string.length);\n this.pos += string.length;\n\n return string;\n };\n\n /**\n * Skips all text until the given regular expression can be matched. Returns\n * the skipped string, which is the entire tail if no match can be made.\n */\n Scanner.prototype.scanUntil = function scanUntil(re) {\n var index = this.tail.search(re),\n match;\n\n switch (index) {\n case -1:\n match = this.tail;\n this.tail = \"\";\n break;\n case 0:\n match = \"\";\n break;\n default:\n match = this.tail.substring(0, index);\n this.tail = this.tail.substring(index);\n }\n\n this.pos += match.length;\n\n return match;\n };\n\n /**\n * Represents a rendering context by wrapping a view object and\n * maintaining a reference to the parent context.\n */\n function Context(view, parentContext) {\n this.view = view;\n this.cache = { \".\": this.view };\n this.parent = parentContext;\n }\n\n /**\n * Creates a new context using the given view with this context\n * as the parent.\n */\n Context.prototype.push = function push(view) {\n return new Context(view, this);\n };\n\n /**\n * Returns the value of the given name in this context, traversing\n * up the context hierarchy if the value is absent in this context's view.\n */\n Context.prototype.lookup = function lookup(name) {\n var cache = this.cache;\n\n var value;\n if (cache.hasOwnProperty(name)) {\n value = cache[name];\n } else {\n var context = this,\n names,\n index,\n lookupHit = false;\n\n while (context) {\n if (name.indexOf(\".\") > 0) {\n value = context.view;\n names = name.split(\".\");\n index = 0;\n\n /**\n * Using the dot notion path in `name`, we descend through the\n * nested objects.\n *\n * To be certain that the lookup has been successful, we have to\n * check if the last object in the path actually has the property\n * we are looking for. We store the result in `lookupHit`.\n *\n * This is specially necessary for when the value has been set to\n * `undefined` and we want to avoid looking up parent contexts.\n **/\n while (value != null && index < names.length) {\n if (index === names.length - 1)\n lookupHit = hasProperty(value, names[index]);\n\n value = value[names[index++]];\n }\n } else {\n value = context.view[name];\n lookupHit = hasProperty(context.view, name);\n }\n\n if (lookupHit) break;\n\n context = context.parent;\n }\n\n cache[name] = value;\n }\n\n if (isFunction(value)) value = value.call(this.view);\n\n return value;\n };\n\n /**\n * A Writer knows how to take a stream of tokens and render them to a\n * string, given a context. It also maintains a cache of templates to\n * avoid the need to parse the same template twice.\n */\n function Writer() {\n this.cache = {};\n }\n\n /**\n * Clears all cached templates in this writer.\n */\n Writer.prototype.clearCache = function clearCache() {\n this.cache = {};\n };\n\n /**\n * Parses and caches the given `template` and returns the array of tokens\n * that is generated from the parse.\n */\n Writer.prototype.parse = function parse(template, tags) {\n var cache = this.cache;\n var tokens = cache[template];\n\n if (tokens == null)\n tokens = cache[template] = parseTemplate(template, tags);\n\n return tokens;\n };\n\n /**\n * High-level method that is used to render the given `template` with\n * the given `view`.\n *\n * The optional `partials` argument may be an object that contains the\n * names and templates of partials that are used in the template. It may\n * also be a function that is used to load partial templates on the fly\n * that takes a single argument: the name of the partial.\n */\n Writer.prototype.render = function render(template, view, partials) {\n var tokens = this.parse(template);\n var context = view instanceof Context ? view : new Context(view);\n return this.renderTokens(tokens, context, partials, template);\n };\n\n /**\n * Low-level method that renders the given array of `tokens` using\n * the given `context` and `partials`.\n *\n * Note: The `originalTemplate` is only ever used to extract the portion\n * of the original template that was contained in a higher-order section.\n * If the template doesn't use higher-order sections, this argument may\n * be omitted.\n */\n Writer.prototype.renderTokens = function renderTokens(\n tokens,\n context,\n partials,\n originalTemplate\n ) {\n var buffer = \"\";\n\n var token, symbol, value;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n value = undefined;\n token = tokens[i];\n symbol = token[0];\n\n if (symbol === \"#\")\n value = this.renderSection(token, context, partials, originalTemplate);\n else if (symbol === \"^\")\n value = this.renderInverted(token, context, partials, originalTemplate);\n else if (symbol === \">\")\n value = this.renderPartial(token, context, partials, originalTemplate);\n else if (symbol === \"&\") value = this.unescapedValue(token, context);\n else if (symbol === \"name\") value = this.escapedValue(token, context);\n else if (symbol === \"text\") value = this.rawValue(token);\n\n if (value !== undefined) buffer += value;\n }\n\n return buffer;\n };\n\n Writer.prototype.renderSection = function renderSection(\n token,\n context,\n partials,\n originalTemplate\n ) {\n var self = this;\n var buffer = \"\";\n var value = context.lookup(token[1]);\n\n // This function is used to render an arbitrary template\n // in the current context by higher-order sections.\n function subRender(template) {\n return self.render(template, context, partials);\n }\n\n if (!value) return;\n\n if (isArray(value)) {\n for (var j = 0, valueLength = value.length; j < valueLength; ++j) {\n buffer += this.renderTokens(\n token[4],\n context.push(value[j]),\n partials,\n originalTemplate\n );\n }\n } else if (\n typeof value === \"object\" ||\n typeof value === \"string\" ||\n typeof value === \"number\"\n ) {\n buffer += this.renderTokens(\n token[4],\n context.push(value),\n partials,\n originalTemplate\n );\n } else if (isFunction(value)) {\n if (typeof originalTemplate !== \"string\")\n throw new Error(\n \"Cannot use higher-order sections without the original template\"\n );\n\n // Extract the portion of the original template that the section contains.\n value = value.call(\n context.view,\n originalTemplate.slice(token[3], token[5]),\n subRender\n );\n\n if (value != null) buffer += value;\n } else {\n buffer += this.renderTokens(\n token[4],\n context,\n partials,\n originalTemplate\n );\n }\n return buffer;\n };\n\n Writer.prototype.renderInverted = function renderInverted(\n token,\n context,\n partials,\n originalTemplate\n ) {\n var value = context.lookup(token[1]);\n\n // Use JavaScript's definition of falsy. Include empty arrays.\n // See https://github.com/janl/mustache.js/issues/186\n if (!value || (isArray(value) && value.length === 0))\n return this.renderTokens(token[4], context, partials, originalTemplate);\n };\n\n Writer.prototype.renderPartial = function renderPartial(\n token,\n context,\n partials\n ) {\n if (!partials) return;\n\n var value = isFunction(partials) ? partials(token[1]) : partials[token[1]];\n if (value != null)\n return this.renderTokens(this.parse(value), context, partials, value);\n };\n\n Writer.prototype.unescapedValue = function unescapedValue(token, context) {\n var value = context.lookup(token[1]);\n if (value != null) return value;\n };\n\n Writer.prototype.escapedValue = function escapedValue(token, context) {\n var value = context.lookup(token[1]);\n if (value != null) return mustache.escape(value);\n };\n\n Writer.prototype.rawValue = function rawValue(token) {\n return token[1];\n };\n\n mustache.name = \"mustache.js\";\n mustache.version = \"2.2.1\";\n mustache.tags = [\"{{\", \"}}\"];\n\n // All high-level mustache.* functions use this writer.\n var defaultWriter = new Writer();\n\n /**\n * Clears all cached templates in the default writer.\n */\n mustache.clearCache = function clearCache() {\n return defaultWriter.clearCache();\n };\n\n /**\n * Parses and caches the given template in the default writer and returns the\n * array of tokens it contains. Doing this ahead of time avoids the need to\n * parse templates on the fly as they are rendered.\n */\n mustache.parse = function parse(template, tags) {\n return defaultWriter.parse(template, tags);\n };\n\n /**\n * Renders the `template` with the given `view` and `partials` using the\n * default writer.\n */\n mustache.render = function render(template, view, partials) {\n if (typeof template !== \"string\") {\n throw new TypeError(\n 'Invalid template! Template should be a \"string\" ' +\n 'but \"' +\n typeStr(template) +\n '\" was given as the first ' +\n \"argument for mustache#render(template, view, partials)\"\n );\n }\n\n return defaultWriter.render(template, view, partials);\n };\n\n // This is here for backwards compatibility with 0.4.x.,\n /*eslint-disable */ // eslint wants camel cased function name\n mustache.to_html = function to_html(template, view, partials, send) {\n /*eslint-enable*/\n\n var result = mustache.render(template, view, partials);\n\n if (isFunction(send)) {\n send(result);\n } else {\n return result;\n }\n };\n\n // Export the escaping function so that the user may override it.\n // See https://github.com/janl/mustache.js/issues/244\n mustache.escape = escapeHtml;\n\n // Export these mainly for testing, but also for advanced usage.\n mustache.Scanner = Scanner;\n mustache.Context = Context;\n mustache.Writer = Writer;\n}\n\nlet Mustache = {};\n\nmustacheFactory(Mustache);\n\nexport default Mustache;\nexport { Mustache };\n","/* case-template:\n *\n * Use a template to render a case element\n *\n * Author: Niels Giesen\n * Copyright 2014 Berkeley Bridge\n *\n */\n\nimport { Mustache } from \"$mustache\";\nimport { bb } from \"$json\";\n\n(function ($, win, doc) {\n var tmpl;\n\n bb.createCaseItem = function (cas) {\n return Mustache.render(tmpl, cas);\n };\n\n $(function () {\n tmpl = $(\"#bb-p-case-template\").html();\n Mustache.tags = [\"[[\", \"]]\"];\n });\n})(jQuery, window, document);\n","import { bb } from \"$json\";\n/* change-nav-text:\n *\n * Change the nav button text\n * (and class if desired) in any node.\n *\n * Based on config.template.nav-text arr. e.g:\n\n NB: Array MUST include a default that can be\n be used to reset the states of any button\n which could have been changed.\n\n \"nav-text\": [\n {\n \"main.introductie\": {\n \"bb-next\": {\n \"class\": \"bb-next extra-class\", // Must contain orig. class(es).\n \"text\": \"Start\"\n }\n }\n },\n {\n \"default\": {\n \"bb-next\": {\n \"class\": \"bb-next\",\n \"text\": \"Volgende\"\n }\n }\n }\n ]\n\n * The plugin will look for a .text element inside the button, in case the layer uses SVGs\n * which would otherwise be removed.\n *\n * Author: Tim Bauwens\n * Copyright 2019\n *\n */\n\n(function ($, win, doc) {\n $(function () {\n let navText = bb.propFinder(bb.conf, \"template\")(\"nav-text\", false);\n\n const adjustBtn = (btn, change) => {\n let $btn = $(`.${btn}`);\n if (typeof change !== \"object\" || !$btn.length) return false;\n let $newbtn = $btn.clone();\n let $affect = $newbtn.find(\".text\").length\n ? $newbtn.find(\".text\")\n : $newbtn;\n $affect.html(change.text);\n $newbtn.attr(\"class\", change.class);\n\n return $newbtn;\n };\n\n if (navText)\n $(doc).on(\"bb:postHandleData\", (e, data) => {\n // Before doing anything, reset the state to default.\n navText.forEach(node => {\n if (node.default !== undefined) {\n $.each(node.default, (btn, change) => {\n let $newbtn = adjustBtn(btn, change);\n if ($newbtn) {\n $(`.${btn}`).replaceWith($newbtn);\n }\n });\n }\n });\n let currentNode = $(\"fieldset.group:last-of-type\").attr(\"data-node\");\n navText.forEach(node => {\n if (node[currentNode] !== undefined) {\n $.each(node[currentNode], (btn, change) => {\n let $newbtn = adjustBtn(btn, change);\n if ($newbtn) {\n $(`.${btn}`).replaceWith($newbtn);\n }\n });\n }\n });\n });\n });\n})(jQuery, window, document);\n","/* close-caselist:\n *\n * Adds closing cross on the case list\n *\n * Author: Annegreet Olijve\n *\n * Copyright (C) 2014, 2015 by Berkeley Bridge\n *\n */\nimport { gt, _ } from \"$json\";\n\nvar translations = {\n \"Close case overview\": {\n nl: \"Sluit casusoverzicht\",\n fr: \"Fermez le table des cas\",\n de: \"Casusübersicht schließen\",\n ru: \"Всклучите резюме сессии\"\n }\n};\n\n$(function () {\n gt.addTranslations(translations);\n});\n\n$(document).on(\"bb:postHandleData\", function (event, data) {\n if (data && data.cases && data.models && data.models.length != 0) {\n // Server always selects model if there is but one model.\n var origcolspan = $(\"#bb-cases tr.wcasus td\").first().attr(\"colspan\");\n var newcolspan = origcolspan - 1;\n\n $(\"#bb-cases tr.wcasus td\").first().attr({\n colspan: newcolspan,\n tabindex: 0\n });\n $(\"#bb-cases tr.wcasus\")\n .first()\n .append(\n '' +\n \"\"\n );\n $(\"#bb-cases thead\").first().removeAttr(\"tabindex\");\n }\n});\n","/* global jQuery */\n// custom-checkboxes.js\n\n/*\n * A simple plugin to replace\n * checkboxes with a custom design.\n * Cross-browser and working with all\n * forms of output; grids, checklists\n * and mutli-checklists\n *\n * Author: Tim Bauwens\n * Copyright Berkeley Bridge 2019\n *\n */\n\n((doc, $) => {\n const addCustomCheckbox = checkbox => {\n checkbox.className += \" a-offscreen p-custom-checkboxes\";\n checkbox.insertAdjacentHTML(\n \"afterEnd\",\n `\n \n `\n );\n };\n\n const addCheckBoxes = () => {\n // If there are any checkboxes, deal with them\n const checkboxes = $(\"#bb-q\").find(\n 'input[type=\"checkbox\"]:not(.p-custom-checkboxes)'\n );\n checkboxes.each((_, checkbox) => {\n addCustomCheckbox(checkbox);\n });\n };\n\n $(doc).on(\"bb:postHandleData\", (_, data) => {\n if (!data || !data.groups) return;\n addCheckBoxes();\n });\n\n $(doc).on(\"bb:updated\", (_, $widget, { controltype }) => {\n if (controltype === \"grid\" || controltype === \"checkmultilist\") {\n const checkboxes = $widget.find(\n 'input[type=\"checkbox\"]:not(.p-custom-checkboxes)'\n );\n checkboxes.each((_, checkbox) => {\n addCustomCheckbox(checkbox);\n });\n }\n });\n})(document, jQuery);\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"printJS\"] = factory();\n\telse\n\t\troot[\"printJS\"] = factory();\n})(window, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ \"./src/index.js\":\n/*!**********************!*\\\n !*** ./src/index.js ***!\n \\**********************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _sass_index_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sass/index.scss */ \"./src/sass/index.scss\");\n/* harmony import */ var _sass_index_scss__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_sass_index_scss__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _js_init__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/init */ \"./src/js/init.js\");\n\n\nvar printJS = _js_init__WEBPACK_IMPORTED_MODULE_1__[\"default\"].init;\n\nif (typeof window !== 'undefined') {\n window.printJS = printJS;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (printJS);\n\n/***/ }),\n\n/***/ \"./src/js/browser.js\":\n/*!***************************!*\\\n !*** ./src/js/browser.js ***!\n \\***************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\nvar Browser = {\n // Firefox 1.0+\n isFirefox: function isFirefox() {\n return typeof InstallTrigger !== 'undefined';\n },\n // Internet Explorer 6-11\n isIE: function isIE() {\n return navigator.userAgent.indexOf('MSIE') !== -1 || !!document.documentMode;\n },\n // Edge 20+\n isEdge: function isEdge() {\n return !Browser.isIE() && !!window.StyleMedia;\n },\n // Chrome 1+\n isChrome: function isChrome() {\n var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;\n return !!context.chrome;\n },\n // At least Safari 3+: \"[object HTMLElementConstructor]\"\n isSafari: function isSafari() {\n return Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0 || navigator.userAgent.toLowerCase().indexOf('safari') !== -1;\n },\n // IOS Chrome\n isIOSChrome: function isIOSChrome() {\n return navigator.userAgent.toLowerCase().indexOf('crios') !== -1;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Browser);\n\n/***/ }),\n\n/***/ \"./src/js/functions.js\":\n/*!*****************************!*\\\n !*** ./src/js/functions.js ***!\n \\*****************************/\n/*! exports provided: addWrapper, capitalizePrint, collectStyles, addHeader, cleanUp, isRawHTML */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addWrapper\", function() { return addWrapper; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"capitalizePrint\", function() { return capitalizePrint; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"collectStyles\", function() { return collectStyles; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addHeader\", function() { return addHeader; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"cleanUp\", function() { return cleanUp; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isRawHTML\", function() { return isRawHTML; });\n/* harmony import */ var _modal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modal */ \"./src/js/modal.js\");\n/* harmony import */ var _browser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./browser */ \"./src/js/browser.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\nfunction addWrapper(htmlData, params) {\n var bodyStyle = 'font-family:' + params.font + ' !important; font-size: ' + params.font_size + ' !important; width:100%;';\n return '
      ' + htmlData + '
      ';\n}\nfunction capitalizePrint(obj) {\n return obj.charAt(0).toUpperCase() + obj.slice(1);\n}\nfunction collectStyles(element, params) {\n var win = document.defaultView || window; // String variable to hold styling for each element\n\n var elementStyle = ''; // Loop over computed styles\n\n var styles = win.getComputedStyle(element, '');\n\n for (var key = 0; key < styles.length; key++) {\n // Check if style should be processed\n if (params.targetStyles.indexOf('*') !== -1 || params.targetStyle.indexOf(styles[key]) !== -1 || targetStylesMatch(params.targetStyles, styles[key])) {\n if (styles.getPropertyValue(styles[key])) elementStyle += styles[key] + ':' + styles.getPropertyValue(styles[key]) + ';';\n }\n } // Print friendly defaults (deprecated)\n\n\n elementStyle += 'max-width: ' + params.maxWidth + 'px !important; font-size: ' + params.font_size + ' !important;';\n return elementStyle;\n}\n\nfunction targetStylesMatch(styles, value) {\n for (var i = 0; i < styles.length; i++) {\n if (_typeof(value) === 'object' && value.indexOf(styles[i]) !== -1) return true;\n }\n\n return false;\n}\n\nfunction addHeader(printElement, params) {\n // Create the header container div\n var headerContainer = document.createElement('div'); // Check if the header is text or raw html\n\n if (isRawHTML(params.header)) {\n headerContainer.innerHTML = params.header;\n } else {\n // Create header element\n var headerElement = document.createElement('h1'); // Create header text node\n\n var headerNode = document.createTextNode(params.header); // Build and style\n\n headerElement.appendChild(headerNode);\n headerElement.setAttribute('style', params.headerStyle);\n headerContainer.appendChild(headerElement);\n }\n\n printElement.insertBefore(headerContainer, printElement.childNodes[0]);\n}\nfunction cleanUp(params) {\n // If we are showing a feedback message to user, remove it\n if (params.showModal) _modal__WEBPACK_IMPORTED_MODULE_0__[\"default\"].close(); // Check for a finished loading hook function\n\n if (params.onLoadingEnd) params.onLoadingEnd(); // If preloading pdf files, clean blob url\n\n if (params.showModal || params.onLoadingStart) window.URL.revokeObjectURL(params.printable); // Run onPrintDialogClose callback\n\n var event = 'mouseover';\n\n if (_browser__WEBPACK_IMPORTED_MODULE_1__[\"default\"].isChrome() || _browser__WEBPACK_IMPORTED_MODULE_1__[\"default\"].isFirefox()) {\n // Ps.: Firefox will require an extra click in the document to fire the focus event.\n event = 'focus';\n }\n\n var handler = function handler() {\n // Make sure the event only happens once.\n window.removeEventListener(event, handler);\n params.onPrintDialogClose(); // Remove iframe from the DOM\n\n var iframe = document.getElementById(params.frameId);\n\n if (iframe) {\n iframe.remove();\n }\n };\n\n window.addEventListener(event, handler);\n}\nfunction isRawHTML(raw) {\n var regexHtml = new RegExp('<([A-Za-z][A-Za-z0-9]*)\\\\b[^>]*>(.*?)');\n return regexHtml.test(raw);\n}\n\n/***/ }),\n\n/***/ \"./src/js/html.js\":\n/*!************************!*\\\n !*** ./src/js/html.js ***!\n \\************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./functions */ \"./src/js/functions.js\");\n/* harmony import */ var _print__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./print */ \"./src/js/print.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n print: function print(params, printFrame) {\n // Get the DOM printable element\n var printElement = isHtmlElement(params.printable) ? params.printable : document.getElementById(params.printable); // Check if the element exists\n\n if (!printElement) {\n window.console.error('Invalid HTML element id: ' + params.printable);\n return;\n } // Clone the target element including its children (if available)\n\n\n params.printableElement = cloneElement(printElement, params); // Add header\n\n if (params.header) {\n Object(_functions__WEBPACK_IMPORTED_MODULE_0__[\"addHeader\"])(params.printableElement, params);\n } // Print html element contents\n\n\n _print__WEBPACK_IMPORTED_MODULE_1__[\"default\"].send(params, printFrame);\n }\n});\n\nfunction cloneElement(element, params) {\n // Clone the main node (if not already inside the recursion process)\n var clone = element.cloneNode(); // Loop over and process the children elements / nodes (including text nodes)\n\n var childNodesArray = Array.prototype.slice.call(element.childNodes);\n\n for (var i = 0; i < childNodesArray.length; i++) {\n // Check if we are skipping the current element\n if (params.ignoreElements.indexOf(childNodesArray[i].id) !== -1) {\n continue;\n } // Clone the child element\n\n\n var clonedChild = cloneElement(childNodesArray[i], params); // Attach the cloned child to the cloned parent node\n\n clone.appendChild(clonedChild);\n } // Get all styling for print element (for nodes of type element only)\n\n\n if (params.scanStyles && element.nodeType === 1) {\n clone.setAttribute('style', Object(_functions__WEBPACK_IMPORTED_MODULE_0__[\"collectStyles\"])(element, params));\n } // Check if the element needs any state processing (copy user input data)\n\n\n switch (element.tagName) {\n case 'SELECT':\n // Copy the current selection value to its clone\n clone.value = element.value;\n break;\n\n case 'CANVAS':\n // Copy the canvas content to its clone\n clone.getContext('2d').drawImage(element, 0, 0);\n break;\n }\n\n return clone;\n}\n\nfunction isHtmlElement(printable) {\n // Check if element is instance of HTMLElement or has nodeType === 1 (for elements in iframe)\n return _typeof(printable) === 'object' && printable && (printable instanceof HTMLElement || printable.nodeType === 1);\n}\n\n/***/ }),\n\n/***/ \"./src/js/image.js\":\n/*!*************************!*\\\n !*** ./src/js/image.js ***!\n \\*************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./functions */ \"./src/js/functions.js\");\n/* harmony import */ var _print__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./print */ \"./src/js/print.js\");\n/* harmony import */ var _browser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./browser */ \"./src/js/browser.js\");\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n print: function print(params, printFrame) {\n // Check if we are printing one image or multiple images\n if (params.printable.constructor !== Array) {\n // Create array with one image\n params.printable = [params.printable];\n } // Create printable element (container)\n\n\n params.printableElement = document.createElement('div'); // Create all image elements and append them to the printable container\n\n params.printable.forEach(function (src) {\n // Create the image element\n var img = document.createElement('img');\n img.setAttribute('style', params.imageStyle); // Set image src with the file url\n\n img.src = src; // The following block is for Firefox, which for some reason requires the image's src to be fully qualified in\n // order to print it\n\n if (_browser__WEBPACK_IMPORTED_MODULE_2__[\"default\"].isFirefox()) {\n var fullyQualifiedSrc = img.src;\n img.src = fullyQualifiedSrc;\n } // Create the image wrapper\n\n\n var imageWrapper = document.createElement('div'); // Append image to the wrapper element\n\n imageWrapper.appendChild(img); // Append wrapper to the printable element\n\n params.printableElement.appendChild(imageWrapper);\n }); // Check if we are adding a print header\n\n if (params.header) Object(_functions__WEBPACK_IMPORTED_MODULE_0__[\"addHeader\"])(params.printableElement, params); // Print image\n\n _print__WEBPACK_IMPORTED_MODULE_1__[\"default\"].send(params, printFrame);\n }\n});\n\n/***/ }),\n\n/***/ \"./src/js/init.js\":\n/*!************************!*\\\n !*** ./src/js/init.js ***!\n \\************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./browser */ \"./src/js/browser.js\");\n/* harmony import */ var _modal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modal */ \"./src/js/modal.js\");\n/* harmony import */ var _pdf__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./pdf */ \"./src/js/pdf.js\");\n/* harmony import */ var _html__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./html */ \"./src/js/html.js\");\n/* harmony import */ var _raw_html__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./raw-html */ \"./src/js/raw-html.js\");\n/* harmony import */ var _image__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./image */ \"./src/js/image.js\");\n/* harmony import */ var _json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./json */ \"./src/js/json.js\");\n\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n\n\n\n\n\nvar printTypes = ['pdf', 'html', 'image', 'json', 'raw-html'];\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n init: function init() {\n var params = {\n printable: null,\n fallbackPrintable: null,\n type: 'pdf',\n header: null,\n headerStyle: 'font-weight: 300;',\n maxWidth: 800,\n properties: null,\n gridHeaderStyle: 'font-weight: bold; padding: 5px; border: 1px solid #dddddd;',\n gridStyle: 'border: 1px solid lightgray; margin-bottom: -1px;',\n showModal: false,\n onError: function onError(error) {\n throw error;\n },\n onLoadingStart: null,\n onLoadingEnd: null,\n onPrintDialogClose: function onPrintDialogClose() {},\n onIncompatibleBrowser: function onIncompatibleBrowser() {},\n modalMessage: 'Retrieving Document...',\n frameId: 'printJS',\n printableElement: null,\n documentTitle: 'Document',\n targetStyle: ['clear', 'display', 'width', 'min-width', 'height', 'min-height', 'max-height'],\n targetStyles: ['border', 'box', 'break', 'text-decoration'],\n ignoreElements: [],\n repeatTableHeader: true,\n css: null,\n style: null,\n scanStyles: true,\n base64: false,\n // Deprecated\n onPdfOpen: null,\n font: 'TimesNewRoman',\n font_size: '12pt',\n honorMarginPadding: true,\n honorColor: false,\n imageStyle: 'max-width: 100%;'\n }; // Check if a printable document or object was supplied\n\n var args = arguments[0];\n\n if (args === undefined) {\n throw new Error('printJS expects at least 1 attribute.');\n } // Process parameters\n\n\n switch (_typeof(args)) {\n case 'string':\n params.printable = encodeURI(args);\n params.fallbackPrintable = params.printable;\n params.type = arguments[1] || params.type;\n break;\n\n case 'object':\n params.printable = args.printable;\n params.fallbackPrintable = typeof args.fallbackPrintable !== 'undefined' ? args.fallbackPrintable : params.printable;\n params.fallbackPrintable = params.base64 ? \"data:application/pdf;base64,\".concat(params.fallbackPrintable) : params.fallbackPrintable;\n\n for (var k in params) {\n if (k === 'printable' || k === 'fallbackPrintable') continue;\n params[k] = typeof args[k] !== 'undefined' ? args[k] : params[k];\n }\n\n break;\n\n default:\n throw new Error('Unexpected argument type! Expected \"string\" or \"object\", got ' + _typeof(args));\n } // Validate printable\n\n\n if (!params.printable) throw new Error('Missing printable information.'); // Validate type\n\n if (!params.type || typeof params.type !== 'string' || printTypes.indexOf(params.type.toLowerCase()) === -1) {\n throw new Error('Invalid print type. Available types are: pdf, html, image and json.');\n } // Check if we are showing a feedback message to the user (useful for large files)\n\n\n if (params.showModal) _modal__WEBPACK_IMPORTED_MODULE_1__[\"default\"].show(params); // Check for a print start hook function\n\n if (params.onLoadingStart) params.onLoadingStart(); // To prevent duplication and issues, remove any used printFrame from the DOM\n\n var usedFrame = document.getElementById(params.frameId);\n if (usedFrame) usedFrame.parentNode.removeChild(usedFrame); // Create a new iframe for the print job\n\n var printFrame = document.createElement('iframe');\n\n if (_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFirefox()) {\n // Set the iframe to be is visible on the page (guaranteed by fixed position) but hidden using opacity 0, because\n // this works in Firefox. The height needs to be sufficient for some part of the document other than the PDF\n // viewer's toolbar to be visible in the page\n printFrame.setAttribute('style', 'width: 1px; height: 100px; position: fixed; left: 0; top: 0; opacity: 0; border-width: 0; margin: 0; padding: 0');\n } else {\n // Hide the iframe in other browsers\n printFrame.setAttribute('style', 'visibility: hidden; height: 0; width: 0; position: absolute; border: 0');\n } // Set iframe element id\n\n\n printFrame.setAttribute('id', params.frameId); // For non pdf printing, pass an html document string to srcdoc (force onload callback)\n\n if (params.type !== 'pdf') {\n printFrame.srcdoc = '' + params.documentTitle + ''; // Attach css files\n\n if (params.css) {\n // Add support for single file\n if (!Array.isArray(params.css)) params.css = [params.css]; // Create link tags for each css file\n\n params.css.forEach(function (file) {\n printFrame.srcdoc += '';\n });\n }\n\n printFrame.srcdoc += '';\n } // Check printable type\n\n\n switch (params.type) {\n case 'pdf':\n // Check browser support for pdf and if not supported we will just open the pdf file instead\n if (_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isIE()) {\n try {\n console.info('Print.js doesn\\'t support PDF printing in Internet Explorer.');\n var win = window.open(params.fallbackPrintable, '_blank');\n win.focus();\n params.onIncompatibleBrowser();\n } catch (error) {\n params.onError(error);\n } finally {\n // Make sure there is no loading modal opened\n if (params.showModal) _modal__WEBPACK_IMPORTED_MODULE_1__[\"default\"].close();\n if (params.onLoadingEnd) params.onLoadingEnd();\n }\n } else {\n _pdf__WEBPACK_IMPORTED_MODULE_2__[\"default\"].print(params, printFrame);\n }\n\n break;\n\n case 'image':\n _image__WEBPACK_IMPORTED_MODULE_5__[\"default\"].print(params, printFrame);\n break;\n\n case 'html':\n _html__WEBPACK_IMPORTED_MODULE_3__[\"default\"].print(params, printFrame);\n break;\n\n case 'raw-html':\n _raw_html__WEBPACK_IMPORTED_MODULE_4__[\"default\"].print(params, printFrame);\n break;\n\n case 'json':\n _json__WEBPACK_IMPORTED_MODULE_6__[\"default\"].print(params, printFrame);\n break;\n }\n }\n});\n\n/***/ }),\n\n/***/ \"./src/js/json.js\":\n/*!************************!*\\\n !*** ./src/js/json.js ***!\n \\************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./functions */ \"./src/js/functions.js\");\n/* harmony import */ var _print__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./print */ \"./src/js/print.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n print: function print(params, printFrame) {\n // Check if we received proper data\n if (_typeof(params.printable) !== 'object') {\n throw new Error('Invalid javascript data object (JSON).');\n } // Validate repeatTableHeader\n\n\n if (typeof params.repeatTableHeader !== 'boolean') {\n throw new Error('Invalid value for repeatTableHeader attribute (JSON).');\n } // Validate properties\n\n\n if (!params.properties || !Array.isArray(params.properties)) {\n throw new Error('Invalid properties array for your JSON data.');\n } // We will format the property objects to keep the JSON api compatible with older releases\n\n\n params.properties = params.properties.map(function (property) {\n return {\n field: _typeof(property) === 'object' ? property.field : property,\n displayName: _typeof(property) === 'object' ? property.displayName : property,\n columnSize: _typeof(property) === 'object' && property.columnSize ? property.columnSize + ';' : 100 / params.properties.length + '%;'\n };\n }); // Create a print container element\n\n params.printableElement = document.createElement('div'); // Check if we are adding a print header\n\n if (params.header) {\n Object(_functions__WEBPACK_IMPORTED_MODULE_0__[\"addHeader\"])(params.printableElement, params);\n } // Build the printable html data\n\n\n params.printableElement.innerHTML += jsonToHTML(params); // Print the json data\n\n _print__WEBPACK_IMPORTED_MODULE_1__[\"default\"].send(params, printFrame);\n }\n});\n\nfunction jsonToHTML(params) {\n // Get the row and column data\n var data = params.printable;\n var properties = params.properties; // Create a html table\n\n var htmlData = ''; // Check if the header should be repeated\n\n if (params.repeatTableHeader) {\n htmlData += '';\n } // Add the table header row\n\n\n htmlData += ''; // Add the table header columns\n\n for (var a = 0; a < properties.length; a++) {\n htmlData += '';\n } // Add the closing tag for the table header row\n\n\n htmlData += ''; // If the table header is marked as repeated, add the closing tag\n\n if (params.repeatTableHeader) {\n htmlData += '';\n } // Create the table body\n\n\n htmlData += ''; // Add the table data rows\n\n for (var i = 0; i < data.length; i++) {\n // Add the row starting tag\n htmlData += ''; // Print selected properties only\n\n for (var n = 0; n < properties.length; n++) {\n var stringData = data[i]; // Support nested objects\n\n var property = properties[n].field.split('.');\n\n if (property.length > 1) {\n for (var p = 0; p < property.length; p++) {\n stringData = stringData[property[p]];\n }\n } else {\n stringData = stringData[properties[n].field];\n } // Add the row contents and styles\n\n\n htmlData += '';\n } // Add the row closing tag\n\n\n htmlData += '';\n } // Add the table and body closing tags\n\n\n htmlData += '
      ' + Object(_functions__WEBPACK_IMPORTED_MODULE_0__[\"capitalizePrint\"])(properties[a].displayName) + '
      ' + stringData + '
      ';\n return htmlData;\n}\n\n/***/ }),\n\n/***/ \"./src/js/modal.js\":\n/*!*************************!*\\\n !*** ./src/js/modal.js ***!\n \\*************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\nvar Modal = {\n show: function show(params) {\n // Build modal\n var modalStyle = 'font-family:sans-serif; ' + 'display:table; ' + 'text-align:center; ' + 'font-weight:300; ' + 'font-size:30px; ' + 'left:0; top:0;' + 'position:fixed; ' + 'z-index: 9990;' + 'color: #0460B5; ' + 'width: 100%; ' + 'height: 100%; ' + 'background-color:rgba(255,255,255,.9);' + 'transition: opacity .3s ease;'; // Create wrapper\n\n var printModal = document.createElement('div');\n printModal.setAttribute('style', modalStyle);\n printModal.setAttribute('id', 'printJS-Modal'); // Create content div\n\n var contentDiv = document.createElement('div');\n contentDiv.setAttribute('style', 'display:table-cell; vertical-align:middle; padding-bottom:100px;'); // Add close button (requires print.css)\n\n var closeButton = document.createElement('div');\n closeButton.setAttribute('class', 'printClose');\n closeButton.setAttribute('id', 'printClose');\n contentDiv.appendChild(closeButton); // Add spinner (requires print.css)\n\n var spinner = document.createElement('span');\n spinner.setAttribute('class', 'printSpinner');\n contentDiv.appendChild(spinner); // Add message\n\n var messageNode = document.createTextNode(params.modalMessage);\n contentDiv.appendChild(messageNode); // Add contentDiv to printModal\n\n printModal.appendChild(contentDiv); // Append print modal element to document body\n\n document.getElementsByTagName('body')[0].appendChild(printModal); // Add event listener to close button\n\n document.getElementById('printClose').addEventListener('click', function () {\n Modal.close();\n });\n },\n close: function close() {\n var printModal = document.getElementById('printJS-Modal');\n\n if (printModal) {\n printModal.parentNode.removeChild(printModal);\n }\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Modal);\n\n/***/ }),\n\n/***/ \"./src/js/pdf.js\":\n/*!***********************!*\\\n !*** ./src/js/pdf.js ***!\n \\***********************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _print__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./print */ \"./src/js/print.js\");\n/* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./functions */ \"./src/js/functions.js\");\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n print: function print(params, printFrame) {\n // Check if we have base64 data\n if (params.base64) {\n var bytesArray = Uint8Array.from(atob(params.printable), function (c) {\n return c.charCodeAt(0);\n });\n createBlobAndPrint(params, printFrame, bytesArray);\n return;\n } // Format pdf url\n\n\n params.printable = /^(blob|http|\\/\\/)/i.test(params.printable) ? params.printable : window.location.origin + (params.printable.charAt(0) !== '/' ? '/' + params.printable : params.printable); // Get the file through a http request (Preload)\n\n var req = new window.XMLHttpRequest();\n req.responseType = 'arraybuffer';\n req.addEventListener('error', function () {\n Object(_functions__WEBPACK_IMPORTED_MODULE_1__[\"cleanUp\"])(params);\n params.onError(req.statusText, req); // Since we don't have a pdf document available, we will stop the print job\n });\n req.addEventListener('load', function () {\n // Check for errors\n if ([200, 201].indexOf(req.status) === -1) {\n Object(_functions__WEBPACK_IMPORTED_MODULE_1__[\"cleanUp\"])(params);\n params.onError(req.statusText, req); // Since we don't have a pdf document available, we will stop the print job\n\n return;\n } // Print requested document\n\n\n createBlobAndPrint(params, printFrame, req.response);\n });\n req.open('GET', params.printable, true);\n req.send();\n }\n});\n\nfunction createBlobAndPrint(params, printFrame, data) {\n // Pass response or base64 data to a blob and create a local object url\n var localPdf = new window.Blob([data], {\n type: 'application/pdf'\n });\n localPdf = window.URL.createObjectURL(localPdf); // Set iframe src with pdf document url\n\n printFrame.setAttribute('src', localPdf);\n _print__WEBPACK_IMPORTED_MODULE_0__[\"default\"].send(params, printFrame);\n}\n\n/***/ }),\n\n/***/ \"./src/js/print.js\":\n/*!*************************!*\\\n !*** ./src/js/print.js ***!\n \\*************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./browser */ \"./src/js/browser.js\");\n/* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./functions */ \"./src/js/functions.js\");\n\n\nvar Print = {\n send: function send(params, printFrame) {\n // Append iframe element to document body\n document.getElementsByTagName('body')[0].appendChild(printFrame); // Get iframe element\n\n var iframeElement = document.getElementById(params.frameId); // Wait for iframe to load all content\n\n iframeElement.onload = function () {\n if (params.type === 'pdf') {\n // Add a delay for Firefox. In my tests, 1000ms was sufficient but 100ms was not\n if (_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFirefox()) {\n setTimeout(function () {\n return performPrint(iframeElement, params);\n }, 1000);\n } else {\n performPrint(iframeElement, params);\n }\n\n return;\n } // Get iframe element document\n\n\n var printDocument = iframeElement.contentWindow || iframeElement.contentDocument;\n if (printDocument.document) printDocument = printDocument.document; // Append printable element to the iframe body\n\n printDocument.body.appendChild(params.printableElement); // Add custom style\n\n if (params.type !== 'pdf' && params.style) {\n // Create style element\n var style = document.createElement('style');\n style.innerHTML = params.style; // Append style element to iframe's head\n\n printDocument.head.appendChild(style);\n } // If printing images, wait for them to load inside the iframe\n\n\n var images = printDocument.getElementsByTagName('img');\n\n if (images.length > 0) {\n loadIframeImages(Array.from(images)).then(function () {\n return performPrint(iframeElement, params);\n });\n } else {\n performPrint(iframeElement, params);\n }\n };\n }\n};\n\nfunction performPrint(iframeElement, params) {\n try {\n iframeElement.focus(); // If Edge or IE, try catch with execCommand\n\n if (_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isEdge() || _browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isIE()) {\n try {\n iframeElement.contentWindow.document.execCommand('print', false, null);\n } catch (e) {\n iframeElement.contentWindow.print();\n }\n } else {\n // Other browsers\n iframeElement.contentWindow.print();\n }\n } catch (error) {\n params.onError(error);\n } finally {\n if (_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFirefox()) {\n // Move the iframe element off-screen and make it invisible\n iframeElement.style.visibility = 'hidden';\n iframeElement.style.left = '-1px';\n }\n\n Object(_functions__WEBPACK_IMPORTED_MODULE_1__[\"cleanUp\"])(params);\n }\n}\n\nfunction loadIframeImages(images) {\n var promises = images.map(function (image) {\n if (image.src && image.src !== window.location.href) {\n return loadIframeImage(image);\n }\n });\n return Promise.all(promises);\n}\n\nfunction loadIframeImage(image) {\n return new Promise(function (resolve) {\n var pollImage = function pollImage() {\n !image || typeof image.naturalWidth === 'undefined' || image.naturalWidth === 0 || !image.complete ? setTimeout(pollImage, 500) : resolve();\n };\n\n pollImage();\n });\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Print);\n\n/***/ }),\n\n/***/ \"./src/js/raw-html.js\":\n/*!****************************!*\\\n !*** ./src/js/raw-html.js ***!\n \\****************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _print__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./print */ \"./src/js/print.js\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n print: function print(params, printFrame) {\n // Create printable element (container)\n params.printableElement = document.createElement('div');\n params.printableElement.setAttribute('style', 'width:100%'); // Set our raw html as the printable element inner html content\n\n params.printableElement.innerHTML = params.printable; // Print html contents\n\n _print__WEBPACK_IMPORTED_MODULE_0__[\"default\"].send(params, printFrame);\n }\n});\n\n/***/ }),\n\n/***/ \"./src/sass/index.scss\":\n/*!*****************************!*\\\n !*** ./src/sass/index.scss ***!\n \\*****************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n// extracted by mini-css-extract-plugin\n\n/***/ }),\n\n/***/ 0:\n/*!****************************!*\\\n !*** multi ./src/index.js ***!\n \\****************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(/*! ./src/index.js */\"./src/index.js\");\n\n\n/***/ })\n\n/******/ })[\"default\"];\n});\n//# sourceMappingURL=print.map","/*\n * end-tools:\n *\n * Place up to four functions in the\n * top or bottom of bb-q on any node.\n *\n * 1) A download report button\n * 2) An email report widget\n * 3) A print option.\n * 4) A feedback widget.\n *\n * Author: Tim Bauwens\n * Copyright 2020 Berkeley Bridge\n *\n */\n\nimport print from \"print-js\";\nimport { gt, bb, _ } from \"$json\";\nimport { getmetadata } from \"../../js/lib/getmetadata\";\n\n(($, win, doc) => {\n var translations = {\n \"Rapport downloaden\": {\n nl: \"Rapport downloaden\",\n en: \"Download report\"\n },\n \"Verzend rapport via e-mail\": {\n nl: \"Verzend rapport via e-mail\",\n en: \"Send report via e-mail\"\n },\n \"Was dit nuttig?\": {\n nl: \"Was dit nuttig?\",\n en: \"Was this useful?\"\n },\n \"Verzend\": {\n nl: \"Verzend\",\n en: \"Send\"\n },\n \"vul hier uw e-mail in\": {\n nl: \"vul hier uw e-mail in\",\n en: \"provide your e-mail here\"\n },\n \"jouw@email.com\": {\n nl: \"jouw@email.com\",\n en: \"your@email.com\"\n },\n \"E-mail is verzonden...\": {\n nl: \"E-mail is verzonden...\",\n en: \"E-mail has been sent...\"\n },\n \"Bedankt voor uw feedback\": {\n nl: \"Bedankt voor uw feedback\",\n en: \"Thanks for your feedback\"\n },\n \"Ja\": {\n nl: \"Ja\",\n en: \"Yes\"\n },\n \"Nee\": {\n nl: \"Nee\",\n en: \"No\"\n },\n \"prepping\": {\n nl: \"voorbereiden...\",\n en: \"preparing...\"\n },\n \"impossible\": {\n nl: \"niet mogelijk.\",\n en: \"not posssible.\"\n }\n };\n\n gt.addTranslations(translations);\n\n var metadata,\n emailSent,\n REPORTDOC = \"\", // Because there could be multiple, but we only handle one.\n SHOWONTOP = \"true\",\n DESIRED_TOOLS = [];\n\n $(function () {\n $(doc).on(\"bb:preHandleData\", (event, data) => {\n if (data && data.groups && data.groups.length && data.sessionid) {\n // Check in case metadata has been added or changed\n metadata = getmetadata(data).props;\n\n if (\n metadata.has(\"reportdoc\") &&\n metadata.get(\"reportdoc\").split(\".\").pop() === \"pdf\"\n ) {\n REPORTDOC = metadata.get(\"reportdoc\");\n }\n if (metadata.has(\"desiredtools\")) {\n DESIRED_TOOLS.length = 0;\n metadata\n .get(\"desiredtools\")\n .split(\"|\")\n .forEach(entry => {\n DESIRED_TOOLS.push(entry);\n });\n }\n if (metadata.has(\"showontop\")) {\n SHOWONTOP = metadata.get(\"showontop\");\n } else {\n SHOWONTOP = \"true\";\n }\n\n emailSent = emailSent || false;\n }\n });\n });\n\n $(function () {\n $(doc).on(\"bb:postHandleData\", function (event, data) {\n // Unset mode for hooks\n bb.Mode.unset(\"hasThreeInOne\");\n if (data && data.groups && data.groups.length && data.sessionid) {\n if (metadata.has(\"end-tools\") && metadata.get(\"end-tools\")) {\n // Set mode for hooks\n bb.Mode.set(\"hasThreeInOne\");\n\n // Hide and reset the support inputs.\n $(\".bb-g-endtools-feedback-vote\").hide();\n $(\".bb-g-endtools-email\").hide();\n $(\".bbm-endtools-email\").val(\"\");\n\n // Create the container for the functions.\n var $container = $('
      ');\n\n if (DESIRED_TOOLS.indexOf(\"download\") > -1 && REPORTDOC.length) {\n // Make a download report button\n var $download = $(\n '
      '\n );\n $download.append(`\n \n \n ${_(\"Rapport downloaden\")}\n \n `);\n $container.append($download);\n }\n\n if (DESIRED_TOOLS.indexOf(\"print\") > -1 && REPORTDOC.length) {\n // Make the print button.\n var $print = $(\n '
      '\n );\n var $printbtn = $(`\n \n `).on(\"click\", e => {\n printJS({\n printable: `${REPORTDOC}?guid=${data.uniqueid}:${data.dbname}:${data.sessionid}`,\n type: \"pdf\",\n showModal: false\n });\n });\n $print.append($printbtn);\n $container.append($print);\n }\n\n if (DESIRED_TOOLS.indexOf(\"email\") > -1) {\n // Make the email widget\n var $email = $('
      ');\n\n if (emailSent) {\n $email.append(\n '\"\n );\n emailSent = false;\n } else {\n $email.append(\n ''\n ).append(`\n \n `);\n\n // Handler\n $(doc).off(\".end-tools-events\", \".opt-for-email\");\n $(doc).on(\n \"click.end-tools-events\",\n \".opt-for-email\",\n function (e) {\n $(\".opt-for-email\")\n .html(_(\"Verzend\") + ' ')\n .attr(\"class\", \"email-send bb-next\")\n .prop(\"disabled\", \"disabled\");\n $(\".email-address\")\n .attr(\"class\", \"email-address set\")\n .focus();\n }\n );\n $(doc).off(\".end-tools-events\", \".email-address\");\n $(doc).on(\n \"\\\n propertychange.end-tools \\\n change.end-tools-events \\\n click.end-tools-events \\\n keyup.end-tools-events \\\n input.end-tools-events \\\n paste.end-tools-events\",\n \".email-address\",\n function () {\n var input = $(\"input.email-address\").val();\n var regex =\n /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n if (regex.test(input)) {\n $(\"button.email-send\")\n .addClass(\"validated\")\n .removeAttr(\"disabled\");\n emailSent = true;\n $(\".bbm-endtools-email\").val(input);\n } else {\n $(\"button.email-send\")\n .removeClass(\"validated\")\n .prop(\"disabled\", \"disabled\");\n $(\".bbm-endtools-email\").val(\"\");\n }\n }\n );\n }\n $container.append($email);\n }\n\n if (DESIRED_TOOLS.indexOf(\"feedback\") > -1) {\n // Make the feedback buttons.\n var $feedback = $(\n '
      '\n );\n $feedback\n .append(\n `\n \n `\n )\n .append(\"\").append(`\n \n `);\n\n // Handler\n var group;\n if (data && data.userinfo)\n $feedback.data(\"userinfo\", data.userinfo);\n group = data.groups.filter(function (g) {\n return g.current;\n })[0];\n $feedback.data(\"nodename\", group.name);\n if (data && data.modelname)\n $feedback.data(\"modelname\", data.modelname);\n if (data && data.modelversion)\n $feedback.data(\"modelversion\", data.modelversion);\n $(doc).off(\".end-tools-events\", \".feedback-button\");\n $(doc).one(\n \"click.end-tools-events\",\n \".feedback-button\",\n function (e) {\n var vote =\n $(e.target).data(\"value\") !== undefined\n ? $(e.target).data(\"value\")\n : $(e.target).parents(\"button\").data(\"value\");\n\n // Add the vote to the hiddden interface.\n $(\"input.bbm-endtools-feedback-vote\").attr(\"value\", vote);\n $feedback.html(\n '\"\n );\n bb.updatemis();\n }\n );\n $container.append($feedback);\n }\n\n // Reveal top or bottom depending on conf.\n if (SHOWONTOP === \"false\") {\n $(\"fieldset.selected\").append($container);\n setTimeout(function () {\n $container.toggleClass(\"showing\");\n }, 800);\n } else {\n $(\"#bb-q\").prepend($container);\n $(\"html,body\").animate({ scrollTop: 0 });\n setTimeout(function () {\n $container.toggleClass(\"showing\");\n }, 800);\n }\n }\n }\n });\n });\n})(jQuery, window, document);\n","/*\n * This utility can be imported to ease the use\n * of metadata by pulling it from the data provided.\n * The function will return an object containing three\n * properties:\n *\n * props --> a Map() containing a single entry per metadata property\n * with it's respective value of that metadata.\n *\n * groups --> a Map() containing a single property per group\n * which has metadata, and the value of that metadata.\n *\n * controls --> a Map() containing a single property per control\n * which has metadata, and the value of that metadata.\n */\n\nconst getmetadata = data => {\n let fromnode = {\n props: new Map(),\n groups: new Map(),\n controls: new Map()\n };\n\n try {\n data.groups.forEach(group => {\n if (group.metadata !== undefined) {\n fromnode.groups.set(group.groupid, group.metadata);\n Object.keys(group.metadata).forEach(metaprop => {\n fromnode.props.set(metaprop, group.metadata[metaprop]);\n });\n }\n group.controls !== undefined &&\n group.controls.forEach(control => {\n Object.keys(control).forEach(prop => {\n if (prop === \"metadata\") {\n fromnode.controls.set([control.id], control.metadata);\n Object.keys(control.metadata).forEach(metaprop => {\n fromnode.props.set(metaprop, control.metadata[metaprop]);\n });\n }\n });\n });\n });\n return fromnode;\n } catch (err) {\n window.console && window.console.warn(err);\n return fromnode;\n }\n};\n\nexport { getmetadata };\n","/* has-no-next:\n *\n * Set body.hasNoNext when the current screen title matches a\n * predefined regular expression, and unsets it when does not.\n *\n * Author: Niels Giesen\n *\n * Copyright (C) 2011, 2012 by Berkeley Bridge\n *\n */\n\nimport { bb } from \"$json\";\n\n(function ($) {\n // Regular expression to test absolute screentitles against:\n var re = /^(Einde)$/;\n\n $(document).on(\"bb:postHandleData\", function (event, data, status, req) {\n if (data && data.jumplist)\n bb.Mode.toggle(\n \"hasNoNext\",\n data.hasnext == false ||\n $.grep(data.jumplist, function (group) {\n return (\n group.status == \"selected\" && re.test($.trim(group.screentitle))\n );\n }).length > 0\n );\n });\n})(jQuery);\n","import { bb } from \"$json\";\n/* headings:\n *\n * Turn labels whose font class (as provided the JSON object) match the\n * regular expression /^Standard title$|^Heading[^1-6]*([1-6]?)/ into headings.\n *\n * If the class has no numbering (e.g. 'Standard Title' instead of\n * 'Heading 2'), level 1 will be presumed.\n *\n * Since a model can run anywhere, it is possible to set a base level\n * for headings in arbitrary.headings.baseLevel (in\n * conf.json).\n *\n * If you want to force titles in 'addtobottom' nodes to duck below\n * the top ('cleared') node, declare arbitrary.headings.duck = true in\n * conf.json\n *\n * Author: Niels Giesen\n * Copyright 2016, 2018 Berkeley Bridge\n *\n */\n(function ($, win, doc) {\n var duck = false,\n baseLevel,\n topLevel,\n re = /^Standard title$|^Heading[^1-6]*([1-6]?)/;\n\n $(function () {\n try {\n baseLevel = bb.conf.arbitrary.headings.baseLevel;\n if (baseLevel === undefined) throw \"baseLevel is not defined\";\n topLevel = baseLevel - 1;\n } catch (err) {\n topLevel = 0;\n }\n\n try {\n duck = bb.conf.arbitrary.headings.duck;\n } catch (err) {}\n\n $(doc).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.groups && data.groups.length) {\n $.each(data.groups, function (_, group) {\n $.each(group.controls, function (_, ctl) {\n var klass = ctl[\"font-class\"],\n _level,\n m;\n if (ctl.controltype === \"label\" && ((m = klass.match(re)), m)) {\n _level = Number(m[1]) || 1;\n ctl._subtype = \"heading\";\n ctl._level =\n duck && group.screenmode !== \"clear\"\n ? _level + 1 + topLevel\n : _level + topLevel;\n }\n });\n });\n }\n });\n });\n})(jQuery, window, document);\n","/* history:\n *\n * Manage history using the html5 history api and sessionStorage\n *\n * Could have support for crunchbang ( #!modelname=thisandthat )\n *\n * Author: Niels Giesen\n * Copyright 2013, 2014, 2015 Berkeley Bridge\n *\n */\nimport { bb, _ } from \"$json\";\nimport { has } from \"$json/lib/functional\";\nimport { setSettled } from \"$json/lib/settled\";\n\n(function ($, win, history, location) {\n var crunchbang = false;\n\n if (history && history.pushState) {\n if (!location.origin) {\n location.origin =\n location.protocol +\n \"//\" +\n location.hostname +\n (location.port ? \":\" + location.port : \"\");\n }\n\n $(function () {\n var apinav,\n storage,\n params = $.parseQuery(location.hash.slice(2)),\n _title_sep = \" \",\n _title = document.title;\n\n try {\n storage = window.sessionStorage;\n } catch (err) {\n storage = null;\n }\n\n function directory(loc) {\n return loc.origin + loc.pathname.replace(/[^/]+$/, \"\");\n }\n\n function restoreState(state) {\n if (state.sessionid) {\n // restore case\n bb.ajax\n .post({\n url: \"action\",\n data: state\n })\n .then(setSettled);\n } else if (bb.getVar(\"sessionid\")) {\n // exit running case and restore model view\n bb.exit(() => bb.menu(state).then(setSettled));\n } else {\n // restore model view\n bb.menu(state).then(setSettled);\n }\n }\n\n function ditchState() {\n storage && storage.removeItem(\"state\");\n history.replaceState(null, null, null);\n setSettled();\n }\n\n if (location.search !== \"\") ditchState();\n\n var initial_state =\n history.state || (storage && JSON.parse(storage.getItem(\"state\")));\n\n if (initial_state) {\n // Detect explicit edit of the crunchbang - this should\n // override the dbname parameter and instead use the modelname\n if (params.modelname && params.modelname !== initial_state.modelname) {\n initial_state.modelname = params.modelname;\n delete initial_state.dbname;\n delete initial_state.sessionid;\n }\n\n if (initial_state.directory === directory(location)) {\n bb.Mode.set(\"isLoggedIn\"); // Yes, just an assumption it will go allright.\n restoreState(initial_state);\n } else {\n ditchState();\n }\n } else if (params.modelname) {\n // Bookmarked with crunchbang, but no state\n bb.Router(params);\n } else {\n setSettled();\n }\n\n $(document).on(\"bb:jsonError\", ditchState);\n\n $(document).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.uniqueid) {\n var title,\n state = {\n fmt: \"json\",\n uniqueid: data.uniqueid,\n // Save the 'directory part'\n directory: directory(location)\n };\n if (has(\"dbname\", data) && data.sessionid) {\n state.dbname = data.dbname;\n state.sessionid = data.sessionid;\n state.modelname = data.modelname; // Needed to get interpret explicit change to location\n\n if (data.modeldescription) {\n title = [_title, data.modeldescription.replace(/_/g, \" \")].join(\n _title_sep\n );\n }\n } else if (data.models) {\n var model = $.grep(data.models, function (m) {\n return m.selected;\n })[0],\n dbname = model ? model.dbname : null;\n if (dbname !== null) {\n state.dbname = dbname;\n title = [_title, model.modelname, \"-\", _(\"overview\")].join(\n _title_sep\n );\n } else {\n title = [_title, _(\"Your models\")].join(_title_sep);\n }\n }\n if (!apinav) {\n try {\n storage && storage.setItem(\"state\", JSON.stringify(state));\n } catch (e) {\n // Guard against QuotaExceededError (which always happens on Safari Private Browsing on iOS)\n }\n if (history.state && history.state.sessionid && state.sessionid) {\n history.replaceState(\n state,\n null,\n location.origin +\n location.pathname +\n ((crunchbang && \"#!modelname=\" + data.modelname) || \"\")\n );\n } else {\n if (data.modelname && crunchbang) {\n history.pushState(\n state,\n null,\n location.origin +\n location.pathname +\n \"#!modelname=\" +\n data.modelname\n );\n } else {\n history.pushState(\n state,\n null,\n location.origin + location.pathname\n );\n }\n }\n }\n if (title && document.title !== title) {\n document.title = title;\n }\n }\n // Something went miserably wrong. Clear history to get out of this mess.\n if (\n data &&\n ((data.error && data.error.summary) ||\n (data.groups && !data.groups.length) ||\n data.status === \"logout successful\")\n ) {\n // Extra check - may be we are but updating\n if (\n data &&\n data.error &&\n data.error.code &&\n data.error.code === 14 && // Error loading case\n data.error.subcode === 1002\n )\n // Updating\n return;\n ditchState();\n }\n apinav = false;\n });\n\n win.addEventListener(\"popstate\", function (e) {\n apinav = true;\n if (e.state) {\n if (e.state.directory === directory(location)) restoreState(e.state);\n else ditchState();\n }\n });\n });\n }\n})(jQuery, window, window.history, window.location);\n","//\n// showdown.js -- A javascript port of Markdown.\n//\n// Copyright (c) 2007 John Fraser.\n//\n// Original Markdown Copyright (c) 2004-2005 John Gruber\n// \n//\n// Redistributable under a BSD-style open source license.\n// See license.txt for more information.\n//\n// The full source distribution is at:\n//\n//\t\t\t\tA A L\n//\t\t\t\tT C A\n//\t\t\t\tT K B\n//\n// \n//\n\n//\n// Wherever possible, Showdown is a straight, line-by-line port\n// of the Perl version of Markdown.\n//\n// This is not a normal parser design; it's basically just a\n// series of string substitutions. It's hard to read and\n// maintain this way, but keeping Showdown close to the original\n// design makes it easier to port new features.\n//\n// More importantly, Showdown behaves like markdown.pl in most\n// edge cases. So web applications can do client-side preview\n// in Javascript, and then build identical HTML on the server.\n//\n// This port needs the new RegExp functionality of ECMA 262,\n// 3rd Edition (i.e. Javascript 1.5). Most modern web browsers\n// should do fine. Even with the new regular expression features,\n// We do a lot of work to emulate Perl's regex functionality.\n// The tricky changes in this file mostly have the \"attacklab:\"\n// label. Major or self-explanatory changes don't.\n//\n// Smart diff tools like Araxis Merge will be able to match up\n// this file with markdown.pl in a useful way. A little tweaking\n// helps: in a copy of markdown.pl, replace \"#\" with \"//\" and\n// replace \"$text\" with \"text\". Be sure to ignore whitespace\n// and line endings.\n//\n\n//\n// Showdown usage:\n//\n// var text = \"Markdown *rocks*.\";\n//\n// var converter = new Showdown.converter();\n// var html = converter.makeHtml(text);\n//\n// alert(html);\n//\n// Note: move the sample code to the bottom of this\n// file before uncommenting it.\n//\n\n//\n// Showdown namespace\n//\nvar Showdown = {};\n\n//\n// converter\n//\n// Wraps all \"globals\" so that the only thing\n// exposed is makeHtml().\n//\nShowdown.converter = function () {\n //\n // Globals:\n //\n\n // Global hashes, used by various utility routines\n var g_urls;\n var g_titles;\n var g_html_blocks;\n\n // Used to track when we're inside an ordered or unordered list\n // (see _ProcessListItems() for details):\n var g_list_level = 0;\n\n this.makeHtml = function (text, inline_only) {\n //\n // Main function. The order in which other subs are called here is\n // essential. Link and image substitutions need to happen before\n // _EscapeSpecialCharsWithinTagAttributes(), so that any *'s or _'s in the \n // and tags get encoded.\n //\n\n // Clear the global hashes. If we don't clear these, you get conflicts\n // from other articles when generating a page which contains more than\n // one article (e.g. an index page that shows the N most recent\n // articles):\n g_urls = new Array();\n g_titles = new Array();\n g_html_blocks = new Array();\n\n // attacklab: Replace ~ with ~T\n // This lets us use tilde as an escape char to avoid md5 hashes\n // The choice of character is arbitray; anything that isn't\n // magic in Markdown will work.\n text = text.replace(/~/g, \"~T\");\n\n // attacklab: Replace $ with ~D\n // RegExp interprets $ as a special character\n // when it's in a replacement string\n text = text.replace(/\\$/g, \"~D\");\n\n // Standardize line endings\n text = text.replace(/\\r\\n/g, \"\\n\"); // DOS to Unix\n text = text.replace(/\\r/g, \"\\n\"); // Mac to Unix\n\n // Make sure text begins and ends with a couple of newlines:\n text = \"\\n\\n\" + text + \"\\n\\n\";\n\n // Convert all tabs to spaces.\n text = _Detab(text);\n\n // Strip any lines consisting only of spaces and tabs.\n // This makes subsequent regexen easier to write, because we can\n // match consecutive blank lines with /\\n+/ instead of something\n // contorted like /[ \\t]*\\n+/ .\n text = text.replace(/^[ \\t]+$/gm, \"\");\n\n // Turn block-level HTML blocks into hash entries\n text = _HashHTMLBlocks(text);\n\n // Strip link definitions, store in hashes.\n text = _StripLinkDefinitions(text);\n\n if (inline_only) text = _RunSpanGamut(text);\n else text = _RunBlockGamut(text);\n\n text = _UnescapeSpecialChars(text);\n\n // attacklab: Restore dollar signs\n text = text.replace(/~D/g, \"$$\");\n\n // attacklab: Restore tildes\n text = text.replace(/~T/g, \"~\");\n\n return text;\n };\n\n var _StripLinkDefinitions = function (text) {\n //\n // Strips link definitions from text, stores the URLs and titles in\n // hash references.\n //\n\n // Link defs are in the form: ^[id]: url \"optional title\"\n\n /*\n var text = text.replace(/\n ^[ ]{0,3}\\[(.+)\\]: // id = $1 attacklab: g_tab_width - 1\n [ \\t]*\n \\n?\t\t\t\t// maybe *one* newline\n [ \\t]*\n ?\t\t\t// url = $2\n [ \\t]*\n \\n?\t\t\t\t// maybe one newline\n [ \\t]*\n (?:\n (\\n*)\t\t\t\t// any lines skipped = $3 attacklab: lookbehind removed\n [\"(]\n (.+?)\t\t\t\t// title = $4\n [\")]\n [ \\t]*\n )?\t\t\t\t\t// title is optional\n (?:\\n+|$)\n /gm,\n function(){...});\n */\n var text = text.replace(\n /^[ ]{0,3}\\[(.+)\\]:[ \\t]*\\n?[ \\t]*?[ \\t]*\\n?[ \\t]*(?:(\\n*)[\"(](.+?)[\")][ \\t]*)?(?:\\n+|\\Z)/gm,\n function (wholeMatch, m1, m2, m3, m4) {\n m1 = m1.toLowerCase();\n g_urls[m1] = _EncodeAmpsAndAngles(m2); // Link IDs are case-insensitive\n if (m3) {\n // Oops, found blank lines, so it's not a title.\n // Put back the parenthetical statement we stole.\n return m3 + m4;\n } else if (m4) {\n g_titles[m1] = m4.replace(/\"/g, \""\");\n }\n\n // Completely remove the definition from the text\n return \"\";\n }\n );\n\n return text;\n };\n\n var _HashHTMLBlocks = function (text) {\n // attacklab: Double up blank lines to reduce lookaround\n text = text.replace(/\\n/g, \"\\n\\n\");\n\n // Hashify HTML blocks:\n // We only want to do this for block-level HTML tags, such as headers,\n // lists, and tables. That's because we still want to wrap

      s around\n // \"paragraphs\" that are wrapped in non-block-level tags, such as anchors,\n // phrase emphasis, and spans. The list of tags we're looking for is\n // hard-coded:\n var block_tags_a =\n \"p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del\";\n var block_tags_b =\n \"p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math\";\n\n // First, look for nested blocks, e.g.:\n //

      \n //
      \n // tags for inner block must be indented.\n //
      \n //
      \n //\n // The outermost tags must start at the left margin for this to match, and\n // the inner nested divs must be indented.\n // We need to do this before the next, more liberal match, because the next\n // match will start at the first `
      ` and stop at the first `
      `.\n\n // attacklab: This regex can be expensive when it fails.\n /*\n var text = text.replace(/\n (\t\t\t\t\t\t// save in $1\n ^\t\t\t\t\t// start of line (with /m)\n <($block_tags_a)\t// start tag = $2\n \\b\t\t\t\t\t// word break\n // attacklab: hack around khtml/pcre bug...\n [^\\r]*?\\n\t\t\t// any number of lines, minimally matching\n \t\t\t\t// the matching end tag\n [ \\t]*\t\t\t\t// trailing spaces/tabs\n (?=\\n+)\t\t\t\t// followed by a newline\n )\t\t\t\t\t\t// attacklab: there are sentinel newlines at end of document\n /gm,function(){...}};\n */\n text = text.replace(\n /^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\\b[^\\r]*?\\n<\\/\\2>[ \\t]*(?=\\n+))/gm,\n hashElement\n );\n\n //\n // Now match more liberally, simply from `\\n` to `\\n`\n //\n\n /*\n var text = text.replace(/\n (\t\t\t\t\t\t// save in $1\n ^\t\t\t\t\t// start of line (with /m)\n <($block_tags_b)\t// start tag = $2\n \\b\t\t\t\t\t// word break\n // attacklab: hack around khtml/pcre bug...\n [^\\r]*?\t\t\t\t// any number of lines, minimally matching\n .*\t\t\t\t// the matching end tag\n [ \\t]*\t\t\t\t// trailing spaces/tabs\n (?=\\n+)\t\t\t\t// followed by a newline\n )\t\t\t\t\t\t// attacklab: there are sentinel newlines at end of document\n /gm,function(){...}};\n */\n text = text.replace(\n /^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math)\\b[^\\r]*?.*<\\/\\2>[ \\t]*(?=\\n+)\\n)/gm,\n hashElement\n );\n\n // Special case just for
      . It was easier to make a special case than\n // to make the other regex more complicated.\n\n /*\n text = text.replace(/\n (\t\t\t\t\t\t// save in $1\n \\n\\n\t\t\t\t// Starting after a blank line\n [ ]{0,3}\n (<(hr)\t\t\t\t// start tag = $2\n \\b\t\t\t\t\t// word break\n ([^<>])*?\t\t\t//\n \\/?>)\t\t\t\t// the matching end tag\n [ \\t]*\n (?=\\n{2,})\t\t\t// followed by a blank line\n )\n /g,hashElement);\n */\n text = text.replace(\n /(\\n[ ]{0,3}(<(hr)\\b([^<>])*?\\/?>)[ \\t]*(?=\\n{2,}))/g,\n hashElement\n );\n\n // Special case for standalone HTML comments:\n\n /*\n text = text.replace(/\n (\t\t\t\t\t\t// save in $1\n \\n\\n\t\t\t\t// Starting after a blank line\n [ ]{0,3}\t\t\t// attacklab: g_tab_width - 1\n \n [ \\t]*\n (?=\\n{2,})\t\t\t// followed by a blank line\n )\n /g,hashElement);\n */\n text = text.replace(\n /(\\n\\n[ ]{0,3}[ \\t]*(?=\\n{2,}))/g,\n hashElement\n );\n\n // PHP and ASP-style processor instructions ( and <%...%>)\n\n /*\n text = text.replace(/\n (?:\n \\n\\n\t\t\t\t// Starting after a blank line\n )\n (\t\t\t\t\t\t// save in $1\n [ ]{0,3}\t\t\t// attacklab: g_tab_width - 1\n (?:\n <([?%])\t\t\t// $2\n [^\\r]*?\n \\2>\n )\n [ \\t]*\n (?=\\n{2,})\t\t\t// followed by a blank line\n )\n /g,hashElement);\n */\n text = text.replace(\n /(?:\\n\\n)([ ]{0,3}(?:<([?%])[^\\r]*?\\2>)[ \\t]*(?=\\n{2,}))/g,\n hashElement\n );\n\n // attacklab: Undo double lines (see comment at top of this function)\n text = text.replace(/\\n\\n/g, \"\\n\");\n return text;\n };\n\n var hashElement = function (wholeMatch, m1) {\n var blockText = m1;\n\n // Undo double lines\n blockText = blockText.replace(/\\n\\n/g, \"\\n\");\n blockText = blockText.replace(/^\\n/, \"\");\n\n // strip trailing blank lines\n blockText = blockText.replace(/\\n+$/g, \"\");\n\n // Replace the element text with a marker (\"~KxK\" where x is its key)\n blockText = \"\\n\\n~K\" + (g_html_blocks.push(blockText) - 1) + \"K\\n\\n\";\n\n return blockText;\n };\n\n var _RunBlockGamut = function (text) {\n //\n // These are all the transformations that form block-level\n // tags like paragraphs, headers, and list items.\n //\n text = _DoHeaders(text);\n\n // Do Horizontal Rules:\n var key = hashBlock(\"
      \");\n text = text.replace(/^[ ]{0,2}([ ]?\\*[ ]?){3,}[ \\t]*$/gm, key);\n text = text.replace(/^[ ]{0,2}([ ]?\\-[ ]?){3,}[ \\t]*$/gm, key);\n text = text.replace(/^[ ]{0,2}([ ]?\\_[ ]?){3,}[ \\t]*$/gm, key);\n\n text = _DoLists(text);\n text = _DoCodeBlocks(text);\n text = _DoBlockQuotes(text);\n\n // We already ran _HashHTMLBlocks() before, in Markdown(), but that\n // was to escape raw HTML in the original Markdown source. This time,\n // we're escaping the markup we've just created, so that we don't wrap\n //

      tags around block-level tags.\n text = _HashHTMLBlocks(text);\n text = _FormParagraphs(text);\n\n return text;\n };\n\n var _RunSpanGamut = function (text) {\n //\n // These are all the transformations that occur *within* block-level\n // tags like paragraphs, headers, and list items.\n //\n\n text = _DoCodeSpans(text);\n text = _EscapeSpecialCharsWithinTagAttributes(text);\n text = _EncodeBackslashEscapes(text);\n\n // Process anchor and image tags. Images must come first,\n // because ![foo][f] looks like an anchor.\n text = _DoImages(text);\n text = _DoAnchors(text);\n\n // Make links out of things like ``\n // Must come after _DoAnchors(), because you can use < and >\n // delimiters in inline links like [this]().\n text = _DoAutoLinks(text);\n text = _EncodeAmpsAndAngles(text);\n text = _DoItalicsAndBold(text);\n\n // Do hard breaks:\n text = text.replace(/ +\\n/g, \"
      \\n\");\n\n return text;\n };\n\n var _EscapeSpecialCharsWithinTagAttributes = function (text) {\n //\n // Within tags -- meaning between < and > -- encode [\\ ` * _] so they\n // don't conflict with their use in Markdown for code, italics and strong.\n //\n\n // Build a regex to find HTML tags and comments. See Friedl's\n // \"Mastering Regular Expressions\", 2nd Ed., pp. 200-201.\n var regex = /(<[a-z\\/!$](\"[^\"]*\"|'[^']*'|[^'\">])*>|)/gi;\n\n text = text.replace(regex, function (wholeMatch) {\n var tag = wholeMatch.replace(/(.)<\\/?code>(?=.)/g, \"$1`\");\n tag = escapeCharacters(tag, \"\\\\`*_\");\n return tag;\n });\n\n return text;\n };\n\n var _DoAnchors = function (text) {\n //\n // Turn Markdown link shortcuts into XHTML
      tags.\n //\n //\n // First, handle reference-style links: [link text] [id]\n //\n\n /*\n text = text.replace(/\n (\t\t\t\t\t\t\t// wrap whole match in $1\n \\[\n (\n (?:\n \\[[^\\]]*\\]\t\t// allow brackets nested one level\n |\n [^\\[]\t\t\t// or anything else\n )*\n )\n \\]\n\n [ ]?\t\t\t\t\t// one optional space\n (?:\\n[ ]*)?\t\t\t\t// one optional newline followed by spaces\n\n \\[\n (.*?)\t\t\t\t\t// id = $3\n \\]\n )()()()()\t\t\t\t\t// pad remaining backreferences\n /g,_DoAnchors_callback);\n */\n text = text.replace(\n /(\\[((?:\\[[^\\]]*\\]|[^\\[\\]])*)\\][ ]?(?:\\n[ ]*)?\\[(.*?)\\])()()()()/g,\n writeAnchorTag\n );\n\n //\n // Next, inline-style links: [link text](url \"optional title\")\n //\n\n /*\n text = text.replace(/\n (\t\t\t\t\t\t// wrap whole match in $1\n \\[\n (\n (?:\n \\[[^\\]]*\\]\t// allow brackets nested one level\n |\n [^\\[\\]]\t\t\t// or anything else\n )\n )\n \\]\n \\(\t\t\t\t\t\t// literal paren\n [ \\t]*\n ()\t\t\t\t\t\t// no id, so leave $3 empty\n ?\t\t\t\t// href = $4\n [ \\t]*\n (\t\t\t\t\t\t// $5\n (['\"])\t\t\t\t// quote char = $6\n (.*?)\t\t\t\t// Title = $7\n \\6\t\t\t\t\t// matching quote\n [ \\t]*\t\t\t\t// ignore any spaces/tabs between closing quote and )\n )?\t\t\t\t\t\t// title is optional\n \\)\n )\n /g,writeAnchorTag);\n */\n text = text.replace(\n /(\\[((?:\\[[^\\]]*\\]|[^\\[\\]])*)\\]\\([ \\t]*()?[ \\t]*((['\"])(.*?)\\6[ \\t]*)?\\))/g,\n writeAnchorTag\n );\n\n //\n // Last, handle reference-style shortcuts: [link text]\n // These must come last in case you've also got [link test][1]\n // or [link test](/foo)\n //\n\n /*\n text = text.replace(/\n ( // wrap whole match in $1\n \\[\n ([^\\[\\]]+)\t\t\t\t// link text = $2; can't contain '[' or ']'\n \\]\n )()()()()()\t\t\t\t\t// pad rest of backreferences\n /g, writeAnchorTag);\n */\n text = text.replace(/(\\[([^\\[\\]]+)\\])()()()()()/g, writeAnchorTag);\n\n return text;\n };\n\n var writeAnchorTag = function (wholeMatch, m1, m2, m3, m4, m5, m6, m7) {\n if (m7 == undefined) m7 = \"\";\n var whole_match = m1;\n var link_text = m2;\n var link_id = m3.toLowerCase();\n var url = m4;\n var title = m7;\n\n if (url == \"\") {\n if (link_id == \"\") {\n // lower-case and turn embedded newlines into spaces\n link_id = link_text.toLowerCase().replace(/ ?\\n/g, \" \");\n }\n url = \"#\" + link_id;\n\n if (g_urls[link_id] != undefined) {\n url = g_urls[link_id];\n if (g_titles[link_id] != undefined) {\n title = g_titles[link_id];\n }\n } else {\n if (whole_match.search(/\\(\\s*\\)$/m) > -1) {\n // Special case for explicit empty url\n url = \"\";\n } else {\n return whole_match;\n }\n }\n }\n\n url = escapeCharacters(url, \"*_\");\n var result = '\" + _EncodeBackslashEscapes(link_text) + \"\";\n\n return result;\n };\n\n var _DoImages = function (text) {\n //\n // Turn Markdown image shortcuts into tags.\n //\n\n //\n // First, handle reference-style labeled images: ![alt text][id]\n //\n\n /*\n text = text.replace(/\n (\t\t\t\t\t\t// wrap whole match in $1\n !\\[\n (.*?)\t\t\t\t// alt text = $2\n \\]\n\n [ ]?\t\t\t\t// one optional space\n (?:\\n[ ]*)?\t\t\t// one optional newline followed by spaces\n\n \\[\n (.*?)\t\t\t\t// id = $3\n \\]\n )()()()()\t\t\t\t// pad rest of backreferences\n /g,writeImageTag);\n */\n text = text.replace(\n /(!\\[(.*?)\\][ ]?(?:\\n[ ]*)?\\[(.*?)\\])()()()()/g,\n writeImageTag\n );\n\n //\n // Next, handle inline images: ![alt text](url \"optional title\")\n // Don't forget: encode * and _\n\n /*\n text = text.replace(/\n (\t\t\t\t\t\t// wrap whole match in $1\n !\\[\n (.*?)\t\t\t\t// alt text = $2\n \\]\n \\s?\t\t\t\t\t// One optional whitespace character\n \\(\t\t\t\t\t// literal paren\n [ \\t]*\n ()\t\t\t\t\t// no id, so leave $3 empty\n ?\t\t\t// src url = $4\n [ \\t]*\n (\t\t\t\t\t// $5\n (['\"])\t\t\t// quote char = $6\n (.*?)\t\t\t// title = $7\n \\6\t\t\t\t// matching quote\n [ \\t]*\n )?\t\t\t\t\t// title is optional\n \\)\n )\n /g,writeImageTag);\n */\n text = text.replace(\n /(!\\[(.*?)\\]\\s?\\([ \\t]*()?[ \\t]*((['\"])(.*?)\\6[ \\t]*)?\\))/g,\n writeImageTag\n );\n\n return text;\n };\n\n var writeImageTag = function (wholeMatch, m1, m2, m3, m4, m5, m6, m7) {\n var whole_match = m1;\n var alt_text = m2;\n var link_id = m3.toLowerCase();\n var url = m4;\n var title = m7;\n\n if (!title) title = \"\";\n\n if (url == \"\") {\n if (link_id == \"\") {\n // lower-case and turn embedded newlines into spaces\n link_id = alt_text.toLowerCase().replace(/ ?\\n/g, \" \");\n }\n url = \"#\" + link_id;\n\n if (g_urls[link_id] != undefined) {\n url = g_urls[link_id];\n if (g_titles[link_id] != undefined) {\n title = g_titles[link_id];\n }\n } else {\n return whole_match;\n }\n }\n\n alt_text = alt_text.replace(/\"/g, \""\");\n url = escapeCharacters(url, \"*_\");\n var result = '\"'\";\n\n return result;\n };\n\n var _DoHeaders = function (text) {\n // Setext-style headers:\n //\tHeader 1\n //\t========\n //\n //\tHeader 2\n //\t--------\n //\n text = text.replace(\n /^(.+)[ \\t]*\\n=+[ \\t]*\\n+/gm,\n function (wholeMatch, m1) {\n return hashBlock(\"

      \" + _RunSpanGamut(m1) + \"

      \");\n }\n );\n\n text = text.replace(\n /^(.+)[ \\t]*\\n-+[ \\t]*\\n+/gm,\n function (matchFound, m1) {\n return hashBlock(\"

      \" + _RunSpanGamut(m1) + \"

      \");\n }\n );\n\n // atx-style headers:\n // # Header 1\n // ## Header 2\n // ## Header 2 with closing hashes ##\n // ...\n // ###### Header 6\n //\n\n /*\n text = text.replace(/\n ^(\\#{1,6})\t\t\t\t// $1 = string of #'s\n [ \\t]*\n (.+?)\t\t\t\t\t// $2 = Header text\n [ \\t]*\n \\#*\t\t\t\t\t\t// optional closing #'s (not counted)\n \\n+\n /gm, function() {...});\n */\n\n text = text.replace(\n /^(\\#{1,6})[ \\t]*(.+?)[ \\t]*\\#*\\n+/gm,\n function (wholeMatch, m1, m2) {\n var h_level = m1.length;\n return hashBlock(\n \"\" + _RunSpanGamut(m2) + \"\"\n );\n }\n );\n\n return text;\n };\n\n // This declaration keeps Dojo compressor from outputting garbage:\n var _ProcessListItems;\n\n var _DoLists = function (text) {\n //\n // Form HTML ordered (numbered) and unordered (bulleted) lists.\n //\n\n // attacklab: add sentinel to hack around khtml/safari bug:\n // http://bugs.webkit.org/show_bug.cgi?id=11231\n text += \"~0\";\n\n // Re-usable pattern to match any entirel ul or ol list:\n\n /*\n var whole_list = /\n (\t\t\t\t\t\t\t\t\t// $1 = whole list\n (\t\t\t\t\t\t\t\t// $2\n [ ]{0,3}\t\t\t\t\t// attacklab: g_tab_width - 1\n ([*+-]|\\d+[.])\t\t\t\t// $3 = first list item marker\n [ \\t]+\n )\n [^\\r]+?\n (\t\t\t\t\t\t\t\t// $4\n ~0\t\t\t\t\t\t\t// sentinel for workaround; should be $\n |\n \\n{2,}\n (?=\\S)\n (?!\t\t\t\t\t\t\t// Negative lookahead for another list item marker\n [ \\t]*\n (?:[*+-]|\\d+[.])[ \\t]+\n )\n )\n )/g\n */\n var whole_list =\n /^(([ ]{0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(~0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/gm;\n\n if (g_list_level) {\n text = text.replace(whole_list, function (wholeMatch, m1, m2) {\n var list = m1;\n var list_type = m2.search(/[*+-]/g) > -1 ? \"ul\" : \"ol\";\n\n // Turn double returns into triple returns, so that we can make a\n // paragraph for the last item in a list, if necessary:\n list = list.replace(/\\n{2,}/g, \"\\n\\n\\n\");\n var result = _ProcessListItems(list);\n\n // Trim any trailing whitespace, to put the closing ``\n // up on the preceding line, to get it past the current stupid\n // HTML block parser. This is a hack to work around the terrible\n // hack that is the HTML block parser.\n result = result.replace(/\\s+$/, \"\");\n result = \"<\" + list_type + \">\" + result + \"\\n\";\n return result;\n });\n } else {\n whole_list =\n /(\\n\\n|^\\n?)(([ ]{0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(~0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/g;\n text = text.replace(whole_list, function (wholeMatch, m1, m2, m3) {\n var runup = m1;\n var list = m2;\n\n var list_type = m3.search(/[*+-]/g) > -1 ? \"ul\" : \"ol\";\n // Turn double returns into triple returns, so that we can make a\n // paragraph for the last item in a list, if necessary:\n var list = list.replace(/\\n{2,}/g, \"\\n\\n\\n\");\n var result = _ProcessListItems(list);\n result =\n runup + \"<\" + list_type + \">\\n\" + result + \"\\n\";\n return result;\n });\n }\n\n // attacklab: strip sentinel\n text = text.replace(/~0/, \"\");\n\n return text;\n };\n\n _ProcessListItems = function (list_str) {\n //\n // Process the contents of a single ordered or unordered list, splitting it\n // into individual list items.\n //\n // The $g_list_level global keeps track of when we're inside a list.\n // Each time we enter a list, we increment it; when we leave a list,\n // we decrement. If it's zero, we're not in a list anymore.\n //\n // We do this because when we're not inside a list, we want to treat\n // something like this:\n //\n // I recommend upgrading to version\n // 8. Oops, now this line is treated\n // as a sub-list.\n //\n // As a single paragraph, despite the fact that the second line starts\n // with a digit-period-space sequence.\n //\n // Whereas when we're inside a list (or sub-list), that line will be\n // treated as the start of a sub-list. What a kludge, huh? This is\n // an aspect of Markdown's syntax that's hard to parse perfectly\n // without resorting to mind-reading. Perhaps the solution is to\n // change the syntax rules such that sub-lists must start with a\n // starting cardinal number; e.g. \"1.\" or \"a.\".\n\n g_list_level++;\n\n // trim trailing blank lines:\n list_str = list_str.replace(/\\n{2,}$/, \"\\n\");\n\n // attacklab: add sentinel to emulate \\z\n list_str += \"~0\";\n\n /*\n list_str = list_str.replace(/\n (\\n)?\t\t\t\t\t\t\t// leading line = $1\n (^[ \\t]*)\t\t\t\t\t\t// leading whitespace = $2\n ([*+-]|\\d+[.]) [ \\t]+\t\t\t// list marker = $3\n ([^\\r]+?\t\t\t\t\t\t// list item text = $4\n (\\n{1,2}))\n (?= \\n* (~0 | \\2 ([*+-]|\\d+[.]) [ \\t]+))\n /gm, function(){...});\n */\n list_str = list_str.replace(\n /(\\n)?(^[ \\t]*)([*+-]|\\d+[.])[ \\t]+([^\\r]+?(\\n{1,2}))(?=\\n*(~0|\\2([*+-]|\\d+[.])[ \\t]+))/gm,\n function (wholeMatch, m1, m2, m3, m4) {\n var item = m4;\n var leading_line = m1;\n var leading_space = m2;\n\n if (leading_line || item.search(/\\n{2,}/) > -1) {\n item = _RunBlockGamut(_Outdent(item));\n } else {\n // Recursion for sub-lists:\n item = _DoLists(_Outdent(item));\n item = item.replace(/\\n$/, \"\"); // chomp(item)\n item = _RunSpanGamut(item);\n }\n\n return \"
    • \" + item + \"
    • \\n\";\n }\n );\n\n // attacklab: strip sentinel\n list_str = list_str.replace(/~0/g, \"\");\n\n g_list_level--;\n return list_str;\n };\n\n var _DoCodeBlocks = function (text) {\n //\n // Process Markdown `
      ` blocks.\n    //\n\n    /*\n    text = text.replace(text,\n      /(?:\\n\\n|^)\n      (\t\t\t\t\t\t\t\t// $1 = the code block -- one or more lines, starting with a space/tab\n        (?:\n          (?:[ ]{4}|\\t)\t\t\t// Lines must start with a tab or a tab-width of spaces - attacklab: g_tab_width\n          .*\\n+\n        )+\n      )\n      (\\n*[ ]{0,3}[^ \\t\\n]|(?=~0))\t// attacklab: g_tab_width\n    /g,function(){...});\n  */\n\n    // attacklab: sentinel workarounds for lack of \\A and \\Z, safari\\khtml bug\n    text += \"~0\";\n\n    text = text.replace(\n      /(?:\\n\\n|^)((?:(?:[ ]{4}|\\t).*\\n+)+)(\\n*[ ]{0,3}[^ \\t\\n]|(?=~0))/g,\n      function (wholeMatch, m1, m2) {\n        var codeblock = m1;\n        var nextChar = m2;\n\n        codeblock = _EncodeCode(_Outdent(codeblock));\n        codeblock = _Detab(codeblock);\n        codeblock = codeblock.replace(/^\\n+/g, \"\"); // trim leading newlines\n        codeblock = codeblock.replace(/\\n+$/g, \"\"); // trim trailing whitespace\n\n        codeblock = \"
      \" + codeblock + \"\\n
      \";\n\n return hashBlock(codeblock) + nextChar;\n }\n );\n\n // attacklab: strip sentinel\n text = text.replace(/~0/, \"\");\n\n return text;\n };\n\n var hashBlock = function (text) {\n text = text.replace(/(^\\n+|\\n+$)/g, \"\");\n return \"\\n\\n~K\" + (g_html_blocks.push(text) - 1) + \"K\\n\\n\";\n };\n\n var _DoCodeSpans = function (text) {\n //\n // * Backtick quotes are used for spans.\n //\n // * You can use multiple backticks as the delimiters if you want to\n // include literal backticks in the code span. So, this input:\n //\n // Just type ``foo `bar` baz`` at the prompt.\n //\n // Will translate to:\n //\n //

      Just type foo `bar` baz at the prompt.

      \n //\n //\tThere's no arbitrary limit to the number of backticks you\n //\tcan use as delimters. If you need three consecutive backticks\n //\tin your code, use four for delimiters, etc.\n //\n // * You can use spaces to get literal backticks at the edges:\n //\n // ... type `` `bar` `` ...\n //\n // Turns to:\n //\n // ... type `bar` ...\n //\n\n /*\n text = text.replace(/\n (^|[^\\\\])\t\t\t\t\t// Character before opening ` can't be a backslash\n (`+)\t\t\t\t\t\t// $2 = Opening run of `\n (\t\t\t\t\t\t\t// $3 = The code block\n [^\\r]*?\n [^`]\t\t\t\t\t// attacklab: work around lack of lookbehind\n )\n \\2\t\t\t\t\t\t\t// Matching closer\n (?!`)\n /gm, function(){...});\n */\n\n text = text.replace(\n /(^|[^\\\\])(`+)([^\\r]*?[^`])\\2(?!`)/gm,\n function (wholeMatch, m1, m2, m3, m4) {\n var c = m3;\n c = c.replace(/^([ \\t]*)/g, \"\"); // leading whitespace\n c = c.replace(/[ \\t]*$/g, \"\"); // trailing whitespace\n c = _EncodeCode(c);\n return m1 + \"\" + c + \"\";\n }\n );\n\n return text;\n };\n\n var _EncodeCode = function (text) {\n //\n // Encode/escape certain characters inside Markdown code runs.\n // The point is that in code, these characters are literals,\n // and lose their special Markdown meanings.\n //\n // Encode all ampersands; HTML entities are not\n // entities within a Markdown code span.\n text = text.replace(/&/g, \"&\");\n\n // Do the angle bracket song and dance:\n text = text.replace(//g, \">\");\n\n // Now, escape characters that are magic in Markdown:\n text = escapeCharacters(text, \"*_{}[]\\\\\", false);\n\n // jj the line above breaks this:\n //---\n\n //* Item\n\n // 1. Subitem\n\n // special char: *\n //---\n\n return text;\n };\n\n var _DoItalicsAndBold = function (text) {\n // must go first:\n text = text.replace(\n /(\\*\\*|__)(?=\\S)([^\\r]*?\\S[*_]*)\\1/g,\n \"$2\"\n );\n\n text = text.replace(/(\\*|_)(?=\\S)([^\\r]*?\\S)\\1/g, \"$2\");\n\n return text;\n };\n\n var _DoBlockQuotes = function (text) {\n /*\n text = text.replace(/\n (\t\t\t\t\t\t\t\t// Wrap whole match in $1\n (\n ^[ \\t]*>[ \\t]?\t\t\t// '>' at the start of a line\n .+\\n\t\t\t\t\t// rest of the first line\n (.+\\n)*\t\t\t\t\t// subsequent consecutive lines\n \\n*\t\t\t\t\t\t// blanks\n )+\n )\n /gm, function(){...});\n */\n\n text = text.replace(\n /((^[ \\t]*>[ \\t]?.+\\n(.+\\n)*\\n*)+)/gm,\n function (wholeMatch, m1) {\n var bq = m1;\n\n // attacklab: hack around Konqueror 3.5.4 bug:\n // \"----------bug\".replace(/^-/g,\"\") == \"bug\"\n\n bq = bq.replace(/^[ \\t]*>[ \\t]?/gm, \"~0\"); // trim one level of quoting\n\n // attacklab: clean up hack\n bq = bq.replace(/~0/g, \"\");\n\n bq = bq.replace(/^[ \\t]+$/gm, \"\"); // trim whitespace-only lines\n bq = _RunBlockGamut(bq); // recurse\n\n bq = bq.replace(/(^|\\n)/g, \"$1 \");\n // These leading spaces screw with
       content, so we need to fix that:\n        bq = bq.replace(\n          /(\\s*
      [^\\r]+?<\\/pre>)/gm,\n          function (wholeMatch, m1) {\n            var pre = m1;\n            // attacklab: hack around Konqueror 3.5.4 bug:\n            pre = pre.replace(/^  /gm, \"~0\");\n            pre = pre.replace(/~0/g, \"\");\n            return pre;\n          }\n        );\n\n        return hashBlock(\"
      \\n\" + bq + \"\\n
      \");\n }\n );\n return text;\n };\n\n var _FormParagraphs = function (text) {\n //\n // Params:\n // $text - string to process with html

      tags\n //\n\n // Strip leading and trailing lines:\n text = text.replace(/^\\n+/g, \"\");\n text = text.replace(/\\n+$/g, \"\");\n\n var grafs = text.split(/\\n{2,}/g);\n var grafsOut = new Array();\n\n //\n // Wrap

      tags.\n //\n var end = grafs.length;\n for (var i = 0; i < end; i++) {\n var str = grafs[i];\n\n // if this is an HTML marker, copy it\n if (str.search(/~K(\\d+)K/g) >= 0) {\n grafsOut.push(str);\n } else if (str.search(/\\S/) >= 0) {\n str = _RunSpanGamut(str);\n str = str.replace(/^([ \\t]*)/g, \"

      \");\n str += \"

      \";\n grafsOut.push(str);\n }\n }\n\n //\n // Unhashify HTML blocks\n //\n end = grafsOut.length;\n for (var i = 0; i < end; i++) {\n // if this is a marker for an html block...\n while (grafsOut[i].search(/~K(\\d+)K/) >= 0) {\n var blockText = g_html_blocks[RegExp.$1];\n blockText = blockText.replace(/\\$/g, \"$$$$\"); // Escape any dollar signs\n grafsOut[i] = grafsOut[i].replace(/~K\\d+K/, blockText);\n }\n }\n\n return grafsOut.join(\"\\n\\n\");\n };\n\n var _EncodeAmpsAndAngles = function (text) {\n // Smart processing for ampersands and angle brackets that need to be encoded.\n\n // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:\n // http://bumppo.net/projects/amputator/\n text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\\w+);)/g, \"&\");\n\n // Encode naked <'s\n text = text.replace(/<(?![a-z\\/?\\$!])/gi, \"<\");\n\n return text;\n };\n\n var _EncodeBackslashEscapes = function (text) {\n //\n // Parameter: String.\n // Returns:\tThe string, with after processing the following backslash\n // escape sequences.\n //\n\n // attacklab: The polite way to do this is with the new\n // escapeCharacters() function:\n //\n // text = escapeCharacters(text,\"\\\\\",true);\n // text = escapeCharacters(text,\"`*_{}[]()>#+-.!\",true);\n //\n // ...but we're sidestepping its use of the (slow) RegExp constructor\n // as an optimization for Firefox. This function gets called a LOT.\n\n text = text.replace(/\\\\(\\\\)/g, escapeCharacters_callback);\n text = text.replace(/\\\\([`*_{}\\[\\]()>#+-.!])/g, escapeCharacters_callback);\n return text;\n };\n\n var _DoAutoLinks = function (text) {\n text = text.replace(\n /<((https?|ftp|dict):[^'\">\\s]+)>/gi,\n '$1'\n );\n\n // Email addresses: \n\n /*\n text = text.replace(/\n <\n (?:mailto:)?\n (\n [-.\\w]+\n \\@\n [-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+\n )\n >\n /gi, _DoAutoLinks_callback());\n */\n text = text.replace(\n /<(?:mailto:)?([-.\\w]+\\@[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+)>/gi,\n function (wholeMatch, m1) {\n return _EncodeEmailAddress(_UnescapeSpecialChars(m1));\n }\n );\n\n return text;\n };\n\n var _EncodeEmailAddress = function (addr) {\n //\n // Input: an email address, e.g. \"foo@example.com\"\n //\n // Output: the email address as a mailto link, with each character\n //\tof the address encoded as either a decimal or hex entity, in\n //\tthe hopes of foiling most address harvesting spam bots. E.g.:\n //\n //\tfoo\n // @example.com\n //\n // Based on a filter by Matthew Wickline, posted to the BBEdit-Talk\n // mailing list: \n //\n\n // attacklab: why can't javascript speak hex?\n function char2hex(ch) {\n var hexDigits = \"0123456789ABCDEF\";\n var dec = ch.charCodeAt(0);\n return hexDigits.charAt(dec >> 4) + hexDigits.charAt(dec & 15);\n }\n\n var encode = [\n function (ch) {\n return \"&#\" + ch.charCodeAt(0) + \";\";\n },\n function (ch) {\n return \"&#x\" + char2hex(ch) + \";\";\n },\n function (ch) {\n return ch;\n }\n ];\n\n addr = \"mailto:\" + addr;\n\n addr = addr.replace(/./g, function (ch) {\n if (ch == \"@\") {\n // this *must* be encoded. I insist.\n ch = encode[Math.floor(Math.random() * 2)](ch);\n } else if (ch != \":\") {\n // leave ':' alone (to spot mailto: later)\n var r = Math.random();\n // roughly 10% raw, 45% hex, 45% dec\n ch = r > 0.9 ? encode[2](ch) : r > 0.45 ? encode[1](ch) : encode[0](ch);\n }\n return ch;\n });\n\n addr = '' + addr + \"\";\n addr = addr.replace(/\">.+:/g, '\">'); // strip the mailto: from the visible part\n\n return addr;\n };\n\n var _UnescapeSpecialChars = function (text) {\n //\n // Swap back in all the special characters we've hidden.\n //\n text = text.replace(/~E(\\d+)E/g, function (wholeMatch, m1) {\n var charCodeToReplace = parseInt(m1);\n return String.fromCharCode(charCodeToReplace);\n });\n return text;\n };\n\n var _Outdent = function (text) {\n //\n // Remove one level of line-leading tabs or spaces\n //\n\n // attacklab: hack around Konqueror 3.5.4 bug:\n // \"----------bug\".replace(/^-/g,\"\") == \"bug\"\n\n text = text.replace(/^(\\t|[ ]{1,4})/gm, \"~0\"); // attacklab: g_tab_width\n\n // attacklab: clean up hack\n text = text.replace(/~0/g, \"\");\n\n return text;\n };\n\n var _Detab = function (text) {\n // attacklab: Detab's completely rewritten for speed.\n // In perl we could fix it by anchoring the regexp with \\G.\n // In javascript we're less fortunate.\n\n // expand first n-1 tabs\n text = text.replace(/\\t(?=\\t)/g, \" \"); // attacklab: g_tab_width\n\n // replace the nth with two sentinels\n text = text.replace(/\\t/g, \"~A~B\");\n\n // use the sentinel to anchor our regex so it doesn't explode\n text = text.replace(/~B(.+?)~A/g, function (wholeMatch, m1, m2) {\n var leadingText = m1;\n var numSpaces = 4 - (leadingText.length % 4); // attacklab: g_tab_width\n\n // there *must* be a better way to do this:\n for (var i = 0; i < numSpaces; i++) leadingText += \" \";\n\n return leadingText;\n });\n\n // clean up sentinels\n text = text.replace(/~A/g, \" \"); // attacklab: g_tab_width\n text = text.replace(/~B/g, \"\");\n\n return text;\n };\n\n //\n // attacklab: Utility functions\n //\n\n var escapeCharacters = function (text, charsToEscape, afterBackslash) {\n // First we have to escape the escape characters so that\n // we can build a character class out of them\n var regexString =\n \"([\" + charsToEscape.replace(/([\\[\\]\\\\])/g, \"\\\\$1\") + \"])\";\n\n if (afterBackslash) {\n regexString = \"\\\\\\\\\" + regexString;\n }\n\n var regex = new RegExp(regexString, \"g\");\n text = text.replace(regex, escapeCharacters_callback);\n\n return text;\n };\n\n var escapeCharacters_callback = function (wholeMatch, m1) {\n var charCodeToEscape = m1.charCodeAt(0);\n return \"~E\" + charCodeToEscape + \"E\";\n };\n}; // end of Showdown.converter\n\nexport default Showdown;\n","import { default as Showdown } from \"$showdown\";\nexport { converter };\n\nconst converter = new Showdown.converter();\n\nconst orig = converter.makeHtml.bind(converter);\nconverter.makeHtml = (text, inline) =>\n orig(text, inline).replace(/ getQuestionLabelGroup(elt) || elt);\n }\n\n function getMatchingChildOrSelf(elt, match) {\n var tw = document.createTreeWalker(\n elt,\n nf.SHOW_ELEMENT,\n matcher(match),\n false\n );\n tw.nextNode();\n return tw.currentNode;\n }\n\n function render(srcs) {\n var src = srcs[0],\n multiple = srcs.length > 1;\n if (!src.widgets) return;\n for (let widget of src.widgets) {\n let container = widget.nextElementSibling,\n infogroups,\n id,\n contents = Mustache.render(tmpl, {\n sources: srcs.map(function (src) {\n return prepareSource(src);\n }),\n multiple: multiple\n });\n\n if (!container || container.className !== \"bb-p-info-inline-block\") {\n id = \"bb-p-info-inline-\" + genid();\n widget.insertAdjacentHTML(\n buttonplacement(conf),\n \"' +\n '' +\n _(\"more info about this question\") +\n \"\" +\n \"\\n\"\n );\n\n var after = blockafterlabel(conf)\n ? getMatchingChildOrSelf(widget, '[data-type=\"label\"]')\n : widget;\n\n after.insertAdjacentHTML(\n \"afterEnd\",\n \"\" +\n \"
        \" +\n contents +\n \"
      \" +\n \"' +\n _(\"close\") +\n \"\" +\n \"
      \"\n );\n } else {\n infogroups = container.getAttribute(\"data-info-inline-groups\");\n if (infogroups.indexOf(src.groupguid) < -1) {\n container.children[0].insertAdjacentHTML(\"beforeEnd\", contents);\n container.setAttribute(\n \"data-info-inline-groups\",\n infogroups + src.groupguid\n );\n }\n }\n }\n }\n\n function toggleInfo() {\n var id = this.getAttribute(\"aria-controls\");\n setInfo(id);\n }\n\n function removeAgain(group) {\n return function () {\n $(group).removeClass(\"bb-p-info-inline-block-again\");\n };\n }\n\n function setInfo(id, show) {\n var group = document.getElementById(id);\n var hidden = group.style.display === \"none\";\n if (show === undefined) show = hidden;\n if (show && !hidden) {\n $(group).addClass(\"bb-p-info-inline-block-again\");\n var removal = removeAgain(group);\n group.addEventListener(\"webkitAnimationEnd\", removal);\n group.addEventListener(\"animationend\", removal);\n return;\n }\n $('.bb-p-info-inline-link[aria-controls=\"' + id + '\"]').toggleClass(\n \"bb-p-info-inline-expanded\",\n show\n );\n document\n .querySelector(`.bb-p-info-inline-link[aria-controls=\"${id}\"]`)\n .setAttribute(\"aria-selected\", show);\n $(group).slideToggle(show);\n if (show) {\n win.setTimeout(\n group =>\n group.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n inline: \"center\"\n }),\n 400,\n group\n );\n } else {\n // infobtn is the '?' button, and a good marker of where to scroll back to.\n let infobtn = doc.querySelector(\n `.bb-p-info-inline-link[aria-controls=\"${id}\"]`\n );\n infobtn.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n inline: \"center\"\n });\n }\n }\n\n function matcher(selector) {\n return function (node) {\n return (node.matches || node.msMatchesSelector).bind(node)(selector)\n ? nf.FILTER_ACCEPT\n : nf.FILTER_SKIP;\n };\n }\n\n $(doc).on(\"click\", 'a[href^=\"bb:info\"]', function (ev) {\n ev.preventDefault();\n var tw = document.createTreeWalker(\n document.body,\n nf.SHOW_ELEMENT,\n matcher(\".bb-p-info-inline-link\"),\n false\n );\n tw.currentNode = this;\n if (tw.previousNode())\n setInfo(tw.currentNode.getAttribute(\"aria-controls\"), true);\n return false;\n });\n\n $(doc).on(\"click\", \".bb-p-info-inline-link\", toggleInfo);\n $(doc).on(\"click\", \".bb-p-info-inline-close\", toggleInfo);\n });\n})(jQuery, window, document, window.NodeFilter);\n","import { bb } from \"$json\";\n/* language-auto-switch:\n *\n * This plugin will look at the\n * model language and swicth to\n * the correct layer based on a\n * provided set of layers.\n *\n * NB Dependencies:\n * For each layer using this plugin,\n * there needs to be an arbitrary\n * object in the main conf.json\n * mapping the languages to their\n * respective layers. The base-layer\n * should always point to the primary\n * language layer, usually bb.html\n *\n * e.g.:\n\"arbitrary\": {\n \"languageLayers\": {\n \"base-layer\": \"bb.html\",\n \"en-us\": \"en.html\",\n \"nl-nl\": \"bb.html\"\n }\n},\n * Author: Tim Bauwens\n * Copyright 2017 Berkeley Bridge\n *\n */\n\n(function ($, document) {\n $(document).on(\"bb:postHandleData\", function (event, data) {\n if (data && data.groups) {\n var modellanguage = data.modellanguage;\n var currentLayerlanguage = window.location.pathname\n .split(\"/\")\n .slice(-1)[0];\n if (currentLayerlanguage === \"\")\n currentLayerlanguage = bb.conf.arbitrary.languageLayers[\"base-layer\"];\n var desiredLayerlanguage =\n bb.conf.arbitrary.languageLayers[modellanguage];\n if (\n desiredLayerlanguage &&\n desiredLayerlanguage != currentLayerlanguage\n ) {\n window.location.assign(desiredLayerlanguage);\n }\n }\n });\n})(jQuery, document);\n","import { converter } from \"$md-converter\";\nimport { conf } from \"$json/lib/conf\";\nimport { updateLabels } from \"$json/lib/feature-queries\";\nimport { isLabel } from \"$json/lib/control-helpers\";\nimport { has } from \"$json/lib/functional\";\n\n/* md-labels.js:\n * Markdown all labels after insertion into the DOM\n *\n *\n *\n * Author: Niels Giesen\n * Copyright 2013, 2015, 2019 Berkeley Bridge\n *\n */\n\n(function ($) {\n $(function () {\n var topLevel, policy;\n\n try {\n var baseLevel = conf.arbitrary.headings.baseLevel;\n if (baseLevel === undefined) throw \"baseLevel is not defined\";\n topLevel = baseLevel - 1;\n } catch (err) {\n topLevel = 0;\n }\n\n try {\n policy = conf.arbitrary.showdown.policy;\n if ([\"legacy\"].indexOf(policy) === -1)\n throw \"showdown.policy is not 'legacy'\";\n } catch (err) {}\n\n const newline = conf.plugins.includes(\"showdown\") ? \"\\n\\n\" : \"\\n\";\n const newlineGlobRe = new RegExp(newline, \"g\");\n\n /**\n * Regular expression for paragraph open/end tags.\n * We don't want them.\n *\n **/\n var br_re = /
      /gi,\n onlyPhrasingInside = [\n \"P\",\n \"H1\",\n \"H2\",\n \"H3\",\n \"H4\",\n \"H5\",\n \"H6\",\n \"SPAN\",\n \"LABEL\",\n \"LEGEND\",\n \"CAPTION\"\n ];\n\n if (policy === \"legacy\") {\n onlyPhrasingInside.splice(9);\n }\n\n $.fn.showdown = function () {\n return this.each(function (i, e) {\n if (e.classList.contains(\"bb-p-showdown-labels\")) return;\n e = $(e);\n var html_in, html_out;\n var onlyPhrasing = allowOnlyPhrasing(e);\n let newline = \"\\n\";\n\n html_in = e.html().replace(br_re, newline);\n html_out = converter.makeHtml(html_in, onlyPhrasing);\n if (onlyPhrasing)\n html_out = html_out.trim().replace(newlineGlobRe, \"
      \");\n\n if (topLevel !== 0)\n html_out = html_out.replace(/(<\\/?h)([1-6])/g, demoteHeading);\n\n e.html(html_out).addClass(\"bb-p-showdown-labels\");\n });\n };\n\n function allowOnlyPhrasing(e) {\n return (\n onlyPhrasingInside.indexOf(e.get(0).nodeName) > -1 ||\n (policy !== \"legacy\" && e.hasClass(\"bb-label\"))\n );\n }\n\n function demoteHeading(m, m1, m2) {\n return m1 + Math.min(6, topLevel + Number(m2));\n }\n\n $(document).on(\"bb:postHandleData\", function (event, data) {\n if (data && data.groups) {\n $(\".bb-md-able\").showdown();\n $(document).trigger(\"bb:md-done\");\n $(document).trigger(\"bb:resized\");\n }\n });\n });\n\n document.addEventListener(\n \"bb:updatedControl\",\n ({ detail: { control, Updates } }) => {\n if (has(\"value\", Updates) && isLabel(control) && updateLabels(conf)) {\n control._elt.classList.remove(\"bb-p-showdown-labels\");\n control.$elt.showdown();\n }\n if (\n has(\"value\", Updates) &&\n control.controltype === \"grid\" &&\n updateLabels(conf)\n ) {\n control.$elt.find(\".bb-md-able\").showdown();\n }\n }\n );\n})(jQuery);\n","/* model-filter:\n *\n * Filter models by name\n *\n * Author: Niels Giesen\n * Copyright 2013, 2016 Berkeley Bridge\n *\n */\n(function ($, doc) {\n var $filter;\n\n $(function () {\n var $doc = $(doc);\n $filter = $(\"#bb-p-model-filter\");\n\n $doc\n .on(\"bb:postHandleData\", filter)\n .on(\"keyup\", \"#bb-p-model-filter\", filter)\n .on(\"click touchstart\", \"#bb-p-model-filter-clear\", clear);\n\n $filter.on(\"keydown\", function (ev) {\n if (ev.keyCode === 13) {\n var $filtered = $(\".bb-model:visible\");\n if ($filtered.length === 1)\n $filtered.find(\".bb-newcase\").addBack().last().trigger(\"click\");\n }\n });\n });\n\n function filter() {\n $(\"#bb-p-model-filter-nomatches\").hide();\n var val = $.trim($filter.val());\n var hasmatch = false;\n if (val.length >= 3) {\n var re = new RegExp(val, \"i\");\n $(\".bb-model\").each(function () {\n var $this = $(this);\n // Find the description in the child or -- when absent -- as\n // the text content itself\n var text = $this.find(\".bb-model-name\").text() || $this.text();\n var ismatch = val.length < 3 || re.test(text);\n hasmatch = hasmatch || ismatch;\n $this.toggle(ismatch);\n });\n }\n $filter.toggleClass(\"bb-p-model-filter-has-no-match\", !hasmatch);\n if (!hasmatch) {\n $(\".bb-model\").show();\n }\n }\n\n function clear() {\n $filter.val(\"\").trigger(\"keyup\").trigger(\"focus\");\n }\n})(jQuery, document);\n","/* modelinfo:\n *\n * Get info for current model\n *\n * @dependencies: mustache\n *\n * Author: Niels Giesen\n * Copyright 2016 Berkeley Bridge\n *\n */\nimport Mustache from \"$mustache\";\nimport { fromApiServer } from \"$json/lib/location.js\";\nimport { has } from \"$json/lib/functional.js\";\n(function ($, win, doc) {\n var _info = [],\n infoNodes,\n hash = {},\n lastId;\n\n $(function () {\n $(doc).on(\"bb:preHandleData\", function (event, data) {\n if (data && has(\"modelid\", data))\n if (!_info[data.modelid]) {\n $.get(\n fromApiServer(\n \"api/models/\" + data.modelid + \"?uniqueid=\" + data.uniqueid\n )\n ).then(function (res) {\n var model = new Model(res);\n _info[data.modelid] = model;\n model.replace();\n });\n } else {\n _info[data.modelid].replace();\n }\n });\n\n Mustache.tags = [\"[[\", \"]]\"];\n // templates = $('.bb-p-modelinfo-template');\n infoNodes = document.querySelectorAll(\".p-modelinfo\");\n\n // if (!(templates && infoNodes))\n // return false;\n\n function Model(res) {\n for (var prop in res) {\n if (has(prop, res)) this[prop] = res[prop];\n }\n this.author = {\n name: res.authorname,\n info: res.authorinfo\n };\n this.model = {\n info: res.extramodelinfo\n };\n this.setInfo(\"author\");\n this.setInfo(\"model\");\n return this;\n }\n\n Model.prototype.setInfo = function (prop) {\n var info = String(this[prop].info).split(/\\n/);\n info.map(\n function (line) {\n var kv = line.split(/\\:/),\n k = kv[0],\n v = kv.slice(1).join(\":\");\n this[prop][k] = v;\n }.bind(this)\n );\n delete this[prop].info;\n };\n\n Model.prototype.replace = function () {\n if (lastId !== this.id) $(doc).trigger(\"bb-p:modelinfo\", this);\n lastId = this.id;\n // The following could be conditional upon lastId !== this.id too, probably.\n for (var i = 0; i < infoNodes.length; ++i) {\n var infoNode = infoNodes[i];\n if (infoNode.getAttribute(\"data-p-modelinfo-id\") === String(this.id)) {\n // no need to replace\n } else {\n var tmpl = $(\n \"#\" + infoNode.getAttribute(\"data-p-modelinfo-template\")\n ).html();\n var contents = Mustache.render(tmpl, this);\n infoNode.innerHTML = contents;\n infoNode.setAttribute(\"data-p-modelinfo-id\", this.id);\n }\n }\n };\n\n return true;\n });\n})(jQuery, window, document);\n","import { escapeHTML } from \"$json/lib/escape\";\nimport { positionalFormat } from \"$json/lib/text-utils\";\nimport { _ } from \"$json/lib/gettext\";\nimport { bb } from \"$json\";\n\nbb.createModelItem = function (model) {\n return (\n '
      ' +\n '
      ' +\n escapeHTML(model._nicename) +\n \"
      \" +\n '\" +\n (model.caselistingallowed && model.casecount\n ? '\"\n : \"\") +\n \"
      \"\n );\n};\n","/* non-indenting-jumplist:\n *\n * Throw away indentation level information of the jumplist, so that a\n * flat jumplist will be created.\n *\n * This can be useful for horizontally layed-out jumplists.\n *\n * Copyright (C) 2010, 2011, 2015 by Berkeley Bridge\n *\n */\n\n(function ($) {\n $(document).on(\"bb:preHandleData\", function (event, data) {\n if (data.jumplist) {\n $.each(data.jumplist, function (group) {\n data.jumplist[group].level = 0;\n data.jumplist[group].screentitle =\n data.jumplist[group].screentitle.trim();\n });\n }\n });\n})(jQuery);\n","import { bb } from \"$json\";\n/*\n * reset-password:\n *\n * This global plugin gives the theme\n * a reset link below the login form\n * which will link to the live/ html\n * - a theme ambiguous simple layer\n * handling all aspects of resulting\n * password changing methods.\n *\n * NB: Dependencies:\n *\n * There needs to be a plugin-specific\n * link hard-coded into the theme, e.g.:\n *\n\n {{#plugins.reset-password}}\n \n \n \n I forgot my password...\n
      \n \n \n {{/plugins.reset-password}}\n\n * Author: Tim Bauwens\n * Copyright 2018 Berkeley Bridge\n *\n */\n\n(function ($, win, doc) {\n $(doc).ready(function () {\n try {\n var lang = bb.conf.lang;\n var helpdesk =\n bb.conf.arbitrary &&\n bb.conf.arbitrary.resetpasswordHelpdesk != undefined\n ? bb.conf.arbitrary.resetpasswordHelpdesk\n : \"\";\n var theme =\n self == top ? window.location.href : \"iframe+\" + document.referrer;\n var href =\n \"plugins/reset-password/live/newpwd.html\" +\n \"?theme=\" +\n encodeURIComponent(theme) +\n \"&lang=\" +\n lang +\n \"&helpdesk=\" +\n encodeURIComponent(helpdesk);\n $(\"#p-reset-password-link\").attr(\"href\", href);\n } catch (e) {\n /*\n If we couldn't determine the theme or lang,\n it's not worth sending the user\n potentially back to the wrong place.\n */\n $(\"#p-reset-password-link\").hide();\n }\n });\n})(jQuery, window, document);\n","import { bb } from \"$json\";\n/* shout-out-resize: post message to parent on resize\n *\n *\n * Author: Niels Giesen\n * Copyright 2013, 2016, 2019, 2021 Berkeley Bridge\n *\n */\n(function pluginShoutOut($, document) {\n const leeway = bb.propFinder(bb.conf, \"arbitrary\")(\n \"shout-out-resize.leeway\",\n 80\n );\n const minheight = bb.propFinder(bb.conf, \"arbitrary\")(\n \"shout-out-resize.minheight\",\n 100\n );\n const timeout = 200;\n let origins;\n\n if (top === self) {\n bb.Mode.unset(\"isEmbedded\");\n if (typeof console != \"undefined\" && console && console.log) {\n console.log(\"Not inside iframe... backing out early\");\n }\n return;\n } else {\n bb.Mode.set(\"isEmbedded\");\n }\n\n if (!(\"postMessage\" in window.parent)) {\n return;\n }\n try {\n origins = bb.conf?.arbitrary?.parentDomain || location.origin; //e.g. 'https://bridge-to-knowledge.nl';\n if (typeof origins === \"string\") {\n origins = [origins];\n }\n } catch (e) {\n window.console && window.console.warn(e);\n return;\n }\n\n function callOut(data) {\n bb.Mode.set(\"isNotScrolling\");\n origins.forEach(function (origin) {\n window.parent.postMessage(JSON.stringify(data), origin);\n });\n }\n\n $(function () {\n if (\"ResizeObserver\" in window) {\n const ro = new ResizeObserver(function (entries) {\n const cr = entries[0].contentRect;\n let height = cr.height >= minheight ? cr.height : minheight;\n callOut({ height: height });\n });\n ro.observe(document.body);\n } else {\n const resize = () => {\n callOut({ height: $(document.body).height() + leeway });\n };\n\n $(\"body\").append(\n ''\n );\n\n document.getElementById(\"frame0\").onresize = function () {\n window.setTimeout(resize, timeout);\n };\n\n $(document).on(\"bb:postHandleData\", resize);\n $(document).on(\"bb:resized\", resize);\n $(document).on(\"bb:userError\", resize);\n }\n });\n})(jQuery, document);\n","/* global $ */\nimport { _ } from \"$json\";\nimport { quotable } from \"$json/lib/quotable.js\";\nimport { format } from \"$json/lib/text-utils.js\";\n/* show-server-side-validation:\n *\n * Show errors after server-side validation.\n *\n * Copyright (C) 2011, 2017 by Berkeley Bridge\n *\n */\nconst options = {\n silent: false,\n justhide: false\n};\n\n$(document).on(\"bb:postHandleData\", function (event, data) {\n if (data && data.lasterrors && data.lasterrors.length > 0) {\n var error;\n for (var i = 0, len = data.lasterrors.length; i < len; i++) {\n error = data.lasterrors[i];\n const control = data.groups\n .find(({ current }) => current)\n .controls.find(({ id }) => id === `${data.screenid}-${error.name}`);\n\n $(`[id=\"${data.screenid}-${error.name}\"]`).showValidation(\n options,\n false,\n format(map(error.errortext), quotable(control))\n );\n }\n }\n});\n\nfunction map(errortext) {\n switch (errortext) {\n case \"Input mandatory\":\n return _(\"Input required\");\n case \"E4004:Choice is mandatory\":\n return _(\"Choice required\");\n default:\n return _(errortext);\n }\n}\n"],"names":["jQuery","$","datepicker","regional","closeText","prevText","nextText","currentText","monthNames","monthNamesShort","dayNames","dayNamesShort","dayNamesMin","weekHeader","dateFormat","firstDay","isRTL","showMonthAfterYear","yearSuffix","setDefaults","dicts","dict","_","s","fb","tagged","strings","values","reduce","acc","cur","idx","taggedWithin","prefix","set","ob","lang","key","val","Object","entries","addTranslations","translations","term","hasOwnProperty","freeze","new","Delete","case","cases","created","report","Sun","Mon","Tue","Wed","Thu","Fri","Sat","Jan","Feb","Mar","Apr","May","June","July","Aug","Sep","Oct","Nov","Dec","Yesterday","cUMWrongUserNamePassword","cWebCaseIsRunning","password","open","__digitgroupingchar__","__radixpoint__","__digitgroupingrules__","attachments","dateplaceholder","cancel","self","window","URLSearchParams","plus","get","q","toString","String","isArray","create","defineProperty","find","findPercentSign","replace","proto","append","value","appendTo","this","_ungap","delete","has","getAll","slice","forEach","callback","thisArg","invoke","call","toJSON","query","encoded","encode","i","length","push","join","prototype","configurable","writable","charAt","pairs","split","index","indexOf","decode","addEach","res","str","decodeURIComponent","encodeURIComponent","replacer","match","Array","positionalFormat","args","arguments","num","undefined","parseInt","format","sub","URLSearchParamsProto","iterable","Symbol","iterator","o_O","items","next","shift","done","names","name","keys","sort","entry","dP","gOPD","getOwnPropertyDescriptor","updateSearchParams","sp","_usp","search","verifySearchParams","obj","Class","TypeError","upgradeClass","createSearchParams","polluteSearchParams","ClassProto","searchParams","href","del","createSearchParamsPollute","defineProperties","_searchParams","HTMLAnchorElement","test","URL","meh","formatPlus","CODES","cException","cHTMLFormLoadCaseNotFound","cHTMLMenuFileNotFound","cWebModelIDDifferent","cWebPleaseLogin","cGetFileNotAllowed","cGetDocumentNotFound","cWebSessionTimeOut","cWebNoModelID","cWebIllegalAccess","cWebModelNotFound","cEngineLoadCaseFailed","cEngineUpgrading","cEngineNoInterfacesToShow","cEngineLoadCaseFailedNotFound","cEngineLoadCaseFailedWrongType","cEngineLoadCaseFailedWrongData","cWebOpenIsCalledWithUniqueID","cTechGraphVizNotInstalled","cGraphVizSessionNotFound","cUMUserNotFound","cUMModelNotFound","cUMCaseNotFound","cWebAdminNotAllowed","cEngineGotoNodeFailed","cPreviewNoCaseFound","cTechUploadedFileToLarge","cWebSaveCaseNotAllowed","cWebSaveCaseFailed","cInvalidUpload","CODESREV","fromEntries","map","_token","tokenChannel","BroadcastChannel","token","addEventListener","removeEventListener","getHash","async","message","msgUint8","TextEncoder","hashBuffer","crypto","subtle","digest","from","Uint8Array","b","padStart","digestMessage","setToken","postMessage","then","tokenHash","tokenize","parse","rules","input","tokenized","regex","exec","type","rest","Error","JSON","stringify","tokenizer","ast","parents","Number","parentAst","pop","Identity","x","fn","Const","lens","getter","setter","functor","target","focus","over","view","_apply","dec","arg","identity","isNil","not","a","pipe","fns","compose","reduceRight","curry","args2","sep","arr","reverse","always","F","T","propOr","or","prop","ifElse","pathOr","pathArg","path","tail","_nth","head","cond","choose","any","_findIndex","findIndex","_eqBy","_equals","_all","_append","_test","string","_match","a_value","b_value","_eqProps","_hasPath","p","_assoc","result","_assocPath","nextObj","isInteger","assocPath","concat","assoc","_consume","argN","_propEq","_pathEq","_has","complement","_tryCatch","tryer","catcher","e","_filter","filter","_when","predicate","whenTrueFn","_ifElse","whenFalseFn","_either","fn1","fn2","_allPass","mem","_both","_complement","_includes","item","c","includes","_lte","first","second","_lt","_gte","_gt","_tap","_groupWith","_groupBy","lensProp","_omit","props","_pickBy","pred","k","_pick","_pickAll","_dissoc","_mergeRight","ob1","ob2","assign","_mergeLeft","_strictWithout","list","_unary","_binary","arg1","arg2","_slice","to","toLower","toLowerCase","toUpper","toUpperCase","_applySpec","specs","Function","out","all","n","promise","Promise","resolve","apply","anyPass","both","chain","f","g","list1","list2","Set","s1","s2","add","dissoc","equals","hasPath","juxt","propEq","when","either","allPass","infichain","rest1","mergeLeft","pathEq","gt","into","groupWith","tap","Lenses.lens","Lenses.over","Lenses.set","Lenses.view","lensPath","stringSaysDo","bucket","astSaysDo","L.compose","L.all","L.tail","L.any","L.not","BooleanBucket","constructor","booleans","toggle","unset","bool","Mode","mode","reflect","console","warn","changedOrAdded","bool2","super","document","trigger","toggleClass","querySelectorAll","elt","hidden","hideWhen","dataset","ATTR_SNAME","ATTR_SVALUE","INPUT_SELECTOR","joiner","inputsOf","container","isEmptyRadioValue","isEmptyCheckboxValue","isCheckedCheckboxValue","collectWithin","params","flavor","querySelector","omitFn","changeFn","collector","nodeList","node","valueOf","getAttribute","_collectAll","hasAttribute","checked","serializeQuestions","_vars","SESSION_KEYS","NAV_KEYS","setValueInVars","data","getVar","extend","collect","FormData","Vars","querify","setVars","version","unsetVars","shouldExit","Boolean","onEnd","navigator","sendBeacon","usp","setKeyboardUser","setMouseUser","openingMatch","mouse","opener","body","className","on","matches","A11y","logdiv","getElementById","innerHTML","observeDatepickers","init","picker","MutationObserver","records","instance","infocus","activeElement","text","observe","attributes","escapeHTML","entityMap","re","RegExp","notify","options","keepalive","html","notification","error","area","textContent","setTimeout","bind","propFinder","fallback","leafs","leaf","conf","a11y","captions","optionfieldsets","strictlegends","fromApiServer","startsWith","apiserver","Ajax","busy","last","direction","defaultOptions","dataType","url","cache","success","checkJSON","err","release","responseText","statusText","trim","post","_options","ajax","abort","postJSON","stopDispatches","awaiting","status","req","responseJSON","setSettled","BBI","redirect_uri","location","pathname","template","returnurl","origin","param","bbis","server","extraparams","authid","state","stage","parseQuery","fmt","authenticate","isVisible","isLabel","isOption","isLink","isTextual","isPicture","isQuestion","isReadOnly","isValidatable","renderAttribs","attr","fieldDesignators","datetimepicker","numedit","radio","checkmultilist","customlist","combobox","listbox","multilist","fieldKey","controltype","generic","genericQuoted","quotable","Date","toHoursAndMinutes","hours","getHours","minutes","getMinutes","dateTimeRe","pureDateRe","date","parseDate","thing","leadWithZeroes","valueToDate","yyyycleanformat","clean","yearindex","adjustment","year","substr","cutoffyear","_defaults","shortYearCutoff","getYear","century","getFullYear","month","Math","max","dom","setFullYear","setMonth","setDate","getMonth","getDate","onChangeDate","ev","formatDate","humanDate","now","hour0","setHours","hour24","dayinms","thisyear","daysofweek","day","monthsofyear","hm","ms","isToday","isYesterday","isLastWeek","getDay","isThisYear","editPolicy","canEditEarlier","isLabelValueDynamic","preferUpdate","mustUpdate","updateLabels","_Widgets","registerWidget","getWidget","Dynprops","$widget","control","Updates","requestor","oldval","updates","definition","removeData","isForNotNull","placeholder","identifier","visible","removeAttr","setValue","readonly","onreadonly","minimum","maximum","maxlength","addClass","programmatically","removeClass","onrequired","notnull","id","event","CustomEvent","detail","bubbles","dispatchEvent","updateControl","controls","each","$this","update","Hooks","Map","arbitraryCoreProp","wControl","group","wGroup","_group","widget","attribs","enabled","current","$elt","datatype","meta","d","escape","metadata","aria","wdef","tagName","render","_elt","_originalid","autocomplete","hint","dynprops","dynpropsforus","ii","afterRender","prelabel","postlabel","shouldWrap","anchor","wraptag","nodeName","wrapAll","parent","prepend","setAttribute","wrapInlineInput","tag","getControl","listtypes","pathGroup","areOfOneQuestion","isfor","indexOfOrInfinity","Infinity","baseGroup","tailGroup","groupOuter","doGrouping","normalize","GROUPING_CLASS","GROUPING_PREFIX_TYPE","GROUPING_DATA_NAME","GROUPING_DATA_LEVEL","ITEM_PREFIX_AUTHORCLASS","QUESTION_CLASS","QUESTION_PREFIX_TYPE","QUESTION_PREFIX_PROPERTY","QUESTION_DATA_LAYOUT","QUESTION_PREFIX_AUTHORSTYLE","QUESTION_CLASS_NOLABEL","nameDefaults","pathToNames","propArg","doTopLevel","doLegends","getGroupName","questionGroupClass","n.QUESTION_PREFIX_AUTHORSTYLE","extraClasses","areAllInvisible","areAllReadonly","areAllNotNull","updateClassWhen","classList","setReadonlyFGClass","n.GROUPING_PREFIX_TYPE","setEmptyFGClass","setRequiredFGClass","setReadonlyQClass","n.QUESTION_PREFIX_PROPERTY","setEmptyQClass","setRequiredQClass","createFormGroup","level","formGroup","groupName","createElement","n.GROUPING_CLASS","n.GROUPING_DATA_LEVEL","n.GROUPING_DATA_NAME","asciify","createDocumentFragment","cWithin","appendChild","answer","classes","n.QUESTION_CLASS","n.QUESTION_PREFIX_TYPE","n.ITEM_PREFIX_AUTHORCLASS","n.QUESTION_CLASS_NOLABEL","qlg","n.QUESTION_DATA_LAYOUT","_layout","getLayout","t","o","globalThis","trustedTypes","l","createPolicy","createHTML","random","h","r","u","createComment","v","m","y","w","for","A","P","WeakMap","E","createTreeWalker","N","_$litType$","parts","lastIndex","M","el","currentNode","content","firstChild","remove","childNodes","nextNode","nodeType","hasAttributes","getAttributeNames","endsWith","ctor","I","L","R","H","removeAttribute","emptyScript","static","S","_$litDirective$","O","D","creationScope","importNode","C","nextSibling","z","B","setConnected","parentNode","startNode","endNode","insertBefore","previousSibling","createTextNode","V","element","fill","W","capture","once","passive","handleEvent","host","litHtmlPlatformSupport","litHtmlVersions","ShadowRoot","ShadyCSS","nativeShadow","Document","CSSStyleSheet","cssText","styleSheet","replaceSync","adoptedStyleSheets","cssRules","toAttribute","fromAttribute","attribute","converter","hasChanged","HTMLElement","isUpdatePending","hasUpdated","observedAttributes","finalize","elementProperties","noAccessor","getPropertyDescriptor","requestUpdate","enumerable","finalized","getPrototypeOf","properties","getOwnPropertyNames","getOwnPropertySymbols","createProperty","elementStyles","finalizeStyles","styles","flat","unshift","enableUpdating","addController","renderRoot","isConnected","hostConnected","removeController","splice","createRenderRoot","shadowRoot","attachShadow","shadowRootOptions","connectedCallback","disconnectedCallback","hostDisconnected","attributeChangedCallback","K","getPropertyOptions","reject","performUpdate","shouldUpdate","willUpdate","hostUpdate","hostUpdated","firstUpdated","updated","updateComplete","getUpdateComplete","reactiveElementPlatformSupport","ReactiveElement","reactiveElementVersions","litElementVersions","renderOptions","renderBefore","_$litPart$","_$litElement$","litElementHydrateSupport","LitElement","litElementPlatformSupport","Maybe","module","isEmpty","of","getOrElse","Numerals","makeFormatter","radixPoint","groupingChar","groupingRules","_last","_a","makeLastItemRepeater","integralPart","fractionalPart","neg","th","makeParser","thre","testre","parser","formatter","makeParse","refresh","protocol","hostname","port","urlutils","mimetypes","xsl","docx","pdf","odt","rtf","doc","jpg","jpeg","png","isJS","isEmptyish","JSAlertMessage","getFiles","casus","caseReport","mimetype","absoluteURL","filename","ext","disconnectValue","newVal","noAttribs","omitName","omitRequired","emptyTag","setAttribs","valueInside","layout","alt","alttext","src","edit","couldWrap","fixup","isFor","class","_subtype","min","_level","linkClassName","isreport","listlabel","showdown","optionbox","some","selected","option","len","newLen","newOptions","selectedValue","optionElt","removeChild","freetext","size","multiple","optionlist","labelledby","required","disabled","allowUpdatingSelf","radiolist","closest","serverToWidgetValue","widgetToServerValue","originalreadonly","dynamic","InputEvent","cancelable","hide","validate","spec","UIFormat","mindate","maxdate","errdateinvalid","errrequired","fmindate","fmaxdate","quotableDate","errdatebeforemimimum","errdatenotinrange","errdateaftermaximum","checkDate","getMaxChars","toFixed","precision","maxchars","parseFloat","spinner","errnuminvalid","hasMax","hasMin","errnumnotinrange","errnumnotnegativeorzero","errnumnotnegative","errnumabovemaximum","errnumnotpositiveorzero","errnumnotpositive","errnumbelowminimum","freebox","_realValue","insertAdjacentHTML","noop","label","grid","renderable","copy","addallowed","insertbuttontext","row","offset","showcolumns","deletebuttontext","columns","row_i","cell","cell_i","colname","col","col_i","cells","cellTag","col_id","_rowspan","_cell_index","columnheader","column","header","innerText","colheaderids","rowheaderid","rows","rows_up_to_here","_tag","e_cell","cellSetAttributes","headers","caption","thead","tr","e_body","colheaders","last_spanning_cell_id","e_row","icol","cellWithHeaders","gridAddButton","encodeURI","addbuttontext","e_grid","old","colheader","irow","tBodies","cellInput","oldcell","spot","replaceWith","cellControl","interval","timer","me","$anchor","adjust","diff","parsed","keepAdjusting","hasClass","adjustOnce","stopAdjusting","clearTimeout","keyCode","orgval","$input","after","addButtons","_event","times","integer","repeat","hasselectedbelowlevel","jumplist","hasselectedbelow","ariaCurrentAttrib","chapterDataAttrib","ischapter","chapterstatus","bakeInnerList","containsselection","Jumplist","groupid","screentitle","bakeAsListitems","bakeAsDropDown","findCurrentIndex","_jumplist","drawAsList","currentIndex","slicetype","itemizer","drawAsDropDown","draw","is","userinfo","PERM_ALLOWACCESSCASES","PERM_ALLOWACCESSCASESFROMDOMAIN","PERM_ALLOWCASEOVERVIEW","PERM_ALLOWMISDOCUMENTS","PERM_ALLOWMISDOMAIN","PERM_ALLOWMISOWNCASES","PERM_ALLOWSAVECASE","PERM_ALLOWSTARTCASES","PERM_PUBLISHMODEL","PERM_UPDATEOWNMODEL","PERM_UPDATEOWNUSER","oldperms","guest","user","administrator","viewer","manager","vieweradmin","permissions","role","scrollTo","top","left","defaults","axis","duration","jquery","limit","_scrollable","inArray","contentWindow","ownerDocument","userAgent","compatMode","documentElement","onAfter","queue","toff","$elem","targ","win","style","pos","margin","css","animate","onAfterFirst","easing","end","scroll","config","separator","pair","array_keys","default_decode","new_text","bb","compareVersions","isNaN","compareVersionsOn","_to","showAnim","changeYear","changeMonth","yearRange","altFormat","pause","dequeue","pushStack","makeArray","insertAtCaret","myValue","selection","createRange","selectionStart","startPos","endPos","selectionEnd","scrollTop","substring","selectAllText","createTextRange","select","KEYS","maps","originalEvent","$target","prev","shiftKey","$inputs","gridKeys","step","stopImmediatePropagation","preventDefault","dispatchBackspace","aintTheEnterKey","setRole","fullname","perms","perm","webadminMakesSense","resetLogin","effect","serializeArray","action","formfocus","Router","username","uniqueid","modelid","modelname","dbname","request","bsid","hideLogin","autologinrewritten","renderGroups","safeResetEffect","gotonode","deleteme","confirm","sessionid","deleteCase","isCaseCurrent","empty","Cases","_cases","_unfilteredcases","_MAX","_idx","_filtertext","showSlice","caselen","cas","dateenter","datecreate","showcopycase","showdeleteinmenu","reporturl","firstrun","lastaccess","createCaseItem","$case","templateindex","wCasus","howManyColumns","Plugins","newname","prependTo","hasNoNext","floor","nextSlice","divident","prevSlice","$controls","click","keyup","grep","newcase","jsondata","dateTitle","dateSpan","copySpan","reportSpan","deleteSpan","stopPropagation","Models","selector","modelitem","model","createModelItem","_selectedclass","yours","_nicename","enhanceModel","lastupdate","_date","_humandate","modelinfo","_liner_notes","authorinfo","_author_notes","models","explicit","cb","Validation","reset","silent","justhide","screenid","ajaxOptions","sync","fullnodename","_direction","_passed","pass","_isUpdate","cbIsAdditional","info","groupElt","isUpdate","lastUpdateRequest","requestDynProps","thisUpdateRequest","updateDynProps","skip","logout","close","currentTarget","restart","exit","mockResponse","code","fun","openSettings","menu","creds","exitthenmenu","returnfocusto","returnSelection","groups","_originalisfor","modus","removeAllRanges","_error","subcode","summary","Errors.translate","Errors.CODES","informationsources","hasprevious","hasnext","modeldescription","modellanguage","setMode","$document","focusHandler","focusstring","contains","selectionDirection","setSelectionRange","returnfocus","e_group","doScrollToSelected","previousElementSibling","scrollIntoView","behavior","matchMedia","fulldata","sortControls","setupFocusHandler","off","$parent","_stack","allValid","geterrorelt","showValidation","ok","errortext","$error","$node","category","stringmask","validateInput","validatable","eltControltype","doChangeOnKeyDown","setting","func","wait","immediate","timeout","context","later","callNow","before","setDynamicMode","previd","$bbq","setGroupTitle","gob","tempNode","replaceChild","_tempNode","setSelectedStateAttributes","renderGroup","sortGroups","show","questionlabelgroup","order","ac","bc","_sorted","hasStatusRole","describedby","screenmode","itype","questionandlabel","classname","siblings","$other","hash","rewind","updatemis","prior","runtonode","nodename","maybeSetDescription","description_ids","en","nl","remarks","pretexts","explicitId","_groupby","_hash","_map","put","appendAsterisk","child","space","words","nodeValue","lastword","lastChild","$stick","textnode","unwrap","Mustache","mustache","objectToString","object","isFunction","escapeRegExp","hasProperty","propName","regExpTest","nonSpaceRe","isWhitespace","testRegExp","whiteRe","spaceRe","equalsRe","curlyRe","tagRe","Scanner","Context","parentContext","Writer","eos","scan","scanUntil","lookup","lookupHit","clearCache","tags","tokens","openingTagRe","closingTagRe","closingCurlyRe","sections","spaces","hasTag","nonSpace","stripSpace","compileTags","tagsToCompile","start","chr","openSection","scanner","valueLength","nestedTokens","numTokens","nestTokens","lastToken","squashedTokens","squashTokens","parseTemplate","partials","renderTokens","originalTemplate","symbol","buffer","renderSection","renderInverted","renderPartial","unescapedValue","escapedValue","rawValue","j","defaultWriter","to_html","send","mustacheFactory","tmpl","navText","adjustBtn","btn","change","$btn","$newbtn","clone","default","fr","de","ru","newcolspan","colspan","tabindex","addCustomCheckbox","checkbox","factory","modules","installedModules","__webpack_require__","moduleId","exports","toStringTag","__esModule","ns","property","__webpack_exports__","printJS","Browser","isFirefox","InstallTrigger","isIE","documentMode","isEdge","StyleMedia","isChrome","chrome","isSafari","isIOSChrome","addWrapper","capitalizePrint","collectStyles","addHeader","cleanUp","isRawHTML","_modal__WEBPACK_IMPORTED_MODULE_0__","_browser__WEBPACK_IMPORTED_MODULE_1__","_typeof","htmlData","font","font_size","elementStyle","defaultView","getComputedStyle","targetStyles","targetStyle","targetStylesMatch","getPropertyValue","maxWidth","printElement","headerContainer","headerElement","headerNode","headerStyle","showModal","onLoadingEnd","onLoadingStart","revokeObjectURL","printable","handler","onPrintDialogClose","iframe","frameId","raw","_functions__WEBPACK_IMPORTED_MODULE_0__","_print__WEBPACK_IMPORTED_MODULE_1__","cloneElement","cloneNode","childNodesArray","ignoreElements","clonedChild","scanStyles","getContext","drawImage","print","printFrame","printableElement","_browser__WEBPACK_IMPORTED_MODULE_2__","img","imageStyle","fullyQualifiedSrc","imageWrapper","_browser__WEBPACK_IMPORTED_MODULE_0__","_modal__WEBPACK_IMPORTED_MODULE_1__","_pdf__WEBPACK_IMPORTED_MODULE_2__","_html__WEBPACK_IMPORTED_MODULE_3__","_raw_html__WEBPACK_IMPORTED_MODULE_4__","_image__WEBPACK_IMPORTED_MODULE_5__","_json__WEBPACK_IMPORTED_MODULE_6__","printTypes","fallbackPrintable","gridHeaderStyle","gridStyle","onError","onIncompatibleBrowser","modalMessage","documentTitle","repeatTableHeader","base64","onPdfOpen","honorMarginPadding","honorColor","usedFrame","srcdoc","file","field","displayName","columnSize","stringData","jsonToHTML","Modal","printModal","contentDiv","closeButton","messageNode","getElementsByTagName","_print__WEBPACK_IMPORTED_MODULE_0__","_functions__WEBPACK_IMPORTED_MODULE_1__","createBlobAndPrint","localPdf","Blob","createObjectURL","bytesArray","atob","charCodeAt","XMLHttpRequest","responseType","response","Print","iframeElement","onload","printDocument","contentDocument","images","promises","image","pollImage","naturalWidth","complete","loadIframeImage","loadIframeImages","performPrint","execCommand","visibility","Verzend","Ja","Nee","prepping","impossible","emailSent","REPORTDOC","SHOWONTOP","DESIRED_TOOLS","fromnode","metaprop","getmetadata","$container","$download","$print","$printbtn","$email","$feedback","modelversion","one","vote","baseLevel","topLevel","duck","arbitrary","headings","ctl","klass","history","pushState","apinav","storage","_title","title","sessionStorage","directory","loc","restoreState","ditchState","removeItem","replaceState","initial_state","getItem","setItem","Showdown","g_urls","g_titles","g_html_blocks","g_list_level","makeHtml","inline_only","_Detab","_HashHTMLBlocks","_StripLinkDefinitions","_RunSpanGamut","_RunBlockGamut","_UnescapeSpecialChars","_ProcessListItems","wholeMatch","m1","m2","m3","m4","_EncodeAmpsAndAngles","hashElement","blockText","_DoHeaders","hashBlock","_DoLists","_DoCodeBlocks","_DoBlockQuotes","_FormParagraphs","_DoCodeSpans","_EscapeSpecialCharsWithinTagAttributes","_EncodeBackslashEscapes","_DoImages","_DoAnchors","_DoAutoLinks","_DoItalicsAndBold","escapeCharacters","writeAnchorTag","m5","m6","m7","whole_match","link_text","link_id","writeImageTag","alt_text","matchFound","h_level","whole_list","list_type","runup","list_str","_Outdent","codeblock","nextChar","_EncodeCode","bq","pre","grafs","grafsOut","$1","escapeCharacters_callback","_EncodeEmailAddress","addr","ch","hexDigits","char2hex","charCodeToReplace","fromCharCode","leadingText","numSpaces","charsToEscape","afterBackslash","regexString","orig","inline","nf","buttonplacement","blockafterlabel","genid","interesting","associateEltWithFirst","srcs","elts","belongsto","widgets","parentElement","getQuestionLabelGroup","getMatchingChildOrSelf","tw","SHOW_ELEMENT","matcher","infogroups","nextElementSibling","contents","sources","source","isurl","groupguid","children","toggleInfo","setInfo","display","removal","removeAgain","slideToggle","block","msMatchesSelector","FILTER_ACCEPT","FILTER_SKIP","previousNode","NodeFilter","currentLayerlanguage","languageLayers","desiredLayerlanguage","policy","newline","plugins","newlineGlobRe","br_re","onlyPhrasingInside","demoteHeading","html_in","html_out","onlyPhrasing","allowOnlyPhrasing","$filter","hasmatch","ismatch","clear","$doc","$filtered","addBack","infoNodes","lastId","_info","Model","author","authorname","extramodelinfo","line","kv","infoNode","caselistingallowed","casecount","ready","helpdesk","resetpasswordHelpdesk","theme","referrer","leeway","minheight","origins","log","parentDomain","ResizeObserver","cr","contentRect","callOut","height","resize","onresize","lasterrors"],"mappings":"AAEAA,QAAO,SAASC,GACfA,EAAEC,WAAWC,SAAa,GAAI,CAC7BC,UAAW,YACXC,SAAU,eACVC,SAAU,YACVC,YAAa,QACbC,WAAY,CAAC,SAAS,UAAU,OAAO,QAAQ,MAAM,OACrD,OAAO,SAAS,YAAY,UAAU,WAAW,YACjDC,gBAAiB,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAChD,MAAM,MAAM,MAAM,MAAM,MAAM,OAC9BC,SAAU,CAAC,UAAU,SAAS,WAAW,WAAW,aAAa,UAAU,WAC3EC,cAAe,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAC9CC,YAAa,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAC5CC,WAAY,KACZC,WAAY,WACZC,SAAU,EACVC,OAAO,EACPC,oBAAoB,EACpBC,WAAY,IACbjB,EAAEC,WAAWiB,YAAYlB,EAAEC,WAAWC,SAAa,GACpD,ICpBA,MAAMiB,EAAQ,CAAA,EAEd,IAAIC,EAAO,CAAA,EAGX,SAASC,EAAEC,EAAGC,GACZ,OAAOH,EAAKE,IAAMC,GAAMD,CAC1B,CAEAD,EAAEG,OAAS,CAACC,KAAYC,IACtBD,EAAQE,QAAO,CAACC,EAAKC,EAAKC,IAAQF,EAAMC,EAAMR,EAAEK,EAAOI,IAAQ,KAAK,IAEtET,EAAEU,aACAC,GACA,CAACP,KAAYC,IACXD,EAAQE,QACN,CAACC,EAAKC,EAAKC,IACTF,EACAC,GACCR,EAAEW,EAAQ,CAAE,CAACN,EAAOI,IAAOJ,EAAOI,KAAQJ,EAAOI,KAChDJ,EAAOI,IACP,KACJ,IAGNT,EAAEY,IAAM,SAAUC,GAChB,MAAMC,EAAOD,EAAS,MAAKb,EAAE,QACxBF,EAAMgB,KACThB,EAAMgB,GAAQ,IAEhB,IAAK,IAAKC,EAAKC,KAAQC,OAAOC,QAAQL,GAEpCf,EAAMgB,GAAMC,KAASjB,EAAMgB,GAAMC,GAAOC,GAE1CjB,EAAOD,EAAMgB,EACf,EAEAd,EAAEmB,gBAAkB,SAAUC,GAC5B,IAAK,IAAIC,KAAQD,EACf,GAAIA,EAAaE,eAAeD,GAC9B,IAAK,IAAIP,KAAQM,EAAaC,GACvBvB,EAAMgB,KAAOhB,EAAMgB,GAAQ,IAEhChB,EAAMgB,GAAMO,GAAQD,EAAaC,GAAMP,EAG/C,EAEAG,OAAOM,OAAOvB,GCgFdA,EAAEY,IAhIc,CACdE,KAAQ,KACR,iBAAkB,uBAClB,gBACE,iEACF,kBAAmB,oBACnB,0CACE,gDACF,oBAAqB,4BACrBU,IAAO,MACPC,OAAU,UACVC,KAAQ,QACRC,MAAS,QACT,cAAe,qBACfC,QAAW,WACXC,OAAU,UACVC,IAAO,KACPC,IAAO,KACPC,IAAO,KACPC,IAAO,KACPC,IAAO,KACPC,IAAO,KACPC,IAAO,KACPC,IAAO,MACPC,IAAO,MACPC,IAAO,OACPC,IAAO,QACPC,IAAO,MACPC,KAAQ,OACRC,KAAQ,OACRC,IAAO,MACPC,IAAO,MACPC,IAAO,MACPC,IAAO,MACPC,IAAO,MACP,wBAAyB,0BACzB,uBAAwB,uBACxB,eAAgB,WAChB,cAAe,eACf,eAAgB,eAChB,cAAe,iBACf,gBAAiB,wBACjB,eAAgB,yBAChB,gBAAiB,0BACjB,eAAgB,yCAChB,mDACE,uEACF,yCACE,2FACF,mCACE,+CACF,2BAA4B,qCAC5B,mCACE,iDACF,mCACE,6CACF,2BACE,8EACF,qCACE,0FACF,wCACE,6FACF,kDACE,4GACF,eACE,gFACF,4DACE,+CACF,kCAAmC,wBACnC,oBAAqB,oBACrB,wBAAyB,2CACzB,4CACE,sDACFC,UAAa,UACb,mBAAoB,kCACpB,wBACE,8DACF,wEACE,iGACF,YAAa,gBACb,oBAAqB,4BACrBC,yBAA4B,kCAC5BC,kBACE,4FACF,kDAAmD,yBACnD,uCACE,4CACF,YAAa,WACbC,SAAY,WACZ,cAAe,eACf,gBAAiB,iBACjB,SAAU,YACV,4CACE,gEACF,qCAAsC,qCACtC,eAAgB,kBAChBC,KAAQ,SACR,2CACE,oDACFC,sBAAyB,IACzBC,eAAkB,IAClBC,uBAA0B,CAAC,GAC3B,iBAAkB,iBAClBC,YAAe,UACf,iBAAkB,iBAClB,iBAAkB,yBAClB,qDACE,gFACF,YAAa,YACbC,gBAAmB,aACnB,uDACE,6BACF,8CACE,+DACF,oBAAqB,uBACrB,uBAAwB,wBACxB,mBAAoB,yBACpB,mBAAoB,wBACpB,UAAW,mBACX,aAAc,iBACd,aAAc,sBACd,sDACE,0DACFC,OAAU,aACV,iEACE;;AC9HJ,IAAIC,EAAOC,QAAqC,GAChD,KACE,SAAWC,EAAiBC,GAC1B,GACE,IAAID,EAAgB,SAASE,IAAI,OAASD,GAC1C,IAAID,EAAgB,CAAEG,EAAGF,IAAQC,IAAI,OAASD,GAC9C,IAAID,EAAgB,CAAC,CAAC,IAAKC,KAAQC,IAAI,OAASD,GACL,UAA3C,IAAID,EAAgB,QAAQI,YACoB,WAAhD,IAAIJ,EAAgB,CAAEG,EAAG,OAAQC,YACgB,YAAjD,IAAIJ,EAAgB,CAAEG,EAAG,QAASC,WAElC,MAAMJ,EACRF,EAAKE,gBAAkBA,CACxB,CAXD,CAWGA,gBAAiB,IAmItB,CAlIE,MAAOA,IACP,SAAW7C,EAAQkD,EAAQC,GAEzB,IAAIC,EAASpD,EAAOoD,OAChBC,EAAiBrD,EAAOqD,eACxBC,EAAO,qBACPC,EAAkB,uBAClBT,EAAO,MACPU,EAAU,CACZ,IAAK,MACL,IAAK,MACL,IAAK,MACL,IAAK,MACL,IAAK,MACL,MAAO,IACP,MAAO,MAELC,EAAQ,CACVC,OAAQ,SAAU5D,EAAK6D,GACrBC,EAASC,KAAKC,OAAQhE,EAAK6D,EAC5B,EACDI,OAAQ,SAAUjE,UACT+D,KAAKC,OAAOhE,EACpB,EACDiD,IAAK,SAAUjD,GACb,OAAO+D,KAAKG,IAAIlE,GAAO+D,KAAKC,OAAOhE,GAAK,GAAK,IAC9C,EACDmE,OAAQ,SAAUnE,GAChB,OAAO+D,KAAKG,IAAIlE,GAAO+D,KAAKC,OAAOhE,GAAKoE,MAAM,GAAK,EACpD,EACDF,IAAK,SAAUlE,GACb,OAAOA,KAAO+D,KAAKC,MACpB,EACDnE,IAAK,SAAUG,EAAK6D,GAClBE,KAAKC,OAAOhE,GAAO,CAACoD,EAAOS,GAC5B,EACDQ,QAAS,SAAUC,EAAUC,GAC3B,IAAI1B,EAAOkB,KACX,IAAK,IAAI/D,KAAO6C,EAAKmB,OAAQnB,EAAKmB,OAAOhE,GAAKqE,QAAQG,EAAQxE,GAC9D,SAASwE,EAAOX,GACdS,EAASG,KAAKF,EAASV,EAAOT,EAAOpD,GAAM6C,EAC5C,CACF,EACD6B,OAAQ,WACN,MAAO,EACR,EACDvB,SAAU,WACR,IAAIwB,EAAQ,GACZ,IAAK,IAAI3E,KAAO+D,KAAKC,OAEnB,IADA,IAAIY,EAAUC,EAAO7E,GACZ8E,EAAI,EAAGjB,EAAQE,KAAKC,OAAOhE,GAAM8E,EAAIjB,EAAMkB,OAAQD,IAC1DH,EAAMK,KAAKJ,EAAU,IAAMC,EAAOhB,EAAMiB,KAG5C,OAAOH,EAAMM,KAAK,IACnB,GAEH,IAAK,IAAIjF,KAAO2D,EACdJ,EAAeR,EAAgBmC,UAAWlF,EAAK,CAC7CmF,cAAc,EACdC,UAAU,EACVvB,MAAOF,EAAM3D,KAGjB,SAAS+C,EAAgB4B,GACvB,IAAI3F,EAAOsE,EAAO,MAElB,OADAC,EAAeQ,KAAM,SAAU,CAAEF,MAAO7E,KAChC,GACN,KAAM2F,EACJ,MACF,IAAsB,iBAAVA,EACc,MAApBA,EAAMU,OAAO,KACfV,EAAQA,EAAMP,MAAM,IAEtB,IACE,IAAIkB,EAAQX,EAAMY,MAAM,KAAMT,EAAI,EAAGC,EAASO,EAAMP,OACpDD,EAAIC,EACJD,IACA,CACA,IACIU,GADA3B,EAAQyB,EAAMR,IACAW,QAAQ,MACrB,EAAID,EACP1B,EACE9E,EACA0G,EAAO7B,EAAMO,MAAM,EAAGoB,IACtBE,EAAO7B,EAAMO,MAAMoB,EAAQ,KAEpB3B,EAAMkB,QACfjB,EAAS9E,EAAM0G,EAAO7B,GAAQ,GAEjC,CACD,MACF,KAAKR,EAAQsB,GACX,IAASG,EAAI,EAAGC,EAASJ,EAAMI,OAAQD,EAAIC,EAAQD,IAAK,CACtD,IAAIjB,EACJC,EAAS9E,GADL6E,EAAQc,EAAMG,IACG,GAAIjB,EAAM,GAChC,CACD,MACF,IAAK,YAAac,EAChBA,EAAMN,QAAQsB,EAAS3G,GACvB,MACF,QACE,IAAK,IAAIgB,KAAO2E,EAAOb,EAAS9E,EAAMgB,EAAK2E,EAAM3E,IAEtD,CAED,SAAS2F,EAAQ9B,EAAO7D,GACtB8D,EAASC,KAAM/D,EAAK6D,EACrB,CAED,SAASC,EAAS9E,EAAMgB,EAAK6D,GAC3B,IAAI+B,EAAMvC,EAAQQ,GAASA,EAAMoB,KAAK,KAAOpB,EACzC7D,KAAOhB,EAAMA,EAAKgB,GAAKgF,KAAKY,GAC3B5G,EAAKgB,GAAO,CAAC4F,EACnB,CAED,SAASF,EAAOG,GACd,OAAOC,mBACLD,EAAInC,QAAQD,EAAiB,OAAOC,QAAQV,EAAM,KAErD,CAED,SAAS6B,EAAOgB,GACd,OAAOE,mBAAmBF,GAAKnC,QAAQF,EAAMwC,EAC9C,CAED,SAASA,EAASC,GAChB,OAAOvC,EAAQuC,EAChB,CAjEDpD,EAAKE,gBAAkBA,CAkExB,CAhID,CAgIG7C,OAAQkD,OAAQ8C,MAAM7C,QAC3B,CCxHO,SAAS8C,EAAiBN,GAC/B,IAAIO,EAAOC,UACX,OAAOR,EAAInC,QAAQ,kBAAkB,SAAUuC,EAAOK,GACpD,YAAmCC,IAA5BH,EAAKI,SAASF,GAAO,GACxBF,EAAKI,SAASF,GAAO,GACrBL,CACR,GACA,CAIO,SAASQ,EAAOZ,EAAK/F,EAAK,IAC/B,OAAO+F,EAAInC,QAAQ,qBAAqB,SAAUuC,EAAOS,GACvD,YAAmBH,IAAZzG,EAAG4G,GAAqB5G,EAAG4G,GAAOA,CAC7C,GACA,ED2GA,SAAWC,GACT,IAAIC,GAAW,EACf,IACEA,IAAaC,OAAOC,QACN,CAAd,MAAOC,GAAO,CAsFhB,SAASD,EAASjE,EAAMyB,GACtB,IAAI0C,EAAQ,GAEZ,OADAnE,EAAKwB,QAAQC,EAAU0C,GAChBJ,EACHI,EAAMH,OAAOC,YACb,CACEG,KAAM,WACJ,IAAIpD,EAAQmD,EAAME,QAClB,MAAO,CAAEC,UAAgBZ,IAAV1C,EAAqBA,MAAOA,EAC5C,EAER,CA9FK,YAAa8C,IACjBA,EAAqBtC,QAAU,SAAiBC,EAAUC,GACxD,IAAI1B,EAAOkB,KACPqD,EAAQlH,OAAOoD,OAAO,MAC1BS,KAAKZ,WACFO,QAAQ,oBAAqB,KAC7B6B,MAAM,KACNlB,SAAQ,SAAUgD,GACZA,EAAKtC,UAAUsC,KAAQD,KAC3BA,EAAMC,GAAQxE,EAAKsB,OAAOkD,IAAOhD,SAAQ,SAAUR,GAClDS,EAASG,KAAKF,EAASV,EAAOwD,EAAMxE,EAChD,GACA,GACA,GAIQ,SAAU8D,IACdA,EAAqBW,KAAO,WAC1B,OAAOR,EAAS/C,MAAM,SAAUF,EAAO7D,GACrC+D,KAAKiB,KAAKhF,EAClB,GACA,GAIQ,WAAY2G,IAChBA,EAAqBrH,OAAS,WAC5B,OAAOwH,EAAS/C,MAAM,SAAUF,EAAO7D,GACrC+D,KAAKiB,KAAKnB,EAClB,GACA,GAIQ,YAAa8C,IACjBA,EAAqBxG,QAAU,WAC7B,OAAO2G,EAAS/C,MAAM,SAAUF,EAAO7D,GACrC+D,KAAKiB,KAAK,CAAChF,EAAK6D,GACxB,GACA,GAIM+C,KAAcC,OAAOC,YAAYH,KACnCA,EAAqBE,OAAOC,UAAYH,EAAqBxG,SAIzD,SAAUwG,IACdA,EAAqBY,KAAO,WAS1B,IARA,IAKEzC,EACA9E,EACA6D,EAPE1D,EAAU4D,KAAK5D,UACjBqH,EAAQrH,EAAQ8G,OAChBE,EAAOK,EAAML,KACbG,EAAO,GACPhI,EAASY,OAAOoD,OAAO,OAIjB6D,GAENnH,GADA6D,EAAQ2D,EAAM3D,OACF,GACZyD,EAAKtC,KAAKhF,GACJA,KAAOV,IACXA,EAAOU,GAAO,IAEhBV,EAAOU,GAAKgF,KAAKnB,EAAM,IAEvBsD,GADAK,EAAQrH,EAAQ8G,QACHE,KAKf,IADAG,EAAKC,OACAzC,EAAI,EAAGA,EAAIwC,EAAKvC,OAAQD,IAC3Bf,KAAKE,OAAOqD,EAAKxC,IAEnB,IAAKA,EAAI,EAAGA,EAAIwC,EAAKvC,OAAQD,IAC3B9E,EAAMsH,EAAKxC,GACXf,KAAKH,OAAO5D,EAAKV,EAAOU,GAAKkH,QAErC,GAiBE,SAAWhH,GACT,IAAIuH,EAAKvH,EAAOqD,eACdmE,EAAOxH,EAAOyH,yBAsCdC,EAAqB,SAAUC,GAC7B,IAAIjE,EAASiE,EAAGjE,OAChBiE,EAAGjE,OAAS+C,EAAqB/C,OACjCb,gBAAgB0B,KAAKoD,EAAIA,EAAGC,KAAKC,OAAO3D,MAAM,IAC9CyD,EAAGjE,OAASA,CACb,EACDoE,EAAqB,SAAUC,EAAKC,GAClC,KAAMD,aAAeC,GACnB,MAAM,IAAIC,UACR,0EAEED,EAAMb,KAEb,EACDe,EAAe,SAAUF,GACvB,IAIEG,EA7BiCC,EAyB/BC,EAAaL,EAAMhD,UACrBsD,EAAed,EAAKa,EAAY,gBAChCE,EAAOf,EAAKa,EAAY,QACxBR,EAASL,EAAKa,EAAY,WAEvBC,GAAgBT,GAAUA,EAAOlI,MA9BHyI,EA3BT,SAAUP,GACpC,SAASnE,EAAOyD,EAAMxD,GACpB8C,EAAqB/C,OAAOa,KAAKV,KAAMsD,EAAMxD,GAC7CwD,EAAOtD,KAAKZ,WACZ4E,EAAOlI,IAAI4E,KAAKV,KAAK+D,KAAMT,EAAO,IAAMA,EAAO,GAChD,CACD,SAASqB,EAAIrB,GACXV,EAAqB1C,OAAOQ,KAAKV,KAAMsD,GACvCA,EAAOtD,KAAKZ,WACZ4E,EAAOlI,IAAI4E,KAAKV,KAAK+D,KAAMT,EAAO,IAAMA,EAAO,GAChD,CACD,SAASxH,EAAIwH,EAAMxD,GACjB8C,EAAqB9G,IAAI4E,KAAKV,KAAMsD,EAAMxD,GAC1CwD,EAAOtD,KAAKZ,WACZ4E,EAAOlI,IAAI4E,KAAKV,KAAK+D,KAAMT,EAAO,IAAMA,EAAO,GAChD,CACD,OAAO,SAAUQ,EAAIhE,GAInB,OAHAgE,EAAGjE,OAASA,EACZiE,EAAG5D,OAASyE,EACZb,EAAGhI,IAAMA,EACF4H,EAAGI,EAAI,OAAQ,CACpB1C,cAAc,EACdC,UAAU,EACVvB,MAAOA,GAEnB,CACO,CAiCK8E,CAA0BZ,GAD5BM,EA9BK,SAAUJ,EAAKJ,GAMpB,OALAJ,EAAGQ,EAAK,gBAAiB,CACvB9C,cAAc,EACdC,UAAU,EACVvB,MAAOyE,EAAoBT,EAAII,KAE1BJ,CACjB,EA0BU3H,EAAO0I,iBAAiBL,EAAY,CAClCE,KAAM,CACJxF,IAAK,WACH,OAAOwF,EAAKxF,IAAIwB,KAAKV,KACtB,EACDlE,IAAK,SAAUgE,GACb,IAAIgE,EAAK9D,KAAK8E,cACdJ,EAAK5I,IAAI4E,KAAKV,KAAMF,GAChBgE,GAAID,EAAmBC,EAC5B,GAEHE,OAAQ,CACN9E,IAAK,WACH,OAAO8E,EAAO9E,IAAIwB,KAAKV,KACxB,EACDlE,IAAK,SAAUgE,GACb,IAAIgE,EAAK9D,KAAK8E,cACdd,EAAOlI,IAAI4E,KAAKV,KAAMF,GAClBgE,GAAID,EAAmBC,EAC5B,GAEHW,aAAc,CACZvF,IAAK,WAEH,OADA+E,EAAmBjE,KAAMmE,GAEvBnE,KAAK8E,eACLR,EACEtE,KACA,IAAIhB,gBAAgBgB,KAAKgE,OAAO3D,MAAM,IAG3C,EACDvE,IAAK,SAAUgI,GACbG,EAAmBjE,KAAMmE,GACzBG,EAAmBtE,KAAM8D,EAC1B,KAIf,EACI,IACEO,EAAaU,mBACT,oBAAoBC,YAAYC,MAAQA,IAAI9D,WAC9CkD,EAAaY,IACD,CAAd,MAAOC,GAAO,CACjB,CA7GD,CA6GG/I,OACJ,CAtND,CAsNG2C,EAAKE,gBAAgBmC,WACTrC,EAAKE,gBCvRb,MAAMmG,EAAazC,EChFpB0C,EAAQ,CACZC,WAAY,EACZC,0BAA2B,EAC3BC,sBAAuB,EACvBC,qBAAsB,EACtBC,gBAAiB,EACjBC,mBAAoB,EACpBC,qBAAsB,EACtBvH,yBAA0B,EAC1BwH,mBAAoB,EACpBC,cAAe,GACfC,kBAAmB,GACnBC,kBAAmB,GACnB1H,kBAAmB,GACnB2H,sBAAuB,GACvBC,iBAAkB,GAClBC,0BAA2B,GAC3BC,8BAA+B,GAC/BC,+BAAgC,GAChCC,+BAAgC,GAChCC,6BAA8B,GAC9BC,0BAA2B,GAC3BC,yBAA0B,GAC1BC,gBAAiB,GACjBC,iBAAkB,GAClBC,gBAAiB,GACjBC,oBAAqB,GACrBC,sBAAuB,GACvBC,oBAAqB,GACrBC,yBAA0B,GAC1BC,uBAAwB,GACxBC,mBAAoB,GACpBC,eAAgB,IAGZC,EAAWhL,OAAOiL,YACtBjL,OAAOC,QAAQgJ,GAAOiC,KAAI,EAAEpL,EAAK6D,KAAW,CAACA,EAAO7D,MCvCtD,IAAIqL,EAeG,MAAMC,EACX,qBAAsBxI,OAAS,IAAIyI,iBAAiB,SAAW,GAEpDC,EAAQ,CACnBC,iBAAkB,IAAIrF,IACpBkF,GAAgBA,EAAaG,oBAAoBrF,GACnDsF,oBAAqB,IAAItF,IACvBkF,GAAgBA,EAAaI,uBAAuBtF,GACtDuF,QAAS,IAjBJC,eAA6BC,GAClC,KAAM,WAAY/I,QAAS,OAAO,KAClC,MAAMgJ,GAAW,IAAIC,aAAclH,OAAOgH,GACpCG,QAAmBC,OAAOC,OAAOC,OAAO,UAAWL,GAGzD,OAFkB5F,MAAMkG,KAAK,IAAIC,WAAWL,IAClBZ,KAAIkB,GAAKA,EAAEnJ,SAAS,IAAIoJ,SAAS,EAAG,OAAMtH,KAAK,GAE3E,CAUiBuH,CAAcnB,GAC7BoB,SAtBsBjB,IACtBH,EAASG,CAAK,EAsBdkB,YAAab,GACXL,EAAMG,UAAUgB,MACdC,GAGEA,GACAtB,GACAA,EAAaoB,YAAY,CAAEE,eAAcf,OC6BjD,IApCegB,EAoCfC,GApCeD,EAfGE,IAASC,IACzB,IAAK,IAAIlI,EAAI,EAAGA,EAAIiI,EAAMhI,OAAQD,GAAK,EAAG,CACxC,IAAImI,EAAYF,EAAMjI,GAAGoI,MAAMC,KAAKH,GACpC,GAAIC,EACF,MAAO,CACLzB,MAAOyB,EAAU,GACjBG,KAAML,EAAMjI,GAAGsI,KACfC,KAAML,EAAM5I,MAAM6I,EAAU,GAAGlI,QAGpC,CAED,MAAM,IAAIuI,MAAM,iCAAiCC,KAAKC,UAAUR,KAAS,EAuCrDS,CA5DR,CACZ,CAAEL,KAAM,QAASF,MAAO,OACxB,CAAEE,KAAM,SAAUF,MAAO,OACzB,CAAEE,KAAM,SAAUF,MAAO,OACzB,CAAEE,KAAM,SAAUF,MAAO,YACzB,CAAEE,KAAM,SAAUF,MAAO,UACzB,CAAEE,KAAM,WAAYF,MAAO,eAmB3B,SAASJ,EAAME,EAAOU,EAAKC,EAAU,IACnC,GAAc,KAAVX,EACF,OAAOU,EAGT,MAAMlC,MAAEA,EAAK4B,KAAEA,EAAIC,KAAEA,GAASR,EAASG,GAEvC,GAAa,UAATI,EAEF,OAAON,EAAMO,EAAMK,EAAKC,GACnB,GAAa,aAATP,EAET,OADAM,EAAI1I,KAAKwG,GACFsB,EAAMO,EAAMK,EAAKC,GACnB,GAAa,WAATP,EAET,OADAM,EAAI1I,KAAK4I,OAAOpC,IACTsB,EAAMO,EAAMK,EAAKC,GACnB,GAAa,WAATP,EAET,OADAM,EAAI1I,KAAKwG,EAAM9H,QAAQ,WAAY,MAC5BoJ,EAAMO,EAAMK,EAAKC,GACnB,GAAa,WAATP,EAET,OADAO,EAAQ3I,KAAK0I,GACNZ,EAAMO,EAAM,GAAIM,GAClB,GAAa,WAATP,EAAmB,CAC5B,MAAMS,EAAYF,EAAQG,MAC1B,OAAID,GACFA,EAAU7I,KAAK0I,GACRZ,EAAMO,EAAMQ,EAAWF,IAGzBb,EAAMO,EAAMK,EAAKC,EACzB,CAED,MAAM,IAAIL,MAAM,gCAAgCC,KAAKC,UAAUJ,KACnE,GC3DA,MAAMW,EAAWC,IAAC,CAAOA,IAAG5C,IAAK6C,GAAMF,EAASE,EAAGD,MAE7CE,EAAQF,IAAM,CAAEA,IAAG5C,IAAK6C,GAAMC,EAAMF,KAEpCG,EAAO,CAACC,EAAQC,IAAWC,GAAWC,GAC1CD,EAAQF,EAAOG,IAASnD,KAAIoD,GAASH,EAAOG,EAAOD,KAE/CE,EAAO,CAACN,EAAMF,EAAIhG,IAAQkG,GAAKH,GAAKD,EAASE,EAAGD,KAAtBG,CAA2BlG,GAAK+F,EAE1DnO,EAAM,CAACsO,EAAMlO,EAAKgI,IAAQwG,EAAKN,GAAM,IAAMlO,GAAKgI,GAEhDyG,EAAO,CAACP,EAAMlG,IAAQkG,EAAKD,EAALC,CAAYlG,GAAK+F,ECRtC,MAEDW,EAAS,CAACV,EAAI7H,IAAS6H,KAAM7H,GAEtBwI,EAAMC,GAAOA,EAAM,EAQzB,MAAMC,EAAWd,GAAKA,EAEhBe,EAAQf,GAAU,MAALA,EAEbgB,EAAMC,IAAMA,EAMZC,EACX,IAAIC,IACJtL,GACEsL,EAAI5P,QAAO,CAACC,EAAKC,IAAQA,EAAID,IAAMqE,GAM1BuL,EACX,IAAID,IACJtL,GACEsL,EAAIE,aAAY,CAAC7P,EAAKC,IAAQA,EAAID,IAAMqE,GAW/ByL,EAAQ,CAACrB,KAAO7H,IACvBA,EAAKrB,QAAUkJ,EAAGlJ,OAAekJ,KAAM7H,GACpC,IAAImJ,IAAUD,EAAMrB,KAAW7H,KAASmJ,GAGpCtK,EAAOqK,GAAM,CAACE,EAAKC,IAAQA,EAAIxK,KAAKuK,KAEpCjK,EAAQ+J,GAAM,CAACE,EAAKC,IAAQA,EAAIlK,MAAMiK,KAEtCE,EAAUD,GAAO,IAAIA,GAAKC,UAE1BtC,EAAOgC,GAClBlQ,GAAKA,EAAEkF,MAAM,GAAI,KACjBtE,GAAMI,OAAOgF,UAAU/B,SAASsB,KAAK3E,KAG1B6P,EAAS9L,GAAS,IAAMA,EAExB+L,EAAID,GAAO,GAEXE,EAAIF,GAAO,GAEXG,EAASR,GAAM,CAACS,EAAIC,EAAM/H,KACrC,IACE,OAAOgI,GAAOlB,GAAO,IAAMgB,GAAIjB,EAAxBmB,CAAkChI,EAAI+H,GAG9C,CAFC,MAAO/Q,GACP,OAAO8Q,CACR,KAGUC,EAAOF,OAAOvJ,GACd2J,EAASZ,GAAM,CAACS,EAAII,EAASlI,IACxC1I,IAAO,CAACC,EAAKC,IAAQqQ,EAAOC,EAAItQ,EAAKD,IAAMyI,EAAKkI,KAGrCC,EAAOF,OAAO3J,GAEd8J,EAAOZ,GAAOvJ,MAAMhB,UAAUd,MAAMK,KAAKgL,EAAK,GAErDa,EAAO,CAACxL,EAAG2K,IAAQA,EAAI3K,GAEhByL,EAAOd,GAAOA,EAAI,GAIlBe,EAAOlB,GAAM,CAACvC,EAAOjN,KAChC,MAAML,EAAMsN,EAAM,GAClB,GAAKtN,EACL,OAAOwQ,GAAOxQ,EAAI,GAAIA,EAAI,GAAI+Q,EAAKH,EAAKtD,IAAjCkD,CAA0CnQ,EAAG,IAGzC2Q,EAASnB,GAAM,CAACvC,EAAOjN,KAClC,MAAML,EAAMsN,EAAM,GAClB,GAAKtN,EACL,OAAOA,EAAI,GAAGK,GAAML,EAAI,GAAKgR,EAAOJ,EAAKtD,GAAZ0D,CAAoB3Q,EAAG,IAGhCkQ,EAAK,UAEpB,MAGMU,EAAMpB,GAAM,CAACrB,EAAIwB,IACN,IAAfA,EAAI1K,WAEPqK,EAAQnB,EAAIsC,EAAZnB,CAAkBK,IAEhBiB,EAAIzC,EAAIoC,EAAKZ,OAGRjM,EAAO8L,GAAM,CAACrB,EAAIwB,IACP,IAAfA,EAAI1K,YACPwB,EACA0H,EAAGsC,EAAKd,IACNc,EAAKd,GACLjM,EAAKyK,EAAIoC,EAAKZ,MAGhBkB,EAAa,CAAC1C,EAAIwB,IAAQA,EAAImB,UAAU3C,GAmBxC4C,EAAQ,CAAC5C,EAAIgB,EAAG3C,IAAMwE,EAAQ7C,EAAGgB,GAAIhB,EAAG3B,IAExCyE,EAAO,CAAC9C,EAAIwB,IAChBlQ,IAAO,CAACC,EAAKC,IAASD,EAAMyO,EAAGxO,GAAOD,IAAM,EAAMiQ,GAK9CuB,EAAU,CAACnC,EAAKY,IAAQ,IAAMA,aAAevJ,OAASuJ,GAAQ,GAAKZ,GAEnEoC,EAAQ,CAAC/D,EAAOgE,IAAWhE,EAAMnE,KAAKmI,GAEtCC,EAAS,CAACjE,EAAOgE,IAAWA,EAAOjL,MAAMiH,IAAU,GASzD,SAAS4D,EAAQ7B,EAAG3C,GAClB,KAAM2C,aAAa/O,QAAaoM,aAAapM,QAAS,OAAO+O,IAAM3C,EAEnE,GAAIpM,OAAOoH,KAAK2H,GAAGlK,SAAW7E,OAAOoH,KAAKgF,GAAGvH,OAC3C,OAAO,EAGT,IAAK,MAAM/E,KAAOiP,EAAG,CACnB,MAAMmC,EAAUnC,EAAEjP,GACZqR,EAAU/E,EAAEtM,GAGlB,GACGoR,aAAmBlR,SAAW4Q,EAAQM,EAASC,MAC7CD,aAAmBlR,SAAWkR,IAAYC,EAE7C,OAAO,CAEV,CACD,OAAO,CACT,CAEA,MAAMC,GAAW,CAACtB,EAAMf,EAAG3C,IAAMwE,EAAQ7B,EAAEe,GAAO1D,EAAE0D,IAE9CuB,GAAW,CAACC,EAAG1R,IACF,IAAb0R,EAAEzM,QACCb,GAAIsN,EAAE,GAAI1R,IAAOyR,GAASlB,EAAKmB,GAAIxB,EAAKwB,EAAE,GAAI1R,IAIvD,SAAS2R,GAAOzB,EAAM/P,EAAKgI,GACzB,IAAIyJ,EAAS,CAAA,EACb,IAAK,IAAIF,KAAKvJ,EACZyJ,EAAOF,GAAKvJ,EAAIuJ,GAGlB,OADAE,EAAO1B,GAAQ/P,EACRyR,CACT,CAEA,MAAMC,GAAa,CAACvB,EAAMnQ,EAAKgI,KAC7B,GAAoB,IAAhBmI,EAAKrL,OACP,OAAO9E,EAET,IAAIP,EAAM0Q,EAAK,GACf,GAAIA,EAAKrL,OAAS,EAAG,CACnB,IAAI6M,GACD7C,EAAM9G,IAAQ/H,OAAOgF,UAAU3E,eAAekE,KAAKwD,EAAKvI,GACrDuI,EAAIvI,GACJkO,OAAOiE,UAAUzB,EAAK,IACpB,GACA,GACRnQ,EAAM6R,GAAU5L,MAAMhB,UAAUd,MAAMK,KAAK2L,EAAM,GAAInQ,EAAK2R,EAC3D,CACD,GAAIhE,OAAOiE,UAAUnS,IAAQwG,MAAM7C,QAAQ4E,GAAM,CAC/C,IAAIwH,EAAM,GAAGsC,OAAO9J,GAEpB,OADAwH,EAAI/P,GAAOO,EACJwP,CACX,CACI,OAAOuC,GAAMtS,EAAKO,EAAKgI,EACxB,EAKGgK,GACJ,CAAChE,EAAIiE,IACL,IAAI9L,IACK6H,KAAM7H,EAAKhC,MAAM8N,IAGtBC,GAAU,CAACnS,EAAK6D,EAAO/D,IAAOgR,EAAQd,EAAKhQ,EAAKF,GAAK+D,GAIrDuO,GAAU,CAACpS,EAAK6D,EAAO/D,IAAOgR,EAAQV,EAAKpQ,EAAKF,GAAK+D,GAErDwO,GAAO,CAACrC,EAAMlQ,IAClBwS,GAAWvD,EAAXuD,CAAkBxS,IAAOI,OAAOgF,UAAU3E,eAAekE,KAAK3E,EAAIkQ,GAE9DuC,GAAY,CAACC,EAAOC,IAAY5D,IACpC,IACE,OAAO2D,EAAM3D,EAGd,CAFC,MAAO6D,GACP,OAAOD,EAAQC,EAAG7D,EACnB,GAmBG8D,GAAU,CAAC1E,EAAIwB,IAAQA,EAAImD,OAAO3E,GAElC4E,GAAQ,CAACC,EAAWC,EAAYlE,IACpCiE,EAAUjE,GAAOkE,EAAWlE,GAAOA,EAE/BmE,GAAU,CAACF,EAAWC,EAAYE,EAAapE,IACnDiE,EAAUjE,GAAOkE,EAAWlE,GAAOoE,EAAYpE,GAE3CqE,GAAU,CAACC,EAAKC,EAAKvE,IAAQsE,EAAItE,IAAQuE,EAAIvE,GAE7CwE,GAAW,CAAClE,EAAKN,IACrBM,EAAI5P,QAAO,CAAC+T,EAAK7T,MAAU6T,GAAc7T,EAAIoP,KAAO,GAKhD0E,GAAQ,CAACJ,EAAKC,EAAKvE,IAAQwE,GAAS,CAACF,EAAKC,GAAMvE,GAEhD2E,GAAc,CAACvF,EAAIY,KAASZ,EAAGY,GAE/B4E,GAAY,CAACC,EAAMC,IAAMA,EAAEC,SAASF,GAEpCG,GAAO,CAACC,EAAOC,IAAWD,GAASC,EAEnCC,GAAM,CAACF,EAAOC,IAAWD,EAAQC,EAEjCE,GAAO,CAACH,EAAOC,IAAWD,GAASC,EAEnCG,GAAM,CAACJ,EAAOC,IAAWD,EAAQC,EAajCI,GAAO,CAAClG,EAAIpK,KAAWoK,EAAGpK,GAAQA,GAElCuQ,GAAa,CAACnG,EAAIwB,IACtBlQ,IACE,CAACC,EAAKC,EAAK+F,EAAOiK,IACN,IAAVjK,GAAgByI,EAAGxO,EAAKgQ,EAAIjK,EAAQ,IAEhC,IAAIhG,EAAI4E,MAAM,EAAG5E,EAAIuF,OAAS,GAAI,IAAIvF,EAAIA,EAAIuF,OAAS,GAAItF,IAD3D,IAAID,EAAK,CAACC,KAEhB,GALFF,CAMEkQ,GAEE4E,GAAW,CAACpG,EAAIwB,IACpBlQ,IAAO,CAACC,EAAKC,IAAQgP,GAAK6F,GAASrG,EAAGxO,IAAOmE,GAAOnE,GAAMD,IAAM,CAAE,EAAlED,CAAoEkQ,GAKhE8E,GAAQ,CAACC,EAAOvM,KACpB,IAAIyJ,EAAS,CAAA,EACb,IAAK,IAAIF,KAAKvJ,EACPuM,EAAMZ,SAASpC,KAAIE,EAAOF,GAAKvJ,EAAIuJ,IAE1C,OAAOE,CAAM,EAGT+C,GAAU,CAACC,EAAMzM,KACrB,IAAIyJ,EAAS,CAAA,EACb,IAAK,IAAIiD,KAAK1M,EACRyM,EAAKzM,EAAI0M,GAAIA,KAAIjD,EAAOiD,GAAK1M,EAAI0M,IAEvC,OAAOjD,CAAM,EAGTkD,GAAQ,CAACJ,EAAOvM,KACpB,IAAIyJ,EAAS,CAAA,EAIb,OAHA8C,EAAMnQ,SAAQ2L,IACRA,KAAQ/H,IAAKyJ,EAAO1B,GAAQ/H,EAAI+H,GAAK,IAEpC0B,CAAM,EAGTmD,GAAW,CAACL,EAAOvM,KACvB,IAAIyJ,EAAS,CAAA,EAIb,OAHA8C,EAAMnQ,SAAQ2L,IACZ0B,EAAO1B,GAAQ/H,EAAI+H,EAAK,IAEnB0B,CAAM,EAGf,SAASoD,GAAQ9E,EAAM/H,GACrB,OAAOsM,GAAM,CAACvE,GAAO/H,EACvB,CAEA,MAMM8M,GAAc,CAACC,EAAKC,IAAQ/U,OAAOgV,OAAO,CAAE,EAAEF,EAAKC,GAEnDE,GAAa,CAACH,EAAKC,IAAQ/U,OAAOgV,OAAO,CAAE,EAAED,EAAKD,GAElDI,GAAiB,CAACpO,EAAOqO,IAC7BA,EAAK9V,QAAO,CAACC,EAAKC,IAASuH,EAAM4M,SAASnU,GAAOD,EAAM,IAAIA,EAAKC,IAAO,IAEnE6V,GAASrH,GAAMY,GAAOZ,EAAGY,GAEzB0G,GAAUtH,GAAM,CAACuH,EAAMC,IAASxH,EAAGuH,EAAMC,GA+BzCC,GAAS,CAACtJ,EAAMuJ,EAAIlG,IAAQA,EAAIrL,MAAMgI,EAAMuJ,GAErCC,GAAU1W,GAAKA,EAAE2W,cACjBC,GAAU5W,GAAKA,EAAE6W,cAKxBC,GACJC,GACA,IAAI7P,KACF,GAAI6P,aAAiBC,SACnB,OAAOD,KAAS7P,GAElB,GAAI6P,aAAiB/P,MACnB,OAAO+P,EAAM7K,KAAI6C,GAAM+H,GAAW/H,EAAX+H,IAAkB5P,KAE3C,MAAM+P,EAAM,CAAA,EACZ,IAAK,IAAKnW,EAAK6D,KAAU3D,OAAOC,QAAQ8V,GACtCE,EAAInW,GAAOgW,GAAWnS,EAAXmS,IAAqB5P,GAElC,OAAO+P,CAAG,EAGW7G,GAAM,CAAC2G,EAAOpH,KAAQzI,IAC7C4P,GAAWC,EAAXD,CAAkBnH,KAAQzI,KAGhB,MAACgQ,GAAM9G,EAAMyB,GACdzB,GAlHK,CAAC+G,EAAGb,KAASpP,IAAS,CAACoP,KAASpP,GAAMiQ,KAmH1C/G,GA9CK,CAACrB,EAAIqI,IAAYC,QAAQC,QAAQF,GAAS3J,KAAKsB,KA+ChE,MAAErK,GAAS0L,EAAM0B,GACfyF,GAAQnH,EAAMX,GACdqD,GAAQ1C,EAAMmC,IACdK,GAAYxC,EAAMqC,IAClB+E,GAAUpH,GAlKK,CAACH,EAAKN,IACrBM,EAAI5P,QAAO,CAAC+T,EAAK7T,MAAS6T,GAAa7T,EAAIoP,KAAO,KAkKlD8H,GAAOrH,EAAMiE,IACHjE,EAAM2C,IAClB,MAAE2E,GAAQtH,GA5CK,CAACuH,EAAGC,EAAG7W,IAAQ4W,EAAEC,EAAE7W,GAAMA,KA6CnBqP,GApEK,CAACyH,EAAOC,KAChC,MAAMb,EAAM,IAAIc,IACVC,EAAK,IAAID,IAAIF,GACbI,EAAK,IAAIF,IAAID,GACnB,IAAK,IAAItD,KAAQwD,EACVC,EAAGjT,IAAIwP,IAAOyC,EAAIiB,IAAI1D,GAE7B,MAAO,IAAIyC,EAAI,IA8DjB,MAAEkB,GAAS/H,EAAMwF,IACLxF,EAAMgC,IAClB,MAAEgG,GAAShI,EAAMwB,GACf8B,GAAStD,EAAMqD,IACfzO,GAAMoL,EAAM+C,IACZkF,GAAUjI,EAAMiC,IAChBiG,GAAOlI,GAlDK,CAACG,EAAK+F,KAAStD,IACpBzC,EAAIrE,KAAI6C,GAAMA,EAAGuH,KAAStD,OAkDjC9G,GAAMkE,GApMK,CAACrB,EAAIwB,IAAQA,EAAIrE,IAAI6C,KAqM1BqB,EAAMgB,GACAhB,GAhEK,CAACrB,EAAIqI,IAAYA,EAAQ3J,KAAK,KAAMsB,KAiEvD,MAAEwJ,GAASnI,EAAM6C,IACC7C,GA9NK,CAACrB,EAAIjO,EAAKF,IAAOmO,EAAG+B,EAAKhQ,EAAKF,MA+NxCwP,EAAMiD,IACnB,MAAEmF,GAAOpI,EAAMuD,IACb5C,GAASX,EAAM0D,IACf2E,GAASrI,EAAM4D,IACf0E,GAAUtI,EAAM+D,IAChBf,GAAahD,EAAMkE,IACnBI,GAAWtE,EAAMmE,IACjBoE,GAAYvI,GAzGK,CAACH,EAAKN,IACvBM,EAAI5P,QACF,CAACC,EAAKC,EAAK+F,IAAqB,IAAVA,EAAc/F,EAAIoP,GAAOpP,EAAID,EAAKqP,IACxD,QAuGYS,GA/EK,CAACrB,EAAIwB,EAAKqI,KAAUzK,IACvCoC,EAAIrE,KAAI,CAAC3L,EAAKqF,EAAGuQ,IAASpH,EAAGxO,EAAKqF,EAAGuQ,EAAMyC,KAAUzK,OA+EvD,MAAE0K,GAAYzI,EAAM6F,IACL7F,EAAMyF,IACZzF,EAAMiF,IACf,MAAEyD,GAAS1I,EAAM8C,IACR9C,EAAMsF,IACJtF,EAAMmF,IACLnF,EAAMuF,IACXvF,EAAM0E,IACL1E,EAAMuE,IACHvE,GA9EK,CAACuH,EAAGC,EAAG7W,IAAQ6W,EAAE7W,GAAK0M,MAAKqB,GAAK6I,EAAE7I,EAAG/N,OA+ErD,MAAEgY,GAAK3I,EAAM4E,IACL5E,EAAM2E,IACd,MAAE1U,GAAS+P,GA9KK,CAACrB,EAAIiK,EAAMzI,IAAQA,EAAIlQ,OAAO0O,EAAIiK,KA+KtC5I,EAAM+E,IAClB,MAAE8D,GAAY7I,EAAM8E,IAClBgE,GAAM9I,EAAM6E,IACL7E,EAAMuB,GACNvB,EAAM+I,GACf,MAAE5J,GAAOa,EAAMgJ,GACPhJ,EAAMiJ,GACLjJ,EAAMkJ,GACf,MAAEzP,GAAOuG,EAAM2B,GACbhL,GAAQqJ,EAAM6B,GACP7B,GAvVK,CAACrB,EAAIwB,IACjBlQ,IAAO,CAACC,EAAKC,KAASwO,EAAGxO,IAAeD,IAAM,EAAMiQ,KAuVtD,MAAEmB,GAAYtB,EAAMqB,GAClBvM,GAAQkL,EAAMoG,IACEpG,EAAM8F,IACd9F,EAAMgG,IACLhG,EAAMiG,IACjB,MAAEkD,GAAWjH,GAAK6G,EAAYjI,EAAKoB,GAAIM,GAAUN,IAC/C8C,GAAW9C,GAAK6G,EAAYrI,EAAKwB,GAAIQ,GAAMR,ICrehCkH,GAAe,CAACC,EAAQzH,KACnC,MAAMxD,EAAMZ,EAAM,IAAIoE,MACtB,OAAO0H,GAAUD,EAAVC,CAAkBlL,EAAI,EAUzBkL,GAAYD,GAAUjL,GACtBA,aAAexH,MACF,QAAXwH,EAAI,GACCmL,EAAUC,GAAMF,GAAUD,IAAUI,EAApCF,CAA4CnL,GAEtC,OAAXA,EAAI,GACCmL,EAAUG,EAAMJ,GAAUD,IAAUI,EAApCF,CAA4CnL,GAEtC,QAAXA,EAAI,GACCmL,EAAUI,EAAOD,EAAMJ,GAAUD,IAAUI,EAA3CF,CAAmDnL,GAErDmL,EAAUG,EAAMJ,GAAUD,IAA1BE,CAAoCnL,GAEpCiL,EAAO1V,IAAIyK,GCxCf,MAAMwL,GACXC,cACEpV,KAAKqV,SAAW,EACjB,CAIDnW,IAAIjD,GACF,OAAO+D,KAAKqV,SAASpZ,EACtB,CAIDH,IAAIG,GACF,OAAO+D,KAAKsV,OAAOrZ,GAAK,EACzB,CAIDsZ,MAAMtZ,GACJ,OAAO+D,KAAKsV,OAAOrZ,GAAK,EACzB,CAKDqZ,OAAOrZ,EAAKuZ,GAEV,OADAA,EAAuB,kBAATA,EAAqBA,GAAQxV,KAAKd,IAAIjD,MACvC+D,KAAKd,IAAIjD,IACpB+D,KAAKqV,SAASpZ,GAAOuZ,EACd,EAAC,EAAMA,IAEP,EAAC,EAAOA,EAElB,ECqBH,MAAMC,GAAO,IAnDb,cAAqCN,GAWnCG,OAAOI,EAAMF,EAAMG,GAAU,GAC3B,GAAID,EAAK7F,SAAS,KAIhB,OAHA+F,QAAQC,KACN,gFAEK7V,KAET,MAAO8V,EAAgBC,GAASC,MAAMV,OAAOI,EAAMF,GA6BnD,OA3BIM,IACFjc,EAAEoc,UAAUC,QAAQ,WAAaR,EAAMK,GACnCJ,GAAS9b,EAAE,QAAQsc,YAAYT,EAAMK,GAEvC,IACKE,SAASG,iBACV,gBAAkBV,EAAO,yBAA2BA,EAAO,OAE7DpV,SAAQ+V,IACR,IAAIC,GAAS,EACb,MAAMC,EAAWF,EAAIG,QAAkB,SAMvC,GALID,IACFD,EAAS3B,GAAa3U,KAAMuW,KAIzBD,EAAQ,CACX,MAAM3C,EAAO0C,EAAIG,QAAc,KAE3B7C,IACF2C,GAAU3B,GAAa3U,KAAM2T,GAEhC,CACD0C,EAAIC,OAASA,CAAM,KAIlBtW,IACR,GChDGyW,GAAa,mBACbC,GAAc,oBAGdC,IJGyBzM,GID7B,SAAU0F,GACR,OAAOA,EAAI,wBACZ,EJDgCgH,GIEjC,KAJA,CAAC,QAAS,WAAY,UJGXvP,IAAI6C,IAAIhJ,KAAK0V,KADnB,IAAwB1M,GAAI0M,GIKnC,MAAMC,GAAWC,GAAaA,EAAUV,iBAAiBO,IAEnDI,GAAoB7a,GAAe,OAARA,EAC3B8a,GAAuB9a,IAAe,IAARA,EAC9B+a,GAAyB/a,IAAe,IAARA,EAEtC,SAASgb,IAAcC,OACrBA,EAAS,KAAIC,OACbA,EAASpY,gBAAe8X,UACxBA,EAAYb,SAASoB,cAnBI,yBAmB6BC,OACtDA,EAASN,GAAoBO,SAC7BA,EAAW5D,GAAKsD,IAAwB,IAAM,OAAKO,UACnDA,EAAYX,IACV,IACF,OAQF,SAAqBY,EAAUN,EAAQG,EAAQC,GAC7C,IAAK,MAAMG,KAAQD,EAAU,CAC3B,MAAMvb,EAAMyb,GAAQD,GAClBpU,EAAOoU,EAAKE,aAAanB,KAAeiB,EAAKE,aAAa,QACvDhE,GAAOmD,GAAmBO,EAAQpb,IACrCib,EAAOtX,OAAOyD,EAAMiU,EAASrb,GAEhC,CACD,OAAOib,CACT,CAjBSU,CACLL,EAAUV,GACVK,GAAU,IAAIC,EACdE,EACAC,EAEJ,CAaA,SAASI,GAAQD,GACf,GAAIA,EAAKI,aAAapB,IAAc,OAAOgB,EAAKE,aAAalB,IAC7D,OAAQgB,EAAKrO,MACX,IAAK,QACH,OAAOqO,EAAKK,QAAUL,EAAK5X,MAAQ,KACrC,IAAK,WAGH,QAAK4X,EAAKK,WACHL,EAAKI,aAAa,UACrBJ,EAAK5X,OAGX,QACE,OAAOT,OAAOqY,EAAK5X,OAAOH,QAAQ,SAAU,QAElD,CAEA,MAAMqY,GAAqB,IACzBd,GAAc,CAAE,GAAE9X,WAAWO,QAAQ,SAAU,UCnEjD,IAAIsY,GAAQ,CAAA,EAEZ,MAAMC,GAAe,CAAC,SAAU,YAAa,YACvCC,GAAW,CAAC,cAAeD,IAKjC,SAASE,GAAeC,EAAMpc,QACJ,IAAboc,EAAKpc,KAAqBgc,GAAMhc,GAAOoc,EAAKpc,GACzD,CAsBO,SAASqc,GAAOnL,EAAQjJ,GAC7B,OAAOrK,EAAE0e,OAAO,CAAE,EAAEN,GAAO/T,GAAKiJ,EAClC,CAgBA,SAASqL,GAAQjV,EAAMiU,EAAY,IAAIiB,SAAYvU,GACjD,SAASrE,EAAO5D,QAEFuG,IADA8V,GAAOrc,EAAKiI,IACDsT,EAAU3X,OAAO5D,EAAKqc,GAAOrc,EAAKiI,GAC1D,CAMD,OALI/B,MAAM7C,QAAQiE,GAChBA,EAAKjD,QAAQT,GAEbA,EAAO0D,GAEFiU,CACT,CAxDArb,OAAOM,OAAOyb,IACd/b,OAAOM,OAAO0b,IA8Dd,IAAeO,GAAA,CACbC,QANF,SAAiBpV,EAAMW,GAErB,OADYsU,GAAQjV,EAAM,IAAIvE,gBAAmBkF,GACtC9E,UACb,EAIEwZ,QA1DK,SAAiBP,GACtBD,GAAeC,EAAM,WACrBD,GAAeC,EAAM,YACrBD,GAAeC,EAAM,sBACrBD,GAAeC,EAAM,mBACrBD,GAAeC,EAAM,iBACrBD,GAAeC,EAAM,aACrBD,GAAeC,EAAM,aACrBD,GAAeC,EAAM,UACrBD,GAAeC,EAAM,WACrBD,GAAeC,EAAM,oBACrBD,GAAeC,EAAM,mBACrBD,GAAeC,EAAM,cACrBD,GAAeC,EAAM,YACrBD,GAAeC,EAAM,gBACrBD,GAAeC,EAAM,YACrB,IAAIQ,EAAUP,GAAO,WACE,iBAAZO,IAAsBZ,GAAe,QAAIY,EAAQrX,MAAM,KACpE,EAyCE8W,UACAQ,UA9BF,SAAmBpN,GACjB,OAAKA,GACLA,EAAIpL,SAAQ,SAAUrE,UACbgc,GAAMhc,EACjB,IACSgc,IAJWA,GAAQ,EAK5B,EAyBEO,WACAL,YACAD,iBCtEK,MAAMa,GAAa,IACxBtD,GAAKvW,IAAI,aAAe8Z,QAAQN,GAAKJ,OAAO,cAEjCW,GAAQ,KACnB,IAAKF,KAAc,OACnB,IAAKG,UAAUC,WAAY,OAC3B,MAAMd,EAAO,CACX,mBACAK,GAAKC,QAAQD,GAAKP,UAClB,WACAH,MAECnJ,OAAOmK,SACP9X,KAAK,KAEFkY,EAAM,IAAIpa,gBAAgBqZ,GAEhCa,UAAUC,WAAW,UAAWC,EAAI,EAKhC,eAAgBra,OAClBA,OAAO2I,iBAAiB,WAAYuR,IAEpCla,OAAO2I,iBAAiB,SAAUuR,IAAO,GCXtC,MAAMI,GAAkB,KAC7B5D,GAAK3Z,IAAI,mBACT2Z,GAAKF,MAAM,eAAe,EAGf+D,GAAe,KAC1B7D,GAAKF,MAAM,mBACXE,GAAK3Z,IAAI,eAAe,EAG1BjC,GAAE,WACA,IAAI0f,EAAcC,EAClB,IAEMza,OAAO0a,OAAOxD,SAASyD,OACzBH,EAAexa,OAAO0a,OAAOxD,SAASyD,KAAKC,UAAUzX,MACnD,+BAEEqX,IAAcC,EAA4B,UAApBD,EAAa,IAI1C,CAFC,MAAO5K,GACP6K,GAAQ,CACT,CACGA,EACFF,KAEAD,KAEFxf,EAAEoc,SAASyD,MAAME,GAAG,wBAAwB,WAC1CN,IACJ,IACEzf,EAAEoc,SAASyD,MAAME,GAAG,WAAW,SAAUjL,IAE3B,QAAVA,EAAE1S,KACF0S,EAAEnE,OAAOqP,QAAQ,iDAEjBR,IAEN,GACA,ICtDO,MAAMS,GACN,SAAUhS,GACb,IAAIiS,EAAS9D,SAAS+D,eAAe,YACjCD,IAAQA,EAAOE,UAAY,QAAUnS,EAAU,SACpD,EAMUoS,IACPC,IAAO,EACJ,WACL,IAAIC,GAEAD,IAAU,qBAAsBpb,QAKpClF,EAAEoc,UAAU2D,GAAG,OAAQ,gCAAgC,WACrDE,GAAS,GACf,KAoBIM,EAASnE,SAAS+D,eAAe,wBAGpB,IAAIjb,OAAOsb,kBArBxB,SAAqBC,EAASC,GAC5B,IACE,IAAIC,EACFvE,SAASwE,cAAcd,UAAUnY,MAAM,KAAKE,QAAQ,kBACnD,CAGJ,CAFC,MAAOiN,GAER,CACD,GAAI6L,EAAS,CACX,IAAI1S,EAAU,CACZjO,EAAE,mBAAmB6gB,OACrB7gB,EAAE,mCAAmC6gB,OACrC7gB,EAAE,kCAAkC6gB,QACpCxZ,KAAK,KACP4Y,GAAShS,EAAU,KAAO5M,EAAE,yBAC7B,CACF,IAMUyf,QAAQP,EAAQ,CAAEQ,YAAY,IACvCT,IAAO,IA/BPA,IAAO,CAiCb,GAvCkC,IAC5BA,GChBN,IAAIU,IACEC,GAAY,CACd,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,QACL,IAAK,UAEHC,GAAK,IAAIC,OAAO,YAAa,KAC1B,SAAoB7N,GACzB,OAAO9N,OAAO8N,GAAQxN,QAAQob,IAAI,SAAU5f,GAC1C,OAAO2f,GAAU3f,EACvB,GACA,GAdiB,IACX2f,GAQAC,GCDN,SAASE,GAAOC,EAAU,CAAEC,WAAW,EAAOC,MAAM,GAASC,GAC3D,GAAKA,EAAL,CACA,IAAIX,EAAOW,EAAavT,SAAWuT,EAGd,oBAAZzF,SACPA,SACyB,mBAAlBA,QAAQ0F,OAEf1F,QAAQ0F,MAAMD,GAEhB5F,GAAK3Z,IAAI,cACLof,EAAQE,KACVnF,SACGG,iBAAiB,oBACjB9V,SAAQib,GAASA,EAAKtB,UAAYS,IAErCzE,SACGG,iBAAiB,oBACjB9V,SAAQib,GAASA,EAAKC,YAAcd,IAEpCQ,EAAQC,WACXpc,OAAO0c,WAAWhG,GAAKF,MAAMmG,KAAKjG,GAAM,cAnB9B,IAFc,CAsB5B,m1BCjBA,SAASkG,GAAW5f,EAAIF,GAGtB,SAAS4D,EAAKwM,EAAM2P,GAClB,QAAWpZ,IAAPzG,EAAkB,OAAO6f,EAC7B,QAAapZ,IAATyJ,EAAoB,OAAO2P,EAG/B,IAFA,IAAIC,EAAQ5P,EAAKzK,MAAM,KAAKqN,OAAOmK,SACjC8C,EAAO/f,EACFoE,GAAI0b,EAAM,GAAIC,IACnBA,EAAOA,EAAKD,EAAM1Y,SAEpB,OAAqB,IAAjB0Y,EAAM7a,OAAqB8a,EACxBF,CACR,CAED,OAdI/f,IAAQE,EAAK0D,EAAK5D,IAcf4D,CACT,CAzBAsc,GAAKC,KAAO7f,OAAOgV,OACjB,CACE8K,UAAU,EACVC,iBAAiB,EACjBC,eAAe,GAEjBJ,GAAKC,MCVA,MAAMI,GAAgBjhB,GAC3BA,EAAEkhB,WAAW,YAAclhB,EAAEkhB,WAAW,YACpClhB,EACA,CAAC4gB,GAAKO,UAAWnhB,GAAG0T,OAAOmK,SAAS9X,KAAK,KCH/C,IAAIrH,GAAID,OAYR,IAAI2iB,GAAO,CACTC,MAAM,EACNC,KAAM,KACNC,UAAW,KAEXC,eAAgB,CACdC,SAAU,OACVvT,KAAM,OACNwT,IAAK,SACLC,OAAO,EACPjV,OAAO,EACPkV,QAASC,GACT1B,MA+CJ,SAAqBjD,EAAM4E,GACzBV,GAAKW,UACLrjB,GAAEoc,UAAUC,QAAQ,eAAgBmC,EAAM4E,QAChBza,IAAtB6V,EAAK8E,aACiB,UAApB9E,EAAK+E,YAEPnC,GACE,CAAEG,MAAM,EAAOD,WAAW,GAC1BjgB,EAAE,yDAGiC,KAA9BrB,GAAEwjB,KAAKhF,EAAK8E,cACrBlC,GACE,CAAEG,MAAM,EAAOD,WAAW,GAC1BjgB,EAAE,yDAGJ+f,GACE,CAAEG,MAAM,EAAMD,WAAW,GACzB,UACEN,GAAWoC,GADb,+BAIEpC,GAAWxC,EAAK8E,cAChB,SAGR,GAvEEG,KAAM,SAAUpC,GACd,MAAMqC,EAAWphB,OAAOgV,OAAO,CAAE,EAAEoL,GAAKI,eAAgBzB,EAAS,CAC/D2B,IAAKT,GAAclB,EAAQ2B,KAAON,GAAKI,eAAeE,OAGxD,OADAhjB,GAAEoc,UAAUC,QAAQ,aAAcqH,GAC3B1jB,GAAE2jB,KAAKD,EACf,EAED5d,QAAS,SAAUuE,GAGjB,OAFAqY,GAAKE,MAAQF,GAAKE,KAAKgB,QACvBlB,GAAKE,KAAOF,GAAKe,KAAKpZ,GACfqY,GAAKE,IACb,EAEDS,QAAS,WACPX,GAAKC,MAAO,EACZ3iB,GAAE,mBAAmBoS,KAAK,YAAY,EACvC,GAYHpS,GAAE6jB,SAAW,SAAUb,EAAKxE,GAC1B,OAAOkE,GAAKe,KAAK,CAAET,IAAKA,EAAKxE,KAAMA,GACrC,EAsDO,MAAMsF,GAAiB7a,OAAO,+BAM/B8a,GAAW9a,OAAO,oBAoBxB+E,eAAemV,GAAU3E,EAAMwF,EAAQC,GACrC,QAAgC,IAArBA,EAAIC,aAA8B,CAO3C,GAHAlkB,GAAEoc,UAAUC,QAAQ,kBAAmB4H,EAAIX,cAE3CtjB,GAAEoc,UAAUC,QAAQ,mBAAoBmC,GACpCA,EAAKsF,IAAiB,OAI1B,SAHMtF,EAAKuF,IAEX/jB,GAAEoc,UAAUC,QAAQ,gBAAiBmC,GACjCA,EAAKsF,IAAiB,OAK1B,SAJMtF,EAAKuF,IAGX/jB,GAAEoc,UAAUC,QAAQ,oBAAqBmC,GACrCA,EAAKsF,IAAiB,OAK1B,SAJMtF,EAAKuF,IAGX/jB,GAAEoc,UAAUC,QAAQ,qBAAsBmC,GACtCA,EAAKsF,IAAiB,MAC3B,CACH,CCjKO,MAAMK,GAAa,IAAMvI,GAAK3Z,IAAI,aCEzC,SAASmiB,GAAI/C,GAEX,IADAA,EAAUA,GAAW,IACTgD,aAAc,CAYxB,IAAI7R,EAAOtN,OAAOof,SAASC,SAAS5c,MAAM,KACxC6c,EAAWhS,EAAKtC,OAAS,aACzBuU,EACEvf,OAAOof,SAASI,OAChBlS,EAAK2B,OAAOqQ,GAAUnd,KAAK,KAC3B,IACArH,EAAE2kB,MAAM,CAAEC,KAAMvD,EAAQuD,OAC1BC,EAASxD,EAAQgD,aAAa1c,MAAM,KAAK,GAC3CxB,KAAKmX,OAAShb,OAAOgV,OAAO,CAAE,EAAE+J,EAAQyD,YAAa,CACnDL,YACAM,OAAQ1D,EAAQ0D,OAEhBC,MAAO3D,EAAQ2D,QAEjB7e,KAAK6c,IAAM6B,EAAS,IAAM7kB,EAAE2kB,MAAMxe,KAAKmX,QACvCnX,KAAK8e,MAAQ,CACjB,MACI9e,KAAKmX,OAAStd,EAAE0e,OAAO1e,EAAEklB,aAAc,CAAEC,IAAK,SAC9Chf,KAAK8e,MAAQ,EAEf,OAAO9e,IACT,CAEAie,GAAI9c,UAAU8d,aAAe,WAC3B,IAAKjf,KAAK8e,MAAO,KAAM,mCACJ,IAAf9e,KAAK8e,OTNL,eAAgB/f,OAClBA,OAAO4I,oBAAoB,WAAYsR,IAEvCla,OAAO4I,oBAAoB,SAAUsR,IAAO,GSK5Cla,OAAOof,SAASzZ,KAAO1E,KAAK6c,KACJ,IAAf7c,KAAK8e,OACdjlB,EAAE6jB,SAAS,cAAe1d,KAAKmX,QAAQvO,KAAKoV,GAEhD,ECjC0BnK,GAAQ,CAChCtF,GAAWtC,EAAK,YAChB2H,GACErF,GAAWtC,EAAK,eAChBd,EAAKc,EAAK,cAAe+O,QAAQD,GAAMA,EAAG/V,KAAK,SAI5C,MAAMka,GAAYjT,EAAK,WAEjBkT,GAAUvL,GACrBF,GAAO,OAAQ,SACfA,GAAO,cAAe,UAGX0L,GAAWxL,GACtBF,GAAO,cAAe,SACtBA,GAAO,cAAe,aAGX2L,GAAS3L,GAAO,OAAQ,aAExB4L,GAAY1L,GAAOuL,GAASE,IAE5BE,GAAY7L,GAAO,cAAe,WAElC8L,GAAajR,GAAWqF,GAAO0L,GAAWC,KAE1CE,GAAa7M,GACxB4M,GACA5L,GACE1H,GAAO/L,GAAI,oBAAqB8L,EAAK,oBAAqBA,EAAK,aAC/DyH,GAAO,WAAW,KAITgM,GAAgBxT,GAC3B0H,GAAO6L,GAAY/L,GAAO,WAAW,IACrC7H,EACA8G,GAAQ,CACNxS,GAAI,WACJA,GAAI,WACJyS,GAAKzS,GAAI,aAAcoO,GAAWmF,GAAO,YAAa,KACtDzH,EAAK,WACLZ,GAAQlQ,GAAW,WAANA,GAAgBkO,EAAM4C,EAAK,kBAI/B0T,GAAgBC,GAC3BzjB,OAAOC,QAAQwjB,GAAMpkB,QACnB,CAACC,GAAMQ,EAAK6D,KAAWrE,EAAM,IAAIQ,MAAQ4e,GAAW/a,OACpD,IClDE+f,GAAmB,CACvBC,eAAgB,cAChBC,QAAS,eACTC,MAAO,cACPC,eAAgB,cAChBC,WAAY,cACZC,SAAU,cACVC,QAAS,cACTC,UAAW,cACX1T,IAAK,gBAGD2T,GAAWjV,GACfkV,GAAeV,GAAiBU,IAAgBV,GAAsB,KACtE5T,EAAK,gBAGDuU,GAAUnV,GAAQpP,GAAOf,EAAEe,IAAMqkB,IAEjCG,GAAgBpV,GACpBpP,GAAOf,EAAEe,KACTA,GAAOA,EAAI0D,QAAQ,UAAW,aAC9B2gB,IAEWI,GAAWrV,EACtBsI,GACE1H,EAAK,YACL4G,GACE5E,GAAM,kBACN5C,GAAQlQ,GAAKA,EAAEkF,MAAM,EAAG,GAAG2R,cAAgB7W,EAAEkF,MAAM,IAAI4L,EAAK,eAGhE0H,GACE1H,EAAK,YACL4G,GAAM5E,GAAM,mBAAoB5C,EAAQ0G,GAAS9F,EAAK,eAExD0H,GACE1H,EAAK,YACL4G,GAAM5E,GAAM,mBAAoB5C,EAAQwG,GAAS5F,EAAK,eAExD4G,GAAM5E,GAAM,YAAa2F,GAAOvH,EAAK,CAAC,WAAY,aAAcmU,KAChEtU,GACEsH,GAAQ,CAAC,WAAY,aACrBnI,EAAQ4C,GAAM,KAAM/S,EAAE,KAAM,MAAO+S,GAAM,KAAM/S,EAAE,KAAM,OACvDmQ,EAAQ4C,GAAM,KAAM,IAAKA,GAAM,KAAM,MAEvC4E,GACE5E,GAAM,gBACN5C,GAAQlQ,GAAKA,EAAEkF,MAAM,EAAG,GAAG2R,cAAgB7W,EAAEkF,MAAM,IAAI4L,EAAK,YAE9DC,GACEsH,GAAQ,CAAC,WAAY,aACrBX,GACE5E,GAAM,UACN5C,GACEK,GAAOhJ,KAAUgJ,IACjB+H,GAAK,CACHgN,GACApV,GAAQqV,IAAa,CAAEA,cAAarU,EAAK,CAAC,WAAY,kBAI5DwG,GAAM5E,GAAM,UAAWuS,MCvD3BG,KAAKxf,UAAUyf,kBAAoB,WACjC,IAAIC,EAAQ7gB,KAAK8gB,WACbC,EAAU/gB,KAAKghB,aAGnB,OAFIH,EAAQ,KAAIA,EAAQ,IAAMA,GAC1BE,EAAU,KAAIA,EAAU,IAAMA,GAC3BF,EAAQ,IAAME,CACvB,EACA,MAAME,GAAa,wBACjBC,GAAa,4BA6BTC,GAAO,IAAI9e,IAAS,IAAIse,QAAQte,GAEzB+e,GAAY3U,EAAK,CAC5B,CAAC8G,GAAO,GAAI,KAAe,GAC3B,CAACA,QAAO/Q,GAAYuI,GACpB,CAACwI,GAAO,IAAKxI,GACb,CACE/F,GAAKkc,IAQL/V,EAAKjJ,GAAMgf,IAAa5U,EAAM5B,GAAKgK,GAAS,CAAC,IAAK7J,GAAM6H,GAAMyO,MAEhE,CAACnc,GA5CC,uDA4C8Bmc,IAChC,CAACnc,GAAKic,IAAa9V,EAAKjJ,GAAM+e,IAAa5U,EAAK,CAAC,IAAK5J,SAAU0e,KAChE,CACErV,EACAuV,IACE,KAAM,2BAA2BA,GAAO,KAKjCC,GAAiBnU,GAC5BA,EAAOxN,QAAQ,iCAAkC,WAqE5C,MAAM4hB,GAAc,CAAC7e,EAAQ5C,KAClC,IAAIqhB,EACJ,IACEA,EAAOtnB,EAAEC,WAAWsnB,UAAU1e,EAAQ5C,EA4CvC,CA3CC,MAAO6O,GACP,MAAM6S,EAAkB9e,EAAO/C,QAAQ,UAAW,IAAIA,QAAQ,KAAM,QAClE8hB,EAAQ3hB,EAAMH,QAAQ,UAAW,IACnCwhB,EAAO,IAAIR,KACX,MAAMe,EAAYF,EAAgB9f,QAAQ,QAEpCigB,EAA2B,IAAdD,EAAkBD,EAAMzgB,OAAS,EAAI,EACxD,IAAI4gB,EAAO/X,OAAO4X,EAAMI,OAAOH,EAAW,EAAIC,IAC9C,GAAIC,GAAQ,GAAI,CACd,MAAME,EAAajY,OAAOiE,UACxBjU,EAAEC,WAAWioB,UAAUC,iBAErBnoB,EAAEC,WAAWioB,UAAUC,gBACtBb,EAAKc,UAAY,IAClBpY,OAAOhQ,EAAEC,WAAWioB,UAAUC,iBAK5BE,EAAWf,EAAKgB,cAAgB,KAAQ,EAE5CP,GADEA,GAAQE,EACQ,IAAVI,EAEgB,KAAfA,EAAU,EAEtB,CACD,MAAME,EAAQC,KAAKC,IACjB,EACAzY,OAAO4X,EAAMI,OAAOL,EAAgB9f,QAAQ,MAAQigB,EAAY,IAAM,GAElEY,EAAM1Y,OACV4X,EAAMI,OAAOL,EAAgB9f,QAAQ,MAAQigB,EAAY,IAK3D,GAHAR,EAAKqB,YAAYZ,GACjBT,EAAKsB,SAASL,GACdjB,EAAKuB,QAAQH,GAEXpB,EAAKgB,gBAAkBP,GACvBT,EAAKwB,aAAeP,GACpBjB,EAAKyB,YAAcL,EAEnB,KAAM,cAET,CACD,OAAOpB,CAAI,EAGA0B,GAAeC,IAC1B,IAAI3B,EACJ,IACEA,EAAOI,GAAY1nB,EAAEC,WAAWioB,UAAUrnB,WAAYooB,EAAGtY,OAAO1K,MASjE,CARC,MAAO6O,GAEX,CAAY,QACJwS,IACF2B,EAAGtY,OAAO1K,MAAQwhB,GAChBznB,EAAEC,WAAWipB,WAAWlpB,EAAEC,WAAWioB,UAAUrnB,WAAYymB,IAGhE,GAGU6B,IACPC,GAAM,IAAItC,KACVuC,GAAQD,GAAIE,SAAS,EAAG,EAAG,EAAG,GAE9BC,GAASF,IADTG,GAAU,OAEVC,GAAWL,GAAIhB,UACfsB,GAAa,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAAOlc,KACjE,SAAUmc,GACR,OAAOtoB,EAAEsoB,EACV,IAECC,GAAe,CACjB,MACA,MACA,MACA,MACA,MACA,OACA,OACA,MACA,MACA,MACA,MACA,OACApc,KAAI,SAAU+a,GACd,OAAOlnB,EAAEknB,EACb,IAaE,SAAmBjB,GACjB,KAAMA,aAAgBR,MAAO,KAAM,wBACnC,IACI+C,EADAC,EAAKxC,EAAKxJ,UAGd,OADA+L,EAAKvC,EAAKP,oBAhBZ,SAAiB+C,GACf,OAAOA,EAAKT,IAASS,EAAKP,EAC3B,CAeKQ,CAAQD,GACHD,EAfX,SAAqBC,GACnB,OAAOT,GAAQS,GAAMA,EAAKT,GAAQG,EACnC,CAeKQ,CAAYF,GACPzoB,EAAE,aAAe,KAAOwoB,EAfnC,SAAoBC,GAClB,OAAOA,EAAKT,GAAQG,MACrB,CAeKS,CAAWH,GACNJ,GAAWpC,EAAK4C,UAAY,IAAML,EAGzCvC,EAAKyB,UACL,IACAa,GAAatC,EAAKwB,aApBtB,SAAoBxB,GAClB,OAAOmC,IAAYnC,EAAKc,SACzB,CAmBI+B,CAAW7C,GAAQ,GAAK,IAAMA,EAAKgB,eACpC,KACAuB,CAEH,GA7DsB,IACnBT,GACAC,GACAG,GACAD,GACAE,GACAC,GAKAE,GCxOC,MAAMQ,GAAa5X,EAAK,CAAC,YAAa,OAAQ,eAExC6X,GAAiB7Y,EAAQJ,EAAKD,EAAOiZ,IAE5CE,GAAsB9Y,GAC1BvL,IAAmB,IAAVA,GACTuM,EAAK,CAAC,YAAa,OAAQ,yBAGvB+X,GAAe/Y,GACnBvL,IAAmB,IAAVA,GACTuM,EAAK,CAAC,YAAa,OAAQ,kBAGhBgY,GAAazQ,GAAOwQ,GAAcF,IAElCI,GAAe1Q,GAAOyQ,GAAYF,ICnBzCI,GAAW,CAAA,EAEV,SAASC,GAAetJ,GAC7BqJ,GAASrJ,EAAQ5X,MAAQ4X,CAC3B,CACO,SAASuJ,GAAUnhB,GACxB,OAAOihB,GAASjhB,EAClB,CCCA,MAAMohB,GAAW,CAGjBA,OAAkB,SAAUC,EAASC,EAASC,EAASC,GACrD,IAAKH,EAAQzlB,IAAI,GAAI,OACrB,MAAM6lB,EAASJ,EAAQzoB,MAEjB8oB,EAAU7oB,OAAOoH,KAAKshB,GACtBI,EAAaR,GAAUG,EAAQrE,aAmDrC,GAlDAoE,EAAQO,WAAW,CAAC,cAGhB/kB,GAAI,eAAgB0kB,KACtBF,EAAQxO,YAAY,kBAAmB6C,QAAQ4L,EAAQO,eACvDR,EAAQxO,YAAY,mBAAoByO,EAAQO,eAI9ChlB,GAAI,cAAe0kB,IAAY,GACjCF,EAAQ/E,KAAK,cAAegF,EAAQQ,aAIlCjlB,GAAI,UAAW0kB,KACU,wCAAvBD,EAAQS,YACVV,EAAQ/E,KAAK,eAAgBgF,EAAQU,SACvCX,EAAQ/E,KAAK,eAAgBgF,EAAQU,SAEjCV,EAAQU,QACVvmB,OAAO0c,YAAW,WAChBkJ,EAAQY,WAAW,SACpB,GAAE,IAEHxmB,OAAO0c,YAAW,WAChBkJ,EAAQ/E,KAAK,UAAWgF,EAAQU,QACjC,GAAE,KAKHnlB,GAAI,QAAS0kB,IACXP,GAAavI,KAWXkJ,EAAWO,UACbP,EAAWO,SAASb,EAAQzlB,IAAI,GAAI0lB,EAAQ9kB,MAAOglB,EAAWD,GAOlElS,GAAQ,CAACxS,GAAI,YAAaA,GAAI,oBAAqBA,GAAI,YAAa0kB,GACpE,CACA,MAAMY,EAAWhG,GAAWmF,GACS,mBAA1BK,EAAWS,WACpBT,EAAWS,WAAWf,EAAQzlB,IAAI,GAAIumB,GAEtCd,EAAQ1Y,KAAK,WAAYwZ,EAE5B,CA2DD,GAxDItlB,GAAI,UAAW0kB,KACjBF,EAAQ/E,KAAK,MAAOgF,EAAQe,SACA,mBAAxBf,EAAQrE,aACNqE,EAAQe,SACVhB,EAAQ7qB,WAAW,SAAU,UAAWsnB,GAAUwD,EAAQe,WAM5DxlB,GAAI,UAAW0kB,KACjBF,EAAQ/E,KAAK,MAAOgF,EAAQgB,SACA,mBAAxBhB,EAAQrE,aACNqE,EAAQgB,SACVjB,EAAQ7qB,WAAW,SAAU,UAAWsnB,GAAUwD,EAAQgB,WAM5DzlB,GAAI,YAAa0kB,KACO,IAAtBD,EAAQiB,UAAiBlB,EAAQY,WAAW,aAC3CZ,EAAQ/E,KAAK,YAAagF,EAAQiB,YAIrCd,IAAWJ,EAAQzoB,QACrByoB,EAAQmB,SAAS,+BACjBnB,EAAQzO,QAAQ,SAAU,CAAE6P,kBAAkB,IAC9CjnB,KAAK2c,YAAW,WACdkJ,EAAQqB,YAAY,8BACrB,GAAE,MAID7lB,GAAI,UAAW0kB,KACoB,mBAA1BI,EAAWgB,WACpBhB,EAAWgB,WAAWtB,EAAQzlB,IAAI,GAAI0lB,EAAQsB,SAE9CvB,EAAQ/E,KAAK,gBAAiBgF,EAAQsB,SAEpCtB,EAAQsB,QACVvB,EAAQmB,SAAS,WAEjBnB,EAAQqB,YAAY,YAIpBtG,GAAckF,IAChBD,EAAQ/E,KAAK,oBAAqB,GAAGgF,EAAQuB,aAC7CxB,EAAQmB,SAAS,iBAEjBnB,EAAQY,WAAW,qBACnBZ,EAAQqB,YAAY,gBAGlBhB,EAAQhkB,OAAS,EAAG,CACtB,MAAMolB,EAAQ,IAAIC,YAAY,oBAAqB,CACjDC,OAAQ,CAAE1B,UAASC,WACnB0B,SAAS,IAEX5B,EAAQzlB,IAAI,GAAGsnB,cAAcJ,GAC7BvsB,EAAEoc,UAAUC,QAAQ,aAAc,CAACyO,EAASC,EAASI,GACtD,CACH,GAEAnrB,EAAEqQ,GAAGqO,OAAO,CACVkO,cAAe,SAAUC,EAAU5B,GACjC,OAAO9kB,KAAK2mB,MAAK,WACf,MAAMC,EAAQ/sB,EAAEmG,MACd4kB,EAAUgC,EAAMvO,KAAK,WACvB,GACErY,OAAS8kB,IACR7Y,EAAK,oBAAqBwY,GAAUG,EAAQrE,cAG7C,OAAOvgB,KAET,IAAK4kB,EAAS,MAAA,EACd,MAAMuB,EAAKvB,EAAQuB,GACjBU,EAASH,EAASjnB,MAAK,SAAUmQ,GAC/B,OAAOA,EAAEuW,KAAOA,CAC1B,IAEQtB,EAAU,CAAE,EACZpU,EAAQ,CACN,YACA,eACA,UACA,UACA,UACA,WACA,mBACA,cACA,YACA,aACA,YACA,UACA,QACA,UACA,QAOJ,QAAsB,IAAXoW,EACT,OAAO7mB,KAGT,IAAK,IAAIe,KAAK0P,EACRmU,EAAQnU,EAAM1P,MAAQ8lB,EAAOpW,EAAM1P,MACrC8jB,EAAQpU,EAAM1P,IAAM,CAAEsH,KAAMuc,EAAQnU,EAAM1P,IAAK6Q,GAAIiV,EAAOpW,EAAM1P,KAChE6jB,EAAQnU,EAAM1P,IAAM8lB,EAAOpW,EAAM1P,KAKrC,OADA2jB,GAASmC,OAAOD,EAAOhC,EAASC,EAASC,GAClC9kB,IACb,GACG,ICxMH,MAAM8mB,GAAQ,IAAIC,ICoBZC,GAAoBrL,GAAWI,GAAM,kBAa3C,SAASkL,GAASrC,EAASsC,EAAOC,GAChCvC,EAAQwC,OAASF,EACjB,IACIG,EADAC,EAAU,CAAA,EAEd,MAAMC,EAAUL,EAAMM,SAAWjZ,GAAWkR,GAAXlR,CAAuBqW,GAExD,GAAIA,EAAQ6C,KAEV,OADA5tB,EAAEstB,GAAQtnB,OAAO+kB,EAAQ6C,MAClB7C,EAAQ6C,KAOjB,GALIpc,EAAQlL,GAAI,SAAUskB,GAAtBpZ,CAAiCuZ,EAAQrE,cAC3ClV,GAAQnB,GAAMA,EAAG0a,IAAU3Y,EAAK,SAAUwY,GAA1CpZ,CAAqDuZ,EAAQrE,aAE3DqE,EAAQ8C,WAAUJ,EAAQ,iBAAmB1C,EAAQ8C,UAErD9C,EAAQ+C,KACV,IAAK,IAAIC,KAAKhD,EAAQ+C,KAChB/U,GAAKzS,GAAIynB,GAAIvc,EAAQJ,EAAKD,EAAOiB,EAAK2b,IAAtChV,CAA2CgS,EAAQ+C,QACrDL,EAAQ,QAAUM,GAAKC,OAAOjD,EAAQ+C,KAAKC,KAOjD,GALIhD,EAAQkD,WACVR,EAAQ,sBAAwBnrB,OAAOoH,KAAKqhB,EAAQkD,UACjDzgB,KAAIlM,GAAKA,EAAEwE,QAAQ,MAAO,OAC1BuB,KAAK,MAEN0jB,EAAQmD,KACV,IAAK,IAAI7c,KAAK0Z,EAAQmD,KAChB5nB,GAAI+K,EAAG0Z,EAAQmD,QAAOT,EAAQ,QAAUpc,GAAK0Z,EAAQmD,KAAK7c,IAG9D0Z,EAAQthB,OACVgkB,EAAc,KAAI1C,EAAQthB,MAG5B,MAAM0kB,EAAOvD,GAAUG,EAAQrE,aAC/B,IAAKyH,EAEH,OADApS,QAAQC,KAAK,4BAA4B+O,EAAQrE,eAC1C,KAET,MAAM0H,EAAUD,EAAKC,QAIrB,GAHAX,EAAUU,EAAKV,QAAQA,EAAS1C,EAAS2C,GAEzCD,EAAQ,aAAe1C,EAAQrE,YAC3B0H,EACFZ,EAASxtB,EAAE,IAAMouB,EAAU,IAAMtI,GAAc2H,GAAW,WAG1D,GADAD,EAASxtB,EAAEmuB,EAAKE,OAAOtD,EAASsC,EAAOI,KAClCD,EAAQ,OAAO,KDxEtBprB,MC2EI2oB,EAAQjL,WACV0N,EAAOvB,SAASlB,EAAQjL,WAE1BiL,EAAQ6C,KAAOJ,EACfzC,EAAQuD,KAAOd,EAAOnoB,IAAI,GAEtB8oB,GAAQA,EAAKC,SAYfD,EAAKE,OAAOtD,EAASyC,EAAQH,GAK3BtC,EAAQuB,IAEVkB,EAAOzH,KAAK,KAAMgF,EAAQuB,IAExBvB,EAAQwD,aAEVf,EAAOzH,KAAK,UAAWgF,EAAQwD,aAG7B5U,GAAQ,CAAC,WAAY,gBAAiBoR,IACxCyC,EACGzH,KAAK,mBAAoBgF,EAAQthB,MACjCsc,KAAK,OAAQgF,EAAQkD,SAASO,cAC9BzI,KAAK,eAAgBgF,EAAQkD,SAASO,cAG3CxuB,EAAEstB,GAAQtnB,OAAOwnB,GAKjBxtB,EAAEstB,GAAQtnB,OAAO,KAGb+kB,EAAQ0D,OACNf,GAAS9R,GAAK3Z,IAAI,aD3HxBG,EC4HU,SD3HV,IAAIoG,KACEykB,GAAM3mB,IAAIlE,IAAM6qB,GAAM5nB,IAAIjD,EAAV6qB,IAAkBzkB,EAAK,GC0HzBglB,EAAQpZ,GAAM,UAAWsZ,EAAS3C,KAEtDyC,EAAOhP,KAAK,UAAWuM,GAKvB,IAAI2D,EAAW,CACX,YACA,UACA,UACA,UACA,eACA,WACA,YACA,aACA,YACA,eAEFC,EAAgB,CAAA,EAElB,IAAK,IAAIC,KAAMF,EACTpoB,GAAIooB,EAASE,GAAK7D,KACpB4D,EAAcD,EAASE,IAAO,CAAE7W,GAAIgT,EAAQ2D,EAASE,MAqCzD,OAlCItoB,GAAI,UAAWykB,KAAgC,IAApBA,EAAQU,UACrCkD,EAAuB,QAAI,CAAE5W,IAAI,IAInCyV,EAAOhP,KAAK,SAAUgP,GAElBW,GAAQA,EAAKU,aACfV,EAAKU,YAAYrB,EAAQzC,GA6B7B,SAAoBA,GAClB,OACEA,EAAQ+D,UACR/D,EAAQgE,YACsC,IAA7C5B,GAAkB,wBACjB3b,EAAQY,EAAK,aAAcwY,GAA3BpZ,CAAsCuZ,EAAQrE,cAC/CqE,EAAQQ,cACyC,IAAhD4B,GAAkB,2BAClB3b,EAAQY,EAAK,aAAcwY,GAA3BpZ,CAAsCuZ,EAAQrE,YAEpD,CApCMsI,CAAWjE,IAsCjB,SAAyByC,GACvB,IAAIzC,EAAUyC,EAAOhP,KAAK,WACxBsQ,EAAW/D,EAAQ+D,SACnBC,EAAYhE,EAAQgE,UAClBE,EAASzB,EAAOhP,KAAK,UACrB0Q,EAAU,OACiB,QAA3BD,EAAO5pB,IAAI,GAAG8pB,WAAoBD,EAAU,OAChDD,EAAOG,QACL,IACEF,EACA,qBACAnE,EAAQrE,YACR,6BACAwI,EACA,KAEJD,EAASA,EAAOI,SAChB7B,EAAOhP,KAAK,SAAUyQ,GACtBA,EAAOzQ,KAAK,CACVuM,QAASA,EACTvb,KAAMub,EAAQrE,cAEZoI,GACFG,EAAOK,QACL,kDACEtO,GAAW8N,GACX,WAEF/D,EAAQQ,aAAe4B,GAAkB,4BAC3CK,EACGnoB,IAAI,GACJkqB,aACC,qBAEG/B,EAAOnoB,IAAI,GAAG0Y,aAAa,qBAAuB,IACnD,IAAIgN,EAAQuB,mBACZ9I,QAENyL,EAAOjpB,OACL,0CACE+kB,EAAQuB,oBACQtL,GAAW+J,EAAQQ,wBAGrCwD,GACFE,EAAOjpB,OACL,mDACEgb,GAAW+N,GACX,UAER,CAvFIS,CAAgBhC,GAIdzC,EAAQ,eACVyC,EAAOvB,SPrGT,OOqG2BlB,EAAQ,cPrGlB9S,cAAcnS,QAAQ,aAAc,QO6GjDilB,EAAc,gBAAaziB,QAC7BtI,EAAEwtB,GAAQhP,KAAK,OAAQuM,EAAc,MACrC/qB,EAAE8sB,KAAK/B,EAAc,MAAG,SAAU7jB,EAAGuoB,GACnCjC,EAAOvB,SAAS,aAAewD,EACrC,KAGE5E,GAASmC,OAAOQ,EAAQzC,EAAS4D,GAE1BnB,CACT,CAkEA,MAAMkC,GAAalT,GAAOxc,EAAEwe,KAAKhC,EAAK,WCnQzBmT,GAAY,CACvBxJ,MAAO,OACPC,eAAgB,OAChBC,WAAY,OACZC,SAAU,MACVC,QAAS,MACTC,UAAW,OCIb,MACaoJ,GAAYpd,EADL,CAAC,WAAY,UAERqI,GAAS,CAAC,WAAY,UAE/C,MAAMgV,GAAmB,CAACxe,EAAG3C,IAAM2C,EAAEye,QAAUphB,EAAE4d,IAAM5d,EAAEohB,QAAUze,EAAEib,GAE3C/R,GAAUsV,IAEpC,MACME,GAAoB,CAACjnB,EAAKxH,KAAuBA,EAAEuG,QAAQiB,GAD1B,GAAKknB,KAAY,EAE3CC,GAAY3uB,GAAKA,EAAE0mB,OAAO,EAAG+H,GAAkB,IAAKzuB,IACpD4uB,GAAY5uB,GAAKA,EAAE0mB,OAAO+H,GAAkB,IAAKzuB,GAAK,GAQtD6uB,GAAa5V,IANH,CAAClJ,EAAG3C,IACzBmhB,GAAiBxe,EAAG3C,IACnBkhB,GAAUve,IACTue,GAAUlhB,IACVuhB,GAAUL,GAAUve,MAAQ4e,GAAUL,GAAUlhB,MAIxB4C,EAC1B9D,GAAIgF,gBACJwC,GAAOmK,UzB0EiBtN,GACxBlQ,IAAO,CAACC,EAAKC,IAASD,EAAIiG,QAAQhG,IAAQ,EAAID,EAAM,IAAIA,EAAKC,IAAO,GAApEF,CAAwEkQ,KyBvEnE,MAAMue,GAAa5d,EAAK,CAAC,YAAa,OAAQ,aAAc,OCrCtD6d,GAAY/uB,GAAKA,EAAE2W,cAAcnS,QAAQ,aAAc,KCsClEwqB,GAAiB,iBACjBC,GAAuB,uBACvBC,GAAqB,qBACrBC,GAAsB,sBACtBC,GAA0B,0BAC1BC,GAAiB,iBACjBC,GAAuB,uBACvBC,GAA2B,2BAC3BC,GAAuB,uBACvBC,GAA8B,8BAC9BC,GAAyB,yBAErBC,GAAe,CACnBX,CAACA,IAAiB,aAClBC,CAACA,IAAuB,cACxBC,CAACA,IAAqB,uBACtBC,CAACA,IAAsB,wBACvBC,CAACA,IAA0B,kCAC3BC,CAACA,IAAiB,wBAClBC,CAACA,IAAuB,WACxBC,CAACA,IAA2B,YAC5BC,CAACA,IAAuB,yBACxBC,CAACA,IAA8B,QAC/BC,CAACA,IAAyB,kCAsBtBE,GAAc1e,EAAK,CAAC,YAAa,OAAQ,aAAc,UAEhDhJ,GAAQ2nB,GACnBpX,GAAOvI,EAAQY,EAAK+e,GAAUD,KAAc7vB,GAAK+Q,EAAK+e,EAASF,KAA/DlX,CACEmI,IClDEkP,GAAa9e,GAAO,EAAM,CAC9B,YACA,OACA,aACA,aAGI+e,GAAY/e,GAAO,EAAM,CAC7B,YACA,OACA,aACA,cAUIgf,GAAe9f,EAAQsI,GAAKqF,QAAS8Q,IAAYL,GAAWjd,GAG5D4e,GAAqB/f,GACzBlQ,GAAKkI,GAAMgoB,IAAiClwB,GAC5C+uB,GACAje,EAAK,eAIMqf,GAAezvB,GAC1BwP,EACEsI,GACEqF,QACA3N,EACEnK,EAAK,KACLmG,GAAIgE,GAAQlQ,GAAKkI,GAAMxH,GAAUV,GAAG+uB,KACpC1oB,EAAM,OAGV6K,EAAK,CAAC,WAAY,gBAKhBkf,GAAkBlgB,EAAQJ,EAAK0B,EAAIuS,KACnCsM,GAAiB5Y,GACrBjG,EAAIiG,GAAK4M,GAAYN,KACrB7T,EAAQgH,GAAIpG,EAAK,qBAAsB4C,GAAO+D,GAAK4M,GAAYN,OAG3DuM,GAAgB7Y,GACpBjG,EAAIiG,GAAK4M,GAAYN,KACrB7T,EAAQgH,GAAIpG,EAAK,YAAa4C,GAAO+D,GAAK4M,GAAYN,OAGlDwM,GAAkBngB,GAAM,CAACoO,EAAWzP,EAAIwc,EAAUrQ,KACtDA,EAAIsV,UAAUrW,OAAOqE,EAAWzP,EAAGwc,GAAU,IAGzCkF,GAAqBF,GACzBroB,GAAMwoB,IAA0B,YAChCL,IAEIM,GAAkBJ,GACtBroB,GAAMwoB,IAA0B,SAChCN,IAEIQ,GAAqBL,GACzBroB,GAAMwoB,IAA0B,YAChCJ,IAGIO,GAAoBN,GACxBroB,GAAM4oB,IAA8B,YACpCT,IAEIU,GAAiBR,GACrBroB,GAAM4oB,IAA8B,SACpCV,IAEIY,GAAoBT,GACxBroB,GAAM4oB,IAA8B,YACpCR,IAGWW,GAAkB,CAACnF,EAAUC,EAAOmF,IAAUzc,IACzD,IAAI0c,EACJ,MAAMC,EAAYpB,GAAavb,GAG7B2c,GACCtB,GAAWlP,MACTmP,GAAUnP,MAAU1J,GAAIqB,GAAO,cAAe,UAA1BrB,CAAqCzC,KAE5D0c,EAAYrW,SAASuW,cAAc,OACnCF,EAAU3S,UAAYtW,GAAMopB,IAC5BH,EAAUlD,aAAa/lB,GAAMqpB,IAAwBL,GACrDP,GAAgBlc,EAAG0c,GACnBV,GAAmBhc,EAAG0c,GACtBP,GAAmBnc,EAAG0c,GACtBA,EAAU5kB,iBAAiB,qBAAqB,EAAG4e,aAC7CnmB,GAAI,UAAWmmB,EAAOzB,UACxBiH,GAAgBlc,EAAG0c,GAEjBnsB,GAAI,WAAYmmB,EAAOzB,UACzB+G,GAAmBhc,EAAG0c,GAEpBnsB,GAAI,UAAWmmB,EAAOzB,UACxBkH,GAAmBnc,EAAG0c,EACvB,IAECC,GACFD,EAAUlD,aAAa/lB,GAAMspB,IAtEnBxxB,IAAKA,EAAEwE,QAAQ,WAAY,KAsEeitB,CAAQL,IAC5DD,EAAUX,UAAUtY,IAAIhQ,GAAMwoB,IAA0B,YAC/CpsB,EAAK+f,GAAY5P,GAC1B0c,EAAUX,UAAUtY,IAAIhQ,GAAMwoB,IAA0B,cAC/CxgB,EAAQkU,GAAW/S,EAAnBnB,CAAyBuE,GAClC0c,EAAUX,UAAUtY,IAAIhQ,GAAMwoB,IAA0B,YAC/CxgB,EAAQiU,GAAW9S,EAAnBnB,CAAyBuE,IAClC0c,EAAUX,UAAUtY,IAAIhQ,GAAMwoB,IAA0B,UAG1DS,EAAYrW,SAAS4W,yBAGvB,MAAMC,EAAUzhB,EACd2e,GACA3iB,GACEsM,GACE8V,GACApV,IAAIuQ,GACFvZ,EACEa,IACE/Q,GAAW,KAANA,IACL,WAAaypB,EAAQkD,SAASZ,QAC9BA,GAAUtC,EAAQkD,SAASZ,MAAQA,IAErC6C,GANF1e,CAOEuZ,EAAQkD,SAASZ,WAbX7b,CAiBduE,GAuDF,OAtDAkd,EAAQxsB,QACNmM,EAAK,CACH,CACE0e,GACA9f,GACEiH,GAAKga,EAAUS,YAAYza,IAC3B8Z,GAAgBnF,EAAUC,EAAOmF,EAAQ,KAG7C,CACE1f,EAAI6S,IACJkH,IACE,MAAMsG,EAASvtB,EAAK+f,GAAYkH,GAC1BuG,EAAU,CACd5pB,GAAM6pB,IACN,GAAG7pB,GAAM8pB,OAA2BH,EAAOzM,cAC3C6K,GAAmB4B,GACnB1B,GAAa8B,GAAb9B,CAAwC0B,GACpB,IAApBtG,EAAS1lB,QAAgBqC,GAAMgqB,KAC/Bxe,OAAOmK,SACHsU,EAAMrX,SAASuW,cAAc,OACnCc,EAAIlE,aACF/lB,GAAMkqB,IACNP,EAAOQ,SA1JDnkB,IAChB8C,EAAOd,EAAQY,EAAK,UAAWwY,GAAxBpZ,CAAmChC,GAAO,CAC/C,YACA,aACAA,IAsJ0BokB,CAAUT,EAAOzM,YAAjBkN,CAA8B1R,KAElDuR,EAAI3T,UAAYsT,EAAQ/rB,KAAK,KAC7BgrB,GAAexF,EAAU4G,GACzBtB,GAAkBtF,EAAU4G,GAC5BnB,GAAkBzF,EAAU4G,GAC5BA,EAAI5lB,iBAAiB,qBAAqB,EAAG4e,aACvCnmB,GAAI,UAAWmmB,EAAOzB,UACxBqH,GAAexF,EAAU4G,GAEvBntB,GAAI,WAAYmmB,EAAOzB,UACzBmH,GAAkBtF,EAAU4G,GAE1BntB,GAAI,UAAWmmB,EAAOzB,UACxBsH,GAAkBzF,EAAU4G,EAC7B,IAEH5G,EAASpmB,SAAQsP,GAAKqX,EAASrX,EAAGsX,EAAOrtB,EAAEyzB,MAC3ChB,EAAUS,YAAYO,EAAI,GAG9B,CACE,KAAM,EACNjmB,IAAIuI,IACF,MAAM+U,EAAUsC,EAASrX,EAAGsX,EAAOrtB,EAAEyyB,IACjC3H,GACFA,EAAQmB,SAASwF,GAAa8B,GAAb9B,CAAwC1b,GAAG,QAK/D0c,CAAS;;;;;ICvOlB,IAAIoB,GAAE3sB,GAAE5F,GAAEwT,GAAO,MAACgf,GAAEC,WAAWC,aAAaC,GAAEH,GAAEA,GAAEI,aAAa,WAAW,CAACC,WAAWN,GAAGA,SAAI,EAAOpb,GAAE,QAAQ+P,KAAK4L,SAAS,IAAI5tB,MAAM,MAAM6tB,GAAE,IAAI5b,GAAE6b,GAAE,IAAID,MAAKE,GAAEnY,SAASrG,GAAE,CAAC8d,EAAE,KAAKU,GAAEC,cAAcX,GAAG9F,GAAE8F,GAAG,OAAOA,GAAG,iBAAiBA,GAAG,mBAAmBA,EAAEY,GAAEnsB,MAAM7C,QAAyGwT,GAAE,sDAAsD5X,GAAE,OAAOqzB,GAAE,KAAK9gB,GAAE,oFAAoF5T,GAAE,KAAKkZ,GAAE,KAAKyb,GAAE,+BAAgGC,GAAE3rB,OAAO4rB,IAAI,gBAAgBC,GAAE7rB,OAAO4rB,IAAI,eAAeE,GAAE,IAAIC,QAA2QC,GAAEV,GAAEW,iBAAiBX,GAAE,IAAI,MAAK,GAAysB,MAAMY,GAAE5Z,aAAa9Z,QAAQoyB,EAAEuB,WAAWluB,GAAG5F,GAAG,IAAIwT,EAAE3O,KAAKkvB,MAAM,GAAG,IAAIpB,EAAE,EAAEK,EAAE,EAAE,MAAMC,EAAEV,EAAE1sB,OAAO,EAAE4mB,EAAE5nB,KAAKkvB,OAAOZ,EAAEpjB,GAAtzB,EAACwiB,EAAE3sB,KAAK,MAAM5F,EAAEuyB,EAAE1sB,OAAO,EAAE2N,EAAE,GAAG,IAAIgf,EAAEO,EAAE,IAAIntB,EAAE,QAAQ,GAAGqtB,EAAEtb,GAAE,IAAI,IAAI/R,EAAE,EAAEA,EAAE5F,EAAE4F,IAAI,CAAC,MAAM5F,EAAEuyB,EAAE3sB,GAAG,IAAI+sB,EAAEle,EAAEgY,GAAG,EAAE0G,EAAE,EAAE,KAAKA,EAAEnzB,EAAE6F,SAASotB,EAAEe,UAAUb,EAAE1e,EAAEwe,EAAEhlB,KAAKjO,GAAG,OAAOyU,IAAI0e,EAAEF,EAAEe,UAAUf,IAAItb,GAAE,QAAQlD,EAAE,GAAGwe,EAAElzB,QAAE,IAAS0U,EAAE,GAAGwe,EAAEG,QAAE,IAAS3e,EAAE,IAAI4e,GAAExpB,KAAK4K,EAAE,MAAM+d,EAAE3S,OAAO,KAAKpL,EAAE,GAAG,MAAMwe,EAAE3gB,SAAG,IAASmC,EAAE,KAAKwe,EAAE3gB,IAAG2gB,IAAI3gB,GAAE,MAAMmC,EAAE,IAAIwe,EAAE,MAAMT,EAAEA,EAAE7a,GAAE8U,GAAG,QAAG,IAAShY,EAAE,GAAGgY,GAAG,GAAGA,EAAEwG,EAAEe,UAAUvf,EAAE,GAAG5O,OAAO8sB,EAAEle,EAAE,GAAGwe,OAAE,IAASxe,EAAE,GAAGnC,GAAE,MAAMmC,EAAE,GAAGmD,GAAElZ,IAAGu0B,IAAIrb,IAAGqb,IAAIv0B,GAAEu0B,EAAE3gB,GAAE2gB,IAAIlzB,IAAGkzB,IAAIG,GAAEH,EAAEtb,IAAGsb,EAAE3gB,GAAEkgB,OAAE,GAAQ,MAAMziB,EAAEkjB,IAAI3gB,IAAGigB,EAAE3sB,EAAE,GAAGsb,WAAW,MAAM,IAAI,GAAG6R,GAAGE,IAAItb,GAAE3X,EAAEgzB,GAAEvG,GAAG,GAAGjZ,EAAE1N,KAAK6sB,GAAG3yB,EAAEkF,MAAM,EAAEunB,GAAG,QAAQzsB,EAAEkF,MAAMunB,GAAGtV,GAAEpH,GAAG/P,EAAEmX,KAAI,IAAIsV,GAAGjZ,EAAE1N,UAAK,GAAQF,GAAGmK,EAAE,CAAC,MAAM0E,EAAEse,GAAGR,EAAEvyB,IAAI,QAAQ,IAAI4F,EAAE,SAAS,IAAI,MAAM,MAAC,IAAS+sB,GAAEA,GAAEE,WAAWpe,GAAGA,EAAEjB,EAAC,EAAyHygB,CAAE1B,EAAE3sB,GAAG,GAAGf,KAAKqvB,GAAGL,GAAExC,cAAc8B,EAAEnzB,GAAG2zB,GAAEQ,YAAYtvB,KAAKqvB,GAAGE,QAAQ,IAAIxuB,EAAE,CAAC,MAAM2sB,EAAE1tB,KAAKqvB,GAAGE,QAAQxuB,EAAE2sB,EAAE8B,WAAWzuB,EAAE0uB,SAAS/B,EAAE7tB,UAAUkB,EAAE2uB,WAAW,CAAC,KAAK,QAAQ/gB,EAAEmgB,GAAEa,aAAa/H,EAAE5mB,OAAOotB,GAAG,CAAC,GAAG,IAAIzf,EAAEihB,SAAS,CAAC,GAAGjhB,EAAEkhB,gBAAgB,CAAC,MAAMnC,EAAE,GAAG,IAAI,MAAM3sB,KAAK4N,EAAEmhB,oBAAoB,GAAG/uB,EAAEgvB,SAAS,UAAUhvB,EAAEsb,WAAW/J,IAAG,CAAC,MAAMnX,EAAE+P,EAAEijB,KAAK,GAAGT,EAAEzsB,KAAKF,QAAG,IAAS5F,EAAE,CAAC,MAAMuyB,EAAE/e,EAAEiJ,aAAazc,EAAE2W,cAAc,SAAStQ,MAAM8Q,IAAGvR,EAAE,eAAeqI,KAAKjO,GAAGysB,EAAE3mB,KAAK,CAACoI,KAAK,EAAE5H,MAAMqsB,EAAExqB,KAAKvC,EAAE,GAAGzF,QAAQoyB,EAAEsC,KAAK,MAAMjvB,EAAE,GAAGkvB,GAAE,MAAMlvB,EAAE,GAAGmvB,GAAE,MAAMnvB,EAAE,GAAGovB,GAAEC,IAAG,MAAMxI,EAAE3mB,KAAK,CAACoI,KAAK,EAAE5H,MAAMqsB,GAAG,CAAC,IAAI,MAAM/sB,KAAK2sB,EAAE/e,EAAE0hB,gBAAgBtvB,EAAE,CAAC,GAAGytB,GAAExpB,KAAK2J,EAAEsZ,SAAS,CAAC,MAAMyF,EAAE/e,EAAE6M,YAAYha,MAAM8Q,IAAGvR,EAAE2sB,EAAE1sB,OAAO,EAAE,GAAGD,EAAE,EAAE,CAAC4N,EAAE6M,YAAYmS,GAAEA,GAAE2C,YAAY,GAAG,IAAI,IAAIn1B,EAAE,EAAEA,EAAE4F,EAAE5F,IAAIwT,EAAE9O,OAAO6tB,EAAEvyB,GAAGyU,MAAKkf,GAAEa,WAAW/H,EAAE3mB,KAAK,CAACoI,KAAK,EAAE5H,QAAQqsB,IAAInf,EAAE9O,OAAO6tB,EAAE3sB,GAAG6O,KAAI,CAAC,CAAC,MAAM,GAAG,IAAIjB,EAAEihB,SAAS,GAAGjhB,EAAE0J,OAAO6V,GAAEtG,EAAE3mB,KAAK,CAACoI,KAAK,EAAE5H,MAAMqsB,QAAQ,CAAC,IAAIJ,GAAG,EAAE,MAAM,KAAKA,EAAE/e,EAAE0J,KAAK3W,QAAQ4Q,GAAEob,EAAE,KAAK9F,EAAE3mB,KAAK,CAACoI,KAAK,EAAE5H,MAAMqsB,IAAIJ,GAAGpb,GAAEtR,OAAO,CAAC,CAAC8sB,GAAG,CAAC,CAACyC,qBAAqB7C,EAAE3sB,GAAG,MAAM5F,EAAEizB,GAAE5B,cAAc,YAAY,OAAOrxB,EAAE8e,UAAUyT,EAAEvyB,CAAC,EAAE,SAASq1B,GAAE9C,EAAE3sB,EAAE5F,EAAEuyB,EAAE/e,GAAG,IAAIgf,EAAEG,EAAExb,EAAE4b,EAAE,GAAGntB,IAAI0tB,GAAE,OAAO1tB,EAAE,IAAIotB,OAAE,IAASxf,EAAE,QAAQgf,EAAExyB,EAAE,UAAK,IAASwyB,OAAE,EAAOA,EAAEhf,GAAGxT,EAAE,GAAG,MAAMizB,EAAExG,GAAE7mB,QAAG,EAAOA,EAAE0vB,gBAAgB,OAAO,MAAMtC,OAAE,EAAOA,EAAE/Y,eAAegZ,IAAI,QAAQN,EAAE,MAAMK,OAAE,EAAOA,EAAEuC,SAAI,IAAS5C,GAAGA,EAAEptB,KAAKytB,GAAE,QAAI,IAASC,EAAED,OAAE,GAAQA,EAAE,IAAIC,EAAEV,GAAGS,EAAEriB,EAAE4hB,EAAEvyB,EAAEwT,SAAI,IAASA,GAAG,QAAQ2D,GAAG4b,EAAE/yB,GAAG,UAAK,IAASmX,EAAEA,EAAE4b,EAAE,GAAG,IAAIvf,GAAGwf,EAAEhzB,EAAE,GAAGgzB,QAAG,IAASA,IAAIptB,EAAEyvB,GAAE9C,EAAES,EAAEqC,EAAE9C,EAAE3sB,EAAExF,QAAQ4yB,EAAExf,IAAI5N,CAAC,CAAC,MAAM6P,GAAEwE,YAAYsY,EAAE3sB,GAAGf,KAAK8tB,EAAE,GAAG9tB,KAAKgvB,OAAE,EAAOhvB,KAAK2wB,EAAEjD,EAAE1tB,KAAKovB,EAAEruB,CAAC,CAACqtB,EAAEV,GAAG,IAAI3sB,EAAE,MAAMsuB,IAAIE,QAAQp0B,GAAG+zB,MAAMvgB,GAAG3O,KAAK2wB,EAAEhD,GAAG,QAAQ5sB,EAAE,MAAM2sB,OAAE,EAAOA,EAAEkD,qBAAgB,IAAS7vB,EAAEA,EAAEqtB,IAAGyC,WAAW11B,GAAE,GAAI2zB,GAAEQ,YAAY3B,EAAE,IAAIG,EAAEgB,GAAEa,WAAWrd,EAAE,EAAE4b,EAAE,EAAEC,EAAExf,EAAE,GAAG,UAAK,IAASwf,GAAG,CAAC,GAAG7b,IAAI6b,EAAE1sB,MAAM,CAAC,IAAIV,EAAE,IAAIotB,EAAE9kB,KAAKtI,EAAE,IAAI+vB,GAAEhD,EAAEA,EAAEiD,YAAY/wB,KAAK0tB,GAAG,IAAIS,EAAE9kB,KAAKtI,EAAE,IAAIotB,EAAE6B,KAAKlC,EAAEK,EAAE7qB,KAAK6qB,EAAE7yB,QAAQ0E,KAAK0tB,GAAG,IAAIS,EAAE9kB,OAAOtI,EAAE,IAAIiwB,GAAElD,EAAE9tB,KAAK0tB,IAAI1tB,KAAK8tB,EAAE7sB,KAAKF,GAAGotB,EAAExf,IAAIuf,EAAE,CAAC5b,KAAK,MAAM6b,OAAE,EAAOA,EAAE1sB,SAASqsB,EAAEgB,GAAEa,WAAWrd,IAAI,CAAC,OAAOqb,CAAC,CAACW,EAAEZ,GAAG,IAAI3sB,EAAE,EAAE,IAAI,MAAM5F,KAAK6E,KAAK8tB,OAAE,IAAS3yB,SAAI,IAASA,EAAEG,SAASH,EAAE80B,EAAEvC,EAAEvyB,EAAE4F,GAAGA,GAAG5F,EAAEG,QAAQ0F,OAAO,GAAG7F,EAAE80B,EAAEvC,EAAE3sB,KAAKA,GAAG,EAAE,MAAM+vB,GAAE1b,YAAYsY,EAAE3sB,EAAE5F,EAAEwT,GAAG3O,KAAKqJ,KAAK,EAAErJ,KAAKgvB,OAAE,EAAOhvB,KAAK2uB,EAAEjB,EAAE1tB,KAAKixB,EAAElwB,EAAEf,KAAKovB,EAAEj0B,EAAE6E,KAAKkb,QAAQvM,CAAC,CAACuiB,aAAaxD,GAAG,IAAI3sB,EAAE,QAAQA,EAAEf,KAAK4uB,SAAI,IAAS7tB,GAAGA,EAAEL,KAAKV,KAAK0tB,EAAE,CAAKyD,iBAAa,OAAOnxB,KAAK2uB,EAAEwC,UAAU,CAAKC,gBAAY,OAAOpxB,KAAK2uB,CAAC,CAAK0C,cAAU,OAAOrxB,KAAKixB,CAAC,CAAChB,EAAEvC,EAAE3sB,EAAEf,MAAM0tB,EAAE8C,GAAExwB,KAAK0tB,EAAE3sB,GAAG6mB,GAAE8F,GAAGA,IAAIiB,IAAG,MAAMjB,GAAG,KAAKA,GAAG1tB,KAAKowB,IAAIzB,IAAG3uB,KAAKmwB,IAAInwB,KAAKowB,EAAEzB,IAAGjB,IAAI1tB,KAAKowB,GAAG1C,IAAIe,IAAGzuB,KAAKuuB,EAAEb,QAAG,IAASA,EAAEuB,WAAWjvB,KAAK9E,EAAEwyB,QAAG,IAASA,EAAEkC,SAAS5vB,KAAKnG,EAAE6zB,GAAv+HA,KAAI,IAAI3sB,EAAE,OAAOutB,GAAEZ,IAAI,mBAAmB,QAAQ3sB,EAAE2sB,SAAI,IAAS3sB,OAAE,EAAOA,EAAE+B,OAAOC,UAAS,EAA84HmI,CAAEwiB,GAAG1tB,KAAK+S,EAAE2a,GAAG1tB,KAAKuuB,EAAEb,EAAE,CAAC9c,EAAE8c,EAAE3sB,EAAEf,KAAKixB,GAAG,OAAOjxB,KAAK2uB,EAAEwC,WAAWG,aAAa5D,EAAE3sB,EAAE,CAAClH,EAAE6zB,GAAG1tB,KAAKowB,IAAI1C,IAAI1tB,KAAKmwB,IAAInwB,KAAKowB,EAAEpwB,KAAK4Q,EAAE8c,GAAG,CAACa,EAAEb,GAAG,MAAM3sB,EAAEf,KAAK2uB,EAAEoC,YAAY,OAAOhwB,GAAG,IAAIA,EAAE6uB,WAAW,OAAO5vB,KAAKixB,EAAE,OAAOlwB,EAAEgwB,YAAYhwB,IAAIf,KAAKixB,EAAEM,iBAAiBxwB,EAAEsX,KAAKqV,EAAE1tB,KAAKnG,EAAEu0B,GAAEoD,eAAe9D,IAAI1tB,KAAKowB,EAAE1C,CAAC,CAACxyB,EAAEwyB,GAAG,IAAI3sB,EAAE,MAAMxF,OAAOJ,EAAE8zB,WAAWtgB,GAAG+e,EAAEC,EAAE,iBAAiBhf,EAAE3O,KAAK8wB,EAAEpD,SAAI,IAAS/e,EAAE0gB,KAAK1gB,EAAE0gB,GAAGL,GAAExC,cAAc7d,EAAEuf,EAAEluB,KAAKkb,UAAUvM,GAAG,IAAI,QAAQ5N,EAAEf,KAAKowB,SAAI,IAASrvB,OAAE,EAAOA,EAAE4vB,KAAKhD,EAAE3tB,KAAKowB,EAAE9B,EAAEnzB,OAAO,CAAC,MAAMuyB,EAAE,IAAI9c,GAAE+c,EAAE3tB,MAAMe,EAAE2sB,EAAEU,EAAEpuB,KAAKkb,SAASwS,EAAEY,EAAEnzB,GAAG6E,KAAKnG,EAAEkH,GAAGf,KAAKowB,EAAE1C,CAAC,CAAC,CAACoD,EAAEpD,GAAG,IAAI3sB,EAAE6tB,GAAE1vB,IAAIwuB,EAAEpyB,SAAS,YAAO,IAASyF,GAAG6tB,GAAE9yB,IAAI4xB,EAAEpyB,QAAQyF,EAAE,IAAIiuB,GAAEtB,IAAI3sB,CAAC,CAACgS,EAAE2a,GAAGY,GAAEtuB,KAAKowB,KAAKpwB,KAAKowB,EAAE,GAAGpwB,KAAKmwB,KAAK,MAAMpvB,EAAEf,KAAKowB,EAAE,IAAIj1B,EAAEwT,EAAE,EAAE,IAAI,MAAMgf,KAAKD,EAAE/e,IAAI5N,EAAEC,OAAOD,EAAEE,KAAK9F,EAAE,IAAI21B,GAAE9wB,KAAK4Q,EAAEhB,MAAK5P,KAAK4Q,EAAEhB,MAAK5P,KAAKA,KAAKkb,UAAU/f,EAAE4F,EAAE4N,GAAGxT,EAAE80B,EAAEtC,GAAGhf,IAAIA,EAAE5N,EAAEC,SAAShB,KAAKmwB,EAAEh1B,GAAGA,EAAE81B,EAAEF,YAAYpiB,GAAG5N,EAAEC,OAAO2N,EAAE,CAACwhB,EAAEzC,EAAE1tB,KAAK2uB,EAAEoC,YAAYhwB,GAAG,IAAI5F,EAAE,IAAI,QAAQA,EAAE6E,KAAK4uB,SAAI,IAASzzB,GAAGA,EAAEuF,KAAKV,MAAK,GAAG,EAAGe,GAAG2sB,GAAGA,IAAI1tB,KAAKixB,GAAG,CAAC,MAAMlwB,EAAE2sB,EAAEqD,YAAYrD,EAAE+B,SAAS/B,EAAE3sB,CAAC,CAAC,EAAE,MAAMqvB,GAAEhb,YAAYsY,EAAE3sB,EAAE5F,EAAEwT,EAAEgf,GAAG3tB,KAAKqJ,KAAK,EAAErJ,KAAKowB,EAAEzB,GAAE3uB,KAAKgvB,OAAE,EAAOhvB,KAAKyxB,OAAE,EAAOzxB,KAAK0xB,QAAQhE,EAAE1tB,KAAKsD,KAAKvC,EAAEf,KAAKovB,EAAEzgB,EAAE3O,KAAKkb,QAAQyS,EAAExyB,EAAE6F,OAAO,GAAG,KAAK7F,EAAE,IAAI,KAAKA,EAAE,IAAI6E,KAAKowB,EAAEjuB,MAAMhH,EAAE6F,OAAO,GAAG2wB,KAAKhD,IAAG3uB,KAAK1E,QAAQH,GAAG6E,KAAKowB,EAAEzB,EAAC,CAAK1G,cAAU,OAAOjoB,KAAK0xB,QAAQzJ,OAAO,CAACgI,EAAEvC,EAAE3sB,EAAEf,KAAK7E,EAAEwT,GAAG,MAAMgf,EAAE3tB,KAAK1E,QAAQ,IAAIwyB,GAAE,EAAG,QAAG,IAASH,EAAED,EAAE8C,GAAExwB,KAAK0tB,EAAE3sB,EAAE,GAAG+sB,GAAGlG,GAAE8F,IAAIA,IAAI1tB,KAAKowB,GAAG1C,IAAIe,GAAEX,IAAI9tB,KAAKowB,EAAE1C,OAAO,CAAC,MAAM/e,EAAE+e,EAAE,IAAIpb,EAAE4b,EAAE,IAAIR,EAAEC,EAAE,GAAGrb,EAAE,EAAEA,EAAEqb,EAAE3sB,OAAO,EAAEsR,IAAI4b,EAAEsC,GAAExwB,KAAK2O,EAAExT,EAAEmX,GAAGvR,EAAEuR,GAAG4b,IAAIO,KAAIP,EAAEluB,KAAKowB,EAAE9d,IAAIwb,IAAIA,GAAGlG,GAAEsG,IAAIA,IAAIluB,KAAKowB,EAAE9d,IAAI4b,IAAIS,GAAEjB,EAAEiB,GAAEjB,IAAIiB,KAAIjB,IAAI,MAAMQ,EAAEA,EAAE,IAAIP,EAAErb,EAAE,IAAItS,KAAKowB,EAAE9d,GAAG4b,CAAC,CAACJ,IAAInf,GAAG3O,KAAK4xB,EAAElE,EAAE,CAACkE,EAAElE,GAAGA,IAAIiB,GAAE3uB,KAAK0xB,QAAQrB,gBAAgBrwB,KAAKsD,MAAMtD,KAAK0xB,QAAQtI,aAAappB,KAAKsD,KAAK,MAAMoqB,EAAEA,EAAE,GAAG,EAAE,MAAMuC,WAAUG,GAAEhb,cAAcY,SAAS1T,WAAWtC,KAAKqJ,KAAK,CAAC,CAACuoB,EAAElE,GAAG1tB,KAAK0xB,QAAQ1xB,KAAKsD,MAAMoqB,IAAIiB,QAAE,EAAOjB,CAAC,EAAE,MAAMwC,WAAUE,GAAEhb,cAAcY,SAAS1T,WAAWtC,KAAKqJ,KAAK,CAAC,CAACuoB,EAAElE,GAAGA,GAAGA,IAAIiB,GAAE3uB,KAAK0xB,QAAQtI,aAAappB,KAAKsD,KAAK,IAAItD,KAAK0xB,QAAQrB,gBAAgBrwB,KAAKsD,KAAK,EAAE,MAAM6sB,WAAUC,GAAEhb,cAAcY,SAAS1T,WAAWtC,KAAKqJ,KAAK,CAAC,CAAC4mB,EAAEvC,EAAE3sB,EAAEf,MAAM,IAAI7E,EAAE,IAAIuyB,EAAE,QAAQvyB,EAAEq1B,GAAExwB,KAAK0tB,EAAE3sB,EAAE,UAAK,IAAS5F,EAAEA,EAAEwzB,MAAKF,GAAE,OAAO,MAAM9f,EAAE3O,KAAKowB,EAAEzC,EAAED,IAAIiB,IAAGhgB,IAAIggB,IAAGjB,EAAEmE,UAAUljB,EAAEkjB,SAASnE,EAAEoE,OAAOnjB,EAAEmjB,MAAMpE,EAAEqE,UAAUpjB,EAAEojB,QAAQjE,EAAEJ,IAAIiB,KAAIhgB,IAAIggB,IAAGhB,GAAGA,GAAG3tB,KAAK0xB,QAAQ/pB,oBAAoB3H,KAAKsD,KAAKtD,KAAK2O,GAAGmf,GAAG9tB,KAAK0xB,QAAQhqB,iBAAiB1H,KAAKsD,KAAKtD,KAAK0tB,GAAG1tB,KAAKowB,EAAE1C,CAAC,CAACsE,YAAYtE,GAAG,IAAI3sB,EAAE5F,EAAE,mBAAmB6E,KAAKowB,EAAEpwB,KAAKowB,EAAE1vB,KAAK,QAAQvF,EAAE,QAAQ4F,EAAEf,KAAKkb,eAAU,IAASna,OAAE,EAAOA,EAAEkxB,YAAO,IAAS92B,EAAEA,EAAE6E,KAAK0xB,QAAQhE,GAAG1tB,KAAKowB,EAAE4B,YAAYtE,EAAE,EAAE,MAAMsD,GAAE5b,YAAYsY,EAAE3sB,EAAE5F,GAAG6E,KAAK0xB,QAAQhE,EAAE1tB,KAAKqJ,KAAK,EAAErJ,KAAKgvB,OAAE,EAAOhvB,KAAKyxB,OAAE,EAAOzxB,KAAKovB,EAAEruB,EAAEf,KAAKkb,QAAQ/f,CAAC,CAAC80B,EAAEvC,GAAG8C,GAAExwB,KAAK0tB,EAAE,EAAmF,QAAQ3sB,IAAG2sB,GAAEE,YAAYsE,8BAAyB,IAASnxB,IAAGA,GAAEL,KAAKgtB,GAAEsB,GAAE8B,KAAI,QAAQ31B,IAAGwT,GAAEif,YAAYuE,uBAAkB,IAASh3B,GAAEA,GAAEwT,GAAEwjB,gBAAgB,IAAIlxB,KAAK;;;;;;ACA1iO,MAAMysB,GAAE3uB,OAAOqzB,kBAAa,IAASrzB,OAAOszB,UAAUtzB,OAAOszB,SAASC,eAAe,uBAAuBC,SAASpxB,WAAW,YAAYqxB,cAAcrxB,UAAUwN,GAAE7L,SAAS,MAAMwP,GAAE8C,YAAYsY,EAAEpb,GAAG,GAAGA,IAAI3D,GAAE,MAAMpF,MAAM,qEAAqEvJ,KAAKyyB,QAAQ/E,CAAC,CAAKgF,iBAAa,OAAOhF,SAAG,IAAS1tB,KAAK0tB,IAAI1tB,KAAK0tB,EAAE,IAAI8E,cAAcxyB,KAAK0tB,EAAEiF,YAAY3yB,KAAKyyB,UAAUzyB,KAAK0tB,CAAC,CAACtuB,WAAW,OAAOY,KAAKyyB,OAAO,EAAO,MAAkZ1xB,GAAE,CAAC4N,EAAE2D,KAAKob,GAAE/e,EAAEikB,mBAAmBtgB,EAAEjL,KAAKqmB,GAAGA,aAAa8E,cAAc9E,EAAEA,EAAEgF,aAAapgB,EAAEhS,SAASotB,IAAI,MAAMpb,EAAE2D,SAASuW,cAAc,SAASla,EAAEkJ,YAAYkS,EAAE+E,QAAQ9jB,EAAEoe,YAAYza,EAAG,GAAA,EAAIke,GAAE9C,GAAEA,GAAGA,EAAEA,GAAGA,aAAa8E,cAAc,CAAC9E,IAAI,IAAI/e,EAAE,GAAG,IAAI,MAAM2D,KAAKob,EAAEmF,SAASlkB,GAAG2D,EAAEmgB,QAAQ,MAAtqB/E,IAAG,IAAIpb,GAAEob,EAAE,GAAG/e,IAA+pBxT,CAAEwT,EAAG,EAAjE,CAAmE+e,GAAGA;;;;;ICA5nC,IAAIvyB,GAAEwT,GAAEuf,GAAEC,GAAE,MAAMR,GAAE,CAACmF,YAAYpF,EAAE3sB,GAAG,OAAOA,GAAG,KAAKiY,QAAQ0U,EAAEA,EAAE,GAAG,KAAK,MAAM,KAAKvxB,OAAO,KAAKgG,MAAMurB,EAAE,MAAMA,EAAEA,EAAElkB,KAAKC,UAAUikB,GAAG,OAAOA,CAAC,EAAEqF,cAAcrF,EAAE3sB,GAAG,IAAI5F,EAAEuyB,EAAE,OAAO3sB,GAAG,KAAKiY,QAAQ7d,EAAE,OAAOuyB,EAAE,MAAM,KAAK7jB,OAAO1O,EAAE,OAAOuyB,EAAE,KAAK7jB,OAAO6jB,GAAG,MAAM,KAAKvxB,OAAO,KAAKgG,MAAM,IAAIhH,EAAEqO,KAAKT,MAAM2kB,EAAkB,CAAf,MAAMA,GAAGvyB,EAAE,IAAI,EAAE,OAAOA,CAAC,GAAGmX,GAAE,CAACob,EAAE3sB,IAAIA,IAAI2sB,IAAI3sB,GAAGA,GAAG2sB,GAAGA,GAAGI,GAAE,CAACkF,WAAU,EAAG3pB,KAAKhK,OAAO4zB,UAAUtF,GAAEhY,SAAQ,EAAGud,WAAW5gB,IAAG,MAAMpH,WAAUioB,YAAY/d,cAAcY,QAAQhW,KAAK,GAAG,IAAI+mB,IAAI/mB,KAAK,QAAG,EAAOA,KAAK,QAAG,EAAOA,KAAKozB,iBAAgB,EAAGpzB,KAAKqzB,YAAW,EAAGrzB,KAAK,GAAG,KAAKA,KAAKouB,GAAG,CAACmC,sBAAsB7C,GAAG,IAAI3sB,EAAE,QAAQA,EAAEf,KAAKsuB,SAAI,IAASvtB,IAAIf,KAAKsuB,EAAE,IAAItuB,KAAKsuB,EAAErtB,KAAKysB,EAAE,CAAY4F,gCAAqBtzB,KAAKuzB,WAAW,MAAM7F,EAAE,GAAG,OAAO1tB,KAAKwzB,kBAAkBlzB,SAAS,CAACS,EAAE5F,KAAK,MAAMwT,EAAE3O,KAAK,GAAG7E,EAAE4F,QAAG,IAAS4N,IAAI3O,KAAK,GAAGlE,IAAI6S,EAAExT,GAAGuyB,EAAEzsB,KAAK0N,GAAI,IAAG+e,CAAC,CAAC6C,sBAAsB7C,EAAE3sB,EAAE+sB,IAAG,GAAG/sB,EAAE8d,QAAQ9d,EAAEiyB,WAAU,GAAIhzB,KAAKuzB,WAAWvzB,KAAKwzB,kBAAkB13B,IAAI4xB,EAAE3sB,IAAIA,EAAE0yB,aAAazzB,KAAKmB,UAAU3E,eAAekxB,GAAG,CAAC,MAAMvyB,EAAE,iBAAiBuyB,EAAE5qB,SAAS,KAAK4qB,EAAE/e,EAAE3O,KAAK0zB,sBAAsBhG,EAAEvyB,EAAE4F,QAAG,IAAS4N,GAAGxS,OAAOqD,eAAeQ,KAAKmB,UAAUusB,EAAE/e,EAAE,CAAC,CAAC4hB,6BAA6B7C,EAAE3sB,EAAE5F,GAAG,MAAM,CAAC+D,MAAM,OAAOc,KAAKe,EAAE,EAAEjF,IAAI6S,GAAG,MAAMuf,EAAEluB,KAAK0tB,GAAG1tB,KAAKe,GAAG4N,EAAE3O,KAAK2zB,cAAcjG,EAAEQ,EAAE/yB,EAAE,EAAEiG,cAAa,EAAGwyB,YAAW,EAAG,CAACrD,0BAA0B7C,GAAG,OAAO1tB,KAAKwzB,kBAAkBt0B,IAAIwuB,IAAII,EAAC,CAACyC,kBAAkB,GAAGvwB,KAAKxD,eAAe,aAAa,OAAM,EAAGwD,KAAK6zB,WAAU,EAAG,MAAMnG,EAAEvxB,OAAO23B,eAAe9zB,MAAM,GAAG0tB,EAAE6F,WAAWvzB,KAAKwzB,kBAAkB,IAAIzM,IAAI2G,EAAE8F,mBAAmBxzB,KAAK,GAAG,IAAI+mB,IAAI/mB,KAAKxD,eAAe,cAAc,CAAC,MAAMkxB,EAAE1tB,KAAK+zB,WAAWhzB,EAAE,IAAI5E,OAAO63B,oBAAoBtG,MAAMvxB,OAAO83B,sBAAsBvG,IAAI,IAAI,MAAMvyB,KAAK4F,EAAEf,KAAKk0B,eAAe/4B,EAAEuyB,EAAEvyB,GAAG,CAAC,OAAO6E,KAAKm0B,cAAcn0B,KAAKo0B,eAAep0B,KAAKq0B,SAAQ,CAAE,CAAC9D,sBAAsBxvB,GAAG,MAAM5F,EAAE,GAAG,GAAGgH,MAAM7C,QAAQyB,GAAG,CAAC,MAAM4N,EAAE,IAAIuE,IAAInS,EAAEuzB,KAAK,KAAK3oB,WAAW,IAAI,MAAM5K,KAAK4N,EAAExT,EAAEo5B,QAAQ7G,GAAE3sB,GAAG,WAAM,IAASA,GAAG5F,EAAE8F,KAAKysB,GAAE3sB,IAAI,OAAO5F,CAAC,CAACo1B,WAAU7C,EAAE3sB,GAAG,MAAM5F,EAAE4F,EAAEiyB,UAAU,OAAM,IAAK73B,OAAE,EAAO,iBAAiBA,EAAEA,EAAE,iBAAiBuyB,EAAEA,EAAE5b,mBAAc,CAAM,CAACsc,IAAI,IAAIV,EAAE1tB,KAAK,GAAG,IAAIwS,SAASkb,GAAG1tB,KAAKw0B,eAAe9G,IAAI1tB,KAAKkwB,EAAE,IAAInJ,IAAI/mB,KAAK,KAAKA,KAAK2zB,gBAAgB,QAAQjG,EAAE1tB,KAAKoV,YAAYkZ,SAAI,IAASZ,GAAGA,EAAEptB,SAASotB,GAAGA,EAAE1tB,OAAO,CAACy0B,cAAc/G,GAAG,IAAI3sB,EAAE5F,GAAG,QAAQ4F,EAAEf,KAAK,UAAK,IAASe,EAAEA,EAAEf,KAAK,GAAG,IAAIiB,KAAKysB,QAAG,IAAS1tB,KAAK00B,YAAY10B,KAAK20B,cAAc,QAAQx5B,EAAEuyB,EAAEkH,qBAAgB,IAASz5B,GAAGA,EAAEuF,KAAKgtB,GAAG,CAACmH,iBAAiBnH,GAAG,IAAI3sB,EAAE,QAAQA,EAAEf,KAAK,UAAK,IAASe,GAAGA,EAAE+zB,OAAO90B,KAAK,GAAG0B,QAAQgsB,KAAK,EAAE,EAAE,CAAC,OAAK1tB,KAAKoV,YAAYoe,kBAAkBlzB,SAAO,CAAGotB,EAAE3sB,KAAKf,KAAKxD,eAAeuE,KAAKf,KAAK,GAAGlE,IAAIiF,EAAEf,KAAKe,WAAWf,KAAKe,GAAI,GAAE,CAACg0B,mBAAmB,IAAIrH,EAAE,MAAMvyB,EAAE,QAAQuyB,EAAE1tB,KAAKg1B,kBAAa,IAAStH,EAAEA,EAAE1tB,KAAKi1B,aAAaj1B,KAAKoV,YAAY8f,mBAAmB,OAAOn0B,GAAE5F,EAAE6E,KAAKoV,YAAY+e,eAAeh5B,CAAC,CAACg6B,oBAAoB,IAAIzH,OAAE,IAAS1tB,KAAK00B,aAAa10B,KAAK00B,WAAW10B,KAAK+0B,oBAAoB/0B,KAAKw0B,gBAAe,GAAI,QAAQ9G,EAAE1tB,KAAK,UAAK,IAAS0tB,GAAGA,EAAEptB,SAASotB,IAAI,IAAI3sB,EAAE,OAAO,QAAQA,EAAE2sB,EAAEkH,qBAAgB,IAAS7zB,OAAE,EAAOA,EAAEL,KAAKgtB,EAAG,IAAG1tB,KAAK,KAAKA,KAAK,KAAKA,KAAK,GAAGA,KAAK,QAAG,EAAO,CAACw0B,eAAe9G,GAAE,CAAE0H,uBAAuB,IAAI1H,EAAE,QAAQA,EAAE1tB,KAAK,UAAK,IAAS0tB,GAAGA,EAAEptB,SAASotB,IAAI,IAAI3sB,EAAE,OAAO,QAAQA,EAAE2sB,EAAE2H,wBAAmB,IAASt0B,OAAE,EAAOA,EAAEL,KAAKgtB,EAAG,IAAG1tB,KAAK,GAAG,IAAIwS,SAASkb,GAAG1tB,KAAK,GAAG0tB,GAAG,CAAC4H,yBAAyB5H,EAAE3sB,EAAE5F,GAAG6E,KAAKu1B,EAAE7H,EAAEvyB,EAAE,CAAC,KAAGuyB,EAAE3sB,EAAE5F,EAAE2yB,IAAG,IAAInf,EAAEuf,EAAE,MAAMC,EAAEnuB,KAAKoV,YAAY,GAAGsY,EAAEvyB,GAAG,QAAG,IAASgzB,IAAG,IAAKhzB,EAAEwa,QAAQ,CAAC,MAAMrD,GAAG,QAAQ4b,EAAE,QAAQvf,EAAExT,EAAE83B,iBAAY,IAAStkB,OAAE,EAAOA,EAAEmkB,mBAAc,IAAS5E,EAAEA,EAAEP,GAAEmF,aAAa/xB,EAAE5F,EAAEkO,MAAMrJ,KAAK,GAAG0tB,EAAE,MAAMpb,EAAEtS,KAAKqwB,gBAAgBlC,GAAGnuB,KAAKopB,aAAa+E,EAAE7b,GAAGtS,KAAK,GAAG,IAAI,CAAC,CAACu1B,EAAE7H,EAAE3sB,GAAG,IAAI5F,EAAEwT,EAAEuf,EAAE,MAAMC,EAAEnuB,KAAKoV,YAAY9C,EAAE6b,EAAE,GAAGjvB,IAAIwuB,GAAG,QAAG,IAASpb,GAAGtS,KAAK,KAAKsS,EAAE,CAAC,MAAMob,EAAES,EAAEqH,mBAAmBljB,GAAGwb,EAAEJ,EAAEuF,UAAU/nB,EAAE,QAAQgjB,EAAE,QAAQvf,EAAE,QAAQxT,EAAE2yB,SAAI,IAAS3yB,OAAE,EAAOA,EAAE43B,qBAAgB,IAASpkB,EAAEA,EAAE,mBAAmBmf,EAAEA,EAAE,YAAO,IAASI,EAAEA,EAAEP,GAAEoF,cAAc/yB,KAAK,GAAGsS,EAAEtS,KAAKsS,GAAGpH,EAAEnK,EAAE2sB,EAAErkB,MAAMrJ,KAAK,GAAG,IAAI,CAAC,CAAC2zB,cAAcjG,EAAE3sB,EAAE5F,GAAG,IAAIwT,GAAE,OAAG,IAAS+e,MAAMvyB,EAAEA,GAAG6E,KAAKoV,YAAYogB,mBAAmB9H,IAAIwF,YAAY5gB,IAAGtS,KAAK0tB,GAAG3sB,IAAIf,KAAKkwB,EAAE/vB,IAAIutB,IAAI1tB,KAAKkwB,EAAEp0B,IAAI4xB,EAAE3sB,IAAG,IAAK5F,EAAEwa,SAAS3V,KAAK,KAAK0tB,SAAI,IAAS1tB,KAAK,KAAKA,KAAK,GAAG,IAAI+mB,KAAK/mB,KAAK,GAAGlE,IAAI4xB,EAAEvyB,KAAKwT,GAAE,IAAK3O,KAAKozB,iBAAiBzkB,IAAI3O,KAAK,GAAGA,KAAK,KAAK,CAAC6H,YAAW7H,KAAKozB,iBAAgB,EAAG,IAAI,UAAUpzB,KAAK,GAAGA,KAAK,UAAUA,KAAK,EAA6B,CAA1B,MAAM0tB,GAAGlb,QAAQijB,OAAO/H,EAAE,CAAC,MAAMA,EAAE1tB,KAAK01B,gBAAgB,OAAO,MAAMhI,SAASA,GAAG1tB,KAAKozB,eAAe,CAACsC,gBAAgB,IAAIhI,EAAE,IAAI1tB,KAAKozB,gBAAgB,OAAOpzB,KAAKqzB,WAAWrzB,KAAK,KAAKA,KAAK,GAAGM,SAAS,CAACotB,EAAE3sB,IAAIf,KAAKe,GAAG2sB,IAAI1tB,KAAK,QAAG,GAAQ,IAAIe,GAAE,EAAG,MAAM5F,EAAE6E,KAAKkwB,EAAE,IAAInvB,EAAEf,KAAK21B,aAAax6B,GAAG4F,GAAGf,KAAK41B,WAAWz6B,GAAG,QAAQuyB,EAAE1tB,KAAK,UAAK,IAAS0tB,GAAGA,EAAEptB,SAASotB,IAAI,IAAI3sB,EAAE,OAAO,QAAQA,EAAE2sB,EAAEmI,kBAAa,IAAS90B,OAAE,EAAOA,EAAEL,KAAKgtB,EAAG,IAAG1tB,KAAK6mB,OAAO1rB,IAAI6E,KAAK,IAAoC,CAA/B,MAAM0tB,GAAG,MAAM3sB,GAAE,EAAGf,KAAK,KAAK0tB,CAAC,CAAC3sB,GAAGf,KAAK8uB,EAAE3zB,EAAE,CAACy6B,WAAWlI,GAAI,CAAAoB,EAAEpB,GAAG,IAAI3sB,EAAE,QAAQA,EAAEf,KAAK,UAAK,IAASe,GAAGA,EAAET,SAASotB,IAAI,IAAI3sB,EAAE,OAAO,QAAQA,EAAE2sB,EAAEoI,mBAAc,IAAS/0B,OAAE,EAAOA,EAAEL,KAAKgtB,EAAG,IAAG1tB,KAAKqzB,aAAarzB,KAAKqzB,YAAW,EAAGrzB,KAAK+1B,aAAarI,IAAI1tB,KAAKg2B,QAAQtI,EAAE,CAAC,OAAK1tB,KAAKkwB,EAAE,IAAInJ,IAAI/mB,KAAKozB,iBAAgB,CAAE,CAAK6C,qBAAiB,OAAOj2B,KAAKk2B,mBAAmB,CAACA,oBAAoB,OAAOl2B,KAAK,EAAE,CAAC21B,aAAajI,GAAG,OAAM,CAAE,CAAC7G,OAAO6G,QAAG,IAAS1tB,KAAK,KAAKA,KAAK,GAAGM,SAAS,CAACotB,EAAE3sB,IAAIf,KAAK,GAAGe,EAAEf,KAAKe,GAAG2sB,KAAK1tB,KAAK,QAAG,GAAQA,KAAK,IAAI,CAACg2B,QAAQtI,GAAI,CAAAqI,aAAarI,GAAE;;;;;;ACA3rK,IAAI3sB,GAAE+sB,GAAEH,GAAExyB,GAAEmX,GAAEpH,GDAgrKA,GAAE2oB,WAAU,EAAG3oB,GAAEgqB,kBAAkB,CAACxf,KAAK,QAAQ,QAAQ/G,IAAGxT,GAAEyyB,YAAYuI,sCAAiC,IAASxnB,IAAGA,GAAEjO,KAAKvF,GAAE,CAACi7B,gBAAgBlrB,MAAK,QAAQgjB,IAAGC,GAAEP,YAAYyI,+BAA0B,IAASnI,GAAEA,GAAEC,GAAEkI,wBAAwB,IAAIp1B,KAAK,eCA55K,QAAQF,IAAGmK,GAAE0iB,YAAY0I,0BAAqB,IAASv1B,GAAEA,GAAEmK,GAAEorB,mBAAmB,IAAIr1B,KAAK,cAAc,MAAMitB,WAAUR,GAAEtY,cAAcY,SAAS1T,WAAWtC,KAAKu2B,cAAc,CAACtE,KAAKjyB,MAAMA,KAAK,QAAG,CAAM,CAAC+0B,mBAAmB,IAAIrH,EAAE/e,EAAE,MAAMwf,EAAEnY,MAAM+e,mBAAmB,OAAO,QAAQrH,GAAG/e,EAAE3O,KAAKu2B,eAAeC,oBAAe,IAAS9I,IAAI/e,EAAE6nB,aAAarI,EAAEqB,YAAYrB,CAAC,CAACtH,OAAO6G,GAAG,MAAMS,EAAEnuB,KAAKkoB,SAASlS,MAAM6Q,OAAO6G,GAAG1tB,KAAK,GHA4Q,EAAC0tB,EAAE3sB,EAAE5F,KAAK,IAAIwT,EAAEgf,EAAE,MAAMG,EAAE,QAAQnf,EAAE,MAAMxT,OAAE,EAAOA,EAAEq7B,oBAAe,IAAS7nB,EAAEA,EAAE5N,EAAE,IAAIuR,EAAEwb,EAAE2I,WAAW,QAAG,IAASnkB,EAAE,CAAC,MAAMob,EAAE,QAAQC,EAAE,MAAMxyB,OAAE,EAAOA,EAAEq7B,oBAAe,IAAS7I,EAAEA,EAAE,KAAKG,EAAE2I,WAAWnkB,EAAE,IAAIwe,GAAE/vB,EAAEuwB,aAAa1hB,KAAI8d,GAAGA,OAAE,EAAOvyB,EAAE,CAAC,OAAOmX,EAAE2d,EAAEvC,GAAGpb,GGAvgB3D,CAAEwf,EAAEnuB,KAAK00B,WAAW10B,KAAKu2B,cAAc,CAACpB,oBAAoB,IAAIzH,EAAE1X,MAAMmf,oBAAoB,QAAQzH,EAAE1tB,KAAK,UAAK,IAAS0tB,GAAGA,EAAEwD,cAAa,EAAG,CAACkE,uBAAuB,IAAI1H,EAAE1X,MAAMof,uBAAuB,QAAQ1H,EAAE1tB,KAAK,UAAK,IAAS0tB,GAAGA,EAAEwD,cAAa,EAAG,CAAChJ,SAAS,OAAOiG,EAAC,+NAAED,GAAE2F,WAAU,EAAG3F,GAAEwI,eAAc,EAAG,QAAQ/I,IAAGG,GAAEF,YAAY+I,gCAA2B,IAAShJ,IAAGA,GAAEjtB,KAAKotB,GAAE,CAAC8I,WAAW1I,KAAI,QAAQ5b,IAAGnX,GAAEyyB,YAAYiJ,iCAA4B,IAASvkB,IAAGA,GAAE5R,KAAKvF,GAAE,CAACy7B,WAAW1I,4BCLj5B,IAAIE,EAAEjyB,OAAOqD,eAAmB8S,EAAEnW,OAAOyH,yBAA6BzI,EAAEgB,OAAO63B,oBAAwBvmB,EAAEtR,OAAOgF,UAAU3E,eAAsS+L,EAAE,CAAA,EAAnR,EAACmlB,EAAExiB,KAAK,IAAI,IAAI4iB,KAAK5iB,EAAEkjB,EAAEV,EAAEI,EAAE,CAAC5uB,IAAIgM,EAAE4iB,GAAG8F,YAAW,KAAoOhkB,CAAErH,EAAE,CAACuuB,MAAM,IAAInoB,IAAIooB,UAAlErJ,IAA7K,EAACA,EAAExiB,EAAE4iB,EAAEK,KAAK,GAAGjjB,GAAa,iBAAHA,GAAuB,mBAAHA,EAAc,IAAI,IAAInK,KAAK5F,EAAE+P,IAAIuC,EAAE/M,KAAKgtB,EAAE3sB,IAAIA,IAAI+sB,GAAGM,EAAEV,EAAE3sB,EAAE,CAAC7B,IAAI,IAAIgM,EAAEnK,GAAG6yB,aAAazF,EAAE7b,EAAEpH,EAAEnK,KAAKotB,EAAEyF,aAAa,OAAOlG,GAAYC,CAAES,EAAE,CAAA,EAAG,aAAa,CAACtuB,OAAM,IAAK4tB,GAA8C5hB,CAAEvD,GAAG,IAAIoG,EAAE,MAAMyG,YAAYlK,GAAGlL,KAAKF,MAAMoL,CAAC,CAACqlB,UAAUrlB,GAAG,OAAO,IAAIyD,EAAEzD,EAAE,CAAC7D,IAAI6D,GAAG,OAAOlL,KAAKg3B,UAAUroB,EAAEsoB,GAAG,MAAMtoB,EAAEsoB,GAAG/rB,EAAElL,KAAKF,OAAO,CAAC+S,MAAM3H,GAAG,IAAI4iB,EAAE9tB,KAAKqH,IAAI6D,GAAGhK,OAAO,OAAW,OAAJ4sB,EAASnf,EAAEsoB,GAAG,MAAMnJ,CAAC,CAACoJ,UAAUhsB,GAAG,OAAOlL,KAAKg3B,UAAU9rB,EAAElL,KAAKF,KAAK,CAACoB,OAAO,OAAOlB,KAAKF,KAAK,CAACk3B,UAAU,OAAoB,OAAbh3B,KAAKF,YAA2B,IAAbE,KAAKF,KAAc,MCYlxB,MAAMq3B,GAAW,WAoCtB,SAASC,EAAcC,EAAYC,EAAcC,GAC/C,OAAO,SAAmBh1B,GACxB,IAAI5G,EA9BR,SAA8B+P,GAC5B,IACI8rB,EADAC,EAAK/rB,EAAIrL,QAEb,OAAO,WAEL,OADAm3B,EAAQC,EAAGt0B,SAAWq0B,CAE5B,CACG,CAuBaE,CAAqBH,GAAiB,CAAC,IAC7C/1B,EAAQe,EAAInD,WAAWoC,MAAM,KAC7Bm2B,EAAen2B,EAAM,GACrBo2B,EAAiBp2B,EAAM,GACvBq2B,EAA2B,MAApBF,EAAa,GAAc,IAAQ,GAC1CE,IAAKF,EAAeA,EAAa9V,OAAO,IAC5C,IAAIiW,EACF1lB,EAAM,GACR,GAAIulB,EAEF,GAAKC,GAA0C,IAAxBD,EAAa32B,OAGlC,IADA22B,EAAeA,EAAan2B,MAAM,IAAImK,WAC9BmsB,EAAKH,EAAa7C,OAAO,EAAGn5B,MAAQ,IAC1CyW,EAAM0lB,EAAGnsB,UAAUzK,KAAK,KAAOkR,EAAMklB,EAAe,IAAMllB,OAJZA,EAAMulB,EAQ1D,OAAIC,EAAuBC,EAAMzlB,EAAMilB,EAAaO,EAC7CC,EAAMzlB,CACnB,CACG,CACD,SAAS2lB,EAAWV,EAAYC,GAI9B,IAAIU,EAAO,WAKPC,EAAS,IAAIjd,OAAO,aAAeqc,EAAaC,EAAe,OAEnE,OAAO,SAAgBn8B,GACrB,IAAK88B,EAAOjzB,KAAK7J,GAAI,MAAM,IAAIoO,MAAMrO,EAAE,mBACvC,IAAIsG,EAAQrG,EAAEqG,MAAM61B,GAChBM,EAAen2B,EAAM,GAAG7B,QAAQq4B,EAAM,IAC1C,IAAK,aAAahzB,KAAK2yB,GACrB,MAAM,IAAIpuB,MAAMrO,EAAE,mBACpB,IAAI08B,EAAiBp2B,EAAM,GAG3B,GAFIo2B,IAAgBA,EAAiBA,EAAej4B,QAAQ,MAAO,KAC9Di4B,IAAgBA,EAAiB,MACjC,WAAW5yB,KAAK4yB,GACnB,MAAM,IAAIruB,MAAMrO,EAAE,mBAEpB,OAAO,IAAI2O,OAAO8tB,EAAe,IAAMC,GAAkB,CAC/D,CACG,CAED,MAAO,CACLM,OAAQH,EACN78B,EAAE,iBAAkB,KACpBA,EAAE,wBAAyB,MAE7Bi9B,UAAWf,EACTl8B,EAAE,iBAAkB,KACpBA,EAAE,wBAAyB,KAC3BA,EAAE,yBAA0B,CAAC,KAE/Bk8B,cAAeA,EACfgB,UAAWL,EACXM,QAAS,KAEPlB,GAASe,OAASH,EAChB78B,EAAE,iBAAkB,KACpBA,EAAE,wBAAyB,MAE7Bi8B,GAASgB,UAAYf,EACnBl8B,EAAE,iBAAkB,KACpBA,EAAE,wBAAyB,KAC3BA,EAAE,yBAA0B,CAAC,IAC9B,EAGN,CAhHuB,GCTnB6D,OAAOof,SAASI,SACnBxf,OAAOof,SAASI,OACdxf,OAAOof,SAASma,SAChB,KACAv5B,OAAOof,SAASoa,UACfx5B,OAAOof,SAASqa,KAAO,IAAMz5B,OAAOof,SAASqa,KAAO,KAIlD,MAAMC,IACPC,GAAY,CACdC,IAAK,YACLvd,KAAM,YACNwd,KAAM,qBACNC,IAAK,kBACLC,IAAK,0CACLC,IAAK,kBACLC,IAAK,qBACLC,IAAK,aACLC,KAAM,aACNC,IAAK,aAsBA,CACLC,KAfF,SAAcvc,GACZ,OAAOA,EAAI3a,MAAM,cAClB,EAcCm3B,WAbF,SAAoBxc,GAClB,MAAkB,MAAXA,EAAI,EACZ,EAYCyc,eAVA,wQAWAC,SArBF,SAAkBC,GAChB,MAAO,YAAc9gB,GAAKC,QAAQD,GAAKR,aAAcshB,EACtD,EAoBCC,WAzBF,SAAoBD,GAClB,OAAOpd,GAAc,UAAY1D,GAAKC,QAAQD,GAAKR,aAAcshB,GAClE,EAwBCE,SAAU,SAAU7c,GAClB,MAAM8c,EAAc,IAAI10B,IACtBmX,GAAcS,GACd,GAAGsB,SAASma,WAAWna,SAAS8T,OAAO9T,SAASC,YAE5Cwb,EAAWD,EAAYvb,SAAS2R,SAAS,YAC3C,IAAI/wB,gBAAgB26B,EAAY31B,QAAQ9E,IAAI,YAC5Cy6B,EAAYvb,SAAS5c,MAAM,KAAKuI,MACpC,IAAK6vB,EAAU,OAAO,KACtB,MAAMC,EAAMD,EAAS13B,MAAM,eACzBw3B,EAAWG,GAAOnB,GAAUmB,EAAI,IAClC,OAAKH,EACE,CACLA,SAAUA,EACVG,IAAKA,EAAI,IAHW,IAKvB,IAvDmB,IAClBnB,GCmDN,MAAM1R,GAAoBrL,GAAWI,GAAM,kBAE3C,SAAS+d,IAAgB7wB,MAAEA,EAAKnJ,MAAEA,EAAK+O,OAAEA,EAAS5E,IAAKA,KACrDhB,EAAMmgB,aAAa,oBAAqBtpB,GACxCjG,EAAEoP,GAAO2Q,GAAG,UAAU,WACpB,IACE,IAAImgB,EAASlrB,EAAO5F,EAAMnJ,MAAOmJ,EAOlC,CANC,MAAO0F,GAEb,CAAc,aACc,IAAXorB,GACT9wB,EAAMmgB,aAAa,oBAAqB2Q,EAE3C,CACL,GACA,CAEA,MAAMC,GAAYpuB,EAAO,CAAA,GAEnBquB,GAAW3mB,GAAO,QAClB4mB,GAAe5mB,GAAO,iBAEtB6mB,GAAW,CAAClS,EAASX,KACzB,MAAMjR,EAAMJ,SAASuW,cAAcvE,GAEnC,MpBnBwB,EAAC5R,EAAKuJ,KAC9BzjB,OAAOC,QAAQwjB,GAAMtf,SAAQ,EAAErE,EAAK6D,KAAWuW,EAAI+S,aAAantB,EAAK6D,IAAO,EoBiB5Es6B,CAAW/jB,EAAKiR,GACTjR,CAAG,EAENgkB,GAAc,CAACzV,EAAS0C,EAASW,KACrC,MAAM5R,EAAM8jB,GAASlS,EAASX,GAO9B,MANgB,aAAZW,EACF5R,EAAIvW,MAAQ8kB,EAAQ9kB,MAEpBuW,EAAI4D,UACF2K,EAAQlK,MAAQG,GAAW+J,EAAQ9kB,OAAOH,QAAQ,SAAU,SAEzD0W,CAAG,EAyBZmO,GAtBiB,CACflhB,KAAM,WACN4kB,OAAQ,CAACtD,EAASsC,EAAOI,IAChB6S,GAAS,QAAS7S,GAE3BA,QAAS,CAAC1H,EAAMgF,EAAS2C,IACvBprB,OAAOgV,OACL,CAAE,EACFyO,EACA,CACEvW,KAAM,YAIRub,EAAQ9kB,OAAS,CAAEiY,SAAS,IAEhCyN,SAAU,CAACvc,EAAOnJ,EAAOglB,KACvB7b,EAAM8O,QAAUjY,CAAK,EAEvBw6B,OAAQ,WAeV9V,GAVgB,CACdlhB,KAAM,UACN4kB,OAAQ,CAACtD,EAASsC,EAAOI,IAAY6S,GAAS,MAAO7S,GACrDA,QAAS,CAAC1H,EAAMgF,EAAS2C,IACvBprB,OAAOgV,OAAO,CAAE,EAAEyO,EAAM,CACtB2a,IAAK3V,EAAQ4V,QACbC,IAAKre,GAAcwI,EAAQgV,cAM1B,MAAMc,GAAO,CAClBp3B,KAAM,OACNq3B,WAAW,EACXrT,QAAS,CAAC1H,EAAMgF,EAAS2C,IACvBprB,OAAOgV,OAAO,CAAE,EAAEyO,EAAM,CACtBvW,KAAM,OACNgf,aAAc,MACdvoB,MAAO8kB,EAAQ9kB,QAEnBooB,OAAQ,CAACtD,EAASsC,EAAOI,IAAY6S,GAAS,QAAS7S,GACvD9B,SAAU,CAACvc,EAAOnJ,KAChBmJ,EAAMnJ,MAAQA,CAAK,EAErBw6B,OAAQ,SAGV9V,GAAekW,IAoBflW,GAlBa,CACXlhB,KAAM,OACNgkB,QAAS,CAAC1H,EAAMgF,EAAS2C,IAOhB3H,EAETsI,OAAQ,CAACtD,EAASsC,EAAOI,IAChB+S,GAAYzV,EAAS0C,EAAS,YAEvC9B,SAAUkV,GAAKlV,SACf8U,OAAQ,UAqCV9V,GAhCc,CACZlhB,KAAM,QACNs3B,MAAOhW,IACLA,EAAQ9kB,OAAS8kB,EAAQ9kB,OAAS,IAAIH,QAAQ,QAAS,MAChDilB,GAET0C,QAAS,CAAC1H,EAAMgF,EAAS2C,IACvBprB,OAAOgV,OACL8oB,GAASra,GACT2H,GAAW3C,EAAQiW,OAAS,CAAEnM,IAAK9J,EAAQiW,OAC3C,CACEC,OACElW,EAAQ+E,OAASxpB,GAAI,UAAWykB,GAAW,WAAa,WADnD,gBAKbsD,OAAQ,CAACtD,EAASsC,EAAOI,IAChB+S,GACLzV,EACA0C,EACqB,YAArB1C,EAAQmW,SACJ,IAAM1Y,KAAK2Y,IAAI,EAAGpW,EAAQqW,QAAU,GACpCrW,EAAQiW,MACN,QACA,OAGVrV,SAAU,CAACvc,EAAOnJ,KAChBmJ,EAAMgR,UAAYY,GAAW/a,GAAOH,QAAQ,SAAU,QAAQ,IAiDlE6kB,GA3CyB,CACvBlhB,KAAM,YACNs3B,MAAOhW,IACLA,EAAQ9kB,MAAQ8kB,EAAQ9kB,MAAMud,QAE1Bob,GAASY,WAAWzU,EAAQ/H,MAAQ4b,GAASW,KAAKxU,EAAQ/H,QACxD4b,GAASW,KAAKxU,EAAQ/H,OAAM+H,EAAQ9kB,MAAQ24B,GAASa,uBAClD1U,EAAQ/H,KAEV+H,GAET0C,QAAS,CAAC1H,EAAMgF,EAAS2C,KACvB,IAAI2T,EAAgB,GAEpB,GAAItW,EAAQ/H,IAAK,CAEf,GADA+C,EAAW,KAAIxD,GAAcwI,EAAQ/H,KACjC+H,EAAQ/H,IAAI3a,MAAM,WACpB0d,EAAW,KAAI,QACfsb,EAAgB,WACX,CACLA,EAAgB,cACZtW,EAAQuW,WAAUD,GAAiB,WACvC,IAAIxB,EAAW9U,EAAQ8U,UAAYjB,GAASiB,SAAS9U,EAAQ/H,KACzD6c,IACF9Z,EAAW,KAAI8Z,EAASA,SACxBwB,GAAiB,IAAMxB,EAASG,IAEnC,CACsB,MAAnBjV,EAAQ/H,IAAI,KAAY+C,EAAa,OAAI,SAC9C,CAGD,OAFAsb,GAAiB,WACjBtb,EAAY,MAAIsb,EACTjB,GAASra,EAAK,EAEvBsI,OAAQ,CAACtD,EAASsC,EAAOI,IAChB+S,GAAYzV,EAAS0C,EAAS,KAEvC9B,SAAU,CAACvc,EAAOnJ,KAChBmJ,EAAMgR,UAAYY,GAAW/a,GAAOH,QAAQ,SAAU,QAAQ,EAEhE26B,OAAQ,UAKV,MAAMc,GAAY,CAChB93B,KAAM,YACNgkB,QAASjc,EACP4uB,GACAC,GACAlmB,GAAU,CACR3K,KAAM,YACNyxB,MAAO,eAGXnrB,KAAMA,GACJ,0BAA0BkL,GAAWlL,GAAMhQ,QAAQ,OAAQ,gBAC7DuoB,OAAQ,CAACtD,EAASsC,EAAOI,KACvB,MAAMxnB,EAAQ8kB,EAAQ9kB,MAChBmD,EAAQoI,EAAQnK,EAAK,IAAKmG,GAAI+zB,GAAUzrB,MAAhCtE,CAAuCvL,GAC/CunB,EAAS,OAAO1H,GAAc2H,QACtCrkB,SACE,OAAOpJ,EAAEwtB,EAAO,EAElB7B,SAAU,CAACvc,EAAOnJ,EAAOglB,KACvB7b,EAAMgR,UAAY5O,EAAQnK,EAAK,IAAKmG,GAAI+zB,GAAUzrB,MAAhCtE,CAAuCvL,GACzDjG,EAAEqQ,GAAGmxB,UAAYxhC,EAAEoP,GAAOxJ,KAAK,MAAM47B,UAAU,EAEjDf,OAAQ,SAGV9V,GAAe4W,IAEf,MAAME,GAAY,CAChBpT,OAAQ,CAACtD,EAASsC,EAAOI,KACvB,MAAMxnB,EAAQ8kB,EAAQ9kB,MAChBunB,EAASxtB,EAAE,WAAW8lB,GAAc2H,gBAoB1C,MAV0B,aAAxB1C,EAAQrE,aACRzgB,EAAMkB,OAAS,GACI,KAAnBlB,EAAM,GAAGA,QACRA,EAAMy7B,MAAK,SAAUz7B,GACpB,OAA0B,IAAnBA,EAAM07B,QACrB,KAEM17B,EAAMy0B,QAAQ,CAAEkH,OAAQ,GAAI37B,MAAO,KAErCw7B,GAAU9V,SAAS6B,EAAOnoB,IAAI,GAAIY,GAC3BunB,CAAM,EAEf7B,SAAU,CAACvc,EAAOnJ,KAChB,MAAMob,EAAU,IAAIjS,EAAMmN,iBAAiB,WACrCslB,EAAMxgB,EAAQla,OACd26B,EAAS77B,EAAMkB,OACf46B,EAAa3yB,EAAMpJ,OAAS,GAAK,KACvC,IAAIg8B,EAAgB,GACpB,IAAK,IAAI96B,EAAI,EAAGA,EAAI46B,EAAQ56B,IAAK,CAC/B,MAAM06B,EAAS37B,EAAMiB,GACf+6B,EAAY5gB,EAAQna,IAAMkV,SAASuW,cAAc,UACvDsP,EAAUh8B,MAAQ27B,EAAO37B,MACzBg8B,EAAUtgB,YACW,KAAnB1b,EAAMiB,GAAGjB,MAAe5E,EAAE,aAAeugC,EAAOA,OAClDK,EAAUnQ,UAAUrW,OAAO,eAAiC,KAAjBmmB,EAAO37B,OAC9C27B,EAAOD,WACTK,EAAgBJ,EAAO37B,OAErBiB,EAAI26B,EAAM,IACRE,EACFA,EAAW36B,KAAK66B,GAEhB7yB,EAAM8jB,YAAY+O,GAGvB,CACGF,EAAW56B,OACbiI,EAAMpJ,UAAU+7B,GACPD,EAASD,GAClB,IAAIzyB,EAAMmN,iBAAiB,uBAAuBulB,EAAS,OAAOr7B,SAChE2I,GAASA,EAAMkoB,WAAW4K,YAAY9yB,KAG1CA,EAAMnJ,MAAQ+7B,CAAa,GAwC/BrX,GApCiB,CACflhB,KAAM,WAYNs3B,MAAOhW,KACoB,IAArBA,EAAQoX,WACVpX,EAAQrE,YAAc,WAQjBqE,GAET+V,WAAW,EACXrT,QAAS,CAAC1H,EAAMgF,EAAS2C,IACvBprB,OAAOgV,OAAO,CAAE,EAAEyO,EAAM,CACtBtc,KAAMshB,EAAQthB,KACd24B,KAAM,IAEV/T,OAAQoT,GAAUpT,OAClB1C,SAAU8V,GAAU9V,SACpB8U,OAAQ,UAiBV9V,GAZgB,CACdlhB,KAAM,UACNgkB,QAAS,CAAC1H,EAAMgF,EAAS2C,IACvBprB,OAAOgV,OAAO,CAAE,EAAEyO,EAAM,CACtBtc,KAAMshB,EAAQthB,KACd24B,KAAMrX,EAAQ9kB,MAAMkB,SAExBknB,OAAQoT,GAAUpT,OAClB1C,SAAU8V,GAAU9V,SACpB8U,OAAQ,UAqBV9V,GAhBkB,CAChBlhB,KAAM,YACNgkB,QAAS,CAAC1H,EAAMgF,EAAS2C,IACvBprB,OAAOgV,OAAO,CAAE,EAAEyO,EAAM,CACtBtc,KAAMshB,EAAQthB,KACd24B,KAAMrX,EAAQ9kB,MAAMkB,OACpBk7B,SAAU,aAEdhU,OAAQoT,GAAUpT,OAClB1C,SAAU,CAACvc,EAAOnJ,EAAOglB,KACvB,MAAM0W,EAAW17B,EAAML,MAAKg8B,IAA8B,IAApBA,EAAOD,WAC7CvyB,EAAMnJ,MAAQ07B,EAAS17B,KAAK,EAE9Bw6B,OAAQ,UAKV,MAAM6B,GAAa,CACjBjU,OAAQ,CAACtD,EAASsC,EAAOI,KACvB,MAAMxnB,EAAQ8kB,EAAQ9kB,MACtB,GAAqB,IAAjBA,EAAMkB,OAAc,OAAO,KAC/B,MAAMqmB,EAASxtB,EAAE,OAAO8lB,GAAc2H,YACtC,IAAK,IAAIvmB,EAAI,EAAGA,EAAIjB,EAAMkB,OAAQD,IAAK,CACrC,IAAIolB,EAAKvB,EAAQuB,GAAK,IAAMplB,EAC5B,IAAI06B,EAAS5hC,EAAE,6CAETiG,EAAMiB,GAAGy6B,SAAW,YAAc,wDACGrV,gDAEJ,SAAvBvB,EAAQrE,YAAyB,QAAU,oCAC3CqE,EAAQthB,4BACV6iB,qBAEJvB,EAAQmD,MAAQnD,EAAQmD,KAAKqU,WACzB,qBAAqBxX,EAAQmD,KAAKqU,cAClC,qBAEJt8B,EAAMiB,GAAGy6B,SAAW,qBAAuB,4FAG3C3gB,GAAW/a,EAAMiB,GAAG06B,QAAQ97B,QAAQ,OAAQ,4EAKtD0nB,EAAOxnB,OAAO47B,GACdpU,EAAO5nB,KAAK,cAAcvD,IAAI4D,EAAMiB,GAAGjB,MACxC,CACD,OAAOunB,CAAM,EAEfpB,WAAY,CAAChd,EAAOozB,KAAR,EAGZ3W,WAAY,CAACpU,EAAMmU,KACjBnU,EAAKqa,UAAUrW,OAAO,cAAemQ,GACrC,IAAInU,EAAK8E,iBAAiB,UAAU9V,SAAQ2I,IAC1CA,EAAMqzB,SAAW7W,CAAQ,GACzB,GAuBNjB,GAnBkB,CAChBlhB,KAAM,iBACNgkB,QAASjc,EAAQ6uB,GAAcjsB,GAAM,QAAS,6BAC9Cia,OAAQiU,GAAWjU,OACnBjC,WAAYkW,GAAWlW,WACvBP,WAAYyW,GAAWzW,WACvB6W,mBAAmB,EACnB/W,SAAU,CAACvc,EAAOnJ,EAAOglB,KACvB,MAAMF,EAAU/qB,EAAEoP,GAAOoP,KAAK,WAC9BvY,EAAMQ,SAAQ,EAAGk7B,YAAY/5B,KAC3B,MAAMg6B,EAASxyB,EAAMoO,cAAc,QAAQuN,EAAQuB,MAAM1kB,OACpDg6B,IACDA,EAAO1jB,UAAYyjB,IAAUC,EAAO1jB,QAAUyjB,GAClD3hC,EAAE4hC,GAAQvlB,QAAQ,4BAA2B,GAC7C,EAEJokB,OAAQ,UAKV,MAAMkC,GAAY,CAChBl5B,KAAM,QACNgkB,QAASjc,EAAQ6uB,GAAcjsB,GAAM,QAAS,8BAC9Cia,OAAQiU,GAAWjU,OACnBqU,mBAAmB,EACnBtW,WAAYkW,GAAWlW,WACvBP,WAAYyW,GAAWzW,WACvBF,SAAU,CAACvc,EAAOnJ,EAAOglB,KACvB,MAAMF,EAAU/qB,EAAEoP,GAAOoP,KAAK,WACxB5W,EAAQ3B,EAAM+M,WAAU4uB,IAA8B,IAApBA,EAAOD,WAC/C,IAAe,IAAX/5B,EAKF,YAJAwH,EAAMmN,iBAAiB,SAASwO,EAAQuB,QAAQ7lB,SAAQS,IACtDA,EAAEgX,SAAU,EACZhX,EAAE07B,QAAQ,cAAc9Q,UAAU8D,OAAO,UAAU,IAIvD,MAAMgM,EAASxyB,EAAMoO,cAAc,QAAQuN,EAAQuB,MAAM1kB,OACzDg6B,EAAO1jB,SAAU,EACjBle,EAAE4hC,GAAQvlB,QAAQ,2BAA2B,EAE/CokB,OAAQ,SAGV9V,GAAegY,IAEf,MAAM1iC,GAAa,CACjBwJ,KAAM,iBACNq3B,WAAW,EACXC,MAAOhW,IACLA,EAAQQ,YAAclqB,EAAE,mBACjB0pB,GAET8X,oBAAqB58B,GACnBjG,EAAEC,WAAWipB,WACXlpB,EAAEC,WAAWioB,UAAUrnB,WACvB0mB,GAAUthB,IAEd68B,oBAAqB1zB,GACnBqY,GACEznB,EAAEC,WAAWipB,WAAW,WAAYlpB,EAAEoP,GAAOnP,WAAW,aAE5DwtB,QAAS,CAAC1H,EAAMgF,EAAS2C,IACvBprB,OAAOgV,OAAO,CAAE,EAAEyO,EAAM,CACtB9f,MAAOhG,GAAW4iC,oBAAoB9X,EAAQ9kB,OAC9CuoB,aAAc,MACdjD,YAAalqB,EAAE,kBAAmBA,EAAE,gBACpCmO,KAAM,SAEV6e,OAAQ,CAACtD,EAASsC,EAAOI,IAChB6S,GAAS,QAAS7S,GAE3BoB,YAAa,CAACrB,EAAQzC,KACfA,EAAQgY,mBAAoBhY,EAAQiY,UACvCxV,EAAOvtB,aACPogB,KAEA0K,EAAQuD,KAAKzgB,iBAAiB,SAAUmb,IACxC+B,EAAQuD,KAAKzgB,iBACX,UACAiM,GAAKD,GAAO,MAAO,UAAU,KAC3B,MAAMoP,EAAK,IAAIga,WAAW,SAAU,CAClCvW,SAAS,EACTwW,YAAY,EACZpyB,KAAM5L,SAER6lB,EAAQuD,KAAK3B,cAAc1D,EAAG,KAIlCgX,GAAgB,CACd7wB,MAAOoe,EAAOnoB,IAAI,GAClB2P,OAAQ,SAAU/O,EAAOmJ,GACvB,OAAOnP,GAAW6iC,oBAAoB1zB,EACvC,EACDnJ,MAAO8kB,EAAQ9kB,QAEjBunB,EAAOvtB,WAAW,UAAUkjC,OAC7B,EAEHxX,SAAU,CAACvc,EAAOnJ,KAChBmJ,EAAMmgB,aAAa,oBAAqBtpB,GACxCmJ,EAAMnJ,MAAQhG,GAAW4iC,oBAAoB58B,EAAM,EAErDm9B,SAAU,CAACrY,EAAS9kB,KACb8kB,EAAQsB,SAAoC,MAAxBpmB,GAAS,IAAIud,QAEpCxjB,EAAEA,EAAE+qB,EAAQ6C,MAAM3tB,WAAW,SAAU,aAAa8lB,KAAK,QAAS,IlBndjE,SAAmBsd,EAAO,CAAEhX,SAAS,GAASpmB,GACnD,MAAMq9B,EAAWtjC,EAAEC,WAAWioB,UAAUrnB,WAClCqoB,EAAalpB,EAAEC,WAAWipB,WAAWrH,KAAK7hB,EAAEC,YAClD,IAAIqnB,EAAMic,EAASC,EACnB,IAAKH,EAAKhX,SAA4B,KAAjBpmB,EAAMud,OACzB,OAAO,EAET,MAAMyK,EAAWoV,EAAKpV,UAAY,GAClC,IACE3G,EAAOI,GAAY4b,EAAUr9B,EAO9B,CANC,MAAO6O,GAEP,MAAMxJ,EACJ2iB,EAASwV,gBAAkBpiC,EAAE,gBAC7BmQ,EAAQ4C,GAAM,QAASnO,GAAQ4gB,GAA/BrV,CAAyC6xB,GAE5C,CACD,GAAa,OAAT/b,EAAe,CACjB,GAAI+b,EAAKhX,QACP,MAAMxjB,EACJolB,EAASyV,aAAeriC,EAAE,iBAC1BmQ,EAAQ4C,GAAM,QAASnO,GAAQ4gB,GAA/BrV,CAAyC6xB,IAG7C,OAAO,CACR,CAED,GADCE,EAAUhc,GAAU8b,EAAKvX,SAAY0X,EAAUjc,GAAU8b,EAAKtX,UACzDwX,IAAWC,EAAU,OAAO,EAClC,MAAMG,EAAWza,EAAWoa,EAAUC,GACpCK,EAAW1a,EAAWoa,EAAUE,GAC5BK,EAAeryB,EACnB2I,GAAU,CACRlU,QACA6lB,QAAS6X,EACT5X,QAAS6X,IAEX/c,GANmBrV,CAOnB6xB,GACF,IACE,GAAIE,IAAYC,GAAWlc,EAAOic,EAChC,MACEtV,EAAS6V,sBACTziC,EAAE,0CAED,GAAIkiC,GAAWC,IAAYlc,EAAOic,GAAWC,EAAUlc,GAC1D,MACE2G,EAAS8V,mBACT1iC,EAAE,mDAED,GAAImiC,IAAYD,GAAWC,EAAUlc,EACxC,MACE2G,EAAS+V,qBACT3iC,EAAE,wCAIP,CAFC,MAAOyT,GACP,MAAMjM,EAAOiM,EAAG+uB,EACjB,CACD,OAAO,CACT,CkB2ZWI,CAAUlZ,EAAS9kB,IAE5Bw6B,OAAQ,SAGV9V,GAAe1qB,IAEf,MAAMimB,GAAU,CACdzc,KAAM,UACNq3B,WAAW,EACXoD,YAAanZ,IACX,IAAItC,EAAK0Y,EAST,OARI76B,GAAI,UAAWykB,KACjBtC,EAAM6U,GAASgB,UACbvT,EAAQgB,QAAQoY,QAAQpZ,EAAQqZ,YAChCj9B,QACAb,GAAI,UAAWykB,KACjBoW,EAAM7D,GAASgB,UACbvT,EAAQe,QAAQqY,QAAQpZ,EAAQqZ,YAChCj9B,aACe,IAARg6B,EAA4B1Y,OACpB,IAARA,EACJD,KAAKC,IAAIA,EAAK0Y,QADrB,CACyB,EAE3B0B,oBAAqB58B,GAASq3B,GAASgB,UAAUr4B,GAEjDwnB,QAAS,CAAC1H,EAAMgF,EAAS2C,KACvB,MAAM2W,EAAWne,GAAQge,YAAYnZ,GACrC,OAAOzoB,OAAOgV,OACZ,CAAE,EACFyO,EACA,CACEvW,KAAM,OACNyxB,MAAO,UACPzS,aAAc,MACd/kB,KAAMshB,EAAQthB,KAEdxD,MAAOq+B,WAAWvZ,EAAQ9kB,OAAS,GAAGk+B,QAAQpZ,EAAQqZ,YAIxDC,GAAY,CAAE,gBAAiBA,GAChC,EAEHhW,OAAQ,CAACtD,EAASsC,EAAOI,IAAY6S,GAAS,QAAS7S,GACvDoB,YAAa,CAACrB,EAAQzC,KACpByC,EAAOhP,KAAK,SAAUgP,EAAO+W,QAAQxZ,GAAS,EAEhDY,SAAU,CAACvc,EAAOnJ,KAChB,MAAM8kB,EAAU/qB,EAAEwe,KAAKpP,EAAO,WAC9BA,EAAMnJ,MAAQigB,GAAQ2c,oBACpByB,WAAWr+B,GAAS,GAAGk+B,QAAQpZ,EAAQqZ,WACxC,EAEHhB,SAAU,SAAUrY,EAAS9kB,GAC3B,GAA4B,YAAxB8kB,EAAQrE,YACV,KAAM,mDACR,MAAMuH,EAAWlD,EAAQkD,UAAY,GACrC,IAAI5rB,EACJ,IACEA,EAAMi7B,GAASe,OAAOp4B,EAQvB,CAPC,MAAO6O,GACP,MAAM,IAAIpF,MACR7G,EACEolB,EAASuW,eAAiBnjC,EAAE,kBAC5BmQ,EAAQ4C,GAAM,QAASnO,GAAQigB,GAAQW,SAAvCrV,CAAiDuZ,IAGtD,CACDA,EAAQ0Z,OAASn+B,GAAI,UAAWykB,GAChCA,EAAQ2Z,OAASp+B,GAAI,UAAWykB,GAChC,IACE,GAAmB,iBAAR1oB,EACT,MAAM4rB,EAASuW,eAAiBnjC,EAAE,kBACpC,GAAI0pB,EAAQ0Z,QAAU1Z,EAAQ2Z,QAC5B,GAAIriC,EAAM0oB,EAAQe,SAAWzpB,EAAM0oB,EAAQgB,QACzC,MACEkC,EAAS0W,kBACTtjC,EAAE,yDAGD,GAAI0pB,EAAQ0Z,QACjB,GAAIpiC,EAAM0oB,EAAQgB,QAChB,MAAwB,IAApBhB,EAAQgB,QAERkC,EAAS2W,yBACTvjC,EAAE,qCAEwB,IAArB0pB,EAAQgB,QACTkC,EAAS4W,mBAAqBxjC,EAAE,4BAGpC4sB,EAAS6W,oBACTzjC,EAAE,yCAGH,GAAI0pB,EAAQ2Z,QACbriC,EAAM0oB,EAAQe,QAChB,MAAwB,IAApBf,EAAQe,QAERmC,EAAS8W,yBACT1jC,EAAE,oCAEuB,IAApB0pB,EAAQe,QACTmC,EAAS+W,mBAAqB3jC,EAAE,4BAGpC4sB,EAASgX,oBACT5jC,EAAE,mCASX,CALC,MAAOyT,GACP,MAAMxJ,EACJwJ,EACAtD,EAAQ4C,GAAM,QAASnO,GAAQigB,GAAQW,SAAvCrV,CAAiDuZ,GAEpD,CAED,OAAO,CACR,EACDlE,SAAUrV,EACRsI,GAAKxT,GAAI,WAAYuK,GAAK6F,GAAS,WAAY4mB,GAASgB,YACxDxkB,GAAKxT,GAAI,WAAYuK,GAAK6F,GAAS,WAAY4mB,GAASgB,YACxDxkB,GACExT,GAAI,WACJ0S,GAAM5E,GAAM,aAAc5C,EAAQR,EAAKoB,EAAK,cAE9C0H,GACExT,GAAI,WACJ0S,GAAM5E,GAAM,aAAc5C,GpChrBbP,GAAOA,EAAM,GoCgrBamB,EAAK,cAE9CyU,IAEF4Z,OAAQ,SAGV9V,GAAezE,IAEf,MAAMgf,GAAU,CACdz7B,KAAM,UACNq3B,WAAW,EACXrT,QAAS,CAAC1H,EAAMgF,EAAS2C,IACvBprB,OAAOgV,OAAO,CAAE,EAAEyO,EAAM,CACtBvW,KAAQ,OACR,YAAaub,EAAQrE,YACrBjP,KAAQ,GAAGsT,EAAQuB,UACnBf,YAAelqB,EAAE,aACjB4E,MAASi/B,GAAQC,WAAWpa,EAAQ9kB,SAExCk/B,WAAY3zB,EAAQU,EAAO,GAAI,UAAWtM,EAAKwM,EAAK,cACpDuZ,SAAU,SAAUvc,EAAOnJ,EAAOglB,GAChC7b,EAAMnJ,MAAQi/B,GAAQC,WAAWl/B,EAClC,EACDooB,OAAQ,CAACtD,EAASsC,EAAOI,IAAY6S,GAAS,QAAS7S,GACvDoB,YAAa,CAACrB,EAAQzC,KACpBA,EAAQuD,KAAK8W,mBACX,WACA,iBAAiBra,EAAQuB,cAC7BvB,EAAQ9kB,MACPuH,KAAI,EAAGo0B,YAAa,kBAAkB5gB,GAAW4gB,SACjDv6B,KAAK,qBAGH,EAEHo5B,OAAQ,SAGV9V,GAAeua,IAefva,GAb2B,CACzBlhB,KAAM,cACN2kB,QAAS,QACTX,QAAS,CAAC1H,EAAMgF,EAAS2C,IACvBprB,OAAOgV,OACL,CAAE,EACFyO,EACA,CAAEvW,KAAM,QAASvJ,MAAO8kB,EAAQ9kB,OAChC8kB,EAAQ4W,UAAY,CAAEzjB,QAAS,YAEnCmQ,OAAQruB,EAAEqlC,OAiBZ1a,GAZqB,CACnBlhB,KAAM,QACN2kB,QAAS,QACTX,QAAS,CAAC1H,EAAMgF,EAAS2C,IACvBprB,OAAOgV,OAAO,CAAE,EAAEyO,EAAM,CACtBvW,KAAM,QACNvJ,MAAO8kB,EAAQ9kB,QAEnBooB,OAAQruB,EAAEqlC,KACV5E,OAAQ,UAuBV9V,GAlBsB,CACpBlhB,KAAM,SACNgkB,QAAS,CAAC1H,EAAMgF,EAAS2C,IACvBprB,OAAOgV,OACL,CAAE,EACFyO,EACA,CAAEvW,KAAM,SAAUvJ,MAAO8kB,EAAQ9kB,OACjC8kB,EAAQua,OAAS,CAAE,aAAcva,EAAQua,QAE7CjX,OAAQ,CAACtD,EAASsC,EAAOI,IAAY+S,GAAYzV,EAAS0C,EAAS,UACnE9B,SAAU,CAACnP,EAAKvW,EAAOglB,EAAWD,KAC5B1kB,GAAI,OAAQ0kB,KAAUxO,EAAI4D,UAAY4K,EAAQnK,KAAK9I,IACnDzR,GAAI,QAAS0kB,KAAUxO,EAAIvW,MAAQ+kB,EAAQ/kB,MAAM8R,IACrDyE,EAAIsV,UAAUrW,OAAO,gBAAiBuP,EAAQ/kB,MAAM8R,GAAGme,SAAS,MAChE1Z,EAAIsV,UAAUrW,OAAO,gBAAiBuP,EAAQ/kB,MAAM8R,GAAGme,SAAS,KAAK,IAgCzEvL,GA1BsB,CACpBlhB,KAAM,SACN2kB,QAAS,SACTX,QAAS0S,GAET9R,OAAQ,SAAUtD,EAASyC,EAAQH,GACjC,IAAImF,EACCtQ,GAAKC,KAAKG,eAAsC,YAArByI,EAAQmW,UAatC1T,EAAO3M,KAAKkK,EAAQ9kB,OACpBunB,EAAOvB,SAAS,gBAbhBuG,EAAQhK,KAAK2Y,IAAI,EAAGpW,EAAQqW,QAAU,GAEtC5T,EAAOjM,KACL,KACEiR,EACA,uBACAxR,GAAW+J,EAAQ9kB,MAAMud,QACzB,MACAgP,EACA,KAMP,IAeH7H,GAVuB,CACrBlhB,KAAM,UACN2kB,QAAS,UACTX,QAAS0S,GACT9R,OAAQ,SAAUtD,EAASyC,EAAQH,GACjCG,EAAO3M,KAAKkK,EAAQ9kB,MAAMud,QAC1BgK,EAAOvB,SAAS,aACjB,IAmBHtB,GAdqB,CACnBlhB,KAAM,QACN2kB,QAAS,IACTX,QAAS0S,GACT9R,OAAQ,SAAUtD,EAASyC,EAAQH,GACjCG,EAAO3M,KAAKkK,EAAQ9kB,OAKpBga,GAAS8K,EAAQ9kB,MAClB,IAKI,MAAMs/B,GAAO,CAClB97B,KAAM,OACNgkB,QAASjc,EAAQ6uB,GAAcD,IAC/BtqB,KAAMA,GACJ,0BAA0BkL,GAAWlL,GAAMhQ,QAAQ,OAAQ,gBAC7D0/B,WAAYza,IACV,MAAM0a,EAAOrxB,GACX,eACC2W,EAAQ2a,WAEoB,IAAzB3a,EAAQ9kB,MAAMkB,QACZgmB,GAAkB,4BAClB,QACA,SAJF,OAKJpC,GAEF,OAAOzZ,EACLwI,GACED,GAAO,eAAgB,UACvBrI,EACEX,GACE6F,GAAS,WACT1Q,GAAO,CACL0gB,YAAa,SACb7F,KAAM,wCACHkK,EAAQkD,UAAYlD,EAAQkD,SAAS0X,kBACtCtkC,EAAE,gFAEJoI,KAAM,SACNqW,UAAW,gBACX8L,UAAU,EACV0Z,MAAOjkC,EAAE,iBAGbwP,GACE6F,GAAS,SACTlJ,IAAI,CAACo4B,EAAK1+B,IACRlB,GACE,CACEC,MACE8kB,EAAQthB,KACR,MACEshB,EAAQ8a,QAAU,GAAK3+B,EAAI,GAF7B6jB,MAMJ6a,QAMV9rB,GACED,GAAO,iBAAiB,GACxBrI,EACEX,GACE6F,GAAS,WACT1Q,GAAO,CACL0gB,YAAa,SACbjd,KAAM,SACNqW,UAAW,gBACX8L,YACGb,EAAQsB,SACTtB,EAAQ9kB,MAAMkB,OAAS,GACtB4jB,EAAQ+a,aAAe/a,EAAQ2a,YAGlC7kB,KAAM,wCACHkK,EAAQkD,UAAYlD,EAAQkD,SAAS8X,kBACtC1kC,EAAE,mFAIRwP,GACE6F,GAAS,SACTlJ,IAAI,CAACo4B,EAAK1+B,IACRlB,GACE,CACEC,MACE8kB,EAAQthB,KAAO,MAAQshB,EAAQ8a,QAAU,GAAK3+B,GAA9C6jB,MAEJ6a,QAMV3rB,GAAU,CACR7H,EAAK,WACL,CAAC4zB,EAAST,IACD10B,GACL6F,GAAS,SACTlJ,IAAI,CAACo4B,EAAKK,IACRz4B,IAAI,CAAC04B,EAAMC,IACT30B,EACEsI,GACEf,GAAK3G,EAAK,WAAYuT,IACtBvR,GAAM,OAAQ,CAAEmuB,WAAY,GAAGxX,EAAQuB,UAAU6Z,OAEnDrsB,GAAK1H,EAAK,YAAY8zB,GACpB9xB,GAAM,OAAQ,CAAEkxB,MAAOY,EAAKE,SAAWF,MAEzCA,GACE5jC,OAAOgV,OACL,CAAE,EACF0uB,EAAQG,GACR,CACE7Z,GACEvB,EAAQuB,GACR,MACEvB,EAAQ8a,QAAU,GAAKI,GACzB,IACAE,GAEJD,IAEJ9xB,GAAM,cAAe2W,EAAQ8a,QAAU,GAAKI,GAC5C7xB,GAAM,cAAe+xB,GAvBvB30B,CAwBE00B,IAzBJ14B,CA0BEo4B,KAEJL,KAIN10B,GACE6F,GAAS,WACTlJ,IAAI,CAAC64B,EAAKC,IAAUlyB,GAAM,KAAM,GAAG2W,EAAQuB,UAAUga,IAASD,MAEhEx1B,GACE6F,GAAS,SACTlJ,GACEA,IAAI,CAAC04B,EAAMC,EAAQI,KACjB/0B,SACE4C,GAAM,OAAQmxB,GAAKiB,QAAQN,EAAMK,IACjCzsB,GACEE,GAAQ,CACNsL,GACAhU,EAAKc,EAAK,eAAgBiI,IpCl9BrBpJ,EoCk9BiC,EpCl9B1BZ,GAAMA,EAAGY,KoCm9BrB,IAAMsU,GAASghB,EAAMJ,EAAS,OAEhCD,GAAQ9xB,GAAM,QAASmyB,EAAMJ,EAAS,GAAG7Z,GAAI4Z,KAE/CpsB,GACEE,GAAQ,CACNuL,GACA1L,GAAO,cAAe,GACtB,IAAMyL,GAAQihB,EAAMJ,EAAS,OAE/BD,GACEr1B,GACEgK,GAAS,CAAC,OAAQ,gBAClB4rB,GAAU,GAAGF,EAAMJ,EAAS,GAAG7Z,MAAMma,GAAU,MAC/CP,KApBR10B,CAuBE00B,GpCp+BSj1B,KoCq+BZ,MA7IAK,CAgJLm0B,EAAK,EAETe,QAAS,CAACN,EAAMN,IACQ,OAAfM,EAAKjgC,MACR,KACAigC,EAAKQ,UAAiC,IAArBR,EAAKS,aAAqBf,EAAIz+B,OAAS,EACtD,KACA,KAERy/B,aAAcC,IACZ,MAAMC,EAAS1qB,SAASuW,cAAc,MAQtC,OAPAmU,EAAOhV,UAAUtY,IAAI,cACrBstB,EAAOvX,aAAa,eAAgBsX,EAAOngB,aAC3CogB,EAAOvX,aAAa,mBAAoBpQ,QAAQ0nB,EAAOjb,WACnDtlB,GAAI,UAAWugC,KACjBC,EAAOC,UAAYF,EAAOT,QAC1BU,EAAOxa,GAAKua,EAAOva,IAEdwa,CAAM,EAEfE,aAAc30B,GACZD,EAAK,eACLZ,EACEhE,GAAI6E,GAAOwH,GAAO,cAAe,UAAW7H,EAAGI,EAAK,QACpDA,EAAK,YAEPZ,EAAQhE,GAAIwE,GAAII,EAAK,aAEvB60B,YAAa,CAACC,EAAMhgC,KAClB,MAAMigC,EAAkBD,EAAK1gC,MAAM,EAAGU,EAAI,GAC1C,OAAOsK,EACLY,EAAK,SACL5E,GAAIgE,GAAQ8a,GAAM,GAAGA,WAAYla,EAAK,MAAOO,IAC7CsqB,GAAAA,MAAMG,GACNx3B,EAAKwU,GAAO,CAAC,EAAG,QAAS,OACzBtI,EALKN,CAML21B,EAAgB,EAEpBjB,KAAMA,IACJ,MAAMzW,EAAMyW,EAAKkB,KACXC,EACI,OAAR5X,EACIrT,SAASoY,cAAc,cACvBpY,SAASuW,cAAclD,GAI7B,MAHY,OAARA,IACF4X,EAAO/a,GAAK,GAAG4Z,EAAK5Z,YAEf+a,CAAM,EAEfC,kBAAmB,CAACD,EAAQnB,KACR,OAAdA,EAAKkB,OACS,OAAdlB,EAAKkB,MAAeC,EAAO9X,aAAa,QAAS,OACjD2W,EAAKQ,SAAW,EAAGW,EAAO9X,aAAa,UAAW2W,EAAKQ,UACtDW,EAAO7Q,gBAAgB,WACxB0P,EAAKqB,QAASF,EAAO9X,aAAa,UAAW2W,EAAKqB,SACjDF,EAAO7Q,gBAAgB,gBACA,IAAjB0P,EAAKE,QACdiB,EAAO9X,aAAa,cAAe2W,EAAKE,SACrCiB,EAAO7Q,gBAAgB,eAC5B6Q,EAAOvV,UAAUtY,IAAI,cAAgB0sB,EAAKS,YAAc,IACrC,KAAfT,EAAKjgC,OACPohC,EAAOvV,UAAUrW,OACf,QACqB,UAArByqB,EAAKxf,aAA0C,KAAfwf,EAAKjgC,OAGzCohC,EAAOvV,UAAUtY,IAAI,eAAiB0sB,EAAKxf,cAhBZ2gB,GAmBjChZ,OAAQ,CAACtD,EAASsC,EAAOI,KACvB,MAAMD,EAASxtB,EAAE,UAAU8lB,GAAc2H,eAYzC,GAV6B,KAD7B1C,EAAUwa,GAAKC,WAAWza,IACd9kB,MAAMkB,QAChBqmB,EAAOvB,SAAS,YAEdlB,EAAQyc,SACVpa,GACErC,EAAQyc,QACRna,EACAG,GAGAzC,EAAQ+a,YAAa,CAEvB,MAAM2B,EAAQrrB,SAASuW,cAAc,SAC/B+U,EAAKtrB,SAASuW,cAAc,MAClC8U,EAAMzhC,OAAO0hC,GACbla,EAAOxnB,OAAOyhC,GACV1c,EAAQ9kB,MAAMkB,OAAS,GACzBugC,EAAG1hC,UAAU+kB,EAAQib,QAAQx4B,IAAI+3B,GAAKqB,cACzC,CACD,MAAMe,EAASvrB,SAASuW,cAAc,SACtCnF,EAAOxnB,OAAO2hC,GACd,MAAMC,EAAarC,GAAKyB,aAAajc,GA+BrC,OA9BAA,EAAQ9kB,MAAMQ,SAAQ,SAAUm/B,EAAK1+B,EAAGggC,GAGtC,MAAMW,EAAwBtC,GAAK0B,YAAYC,EAAMhgC,GAC/C4gC,EAAQ1rB,SAASuW,cAAc,MAClB,IAAfiT,EAAIz+B,SACR2gC,EAAMhW,UAAUrW,OAAO,cAA+B,OAAhBmqB,EAAI,GAAGwB,MAC7CO,EAAOzU,YAAY4U,GACnBlC,EAAIn/B,SAAQ,SAAUy/B,EAAM6B,GAC1B,MACMR,EAAU,CADgB,OAAdrB,EAAKkB,MAAgBS,EACXD,EAAWG,IAAO/yB,OAAOmK,SAAS9X,KAAK,KAC7D2gC,EAAkB,IACnB9B,EACHqB,WAEF,GAAmB,OAAfrB,EAAKjgC,MAAgB,CACvB,MAAMohC,EAAS9B,GAAKW,KAAKA,GACzBX,GAAK+B,kBAAkBD,EAAQW,GAC/BF,EAAM5U,YAAYmU,GAClBja,GACE8Y,EACAnb,EAAQwC,OACR8Z,EAEZ,MACUS,EAAM5U,YAAY9W,SAASoY,cAAc,cAEnD,IACA,IAEWx0B,EAAEwtB,EAAO,EAElBqB,YAAa,CAACrB,EAAQzC,KAOpB,GAAqB,WANCA,EAAQ2a,WAED,IAAzB3a,EAAQ9kB,MAAMkB,QACZgmB,GAAkB,4BAClB,QACA,SAJF,QAK0B,CAC5B,MAAM8a,EAAgB,oEACpBld,EAAQthB,OACPy+B,UAAU,gBACVnd,EAAQkD,UAAYlD,EAAQkD,SAASka,eAAkB9mC,EAAE,6BAE5DmsB,EAAOnoB,IAAI,GAAG+/B,mBAAmB,WAAY6C,EAE9C,GAEHtc,SAAU,CAACyc,EAAQniC,EAAOglB,EAAWE,KAEnC,MAAMJ,EAAU/qB,EAAEwe,KAAK4pB,EAAQ,WACzBC,EAAM72B,EACV+zB,GAAKC,WACLpxB,GAAM,QAAS+W,EAAe,MAAE3c,MAChC4F,GAAM,UAAW+W,EAAiB,QAAE3c,MAH1BgD,CAIVuZ,GAEI3B,EAAMmc,GAAKC,WAAWza,GAE5B,IACKqd,EAAO7rB,iBACR,2BAA2B6M,EAAInjB,MAAMkB,OAAS,OAEhDV,SAAQm/B,GAAOA,EAAIhQ,WAErB,IAAIwS,EAAO7rB,iBAAiB,aAAa9V,SAAQm/B,IAC/C,IAAIM,EACJ,KAASA,EAAON,EAAI/P,WAAWzM,EAAI4c,QAAQ7+B,QAAU++B,GACnDA,EAAKtQ,QACN,MAIAlc,GAAO2uB,EAAIrC,QAAS5c,EAAI4c,UACH,IAArBqC,EAAIpiC,MAAMkB,QAAqC,IAArBiiB,EAAInjB,MAAMkB,QACf,IAArBkhC,EAAIpiC,MAAMkB,QAAqC,IAArBiiB,EAAInjB,MAAMkB,UAGrC,IAAIihC,EAAO7rB,iBAAiB,gBAAgB9V,SAAQ6hC,GAClDA,EAAU1S,WAGRxM,EAAI0c,aAAe1c,EAAInjB,MAAMkB,OAAS,GACxCiiB,EAAI4c,QACDv/B,SAAQ,SAAUogC,GACjBuB,EAAO5qB,cAAc,YAAYxX,OAAOu/B,GAAKqB,aAAaC,GACtE,KAGI,MAAMe,EAAarC,GAAKyB,aAAa5d,GACrCA,EAAInjB,MAAMQ,SAAQ,CAACm/B,EAAK2C,EAAMrB,KAC5B,IAAIY,EAAQM,EAAO5qB,cAAc,sBAAsB+qB,EAAO,MAChD,OAAVT,IACFA,EAAQ1rB,SAASuW,cAAc,MAC/ByV,EAAOI,QAAQ,GAAGxiC,OAAO8hC,IAE3BA,EAAMhW,UAAUrW,OAAO,cAA+B,OAAhBmqB,EAAI,GAAGwB,MAC7C,MAAMS,EAAwBtC,GAAK0B,YAAYC,EAAMqB,GACrD3C,EAAIn/B,SAAQ,CAACy/B,EAAM6B,KACjB,MAAMU,EAAYL,EAAO5qB,cAAc,QAAQ0oB,EAAK5Z,QAC9Coc,EAAUL,EAAIpiC,MAAMsiC,IAASF,EAAIpiC,MAAMsiC,GAAMR,GAE7CR,EAAU,CADgB,OAAdrB,EAAKkB,MAAgBS,EACXD,EAAWG,IAAO/yB,OAAOmK,SAAS9X,KAAK,KAC7D2gC,EAAkB,IACnB9B,EACHqB,WAEIoB,EAAOb,EAAMjS,WAAWkS,GAC9B,IAAKY,EAAM,CAET,MAAMtB,EAAS9B,GAAKW,KAAKA,GAIzB,OAHAX,GAAK+B,kBAAkBD,EAAQW,GAC/BF,EAAM5U,YAAYmU,QAClBja,GAAS8Y,EAAMnb,EAAQwC,OAAQ8Z,EAEhC,CACD,GACEnB,EAAKxf,cAAgBgiB,EAAQhiB,aAC7Bwf,EAAKkB,OAASsB,EAAQtB,KACtB,CAEA,IAAIC,EAgBJ,OAfInB,EAAKkB,OAASsB,EAAQtB,MACxBC,EAAS9B,GAAKW,KAAKA,GACnByC,EAAKC,YAAYvB,KAGjBA,EAASsB,EACS,OAAdzC,EAAKkB,OACPC,EAAOvV,UAAU8D,OAAO,eAAiB8S,EAAQhiB,aACjD2gB,EAAOjnB,UAAY,UAGL,OAAd8lB,EAAKkB,OACP7B,GAAK+B,kBAAkBD,EAAQW,GAC/B5a,GAAS8Y,EAAMnb,EAAQwC,OAAQ8Z,IAGlC,CACD,GAAkB,OAAdnB,EAAKkB,KAAe,OAExB7B,GAAK+B,kBAAkBqB,EAAMX,GAC7B,MAAMa,EAAc7oC,EAAEwe,KAAKiqB,EAAW,WACjCI,GACD3C,EAAKjgC,QAAU4iC,EAAY5iC,OAC7BjG,EAAEyoC,GAAW7b,cACX,CACEtqB,OAAOgV,OAAO,CAAE,EAAEuxB,EAAa,CAC7B5iC,MAAOigC,EAAKjgC,MACZ4a,KAAMqlB,EAAKrlB,QAGfoK,EAEH,GACD,GACF,EAEJmB,WAAY,CAACmZ,EAAM/C,KAAP,EACZ3W,WAAY,CAAC0Z,EAAM3Z,KACjB2Z,EAAKzT,UAAUrW,OAAO,cAAemQ,GACrC,IAAI2Z,EAAKhpB,iBAAiB,4BAA4B9V,SAAQ2I,IAC5DA,EAAMqzB,SACJ7W,GAAYpa,EAAQa,GAAO8M,QAASyG,GAAY5T,GAAI0d,GAAxCle,CAAoDpC,EAAM,GACxE,EAEJqxB,OAAQ,SAGV9V,GAAe4a,IAEfvlC,EAAEqQ,GAAGqO,OAAO,CAIV6lB,QAAS,SAAUxZ,GACjBA,EAAUA,GAAW,GACrB,IACE+d,EADc,IAEdC,EAAQ,KACRC,EAAK7iC,KACL9D,EAAMi7B,GAASgB,UAAU0K,EAAG3mC,OAC5B0qB,EAAQ/sB,EAAEmG,MACV8iC,EAAUlc,EA0BZ,SAASmc,EAAOC,GACd,IAAIC,EAAQ/mC,EFxxCWqG,EAAKy4B,EAAK1Y,EEyxCjC,IACE2gB,EAAS9L,GAASe,OAAO2K,EAAG3mC,MAI7B,CAHC,MAAO+gB,GACP2J,EAAMqW,UAEP,MACqB,IAAXgG,IAGX/mC,GACW,IAAT8mC,EACI7E,WAAW8E,EAASD,IFpyCHzgC,EEsyCf47B,WAAW8E,EAASD,GFtyCAhI,EEuyCpBpW,EAAQe,QFvyCiBrD,EEwyCzBsC,EAAQgB,aFvyCF,IAAPoV,QAAoC,IAAP1Y,EAA2B/f,OACjD,IAAPy4B,EAA2B3Y,KAAK2Y,IAAI1Y,EAAK/f,QAClC,IAAP+f,EAA2BD,KAAKC,IAAI0Y,EAAKz4B,GAChDy4B,IAAQ1Y,EAAY0Y,EACjB3Y,KAAKC,IAAID,KAAK2Y,IAAI1Y,EAAK/f,GAAMy4B,KEqyC9BgD,QAAQpZ,EAAQqZ,WAAa,GAE/B4E,EAAG3mC,IAAIi7B,GAASgB,UAAUj8B,IAG1B0qB,EAAMqW,WAGF4F,EAAGxqB,KAAK,YAAcwqB,EAAG3mC,OAAO2mC,EAAG3sB,QAAQ,UAC/C0Q,EAAMvO,KAAK,SAAUuO,EAAM1qB,OAC5B,CAsCD,SAASgnC,IACP,IAAI7hB,EAAQxnB,EAAEmG,MACVgjC,EAAO3hB,EAAM8hB,SAAS,eAAiB,GAAK,EAChDP,EAAQ7jC,OAAO0c,YAAW,WACxBsnB,EAAOC,GACHL,EAAW,KAAIA,GAAsB,IACzCthB,EAAMnL,QAAQ,YACf,GAAEysB,EACJ,CAED,SAASS,IAEPL,EADWlpC,EAAEmG,MAAMmjC,SAAS,eAAiB,GAAK,EAEnD,CAED,SAASE,IAGP,OAFAtkC,OAAOukC,aAAaV,GACpBD,EApHc,KAqHP,CACR,CAYD,OAnEA/b,EACGvO,KAAK,SAAUnc,GACfA,IAAIA,GACJ0d,GAAG,WAAW,SAAUjL,GACvB,IAAI1S,EAAM0S,EAAE40B,QACA,KAARtnC,GAAsB,KAARA,GAEhB8mC,EADmB,KAAR9mC,GAAc,EAAI,GAGnB,KAARA,GACF8mC,EAAO,EAEjB,IACOnpB,GAAG,SAAS,WACX,IAAIqpB,EACJ,IACEA,EAAS9L,GAASe,OAAO2K,EAAG3mC,MAK7B,CAJC,MAAO+gB,GAEjB,CAAkB,QACO,IAAXgmB,GAAcrc,EAAM1qB,IAAI,GAC7B,CACT,IACO0d,GAAG,QAAQ,WACV,IAAI4pB,EAAS5c,EAAM1qB,MACnB6mC,EAAO,GACHnc,EAAM1qB,QAAUsnC,IAClB5c,EAAMd,SAAS,+BACf/mB,OAAO0c,YAAW,WAChBmL,EAAMZ,YAAY,8BACnB,GAAE,MAGLY,EAAMvO,KAAK,SAAUuO,EAAM1qB,MACnC,KAxFuD,IAAxC8qB,GAAkB,oBA+GP8b,EA5GtB,SAAoBW,EAAQ7e,GAiB1B,OAXA6e,EACGxa,QAAQ,kDACRya,MAND,iGAOFD,EAAO75B,QAAQ,WAAWyO,KAAK,UAAWuM,GAC1C6e,EACGvgC,OACAzD,KAAK,4BACLma,GAAG,QAASwpB,GACZxpB,GAAG,YAAaspB,GAChBtpB,GAAG,mBAAoBypB,GAEnBI,EAAOva,QACf,CA0F+Bya,CAAW/c,EAAOhC,IAElDkV,GAAgB,CACd7wB,MAAO2d,EAAM1nB,IAAI,GACjB2P,OAAQsoB,GAASe,OACjBp4B,MAAO8kB,EAAQ9kB,QAEjB8mB,EAAMhN,GAAG,UAAU,SAAUgqB,EAAQvrB,GAC9BpM,EAAK,mBAAoBoM,IAAOuO,EAAMqW,UACjD,IACW6F,CACR,ICp3CyBz3B,EAC1BsI,GAAKqF,QAASvZ,EAAKiU,GAAO,WAAW,KACrCzH,EAAK,WCDP,MAAM43B,GAAQ,CAAC12B,EAAQ22B,IAAY32B,EAAO42B,OAAOD,GAGjD,SAASE,GAAsBC,EAAU5X,GACvC,OAAuB,GAAnB4X,EAASjjC,WACTijC,EAAS,GAAG5X,OAASA,KACC,YAAtB4X,EAAS,GAAGpmB,QACTmmB,GAAsBC,EAAS5jC,MAAM,GAAI4jC,EAAS,GAAG5X,QAC9D,CACA,SAAS6X,GAAiBD,GACxB,OAAOD,GAAsBC,EAAS5jC,MAAM,GAAI4jC,EAAS,GAAG5X,MAC9D,CAEA,MAAM8X,GAAoBF,GACJ,aAApBA,EAASpmB,OAAwB,uBAAyB,GAEtDumB,GAAoBH,GACvBA,EAASI,UAAiB,sBAAsBJ,EAASK,gBAApC,GAExB,SAASC,GAAcN,EAAU5X,EAAQ,EAAGmY,GAC1C,OAAMP,aAAoB9hC,MAgCH,GAAnB8hC,EAASjjC,OACJ,QAAU6iC,GAAM,KAAKY,GAASp7B,aAAcgjB,GAEnDkY,GACEN,EAAS,GACT5X,EACA6X,GAAiBD,EAAUA,EAAS,GAAG5X,QACrCkY,GAAcN,EAAS5jC,MAAM,GAAI4jC,EAAS,GAAG5X,QArC9C4X,EAAS5X,MAAQA,EACdwX,GACE,IAAIY,GAASp7B,YAAY+6B,GAAkBH,aAAoB,CAC7DO,EAAoB,oBAAsB,GAC1CP,EAASpmB,QAERhP,OAAOmK,SACP9X,KAAK,QAAQijC,GAAkBF,MAClCA,EAAS5X,MAAQA,GAEnB4X,EAAS5X,MAAQA,EACfwX,GAAM,UAAUY,GAASp7B,QAASgjB,EAAQ4X,EAAS5X,OACnD,OAAO+X,GAAkBH,aAAoBA,EAASpmB,UAAUsmB,GAAkBF,MAClF,OAAOG,GAAkBH,aAAoB,CAC3CO,EAAoB,oBAAsB,GAC1CP,EAASpmB,QAERhP,OAAOmK,SACP9X,KAAK,QAAQijC,GAAkBF,OACxC,UACuB,OAArBA,EAASS,QAAmB,YAAc,8DAE1CT,EAASS,YACNN,GAAkBH,aAAoBA,EAASS,mBAClDT,EAASpmB,oCACmBhD,GAC5BopB,EAASU,YAAYtnB,yBAa7B,CACO,MAAMunB,GAAkBX,IAC7B,IAAI7oB,EAAOmpB,GAAcN,GAEzB,MAAI,CAAC,IAAK,KAAKp0B,SAASuL,EAAK9Z,OAAO,IAC3B,eAAiB2iC,EAASpmB,QAAU,IAAM,KAAOzC,EAAO,QAC1DA,CAAI,EAEb,SAASypB,GAAeZ,EAAU5X,EAAQ,EAAGmY,GAE3C,OAAMP,aAAoB9hC,MAsBH,GAAnB8hC,EAASjjC,OAAoB,GAE/B6jC,GACEZ,EAAS,GACT5X,EACA6X,GAAiBD,EAAUA,EAAS,GAAG5X,QACrCwY,GAAeZ,EAAS5jC,MAAM,GAAI4jC,EAAS,GAAG5X,OA1BhD,WACsB,OAArB4X,EAASS,QAAmB,YAAc,IAC3C,WACAT,EAASpmB,OAHT,cAMAomB,EAASS,QANT,YASAT,EAASS,QACT,MACCF,GAAyC,aAApBP,EAASpmB,OAAwB,WAAa,IACpE,KACqB,aAApBomB,EAASpmB,OAAwB,WAAa,IAC/C,IACAgmB,GAAM,SAAkB,EAARxX,GAChBxR,GAAWopB,EAASU,YAAYtnB,QAChC,WAWN,CAEA,MAAMynB,GAAmBz5B,GACvBtK,IAAa,IAAPA,EAAW8oB,IAAW9oB,GAC5B8L,IAAU,EAAGgR,YAAwB,WAAXA,KAGrB,IAAI4mB,GAAW,IAAA,WACpB,IAAIM,EAAY,GAyBhB,SAASC,EAAWf,GAClB,MAAMgB,EAAeH,GAAiBb,GACtCpqC,EAAE,gBAAgBwN,KAAI,CAACtG,EAAG+sB,KACxB,MAAMoX,EAAYpX,EAAEtX,QAAe,MAC7B2uB,EAAWz4B,EAAO,CACtB,CAAC6G,GAAO,UAAWlT,GAAM,EAAG4kC,IAC5B,CAAC1xB,GAAO,SAAUlT,GAAM4kC,EAAcpb,MACtC,CAAC/d,EAAGf,IAHW2B,CAIdw4B,GAEG9pB,EAAOwpB,GAAgBO,EAASlB,IACtCpqC,EAAEi0B,GAAGjuB,OACH,IAAI4kC,GAASp7B,4CAA4C+R,MAASqpB,GAASp7B,QAC5E,IAEHxP,EAAE,uBAAuBisB,SAAS,QAClCjsB,EAAE,8BAA8BisB,SAAS,aAC1C,CACD,SAASsf,EAAenB,GACtB,GAAIA,EAASjjC,OAAQ,CACnB,IAAIoa,EAAOypB,GAAeZ,EAAU,GACpCpqC,EAAE,yBAAyBgG,OAAO,WAAaub,EAAO,YACvD,CACF,CAED,OAjDApb,KAAKqJ,KAAO,KACZrJ,KAAKqlC,KAAO,SAAcpB,IACxBA,EAAWA,GAAYc,KACTA,EAAYd,GAC1BpqC,EACE,gBAAgB4qC,GAASp7B,uDACzBomB,SACEwU,EAASjjC,SAE2D,IAApEnH,EAAE,uDAAuDmH,QAIzDgkC,EAAWf,GACXmB,EAAenB,KAGXpqC,EAAE,gBAAgByrC,GAAG,aAAaN,EAAWf,GAE7CpqC,EAAE,yBAAyByrC,GAAG,aAAaF,EAAenB,IAGtE,EA2BSjkC,IACR,ECzKM,MAAMulC,GAAW,IAAMjtB,GAAO,aAAe,CAAE,ECSpDktB,GAAwB,mBAExBC,GAAkC,6BAMlCC,GAAyB,oBAWzBC,GAAyB,oBAEzBC,GAAsB,iBAEtBC,GAAwB,mBAGxBC,GAAqB,gBAKrBC,GAAuB,kBAEvBC,GAAoB,eAYpBC,GAAsB,iBAEtBC,GAAqB,gBAcjBC,GAAW,CACfC,MAAO,CAACL,IACRM,KAAM,CACJL,GACAC,GACAC,GACAR,GACAK,GACAD,GACAD,IAIFS,cAAe,CACbN,GA7EgC,kBA+EhCC,GApCmB,gBAUC,iBARF,eAUD,cA8BjBC,GACAR,GACAD,GACAD,GACAO,GACAD,GACAD,GACAF,GAhFuB,qBAwFzBY,OAAQ,CAACX,IACTY,QAAS,CACPN,GACAR,GACAD,GACAD,GACAM,GACAD,IAGFY,YAAa,CA3FM,cA2Fab,GAAqBD,IACrDh5B,IAAK,IAGM+5B,GAAc,IACzBr7B,EACEuI,GACE3H,EAAK,eACLZ,GAAQs7B,GAAQR,GAASQ,IAASR,GAAc,KAAGl6B,EAAK,UAE1Ds5B,GALFl6B,CAME,MChIJ,GCKA,SAAWxR,GACT,IAAIq0B,EAAKr0B,EAAE+sC,SAAW,SAAU17B,EAAG3C,EAAGqH,GACpC/V,EAAEkF,QAAQ6nC,SAAS17B,EAAG3C,EAAGqH,EAC7B,EAgHE,SAASgD,EAAK1H,GACZ,MAAmB,iBAALA,EAAgBA,EAAI,CAAE27B,IAAK37B,EAAG47B,KAAM57B,EACnD,CAjHDgjB,EAAE6Y,SAAW,CACXC,KAAM,KACNC,SAAU9I,WAAWtkC,EAAEqQ,GAAGg9B,SAAW,IAAM,EAAI,EAC/CC,OAAO,GAETjZ,EAAEnvB,OAAS,SAAUmM,GACnB,OAAOrR,EAAEkF,QAAQqoC,aACrB,EACEvtC,EAAEqQ,GAAGk9B,YAAc,WACjB,OAAOpnC,KAAKqH,KAAI,WACd,IAAI6D,EAAIlL,KASR,MAPKkL,EAAE8d,WAMI,GALPnvB,EAAEwtC,QAAQn8B,EAAE8d,SAASlX,cAAe,CAClC,SACA,YACA,OACA,UAEM,OAAO5G,EACnB,IAAI3C,GAAK2C,EAAEo8B,eAAiBp8B,GAAG+K,UAAY/K,EAAEq8B,eAAiBr8B,EAC9D,MAAO,UAAUlG,KAAKkU,UAAUsuB,YAA8B,cAAhBj/B,EAAEk/B,WAC5Cl/B,EAAEmR,KACFnR,EAAEm/B,eACZ,GACA,EACE7tC,EAAEqQ,GAAG08B,SAAW,SAAUj4B,EAAGmE,EAAGC,GAa9B,MAZgB,iBAALD,IACTC,EAAID,EACJA,EAAI,GAEU,mBAALC,IAAiBA,EAAI,CAAE40B,QAAS50B,IAClC,OAALpE,IAAYA,EAAI,KACpBoE,EAAIlZ,EAAE0e,OAAO,CAAA,EAAI2V,EAAE6Y,SAAUh0B,GAC7BD,EAAIA,GAAKC,EAAEk0B,SACXl0B,EAAE60B,MAAQ70B,EAAE60B,OAAS70B,EAAEi0B,KAAKhmC,OAAS,EACjC+R,EAAE60B,QAAO90B,GAAK,GAClBC,EAAE2sB,OAAS9sB,EAAKG,EAAE2sB,QAClB3sB,EAAErI,KAAOkI,EAAKG,EAAErI,MACT1K,KAAKonC,cACTzgB,MAAK,WACJ,GAAS,MAALhY,EAAJ,CACA,IAGEk5B,EAHEjgB,EAAI5nB,KACN8nC,EAAQjuC,EAAE+tB,GACVmgB,EAAOp5B,EAEPiR,EAAO,CAAE,EACTooB,EAAMF,EAAMxC,GAAG,aACjB,cAAeyC,GACb,IAAK,SACL,IAAK,SACH,GAAI,gCAAgC/iC,KAAK+iC,GAAO,CAC9CA,EAAOn1B,EAAKm1B,GACZ,KACD,CAED,KADAA,EAAOluC,EAAEkuC,EAAM/nC,OACLgB,OAAQ,OACpB,IAAK,UACC+mC,EAAKzC,IAAMyC,EAAKE,SAAOJ,GAAQE,EAAOluC,EAAEkuC,IAAOrI,UAEvD7lC,EAAE8sB,KAAK5T,EAAEi0B,KAAKxlC,MAAM,KAAK,SAAUT,EAAGmK,GACpC,IAAI3C,EAAS,KAAL2C,EAAW,OAAS,MAC1Bg9B,EAAM3/B,EAAEuJ,cACR7V,EAAM,SAAWsM,EACjB25B,EAAMta,EAAE3rB,GACRqmB,EAAM4L,EAAE5L,IAAIsF,EAAG1c,GACjB,GAAI28B,EACFjoB,EAAK3jB,GAAO4rC,EAAKK,IAAQF,EAAM,EAAI9F,EAAM4F,EAAMpI,SAASwI,IACpDn1B,EAAEo1B,SACJvoB,EAAK3jB,IAAQwG,SAASslC,EAAKK,IAAI,SAAW7/B,KAAO,EACjDqX,EAAK3jB,IAAQwG,SAASslC,EAAKK,IAAI,SAAW7/B,EAAI,WAAa,GAE7DqX,EAAK3jB,IAAQ8W,EAAE2sB,OAAOwI,IAAQ,EAC1Bn1B,EAAErI,KAAKw9B,KACTtoB,EAAK3jB,IAAQ8rC,EAAU,KAAL78B,EAAW,QAAU,YAAc6H,EAAErI,KAAKw9B,QACzD,CACL,IAAIt4B,EAAIm4B,EAAKG,GACbtoB,EAAK3jB,GACH2T,EAAEvP,OAAwB,KAAfuP,EAAEvP,OAAO,GAAa89B,WAAWvuB,GAAK,IAAO0S,EAAM1S,CACjE,CACGmD,EAAEo0B,OAAS,QAAQniC,KAAK4a,EAAK3jB,MAC/B2jB,EAAK3jB,GAAO2jB,EAAK3jB,IAAQ,EAAI,EAAIomB,KAAK2Y,IAAIpb,EAAK3jB,GAAMqmB,KAClDvhB,GAAKgS,EAAE60B,QACN1F,GAAOtiB,EAAK3jB,IAAMosC,EAAQt1B,EAAEu1B,qBACzB1oB,EAAK3jB,GAExB,IACQosC,EAAQt1B,EAAE40B,QA9CY,CA+CtB,SAASU,EAAQn9B,GACf48B,EAAMO,QACJzoB,EACA9M,EACAC,EAAEw1B,OACFr9B,GACE,WACEA,EAAExK,KAAKV,KAAM+nC,EAAMh1B,EACpB,EAEN,CACT,IACOy1B,KACP,EACEta,EAAE5L,IAAM,SAAUpX,EAAG3C,GACnB,IAAIqH,EAAS,KAALrH,EAAW,QAAU,SAC3BkgC,EAAS,SAAW74B,EACtB,IAAK/V,EAAEqR,GAAGo6B,GAAG,aAAc,OAAOp6B,EAAEu9B,GAAU5uC,EAAEqR,GAAG0E,EAAEkC,iBACrD,IAAI8V,EAAI,SAAWhY,EACjBwL,EAAOlQ,EAAEq8B,cAAcG,gBACvBhuB,EAAOxO,EAAEq8B,cAAc7tB,KACzB,OAAO2I,KAAKC,IAAIlH,EAAKqtB,GAAS/uB,EAAK+uB,IAAWpmB,KAAK2Y,IAAI5f,EAAKwM,GAAIlO,EAAKkO,GACzE,CAIC,CAtHD,CAsHGhuB,QD3HC,OAAQmF,OACV,KAAM,wBAwDRlF,EAAE,QAAQmsB,YAAY,SAEtB,MAAMgB,GAAoBrL,GAAWI,GAAM,kBAS3CliB,EAAEklB,WAAa,SAAU7D,GACvB,IAAIwtB,EAAS,CAAE9nC,MAAO7B,OAAOof,SAASna,QAAU,IAC9CmT,EAAS,CAAA,EAyBX,MAvBuB,iBAAZ+D,IACTA,EAAU,CAAEta,MAAOsa,IAErBrhB,EAAE0e,OAAOmwB,EAAQ7uC,EAAEklB,WAAY7D,GAC/BwtB,EAAO9nC,MAAQ8nC,EAAO9nC,MAAMjB,QAAQ,MAAO,IAE3C9F,EAAE8sB,KAAK+hB,EAAO9nC,MAAMY,MAAMknC,EAAOC,YAAY,SAAU5nC,EAAGyd,GACxD,IAAIoqB,EAAOpqB,EAAMhd,MAAM,KACrBvF,EAAMysC,EAAO/mC,OAAOinC,EAAKzlC,QAAS,MAAM/D,WACxCU,EAAQ4oC,EAAO/mC,OAAOinC,EAAK5nC,OAAS4nC,EAAK1nC,KAAK,KAAO,KAAMjF,IAG3DysC,EAAOG,WAAW7jC,KACd0jC,EAAOG,WAAW7jC,KAAK/I,GACvBysC,EAAOG,WAAW5sC,KAEtBkb,EAAOlb,GAAOkb,EAAOlb,IAAQ,GAC7Bkb,EAAOlb,GAAKgF,KAAKnB,IAEjBqX,EAAOlb,GAAO6D,CAEpB,WACSqX,EAAO,IACPA,CACT,EACAtd,EAAEklB,WAAWpd,OAAS9H,EAAEklB,WAAW+pB,eAAiB,SAAU37B,GAC5D,OAAOpL,oBAAoBoL,GAAU,IAAIxN,QAAQ,MAAO,KAC1D,EACA9F,EAAEklB,WAAW8pB,WAAa,WACxB,OAAO,CACT,EACAhvC,EAAEklB,WAAW4pB,UAAY,IAGzB9uC,EAAEoc,UAAU2D,GAAG,QAAS,uBAAuB,WAC7C,IAAIgN,EAAQ/sB,EAAEmG,MAEVmnC,EAAQ1kC,SAASmkB,EAAM3a,KAAK,cAE5ByO,EAAOkM,EAAM1qB,MAKjB,GAHYwe,EAAK1Z,OAGLmmC,EAAO,CAEjB,IAAI4B,EAAWruB,EAAKmH,OAAO,EAAGslB,GAG9BvgB,EAAM1qB,IAAI6sC,GACVniB,EAAMd,SAAS,+BACf/mB,OAAO0c,YAAW,WAChBmL,EAAMZ,YAAY,8BACnB,GAAE,IACJ,CACH,IAEG,IAACgjB,GAAK,CAAEvzB,QAAMsG,SAKjB,SAASktB,GAAgB/9B,EAAG3C,GAC1B,IAAIxH,EAAG+sB,EAAGlG,EAMV,IAJA1c,EAAIA,EAAE4G,cAActQ,MAAM,SAC1B+G,EAAIA,EAAEuJ,cAActQ,MAAM,SAC1BssB,EAAIzL,KAAK2Y,IAAI9vB,EAAElK,OAAQuH,EAAEvH,QAEpBD,EAAI,EAAGA,EAAI+sB,EAAG/sB,IAQjB,GAPA6mB,EAAI1c,EAAEnK,GAAKwH,EAAExH,GACTmoC,MAAMthB,KACWA,EAAf1c,EAAEnK,KAAOwH,EAAExH,GAAQ,EACdmK,EAAEnK,GAAKwH,EAAExH,IACX,EACI,GAEH,IAAN6mB,EAAS,OAAOA,EAGtB,OAAO1c,EAAElK,OAASuH,EAAEvH,MACtB,CAEA,SAASmoC,GAAkBl9B,EAAMf,EAAG3C,GAClC,OAAO0gC,GAAgB5pC,OAAO6L,EAAEe,IAAQ5M,OAAOkJ,EAAE0D,IACnD,CA+FA,IACMm9B,GA1FNvvC,GAAE,WACAA,EAAEC,WAAWiB,YACXlB,EAAE0e,QACA,EACA1e,EAAEC,WAAWioB,UACb,CACEsnB,SAAU,GACVC,YAAY,EACZC,aAAa,EACbC,UAAW,eAEbxiB,GAAkB,wBAA0B,CAAE,EAC9C,CAAEyiB,UAAW,aAGnB,IAQA5vC,EAAEqQ,GAAGw/B,MAAQ,SAAUp3B,GACrB,OAAOtS,KAAK4nC,OAAM,WAChB,IAAIvY,EAAKrvB,KACTjB,OAAO0c,YAAW,WAChB,OAAO5hB,EAAEw1B,GAAIsa,SACd,GAAEr3B,EACP,GACA,EAEAzY,EAAEqQ,GAAG1G,KAAO,WACV,OAAOxD,KAAK4pC,UAAU/vC,EAAEgwC,UAAU,GAAGrmC,KAAKkP,MAAM1S,KAAMsC,YACxD,EAEAzI,EAAEqQ,GAAGqO,OAAO,CACVuxB,cAAe,SAAUC,GACvB,OAAO/pC,KAAK2mB,MAAK,WACf,GAAI1Q,SAAS+zB,UAEXhqC,KAAKyK,QACKwL,SAAS+zB,UAAUC,cACzBvvB,KAAOqvB,EACX/pC,KAAKyK,aACA,GAAIzK,KAAKkqC,gBAAyC,KAAvBlqC,KAAKkqC,eAAuB,CAE5D,IAAIC,EAAWnqC,KAAKkqC,eAChBE,EAASpqC,KAAKqqC,aACdC,EAAYtqC,KAAKsqC,UACrBtqC,KAAKF,MACHE,KAAKF,MAAMyqC,UAAU,EAAGJ,GACxBJ,EACA/pC,KAAKF,MAAMyqC,UAAUH,EAAQpqC,KAAKF,MAAMkB,QAC1ChB,KAAKyK,QACLzK,KAAKkqC,eAAiBC,EAAWJ,EAAQ/oC,OACzChB,KAAKqqC,aAAeF,EAAWJ,EAAQ/oC,OACvChB,KAAKsqC,UAAYA,CACzB,MACQtqC,KAAKF,OAASiqC,EACd/pC,KAAKyK,QAEP,OAAOzK,IACb,GACG,EACDwqC,cAAe,WACb,IAAInb,EAAKrvB,KAAKd,IAAI,GAClB,GAAImwB,EACF,GAAiC,iBAAtBA,EAAG6a,eACX7a,EAAG6a,eAAiB,EAAK7a,EAAGgb,aAAehb,EAAGvvB,MAAMkB,YAChD,QAAkC,IAAvBquB,EAAGob,gBAAiC,CACpDpb,EAAG5kB,QACS4kB,EAAGob,kBACTC,QACP,CAEH,OAAO1qC,IACR,IAaGopC,GAAM,KAEVvvC,EAAEkF,QAAQ6a,GAAG,UAAU,WACjBwvB,IAAKrqC,OAAOukC,aAAa8F,IAC7BA,GAAMrqC,OAAO0c,YAAW,WACtB5hB,EAAEmG,MAAMkW,QAAQ,YACjB,GALQ,IAMb,IAKA,IAAIy0B,GACS,EADTA,GAEG,EAFHA,GAGK,GAHLA,GAIK,GAJLA,GAKG,GALHA,GAME,GANFA,GAOI,GAPJA,GAQQ,IAIRC,GACS,SAAU9nB,GACnB,GAAKrN,GAAKvW,IAAI,YAAd,CACA,GAAI4jB,EAAG+nB,cAAcrgC,QAA8C,OAApCsY,EAAG+nB,cAAcrgC,OAAOyd,UA6D3D,SAAkBnF,GAChB,IAAItY,EAASsY,EAAG+nB,cAAcrgC,OAC5BsgC,EAAUjxC,EAAE2Q,GACd,OAAQsY,EAAGygB,SACT,KAAKoH,GAEH,OADA9wC,EAAEipB,EAAGtY,QAAQugC,OAAO70B,QAAQ,UACrB,EACT,KAAKy0B,GACL,KAAKA,GACH,OAAyC,IAArCG,EAAQrrC,KAAK,aAAauB,WAI5B8pC,EAAQrrC,KACN,wDACAuB,SAIA8hB,EAAGkoB,SAAUF,EAAQC,OAAO70B,QAAQ,SACnC40B,EAAQ5nC,OAAOgT,QAAQ,UACrB,IACT,KAAKy0B,GACH,IAAIM,EAAUH,EAAQrrC,KAClB,+CAEFgkC,EAASwH,EAAQp8B,OAAO,WAC1B,OAAIo8B,EAAQjqC,OAAS,IAChByiC,EAAOx3B,KAAK,WAAYw3B,EAAO6B,GAAG,cAChC,GAEX,OAAO,CACT,CA5FW4F,CAASpoB,GAAK,OAAO,EAE5B,IAAIgoB,EAAUjxC,EAAEipB,EAAGtY,QACnB,OAAQsY,EAAGygB,SACT,KAAKoH,GACH,GAAIG,EAAQ3H,SAAS,YAEnB,OADAgI,GAAK,UACE,EAET,GAAIL,EAAQ3H,SAAS,WAEnB,OADAgI,GAAK,SACE,EAET,IAAK11B,GAAKvW,IAAI,aAAc,CAC1B,GACE4jB,EAAGkoB,UACHF,EAAQ3H,SAAS,YACjB2H,EAAQxF,GAAG,uBACXwF,EAAQxF,GAAG,wBACXwF,EAAQxF,GAAG,2BACXwF,EAAQxF,GAAG,2BACXwF,EAAQxF,GAAG,gCACXwF,EAAQxF,GAAG,YAGX,OADA6F,GAAK,SACE,EAET,GAA0B,aAAtBroB,EAAGtY,OAAOyd,QAAwB,CACpCnF,EAAGsoB,2BACH,KACD,CACF,CACD,GAA0B,MAAtBtoB,EAAGtY,OAAOyd,SACsB,MAA9BnF,EAAGtY,OAAO9F,KAAKmd,QAAQ,GAEzB,MAEJ,MACF,KAAK8oB,GACH,GAAIG,EAAQxF,GAAG,mBAEb,OADAwF,EAAQ50B,QAAQ,UACT,EAET,MACF,KAAKy0B,GACH,OAqDR,SAA2B7nB,GACzB,OAAKA,EAAGkoB,WACJv1B,GAAKvW,IAAI,gBACbisC,GAAK,SACLroB,EAAGuoB,iBACHvoB,EAAGsoB,6BAHgC,EAKrC,CA5DeE,CAAkBxoB,GAE3B,KAAK6nB,GACH9wC,EAAE,aAAamjC,OACf,MACF,KAAK2N,GACH,GAA6B,YAAzBG,EAAQzyB,KAAK,QAEf,OADAyyB,EAAQhB,cAAc5uC,EAAE,iBAAkB,OACnC,EAvD8B,CA2D5C,EAqCH,SAASqwC,GAAgBzoB,GACvB,MAAmB,YAAZA,EAAGzZ,MAAsByZ,EAAGygB,UAAYoH,EACjD,CAyBA,SAASa,KACP,IAAIjG,EAAW7sB,GAAKJ,OAAO,aAAe,CAAA,EAE1C7C,GAAKH,OAAO,UAA6B,kBAAlBiwB,EAASoB,MAChClxB,GAAKH,OAAO,SAA4B,SAAlBiwB,EAASoB,MAC/BlxB,GAAKH,OAAO,WAA8B,WAAlBiwB,EAASoB,MACjClxB,GAAKH,OAAO,gBAAmC,gBAAlBiwB,EAASoB,MACtClxB,GAAKH,OAAO,UAA6B,UAAlBiwB,EAASoB,MAChClxB,GAAKH,OAAO,cAAqC,cAAtBiwB,EAASkG,UACpC,MAAMC,EAAQhF,KACdgF,EAAMprC,SAAQmN,IACZgI,GAAKH,OAAO7H,GAAG,GAAM,EAAM,IAE7BgI,GAAKH,OAAO,qBDxRoBoxB,IAChCA,EAAYnL,MAAKoQ,GAAQA,EAAKtvB,WAAW,YCuRPuvB,CAAmBF,IAAQ,EAC/D,CAyGA,SAASG,KACPhyC,EAAE,aAAagyC,GAAWC,SAC5B,CAvIAjyC,EAAEoc,UAAU2D,GAAG,UAAWgxB,IAE1B/wC,EAAEoc,UAAU2D,GAAG,UAAW,WAAW,SAAUkJ,GAC7C,OAAmB,KAAfA,EAAGygB,UAEL1pC,EAAEmG,MAAMkW,QAAQ,UACT,EAGX,IAyBArc,GAAE,WACAA,EAAE,QAAQ+lB,KAAK,aAAc,QAE7B3J,SAASvO,iBAAiB,UAAU,SAAUob,GAE5C,IADaA,EAAGtY,OAAOoN,aAAa,UAGlC,OADAkL,EAAGuoB,kBACI,CAGb,IAEExxC,EAAEoc,UAAU2D,GAAG,SAAU,iBAAiB,WAExC,IAAIzC,EAAStd,EAAEmG,MAAM+rC,iBACnBC,EAAShsC,KAAK4X,aAAa,UAU7B,OARA/d,EAAE8sB,KAAKxP,GAAQ,SAAUjc,EAAGgB,GACT,QAAbA,EAAIoH,KAAgBpH,EAAI4D,MAAQ,OAC/B5D,EAAI4D,OAAS5D,EAAI4D,OAAS,IAAIud,MACzC,IACIxjB,EAAE6jB,SACAsuB,EACA,CAACnyC,EAAE2kB,MAAMrH,GAASpY,OAAOof,SAASna,OAAOumC,UAAU,IAAIrpC,KAAK,OAEvD,CACX,IAEE,IAAI+qC,EAAYltC,OAAO0c,YAAW,WAChC5hB,EAAE,sCAAsCqc,QAAQ,QACjD,GAAE,GAEH8yB,GAAGkD,OAAS,SAAgB/0B,GAC1B,QAC8B,IAApBA,EAAOg1B,eACc,IAApBh1B,EAAO7Y,UAChB6Y,EAAOi1B,UACPj1B,EAAOk1B,SACPl1B,EAAOm1B,WACPn1B,EAAOo1B,QACPp1B,EAAO0H,OACP1H,EAAOq1B,SACPr1B,EAAOs1B,KACP,CAGA,GAFAh3B,GAAK3Z,IAAI,gBACT4wC,KACIv1B,EAAOs1B,MAAM,IAAIxuB,IAAMgB,oBACtB,IAAK+pB,GAAG2D,mBAAoB,CAC/B,IAAIX,OAEyB,IAApB70B,EAAOg1B,eACa,IAApBh1B,EAAO7Y,WAEd0tC,EAAS,SACP70B,EAAOi1B,WAAUJ,EAAS,aAEC,IAApB70B,EAAOi1B,UAA4Bj1B,EAAOk1B,UACnDL,EAAS,QACP70B,EAAOi1B,WAAaj1B,EAAOk1B,SAAWl1B,EAAOo1B,UAC/CP,EAAS,UACP70B,EAAOm1B,YAAWN,EAAS,QAC3B70B,EAAOq1B,UACTR,EAAS70B,EAAOq1B,eACTr1B,EAAOq1B,SAEhB3yC,EAAE6jB,SAASsuB,EAAQnyC,EAAE2kB,MAAMrH,GAAU,aAAavO,KAAKoV,GACxD,CACDjf,OAAOukC,aAAa2I,EACrB,CACL,EAEMltC,OAAOof,SAASna,OAAOhD,OAAS,EAClCgoC,GAAGkD,OAAOryC,EAAEklB,cACPf,KAEPnkB,EAAEoc,UAAU2D,GAAG,qBAAsBgzB,GACvC,IAmBAf,GAAWC,OAZX,SAAyBA,EAAS,aAChC,MAAsB,iBAAXA,GACTl2B,QAAQC,KAAK,sCACN,aAEJ,4BAA4B7Q,KAAK8mC,GAI/BA,GAHLl2B,QAAQC,KAAK,mBAAqBi2B,GAC3B,YAGX,CAEoBe,CAClB7lB,GAAkB,mBAAoB,cASxCntB,EAAEoc,UAAU2D,GAAG,SAAU,gCAAgC,WACvDovB,GAAG8D,SAASjzC,EAAEmG,MAAM9D,MACtB,IAEArC,EAAEoc,UAAU2D,GAAG,QAAS,kBAAkB,WACxC,IACE8qB,EADU7qC,EAAEmG,MACI4f,KAAK,gBACvBopB,GAAG8D,SAASpI,EACd,IAKA7qC,EAAEqQ,GAAG6iC,SAAW,WACd,OACEC,QACE9xC,EAAE,UAAY,KAAsB,GAAf8E,KAAKgB,OAAc9F,EAAE,QAAUA,EAAE,UAAY,KAG7D8E,KAAK2mB,MAAK,WACf,IAAIkc,EAAKhpC,EAAEmG,MACX,GAAI6iC,EAAGM,SAAS,WAAY,CAC1B,IAAI3J,EAAQ,CACV+S,OAAQ1J,EAAGxqB,KAAK,UAChB40B,UAAWpK,EAAGxqB,KAAK,cAErB60B,GAAW1T,EAAM+S,OAAQ/S,EAAMyT,UAAWv0B,GAAKJ,OAAO,aAClD60B,GAAc3T,KAChB3/B,EAAE,SAASuzC,QACX33B,GAAKF,MAAM,YAEd,CACP,IAESvV,IACT,EAEA,IAAIqtC,GAAQ,WACV,IAAIC,EAAS,GACTC,EAAmB,GACnBC,EAAO,GACPC,EAAO,EACPC,EAAcxyC,EAAE,wBAgEpB,SAASyyC,EAAUhyC,GACjB8xC,EAAO9xC,EACP,IAAIiyC,EAAUN,EAAOtsC,OAErBnH,EAAE,sBAAsB41B,SAExB51B,EAAEyzC,EAAOjtC,MAAMotC,EAAOD,GAAOC,EAAO,GAAKD,IAAO7mB,MAAK,SAAU5lB,IAmFnE,SAAgBy4B,GACd,IAAIqU,EAAMh0C,EAAE0e,OACV,CAAE,EACFihB,EAEA,CACEsU,UAAWtU,EAAMsU,WAAa1sB,GAAUoY,EAAMsU,WAC9CC,WACEr1B,GAAKJ,OAAO,oBACZkhB,EAAMuU,YACN3sB,GAAUoY,EAAMuU,aAEpB,CACEC,aAAct1B,GAAKJ,OAAO,gBAC1B21B,iBAAkBv1B,GAAKJ,OAAO,sBAG9BI,GAAKJ,OAAO,gBAAeu1B,EAAIK,UAAYzV,GAASgB,WAAWD,IAE/DqU,EAAIE,aAAYF,EAAIM,SAAWnrB,GAAU6qB,EAAIE,aAC7CF,EAAIC,YAAWD,EAAIO,WAAaprB,GAAU6qB,EAAIC,YAClD,IAAI1yB,EAAO4tB,GAAGqF,eAAeR,GAEzBS,EAAQz0C,EAAEuhB,GA4Bd,OA1BAkzB,EAAM7uC,KAAK,iBAAiBic,KAAK,iBAAiB,SAAUoH,GACtDyoB,GAAgBzoB,IACpBvG,GAAK5c,QAAQ,CACXkd,IAAK,SACLxE,KAAM,CACJk0B,OAAQ/S,EAAM+S,OACdU,UAAWzT,EAAMyT,UACjBb,SAAU1zB,GAAKJ,OAAO,YACtB0G,IAAK,SAGb,IACEsvB,EAAM7uC,KAAK,iBAAiBic,KAAK,iBAAiB,SAAUoH,GACtDyoB,GAAgBzoB,IACpBvG,GAAK5c,QAAQ,CACXkd,IAAK,SACLxE,KAAM,CACJk0B,OAAQ/S,EAAM+S,OACdgC,cAAe/U,EAAMyT,UACrBb,SAAU1zB,GAAKJ,OAAO,YACtB0G,IAAK,SAGb,IACEsvB,EAAMj2B,KAAK,YAAamhB,EAAMyT,WAC9BqB,EAAMj2B,KAAK,SAAUmhB,EAAM+S,QACpB+B,CACT,EAtIME,CAAOlB,EAAOvsC,EAAI0sC,EAAOD,IAAOztC,SAAS,kBAC/C,IACQutC,EAAOtsC,SACTnH,EACE,gEAEE40C,KACA,gDACAnB,EAAO,GAAGf,OACV,KACArxC,EAAE,qBANJ,uBAUG8tC,GAAG0F,QAAQC,QACR,mEAEAF,KAFA,wDAKAvzC,EAAE,aALF,gBASA,IACJ,YACF0zC,UAAU,mBAIZ/0C,EAAE,+BAA+B41B,UAGnC51B,EAAE,0BACC6gB,KACC+yB,EAAOD,EACL,EACA,IACAnrB,KAAK2Y,IAAI4S,GAAUH,EAAO,GAAKD,GAC/B,IACAI,GAEHhuB,KACC,aACAxd,EACElH,EAAE,+BACFuyC,EAAOD,EAAO,EACdnrB,KAAK2Y,IAAI4S,GAAUH,EAAO,GAAKD,GAC/BI,IAIN/zC,EAAE,mCAAmCoS,KAAK,WAAoB,GAARwhC,GACtD,IAAIoB,EAAYpB,GAAQprB,KAAKysB,OAAOlB,EAAU,GAAKJ,GACnD3zC,EAAE,kCAAkCoS,KAAK,WAAY4iC,GAErDh1C,EAAE,aAAaqc,QAAQ,cACxB,CACD,SAAS64B,IACP,IAAIC,EAAW3sB,KAAKysB,MAAMxB,EAAOtsC,OAASwsC,GAC1CG,EAAUtrB,KAAK2Y,IAAIyS,EAAO,EAAGuB,GAC9B,CACD,SAASC,IACPtB,EAAUtrB,KAAKC,IAAImrB,EAAO,EAAG,GAC9B,CACD,SAASL,IACPvzC,EAAE,mBAAmBuzC,OACtB,CACD,MAAO,CACLA,MAAOA,EACPvmB,OA3IF,SAAgBhqB,GAGd,GAFA0wC,EAAmB1wC,GAAS,GAC5BywC,EAASzwC,GAAS,GACdA,GAASA,EAAMmE,OAAS,EAAG,CAC7BnE,EAAM2G,MAAK,SAAU0H,EAAG3C,GACtB,OAAO2C,EAAE4iC,UAAYvlC,EAAEulC,WAAa,EAAI,CAChD,IACM,IAAIoB,EAAYr1C,EAAE,sBACdq1C,EAAU5J,GAAG,YACf4J,EAAU9zB,KACR,wBACEhZ,EAAiBlH,EAAE,qBAAsBsyC,GAD3C,gEAIEprC,EAAiBlH,EAAE,wBAAyBsyC,GAJ9C,qHAQEprC,EAAiBlH,EAAE,oBAAqBsyC,GAR1C,2DAWEprC,EAAiBlH,EAAE,oBAAqBsyC,GAX1C,mFAeEE,EAfF,iBAkBEA,EAlBF,uCAsBFwB,EAAUtvB,KAAK,gBAAgB,IAE7BsvB,EAAUtvB,KAAK,kBACjBsvB,EAAU3pB,WAAW,gBACrB1rB,EAAE,kBAAkBs1C,MAAMF,GAC1Bp1C,EAAE,kBAAkBs1C,MAAMJ,GAC1Bl1C,EAAE,mBAAmBs1C,MAAMxB,EAAUjyB,KAAK,KAAM,IAChD7hB,EAAE,kBAAkBs1C,MAClBxB,EAAUjyB,KAAK,KAAM2G,KAAKysB,OAAOxB,EAAOtsC,OAAS,GAAKwsC,KAGxD3zC,EAAE,mBAAoBq1C,GAAWE,OAAM,SAAUtsB,GAC/C,GAAIA,EAAGygB,UAAYoH,GAAU,OAAO,EACpC,IACEzuC,GADUrC,EAAEmG,MACC9D,OAAS,IAAImhB,OAC5B,GAAW,IAAPnhB,EAAW,CACb,IAAI6e,EAAK,IAAIC,OAAO9e,EAAK,KACzBoxC,EAASC,EAAiB1+B,QAAO,SAAUF,GACzC,OAAOoM,EAAG/V,KAAK2J,EAAErL,KAC/B,GACA,MAAiBgqC,EAASC,EAEhB,OADAI,EAAU,IACH,CACjB,KAEMA,EAAU,EAChB,MACMP,GAEH,EAgFF,CApJW,GAsJZ,SAASqB,KAEP,OACE50C,EAAEw1C,KAAK,CAAC,aAAc,mBAAoB,gBAAiB32B,GAAKJ,QAC7DtX,OAHM,CAKb,CAqIA,SAASmsC,GAAc3T,GACrB,OACEA,EAAMyT,WAAav0B,GAAKJ,OAAO,cAC/BkhB,EAAM+S,QAAU7zB,GAAKJ,OAAO,SAEhC,CAEA,SAAS40B,GAAWX,EAAQU,EAAWb,GAGrC7vB,GAAKe,KAAK,CACRT,IAAK,SACLxE,KAAM,CACJk0B,SACAU,YACAb,WACAptB,IAAK,SAGX,CAOA,SAASswB,GAAQ/C,EAAQoC,EAASx3B,EAAS,CAAA,GACzC,MAAMkB,EAAOlc,OAAOgV,OAClB,CAAE,EACFhV,OAAOgb,KAAYA,GAAUA,EAC7B,CACEo1B,OAAQA,EACRH,SAAU1zB,GAAKJ,OAAO,YACtB6yB,KAAM,OACNnsB,IAAK,QAEP2vB,GAAW,CAAEA,YAEXj2B,GAAKJ,OAAO,aACd6yB,GAAK,QAAQ,SAAUoE,GACrBhzB,GAAKC,MAAO,EACY,UAApB+yB,EAAS1xB,QACXtB,GAAK5c,QAAQ,CAAE0Y,KAAMA,GAE7B,IAEIkE,GAAK5c,QAAQ,CAAE0Y,KAAMA,GAEzB,CA7HA2wB,GAAGqF,eACDrF,GAAGqF,gBACH,SAAU7U,GACR,IAAIgW,EACFC,EACAC,EAAW,GACXC,EAAa,GACbC,EAAa,GACb3iB,EAAU,CAAC,WA+Cb,OA9CAuiB,EAAYt0C,EAAE,eAAiB,KAAOs+B,EAAM4U,WACxC11B,GAAKJ,OAAO,qBACdk3B,GAAa,KAAOt0C,EAAE,WAAa,KAAOs+B,EAAM2U,UAElDsB,EACE,2BACAD,EACA,KACAhW,EAAM4U,WACN,QACE11B,GAAKJ,OAAO,gBACdq3B,EACE,+CAEAnW,EAAM0U,UAAUvuC,QAAQ,KAAM,SAF9B,0DAKAzE,EAAE,UACF,aAEAwd,GAAKJ,OAAO,sBACds3B,EACE,4FAIA10C,EAAE,UAJF,kBASAwd,GAAKJ,OAAO,kBACdo3B,EACE,+DAIAx0C,EAAE,QAJF,kBASAiyC,GAAc3T,IAChBvM,EAAQhsB,KAAK,WAIb,cACAgsB,EAAQ/rB,KAAK,KADb,+DAKAsuC,EACA,KACAt0C,EAAE,aACF,KACAs+B,EAAMl2B,KACN,MACCk2B,EAAMl2B,MAAQpI,EAAE,SACjB,iBACAu0C,EACAE,EACAC,EACAF,EACA,OAEN,EAuBA71C,EAAEoc,UAAU2D,GAAG,gBAAiB,mBAAmB,SAAUkJ,GAC3C,YAAZA,EAAGzZ,MAAsByZ,EAAGygB,UAAYoH,IAC5C9wC,EAAEmG,MAAM4J,QAAQ,YAAYmjC,UAC9B,IA0BAlzC,EAAEoc,UAAU2D,GAAG,gBAAiB,eAAe,SAAUkJ,GAEvD,OADgB,UAAZA,EAAGzZ,MAAoBkiC,GAAgBzoB,KAAKA,EAAG+sB,mBAC5C,CACT,IAEAh2C,EAAEoc,UAAU2D,GAAG,gBAAiB,eAAe,SAAUkJ,GACvD,GAAIyoB,GAAgBzoB,GAAK,OAAO,EAChC,MAAM8D,EAAQ/sB,EAAEmG,MJ94Be,IAACnE,EAAQwa,EIq5BxC,OADAi5B,GAJItvC,KAAK4X,aAAa,mBAClBgP,EAAMhd,QAAQ,aAAagW,KAAK,kBACxBgH,EAAMnnB,KAAK,eAAevD,OJl5BNL,EIm5BH,kBJn5BWwa,EIm5BQrW,KJl5BhDqL,EACElP,OAAOiL,YACPC,IAAI,EAAG/D,OAAMxD,WAAY,CAACwD,EAAKue,OAAOhmB,EAAOmF,QAASlB,KACtD+O,IAAO,EAAGvL,OAAMxD,WAAYwD,EAAK+Y,WAAWxgB,MAC5CoO,GAAK,IAAIA,IAJXoB,CAKEgL,EAAIuE,eI+4BC,CACT,IAKA,IAAIk1B,GAAS,CACXC,SAAU,aACVC,UAAW,SAAUC,GAEnB,OADAA,EAAM7D,SAAW1zB,GAAKJ,OAAO,YAE1B0wB,GAAGkH,iBAAmBlH,GAAGkH,gBAAgBD,IAC1C,SAAWA,GACT,IAAI1D,EAAS0D,EAAM1D,OACnB,MACE,uBACA0D,EAAME,eACN,aACAF,EAAMG,MACN,cACA7D,EACA,qBACAA,EAPA,sDAWAvD,GAAGnuB,WAAWo1B,EAAMI,WAXpB,gEAeA9D,EACA,KACArxC,EAAE,OAlBJ,qBAsBD,CAxBD,CAwBG+0C,EAEN,EAEDK,aAAc,SAAUL,GAatB,OAZAA,EAAME,eAAiBF,EAAMzU,SAAW,WAAa,GACrDyU,EAAMI,UAAYJ,EAAM3D,UAAU3sC,QAAQ,KAAM,KAC5CswC,EAAMM,aACRN,EAAMO,MAAQpvB,GAAU6uB,EAAMM,YAC9BN,EAAMQ,WAAaztB,GAAUitB,EAAMO,QAEjCP,EAAMS,YACRT,EAAMU,aAAeV,EAAMS,UAAUlvC,MAAM,yBAEzCyuC,EAAMW,aACRX,EAAMY,cAAgBZ,EAAMW,WAAWpvC,MAAM,yBAExCyuC,CACR,EACDppB,OAAQ,SAAUxO,GAChB,IAAIy4B,EAASz4B,EAAKy4B,OAClBA,EAAOttC,KAAK2lC,GAAkBztB,KAAK,KAAM,cAEzC,IAAIq1B,EAAWD,EAAOjiC,QAAO,SAAU0f,GACrC,MAA6B,iBAAfA,EAAS,KAC7B,IACQwiB,EAAS,KACXA,EAASvtC,MAAK,SAAU0H,EAAG3C,GACzB,OACE2C,EAAS,MAAI3C,EAAS,OACtB0gC,GAAgB5pC,OAAO6L,EAAS,OAAI7L,OAAOkJ,EAAS,OAE9D,IACMuoC,EAASA,EAAOjiC,QAAO,SAAU0f,GAE/B,MAA6B,iBAAfA,EAAS,KAC/B,IACMuiB,EAASC,EAAS/iC,OAAO8iC,IAG3B9wC,KAAKotC,QACL,IAAItuC,EAAOkB,KACXnG,EAAEmG,KAAK+vC,UAAUlwC,OACfhG,EAAEwN,IAAIypC,GAAQ,SAAUb,GACtB,OAAOnxC,EAAKkxC,UAAUlxC,EAAKwxC,aAAaL,GAChD,IAEG,EACD7C,MAAO,WACLvzC,EAAEmG,KAAK+vC,UAAU3C,OAClB,GAgCH,SAASjC,GAAKzuB,EAAWs0B,EAAI91B,EAAU,CAAA,GAErC,GADA+1B,GAAWC,SACP30B,GAAKC,KAAT,CAEAD,GAAKE,MAAQF,GAAKE,KAAKgB,QACvBlB,GAAKG,UAAYA,EACjBH,GAAKkjB,IAAyB,WAAnBljB,GAAKG,WAA0BxB,GAAWA,EAAQ2L,OAE7D,IACE,GACE,CAAC,OAAQ,QAAQhX,SAAS6M,IAC1B7iB,EAAE,qDACCojC,SAAS,CAAEkU,QAAQ,EAAOC,UAAU,EAAOzd,eAAe,IAC1D9kB,OAAO,uBAAuB7N,OAAS,EAE1C,MAAM,IAAIuI,MAAM,uDAElB,MAAMuN,EAAYlD,GAAO3H,EAAK,aAAa,IACzCgK,SAASoB,cAAc,oBADPzD,CAEhBsH,GACIm2B,EAAW34B,GAAKJ,OAAO,YACvBosB,EAAU7qC,EAAEwe,KAAKvB,GAAW4tB,QAIlC,GAHAnoB,GAAKmoB,QAAUA,EAGK,UAAdhoB,IAAyBjH,GAAKvW,IAAI,cAAgB,CACtD,MAAMoyC,EAAc,CAClBzpC,QAAiBqT,GAAYA,EAAQq2B,MACrCl5B,KAAM,CACJ,QAAUqE,EACI,WAAdA,GAA0BxB,GAAWA,EAAQ2L,OACzC,UAAY7kB,mBAAmBkZ,EAAQ2L,QACvC,GACU,cAAdnK,EACI,gBAAkBxB,EAAQs2B,aAC1B,GACU,aAAd90B,EAA2B,WAAaxB,EAAQwpB,QAAU,GAC1DhsB,GAAKC,QAAQD,GAAKR,cAClB,YAAcwsB,EACd,WACAxtB,GAAc,CACZJ,YACAK,OAAQ,IAAInY,gBAAgBkc,EAAQyD,eAEnCvf,WACAO,QAAQ,SAAU,WAEpBkP,OAAOmK,SACP9X,KAAK,KACR6b,QAAS,SAAU1E,EAAMwF,EAAQC,GAC/BzF,EAAKo5B,WAAa/0B,EAClBrE,EAAKq5B,QAAUx2B,GAAWA,EAAQy2B,KAClCt5B,EAAKu5B,UAAYl+B,GAAO,YAAY,EAAMwH,GAWtCwpB,IAAY2M,GAAiC,WAArBptB,GAAWlI,KAKrCQ,GAAKW,UACLxE,GAAKE,QAAQP,IACJ6C,GAAWA,EAAQ22B,gBACD,WAA3B32B,EAAQ22B,gBAA+Bb,GAAMA,EAAG34B,EAAMwF,EAAQC,GAC9Dd,GAAU3E,EAAMwF,EAAQC,GACG,WAA3B5C,EAAQ22B,gBAA+Bb,GAAMA,EAAG34B,EAAMwF,EAAQC,KAE7DkzB,GAAMh0B,IAAW3E,EAAMwF,EAAQC,GAGhCvB,GAAKkjB,KACLiF,IAAY2M,GACZhmC,EACEsI,GAAKqF,QAASrM,EAAI+G,GAAO,WAAW,KACpCzH,EAAK,UAFPZ,CAGEgN,KAEFzC,QAAQk8B,KACN,gFAEF/yC,OAAO0c,WAAWutB,GAAGniB,OAAQ,GAEhC,QAIYrkB,IAAb6uC,GACc,WAAd30B,GACAgoB,IAAY2M,GAEZz7B,QAAQC,KACN,WAAW6uB,iCAAuC2M,kCAGpC,WAAd30B,GAA0BgoB,IAAY2M,EAExCrI,GAAG8D,SAEDpI,GACArsB,IACEkE,GAAKW,UACLxE,GAAKE,QAAQP,GACbkE,GAAKG,UAAYA,EAEjBH,GAAKkjB,IAAoB,WAAd/iB,GAA0BxB,GAAWA,EAAQ2L,OACxDtK,GAAKmoB,QAAUA,EACf,MAAM5mB,EAAMvB,GAAKe,KAAKg0B,GACG,WAArBrtB,GAAWlI,KACb+B,EAAIlV,MAAKyP,IACPkE,GAAKW,UACLxE,GAAKE,QAAQP,GAEb2wB,GAAG8D,SACDuE,GACA,KAEE90B,GAAKG,UAAYA,EACjBH,GAAKkjB,IACW,WAAd/iB,GAA0BxB,GAAWA,EAAQ2L,OAC1CtK,GAAKkjB,KAAKuR,GAAMA,GAAI,GAE3B,CACEa,eAAgB,SAChBE,SAAUj7B,EACVk7B,UAAU,GAEb,GACD,GAEN,CAAET,MAAM,EAAOM,gBAAgB,IAGjCt1B,GAAKe,KAAKg0B,EAEb,CAIF,CAHC,MAAO3iC,GACP9U,EAAEoc,UAAUC,QAAQ,eAAgBvH,EAAE7G,SACtCgS,GAAS5e,EAAEyT,EAAE7G,SACd,CAhJqB,CAiJxB,CAEA,IAAImqC,GAEJ,SAASC,GAAgBjpC,GACvB,GAAIsT,GAAKC,KAAM,OAEf,IAAI21B,EAEJ51B,GAAKE,MAAQF,GAAKE,KAAKgB,QACvBlB,GAAKG,UAAY,SAGjB,MAAM40B,EAAc,CAClBzpC,OAAO,EACPwQ,KAAM,CACJ,cACAK,GAAKC,QAAQD,GAAKP,UAClB,WACAH,MAECnJ,OAAOmK,SACP9X,KAAK,KACR6b,QAAS,IAAI1a,KACP8vC,IAAsBF,KACxBp4C,EAAEoc,UAAUC,QAAQ,sBAAuB7T,GAC3C+vC,GAAe/vC,EAAK,GAAI4G,GACzB,GAGLgpC,GAAoBE,EAAoB51B,GAAKe,KAAKg0B,EACpD,CA/MAz3C,EAAEoc,UAAU2D,GAAG,gBAAiB,mBAAmB,SAAUkJ,GAC3D,IAAIyoB,GAAgBzoB,GAApB,CACA,IAAI8D,EAAQ/sB,EAAEmG,MACZusC,EACEvsC,KAAK4X,aAAa,mBAClBgP,EAAMhd,QAAQ,aAAagW,KAAK,kBACpCrD,GAAK5c,QAAQ,CACXkd,IAAK,OACLxE,KAAM,CACJk0B,OAAQA,EACRH,SAAU1zB,GAAKJ,OAAO,YACtB0G,IAAK,QAEPpC,SAAU,QAZoB,CAclC,IAmMA/iB,EAAEoc,UAAU2D,GAAG,cAAc,SAAUwM,EAAOlL,GACxCrL,GAASqL,EAAQ2B,IAAK,CAAC,SAAU,OAAQ,kBACtChN,GAAS0M,GAAKG,UAAW,CAAC,SAAU,eACvC7iB,EAAEoc,UAAUC,QAAQ,aAAcgF,GACxC,IAIArhB,EAAEoc,UAAU2D,GAAG,cAAc,WAC3B2C,GAAKC,MAAO,EAEZ3iB,EAAE,kCAAkCC,WAAW,QAC/CggB,GAAS,GACX,IAGAjgB,EAAEoc,UAAU2D,GAAG,QAAS,YAAY,WAClCuxB,GAAK,OAAQ,KACf,IAGAtxC,EAAEoc,UAAU2D,GAAG,QAAS,iBAAiB,SAAUkJ,GACjDqoB,GAAK,SAAU,KAAM,CACnBtkB,OAAQhtB,EAAEmG,MAAM9D,MAChB61C,SAAUjvB,EAAGtY,OAAOiyB,QAAQ,WAEhC,IAGA5iC,EAAEoc,UAAU2D,GAAG,QAAS,aAAa,WACnCuxB,GAAK,QACP,IAGAtxC,EAAEoc,UAAU2D,GAAG,QAAS,YAAY,SAAUkJ,GAI5C,OAHAkmB,GAAG9lC,OACH4f,EAAGuoB,iBACHvoB,EAAGsoB,4BACI,CACT,IAGAvxC,EAAEoc,UAAU2D,GAAG,QAAS,YAAY,SAAUkJ,GAI5C,OAHAkmB,GAAGqJ,OACHvvB,EAAGuoB,iBACHvoB,EAAGsoB,4BACI,CACT,IAEAvxC,EAAEoc,UAAU2D,GAAG,UAAW,YAAY,SAAUkJ,GAC9C,OACEA,EAAGkoB,UACHloB,EAAGygB,UAAYoH,IACe,MAA9B7nB,EAAGtY,OAAO9F,KAAKmd,QAAQ,KAGvBmnB,GAAG9lC,OACH4f,EAAGuoB,iBACHvoB,EAAGsoB,4BACI,EAGX,IAGAvxC,EAAEoc,UAAU2D,GAAG,QAAS,aAAa,WACnC04B,KACAxzC,KAAKyzC,QACL14C,EAAE,QAAQuhB,KAAKlgB,EAAE,wCACnB,IAGArB,EAAEoc,UAAU2D,GAAG,QAAS,eAAe,SAAUwM,GAM/C,OAJE,cAAeA,EAAMosB,cAAch8B,SACnCw2B,QAAQ9xC,EAAE,gDAEV8tC,GAAGyJ,WACE,CACT,IAgBA,SAASH,GAAOxvB,EAAIkuB,GAClB,GAAIt4B,GAAKJ,OAAO,YACdo6B,IAAK,WACH,MAAMx3B,EAAU,CACd2B,IAAK,SACLxE,KAAM,YAAcK,GAAKC,QAAQ,YACjC9Q,OAAO,GAGLmpC,aAAc7+B,WAChB+I,EAAQ6B,QAAU7B,EAAQI,MAAQ01B,GAEpCz0B,GAAKe,KAAKpC,EAChB,QACS,CACLtF,SAAWA,QAAQk8B,MAAQl8B,QAAQk8B,KAAK,mCACxC,MAAMa,EAtBsB,CAC9Br3B,MAAO,CACLs3B,KAAM,KAqBJ5B,aAAc7+B,UAAY6+B,GAAOh0B,IAAW21B,EAAc,IAAK,CAC/D50B,aAAc40B,EACdx1B,aAAc3T,KAAKC,UAAUkpC,IAEhC,CACD,OAAO,CACT,CAeA,SAASD,GAAKG,EAAKtB,GAAO,GACL,mBAARsB,IAETA,OAAMrwC,GACJuW,KACFoyB,GAAK,OAAQ0H,EAAK,CAAEtB,SACfsB,GAAOA,GAChB,CAkBA,SAASC,KACP,IAAIpuC,EAAO0X,GAAc,YAAmB1D,GAAKC,QAAQ,aAEzD,OADA5Z,OAAOR,KAAKmG,IACL,CACT,CAeA,SAASquC,GAAKC,GACZ,OAAOn5C,EAAE6jB,SACP,OACAs1B,GAAS,CACPh0B,IAAK,OACLotB,SAAU1zB,GAAKJ,OAAO,aAG5B,CAOA,SAAS26B,GAAanwB,GACpB4vB,IAAK,WACHK,IACJ,IACEjwB,GAAMA,EAAG+sB,iBAAmB/sB,EAAG+sB,iBACjC,CAYA,SAASnD,KACP7yC,EAAE,iBAAiBmjC,MACrB,CA8SA,IAAIkW,GAAeC,GAzYnBt5C,EAAEoc,UAAU2D,GAAG,QAAS,aAAc04B,IACtCz4C,EAAEoc,UAAU2D,GAAG,UAAW,cAAc,SAAUkJ,GAChD,OAAIA,EAAGygB,UAAYoH,IAAc7nB,EAAGygB,UAAYoH,KAChD2H,MACO,EACT,IAiBAz4C,EAAEoc,UAAU2D,GAAG,QAAS,WAAY84B,IAsBpC74C,EAAEoc,UAAU2D,GAAG,QAAS,eAAgBk5B,IACxCj5C,EAAEoc,UAAU2D,GAAG,UAAW,gBAAgB,SAAUkJ,GAClD,OAAIA,EAAGygB,UAAYoH,IAAc7nB,EAAGygB,UAAYoH,KAChDmI,MACO,EACT,IA8BAj5C,EAAEoc,UAAU2D,GAAG,QAAS,iBAAkBq5B,IAC1Cp5C,EAAEoc,UAAU2D,GAAG,UAAW,kBAAkB,SAAUkJ,GAChDA,EAAGygB,UAAYoH,IACnBsI,GAAanwB,EACf,IAgBAjpB,EAAEoc,UAAU2D,GAAG,gBAAiB,iCAAiC,SAAUkJ,GACzE,SAAIyoB,GAAgBzoB,KAAOA,EAAGkoB,YAC9BnxC,EAAEmG,MACCy8B,QAAQ,mBACRtmB,YAAY,gBACZD,QAAQ,kBACJ,EACT,IAiBArc,EAAEoc,UAAU2D,GAAG,oBAAoB,SAAUwM,EAAO/N,GAC9CA,GAAQA,EAAK+6B,QACf/6B,EAAK+6B,OAAO9yC,SAAQ,SAAU4mB,GAC5B,MAAMwd,EAAUxd,EAAMwd,QACtBxd,EAAMR,SAASpmB,SAAQ,SAAUskB,GAC/BA,EAAQwD,YAAcxD,EAAQuB,GAC9BvB,EAAQuB,GAAKue,EAAU,IAAM9f,EAAQuB,GACjCvB,EAAQ+E,QACV/E,EAAQyuB,eAAiBzuB,EAAQ+E,MACjC/E,EAAQ+E,MAAQ+a,EAAU,IAAM9f,EAAQ+E,OAEd,UAAxB/E,EAAQrE,cACVqE,EAAQ9kB,MAAQ8kB,EAAQ9kB,MAAMud,OAC1BuH,EAAQ+E,OAAS/E,EAAQ9kB,QAC3B8kB,EAAQ9kB,MAAQ8kB,EAAQ9kB,MAAQ,MAGV,SAAxB8kB,EAAQrE,aACRqE,EAAQiB,UAAY,IACnBjB,EAAQQ,cAETR,EAAQQ,YAAchjB,EACpBlH,EAAE,mCACF0pB,EAAQiB,WAGpB,GACA,GAEA,IAkOAhsB,EAAEoc,UAAU2D,GAAG,iBA3Nf,SAAsBwM,EAAO/N,GAE3B,IAAIi7B,EAAQz5C,EAAE,QAAQ+lB,KAAK,cAG3B,GADAnK,GAAKF,MAAM,mBACQ,IAAR8C,EAAX,CACA,QAAiC,IAAtBpC,SAAS+zB,UAClB,IACE/zB,SAAS+zB,UAAUuJ,iBAIpB,CAHC,MAAO5kC,GAGR,CAWH,GARI0J,EAAKiD,QACPjD,EAAKiD,M7C77CT,SAAmBk4B,GACjB,MAAMl4B,EAAQnf,OAAOgV,OAAO,CAAE,EAAEqiC,GAEhC,OAAQl4B,EAAMs3B,MACZ,KAAKxtC,EAAMC,WACTiW,EAAMxT,QAAU5M,EACd,kEAEF,MACF,KAAKkK,EAAMQ,mBACT0V,EAAMxT,QAAU5M,EAAE,+CAClB,MACF,KAAKkK,EAAMY,sBAEF,OADCsV,EAAMm4B,QAEVn4B,EAAMxT,QAAU1F,EACdlH,EAAE,4CACFogB,EAAMo4B,QACHnJ,UAAU,GAAIjvB,EAAMo4B,QAAQ1yC,OAAS,GACrCrB,QAAQ,KAAM,MAInB2b,EAAMxT,QAAUwT,EAAMo4B,QAE1B,MACF,KAAKtuC,EAAMiB,+BACTiV,EAAMxT,QAAU5M,EAAE,sCAClB,MACF,QACE,OAAQogB,EAAMm4B,SACZ,KAAK,KACHn4B,EAAMxT,QAAU5M,EACd,sDAEF,MACF,KAAK,KACL,KAAK,KACHogB,EAAMxT,QAAU1F,EACdlH,EAAE,kCAEFogB,EAAMo4B,QAAQrzC,MAAM,GAAIib,EAAMo4B,QAAQhyC,QAAQ,gBAEhD,MACF,KAAK,KACH4Z,EAAMxT,QAAU5M,EACd,yEAEF,MACF,QACEogB,EAAMxT,QAAU5M,EAAEiM,EAASmU,EAAMs3B,MAAO13C,EAAEogB,EAAMo4B,WAGxD,OAAOp4B,CACT,C6Cu4CiBq4B,CAAiBt7B,EAAKiD,QAKrC5C,GAAKE,QAAQP,GAETA,EAAKktB,SAIP,OAHA9vB,GAAK3Z,IAAI,cACT0vC,UAtJF3xC,EAAE,gBAAgB+lB,KAAK,CAAEpV,OAAQ,UA2JjC,GACE6N,EAAKiD,QACJ,CACCs4B,EAAanuC,gBACbmuC,EAAax1C,yBACbw1C,EAAahuC,oBACblE,QAAQ2W,EAAKiD,MAAMs3B,OAAS,GACR,iBAApBv6B,EAAKiD,MAAMs3B,WAGR,IAAIzyC,GAAI,OAAQkY,GAGrB,YADA,IAAI4F,GAAI5F,GAAM4G,eAELvG,GAAKJ,OAAO,cAErBo0B,KACKh0B,GAAKJ,OAAO,aApLnBze,EAAE6jB,SAAS,cAAehF,GAAKC,QAAQ,YAAc,aAwLpD,CAMD,GAAIN,EAAKwF,QAAUxF,EAAK+6B,QAAU/6B,EAAKxb,OAASwb,EAAKy4B,QAAUz4B,EAAKiD,MAAO,CAgCzE,GA/BIjD,EAAK+6B,OAAQE,EAAQ,QAEvBj7B,EAAKy4B,QACLz4B,EAAKxb,OACJwb,EAAKwF,QAAyB,SAAfxF,EAAKwF,OAErBy1B,EAAQ,OACCj7B,EAAKwF,QAAyB,qBAAfxF,EAAKwF,QAEpBxF,EAAKiD,OAASjD,EAAKiD,MAAMs3B,OAASgB,EAAanuC,iBAGxD4S,EAAKiD,OACLjD,EAAKiD,MAAMs3B,OAASgB,EAAax1C,0BAIjCia,EAAKiD,OACLjD,EAAKiD,MAAMs3B,OAASgB,EAAahuC,mBAVjC0tC,EAAQ,OAaCj7B,EAAKiD,OAA6B,UAApBjD,EAAKiD,MAAMs3B,OAClCU,EAAQ,QAEVz5C,EAAE,QAAQ+lB,KAAK,aAAc0zB,GAIf,SAAVA,GACF56B,GAAKI,UAAU,CAAC,YAAa,aAEjB,SAAVw6B,EAAkB,CACpB,MAAM5H,EAAQhF,KACdhuB,GAAKI,YACL4yB,EAAMprC,SAAQmN,IACZgI,GAAKH,OAAO7H,GAAG,GAAO,EAAM,GAE/B,CAGDgI,GAAKF,MAAM,YAEN8C,EAAKiD,OACR7F,GAAKH,OAAO,mBAA8B,SAAVg+B,GAE7Bh+B,OAAO,WAAsB,UAAVg+B,GAEnBh+B,OAAO,UAAqB,SAAVg+B,GAElBh+B,OACC,YACU,SAAVg+B,KAAsBj7B,EAAKy4B,UAAYz4B,EAAKy4B,OAAO9vC,QAGpDsU,OACC,WACU,SAAVg+B,KAAsBj7B,EAAKxb,SAAWwb,EAAKxb,MAAMmE,QAGlDsU,OACC,cACU,UAAVg+B,KAAuBj7B,EAAK4rB,YAAc5rB,EAAK4rB,SAASjjC,QAGzDsU,OACC,wBACU,UAAVg+B,GACEj7B,EAAKw7B,sBACHx7B,EAAKw7B,mBAAmB7yC,QAG7BsU,OAAO,aAAwB,UAAVg+B,IAAsBj7B,EAAKy7B,aAEhDx+B,OAAO,YAAuB,UAAVg+B,IAAsBj7B,EAAK07B,SAEpDt+B,GAAKH,OAAO,aAAwB,SAAVg+B,GAEZ,SAAVA,IACF79B,GAAKF,MAAM,gBACXi2B,MAEY,UAAV8H,GACF79B,GAAKF,MAAM,cAEd,CAGC8C,EAAKiD,QACJzL,GAASwI,EAAKiD,MAAMs3B,KAAM7mC,EAAO,GAAI,oBAAqBgQ,MAE3Dd,GACE,CACEE,UAAW9O,EAAK,CAAC,YAAa,OAAQ,SAAU,aAAc0P,IAC9DX,MAAM,GAER/C,EAAKiD,OAKLjD,EAAK27B,iBACPn6C,EAAE,iBACC6gB,KAAKrC,EAAK27B,iBAAiBr0C,QAAQ,KAAM,MACzCigB,KAAK,OAAQvH,EAAK47B,eACF,UAAVX,GACTz5C,EAAE,iBAAiB6gB,KAAK,IAGZ,UAAV44B,GACFz5C,EAAE,SAASuzC,QAGC,SAAVkG,IACFjG,GAAMD,QACN0C,GAAO1C,SAGK,SAAVkG,GACFzH,KAGY,SAAVyH,GACF79B,GAAKF,MAAM,YACRA,MAAM,oBACNA,MAAM,WACNA,MAAM,aACNA,MAAM,YACNA,MAAM,eACNA,MAAM,yBACNA,MAAM,cACNA,MAAM,aAGG,SAAV+9B,IACEj7B,EAAKy4B,QAAYz4B,EAAKy4B,OAAO9vC,QAC/B8uC,GAAOjpB,OAAOxO,GAEZA,EAAKxb,OAAWwb,EAAKxb,MAAMmE,QAC7BqsC,GAAMxmB,OAAOxO,EAAKxb,QAIR,UAAVy2C,IACEj7B,EAAK+6B,SACPnC,GAAWC,QACXr3C,EAAEoc,UAAUC,QAAQ,qBAAsBmC,IAE5C44B,GAAWiD,UAEXr6C,EAAE,uBAAuB+lB,KAAK,OAAQ6Y,GAASc,YAK3ClhB,EAAK4rB,WACPQ,GAASp7B,KAAO2d,GAAkB,kBAAoB,KACtDyd,GAASY,KAAKhtB,EAAK4rB,WAjNgB,CAoNzC,IAaApqC,EAAEoc,UAAU2D,GAAG,sBAAsB,WACnCovB,GAAGxrB,KAAKN,SACV,IAIA,MAAMi3B,GAAYt6C,EAAEoc,UA0CpB,SAASm+B,GAAahuB,EAAO/N,GAC3B,IAAIA,EAAK+6B,OAiET,OAAI/6B,EAAKy4B,QAAYz4B,EAAKxb,OAAUwb,EAAKxb,MAAMmE,YAK3CqX,EAAKxb,MACPhD,EAAE,gDAAgDqc,QAAQ,SAG5Drc,EAAE,sCAAsCqc,QAAQ,WAR9Crc,EAAE,wBAAwBqc,QAAQ,cAClCrc,EAAE,2CAA2Cqc,QAAQ,UAlErDnX,OAAO0c,YAAW,WAChB,MAAO2jB,EAAMK,IAAQljB,GAAKkjB,KAAO,IAAIj+B,MAAM,KAC3C,IAAIiiC,EACF4Q,EAAc,8CAChB,GAAI5U,EACU,MAARA,EAEFgE,EAAS5pC,EAAE,iCAAiCulC,WAE5CqE,EAAS5pC,EACP,iBACEulC,EACA,mBACAK,EACA,KACA4U,IAGQrzC,SACVyiC,EAAS5pC,EACP,iBACEulC,EACA,oBACC38B,SAASg9B,GAAO,GACjB,KACA4U,IAGD5Q,EAAOziC,SACVyiC,EAAS5pC,EAAE,iCAAiCulC,WAE5CqE,EAAOziC,QACTyiC,EAAOvtB,QAAQ,cAIjB,GACEtD,GACErE,GAAWmF,GAAO,aAAa,IAC/BnF,GAAWmF,GAAO,aAAc,WAFlCd,CAGEyF,IACD5C,GAAKvW,IAAI,oBACR+W,SAASwE,gBAAkBxE,SAASyD,OAnEhD,WACE,IACE,IAAIrD,EAAMJ,SAASoB,cAAc,QAAQ67B,QACzC,GAAI78B,EAAK,CACPA,EAAI5L,QACA4L,EAAIsV,UAAU2oB,SAAS,kBACzBz6C,EAAEwc,GAAKvc,WAAW,UAAUkjC,OAE9B,IAAIkN,eAAEA,EAAcG,aAAEA,EAAYkK,mBAAEA,GAClCpB,GACF98B,EAAIm+B,kBAAkBtK,EAAgBG,EAAckK,EACrD,CAQF,CAPC,MAAO5lC,GAMP,OADAA,EAAE+7B,QAAU/7B,EAAE+7B,UACP,CACR,CACD,OAAO,CACT,CA+Ca+J,GACH,CACA56C,EAAE,mBAAmBqc,QAAQ,SAC7B,MAAMw+B,EAAUz+B,SAASoB,cAAc,mBACvC,GAAgB,OAAZq9B,EAAkB,OACtBA,EAAQjqC,QACJkqC,GAAmB54B,KACjB24B,EAAQE,wBACVF,EAAQG,eAAe,CACrBC,SAAU/1C,OAAOg2C,WAAW,oCACzBl7B,QACC,OACA,UAIX,CAEJ,GAAE,EAaP,CAWA,SAASu4B,GAAe4C,EAAU/rC,GAChC,IAAIoP,EAAO,CACT+6B,OAAQ4B,EAAS5B,QAGnB,GADAv5C,EAAEoc,UAAUC,QAAQ,gBAAiB8+B,GACjC38B,GAAQA,EAAK+6B,OAAQ,CAIvB,IAAI1sB,EAAWuuB,GAHH58B,EAAK+6B,OAAOvkC,QAAO,SAAUqY,GACvC,OAAOA,EAAMM,OACnB,IAAO,GAC+Bd,SAASrmB,MAAM,GAAI,IACrDxG,EACE,kEACA4sB,cAAcC,EAAUzd,GAC1BgoC,GAAWiD,SACZ,CACDr6C,EAAEoc,UAAUC,QAAQ,gBAAiB8+B,EACvC,CA/IAb,GAAUv6B,GAAG,QAAS,UAAUkJ,IAC9B,MAAMrI,EAAgBqI,EAAGtY,OACzB0oC,GAAgBz4B,EAAc7C,aAAa,MACvC6C,EAAc3a,QAChBqzC,GAAkB,CAChBjJ,eAAgB,EAChBG,aAAc5vB,EAAc3a,MAAMkB,OAClCuzC,mBAAoB,WACrB,IAGLJ,GAAUv6B,GAAG,UAAW,UAAUkJ,IAChC,MAAMrI,EAAgBqI,EAAGtY,QACnB0/B,eAAEA,EAAcG,aAAEA,EAAYkK,mBAAEA,GAAuB95B,EAC7D04B,GAAkB,CAAEjJ,iBAAgBG,eAAckK,qBAAoB,IA+GxE16C,EAAEoc,UAAU2D,GAAG,sBAPf,SAASs7B,EAAkB9uB,EAAO/N,GAC5BA,EAAK+zB,WACPvyC,EAAEoc,UAAU2D,GAAG,qBAAsBw6B,IACrCv6C,EAAEoc,UAAUk/B,IAAI,qBAAsBD,GAE1C,IAsBAr7C,EAAEoc,UAAU2D,GAAG,cAAc,SAAUwM,EAAOzB,EAASC,EAASI,GAC9D,GAAIA,EAAQtjB,QAAQ,YAAc,GAAKkjB,EAAQS,WAAY,CACzD,IAAI+vB,EAAUzwB,EAAQ/a,QAAQ,0BAC1Bgb,EAAQU,SACV8vB,EAAQx1B,KAAK,eAAgBgF,EAAQU,SACrCvmB,OAAO0c,YAAW,WAChB25B,EAAQ7vB,WAAW,UAAU3F,KAAK,eAAgBgF,EAAQU,QAC3D,GAAE,MAEH8vB,EAAQx1B,KAAK,eAAgBgF,EAAQU,SACrCvmB,OAAO0c,YAAW,WAChB25B,EAAQx1B,KAAK,UAAU,EACxB,GAAE,IAEN,CACH,IAUA,IAAIqxB,GAAa,CAIfoE,OAAQ,GAKRnE,MAAO,WACLlxC,KAAKq1C,OAAS,EACf,EAKDnyC,KAAM,WACJ,OAAOlD,KAAKq1C,OAAOtrC,KACpB,EAKDsJ,IAAK,SAAUgc,GACbrvB,KAAKq1C,OAAOp0C,KAAKouB,EAClB,GAOH4hB,GAAWqE,SAAW,WACpB,OAYe,IAXbz7C,EAAEw1C,KACAx1C,EACE,2FAECojC,SAAS,CAAEkU,QAAQ,IACnB9pC,KAAI,WACH,OAAOxN,EAAEmG,MAAMqY,KAAK,YAC9B,KACM,SAAUnc,GACR,OAAe,IAARA,CACR,IACD8E,MAEN,EAMAiwC,GAAWiD,QAAU,WACnBz+B,GAAKH,OAAO,cAAe27B,GAAWqE,WACxC,EAKAz7C,EAAEoc,UAAU2D,GAAG,eAAgB,gBAAiBq3B,GAAWiD,SAG3Dr6C,EAAEoc,UAAU2D,GAAG,WAAY,6BAA6B,WACtD,IAAIipB,EAAKhpC,EAAEmG,MACXixC,GAAW59B,IAAIwvB,EAAG,GACpB,IAEAhpC,EAAEqQ,GAAGqO,OAAO,CACVg9B,YAAa,WAEX,OADY17C,EAAEmG,MACDqY,KAAK,WAAaxe,GAChC,EACD27C,eAAgB,SAAUt6B,EAASu6B,EAAIn6B,GACrC,IAGIo6B,EAHA9uB,EAAQ/sB,EAAEmG,MACZ0X,EAAOkP,EAAM1nB,IAAI,GAMnB,GAH4Bw2C,EAAxBp6B,aAAiB/R,MAAmB+R,EAAMxT,QAC7BwT,EAEZrF,SAASyD,KAAK46B,SAAS58B,GAM5B,GAFAkP,EAAMvO,KAAK,YAAao9B,GAEnBA,EAmCH7uB,EAAMhH,KAAK,gBAAgB,GAC3BgH,EAAM2uB,cAAc9lB,SACpB7I,EAAMZ,YAAY,iBAClBY,EAAMd,SAAS,aAEfc,EAAM1Q,QAAQ,gBAETgF,EAAQi2B,QAAUj2B,EAAQyY,eACzBle,GAAKvW,IAAI,yBACXgzC,GAAgBx6B,OA5Cb,CACP,IAAIi+B,EAAS/uB,EAAM2uB,cACjBzS,EAAUlc,EAAM0e,GAAG,wBACf1e,EAAM1jB,OACN0jB,EAAMvO,KAAK,UAEjBuO,EAAMhH,KAAK,gBAAgB,GAEL,IAAlB+1B,EAAO30C,SACJka,EAAQi2B,QAAWj2B,EAAQk2B,WAC9BuE,EAAS97C,EACP,eAAe+sB,EAAMhH,KAAK,6EAE5BgH,EAAMvO,KAAK,SAAUs9B,KAMrBA,EAAO30C,OAAS,GACd20C,EAAOt9B,KAAK,mBAAqBq9B,IACnCC,EAAOt9B,KAAK,gBAAiBq9B,GAC7BC,EAAOj7B,KAAKg7B,IAGXx6B,EAAQi2B,QAAWj2B,EAAQk2B,WAC9BxqB,EAAMd,SAAS,iBAEfgd,EAAQY,MAAMiS,GAEd97C,EAAE,iBAAiB+sC,SAAS+O,GAE5B/uB,EAAM1Q,QAAQ,aAAc,CAACw/B,EAAW5S,EAAS6S,IAEzD,CAcG,EAGD1Y,SAAU,SAAU/hB,GAoBlB,OAnBKA,IACHA,EAAU,CAAA,QAEW1Y,IAAnB0Y,EAAQi2B,SACVj2B,EAAQi2B,QAAS,QAEM3uC,IAArB0Y,EAAQk2B,WACVl2B,EAAQk2B,UAAW,QAOS5uC,IAA1B0Y,EAAQyY,gBACVzY,EAAQyY,eAAgB,GAInB95B,EAAEmG,MAAM2mB,MAAK,WAClB,IAEE+uB,EAFE9uB,EAAQ/sB,EAAEmG,MACZy1C,GAAK,EAGP,IAEEA,EEngED,SAAuB/9B,GAC5B,MAAMk+B,EAAQ/7C,EAAE6d,GACdkN,EAAUgxB,EAAMv9B,KAAK,WACpB,IACD0C,EAEA7e,EACA25C,EAJEJ,GAAK,EAMT,QAAgBjzC,IAAZoiB,EACF,KAAM,kBAGR,IAAwB,IAApBA,EAAQU,QACV,OAAO,EAMT,GAJAuwB,EAAWrsB,GAAU5E,EAAQrE,aAE7BrkB,EAAM05C,EAAM15C,MAER0oB,EAAQkxB,aACV/6B,EAAK,IAAIC,OAAO4J,EAAQkxB,aACnB/6B,EAAG/V,KAAK9I,IACX,MAAMwG,EACJkiB,EAAQ8wB,UACRrqC,EAAQ4C,GAAM,QAAS/R,GAAMwkB,GAA7BrV,CAAuCuZ,IAG7C,GAAIA,EAAQsB,UACO,SAAb2vB,EACFJ,EAAKG,EAAMtQ,GAAG,kBACQ,QAAbuQ,EAGTJ,EAAa,OAARv5C,GAAwB,KAARA,EACW,YAAvB0oB,EAAQrE,YACjBk1B,EAAKG,EAAMtQ,GAAG,YACmB,SAAxB1gB,EAAQrE,aACU,IAAvBqE,EAAQ2a,WACQ3a,EAAQib,QAAQpgC,KAChCmU,GACEF,GAAO,cAAe,eACtBA,GAAO,cAAe,gBAIxB+hC,EAAKG,EAAMtQ,GAAG,mBAKhBmQ,EAAK7wB,EAAQ9kB,MAAMkB,OAAS,IAA4B,IAAvB4jB,EAAQ2a,YAG3CxkB,EAAK,KACL06B,EAAK16B,EAAG/V,KAAK9I,KAEVu5C,GACH,MAAMhpC,EAAK,CACT,CAACJ,EAAK,CAAC,WAAY,gBAAiBA,EAAK,CAAC,WAAY,iBACtD,CACEqH,GAAO,cAAe,kBACtBrI,GAAQuE,GAAKzK,EAAWjK,EAAE,iBAAkB0U,IAAI8Q,KAElD,CACE9U,EAAO,CAAC,MAAO,QAAQlK,QAAQm0C,IAAa,GAC5CxqC,GAAQuE,GAAKlN,EAAOxH,EAAE,mBAAoB0U,IAAI8Q,KAEhD,CAAC5U,EAAGT,GAAQuE,GAAKlN,EAAOxH,EAAE,kBAAmB0U,IAAI8Q,MAV7CjU,CAWHmY,GAGP,GAAIA,EAAQiB,WAAajB,EAAQiB,UAAY,IAC3C4vB,EAAKv5C,EAAI8E,QAAU4jB,EAAQiB,WACtB4vB,GACH,MAAM/yC,EACJ2J,EAAK,CAAC,WAAY,kBAAlBA,CAAqCuY,IACnC1pB,EAAE,6DACJwlB,GAASkE,IAIf,OAAIH,GAAUG,EAAQrE,aAAa0c,UAC1BxY,GAAUG,EAAQrE,aAAa0c,SAASrY,EAAS1oB,EAG5D,CF66Da65C,CAAcnvB,EAIpB,CAHC,MAAO3J,GACPw4B,GAAK,EACLC,EAAYz4B,CACb,CAED,OAAO2J,EAAM4uB,eAAet6B,EAASu6B,EAAIC,EAC/C,GACG,IAMH77C,EAAEoc,UAAU2D,GAAG,UAAW,UAAU,WAClC,IAAIo8B,EACJ,KAAQA,EAAc/E,GAAW/tC,QAC/B8yC,EAAcn8C,EAAEm8C,GACZn8C,EAAEmG,MAAMslC,GAAG,UAERzrC,EAAEmG,MAAMkpB,OAAO,eAAe/oB,IAAI61C,IACrCA,EAAY/Y,SAAS,CAAEtJ,eAAe,IAEpCqiB,EAAY92C,IAAI,IAAMrF,EAAEmG,MAAMd,IAAI,IACpC82C,EAAY/Y,SAAS,CAAEtJ,eAAe,GAG9C,IAEA95B,EAAEoc,UAAU2D,GACV,SACA,4CACA,WACE,IAAIgN,EAAQ/sB,EAAEmG,MACZkb,EAAU,CAAEi2B,QAAQ,EAAOC,UAAU,GACnCxqB,EAAM0e,GAAG,UAEX1e,EAAMhd,QAAQ,eAAeqzB,SAAS/hB,GAEtC0L,EAAMqW,SAAS/hB,EAElB,IAIHrhB,EAAEoc,UAAU2D,GAAG,SAAU,0BAA0B,WACjD/f,EAAEmG,MAAM4J,QAAQ,cAAcqzB,UAChC,IAkBA,MAAMgZ,GAAiB5qC,EAAQY,EAAK,eAAgBsd,IAE9C2sB,GAAoB7/B,IACxB,MAAM8/B,EAAU9pC,EAAK,CAAC,YAAa,OAAQ,oBAA3BA,CAAgD0P,IAChE,MACc,WAAZo6B,GACCA,aAAmBh0C,OAAS0N,GAASomC,GAAe5/B,GAAM8/B,EAC3D,EAvBJ,IAAkBC,GAAMC,GAAMC,GACxBC,GA6BN18C,EAAEoc,UAAU2D,GACV,UACA,4CAhCgBw8B,GA0BlB,WACMF,GAAkBl2C,OAAOnG,EAAEmG,MAAMqY,KAAK,YAAaxe,EAAEmG,MAAM9D,MACjE,EA5BwBm6C,GAiCJ,GAjCUC,IAiCN,EA/Bf,WACL,IAAIE,EAAUx2C,KACZqC,EAAOC,UACLm0C,EAAQ,WACVF,GAAU,KACLD,IAAWF,GAAK1jC,MAAM8jC,EAASn0C,EAC1C,EACQq0C,EAAUJ,KAAcC,GAC5Bx3C,OAAOukC,aAAaiT,IACpBA,GAAUx3C,OAAO0c,WAAWg7B,EAAOJ,IAC/BK,GAASN,GAAK1jC,MAAM8jC,EAASn0C,EACrC,IAuBAxI,EAAEoc,UAAU2D,GACV,QACA,4CACA,WACE,GAAIs8B,GAAkBl2C,MAAO,CAC3B,IAAI4mB,EAAQ/sB,EAAEmG,MACZ22C,EAAS/vB,EAAMvO,KAAK,aACpBnc,EAAM0qB,EAAM1qB,WACCsG,IAAXm0C,GAAwBA,IAAWz6C,IACrC0qB,EAAM1Q,QAAQ,UACd0Q,EAAM1B,WAAW,aAEpB,CACF,IASH,MAAMyvB,GAAqBtpC,GACzBnP,IAAe,IAARA,GACPmQ,EAAK,CAAC,YAAa,OAAQ,2BAEvBuqC,GAAiBviC,IACrB6S,GACEA,EAAMM,SAAW/R,GAAKH,OAAO,uBAAwB0D,QAAQkO,EAAM2V,YAYvE,SAAS+P,GAAa9pB,EAAIzK,GAExB,IAAIw+B,EAASh9C,EAAE,yBAA8Bwe,KAAK,WAChD+6B,EAAS/6B,EAAK+6B,OACd0D,EAAOj9C,EAAE,SAWX,GADAu5C,EAAO9yC,QAAQy2C,KACV,CAAC,OAAQ,QAAQlnC,SAAS0M,GAAKG,YAAc2H,GAAWtI,IAAO,CAElE,IAAK,IAAImL,KAASjR,SAASG,iBAAiB,UAC1C,GAAI7H,GAAW5B,EAAI+G,GAAO,UAAWwT,EAAM1Q,QAAa,MAApDjI,CAAyD6kC,GAE3DlsB,EAAMiK,WAAW4K,YAAY7U,QACxB,GAAI3K,GAAKkjB,KAAOvY,EAAM1Q,QAAa,MAAM+F,GAAKmoB,QAAS,CAG5D,MAAMsS,EAAMv3C,EAAKiU,GAAO,UAAWwT,EAAM1Q,QAAa,KAA1C/W,CAA8C2zC,GACpD6D,EAAWhhC,SAASoY,cAAc,SACxCnH,EAAMiK,WAAW+lB,aAAaD,EAAU/vB,GACxC8vB,EAAIG,UAAYF,CACjB,CAEH5rC,EACEhE,GACEgE,EACEa,IACE,EAAGw4B,aACDzuB,SAASoB,cAAc,oBAAoBqtB,SAC7Cxd,IACEkrB,GAAe,CACbgB,OAAQ,CAAC,CAAE5rB,SAAS,EAAMd,SAAUQ,EAAMR,aAE5C,MAAMrQ,EAAMJ,SAASoB,cACnB,oBAAoB6P,EAAMwd,aAE5B0S,GAA2B/gC,EAAK6Q,EAAM,GAExCmwB,IAEFT,KAGJU,GApBFjsC,CAqBE+nC,EACN,MAEIv5C,EAAE,kBAAmBi9C,GAAMrnB,SACL,QAAlBlT,GAAKG,WAAuB02B,EAAOpyC,OAAS,EAE9CoyC,EAASA,EAAOvkC,QAAO,SAAUqY,GAC/B,OAAOA,EAAMM,SAAWN,EAAMwd,UAAYmS,CAClD,IAEwB,SAAlBt6B,GAAKG,WACL7iB,EAAE,gBAAgBmH,OAAS,GAC3BoyC,EAAOpyC,OAAS,EAGhBoyC,EAASA,EAAOvkC,QAAO,SAAUqY,GAC/B,OAAOA,EAAMM,OACrB,IACWsvB,EAAK1J,QAGZ0J,EAAK9Z,OACL3xB,EAAQhE,GAAIgE,EAAQgsC,GAAaT,KAAkBU,GAAnDjsC,CAA+D+nC,GAEjE0D,EAAKl3B,KAAK,OAAQvH,EAAK47B,eAAesD,OAGjCttB,GAAWlO,OACbitB,GAAGwO,oBAAsBA,MAE1B39C,EAAE,qEAAqE+lB,KACrE,CACE,gBAAgB,EAChBtJ,QAAU,IAIlB,CAEA,SAASghC,GAAWlE,GAElB,OAAOA,EAAO5vC,MAAK,SAAU0H,EAAG3C,GAC9B,OAAO2C,EAAEusC,MAAQlvC,EAAEkvC,KACvB,GACA,CAEA,SAASxC,GAAa/pC,EAAG3C,GACvB,IAAK2C,EAAE,GAAI,OAAO3C,EAAEoD,UACpB,IAAI+rC,EAAKxsC,EAAE/H,QACTw0C,EAAKpvC,EAAE,GACT,OACEovC,GACmB,UAAnBD,EAAGn3B,aACFm3B,EAAGhwB,eACWllB,IAAfm1C,EAAGC,SACgB,UAAnBD,EAAGp3B,aACiB,cAAnBo3B,EAAGp3B,cAA+Bo3B,EAAGxc,UACnB,aAAnBwc,EAAGp3B,aAuCDo3B,GACmB,UAAnBD,EAAGn3B,cACFm3B,EAAGhwB,UACe,aAAnBiwB,EAAGp3B,cAEHm3B,EAAG7c,MAAQ8c,EAAGxxB,GACVhmB,GAAI,UAAWw3C,KAAKD,EAAGvyB,aAAewyB,EAAGzxB,SACzC/lB,GAAI,WAAYw3C,KAAKD,EAAGjyB,SAAWkyB,EAAGlyB,UAC1CiyB,EAAG7a,QAAU,YAAY73B,KAAK2yC,EAAGjwB,UACjCgwB,EAAG5vB,SAAW3rB,OAAOgV,OAAO,CAAA,EAAIwmC,EAAG7vB,SAAU4vB,EAAG5vB,UAChD6vB,EAAGhwB,KAAOgwB,EAAGhwB,MAAQ,CAAA,EACrBgwB,EAAGhwB,KAAKwX,OAASuY,EAAG53C,OAAS,IAAIud,OACjCs6B,EAAG5vB,KAAO4vB,EAAG5vB,MAAQ,CAAA,EACjB4vB,EAAGzxB,UAASyxB,EAAG5vB,KAAKsU,UAAW,GAC/Bqb,EAAGxxB,UAASwxB,EAAG3vB,KAAKsU,UAAW,IAE9B4Y,GAAa/pC,EAAG,CAACwsC,GAAI1pC,OAAOzF,MApDnCA,EAAEpF,QACFw0C,EAAGC,SAAU,EACTz3C,GAAI,UAAWw3C,KAAKD,EAAGvyB,aAAewyB,EAAGzxB,SACzC/lB,GAAI,WAAYw3C,KAAKD,EAAGjyB,SAAWkyB,EAAGlyB,UAC1CiyB,EAAG7a,QAAU8a,EAAG9a,QAAU,YAAY73B,KAAK2yC,EAAGjwB,UAC9CgwB,EAAG5vB,SAAW3rB,OAAOgV,OAAO,CAAA,EAAIwmC,EAAG7vB,SAAU4vB,EAAG5vB,UAChD6vB,EAAGhwB,KAAOgwB,EAAGhwB,MAAQ,CAAA,EACrBgwB,EAAGhwB,KAAKwX,OAASuY,EAAG53C,OAAS,IAAIud,OACjCs6B,EAAG5vB,KAAO4vB,EAAG5vB,MAAQ,CAAA,EACjB4vB,EAAGzxB,UAASyxB,EAAG5vB,KAAKsU,UAAW,GAC/Bqb,EAAGxxB,UAASwxB,EAAG3vB,KAAKsU,UAAW,GAGjC,CAAC,QAAS,iBAAkB,UAAW,aAAaxsB,SAClD8nC,EAAGp3B,aAGDyoB,GAAGjtB,KAAKC,KAAKE,iBACfw7B,EAAGn3B,YAAc,SACjBm3B,EAAG/9B,UAAY,YAEfg+B,EAAG5vB,KAAKqU,WAAasb,EAAGvxB,GAEE,SAAnBwxB,EAAGp3B,YACRyoB,GAAGjtB,KAAKC,KAAKC,UACfy7B,EAAGn3B,YAAc,UACjBo3B,EAAGtW,QAAUqW,GAEbC,EAAG5vB,KAAKqU,WAAasb,EAAGvxB,GAG1BuxB,EAAG7c,MAAQ8c,EAAGxxB,GAET8uB,GAAa/pC,EAAG,CAACysC,EAAID,GAAI1pC,OAAOzF,IAqB3C,CAEA,SAASwuC,GAAc7vB,GACrB,IAAIR,EAAWQ,EAAMR,UAInBA,EAAS,IACmB,UAA5BA,EAAS,GAAGnG,aACXmG,EAAS,GAAGgB,UACZhB,EAAS,GAAGiD,QAEbjD,EAAS,GAAGnG,YAAc,SAC1B2G,EAAMyd,YAAcje,EAAS,GAAG5mB,MAEpC,CAEA,MAAMs3C,GAA6B,CAAC/gC,EAAK6Q,KACvC7Q,EAAIsV,UAAUrW,OAAO,WAAY4R,EAAMM,SACvCnR,EAAIsV,UAAUrW,OAAO,cAAe4R,EAAMM,SACtCN,EAAMM,SAAWtD,GAAenI,KAClC1F,EAAIga,gBAAgB,eACpBha,EAAIga,gBAAgB,cAEpBha,EAAI+S,aAAa,eAAe,GAChC/S,EAAI+S,aAAa,WAAY,YAC9B,EAGGyuB,GAAgB5jC,GAAO,CAAC,WAAY,QAAS,UAEnD,SAASojC,GAAYnwB,GACnB,IAAIR,EAAWQ,EAAMR,SACnBS,EAASttB,EACP,4BACGg+C,GAAc3wB,GAAS,gBAAkB,kBACzCA,EAAMa,MAAQb,EAAMa,KAAK+vB,YACtB,sBAAwB5wB,EAAMa,KAAK+vB,YAAc,IACjD,IACJ,gBAINj+C,EAAE,UAAU8sB,MAAK,WACX9sB,EAAEmG,MAAMqY,KAAK,aAAe6O,EAAMwd,SAAS7qC,EAAEmG,MAAMyvB,QAC3D,IAEE,MAAMpZ,EAAM8Q,EAAOjoB,IAAI,GACvBmX,EAAIG,QAAa,IAAI0Q,EAAe,QACpCC,EAAO9O,KAAK,UAAW6O,EAAe,SAEtCR,EAAWuuB,GAAavuB,EAASrmB,MAAM,GAAI,IAEvC4pB,GAAWlO,MAAO2K,EAAWsD,GAAWtD,IAE5C7sB,EAAE6sB,GAAUC,MAAK,SAAU5lB,EAAG6O,GACxBqa,GAAWlO,IACb1F,EAAI0W,YAAYX,GAAgBnF,GAAUC,EAAO,EAAjCkF,CAAoCxc,IAC/CqX,GAASrX,EAAGsX,EAAO7Q,EAC9B,IAEEA,EAAIsV,UAAUtY,IAAI,iBAAmB6T,EAAM6wB,YAC3C1hC,EAAI+S,aAAa,YAAalC,EAAM5jB,MAC/B0lC,GAAG1wB,OAAO,eAAejC,EAAI+S,aAAa,gBAAiBlC,EAAMuwB,OAEtEL,GAA2B/gC,EAAK6Q,GAE5BA,EAAMiwB,WACRjwB,EAAMiwB,UAAUhmB,WAAW+lB,aAAa7gC,EAAK6Q,EAAMiwB,kBAC5CjwB,EAAMiwB,WAEW,UAApBjwB,EAAM6wB,WAAwBl+C,EAAE,SAASsvB,QAAQ9S,GAChDxc,EAAE,SAASgG,OAAOwW,EAE3B,CAUA,SAASmhC,KACP39C,EAAE,sDAAsD8sB,MAAK,WAC3D,IAAIC,EAAQ/sB,EAAEmG,MACViJ,EAAQ2d,EAAM1jB,KAChB,mEAEE80C,EAAQ/uC,EAAMoP,KAAK,QACnB4/B,EAAmBrxB,EAAMvT,IAAIpK,GAE7BgvC,EAAiBj3C,OAAS,EAC5Bi3C,EAAiBhvB,QACf,8CAAgD+uB,EAAQ,aAG1DC,EAAmBrxB,EAAMmkB,KAAK,mBAAmB13B,IAAIrT,OAChCgB,OAAS,GAC5Bi3C,EAAiBhvB,QACf,+DAGNgvB,EACG/uB,OAAO,0BACPrpB,OAAO,gCACVhG,EAAE8sB,KACAsxB,EAAiB/uB,OAAO,0BAA0BzpB,KAAK,gBACvD,WACE,IAAImnB,EAAQ/sB,EAAEmG,MACd,GAAI4mB,EAAMhH,KAAK,SAAU,CACvB,IAAIs4B,EAAYtxB,EAAMhH,KAAK,SAAS1d,MAAM,sBACtCg2C,IACFA,EAAYA,EAAU,GAAGv4C,QAAQ,SAAU,SAC3CinB,EAAMhd,QAAQ,0BAA0Bkc,SAASoyB,GAEpD,CACF,GAEP,GACA,CAUAr+C,EAAEoc,UACC2D,GAAG,kCAAmC,cAAc,SAAUkJ,GAC7D,IAAI8D,EAAQ/sB,EAAEmG,MACd4mB,EAAMzQ,YAAY,UAAW2M,EAAGtY,OAAOuN,SAChB,UAAnB+K,EAAGtY,OAAOnB,MAAoByZ,EAAGtY,OAAOuN,SAC1C6O,EAAMuxB,WAAWnyB,YAAY,UAEnC,IACGpM,GAAG,QAAS,cAAc,SAAUkJ,GAEnC,OADAjpB,EAAEmG,MAAM8lB,SAAS,SACM,UAAnBhD,EAAGtY,OAAOnB,OACZyZ,EAAGuoB,iBACHvoB,EAAGsoB,4BACI,EAGb,IACGxxB,GAAG,OAAQ,cAAc,WACxB/f,EAAEmG,MAAMgmB,YAAY,QACxB,IACGpM,GACC,UACA,0BAEA,SAAUkJ,GACR,IAAIs1B,EAGFz8C,EAFQ,CAAC,GAAI,GAAI,GAAI,IAET+F,QAAQohB,EAAGygB,SACzB,OAAa,IAAT5nC,KAEJy8C,EACEz8C,EAAM,EACF9B,EAAEmG,MAAM+qC,OAAOtrC,KAAK,uBACpB5F,EAAEmG,MAAMkD,OAAOzD,KAAK,wBAGduB,SACVo3C,EACEz8C,EAAM,EACF9B,EAAEmG,MAAMm4C,WAAW17B,OAAOhd,KAAK,uBAC/B5F,EAAEmG,MAAMm4C,WAAWpoC,QAAQtQ,KAAK,yBAEpC24C,EAAOp3C,SACTo3C,EAAOliC,QAAQ,SACf4M,EAAGuoB,iBACHvoB,EAAGsoB,4BACI,GAGV,IAgBLvxC,EAAEoc,UAAU2D,GAAG,oBAAoB,CAAC1e,EAAGmd,KACjClY,GAAI,WAAYkY,IAClB5Q,EAAMiB,SAASuD,EAAK,WAAYoM,GACjC,IAGHxe,EAAEoc,UAAU2D,GAAG,oBAAoB,CAAC1e,EAAGmd,KAEjClY,GAAI,WAAYkY,IAClB5Q,EAAMiB,SAASuD,EAAK,WAAYoM,GACjC,IAGHxe,EAAEoc,UAAU2D,GAAG,sBAAsB,CAACgqB,EAAQpuB,KACvCA,GACH/N,EACGG,UACAgB,MAAKC,GAAapB,EAAMkB,YAAY,CAAEE,YAAWQ,KAAM,eAC3D,IAGH5B,EAAMC,iBAAiB,WAAWI,IAChCL,EAAMG,UAAUgB,MAAKyvC,IACfvwC,EAAQuQ,KAAKxP,YAAcwvC,GACH,cAAtBvwC,EAAQuQ,KAAKhP,OAAsBtK,OAAOwzC,SAAWD,KAC1D,GACD,IAOJtJ,GAAGnuB,WAAaA,GAChBmuB,GAAG0J,KAAOA,GACV1J,GAAGkE,WAAaA,GAChBlE,GAAGsJ,OAASA,GACZtJ,GAAG+J,KAAOA,GAEV/J,GAAG/pB,aAAexX,GAASiR,GAAKE,QAAQ,CAAEwzB,SAAU3kC,IACpDuhC,GAAGsG,QAAUA,GACbtG,GAAGmC,KAAOA,GACVnC,GAAGyJ,QAAU,WACXnD,GAAQ52B,GAAKJ,OAAO,UACtB,EACA0wB,GAAGsP,OAAS,SAAgBtH,EAAI91B,GAC9BiwB,GAAK,SAAU6F,EAAI91B,EACrB,EACA8tB,GAAGniB,OAAS,SAAgBmqB,EAAI91B,GAC9BiwB,GAAK,SAAU6F,EAAI91B,EACrB,EACA8tB,GAAGuP,UAAY,SAAmBr9B,GAChCiwB,GAAK,YAAatxC,EAAEqlC,KAAMhkB,EAC5B,EACA8tB,GAAG9lC,KAAO,SAAc8tC,EAAI91B,GAC1BiwB,GAAK,OAAQ6F,EAAI91B,EACnB,EACA8tB,GAAGwP,MAAQ,SAAexH,EAAI91B,GAC5BiwB,GAAK,QAAS6F,EAAI91B,EACpB,EACA8tB,GAAGqJ,KAAO,SAAcrB,EAAI91B,GAC1BiwB,GAAK,OAAQ6F,EAAI91B,EACnB,EACA8tB,GAAG8D,SAAW,SAAkBpI,EAASsM,EAAI91B,EAAU,MACrDiwB,GAAK,WAAY6F,EAAI70C,OAAOgV,OAAO,CAAE,EAAE,CAAEuzB,WAAWxpB,GACtD,EACA8tB,GAAGyP,UAAY,SAAmBC,EAAU1H,GAC1C7F,GAAK,YAAa6F,EAAI,CAAEQ,aAAckH,GACxC,EACA1P,GAAG1wB,OAASI,GAAKJ,OACjB0wB,GAAG/tB,OAASA,GAAOS,KAAK,KAAM,CAAE,GAChCstB,GAAGxrB,KAAO,CACR7d,QAAS4c,GAAK5c,QACd6c,KAAM,WACJ,OAAOD,GAAKC,IACb,EACDU,QAASX,GAAKW,QACdI,KAAMf,GAAKe,KACXZ,UAAW,WACT,OAAOH,GAAKG,SACb,GAEHssB,GAAG/jC,IAAMwzB,GACTuQ,GAAG7R,SAAWA,GACd6R,GAAG0F,QAAU1F,GAAG0F,SAAW,GAC3B1F,GAAGiI,WAAaA,GAChBjI,GAAG5mC,iBAAmBA,EACtB4mC,GAAGhmB,UAAYA,GACfgmB,GAAGrtB,WAAaA,GAChBqtB,GAAGkJ,gBAAkBA,GAErBnzC,OAAOiqC,GAAK,CACVyJ,QAASzJ,GAAGyJ,QACZn6B,OAAQ0wB,GAAG1wB,OACX45B,gBAAiBlJ,GAAGkJ,gBACpBz8B,QACAs9B,SGjjFF,SAAS4F,GAAoBt3B,EAAOu3B,GAC9BA,EAAgB53C,SAClBqgB,EAAM0G,KAAO1G,EAAM0G,MAAQ,CAAA,EAC3B1G,EAAM0G,KAAK+vB,YAAcc,EAAgB13C,KAAK,KAElD,CClCAhG,EAAEmB,gBAbiB,CACjB,4BAA6B,CAC3Bw8C,GAAM,4BACNC,GAAM,0BACN,QAAS,6BAEX,kBAAmB,CACjBD,GAAM,kBACNC,GAAM,kCACN,QAAS,qBDCbj/C,EAAEoc,UAAU2D,GAAG,oBAAoB,SAAUwM,EAAO/N,GAC9CA,GAAQA,EAAK+6B,QACfv5C,EAAE8sB,KAAKtO,EAAK+6B,QAAQ,SAAUl4C,EAAGgsB,GAC/B,IAAI6xB,EAAU,GACZC,EAAW,GACbn/C,EAAE8sB,KAAKO,EAAMR,UAAU,SAAU/qB,EAAKipB,GACQ,oBAAxCA,EAAQ,cAAc9S,cACxBinC,EAAQ93C,KAAK2jB,EAAQuB,IACZvB,EAAQ8C,UAAoC,UAAxB9C,EAAQrE,aACrCy4B,EAAS/3C,KAAK2jB,EAAQuB,IAExB,MAAM8yB,EAAa5sC,EAAK,CAAC,WAAY,eAAgBuY,GACjDq0B,GACF5tC,EACEsI,GACEqF,QACA3N,GAAQ8a,GAAM6yB,EAAS/3C,KAAKklB,IAAKla,EAAK,QAExCxM,GAAKmQ,GAAKA,EAAEyV,YAAczV,EAAEyV,WAAW0K,SAAS,IAAIkpB,OACpDhtC,EAAK,YANPZ,CAOE6b,GAEAtC,EAAQ8C,UAAoC,UAAxB9C,EAAQrE,cAC9Bo4B,GAAoB/zB,EAASo0B,GAC7BA,EAAW,GAErB,IACML,GAAoBzxB,EAAO6xB,EACjC,GAEA,IElCA52C,MAAMhB,UAAU+3C,SAAW,SAAUb,GACnC,IAAIc,EAAQd,GAER,SAAU1qB,GACR,OAAOA,CACf,EAEMyrB,EAAO,CAAA,EAQXp5C,KAAKqH,KAAI,SAAUnD,IAPT,SAAUmD,EAAKpL,EAAK6D,GACvBuH,EAAI8xC,EAAMl9C,MACboL,EAAI8xC,EAAMl9C,IAAQ,IAEpBoL,EAAI8xC,EAAMl9C,IAAMgF,KAAKnB,EACzB,CAGIu5C,CAAID,EAAMl1C,EAAKA,EACnB,IAEE,IAAIkO,EAAM,GACV,IAAK,IAAInW,KAAOm9C,EACdhnC,EAAInR,KAAKm4C,EAAKn9C,IAEhB,OAAOmW,CACT,ECxBA,SAAWvY,EAAGmuC,EAAKhP,GACjB,SAASsgB,EAAeC,GACtB,GAAuB,IAAnBA,EAAM3pB,SAAqC,CAC7C,IACE4pB,EAAQ,GACRC,EAFQF,EAAMG,UAEFl4C,MAAM,KAClBm4C,EAAWF,EAAM1vC,MAEF,KAAb4vC,IACFH,EAAQ,IACRG,EAAWF,EAAM1vC,OAEnBwvC,EAAMG,UAAYD,EAAMv4C,KAAK,KAC7Bq4C,EAAMpoB,WAAW8N,mBACf,YACA,sCACE0a,EADF,+CAIEH,EAEV,MAAkC,IAAnBD,EAAM3pB,UACX2pB,EAAMK,WAAWN,EAAeC,EAAMK,UAE7C,CAED//C,EAAEm/B,GAAKpf,GAAG,cAAc,SAAUwM,EAAOzB,EAASC,EAASI,GACzD,GAAIA,EAAQtjB,QAAQ,iBAAmB,EACrC,GAAIkjB,EAAQO,aACVm0B,EAAe30B,EAAQzlB,IAAI,GAAG06C,eACzB,CACL,MAAMC,EAASl1B,EAAQllB,KAAK,wBAC5B,IAAKo6C,EAAO36C,IAAI,GAAI,OACpB26C,EAAOp6C,KAAK,OAAOgwB,SACnB,MAAMqqB,EAAWD,EAAO36C,IAAI,GAAGwwB,WAAW,GACtCoqB,GAAUjgD,EAAEigD,GAAUC,QAC3B,CAEP,GACC,CAvCD,CAuCGngD,OAAQmF,OAAQkX,UCmnBnB,IAAI+jC,GAAW,CAAA;;;;;AA3pBf,SAAyBC,GACvB,IAAIC,EAAiB/9C,OAAOgF,UAAU/B,SAClCE,EACF6C,MAAM7C,SACN,SAAyB66C,GACvB,MAAuC,mBAAhCD,EAAex5C,KAAKy5C,EACjC,EAEE,SAASC,EAAWD,GAClB,MAAyB,mBAAXA,CACf,CAUD,SAASE,EAAaltC,GACpB,OAAOA,EAAOxN,QAAQ,8BAA+B,OACtD,CAMD,SAAS26C,EAAYp2C,EAAKq2C,GACxB,OAAc,MAAPr2C,GAA8B,iBAARA,GAAoBq2C,KAAYr2C,CAC9D,CAID,IAAIs2C,EAAax/B,OAAO7Z,UAAU6D,KAK9By1C,EAAa,KACjB,SAASC,EAAavtC,GACpB,OANF,SAAoB4N,EAAI5N,GACtB,OAAOqtC,EAAW95C,KAAKqa,EAAI5N,EAC5B,CAISwtC,CAAWF,EAAYttC,EAChC,CAED,IAAI2N,EAAY,CACd,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,QACL,IAAK,SACL,IAAK,SACL,IAAK,UASH8/B,EAAU,MACVC,EAAU,MACVC,EAAW,OACXC,EAAU,QACVC,EAAQ,qBA2NZ,SAASC,EAAQ9tC,GACfnN,KAAKmN,OAASA,EACdnN,KAAKsM,KAAOa,EACZnN,KAAKkoC,IAAM,CACZ,CAwDD,SAASgT,EAAQvwC,EAAMwwC,GACrBn7C,KAAK2K,KAAOA,EACZ3K,KAAK8c,MAAQ,CAAE,IAAK9c,KAAK2K,MACzB3K,KAAKkpB,OAASiyB,CACf,CAwED,SAASC,IACPp7C,KAAK8c,MAAQ,EACd,CAjIDm+B,EAAQ95C,UAAUk6C,IAAM,WACtB,MAAqB,KAAdr7C,KAAKsM,IAChB,EAME2uC,EAAQ95C,UAAUm6C,KAAO,SAAcvgC,GACrC,IAAI7Y,EAAQlC,KAAKsM,KAAKpK,MAAM6Y,GAE5B,IAAK7Y,GAAyB,IAAhBA,EAAMT,MAAa,MAAO,GAExC,IAAI0L,EAASjL,EAAM,GAKnB,OAHAlC,KAAKsM,KAAOtM,KAAKsM,KAAKi+B,UAAUp9B,EAAOnM,QACvChB,KAAKkoC,KAAO/6B,EAAOnM,OAEZmM,CACX,EAME8tC,EAAQ95C,UAAUo6C,UAAY,SAAmBxgC,GAC/C,IACE7Y,EADET,EAAQzB,KAAKsM,KAAKtI,OAAO+W,GAG7B,OAAQtZ,GACN,KAAM,EACJS,EAAQlC,KAAKsM,KACbtM,KAAKsM,KAAO,GACZ,MACF,KAAK,EACHpK,EAAQ,GACR,MACF,QACEA,EAAQlC,KAAKsM,KAAKi+B,UAAU,EAAG9oC,GAC/BzB,KAAKsM,KAAOtM,KAAKsM,KAAKi+B,UAAU9oC,GAKpC,OAFAzB,KAAKkoC,KAAOhmC,EAAMlB,OAEXkB,CACX,EAgBEg5C,EAAQ/5C,UAAUF,KAAO,SAAc0J,GACrC,OAAO,IAAIuwC,EAAQvwC,EAAM3K,KAC7B,EAMEk7C,EAAQ/5C,UAAUq6C,OAAS,SAAgBl4C,GACzC,IAEIxD,EAFAgd,EAAQ9c,KAAK8c,MAGjB,GAAIA,EAAMtgB,eAAe8G,GACvBxD,EAAQgd,EAAMxZ,OACT,CAML,IALA,IACED,EACA5B,EAFE+0C,EAAUx2C,KAGZy7C,GAAY,EAEPjF,GAAS,CACd,GAAIlzC,EAAK5B,QAAQ,KAAO,EAgBtB,IAfA5B,EAAQ02C,EAAQ7rC,KAChBtH,EAAQC,EAAK9B,MAAM,KACnBC,EAAQ,EAaQ,MAAT3B,GAAiB2B,EAAQ4B,EAAMrC,QAChCS,IAAU4B,EAAMrC,OAAS,IAC3By6C,EAAYnB,EAAYx6C,EAAOuD,EAAM5B,KAEvC3B,EAAQA,EAAMuD,EAAM5B,WAGtB3B,EAAQ02C,EAAQ7rC,KAAKrH,GACrBm4C,EAAYnB,EAAY9D,EAAQ7rC,KAAMrH,GAGxC,GAAIm4C,EAAW,MAEfjF,EAAUA,EAAQttB,MACnB,CAEDpM,EAAMxZ,GAAQxD,CACf,CAID,OAFIs6C,EAAWt6C,KAAQA,EAAQA,EAAMY,KAAKV,KAAK2K,OAExC7K,CACX,EAcEs7C,EAAOj6C,UAAUu6C,WAAa,WAC5B17C,KAAK8c,MAAQ,EACjB,EAMEs+B,EAAOj6C,UAAU4H,MAAQ,SAAesV,EAAUs9B,GAChD,IAAI7+B,EAAQ9c,KAAK8c,MACb8+B,EAAS9+B,EAAMuB,GAKnB,OAHc,MAAVu9B,IACFA,EAAS9+B,EAAMuB,GA/VnB,SAAuBA,EAAUs9B,GAC/B,IAAKt9B,EAAU,MAAO,GAEtB,IAmBIw9B,EAAcC,EAAcC,EAnB5BC,EAAW,GACXJ,EAAS,GACTK,EAAS,GACTC,GAAS,EACTC,GAAW,EAIf,SAASC,IACP,GAAIF,IAAWC,EACb,KAAOF,EAAOj7C,eAAe46C,EAAOK,EAAOlyC,YAE3CkyC,EAAS,GAGXC,GAAS,EACTC,GAAW,CACZ,CAGD,SAASE,EAAYC,GAInB,GAH6B,iBAAlBA,IACTA,EAAgBA,EAAc96C,MAAMq5C,EAAS,KAE1Cv7C,EAAQg9C,IAA2C,IAAzBA,EAAct7C,OAC3C,MAAM,IAAIuI,MAAM,iBAAmB+yC,GAErCT,EAAe,IAAI7gC,OAAOq/B,EAAaiC,EAAc,IAAM,QAC3DR,EAAe,IAAI9gC,OAAO,OAASq/B,EAAaiC,EAAc,KAC9DP,EAAiB,IAAI/gC,OACnB,OAASq/B,EAAa,IAAMiC,EAAc,IAE7C,CAEDD,EAAYV,GAAQ1B,EAAS0B,MAK7B,IAHA,IAEIY,EAAOlzC,EAAMvJ,EAAO08C,EAAK/0C,EAAOg1C,EAFhCC,EAAU,IAAIzB,EAAQ58B,IAGlBq+B,EAAQrB,OAAO,CAMrB,GALAkB,EAAQG,EAAQxU,IAGhBpoC,EAAQ48C,EAAQnB,UAAUM,GAGxB,IAAK,IAAI96C,EAAI,EAAG47C,EAAc78C,EAAMkB,OAAQD,EAAI47C,IAAe57C,EAGzD25C,EAFJ8B,EAAM18C,EAAMwB,OAAOP,IAGjBk7C,EAAOh7C,KAAK26C,EAAO56C,QAEnBm7C,GAAW,EAGbP,EAAO36C,KAAK,CAAC,OAAQu7C,EAAKD,EAAOA,EAAQ,IACzCA,GAAS,EAGG,OAARC,GAAcJ,IAKtB,IAAKM,EAAQpB,KAAKO,GAAe,MAuBjC,GArBAK,GAAS,EAGT7yC,EAAOqzC,EAAQpB,KAAKN,IAAU,OAC9B0B,EAAQpB,KAAKV,GAGA,MAATvxC,GACFvJ,EAAQ48C,EAAQnB,UAAUT,GAC1B4B,EAAQpB,KAAKR,GACb4B,EAAQnB,UAAUO,IACA,MAATzyC,GACTvJ,EAAQ48C,EAAQnB,UAAUQ,GAC1BW,EAAQpB,KAAKP,GACb2B,EAAQnB,UAAUO,GAClBzyC,EAAO,KAEPvJ,EAAQ48C,EAAQnB,UAAUO,IAIvBY,EAAQpB,KAAKQ,GAChB,MAAM,IAAIvyC,MAAM,mBAAqBmzC,EAAQxU,KAK/C,GAHAzgC,EAAQ,CAAC4B,EAAMvJ,EAAOy8C,EAAOG,EAAQxU,KACrC0T,EAAO36C,KAAKwG,GAEC,MAAT4B,GAAyB,MAATA,EAClB2yC,EAAS/6C,KAAKwG,QACT,GAAa,MAAT4B,EAAc,CAIvB,KAFAozC,EAAcT,EAASjyC,OAGrB,MAAM,IAAIR,MAAM,qBAAuBzJ,EAAQ,QAAUy8C,GAE3D,GAAIE,EAAY,KAAO38C,EACrB,MAAM,IAAIyJ,MACR,qBAAuBkzC,EAAY,GAAK,QAAUF,EAE9D,KAA0B,SAATlzC,GAA4B,MAATA,GAAyB,MAATA,EAC5C8yC,GAAW,EACO,MAAT9yC,GAETgzC,EAAYv8C,EAEf,CAKD,GAFA28C,EAAcT,EAASjyC,MAGrB,MAAM,IAAIR,MACR,qBAAuBkzC,EAAY,GAAK,QAAUC,EAAQxU,KAG9D,OAkCF,SAAoB0T,GAMlB,IALA,IAIIn0C,EAJAm1C,EAAe,GACfplC,EAAYolC,EACZZ,EAAW,GAGNj7C,EAAI,EAAG87C,EAAYjB,EAAO56C,OAAQD,EAAI87C,IAAa97C,EAG1D,QAFA0G,EAAQm0C,EAAO76C,IAED,IACZ,IAAK,IACL,IAAK,IACHyW,EAAUvW,KAAKwG,GACfu0C,EAAS/6C,KAAKwG,GACd+P,EAAY/P,EAAM,GAAK,GACvB,MACF,IAAK,IACOu0C,EAASjyC,MACX,GAAKtC,EAAM,GACnB+P,EACEwkC,EAASh7C,OAAS,EACdg7C,EAASA,EAASh7C,OAAS,GAAG,GAC9B47C,EACN,MACF,QACEplC,EAAUvW,KAAKwG,GAIrB,OAAOm1C,CACR,CAhEQE,CAOT,SAAsBlB,GAIpB,IAHA,IAEIn0C,EAAOs1C,EAFPC,EAAiB,GAGZj8C,EAAI,EAAG87C,EAAYjB,EAAO56C,OAAQD,EAAI87C,IAAa97C,GAC1D0G,EAAQm0C,EAAO76C,MAGI,SAAb0G,EAAM,IAAiBs1C,GAA8B,SAAjBA,EAAU,IAChDA,EAAU,IAAMt1C,EAAM,GACtBs1C,EAAU,GAAKt1C,EAAM,KAErBu1C,EAAe/7C,KAAKwG,GACpBs1C,EAAYt1C,IAKlB,OAAOu1C,CACR,CA1BmBC,CAAarB,GAChC,CAiO8BsB,CAAc7+B,EAAUs9B,IAE9CC,CACX,EAWER,EAAOj6C,UAAU+mB,OAAS,SAAgB7J,EAAU1T,EAAMwyC,GACxD,IAAIvB,EAAS57C,KAAK+I,MAAMsV,GACpBm4B,EAAU7rC,aAAgBuwC,EAAUvwC,EAAO,IAAIuwC,EAAQvwC,GAC3D,OAAO3K,KAAKo9C,aAAaxB,EAAQpF,EAAS2G,EAAU9+B,EACxD,EAWE+8B,EAAOj6C,UAAUi8C,aAAe,SAC9BxB,EACApF,EACA2G,EACAE,GAKA,IAHA,IAEI51C,EAAO61C,EAAQx9C,EAFfy9C,EAAS,GAGJx8C,EAAI,EAAG87C,EAAYjB,EAAO56C,OAAQD,EAAI87C,IAAa97C,EAC1DjB,OAAQ0C,EAIO,OAFf86C,GADA71C,EAAQm0C,EAAO76C,IACA,IAGbjB,EAAQE,KAAKw9C,cAAc/1C,EAAO+uC,EAAS2G,EAAUE,GACnC,MAAXC,EACPx9C,EAAQE,KAAKy9C,eAAeh2C,EAAO+uC,EAAS2G,EAAUE,GACpC,MAAXC,EACPx9C,EAAQE,KAAK09C,cAAcj2C,EAAO+uC,EAAS2G,EAAUE,GACnC,MAAXC,EAAgBx9C,EAAQE,KAAK29C,eAAel2C,EAAO+uC,GACxC,SAAX8G,EAAmBx9C,EAAQE,KAAK49C,aAAan2C,EAAO+uC,GACzC,SAAX8G,IAAmBx9C,EAAQE,KAAK69C,SAASp2C,SAEpCjF,IAAV1C,IAAqBy9C,GAAUz9C,GAGrC,OAAOy9C,CACX,EAEEnC,EAAOj6C,UAAUq8C,cAAgB,SAC/B/1C,EACA+uC,EACA2G,EACAE,GAEA,IAAIv+C,EAAOkB,KACPu9C,EAAS,GACTz9C,EAAQ02C,EAAQgF,OAAO/zC,EAAM,IAQjC,GAAK3H,EAAL,CAEA,GAAIR,EAAQQ,GACV,IAAK,IAAIg+C,EAAI,EAAGnB,EAAc78C,EAAMkB,OAAQ88C,EAAInB,IAAemB,EAC7DP,GAAUv9C,KAAKo9C,aACb31C,EAAM,GACN+uC,EAAQv1C,KAAKnB,EAAMg+C,IACnBX,EACAE,QAGC,GACY,iBAAVv9C,GACU,iBAAVA,GACU,iBAAVA,EAEPy9C,GAAUv9C,KAAKo9C,aACb31C,EAAM,GACN+uC,EAAQv1C,KAAKnB,GACbq9C,EACAE,QAEG,GAAIjD,EAAWt6C,GAAQ,CAC5B,GAAgC,iBAArBu9C,EACT,MAAM,IAAI9zC,MACR,kEAIJzJ,EAAQA,EAAMY,KACZ81C,EAAQ7rC,KACR0yC,EAAiBh9C,MAAMoH,EAAM,GAAIA,EAAM,KAnC3C,SAAmB4W,GACjB,OAAOvf,EAAKopB,OAAO7J,EAAUm4B,EAAS2G,EACvC,IAqCc,MAATr9C,IAAey9C,GAAUz9C,EACnC,MACMy9C,GAAUv9C,KAAKo9C,aACb31C,EAAM,GACN+uC,EACA2G,EACAE,GAGJ,OAAOE,CA5CY,CA6CvB,EAEEnC,EAAOj6C,UAAUs8C,eAAiB,SAChCh2C,EACA+uC,EACA2G,EACAE,GAEA,IAAIv9C,EAAQ02C,EAAQgF,OAAO/zC,EAAM,IAIjC,IAAK3H,GAAUR,EAAQQ,IAA2B,IAAjBA,EAAMkB,OACrC,OAAOhB,KAAKo9C,aAAa31C,EAAM,GAAI+uC,EAAS2G,EAAUE,EAC5D,EAEEjC,EAAOj6C,UAAUu8C,cAAgB,SAC/Bj2C,EACA+uC,EACA2G,GAEA,GAAKA,EAAL,CAEA,IAAIr9C,EAAQs6C,EAAW+C,GAAYA,EAAS11C,EAAM,IAAM01C,EAAS11C,EAAM,IACvE,OAAa,MAAT3H,EACKE,KAAKo9C,aAAap9C,KAAK+I,MAAMjJ,GAAQ02C,EAAS2G,EAAUr9C,QADjE,CAHsB,CAK1B,EAEEs7C,EAAOj6C,UAAUw8C,eAAiB,SAAwBl2C,EAAO+uC,GAC/D,IAAI12C,EAAQ02C,EAAQgF,OAAO/zC,EAAM,IACjC,GAAa,MAAT3H,EAAe,OAAOA,CAC9B,EAEEs7C,EAAOj6C,UAAUy8C,aAAe,SAAsBn2C,EAAO+uC,GAC3D,IAAI12C,EAAQ02C,EAAQgF,OAAO/zC,EAAM,IACjC,GAAa,MAAT3H,EAAe,OAAOm6C,EAASpyB,OAAO/nB,EAC9C,EAEEs7C,EAAOj6C,UAAU08C,SAAW,SAAkBp2C,GAC5C,OAAOA,EAAM,EACjB,EAEEwyC,EAAS32C,KAAO,cAChB22C,EAASphC,QAAU,QACnBohC,EAAS0B,KAAO,CAAC,KAAM,MAGvB,IAAIoC,EAAgB,IAAI3C,EAKxBnB,EAASyB,WAAa,WACpB,OAAOqC,EAAcrC,YACzB,EAOEzB,EAASlxC,MAAQ,SAAesV,EAAUs9B,GACxC,OAAOoC,EAAch1C,MAAMsV,EAAUs9B,EACzC,EAME1B,EAAS/xB,OAAS,SAAgB7J,EAAU1T,EAAMwyC,GAChD,GAAwB,iBAAb9+B,EACT,MAAM,IAAIja,UACR,0DAvmBG9E,EADQ4E,EA0mBDma,GAzmBQ,eAAiBna,GAumBnC,oFAxmBN,IAAiBA,EAgnBf,OAAO65C,EAAc71B,OAAO7J,EAAU1T,EAAMwyC,EAChD,EAIElD,EAAS+D,QAAU,SAAiB3/B,EAAU1T,EAAMwyC,EAAUc,GAG5D,IAAItwC,EAASssC,EAAS/xB,OAAO7J,EAAU1T,EAAMwyC,GAE7C,IAAI/C,EAAW6D,GAGb,OAAOtwC,EAFPswC,EAAKtwC,EAIX,EAIEssC,EAASpyB,OA5lBT,SAAoB1a,GAClB,OAAO9N,OAAO8N,GAAQxN,QAAQ,gBAAgB,SAAuBxE,GACnE,OAAO2f,EAAU3f,EACvB,GACG,EA2lBD8+C,EAASgB,QAAUA,EACnBhB,EAASiB,QAAUA,EACnBjB,EAASmB,OAASA,CACpB,CAIA8C,CAAgBlE,ICxpBhB,SAAWngD,EAAGmuC,EAAKhP,GACjB,IAAImlB,EAEJnV,GAAGqF,eAAiB,SAAUR,GAC5B,OAAOmM,GAAS9xB,OAAOi2B,EAAMtQ,EACjC,EAEEh0C,GAAE,WACAskD,EAAOtkD,EAAE,uBAAuBuhB,OAChC4+B,GAAS2B,KAAO,CAAC,KAAM,KAC3B,GACC,CAXD,CAWG/hD,QCgBH,SAAWC,EAAGmuC,EAAKhP,GACjBn/B,GAAE,WACA,IAAIukD,EAAUpV,GAAGrtB,WAAWqtB,GAAGjtB,KAAM,WAAvBitB,CAAmC,YAAY,GAE7D,MAAMqV,EAAY,CAACC,EAAKC,KACtB,IAAIC,EAAO3kD,EAAE,IAAIykD,KACjB,GAAsB,iBAAXC,IAAwBC,EAAKx9C,OAAQ,OAAO,EACvD,IAAIy9C,EAAUD,EAAKE,QAOnB,OANcD,EAAQh/C,KAAK,SAASuB,OAChCy9C,EAAQh/C,KAAK,SACbg/C,GACIrjC,KAAKmjC,EAAO7jC,MACpB+jC,EAAQ7+B,KAAK,QAAS2+B,EAAOzjB,OAEtB2jB,CAAO,EAGZL,GACFvkD,EAAEm/B,GAAKpf,GAAG,qBAAqB,CAACjL,EAAG0J,KAEjC+lC,EAAQ99C,SAAQoX,SACOlV,IAAjBkV,EAAKinC,SACP9kD,EAAE8sB,KAAKjP,EAAKinC,SAAS,CAACL,EAAKC,KACzB,IAAIE,EAAUJ,EAAUC,EAAKC,GACzBE,GACF5kD,EAAE,IAAIykD,KAAO7b,YAAYgc,EAC1B,GAEJ,IAEH,IAAInvB,EAAcz1B,EAAE,+BAA+B+lB,KAAK,aACxDw+B,EAAQ99C,SAAQoX,SACYlV,IAAtBkV,EAAK4X,IACPz1B,EAAE8sB,KAAKjP,EAAK4X,IAAc,CAACgvB,EAAKC,KAC9B,IAAIE,EAAUJ,EAAUC,EAAKC,GACzBE,GACF5kD,EAAE,IAAIykD,KAAO7b,YAAYgc,EAC1B,GAEJ,GACD,GAEV,GACC,CA3CD,CA2CG7kD,OAAQmF,OAAQkX,UCvEnB,IAAI3Z,GAAe,CACjB,sBAAuB,CACrBw8C,GAAI,uBACJ8F,GAAI,0BACJC,GAAI,2BACJC,GAAI,4BAIRjlD,GAAE,WACAqa,EAAG7X,gBAAgBC,GACrB,IAEAzC,EAAEoc,UAAU2D,GAAG,qBAAqB,SAAUwM,EAAO/N,GACnD,GAAIA,GAAQA,EAAKxb,OAASwb,EAAKy4B,QAAgC,GAAtBz4B,EAAKy4B,OAAO9vC,OAAa,CAEhE,IACI+9C,EADcllD,EAAE,0BAA0BkW,QAAQ6P,KAAK,WAC5B,EAE/B/lB,EAAE,0BAA0BkW,QAAQ6P,KAAK,CACvCo/B,QAASD,EACTE,SAAU,IAEZplD,EAAE,uBACCkW,QACAlQ,OACC,sCACE3E,EAAE,uBADJ,gFAKJrB,EAAE,mBAAmBkW,QAAQwV,WAAW,WACzC,CACH,IC7BA,EAAEyT,EAAKn/B,KACL,MAAMqlD,EAAoBC,IACxBA,EAASxlC,WAAa,mCACtBwlC,EAASlgB,mBACP,WACA,uEAGWkgB,EAASh5B,kCAGrB,EAaHtsB,EAAEm/B,GAAKpf,GAAG,qBAAqB,CAAC1e,EAAGmd,KAC5BA,GAASA,EAAK+6B,QATAv5C,EAAE,SAAS4F,KAC5B,oDAESknB,MAAK,CAACzrB,EAAGikD,KAClBD,EAAkBC,EAAS,GAMd,IAGjBtlD,EAAEm/B,GAAKpf,GAAG,cAAc,CAAC1e,EAAGypB,GAAWpE,kBACrC,GAAoB,SAAhBA,GAA0C,mBAAhBA,EAAkC,CAC3CoE,EAAQllB,KACzB,oDAESknB,MAAK,CAACzrB,EAAGikD,KAClBD,EAAkBC,EAAS,GAE9B,IAEJ,EAvCD,CAuCGlpC,SAAUrc,0BCtDb,IAAiDwlD,EAS9CrgD,OAT8CqgD,EAStC,WACX,OAAgB,SAAUC,GAEhB,IAAIC,EAAmB,CAAA,EAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAI1oB,EAASuoB,EAAiBE,GAAY,CACzCz+C,EAAGy+C,EACH1xB,GAAG,EACH2xB,QAAS,CAAE,GAUZ,OANAJ,EAAQG,GAAU9+C,KAAKq2B,EAAO0oB,QAAS1oB,EAAQA,EAAO0oB,QAASF,GAG/DxoB,EAAOjJ,GAAI,EAGJiJ,EAAO0oB,OACd,CAyDD,OArDAF,EAAoBhxB,EAAI8wB,EAGxBE,EAAoB3vC,EAAI0vC,EAGxBC,EAAoB33B,EAAI,SAAS63B,EAASn8C,EAAM+G,GAC3Ck1C,EAAoB5xB,EAAE8xB,EAASn8C,IAClCnH,OAAOqD,eAAeigD,EAASn8C,EAAM,CAAEswB,YAAY,EAAM10B,IAAKmL,GAE1E,EAGUk1C,EAAoBpxB,EAAI,SAASsxB,GACX,oBAAX38C,QAA0BA,OAAO48C,aAC1CvjD,OAAOqD,eAAeigD,EAAS38C,OAAO48C,YAAa,CAAE5/C,MAAO,WAE7D3D,OAAOqD,eAAeigD,EAAS,aAAc,CAAE3/C,OAAO,GACjE,EAOUy/C,EAAoB7xB,EAAI,SAAS5tB,EAAO4V,GAEvC,GADU,EAAPA,IAAU5V,EAAQy/C,EAAoBz/C,IAC/B,EAAP4V,EAAU,OAAO5V,EACpB,GAAW,EAAP4V,GAA8B,iBAAV5V,GAAsBA,GAASA,EAAM6/C,WAAY,OAAO7/C,EAChF,IAAI8/C,EAAKzjD,OAAOoD,OAAO,MAGvB,GAFAggD,EAAoBpxB,EAAEyxB,GACtBzjD,OAAOqD,eAAeogD,EAAI,UAAW,CAAEhsB,YAAY,EAAM9zB,MAAOA,IACtD,EAAP4V,GAA4B,iBAAT5V,EAAmB,IAAI,IAAI7D,KAAO6D,EAAOy/C,EAAoB33B,EAAEg4B,EAAI3jD,EAAK,SAASA,GAAO,OAAO6D,EAAM7D,EAAO,EAACyf,KAAK,KAAMzf,IAC9I,OAAO2jD,CAClB,EAGUL,EAAoBjtC,EAAI,SAASykB,GAChC,IAAI1sB,EAAS0sB,GAAUA,EAAO4oB,WAC7B,WAAwB,OAAO5oB,EAAgB,OAAI,EACnD,WAA8B,OAAOA,GAEtC,OADAwoB,EAAoB33B,EAAEvd,EAAQ,IAAKA,GAC5BA,CAClB,EAGUk1C,EAAoB5xB,EAAI,SAASwsB,EAAQ0F,GAAY,OAAO1jD,OAAOgF,UAAU3E,eAAekE,KAAKy5C,EAAQ0F,EAAU,EAGnHN,EAAoB9xC,EAAI,GAIjB8xC,EAAoBA,EAAoBpkD,EAAI,EACnD,CApFM,CAsFN,CAEJ;;;;gCAKN,SAAgB47B,EAAQ+oB,EAAqBP,GAG7CA,EAAoBpxB,EAAE2xB,GACmDP,0BAA6C,yBAEjG,IAGjBQ,EAH6DR,kBAAqC,oBAGzC,QAAEplC,KAEzC,oBAAXpb,SACTA,OAAOghD,QAAUA,GAGUD,EAA6B,QAAK,CAExD,EAED;;;;gCAKN,SAAgB/oB,EAAQ+oB,EAAqBP,GAG7CA,EAAoBpxB,EAAE2xB,GACtB,IAAIE,EAAU,CAEZC,UAAW,WACT,MAAiC,oBAAnBC,cACf,EAEDC,KAAM,WACJ,OAAgD,IAAzCjnC,UAAUsuB,UAAU9lC,QAAQ,WAAoBuU,SAASmqC,YACjE,EAEDC,OAAQ,WACN,OAAQL,EAAQG,UAAYphD,OAAOuhD,UACpC,EAEDC,SAAU,WACR,IAAI/J,EAAUl0C,UAAUtB,OAAS,QAAsBwB,IAAjBF,UAAU,GAAmBA,UAAU,GAAKvD,OAClF,QAASy3C,EAAQgK,MAClB,EAEDC,SAAU,WACR,OAAOtkD,OAAOgF,UAAU/B,SAASsB,KAAK3B,OAAOo0B,aAAazxB,QAAQ,eAAiB,IAA8D,IAAzDwX,UAAUsuB,UAAU11B,cAAcpQ,QAAQ,SACnI,EAEDg/C,YAAa,WACX,OAA+D,IAAxDxnC,UAAUsuB,UAAU11B,cAAcpQ,QAAQ,QAClD,GAE0Bo+C,EAA6B,QAAK,CAExD,EAED;;;;kGAKN,SAAgB/oB,EAAQ+oB,EAAqBP,GAG7CA,EAAoBpxB,EAAE2xB,GACSP,EAAoB33B,EAAEk4B,EAAqB,cAAc,WAAa,OAAOa,CAAW,IACxFpB,EAAoB33B,EAAEk4B,EAAqB,mBAAmB,WAAa,OAAOc,CAAgB,IAClGrB,EAAoB33B,EAAEk4B,EAAqB,iBAAiB,WAAa,OAAOe,CAAc,IAC9FtB,EAAoB33B,EAAEk4B,EAAqB,aAAa,WAAa,OAAOgB,CAAU,IACtFvB,EAAoB33B,EAAEk4B,EAAqB,WAAW,WAAa,OAAOiB,CAAQ,IAClFxB,EAAoB33B,EAAEk4B,EAAqB,aAAa,WAAa,OAAOkB,CAAU,IAChG,IAAIC,EAAsC1B,gBAAmC,qBACzE2B,EAAwC3B,kBAAqC,uBACtG,SAAS4B,EAAQj9C,GAAmV,OAAtOi9C,EAArD,mBAAXr+C,QAAoD,iBAApBA,OAAOC,SAAmC,SAAiBmB,GAAO,cAAcA,CAAI,EAAuB,SAAiBA,GAAO,OAAOA,GAAyB,mBAAXpB,QAAyBoB,EAAIkR,cAAgBtS,QAAUoB,IAAQpB,OAAO3B,UAAY,gBAAkB+C,CAAI,EAAai9C,EAAQj9C,EAAO,CAI1X,SAASy8C,EAAWS,EAAUjqC,GAE5B,MAAO,2BAD0BA,EAAOkqC,KAAO,2BAA6BlqC,EAAOmqC,UAC5E,6BAAoCF,EAAW,QACxD,CACA,SAASR,EAAgB18C,GACvB,OAAOA,EAAI5C,OAAO,GAAG0Q,cAAgB9N,EAAI7D,MAAM,EACjD,CACA,SAASwgD,EAAcnvB,EAASva,GAO9B,IANA,IAEIoqC,EAAe,GAEfltB,GAJMpe,SAASurC,aAAeziD,QAIjB0iD,iBAAiB/vB,EAAS,IAElCz1B,EAAM,EAAGA,EAAMo4B,EAAOrzB,OAAQ/E,MAEK,IAAtCkb,EAAOuqC,aAAahgD,QAAQ,OAA4D,IAA7CyV,EAAOwqC,YAAYjgD,QAAQ2yB,EAAOp4B,KAAgB2lD,EAAkBzqC,EAAOuqC,aAAcrtB,EAAOp4B,MACzIo4B,EAAOwtB,iBAAiBxtB,EAAOp4B,MAAOslD,GAAgBltB,EAAOp4B,GAAO,IAAMo4B,EAAOwtB,iBAAiBxtB,EAAOp4B,IAAQ,KAMzH,OADAslD,GAAgB,cAAgBpqC,EAAO2qC,SAAW,6BAA+B3qC,EAAOmqC,UAAY,cAEtG,CAEA,SAASM,EAAkBvtB,EAAQv0B,GACjC,IAAK,IAAIiB,EAAI,EAAGA,EAAIszB,EAAOrzB,OAAQD,IACjC,GAAuB,WAAnBogD,EAAQrhD,KAAqD,IAA9BA,EAAM4B,QAAQ2yB,EAAOtzB,IAAY,OAAO,EAG7E,OAAO,CACT,CAEA,SAAS+/C,EAAUiB,EAAc5qC,GAE/B,IAAI6qC,EAAkB/rC,SAASuW,cAAc,OAE7C,GAAIw0B,EAAU7pC,EAAOwpB,QACnBqhB,EAAgB/nC,UAAY9C,EAAOwpB,WAC9B,CAEL,IAAIshB,EAAgBhsC,SAASuW,cAAc,MAEvC01B,EAAajsC,SAASub,eAAera,EAAOwpB,QAEhDshB,EAAcl1B,YAAYm1B,GAC1BD,EAAc74B,aAAa,QAASjS,EAAOgrC,aAC3CH,EAAgBj1B,YAAYk1B,EAC7B,CAEDF,EAAazwB,aAAa0wB,EAAiBD,EAAaryB,WAAW,GACrE,CACA,SAASqxB,EAAQ5pC,GAEXA,EAAOirC,WAAWnB,EAA6C,QAAE1O,QAEjEp7B,EAAOkrC,cAAclrC,EAAOkrC,gBAE5BlrC,EAAOirC,WAAajrC,EAAOmrC,iBAAgBvjD,OAAOkG,IAAIs9C,gBAAgBprC,EAAOqrC,WAEjF,IAAIp8B,EAAQ,aAER86B,EAA+C,QAAEX,YAAcW,EAA+C,QAAEjB,eAElH75B,EAAQ,SAeVrnB,OAAO2I,iBAAiB0e,GAZV,SAASq8B,IAErB1jD,OAAO4I,oBAAoBye,EAAOq8B,GAClCtrC,EAAOurC,qBAEP,IAAIC,EAAS1sC,SAAS+D,eAAe7C,EAAOyrC,SAExCD,GACFA,EAAOlzB,QAEb,GAGA,CACA,SAASuxB,EAAU6B,GAEjB,OADgB,IAAI7nC,OAAO,+CACVhW,KAAK69C,EACxB,CAEO,EAED;;;;gCAKN,SAAgB9rB,EAAQ+oB,EAAqBP,GAG7CA,EAAoBpxB,EAAE2xB,GACD,IAAIgD,EAA0CvD,oBAAuC,yBACjFwD,EAAsCxD,gBAAmC,qBAClG,SAAS4B,EAAQj9C,GAAmV,OAAtOi9C,EAArD,mBAAXr+C,QAAoD,iBAApBA,OAAOC,SAAmC,SAAiBmB,GAAO,cAAcA,CAAI,EAAuB,SAAiBA,GAAO,OAAOA,GAAyB,mBAAXpB,QAAyBoB,EAAIkR,cAAgBtS,QAAUoB,IAAQpB,OAAO3B,UAAY,gBAAkB+C,CAAI,EAAai9C,EAAQj9C,EAAO,CA0B1X,SAAS8+C,EAAatxB,EAASva,GAM7B,IAJA,IAAIunC,EAAQhtB,EAAQuxB,YAEhBC,EAAkB/gD,MAAMhB,UAAUd,MAAMK,KAAKgxB,EAAQhC,YAEhD3uB,EAAI,EAAGA,EAAImiD,EAAgBliD,OAAQD,IAE1C,IAA8D,IAA1DoW,EAAOgsC,eAAezhD,QAAQwhD,EAAgBniD,GAAGolB,IAArD,CAKA,IAAIi9B,EAAcJ,EAAaE,EAAgBniD,GAAIoW,GAEnDunC,EAAM3xB,YAAYq2B,EALjB,CAcH,OALIjsC,EAAOksC,YAAmC,IAArB3xB,EAAQ9B,UAC/B8uB,EAAMt1B,aAAa,QAASjtB,OAAO2mD,EAAuD,cAA9D3mD,CAAiEu1B,EAASva,IAIhGua,EAAQzJ,SACd,IAAK,SAEHy2B,EAAM5+C,MAAQ4xB,EAAQ5xB,MACtB,MAEF,IAAK,SAEH4+C,EAAM4E,WAAW,MAAMC,UAAU7xB,EAAS,EAAG,GAIjD,OAAOgtB,CACT,CA3D6BoB,EAA6B,QAAK,CAC7D0D,MAAO,SAAersC,EAAQssC,GAE5B,IA0DmBjB,EA1DfT,EA4DwB,WAAvBZ,EAFcqB,EA1DcrrC,EAAOqrC,YA4DAA,IAAcA,aAAqBrvB,aAAsC,IAAvBqvB,EAAU5yB,UA5D/CzY,EAAOqrC,UAAYvsC,SAAS+D,eAAe7C,EAAOqrC,WAElGT,GAML5qC,EAAOusC,iBAAmBV,EAAajB,EAAc5qC,GAEjDA,EAAOwpB,QACTxkC,OAAO2mD,EAAmD,UAA1D3mD,CAA6Dgb,EAAOusC,iBAAkBvsC,GAIxF4rC,EAA6C,QAAE9E,KAAK9mC,EAAQssC,IAZ1D1kD,OAAO6W,QAAQ0F,MAAM,4BAA8BnE,EAAOqrC,UAa7D,EA+CI,EAED;;;;gCAKN,SAAgBzrB,EAAQ+oB,EAAqBP,GAG7CA,EAAoBpxB,EAAE2xB,GACD,IAAIgD,EAA0CvD,oBAAuC,yBACjFwD,EAAsCxD,gBAAmC,qBACzEoE,EAAwCpE,kBAAqC,uBAIzEO,EAA6B,QAAK,CAC7D0D,MAAO,SAAersC,EAAQssC,GAExBtsC,EAAOqrC,UAAUptC,cAAgBjT,QAEnCgV,EAAOqrC,UAAY,CAACrrC,EAAOqrC,YAI7BrrC,EAAOusC,iBAAmBztC,SAASuW,cAAc,OAEjDrV,EAAOqrC,UAAUliD,SAAQ,SAAUm6B,GAEjC,IAAImpB,EAAM3tC,SAASuW,cAAc,OAMjC,GALAo3B,EAAIx6B,aAAa,QAASjS,EAAO0sC,YAEjCD,EAAInpB,IAAMA,EAGNkpB,EAA+C,QAAE1D,YAAa,CAChE,IAAI6D,EAAoBF,EAAInpB,IAC5BmpB,EAAInpB,IAAMqpB,CACX,CAGD,IAAIC,EAAe9tC,SAASuW,cAAc,OAE1Cu3B,EAAah3B,YAAY62B,GAEzBzsC,EAAOusC,iBAAiB32B,YAAYg3B,EAC1C,IAEQ5sC,EAAOwpB,QAAQxkC,OAAO2mD,EAAmD,UAA1D3mD,CAA6Dgb,EAAOusC,iBAAkBvsC,GAEzG4rC,EAA6C,QAAE9E,KAAK9mC,EAAQssC,EAC7D,EAGI,EAED;;;;gCAKN,SAAgB1sB,EAAQ+oB,EAAqBP,GAG7CA,EAAoBpxB,EAAE2xB,GACD,IAAIkE,EAAwCzE,kBAAqC,uBAC7E0E,EAAsC1E,gBAAmC,qBACzE2E,EAAoC3E,cAAiC,mBACrE4E,EAAqC5E,eAAkC,oBACvE6E,EAAyC7E,mBAAsC,wBAC/E8E,EAAsC9E,gBAAmC,qBACzE+E,EAAqC/E,eAAkC,oBAGhG,SAAS4B,EAAQj9C,GAAmV,OAAtOi9C,EAArD,mBAAXr+C,QAAoD,iBAApBA,OAAOC,SAAmC,SAAiBmB,GAAO,cAAcA,CAAI,EAAuB,SAAiBA,GAAO,OAAOA,GAAyB,mBAAXpB,QAAyBoB,EAAIkR,cAAgBtS,QAAUoB,IAAQpB,OAAO3B,UAAY,gBAAkB+C,CAAI,EAAai9C,EAAQj9C,EAAO,CAS1X,IAAIqgD,EAAa,CAAC,MAAO,OAAQ,QAAS,OAAQ,YACrBzE,EAA6B,QAAK,CAC7D3lC,KAAM,WACJ,IAAIhD,EAAS,CACXqrC,UAAW,KACXgC,kBAAmB,KACnBn7C,KAAM,MACNs3B,OAAQ,KACRwhB,YAAa,oBACbL,SAAU,IACV/tB,WAAY,KACZ0wB,gBAAiB,8DACjBC,UAAW,oDACXtC,WAAW,EACXuC,QAAS,SAAiBrpC,GACxB,MAAMA,CACP,EACDgnC,eAAgB,KAChBD,aAAc,KACdK,mBAAoB,WAAgC,EACpDkC,sBAAuB,WAAmC,EAC1DC,aAAc,yBACdjC,QAAS,UACTc,iBAAkB,KAClBoB,cAAe,WACfnD,YAAa,CAAC,QAAS,UAAW,QAAS,YAAa,SAAU,aAAc,cAChFD,aAAc,CAAC,SAAU,MAAO,QAAS,mBACzCyB,eAAgB,GAChB4B,mBAAmB,EACnB3c,IAAK,KACLH,MAAO,KACPob,YAAY,EACZ2B,QAAQ,EAERC,UAAW,KACX5D,KAAM,gBACNC,UAAW,OACX4D,oBAAoB,EACpBC,YAAY,EACZtB,WAAY,oBAGVxhD,EAAOC,UAAU,GAErB,QAAaE,IAATH,EACF,MAAM,IAAIkH,MAAM,yCAIlB,OAAQ43C,EAAQ9+C,IACd,IAAK,SACH8U,EAAOqrC,UAAYzgB,UAAU1/B,GAC7B8U,EAAOqtC,kBAAoBrtC,EAAOqrC,UAClCrrC,EAAO9N,KAAO/G,UAAU,IAAM6U,EAAO9N,KACrC,MAEF,IAAK,SAKH,IAAK,IAAIuH,KAJTuG,EAAOqrC,UAAYngD,EAAKmgD,UACxBrrC,EAAOqtC,uBAAsD,IAA3BniD,EAAKmiD,kBAAoCniD,EAAKmiD,kBAAoBrtC,EAAOqrC,UAC3GrrC,EAAOqtC,kBAAoBrtC,EAAO6tC,OAAS,+BAA+Bh3C,OAAOmJ,EAAOqtC,mBAAqBrtC,EAAOqtC,kBAEtGrtC,EACF,cAANvG,GAA2B,sBAANA,IACzBuG,EAAOvG,QAAwB,IAAZvO,EAAKuO,GAAqBvO,EAAKuO,GAAKuG,EAAOvG,IAGhE,MAEF,QACE,MAAM,IAAIrH,MAAM,gEAAkE43C,EAAQ9+C,IAI9F,IAAK8U,EAAOqrC,UAAW,MAAM,IAAIj5C,MAAM,kCAEvC,IAAK4N,EAAO9N,MAA+B,iBAAhB8N,EAAO9N,OAAwE,IAAnDk7C,EAAW7iD,QAAQyV,EAAO9N,KAAKyI,eACpF,MAAM,IAAIvI,MAAM,uEAId4N,EAAOirC,WAAW6B,EAA6C,QAAE1M,KAAKpgC,GAEtEA,EAAOmrC,gBAAgBnrC,EAAOmrC,iBAElC,IAAI8C,EAAYnvC,SAAS+D,eAAe7C,EAAOyrC,SAC3CwC,GAAWA,EAAUj0B,WAAW4K,YAAYqpB,GAEhD,IAAI3B,EAAaxtC,SAASuW,cAAc,UA+BxC,OA7BIw3B,EAA+C,QAAE/D,YAInDwD,EAAWr6B,aAAa,QAAS,mHAGjCq6B,EAAWr6B,aAAa,QAAS,0EAInCq6B,EAAWr6B,aAAa,KAAMjS,EAAOyrC,SAEjB,QAAhBzrC,EAAO9N,OACTo6C,EAAW4B,OAAS,sBAAwBluC,EAAO2tC,cAAgB,WAE/D3tC,EAAOixB,MAEJjmC,MAAM7C,QAAQ6X,EAAOixB,OAAMjxB,EAAOixB,IAAM,CAACjxB,EAAOixB,MAErDjxB,EAAOixB,IAAI9nC,SAAQ,SAAUglD,GAC3B7B,EAAW4B,QAAU,gCAAkCC,EAAO,IACxE,KAGM7B,EAAW4B,QAAU,+BAIfluC,EAAO9N,MACb,IAAK,MAEH,GAAI26C,EAA+C,QAAE7D,OACnD,IACEvqC,QAAQk8B,KAAK,+DACb,IAAI9J,EAAMjpC,OAAOR,KAAK4Y,EAAOqtC,kBAAmB,UAChDxc,EAAIv9B,QACJ0M,EAAOytC,uBAOR,CANC,MAAOtpC,GACPnE,EAAOwtC,QAAQrpC,EAC3B,CAAoB,QAEJnE,EAAOirC,WAAW6B,EAA6C,QAAE1R,QACjEp7B,EAAOkrC,cAAclrC,EAAOkrC,cACjC,MAED6B,EAA2C,QAAEV,MAAMrsC,EAAQssC,GAG7D,MAEF,IAAK,QACHY,EAA6C,QAAEb,MAAMrsC,EAAQssC,GAC7D,MAEF,IAAK,OACHU,EAA4C,QAAEX,MAAMrsC,EAAQssC,GAC5D,MAEF,IAAK,WACHW,EAAgD,QAAEZ,MAAMrsC,EAAQssC,GAChE,MAEF,IAAK,OACHa,EAA4C,QAAEd,MAAMrsC,EAAQssC,GAGjE,EAGI,EAED;;;;gCAKN,SAAgB1sB,EAAQ+oB,EAAqBP,GAG7CA,EAAoBpxB,EAAE2xB,GACD,IAAIgD,EAA0CvD,oBAAuC,yBACjFwD,EAAsCxD,gBAAmC,qBAClG,SAAS4B,EAAQj9C,GAAmV,OAAtOi9C,EAArD,mBAAXr+C,QAAoD,iBAApBA,OAAOC,SAAmC,SAAiBmB,GAAO,cAAcA,CAAI,EAAuB,SAAiBA,GAAO,OAAOA,GAAyB,mBAAXpB,QAAyBoB,EAAIkR,cAAgBtS,QAAUoB,IAAQpB,OAAO3B,UAAY,gBAAkB+C,CAAI,EAAai9C,EAAQj9C,EAAO,CAI7V47C,EAA6B,QAAK,CAC7D0D,MAAO,SAAersC,EAAQssC,GAE5B,GAAkC,WAA9BtC,EAAQhqC,EAAOqrC,WACjB,MAAM,IAAIj5C,MAAM,0CAIlB,GAAwC,kBAA7B4N,EAAO4tC,kBAChB,MAAM,IAAIx7C,MAAM,yDAIlB,IAAK4N,EAAO4c,aAAe5xB,MAAM7C,QAAQ6X,EAAO4c,YAC9C,MAAM,IAAIxqB,MAAM,gDAIlB4N,EAAO4c,WAAa5c,EAAO4c,WAAW1sB,KAAI,SAAUw4C,GAClD,MAAO,CACL0F,MAA6B,WAAtBpE,EAAQtB,GAAyBA,EAAS0F,MAAQ1F,EACzD2F,YAAmC,WAAtBrE,EAAQtB,GAAyBA,EAAS2F,YAAc3F,EACrE4F,WAAkC,WAAtBtE,EAAQtB,IAA0BA,EAAS4F,WAAa5F,EAAS4F,WAAa,IAAM,IAAMtuC,EAAO4c,WAAW/yB,OAAS,KAEzI,IAEImW,EAAOusC,iBAAmBztC,SAASuW,cAAc,OAE7CrV,EAAOwpB,QACTxkC,OAAO2mD,EAAmD,UAA1D3mD,CAA6Dgb,EAAOusC,iBAAkBvsC,GAIxFA,EAAOusC,iBAAiBzpC,WAM5B,SAAoB9C,GAElB,IAAIkB,EAAOlB,EAAOqrC,UACdzuB,EAAa5c,EAAO4c,WAEpBqtB,EAAW,0DAEXjqC,EAAO4tC,oBACT3D,GAAY,WAIdA,GAAY,OAEZ,IAAK,IAAIl2C,EAAI,EAAGA,EAAI6oB,EAAW/yB,OAAQkK,IACrCk2C,GAAY,oBAAsBrtB,EAAW7oB,GAAGu6C,WAAa,IAAMtuC,EAAOstC,gBAAkB,KAAOtoD,OAAO2mD,EAAyD,gBAAhE3mD,CAAmE43B,EAAW7oB,GAAGs6C,aAAe,QAIrMpE,GAAY,QAERjqC,EAAO4tC,oBACT3D,GAAY,YAIdA,GAAY,UAEZ,IAAK,IAAIrgD,EAAI,EAAGA,EAAIsX,EAAKrX,OAAQD,IAAK,CAEpCqgD,GAAY,OAEZ,IAAK,IAAI9uC,EAAI,EAAGA,EAAIyhB,EAAW/yB,OAAQsR,IAAK,CAC1C,IAAIozC,EAAartC,EAAKtX,GAElB8+C,EAAW9rB,EAAWzhB,GAAGizC,MAAM/jD,MAAM,KAEzC,GAAIq+C,EAAS7+C,OAAS,EACpB,IAAK,IAAIyM,EAAI,EAAGA,EAAIoyC,EAAS7+C,OAAQyM,IACnCi4C,EAAaA,EAAW7F,EAASpyC,SAGnCi4C,EAAaA,EAAW3xB,EAAWzhB,GAAGizC,OAIxCnE,GAAY,oBAAsBrtB,EAAWzhB,GAAGmzC,WAAatuC,EAAOutC,UAAY,KAAOgB,EAAa,OACrG,CAGDtE,GAAY,OACb,CAID,OADAA,GAAY,kBAEd,CA9DyCuE,CAAWxuC,GAEhD4rC,EAA6C,QAAE9E,KAAK9mC,EAAQssC,EAC7D,EA6DI,EAED;;;;gCAKN,SAAgB1sB,EAAQ+oB,EAAqBP,GAG7CA,EAAoBpxB,EAAE2xB,GACtB,IAAI8F,EAAQ,CACVrO,KAAM,SAAcpgC,GAElB,IAEI0uC,EAAa5vC,SAASuW,cAAc,OACxCq5B,EAAWz8B,aAAa,QAHP,yPAIjBy8B,EAAWz8B,aAAa,KAAM,iBAE9B,IAAI08B,EAAa7vC,SAASuW,cAAc,OACxCs5B,EAAW18B,aAAa,QAAS,oEAEjC,IAAI28B,EAAc9vC,SAASuW,cAAc,OACzCu5B,EAAY38B,aAAa,QAAS,cAClC28B,EAAY38B,aAAa,KAAM,cAC/B08B,EAAW/4B,YAAYg5B,GAEvB,IAAI3nB,EAAUnoB,SAASuW,cAAc,QACrC4R,EAAQhV,aAAa,QAAS,gBAC9B08B,EAAW/4B,YAAYqR,GAEvB,IAAI4nB,EAAc/vC,SAASub,eAAera,EAAO0tC,cACjDiB,EAAW/4B,YAAYi5B,GAEvBH,EAAW94B,YAAY+4B,GAEvB7vC,SAASgwC,qBAAqB,QAAQ,GAAGl5B,YAAY84B,GAErD5vC,SAAS+D,eAAe,cAActS,iBAAiB,SAAS,WAC9Dk+C,EAAMrT,OACZ,GACG,EACDA,MAAO,WACL,IAAIsT,EAAa5vC,SAAS+D,eAAe,iBAErC6rC,GACFA,EAAW10B,WAAW4K,YAAY8pB,EAErC,GAE0B/F,EAA6B,QAAK,CAExD,EAED;;;;gCAKN,SAAgB/oB,EAAQ+oB,EAAqBP,GAG7CA,EAAoBpxB,EAAE2xB,GACD,IAAIoG,EAAsC3G,gBAAmC,qBACzE4G,EAA0C5G,oBAAuC,yBAwC1G,SAAS6G,EAAmBjvC,EAAQssC,EAAYprC,GAE9C,IAAIguC,EAAW,IAAItnD,OAAOunD,KAAK,CAACjuC,GAAO,CACrChP,KAAM,oBAERg9C,EAAWtnD,OAAOkG,IAAIshD,gBAAgBF,GAEtC5C,EAAWr6B,aAAa,MAAOi9B,GAC/BH,EAA6C,QAAEjI,KAAK9mC,EAAQssC,EAC9D,CA9C6B3D,EAA6B,QAAK,CAC7D0D,MAAO,SAAersC,EAAQssC,GAE5B,GAAItsC,EAAO6tC,OAAX,CACE,IAAIwB,EAAal+C,WAAWD,KAAKo+C,KAAKtvC,EAAOqrC,YAAY,SAAU5yC,GACjE,OAAOA,EAAE82C,WAAW,EAC5B,IACMN,EAAmBjvC,EAAQssC,EAAY+C,EAExC,KAND,CASArvC,EAAOqrC,UAAY,qBAAqBx9C,KAAKmS,EAAOqrC,WAAarrC,EAAOqrC,UAAYzjD,OAAOof,SAASI,QAAyC,MAA/BpH,EAAOqrC,UAAUlhD,OAAO,GAAa,IAAM6V,EAAOqrC,UAAYrrC,EAAOqrC,WAEnL,IAAI1kC,EAAM,IAAI/e,OAAO4nD,eACrB7oC,EAAI8oC,aAAe,cACnB9oC,EAAIpW,iBAAiB,SAAS,WAC5BvL,OAAOgqD,EAAiD,QAAxDhqD,CAA2Dgb,GAC3DA,EAAOwtC,QAAQ7mC,EAAIV,WAAYU,EACrC,IACIA,EAAIpW,iBAAiB,QAAQ,WAE3B,IAAwC,IAApC,CAAC,IAAK,KAAKhG,QAAQoc,EAAID,QAIzB,OAHA1hB,OAAOgqD,EAAiD,QAAxDhqD,CAA2Dgb,QAC3DA,EAAOwtC,QAAQ7mC,EAAIV,WAAYU,GAMjCsoC,EAAmBjvC,EAAQssC,EAAY3lC,EAAI+oC,SACjD,IACI/oC,EAAIvf,KAAK,MAAO4Y,EAAOqrC,WAAW,GAClC1kC,EAAImgC,MAxBH,CAyBF,EAcI,EAED;;;;gCAKN,SAAgBlnB,EAAQ+oB,EAAqBP,GAG7CA,EAAoBpxB,EAAE2xB,GACD,IAAIkE,EAAwCzE,kBAAqC,uBAC7E4G,EAA0C5G,oBAAuC,yBAGtGuH,EAAQ,CACV7I,KAAM,SAAc9mC,EAAQssC,GAE1BxtC,SAASgwC,qBAAqB,QAAQ,GAAGl5B,YAAY02B,GAErD,IAAIsD,EAAgB9wC,SAAS+D,eAAe7C,EAAOyrC,SAEnDmE,EAAcC,OAAS,WACrB,GAAoB,QAAhB7vC,EAAO9N,KAAX,CAcA,IAAI49C,EAAgBF,EAAczf,eAAiByf,EAAcG,gBAKjE,GAJID,EAAchxC,WAAUgxC,EAAgBA,EAAchxC,UAE1DgxC,EAAcvtC,KAAKqT,YAAY5V,EAAOusC,kBAElB,QAAhBvsC,EAAO9N,MAAkB8N,EAAO8wB,MAAO,CAEzC,IAAIA,EAAQhyB,SAASuW,cAAc,SACnCyb,EAAMhuB,UAAY9C,EAAO8wB,MAEzBgf,EAAcz6C,KAAKugB,YAAYkb,EAChC,CAGD,IAAIkf,EAASF,EAAchB,qBAAqB,OAE5CkB,EAAOnmD,OAAS,EAsC1B,SAA0BmmD,GACxB,IAAIC,EAAWD,EAAO9/C,KAAI,SAAUggD,GAClC,GAAIA,EAAM5sB,KAAO4sB,EAAM5sB,MAAQ17B,OAAOof,SAASzZ,KAC7C,OAMN,SAAyB2iD,GACvB,OAAO,IAAI70C,SAAQ,SAAUC,IACX,SAAS60C,IACtBD,QAAuC,IAAvBA,EAAME,cAAuD,IAAvBF,EAAME,cAAuBF,EAAMG,SAAwC/0C,IAA7BgJ,WAAW6rC,EAAW,IACjI,CAEIA,EACJ,GACA,CAdaG,CAAgBJ,EAE7B,IACE,OAAO70C,QAAQH,IAAI+0C,EACrB,CA5CQM,CAAiBvlD,MAAMkG,KAAK8+C,IAASv+C,MAAK,WACxC,OAAO++C,EAAaZ,EAAe5vC,EAC7C,IAEQwwC,EAAaZ,EAAe5vC,EAxB7B,MATK6sC,EAA+C,QAAE/D,YACnDxkC,YAAW,WACT,OAAOksC,EAAaZ,EAAe5vC,EACpC,GAAE,KAEHwwC,EAAaZ,EAAe5vC,EA8BtC,CACG,GAGH,SAASwwC,EAAaZ,EAAe5vC,GACnC,IAGE,GAFA4vC,EAAct8C,QAEVu5C,EAA+C,QAAE3D,UAAY2D,EAA+C,QAAE7D,OAChH,IACE4G,EAAczf,cAAcrxB,SAAS2xC,YAAY,SAAS,EAAO,KAGlE,CAFC,MAAOj5C,GACPo4C,EAAczf,cAAckc,OAC7B,MAGDuD,EAAczf,cAAckc,OAY/B,CAVC,MAAOloC,GACPnE,EAAOwtC,QAAQrpC,EACnB,CAAY,QACJ0oC,EAA+C,QAAE/D,cAEnD8G,EAAc9e,MAAM4f,WAAa,SACjCd,EAAc9e,MAAMnB,KAAO,QAG7B3qC,OAAOgqD,EAAiD,QAAxDhqD,CAA2Dgb,EAC5D,CACH,CAqB6B2oC,EAA6B,QAAK,CAExD,EAED;;;;gCAKN,SAAgB/oB,EAAQ+oB,EAAqBP,GAG7CA,EAAoBpxB,EAAE2xB,GACD,IAAIoG,EAAsC3G,gBAAmC,qBAErEO,EAA6B,QAAK,CAC7D0D,MAAO,SAAersC,EAAQssC,GAE5BtsC,EAAOusC,iBAAmBztC,SAASuW,cAAc,OACjDrV,EAAOusC,iBAAiBt6B,aAAa,QAAS,cAE9CjS,EAAOusC,iBAAiBzpC,UAAY9C,EAAOqrC,UAE3C0D,EAA6C,QAAEjI,KAAK9mC,EAAQssC,EAC7D,EAGI,EAED;;;;8BAKN,SAAgB1sB,EAAQ0oB,EAASF,GAI1B,EAED;;;;8BAKN,SAAgBxoB,EAAQ0oB,EAASF,GAEjCxoB,EAAO0oB,QAAUF,uBAAyC,iBAGnD,IAEc,OACrB,EA39BExoB,EAAc0oB,QAAGL,OCkBnB,EAAEvlD,EAAGmuC,EAAKhP,KAoDR9kB,EAAG7X,gBAnDgB,CACjB,qBAAsB,CACpBy8C,GAAI,qBACJD,GAAI,mBAEN,6BAA8B,CAC5BC,GAAI,6BACJD,GAAI,0BAEN,kBAAmB,CACjBC,GAAI,kBACJD,GAAI,oBAENiP,QAAW,CACThP,GAAI,UACJD,GAAI,QAEN,wBAAyB,CACvBC,GAAI,wBACJD,GAAI,4BAEN,iBAAkB,CAChBC,GAAI,iBACJD,GAAI,kBAEN,yBAA0B,CACxBC,GAAI,yBACJD,GAAI,2BAEN,2BAA4B,CAC1BC,GAAI,2BACJD,GAAI,4BAENkP,GAAM,CACJjP,GAAI,KACJD,GAAI,OAENmP,IAAO,CACLlP,GAAI,MACJD,GAAI,MAENoP,SAAY,CACVnP,GAAI,kBACJD,GAAI,gBAENqP,WAAc,CACZpP,GAAI,iBACJD,GAAI,oBAMR,IAAI/wB,EACFqgC,EACAC,EAAY,GACZC,EAAY,OACZC,EAAgB,GAElBzuD,GAAE,WACAA,EAAEm/B,GAAKpf,GAAG,oBAAoB,CAACwM,EAAO/N,KAChCA,GAAQA,EAAK+6B,QAAU/6B,EAAK+6B,OAAOpyC,QAAUqX,EAAK40B,YAEpDnlB,ECpEYzP,KAClB,IAAIkwC,EAAW,CACb93C,MAAO,IAAIsW,IACXqsB,OAAQ,IAAIrsB,IACZL,SAAU,IAAIK,KAGhB,IAoBE,OAnBA1O,EAAK+6B,OAAO9yC,SAAQ4mB,SACK1kB,IAAnB0kB,EAAMY,WACRygC,EAASnV,OAAOt3C,IAAIorB,EAAMwd,QAASxd,EAAMY,UACzC3rB,OAAOoH,KAAK2jB,EAAMY,UAAUxnB,SAAQkoD,IAClCD,EAAS93C,MAAM3U,IAAI0sD,EAAUthC,EAAMY,SAAS0gC,GAAU,UAGvChmD,IAAnB0kB,EAAMR,UACJQ,EAAMR,SAASpmB,SAAQskB,IACrBzoB,OAAOoH,KAAKqhB,GAAStkB,SAAQ2L,IACd,aAATA,IACFs8C,EAAS7hC,SAAS5qB,IAAI,CAAC8oB,EAAQuB,IAAKvB,EAAQkD,UAC5C3rB,OAAOoH,KAAKqhB,EAAQkD,UAAUxnB,SAAQkoD,IACpCD,EAAS93C,MAAM3U,IAAI0sD,EAAU5jC,EAAQkD,SAAS0gC,GAAU,IAE3D,GACD,GACF,IAECD,CAIR,CAHC,MAAOtrC,GAEP,OADAle,OAAO6W,SAAW7W,OAAO6W,QAAQC,KAAKoH,GAC/BsrC,CACR,GDqCgBE,CAAYpwC,GAAM5H,MAG3BqX,EAAS3nB,IAAI,cACkC,QAA/C2nB,EAAS5oB,IAAI,aAAasC,MAAM,KAAKuI,QAErCq+C,EAAYtgC,EAAS5oB,IAAI,cAEvB4oB,EAAS3nB,IAAI,kBACfmoD,EAActnD,OAAS,EACvB8mB,EACG5oB,IAAI,gBACJsC,MAAM,KACNlB,SAAQmD,IACP6kD,EAAcrnD,KAAKwC,EAAM,KAI7B4kD,EADEvgC,EAAS3nB,IAAI,aACH2nB,EAAS5oB,IAAI,aAEb,OAGdipD,EAAYA,IAAa,EAC1B,GAEP,IAEEtuD,GAAE,WACAA,EAAEm/B,GAAKpf,GAAG,qBAAqB,SAAUwM,EAAO/N,GAG9C,GADA2wB,GAAGvzB,KAAKF,MAAM,iBACV8C,GAAQA,EAAK+6B,QAAU/6B,EAAK+6B,OAAOpyC,QAAUqX,EAAK40B,WAChDnlB,EAAS3nB,IAAI,cAAgB2nB,EAAS5oB,IAAI,aAAc,CAE1D8pC,GAAGvzB,KAAK3Z,IAAI,iBAGZjC,EAAE,gCAAgCmjC,OAClCnjC,EAAE,wBAAwBmjC,OAC1BnjC,EAAE,uBAAuBqC,IAAI,IAG7B,IAAIwsD,EAAa7uD,EAAE,gDAEnB,GAAIyuD,EAAc5mD,QAAQ,aAAe,GAAK0mD,EAAUpnD,OAAQ,CAE9D,IAAI2nD,EAAY9uD,EACd,oDAEF8uD,EAAU9oD,OAAO,mFAGLuoD,UAAkB/vC,EAAK+zB,YAAY/zB,EAAKk0B,UAC9Cl0B,EAAK40B,0GAIKmb,8oBAGRltD,EAAE,2DAGVwtD,EAAW7oD,OAAO8oD,EACnB,CAED,GAAIL,EAAc5mD,QAAQ,UAAY,GAAK0mD,EAAUpnD,OAAQ,CAE3D,IAAI4nD,EAAS/uD,EACX,2EAEEgvD,EAAYhvD,EAAE,qEACoCqB,EAChD,sCAC0BA,EAAE,29KA0E7B0e,GAAG,SAASjL,IACfoxC,QAAQ,CACNyC,UAAW,GAAG4F,UAAkB/vC,EAAK+zB,YAAY/zB,EAAKk0B,UAAUl0B,EAAK40B,YACrE5jC,KAAM,MACN+4C,WAAW,GACX,IAEJwG,EAAO/oD,OAAOgpD,GACdH,EAAW7oD,OAAO+oD,EACnB,CAED,GAAIN,EAAc5mD,QAAQ,UAAY,EAAG,CAEvC,IAAIonD,EAASjvD,EAAE,iDAEXsuD,GACFW,EAAOjpD,OACL,2BACE3E,EAAE,0BACF,YAEJitD,GAAY,IAEZW,EAAOjpD,OACL,sBACE3E,EAAE,yBACF,0DACAA,EAAE,kBACF,QACF2E,OAAO,otBAKH3E,EAAE,4EAKRrB,EAAEm/B,GAAKmc,IAAI,oBAAqB,kBAChCt7C,EAAEm/B,GAAKpf,GACL,yBACA,kBACA,SAAUjL,GACR9U,EAAE,kBACCuhB,KAAKlgB,EAAE,WAAa,uCACpB0kB,KAAK,QAAS,sBACd3T,KAAK,WAAY,YACpBpS,EAAE,kBACC+lB,KAAK,QAAS,qBACdnV,OACJ,IAEH5Q,EAAEm/B,GAAKmc,IAAI,oBAAqB,kBAChCt7C,EAAEm/B,GAAKpf,GACL,+OAOA,kBACA,WACE,IAAI3Q,EAAQpP,EAAE,uBAAuBqC,MAEnC,yJACQ8I,KAAKiE,IACbpP,EAAE,qBACCisB,SAAS,aACTP,WAAW,YACd4iC,GAAY,EACZtuD,EAAE,uBAAuBqC,IAAI+M,KAE7BpP,EAAE,qBACCmsB,YAAY,aACZ/Z,KAAK,WAAY,YACpBpS,EAAE,uBAAuBqC,IAAI,IAEhC,KAGLwsD,EAAW7oD,OAAOipD,EACnB,CAED,GAAIR,EAAc5mD,QAAQ,aAAe,EAAG,CAE1C,IAoBIwlB,EApBA6hC,EAAYlvD,EACd,iFAEFkvD,EACGlpD,OACC,yHAE8B3E,EAAE,mpCAKjC2E,OAAO,UAAY3E,EAAE,mBAAqB,YAAY2E,OAAO,yHAE9B3E,EAAE,kpCAOhCmd,GAAQA,EAAKktB,UACfwjB,EAAU1wC,KAAK,WAAYA,EAAKktB,UAClCre,EAAQ7O,EAAK+6B,OAAOvkC,QAAO,SAAUkE,GACnC,OAAOA,EAAEyU,OACvB,IAAe,GACHuhC,EAAU1wC,KAAK,WAAY6O,EAAM5jB,MAC7B+U,GAAQA,EAAKi0B,WACfyc,EAAU1wC,KAAK,YAAaA,EAAKi0B,WAC/Bj0B,GAAQA,EAAK2wC,cACfD,EAAU1wC,KAAK,eAAgBA,EAAK2wC,cACtCnvD,EAAEm/B,GAAKmc,IAAI,oBAAqB,oBAChCt7C,EAAEm/B,GAAKiwB,IACL,yBACA,oBACA,SAAUt6C,GACR,IAAIu6C,OAC4B1mD,IAA9B3I,EAAE8U,EAAEnE,QAAQ6N,KAAK,SACbxe,EAAE8U,EAAEnE,QAAQ6N,KAAK,SACjBxe,EAAE8U,EAAEnE,QAAQZ,QAAQ,UAAUyO,KAAK,SAGzCxe,EAAE,oCAAoC+lB,KAAK,QAASspC,GACpDH,EAAU3tC,KACR,2BACElgB,EAAE,4BACF,YAEJ8tC,GAAGuP,WACJ,IAEHmQ,EAAW7oD,OAAOkpD,EACnB,CAGiB,UAAdV,GACFxuD,EAAE,qBAAqBgG,OAAO6oD,GAC9BjtC,YAAW,WACTitC,EAAWvyC,YAAY,UACxB,GAAE,OAEHtc,EAAE,SAASsvB,QAAQu/B,GACnB7uD,EAAE,aAAawuC,QAAQ,CAAEiC,UAAW,IACpC7uB,YAAW,WACTitC,EAAWvyC,YAAY,UACxB,GAAE,KAEN,CAET,GACA,GACC,EAnXD,CAmXGvc,OAAQmF,OAAQkX,UE1XnB,SAAWpc,GAET,IAAIkhB,EAAK,YAETlhB,EAAEoc,UAAU2D,GAAG,qBAAqB,SAAUwM,EAAO/N,EAAMwF,EAAQC,GAC7DzF,GAAQA,EAAK4rB,UACf+E,GAAGvzB,KAAKH,OACN,YACgB,GAAhB+C,EAAK07B,SACHl6C,EAAEw1C,KAAKh3B,EAAK4rB,UAAU,SAAU/c,GAC9B,MACkB,YAAhBA,EAAMrJ,QAAwB9C,EAAG/V,KAAKnL,EAAEwjB,KAAK6J,EAAMyd,aAEjE,IAAa3jC,OAAS,EAEtB,GACC,CAhBD,CAgBGpH,QCRH,SAAWC,EAAGmuC,EAAKhP,GACjB,IACEmwB,EACAC,EAFEC,GAAO,EAGTtuC,EAAK,2CAEPlhB,GAAE,WACA,IAEE,QAAkB2I,KADlB2mD,EAAYngB,GAAGjtB,KAAKutC,UAAUC,SAASJ,WACV,KAAM,2BACnCC,EAAWD,EAAY,CAGxB,CAFC,MAAOlsC,GACPmsC,EAAW,CACZ,CAED,IACEC,EAAOrgB,GAAGjtB,KAAKutC,UAAUC,SAASF,IACpB,CAAd,MAAOpsC,GAAO,CAEhBpjB,EAAEm/B,GAAKpf,GAAG,oBAAoB,SAAUwM,EAAO/N,GACzCA,GAAQA,EAAK+6B,QAAU/6B,EAAK+6B,OAAOpyC,QACrCnH,EAAE8sB,KAAKtO,EAAK+6B,QAAQ,SAAUl4C,EAAGgsB,GAC/BrtB,EAAE8sB,KAAKO,EAAMR,UAAU,SAAUxrB,EAAGsuD,GAClC,IACEvuB,EACA1M,EAFEk7B,EAAQD,EAAI,cAGQ,UAApBA,EAAIjpC,cAA6BgO,EAAIk7B,EAAMvnD,MAAM6Y,MACnDkgB,EAASpxB,OAAO0kB,EAAE,KAAO,EACzBi7B,EAAIzuB,SAAW,UACfyuB,EAAIvuB,OACFouB,GAA6B,UAArBniC,EAAM6wB,WACV9c,EAAS,EAAImuB,EACbnuB,EAASmuB,EAE7B,GACA,GAEA,GACA,GACC,CAvCD,CAuCGxvD,OAAQmF,OAAQkX,UC9CnB,SAAWpc,EAAGmuC,EAAK0hB,EAASvrC,GAGtBurC,GAAWA,EAAQC,YAChBxrC,EAASI,SACZJ,EAASI,OACPJ,EAASma,SACT,KACAna,EAASoa,UACRpa,EAASqa,KAAO,IAAMra,EAASqa,KAAO,KAG3C3+B,GAAE,WACA,IAAI+vD,EACFC,EACA1yC,EAAStd,EAAEklB,WAAWZ,EAASk6B,KAAKh4C,MAAM,IAE1CypD,EAAS7zC,SAAS8zC,MAEpB,IACEF,EAAU9qD,OAAOirD,cAGlB,CAFC,MAAO/sC,GACP4sC,EAAU,IACX,CAED,SAASI,EAAUC,GACjB,OAAOA,EAAI3rC,OAAS2rC,EAAI9rC,SAASze,QAAQ,SAAU,GACpD,CAED,SAASwqD,EAAatrC,GAChBA,EAAMouB,UAERjE,GAAGxrB,KACAF,KAAK,CACJT,IAAK,SACLxE,KAAMwG,IAEPjW,KAAKoV,IACCgrB,GAAG1wB,OAAO,aAEnB0wB,GAAG0J,MAAK,IAAM1J,GAAG+J,KAAKl0B,GAAOjW,KAAKoV,MAGlCgrB,GAAG+J,KAAKl0B,GAAOjW,KAAKoV,GAEvB,CAED,SAASosC,IACPP,GAAWA,EAAQQ,WAAW,SAC9BX,EAAQY,aAAa,KAAM,KAAM,MACjCtsC,IACD,CAEuB,KAApBG,EAASna,QAAeomD,IAE5B,IAAIG,EACFb,EAAQ7qC,OAAUgrC,GAAWrgD,KAAKT,MAAM8gD,EAAQW,QAAQ,UAEtDD,GAGEpzC,EAAOm1B,WAAan1B,EAAOm1B,YAAcie,EAAcje,YACzDie,EAAcje,UAAYn1B,EAAOm1B,iBAC1Bie,EAAche,cACdge,EAActd,WAGnBsd,EAAcN,YAAcA,EAAU9rC,IACxC6qB,GAAGvzB,KAAK3Z,IAAI,cACZquD,EAAaI,IAEbH,KAEOjzC,EAAOm1B,UAEhBtD,GAAGkD,OAAO/0B,GAEV6G,KAGFnkB,EAAEoc,UAAU2D,GAAG,eAAgBwwC,GAE/BvwD,EAAEoc,UAAU2D,GAAG,oBAAoB,SAAUwM,EAAO/N,GAClD,GAAIA,GAAQA,EAAK+zB,SAAU,CACzB,IAAI2d,EACFlrC,EAAQ,CACNG,IAAK,OACLotB,SAAU/zB,EAAK+zB,SAEf6d,UAAWA,EAAU9rC,IAEzB,GAAIhe,GAAI,SAAUkY,IAASA,EAAK40B,UAC9BpuB,EAAM0tB,OAASl0B,EAAKk0B,OACpB1tB,EAAMouB,UAAY50B,EAAK40B,UACvBpuB,EAAMytB,UAAYj0B,EAAKi0B,UAEnBj0B,EAAK27B,mBACP+V,EAAQ,CAACD,EAAQzxC,EAAK27B,iBAAiBr0C,QAAQ,KAAM,MAAMuB,KAjFpD,WAqFJ,GAAImX,EAAKy4B,OAAQ,CACtB,IAAIb,EAAQp2C,EAAEw1C,KAAKh3B,EAAKy4B,QAAQ,SAAUviB,GACtC,OAAOA,EAAEiN,QACV,IAAE,GACH+Q,EAAS0D,EAAQA,EAAM1D,OAAS,KACnB,OAAXA,GACF1tB,EAAM0tB,OAASA,EACfwd,EAAQ,CAACD,EAAQ7Z,EAAM3D,UAAW,IAAKpxC,EAAE,aAAagG,KA5F/C,MAgGP6oD,EAAQ,CAACD,EAAQ5uD,EAAE,gBAAgBgG,KAhG5B,IAkGV,CACD,IAAK0oD,EAAQ,CACX,IACEC,GAAWA,EAAQY,QAAQ,QAASjhD,KAAKC,UAAUoV,GAGpD,CAFC,MAAOlQ,GAER,CACG+6C,EAAQ7qC,OAAS6qC,EAAQ7qC,MAAMouB,WAAapuB,EAAMouB,UACpDyc,EAAQY,aACNzrC,EACA,KACAV,EAASI,OACPJ,EAASC,SAC3B,KAGkB/F,EAAKi0B,UAUPod,EAAQC,UACN9qC,EACA,KACAV,EAASI,OAASJ,EAASC,UAIlC,CACG2rC,GAAS9zC,SAAS8zC,QAAUA,IAC9B9zC,SAAS8zC,MAAQA,EAEpB,CAED,GACE1xC,IACEA,EAAKiD,OAASjD,EAAKiD,MAAMo4B,SACxBr7B,EAAK+6B,SAAW/6B,EAAK+6B,OAAOpyC,QACb,sBAAhBqX,EAAKwF,QACP,CAEA,GACExF,GACAA,EAAKiD,OACLjD,EAAKiD,MAAMs3B,MACS,KAApBv6B,EAAKiD,MAAMs3B,MACY,OAAvBv6B,EAAKiD,MAAMm4B,QAGX,OACF2W,GACD,CACDR,GAAS,CACjB,IAEM5hB,EAAItgC,iBAAiB,YAAY,SAAUiH,GACzCi7C,GAAS,EACLj7C,EAAEkQ,QACAlQ,EAAEkQ,MAAMorC,YAAcA,EAAU9rC,GAAWgsC,EAAax7C,EAAEkQ,OACzDurC,IAEf,GACA,IAEC,CAvLD,CAuLGxwD,OAAQmF,OAAQA,OAAO2qD,QAAS3qD,OAAOof,UCrI1C,IAAIusC,GAAW,CAQfA,UAAqB,WAMnB,IAAIC,EACAC,EACAC,EAIAC,EAAe,EAEnB9qD,KAAK+qD,SAAW,SAAUrwC,EAAMswC,GA4D9B,OAhDAL,EAAS,IAAIxoD,MACbyoD,EAAW,IAAIzoD,MACf0oD,EAAgB,IAAI1oD,MAepBuY,GADAA,GAHAA,GALAA,EAAOA,EAAK/a,QAAQ,KAAM,OAKdA,QAAQ,MAAO,OAGfA,QAAQ,QAAS,OACjBA,QAAQ,MAAO,MAY3B+a,GANAA,EAAOuwC,EAHPvwC,EAAO,OAASA,EAAO,SASX/a,QAAQ,aAAc,IAGlC+a,EAAOwwC,EAAgBxwC,GAGvBA,EAAOywC,EAAsBzwC,GAEZA,EAAbswC,EAAoBI,EAAc1wC,GAC1B2wC,EAAe3wC,GAQ3BA,GAHAA,GAHAA,EAAO4wC,EAAsB5wC,IAGjB/a,QAAQ,MAAO,OAGfA,QAAQ,MAAO,IAG/B,EAEE,IAmkBI4rD,EAnkBAJ,EAAwB,SAAUzwC,GA+CpC,OAlBIA,EAAOA,EAAK/a,QACd,uGACA,SAAU6rD,EAAYC,EAAIC,EAAIC,EAAIC,GAGhC,OAFAH,EAAKA,EAAG35C,cACR64C,EAAOc,GAAMI,EAAqBH,GAC9BC,EAGKA,EAAKC,GACHA,IACThB,EAASa,GAAMG,EAAGjsD,QAAQ,KAAM,WAI3B,GACR,GAIP,EAEMurD,EAAkB,SAAUxwC,GA0I9B,OADAA,GANAA,GAxBAA,GApBAA,GAtBAA,GAvBAA,GAxCAA,EAAOA,EAAK/a,QAAQ,MAAO,SAwCfA,QACV,qIACAmsD,IAqBUnsD,QACV,+HACAmsD,IAoBUnsD,QACV,sDACAmsD,IAkBUnsD,QACV,sDACAmsD,IAsBUnsD,QACV,2DACAmsD,IAIUnsD,QAAQ,QAAS,KAEjC,EAEMmsD,EAAc,SAAUN,EAAYC,GACtC,IAAIM,EAAYN,EAYhB,OALAM,GAHAA,GADAA,EAAYA,EAAUpsD,QAAQ,QAAS,OACjBA,QAAQ,MAAO,KAGfA,QAAQ,QAAS,IAGvCosD,EAAY,UAAYlB,EAAc5pD,KAAK8qD,GAAa,GAAK,OAGjE,EAEMV,EAAiB,SAAU3wC,GAK7BA,EAAOsxC,EAAWtxC,GAGlB,IAAIze,EAAMgwD,EAAU,UAgBpB,OAbAvxC,GADAA,GADAA,EAAOA,EAAK/a,QAAQ,qCAAsC1D,IAC9C0D,QAAQ,qCAAsC1D,IAC9C0D,QAAQ,qCAAsC1D,GAE1Dye,EAAOwxC,EAASxxC,GAChBA,EAAOyxC,EAAczxC,GACrBA,EAAO0xC,EAAe1xC,GAMtBA,EAAOwwC,EAAgBxwC,GACvBA,EAAO2xC,EAAgB3xC,EAG3B,EAEM0wC,EAAgB,SAAU1wC,GAyB5B,OAnBAA,EAAO4xC,EAAa5xC,GACpBA,EAAO6xC,EAAuC7xC,GAC9CA,EAAO8xC,EAAwB9xC,GAI/BA,EAAO+xC,EAAU/xC,GACjBA,EAAOgyC,EAAWhyC,GAKlBA,EAAOiyC,EAAajyC,GACpBA,EAAOmxC,EAAqBnxC,GAI5BA,GAHAA,EAAOkyC,EAAkBlyC,IAGb/a,QAAQ,SAAU,YAGlC,EAEM4sD,EAAyC,SAAU7xC,GAgBrD,OANAA,EAAOA,EAAK/a,QAFA,6DAEe,SAAU6rD,GACnC,IAAIliC,EAAMkiC,EAAW7rD,QAAQ,qBAAsB,OAEnD,OADA2pB,EAAMujC,EAAiBvjC,EAAK,QAElC,GAGA,EAEMojC,EAAa,SAAUhyC,GAwFzB,OAFAA,GApBAA,GApCAA,EAAOA,EAAK/a,QACV,mEACAmtD,IAkCUntD,QACV,oFACAmtD,IAkBUntD,QAAQ,8BAA+BmtD,EAGvD,EAEMA,EAAiB,SAAUtB,EAAYC,EAAIC,EAAIC,EAAIC,EAAImB,EAAIC,EAAIC,GACvDzqD,MAANyqD,IAAiBA,EAAK,IAC1B,IAAIC,EAAczB,EACd0B,EAAYzB,EACZ0B,EAAUzB,EAAG75C,cACb+K,EAAM+uC,EACN7B,EAAQkD,EAEZ,GAAW,IAAPpwC,EAOF,GANe,IAAXuwC,IAEFA,EAAUD,EAAUr7C,cAAcnS,QAAQ,QAAS,MAErDkd,EAAM,IAAMuwC,EAEW5qD,MAAnBmoD,EAAOyC,GACTvwC,EAAM8tC,EAAOyC,GACY5qD,MAArBooD,EAASwC,KACXrD,EAAQa,EAASwC,QAEd,CACL,KAAIF,EAAYlpD,OAAO,cAAgB,GAIrC,OAAOkpD,EAFPrwC,EAAM,EAIT,CAIH,IAAIlP,EAAS,aADbkP,EAAMgwC,EAAiBhwC,EAAK,OACK,IAUjC,MARa,IAATktC,IACFA,EAAQA,EAAMpqD,QAAQ,KAAM,UAE5BgO,GAAU,YADVo8C,EAAQ8C,EAAiB9C,EAAO,OACD,KAGjCp8C,GAAU,IAAM6+C,EAAwBW,GAAa,MAGzD,EAEMV,EAAY,SAAU/xC,GA6DxB,OALAA,GA/BAA,EAAOA,EAAK/a,QACV,gDACA0tD,IA6BU1tD,QACV,qEACA0tD,EAIN,EAEMA,EAAgB,SAAU7B,EAAYC,EAAIC,EAAIC,EAAIC,EAAImB,EAAIC,EAAIC,GAChE,IAAIC,EAAczB,EACd6B,EAAW5B,EACX0B,EAAUzB,EAAG75C,cACb+K,EAAM+uC,EACN7B,EAAQkD,EAIZ,GAFKlD,IAAOA,EAAQ,IAET,IAAPltC,EAAW,CAOb,GANe,IAAXuwC,IAEFA,EAAUE,EAASx7C,cAAcnS,QAAQ,QAAS,MAEpDkd,EAAM,IAAMuwC,EAEW5qD,MAAnBmoD,EAAOyC,GAMT,OAAOF,EALPrwC,EAAM8tC,EAAOyC,GACY5qD,MAArBooD,EAASwC,KACXrD,EAAQa,EAASwC,GAKtB,CAEDE,EAAWA,EAAS3tD,QAAQ,KAAM,UAElC,IAAIgO,EAAS,cADbkP,EAAMgwC,EAAiBhwC,EAAK,OACM,UAAYywC,EAAW,IAazD,OAPAvD,EAAQA,EAAMpqD,QAAQ,KAAM,UAE5BgO,GAAU,YADVo8C,EAAQ8C,EAAiB9C,EAAO,OACD,IAG/Bp8C,GAAU,KAGd,EAEMq+C,EAAa,SAAUtxC,GAmDzB,OAVAA,GA1BAA,GAPAA,EAAOA,EAAK/a,QACV,8BACA,SAAU6rD,EAAYC,GACpB,OAAOQ,EAAU,OAASb,EAAcK,GAAM,QAC/C,KAGS9rD,QACV,8BACA,SAAU4tD,EAAY9B,GACpB,OAAOQ,EAAU,OAASb,EAAcK,GAAM,QAC/C,KAsBS9rD,QACV,uCACA,SAAU6rD,EAAYC,EAAIC,GACxB,IAAI8B,EAAU/B,EAAGzqD,OACjB,OAAOirD,EACL,KAAOuB,EAAU,IAAMpC,EAAcM,GAAM,MAAQ8B,EAAU,IAEhE,GAIP,EAKMtB,EAAW,SAAUxxC,GAOvBA,GAAQ,KAyBR,IAAI+yC,EACF,8FAyCF,OAvCI3C,EACFpwC,EAAOA,EAAK/a,QAAQ8tD,GAAY,SAAUjC,EAAYC,EAAIC,GACxD,IAAIp6C,EAAOm6C,EACPiC,EAAYhC,EAAG1nD,OAAO,WAAa,EAAI,KAAO,KAIlDsN,EAAOA,EAAK3R,QAAQ,UAAW,UAC/B,IAAIgO,EAAS49C,EAAkBj6C,GAQ/B,OADA3D,EAAS,IAAM+/C,EAAY,KAD3B//C,EAASA,EAAOhO,QAAQ,OAAQ,KACU,KAAO+tD,EAAY,KAErE,KAEMD,EACE,uGACF/yC,EAAOA,EAAK/a,QAAQ8tD,GAAY,SAAUjC,EAAYC,EAAIC,EAAIC,GAC5D,IAAIgC,EAAQlC,EACRn6C,EAAOo6C,EAEPgC,EAAY/B,EAAG3nD,OAAO,WAAa,EAAI,KAAO,KAI9C2J,GADA2D,EAAOA,EAAK3R,QAAQ,UAAW,UACtB4rD,EAAkBj6C,IAG/B,OAFA3D,EACEggD,EAAQ,IAAMD,EAAY,MAAQ//C,EAAS,KAAO+/C,EAAY,KAExE,KAIIhzC,EAAOA,EAAK/a,QAAQ,KAAM,GAG9B,EAEE4rD,EAAoB,SAAUqC,GAoE5B,OA1CA9C,IAGA8C,EAAWA,EAASjuD,QAAQ,UAAW,MAoCvCiuD,GArBAA,GAZAA,GAAY,MAYQjuD,QAClB,4FACA,SAAU6rD,EAAYC,EAAIC,EAAIC,EAAIC,GAChC,IAAIj8C,EAAOi8C,EAaX,OAZmBH,GAGC97C,EAAK3L,OAAO,WAAa,EAC3C2L,EAAO07C,EAAewC,EAASl+C,KAI/BA,GADAA,EAAOu8C,EAAS2B,EAASl+C,KACbhQ,QAAQ,MAAO,IAC3BgQ,EAAOy7C,EAAcz7C,IAGhB,OAASA,EAAO,SACxB,KAIiBhQ,QAAQ,MAAO,IAEnCmrD,IACO8C,CACX,EAEE,IAAIzB,EAAgB,SAAUzxC,GAyC5B,OAFAA,GAlBAA,GAFAA,GAAQ,MAEI/a,QACV,oEACA,SAAU6rD,EAAYC,EAAIC,GACxB,IAAIoC,EAAYrC,EACZsC,EAAWrC,EASf,OAPAoC,EAAYE,EAAYH,EAASC,IAGjCA,GADAA,GADAA,EAAY7C,EAAO6C,IACGnuD,QAAQ,QAAS,KACjBA,QAAQ,QAAS,IAIhCssD,EAFP6B,EAAY,cAAgBA,EAAY,mBAEVC,CAC/B,KAISpuD,QAAQ,KAAM,GAG9B,EAEMssD,EAAY,SAAUvxC,GAExB,OADAA,EAAOA,EAAK/a,QAAQ,eAAgB,IAC7B,UAAYkrD,EAAc5pD,KAAKyZ,GAAQ,GAAK,OACvD,EAEM4xC,EAAe,SAAU5xC,GAkD3B,OAXAA,EAAOA,EAAK/a,QACV,uCACA,SAAU6rD,EAAYC,EAAIC,EAAIC,EAAIC,GAChC,IAAIh8C,EAAI+7C,EAIR,OAFA/7C,GADAA,EAAIA,EAAEjQ,QAAQ,aAAc,KACtBA,QAAQ,WAAY,IAEnB8rD,EAAK,UADZ77C,EAAIo+C,EAAYp+C,IACW,SAC5B,IAGI8K,CACX,EAEMszC,EAAc,SAAUtzC,GA2B1B,OAfAA,GADAA,GAHAA,EAAOA,EAAK/a,QAAQ,KAAM,UAGdA,QAAQ,KAAM,SACdA,QAAQ,KAAM,QAG1B+a,EAAOmyC,EAAiBnyC,EAAM,YAAY,EAa9C,EAEMkyC,EAAoB,SAAUlyC,GAShC,OAFAA,GALAA,EAAOA,EAAK/a,QACV,qCACA,wBAGUA,QAAQ,6BAA8B,cAGtD,EAEMysD,EAAiB,SAAU1xC,GA8C7B,OAhCAA,EAAOA,EAAK/a,QACV,uCACA,SAAU6rD,EAAYC,GACpB,IAAIwC,EAAKxC,EA0BT,OAhBAwC,GAFAA,GAHAA,EAAKA,EAAGtuD,QAAQ,mBAAoB,OAG5BA,QAAQ,MAAO,KAEfA,QAAQ,aAAc,IAK9BsuD,GAFAA,GAFAA,EAAK5C,EAAe4C,IAEZtuD,QAAQ,UAAW,SAEnBA,QACN,8BACA,SAAU6rD,EAAYC,GACpB,IAAIyC,EAAMzC,EAIV,OADAyC,GADAA,EAAMA,EAAIvuD,QAAQ,QAAS,OACjBA,QAAQ,MAAO,GAE1B,IAGIssD,EAAU,iBAAmBgC,EAAK,kBAC1C,GAGP,EAEM5B,EAAkB,SAAU3xC,GAiB9B,IAPA,IAAIyzC,GAFJzzC,GADAA,EAAOA,EAAK/a,QAAQ,QAAS,KACjBA,QAAQ,QAAS,KAEZ6B,MAAM,WACnB4sD,EAAW,IAAIjsD,MAKfqmC,EAAM2lB,EAAMntD,OACPD,EAAI,EAAGA,EAAIynC,EAAKznC,IAAK,CAC5B,IAAIe,EAAMqsD,EAAMptD,GAGZe,EAAIkC,OAAO,cAAgB,EAC7BoqD,EAASntD,KAAKa,GACLA,EAAIkC,OAAO,OAAS,IAE7BlC,GADAA,EAAMspD,EAActpD,IACVnC,QAAQ,aAAc,OAChCmC,GAAO,OACPssD,EAASntD,KAAKa,GAEjB,CAKD0mC,EAAM4lB,EAASptD,OACf,IAASD,EAAI,EAAGA,EAAIynC,EAAKznC,IAEvB,KAAOqtD,EAASrtD,GAAGiD,OAAO,aAAe,GAAG,CAC1C,IAAI+nD,EAAYlB,EAAc7vC,OAAOqzC,IACrCtC,EAAYA,EAAUpsD,QAAQ,MAAO,QACrCyuD,EAASrtD,GAAKqtD,EAASrtD,GAAGpB,QAAQ,SAAUosD,EAC7C,CAGH,OAAOqC,EAASltD,KAAK,OACzB,EAEM2qD,EAAuB,SAAUnxC,GAUnC,OAFAA,GAHAA,EAAOA,EAAK/a,QAAQ,qCAAsC,UAG9CA,QAAQ,qBAAsB,OAG9C,EAEM6sD,EAA0B,SAAU9xC,GAkBtC,OADAA,GADAA,EAAOA,EAAK/a,QAAQ,UAAW2uD,IACnB3uD,QAAQ,2BAA4B2uD,EAEpD,EAEM3B,EAAe,SAAUjyC,GA2B3B,OAPAA,GAnBAA,EAAOA,EAAK/a,QACV,oCACA,wBAiBUA,QACV,gEACA,SAAU6rD,EAAYC,GACpB,OAAO8C,EAAoBjD,EAAsBG,GAClD,GAIP,EAEM8C,EAAsB,SAAUC,GAuBlC,IAAI1tD,EAAS,CACX,SAAU2tD,GACR,MAAO,KAAOA,EAAG/H,WAAW,GAAK,GAClC,EACD,SAAU+H,GACR,MAAO,MAXX,SAAkBA,GAChB,IAAIC,EAAY,mBACZ7jD,EAAM4jD,EAAG/H,WAAW,GACxB,OAAOgI,EAAUptD,OAAOuJ,GAAO,GAAK6jD,EAAUptD,OAAa,GAANuJ,EACtD,CAOkB8jD,CAASF,GAAM,GAC/B,EACD,SAAUA,GACR,OAAOA,CACR,GAqBH,OAhBAD,GAFAA,EAAO,UAAYA,GAEP7uD,QAAQ,MAAM,SAAU8uD,GAClC,GAAU,KAANA,EAEFA,EAAK3tD,EAAOuhB,KAAKysB,MAAsB,EAAhBzsB,KAAK4L,WAAewgC,QACtC,GAAU,KAANA,EAAW,CAEpB,IAAItgC,EAAI9L,KAAK4L,SAEbwgC,EAAKtgC,EAAI,GAAMrtB,EAAO,GAAG2tD,GAAMtgC,EAAI,IAAOrtB,EAAO,GAAG2tD,GAAM3tD,EAAO,GAAG2tD,EACrE,CACD,OAAOA,CACb,IAGID,GADAA,EAAO,YAAcA,EAAO,KAAOA,EAAO,QAC9B7uD,QAAQ,SAAU,KAGlC,EAEM2rD,EAAwB,SAAU5wC,GAQpC,OAJAA,EAAOA,EAAK/a,QAAQ,aAAa,SAAU6rD,EAAYC,GACrD,IAAImD,EAAoBnsD,SAASgpD,GACjC,OAAOpsD,OAAOwvD,aAAaD,EACjC,GAEA,EAEMf,EAAW,SAAUnzC,GAavB,OAFAA,GAHAA,EAAOA,EAAK/a,QAAQ,mBAAoB,OAG5BA,QAAQ,MAAO,GAG/B,EAEMsrD,EAAS,SAAUvwC,GA0BrB,OAdAA,GAHAA,GAHAA,EAAOA,EAAK/a,QAAQ,YAAa,SAGrBA,QAAQ,MAAO,SAGfA,QAAQ,cAAc,SAAU6rD,EAAYC,EAAIC,GAK1D,IAJA,IAAIoD,EAAcrD,EACdsD,EAAY,EAAKD,EAAY9tD,OAAS,EAGjCD,EAAI,EAAGA,EAAIguD,EAAWhuD,IAAK+tD,GAAe,IAEnD,OAAOA,CACb,IAIIp0C,GADAA,EAAOA,EAAK/a,QAAQ,MAAO,SACfA,QAAQ,MAAO,GAG/B,EAMMktD,EAAmB,SAAUnyC,EAAMs0C,EAAeC,GAGpD,IAAIC,EACF,KAAOF,EAAcrvD,QAAQ,cAAe,QAAU,KAEpDsvD,IACFC,EAAc,OAASA,GAGzB,IAAI/lD,EAAQ,IAAI6R,OAAOk0C,EAAa,KAGpC,OAFAx0C,EAAOA,EAAK/a,QAAQwJ,EAAOmlD,EAG/B,EAEMA,EAA4B,SAAU9C,EAAYC,GAEpD,MAAO,KADgBA,EAAG/E,WAAW,GACJ,GACrC,CACA,GCnyCA,MAAMzzB,GAAY,IAAIy3B,GAASz3B,UAEzBk8B,GAAOl8B,GAAU83B,SAASrvC,KAAKuX,IACrCA,GAAU83B,SAAW,CAACrwC,EAAM00C,IAC1BD,GAAKz0C,EAAM00C,GAAQzvD,QAAQ,mBAAoB,+BCajD,SAAW9F,EAAGmuC,EAAKhP,EAAKq2B,GACtB,IAAI/yD,EAAe,CACjB,gCAAiC,CAC/Bw8C,GAAI,kCACJ8F,GAAI,wCACJC,GAAI,uCAENtM,MAAS,CACPuG,GAAI,UACJ8F,GAAI,SACJC,GAAI,cACJC,GAAI,cAIR,MAAMwQ,EAAkBnjD,EAAO,aAAc,CAC3C,YACA,cACA,oBAEIojD,EAAkBpjD,GAAO,EAAO,CACpC,YACA,cACA,oBAGFtS,GAAE,WACAqa,EAAG7X,gBAAgBC,EACvB,IAKE,IACM6pB,EADFqpC,GACErpC,EAAK,EACF,WACL,OAAOA,GACb,GAGEtsB,GAAE,WACAmgD,GAAS2B,KAAO,CAAC,KAAM,MACvB,IAAIwC,EAAOtkD,EAAE,8BAA8BuhB,OAqC3C,SAASq0C,EAAYh1B,GACnB,OAAO,CACR,CAED,SAASi1B,EAAsBC,GAC7B,IAAIl1B,EAAMk1B,EAAK,GACXC,EAAO35C,SAASG,iBAAiB,aAAeqkB,EAAIo1B,UAAY,MAChED,IACFn1B,EAAIq1B,QAAU,IAAIF,GAAMvoD,KAAIgP,GAnBhC,SAA+BqB,GAE7B,IADA,IAAI+xC,EAGDA,GADC/xC,EAAOA,EAAKq4C,gBACGr4C,EAAKE,aAAa,SACnCF,KACI+xC,IAAgE,IAAvDA,EAAMjoD,MAAM,KAAKE,QAAQ,4BAExC,OAAOgW,CACR,CAUsCs4C,CAAsB35C,IAAQA,IACpE,CAED,SAAS45C,EAAuB55C,EAAKnU,GACnC,IAAIguD,EAAKj6C,SAAS8Y,iBAChB1Y,EACAg5C,EAAGc,aACHC,EAAQluD,IACR,GAGF,OADAguD,EAAGvgC,WACIugC,EAAG5gC,WACX,CAED,SAASpH,EAAOynC,GACd,IAAIl1B,EAAMk1B,EAAK,GACbzzB,EAAWyzB,EAAK3uD,OAAS,EAC3B,GAAKy5B,EAAIq1B,QACT,IAAK,IAAIzoC,KAAUoT,EAAIq1B,QAAS,CAC9B,IACEO,EACAlqC,EAFErP,EAAYuQ,EAAOipC,mBAGrBC,EAAWvW,GAAS9xB,OAAOi2B,EAAM,CAC/BqS,QAASb,EAAKtoD,KAAI,SAAUozB,GAC1B,OAnDag2B,EAmDQh2B,EAlDtB5gC,EAAE0e,OAAO,CAAE,EAAEk4C,EAAQ,CAC1BlhC,QAASkhC,EAAOC,MACZD,EAAOlhC,QACP0D,GAAU83B,SAASlwC,GAAW41C,EAAOlhC,WAAakhC,EAAOlhC,UAJjE,IAAuBkhC,CAoD3B,IACYv0B,SAAUA,IAGd,GAAKplB,GAAqC,2BAAxBA,EAAU6C,UA2C1B02C,EAAav5C,EAAUc,aAAa,2BAChCy4C,EAAW3uD,QAAQ+4B,EAAIk2B,YAAc,IACvC75C,EAAU85C,SAAS,GAAG3xB,mBAAmB,YAAasxB,GACtDz5C,EAAUsS,aACR,0BACAinC,EAAa51B,EAAIk2B,iBA/CrBxqC,EAAK,oBAAsBqpC,IAC3BnoC,EAAO4X,mBACLqwB,EAAgBvzC,IAChB,0BAEEoK,EAFF,gGAMEjrB,EAAE,iCANJ,uBAWUq0D,EAAgBxzC,IACxBk0C,EAAuB5oC,EAAQ,uBAC/BA,GAEE4X,mBACJ,WACA,wBAGE9Y,EACA,8BACAsU,EAAIk2B,UALN,6DAUEJ,EAVF,+BAcEpqC,EAdF,oCAiBEjrB,EAAE,SAjBJ,kBA+BL,CACF,CAED,SAAS21D,IAEPC,EADS9wD,KAAK4X,aAAa,iBAE5B,CAQD,SAASk5C,EAAQ3qC,EAAIoxB,GACnB,IAAIrwB,EAAQjR,SAAS+D,eAAemM,GAChC7P,EAAiC,SAAxB4Q,EAAM+gB,MAAM8oB,QAEzB,QADavuD,IAAT+0C,IAAoBA,EAAOjhC,GAC3BihC,IAASjhC,EAAQ,CACnBzc,EAAEqtB,GAAOpB,SAAS,gCAClB,IAAIkrC,EAZR,SAAqB9pC,GACnB,OAAO,WACLrtB,EAAEqtB,GAAOlB,YAAY,+BAC7B,CACK,CAQiBirC,CAAY/pC,GAG1B,OAFAA,EAAMxf,iBAAiB,qBAAsBspD,QAC7C9pC,EAAMxf,iBAAiB,eAAgBspD,EAExC,CASD,GARAn3D,EAAE,yCAA2CssB,EAAK,MAAMhQ,YACtD,4BACAohC,GAEFthC,SACGoB,cAAc,yCAAyC8O,OACvDiD,aAAa,gBAAiBmuB,GACjC19C,EAAEqtB,GAAOgqC,YAAY3Z,GACjBA,EACFvP,EAAIvsB,YACFyL,GACEA,EAAM2tB,eAAe,CACnBC,SAAU,SACVqc,MAAO,SACP/B,OAAQ,YAEZ,IACAloC,OAEG,CAES8R,EAAI3hB,cAChB,yCAAyC8O,OAEnC0uB,eAAe,CACrBC,SAAU,SACVqc,MAAO,SACP/B,OAAQ,UAEX,CACF,CAED,SAASgB,EAAQrgB,GACf,OAAO,SAAUr4B,GACf,OAAQA,EAAKmC,SAAWnC,EAAK05C,mBAAmB11C,KAAKhE,EAA9C,CAAoDq4B,GACvDsf,EAAGgC,cACHhC,EAAGiC,WACf,CACK,MA3LmB,IAATnT,GAKXtkD,EAAEm/B,GAAKpf,GAAG,qBAAqB,SAAUwM,EAAO/N,GAC9C,GAAIA,GAAQA,EAAKw7B,mBAAoB,CACnC,IAAI/B,EAAOz5B,EAAKw7B,mBAAmBhlC,OAAO4gD,IAC1C3d,EAAOA,EAAKoH,UAAS,SAAUze,GAC7B,OAAOA,EAAIk2B,SACrB,KACatpD,IAAIqoD,GACT5d,EAAKzqC,IAAI6gB,EACV,CACP,IA+KIruB,EAAEm/B,GAAKpf,GAAG,QAAS,sBAAsB,SAAUkJ,GACjDA,EAAGuoB,iBACH,IAAI6kB,EAAKj6C,SAAS8Y,iBAChB9Y,SAASyD,KACT21C,EAAGc,aACHC,EAAQ,2BACR,GAKF,OAHAF,EAAG5gC,YAActvB,KACbkwD,EAAGqB,gBACLT,EAAQZ,EAAG5gC,YAAY1X,aAAa,kBAAkB,IACjD,CACb,IAEI/d,EAAEm/B,GAAKpf,GAAG,QAAS,yBAA0Bi3C,GAC7Ch3D,EAAEm/B,GAAKpf,GAAG,QAAS,0BAA2Bi3C,IA3M5Cj7C,QAAQC,KAAK,oCA4MnB,GACC,CA1PD,CA0PGjc,OAAQmF,OAAQkX,SAAUlX,OAAOyyD,YChPpC,SAAW33D,EAAGoc,GACZpc,EAAEoc,GAAU2D,GAAG,qBAAqB,SAAUwM,EAAO/N,GACnD,GAAIA,GAAQA,EAAK+6B,OAAQ,CACvB,IAAIa,EAAgB57B,EAAK47B,cACrBwd,EAAuB1yD,OAAOof,SAASC,SACxC5c,MAAM,KACNnB,OAAO,GAAG,GACgB,KAAzBoxD,IACFA,EAAuBzoB,GAAGjtB,KAAKutC,UAAUoI,eAAe,eAC1D,IAAIC,EACF3oB,GAAGjtB,KAAKutC,UAAUoI,eAAezd,GAEjC0d,GACAA,GAAwBF,GAExB1yD,OAAOof,SAAShN,OAAOwgD,EAE1B,CACL,GACC,CAnBD,CAmBG/3D,OAAQqc,UCjCX,SAAWpc,GACTA,GAAE,WACA,IAAIuvD,EAAUwI,EAEd,IACE,IAAIzI,EAAYptC,GAAKutC,UAAUC,SAASJ,UACxC,QAAkB3mD,IAAd2mD,EAAyB,KAAM,2BACnCC,EAAWD,EAAY,CAGxB,CAFC,MAAOlsC,GACPmsC,EAAW,CACZ,CAED,IAEE,GADAwI,EAAS71C,GAAKutC,UAAUjuB,SAASu2B,QACG,IAAhC,CAAC,UAAUlwD,QAAQkwD,GACrB,KAAM,iCACM,CAAd,MAAO30C,GAAO,CAEhB,MAAM40C,EAAU91C,GAAK+1C,QAAQjiD,SAAS,YAAc,OAAS,KACvDkiD,EAAgB,IAAI/2C,OAAO62C,EAAS,KAO1C,IAAIG,EAAQ,cACVC,EAAqB,CACnB,IACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,QACA,SACA,WAkCJ,SAASC,EAAc3jC,EAAGk9B,EAAIC,GAC5B,OAAOD,EAAKppC,KAAK2Y,IAAI,EAAGouB,EAAWv/C,OAAO6hD,GAC3C,CAjCc,WAAXkG,GACFK,EAAmBn9B,OAAO,GAG5Bj7B,EAAEqQ,GAAGmxB,SAAW,WACd,OAAOr7B,KAAK2mB,MAAK,SAAU5lB,EAAG4N,GAC5B,GAAIA,EAAEgd,UAAU2oB,SAAS,wBAAyB,OAElD,IAAI6d,EAASC,EACTC,EAeR,SAA2B1jD,GACzB,OACEsjD,EAAmBvwD,QAAQiN,EAAEzP,IAAI,GAAG8pB,WAAa,GACrC,WAAX4oC,GAAuBjjD,EAAEw0B,SAAS,WAEtC,CApBsBmvB,CAFnB3jD,EAAI9U,EAAE8U,IAKNwjD,EAAUxjD,EAAEyM,OAAOzb,QAAQqyD,EAFb,MAGdI,EAAWn/B,GAAU83B,SAASoH,EAASE,GACnCA,IACFD,EAAWA,EAAS/0C,OAAO1d,QAAQoyD,EAAe,UAEnC,IAAb3I,IACFgJ,EAAWA,EAASzyD,QAAQ,kBAAmBuyD,IAEjDvjD,EAAEyM,KAAKg3C,GAAUtsC,SAAS,uBAClC,GACA,EAaIjsB,EAAEoc,UAAU2D,GAAG,qBAAqB,SAAUwM,EAAO/N,GAC/CA,GAAQA,EAAK+6B,SACfv5C,EAAE,eAAewhC,WACjBxhC,EAAEoc,UAAUC,QAAQ,cACpBrc,EAAEoc,UAAUC,QAAQ,cAE5B,GACA,IAEED,SAASvO,iBACP,qBACA,EAAG4e,QAAU1B,UAASC,eAChB1kB,GAAI,QAAS0kB,IAAY1F,GAAQyF,IAAYN,GAAavI,MAC5D6I,EAAQuD,KAAKwD,UAAU8D,OAAO,wBAC9B7K,EAAQ6C,KAAK4T,YAGbl7B,GAAI,QAAS0kB,IACW,SAAxBD,EAAQrE,aACR+D,GAAavI,KAEb6I,EAAQ6C,KAAKhoB,KAAK,eAAe47B,UAClC,GAGN,CArGD,CAqGGzhC,QC7GH,SAAWC,EAAGm/B,GACZ,IAAIu5B,EAoBJ,SAAS1jD,IACPhV,EAAE,gCAAgCmjC,OAClC,IAAI9gC,EAAMrC,EAAEwjB,KAAKk1C,EAAQr2D,OACrBs2D,GAAW,EACf,GAAIt2D,EAAI8E,QAAU,EAAG,CACnB,IAAI+Z,EAAK,IAAIC,OAAO9e,EAAK,KACzBrC,EAAE,aAAa8sB,MAAK,WAClB,IAAIC,EAAQ/sB,EAAEmG,MAGV0a,EAAOkM,EAAMnnB,KAAK,kBAAkBib,QAAUkM,EAAMlM,OACpD+3C,EAAUv2D,EAAI8E,OAAS,GAAK+Z,EAAG/V,KAAK0V,GACxC83C,EAAWA,GAAYC,EACvB7rC,EAAMtR,OAAOm9C,EACrB,GACK,CACDF,EAAQp8C,YAAY,kCAAmCq8C,GAClDA,GACH34D,EAAE,aAAa09C,MAElB,CAED,SAASmb,IACPH,EAAQr2D,IAAI,IAAIga,QAAQ,SAASA,QAAQ,QAC1C,CA1CDrc,GAAE,WACA,IAAI84D,EAAO94D,EAAEm/B,GACbu5B,EAAU14D,EAAE,sBAEZ84D,EACG/4C,GAAG,oBAAqB/K,GACxB+K,GAAG,QAAS,qBAAsB/K,GAClC+K,GAAG,mBAAoB,2BAA4B84C,GAEtDH,EAAQ34C,GAAG,WAAW,SAAUkJ,GAC9B,GAAmB,KAAfA,EAAGygB,QAAgB,CACrB,IAAIqvB,EAAY/4D,EAAE,qBACO,IAArB+4D,EAAU5xD,QACZ4xD,EAAUnzD,KAAK,eAAeozD,UAAUp2C,OAAOvG,QAAQ,QAC1D,CACP,GACA,GA2BC,CA9CD,CA8CGtc,OAAQqc,UCzCX,SAAWpc,EAAGmuC,EAAKhP,GACd,IACD85B,EAEAC,EAHEC,EAAQ,GAKZn5D,GAAE,WAyBA,SAASo5D,EAAMpxD,GACb,IAAK,IAAIoK,KAAQpK,EACX1B,GAAI8L,EAAMpK,KAAM7B,KAAKiM,GAAQpK,EAAIoK,IAWvC,OATAjM,KAAKkzD,OAAS,CACZ5vD,KAAMzB,EAAIsxD,WACVrhB,KAAMjwC,EAAI+uC,YAEZ5wC,KAAKiwC,MAAQ,CACX6B,KAAMjwC,EAAIuxD,gBAEZpzD,KAAK8wD,QAAQ,UACb9wD,KAAK8wD,QAAQ,SACN9wD,IACR,CAkCD,OAxEAnG,EAAEm/B,GAAKpf,GAAG,oBAAoB,SAAUwM,EAAO/N,GACzCA,GAAQlY,GAAI,UAAWkY,KACpB26C,EAAM36C,EAAKg0B,SAWd2mB,EAAM36C,EAAKg0B,SAAS1sC,UAVpB9F,EAAEqF,IACAkd,GACE,cAAgB/D,EAAKg0B,QAAU,aAAeh0B,EAAK+zB,WAErDxjC,MAAK,SAAU/G,GACf,IAAIouC,EAAQ,IAAIgjB,EAAMpxD,GACtBmxD,EAAM36C,EAAKg0B,SAAW4D,EACtBA,EAAMtwC,SAClB,IAIA,IAEIq6C,GAAS2B,KAAO,CAAC,KAAM,MAEvBmX,EAAY78C,SAASG,iBAAiB,gBAqBtC68C,EAAM9xD,UAAU2vD,QAAU,SAAU7kD,GACvB5M,OAAOW,KAAKiM,GAAM6lC,MAAMtwC,MAAM,MACpC6F,IACH,SAAUgsD,GACR,IAAIC,EAAKD,EAAK7xD,MAAM,MAClBoP,EAAI0iD,EAAG,GACPhlC,EAAIglC,EAAGjzD,MAAM,GAAGa,KAAK,KACvBlB,KAAKiM,GAAM2E,GAAK0d,CAC1B,EAAU5S,KAAK1b,cAEFA,KAAKiM,GAAM6lC,IACxB,EAEImhB,EAAM9xD,UAAUxB,QAAU,WACpBozD,IAAW/yD,KAAKmmB,IAAItsB,EAAEm/B,GAAK9iB,QAAQ,iBAAkBlW,MACzD+yD,EAAS/yD,KAAKmmB,GAEd,IAAK,IAAIplB,EAAI,EAAGA,EAAI+xD,EAAU9xD,SAAUD,EAAG,CACzC,IAAIwyD,EAAWT,EAAU/xD,GACzB,GAAIwyD,EAAS37C,aAAa,yBAA2BvY,OAAOW,KAAKmmB,SAE1D,CACL,IAAIg4B,EAAOtkD,EACT,IAAM05D,EAAS37C,aAAa,8BAC5BwD,OACEm1C,EAAWvW,GAAS9xB,OAAOi2B,EAAMn+C,MACrCuzD,EAASt5C,UAAYs2C,EACrBgD,EAASnqC,aAAa,sBAAuBppB,KAAKmmB,GACnD,CACF,CACP,GAEW,CACX,GACC,CAjFD,CAiFGvsB,OAAQmF,OAAQkX,UCzFnB+yB,GAAGkH,gBAAkB,SAAUD,GAC7B,MACE,wBACAA,EAAM1D,OADN,qBAIA0D,EAAME,eACN,mBACAF,EAAMG,MANN,gCASAv1B,GAAWo1B,EAAMI,WATjB,6DAYAx1B,GAAWzY,EAAiBlH,EAAE,mBAAoB+0C,EAAMI,YACxD,KACAn1C,EAAE,SACF,aACC+0C,EAAMujB,oBAAsBvjB,EAAMwjB,UAC/B,+CACAv4D,EAAE,kBACF,KACA+0C,EAAMwjB,UAHN,aAMA,IACJ,QAEJ,ECtBA,SAAW55D,GACTA,EAAEoc,UAAU2D,GAAG,oBAAoB,SAAUwM,EAAO/N,GAC9CA,EAAK4rB,UACPpqC,EAAE8sB,KAAKtO,EAAK4rB,UAAU,SAAU/c,GAC9B7O,EAAK4rB,SAAS/c,GAAOmF,MAAQ,EAC7BhU,EAAK4rB,SAAS/c,GAAOyd,YACnBtsB,EAAK4rB,SAAS/c,GAAOyd,YAAYtnB,MAC3C,GAEA,GACC,CAVD,CAUGzjB,QCaH,SAAWC,EAAGmuC,EAAKhP,GACjBn/B,EAAEm/B,GAAK06B,OAAM,WACX,IACE,IAAI13D,EAAOgtC,GAAGjtB,KAAK/f,KACf23D,EACF3qB,GAAGjtB,KAAKutC,WACmC9mD,MAA3CwmC,GAAGjtB,KAAKutC,UAAUsK,sBACd5qB,GAAGjtB,KAAKutC,UAAUsK,sBAClB,GACFC,EACF/0D,MAAQ+nC,IAAM9nC,OAAOof,SAASzZ,KAAO,UAAYuR,SAAS69C,SACxDpvD,EACF,iDAEA1C,mBAAmB6xD,GACnB,SACA73D,EACA,aACAgG,mBAAmB2xD,GACrB95D,EAAE,0BAA0B+lB,KAAK,OAAQlb,EAQ1C,CAPC,MAAOiK,GAMP9U,EAAE,0BAA0BmjC,MAC7B,CACL,GACC,CA7BD,CA6BGpjC,OAAQmF,OAAQkX,UCvDnB,SAAyBpc,EAAGoc,GAC1B,MAAM89C,EAAS/qB,GAAGrtB,WAAWqtB,GAAGjtB,KAAM,YAAvBitB,CACb,0BACA,IAEIgrB,EAAYhrB,GAAGrtB,WAAWqtB,GAAGjtB,KAAM,YAAvBitB,CAChB,6BACA,KAGF,IAAIirB,EAEJ,GAAIptB,MAAQ/nC,KAKV,OAJAkqC,GAAGvzB,KAAKF,MAAM,mBACQ,oBAAXK,SAA0BA,SAAWA,QAAQs+C,KACtDt+C,QAAQs+C,IAAI,2CAOhB,GAHElrB,GAAGvzB,KAAK3Z,IAAI,cAGR,gBAAiBiD,OAAOmqB,OAA9B,CAGA,IACE+qC,EAAUjrB,GAAGjtB,MAAMutC,WAAW6K,cAAgBh2C,SAASI,OAChC,iBAAZ01C,IACTA,EAAU,CAACA,GAKd,CAHC,MAAOtlD,GAEP,YADA5P,OAAO6W,SAAW7W,OAAO6W,QAAQC,KAAKlH,GAEvC,CASD9U,GAAE,WACA,GAAI,mBAAoBkF,OAAQ,CACnB,IAAIq1D,gBAAe,SAAUh4D,GACtC,MAAMi4D,EAAKj4D,EAAQ,GAAGk4D,YAEtBC,EAAQ,CAAEC,OADGH,EAAGG,QAAUR,EAAYK,EAAGG,OAASR,GAE1D,IACSr5C,QAAQ1E,EAASyD,KAC1B,KAAW,CACL,MAAM+6C,EAAS,KACbF,EAAQ,CAAEC,OAAQ36D,EAAEoc,EAASyD,MAAM86C,SAAWT,GAAS,EAGzDl6D,EAAE,QAAQgG,OACR,+HAKFoW,EAAS+D,eAAe,UAAU06C,SAAW,WAC3C31D,OAAO0c,WAAWg5C,EArDR,IAsDlB,EAEM56D,EAAEoc,GAAU2D,GAAG,oBAAqB66C,GACpC56D,EAAEoc,GAAU2D,GAAG,aAAc66C,GAC7B56D,EAAEoc,GAAU2D,GAAG,eAAgB66C,EAChC,CACL,GA7CG,CAWD,SAASF,EAAQl8C,GACf2wB,GAAGvzB,KAAK3Z,IAAI,kBACZm4D,EAAQ3zD,SAAQ,SAAUie,GACxBxf,OAAOmqB,OAAOvgB,YAAYa,KAAKC,UAAU4O,GAAOkG,EACtD,GACG,CA8BF,CAtED,CAsEG3kB,OAAQqc,UCnEX,MAAMiF,GAAU,CACdi2B,QAAQ,EACRC,UAAU,GAqBZ,SAAS/pC,GAAIquC,GACX,OAAQA,GACN,IAAK,kBACH,OAAOx6C,EAAE,kBACX,IAAK,4BACH,OAAOA,EAAE,mBACX,QACE,OAAOA,EAAEw6C,GAEf,CA3BA77C,EAAEoc,UAAU2D,GAAG,qBAAqB,SAAUwM,EAAO/N,GACnD,GAAIA,GAAQA,EAAKs8C,YAAct8C,EAAKs8C,WAAW3zD,OAAS,EAEtD,IADA,IAAIsa,EACKva,EAAI,EAAG26B,EAAMrjB,EAAKs8C,WAAW3zD,OAAQD,EAAI26B,EAAK36B,IAAK,CAC1Dua,EAAQjD,EAAKs8C,WAAW5zD,GACxB,MAAM6jB,EAAUvM,EAAK+6B,OAClB3zC,MAAK,EAAG+nB,aAAcA,IACtBd,SAASjnB,MAAK,EAAG0mB,QAASA,IAAO,GAAG9N,EAAKg5B,YAAY/1B,EAAMhY,SAE9DzJ,EAAE,QAAQwe,EAAKg5B,YAAY/1B,EAAMhY,UAAUkyC,eACzCt6B,IACA,EACAxY,EAAO2E,GAAIiU,EAAMo6B,WAAYh1B,GAASkE,IAEzC,CAEL"}