diff --git a/dev/View/Popup/Domain.js b/dev/View/Popup/Domain.js index de16fe7c7..ca0618eae 100644 --- a/dev/View/Popup/Domain.js +++ b/dev/View/Popup/Domain.js @@ -30,14 +30,6 @@ const imapSslVerify_peer: false, imapSslAllow_self_signed: false, // Options - imapDisable_list_status: false, - imapDisable_metadata: false, - imapDisable_move: false, - imapDisable_sort: false, - imapDisable_thread: false, - imapDisable_binary: false, - imapDisable_status_size: true, - imapDisable_preview: true, imapExpunge_all_on_delete: false, imapFast_simple_search: true, imapFetch_new_messages: true, @@ -82,14 +74,7 @@ const verify_peer_name: !!oDomain.imapSslVerify_peer(), allow_self_signed: !!oDomain.imapSslAllow_self_signed() }, - disable_list_status: !!oDomain.imapDisable_list_status(), - disable_metadata: !!oDomain.imapDisable_metadata(), - disable_move: !!oDomain.imapDisable_move(), - disable_sort: !!oDomain.imapDisable_sort(), - disable_thread: !!oDomain.imapDisable_thread(), - disable_binary: !!oDomain.imapDisable_binary(), - disable_status_size: !!oDomain.imapDisable_status_size(), - disable_preview: !!oDomain.imapDisable_preview(), + disabled_capabilities: oDomain.imapDisabled_capabilities(), folder_list_limit: pInt(oDomain.imapFolder_list_limit()), message_list_limit: pInt(oDomain.imapMessage_list_limit()) /* @@ -153,6 +138,8 @@ export class DomainPopupView extends AbstractViewPopup { sieveHostFocus: false, smtpHostFocus: false, }); + this.imapDisabled_capabilities = ko.observableArray(); + this.imapCapabilities = ko.observableArray(); addComputablesTo(this, { headerText: () => { @@ -286,10 +273,22 @@ export class DomainPopupView extends AbstractViewPopup { this.testingSieveError(getNotification(iError)); this.testingSmtpError(getNotification(iError)); } else { + const result = oData.Result; this.testingDone(true); - this.testingImapError(true !== oData.Result.Imap ? oData.Result.Imap : false); - this.testingSieveError(true !== oData.Result.Sieve ? oData.Result.Sieve : false); - this.testingSmtpError(true !== oData.Result.Smtp ? oData.Result.Smtp : false); + this.testingImapError(true !== result.Imap ? result.Imap : false); + this.testingSieveError(true !== result.Sieve ? result.Sieve : false); + this.testingSmtpError(true !== result.Smtp ? result.Smtp : false); +/* + // result.ImapResult.connectCapa + if (true === result.Imap && result.ImapResult.authCapa) { + result.ImapResult.authCapa.sort(); + this.imapCapabilities(result.ImapResult.authCapa); + } + // result.SmtpResult.connectCapa + // result.SmtpResult.authCapa + // result.SieveResult.connectCapa + // result.SieveResult.authCapa +*/ } }, params @@ -310,6 +309,17 @@ export class DomainPopupView extends AbstractViewPopup { this.saving(false); this.clearTesting(); this.edit(false); + this.imapCapabilities([ + 'LIST-STATUS', + 'METADATA', + 'MOVE', + 'SORT', + 'THREAD', + 'BINARY', + 'STATUS=SIZE', + 'PREVIEW' + ]); + this.imapDisabled_capabilities(['PREVIEW','STATUS=SIZE']); forEachObjectEntry(domainDefaults, (key, value) => this[key](value)); this.enableSmartPorts(true); if (oDomain) { diff --git a/snappymail/v/0.0.0/app/domains/default.json b/snappymail/v/0.0.0/app/domains/default.json index 86f5ccddd..a757ec280 100644 --- a/snappymail/v/0.0.0/app/domains/default.json +++ b/snappymail/v/0.0.0/app/domains/default.json @@ -22,14 +22,10 @@ "disable_compression": true, "security_level": 1 }, - "disable_list_status": false, - "disable_metadata": false, - "disable_move": false, - "disable_sort": false, - "disable_thread": false, - "disable_binary": false, - "disable_status_size": true, - "disable_preview": true, + "disabled_capabilities": [ + "STATUS=SIZE", + "PREVIEW" + ], "use_expunge_all_on_delete": false, "fast_simple_search": true, "force_select": false, diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php b/snappymail/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php index 89f086969..f4aa710eb 100644 --- a/snappymail/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php +++ b/snappymail/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php @@ -30,15 +30,10 @@ class ImapClient extends \MailSo\Net\NetClient private int $iTagCount = 0; - /** - * @var array - */ - private $aCapabilityItems = null; + private ?array $aCapa = null; + private ?array $aCapaRaw = null; - /** - * @var FolderInformation - */ - private $oCurrentFolderInfo = null; + private ?FolderInformation $oCurrentFolderInfo = null; /** * Used by \MailSo\Mail\MailClient::MessageMimeStream @@ -89,7 +84,8 @@ class ImapClient extends \MailSo\Net\NetClient if ($this->hasCapability('STARTTLS')) { $this->SendRequestGetResponse('STARTTLS'); $this->EnableCrypto(); - $this->aCapabilityItems = null; + $this->aCapa = null; + $this->aCapaRaw = null; } else { $this->writeLogException( new \MailSo\Net\Exceptions\SocketUnsuppoterdSecureConnectionException('STARTTLS is not supported'), @@ -281,13 +277,21 @@ class ImapClient extends \MailSo\Net\NetClient */ public function Capability() : ?array { - if (!$this->aCapabilityItems) { + if (!$this->aCapa) { $this->setCapabilities($this->SendRequestGetResponse('CAPABILITY')); } /* - $this->aCapabilityItems[] = 'X-DOVECOT'; + $this->aCapa[] = 'X-DOVECOT'; */ - return $this->aCapabilityItems; + return $this->aCapa; + } + + public function Capabilities() : ?array + { + if (!$this->aCapa) { + $this->setCapabilities($this->SendRequestGetResponse('CAPABILITY')); + } + return $this->aCapaRaw; } public function CapabilityValue(string $sExtentionName) : ?string @@ -306,37 +310,17 @@ class ImapClient extends \MailSo\Net\NetClient { $aList = $oResponseCollection->getCapabilityResult(); if ($aList) { - if ($this->Settings->disable_metadata) { - // Issue #365: Many folders on Cyrus IMAP breaks login - $aList = \array_diff($aList, ['METADATA']); - } - if ($this->Settings->disable_move) { - $aList = \array_diff($aList, ['MOVE']); - } - if ($this->Settings->disable_sort) { - $aList = \array_diff($aList, ['SORT','ESORT']); - } - if ($this->Settings->disable_thread) { + // Strip unused capabilities + $aList = \array_diff($aList, ['PREVIEW=FUZZY', 'SNIPPET=FUZZY', 'SORT=DISPLAY']); + // Set raw response capabilities + $this->aCapaRaw = $aList; + // Set active capabilities + $aList = \array_diff($aList, $this->Settings->disabled_capabilities); + if (\in_array('THREAD', $this->Settings->disabled_capabilities)) { $aList = \array_filter($aList, function ($item) { \str_starts_with($item, 'THREAD='); }); } - if ($this->Settings->disable_list_status) { - $aList = \array_diff($aList, ['LIST-STATUS']); - } - if ($this->Settings->disable_binary) { - $aList = \array_diff($aList, ['BINARY']); - } - if (8 > PHP_INT_SIZE) { - $aList = \array_diff($aList, ['CONDSTORE']); - $aList = \array_diff($aList, ['STATUS=SIZE']); - } - if ($this->Settings->disable_status_size) { - $aList = \array_diff($aList, ['STATUS=SIZE']); - } - if ($this->Settings->disable_preview) { - $aList = \array_diff($aList, ['PREVIEW']); - } } - $this->aCapabilityItems = $aList; + $this->aCapa = $aList; } /** diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Settings.php b/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Settings.php index 85e40769b..8df79c736 100644 --- a/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Settings.php +++ b/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Settings.php @@ -19,46 +19,29 @@ class Settings extends \MailSo\Net\ConnectSettings { public int $port = 143, - $timeout = 300; + $timeout = 300, + $body_text_limit = 0, +// $folder_list_limit = 200, + $message_list_limit = 0, + $thread_limit = 50; public bool - $disable_list_status = false, - $disable_metadata = false, - $disable_move = false, - $disable_sort = false, - $disable_thread = false, - $disable_binary = false, - // STATUS SIZE can take a significant amount of time, therefore not active by default - $disable_status_size = true, - // RFC 8970 - $disable_preview = true, $expunge_all_on_delete = false, $fast_simple_search = true, $fetch_new_messages = true, $force_select = false, $message_all_headers = false; - public int - $body_text_limit = 0, -// $folder_list_limit = 200, - $message_list_limit = 0, - $thread_limit = 50; - public string $search_filter = ''; + public array + $disabled_capabilities = []; + public static function fromArray(array $aSettings) : self { $object = parent::fromArray($aSettings); $options = [ - 'disable_list_status', - 'disable_metadata', - 'disable_move', - 'disable_sort', - 'disable_thread', - 'disable_binary', - 'disable_status_size', - 'disable_preview', 'expunge_all_on_delete', 'fast_simple_search', 'fetch_new_messages', @@ -81,24 +64,56 @@ class Settings extends \MailSo\Net\ConnectSettings $object->$option = \intval($aSettings[$option]); } } + + if (!empty($aSettings['disabled_capabilities']) && \is_array($aSettings['disabled_capabilities'])) { + $object->disabled_capabilities = $aSettings['disabled_capabilities']; + } + // Convert old disable_* settings + if (!empty($aSettings['disable_list_status'])) { + $object->disabled_capabilities[] = 'list-status'; + } + if (!empty($aSettings['disable_metadata'])) { + // Issue #365: Many folders on Cyrus IMAP breaks login + $object->disabled_capabilities[] = 'METADATA'; + } + if (!empty($aSettings['disable_move'])) { + $object->disabled_capabilities[] = 'MOVE'; + } + if (!empty($aSettings['disable_sort'])) { + $object->disabled_capabilities[] = 'SORT'; + } + if (!empty($aSettings['disable_thread'])) { + $object->disabled_capabilities[] = 'THREAD'; + } + if (!empty($aSettings['disable_binary'])) { + $object->disabled_capabilities[] = 'BINARY'; + } + if (!empty($aSettings['disable_status_size'])) { + // STATUS SIZE can take a significant amount of time, therefore not active by default + $object->disabled_capabilities[] = 'STATUS=SIZE'; + } + if (!empty($aSettings['disable_preview'])) { + // RFC 8970 + $object->disabled_capabilities[] = 'PREVIEW'; + } + if (\in_array('SORT', $object->disabled_capabilities)) { + $object->disabled_capabilities[] = 'ESORT'; + } + $object->disabled_capabilities = \array_values(\array_unique($object->disabled_capabilities)); + return $object; } #[\ReturnTypeWillChange] public function jsonSerialize() { + if (\in_array('SORT', $this->disabled_capabilities)) { + $this->disabled_capabilities[] = 'ESORT'; + } return \array_merge( parent::jsonSerialize(), [ // '@Object' => 'Object/ImapSettings', - 'disable_list_status' => $this->disable_list_status, - 'disable_metadata' => $this->disable_metadata, - 'disable_move' => $this->disable_move, - 'disable_sort' => $this->disable_sort, - 'disable_thread' => $this->disable_thread, - 'disable_binary' => $this->disable_binary, - 'disable_status_size' => $this->disable_status_size, - 'disable_preview' => $this->disable_preview, 'use_expunge_all_on_delete' => $this->expunge_all_on_delete, // 'body_text_limit' => $this->body_text_limit, 'fast_simple_search' => $this->fast_simple_search, @@ -108,6 +123,7 @@ class Settings extends \MailSo\Net\ConnectSettings 'message_list_limit' => $this->message_list_limit, 'search_filter' => $this->search_filter, // 'thread_limit' => $this->thread_limit + 'disabled_capabilities' => \array_values(\array_unique($this->disabled_capabilities)) ] ); } diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php b/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php index 1def9cde4..91fa85b8e 100644 --- a/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php +++ b/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php @@ -808,7 +808,6 @@ class MailClient public function Folders(string $sParent, string $sListPattern, bool $bUseListSubscribeStatus) : ?FolderCollection { -// $this->oImapClient->Settings->disable_list_status $oFolderCollection = $this->oImapClient->FolderStatusList($sParent, $sListPattern); if (!$oFolderCollection->count()) { return null; diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/AdminDomains.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/AdminDomains.php index 8e05e3480..0016a759a 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/AdminDomains.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/AdminDomains.php @@ -97,14 +97,18 @@ trait AdminDomains $oSettings = $oDomain->ImapSettings(); $oImapClient->Connect($oSettings); $mImapResult = [ - 'connectCapa' => $oImapClient->Capability() + 'connectCapa' => $oImapClient->Capabilities() ]; if (!empty($aAuth['user'])) { $oSettings->Login = $aAuth['user']; $oSettings->Password = $aAuth['pass']; $oImapClient->Login($oSettings); - $mImapResult['authCapa'] = $oImapClient->Capability(); + $mImapResult['authCapa'] = \array_values(\array_unique(\array_map(function($n){ + return \str_starts_with($n, 'THREAD=') ? 'THREAD' : $n; + }, + $oImapClient->Capabilities() + ))); } $oImapClient->Disconnect(); diff --git a/snappymail/v/0.0.0/app/templates/Views/Admin/PopupsDomain.html b/snappymail/v/0.0.0/app/templates/Views/Admin/PopupsDomain.html index a0d4ac4b9..fb799e2f8 100644 --- a/snappymail/v/0.0.0/app/templates/Views/Admin/PopupsDomain.html +++ b/snappymail/v/0.0.0/app/templates/Views/Admin/PopupsDomain.html @@ -79,62 +79,18 @@ }">

-
-
-
-
-
-
-
-
+ +
+
+ +
+

diff --git a/vendors/knockout/build/output/knockout-latest.debug.js b/vendors/knockout/build/output/knockout-latest.debug.js index 883ef27b1..1d6226bb1 100644 --- a/vendors/knockout/build/output/knockout-latest.debug.js +++ b/vendors/knockout/build/output/knockout-latest.debug.js @@ -33,7 +33,7 @@ ko.utils = { emptyDomNode: domNode => [...domNode.childNodes].forEach(child => ko.removeNode(child)), // emptyDomNode: domNode => {while (domNode.lastChild) ko.removeNode(domNode.lastChild)}, - // Safari 14+ + // Safari 14+ // emptyDomNode: domNode => domNode.replaceChildren(), moveCleanedNodesToContainerElement: nodes => { @@ -2403,17 +2403,17 @@ ko.bindingHandlers['checked'] = { // Only bind to check boxes and radio buttons if (isCheckbox || isRadio) { const checkedValue = ko.pureComputed(()=>{ - if (isRadio) { + // Treat "value" like "checkedValue" when it is included with "checked" binding + if (allBindings['has']('checkedValue')) { + return ko.utils.unwrapObservable(allBindings.get('checkedValue')); + } else if (useElementValue) { return allBindings['has']('value') ? ko.utils.unwrapObservable(allBindings.get('value')) : element.value; } }); - // Set up two computeds to update the binding: - - // The first responds to element clicks - element.addEventListener("click", () => { + var updateModel = () => { // When we're first setting up this computed, don't change any model state. if (ko.dependencyDetection.isInitial()) { return; @@ -2421,7 +2421,8 @@ ko.bindingHandlers['checked'] = { // This updates the model value from the view value. // It runs in response to DOM events (click) and changes in checkedValue. - var isChecked = element.checked; + var isChecked = element.checked, + elemValue = checkedValue(); // We can ignore unchecked radio buttons, because some other radio // button will be checked, and that one can take care of updating state. @@ -2430,24 +2431,90 @@ ko.bindingHandlers['checked'] = { return; } - var elemValue = isCheckbox ? isChecked : checkedValue(), - modelValue = ko.dependencyDetection.ignore(valueAccessor); - ko.expressionRewriting.writeValueToProperty(modelValue, allBindings, 'checked', elemValue, true); - }), + var modelValue = ko.dependencyDetection.ignore(valueAccessor); + if (valueIsArray) { + var writableValue = rawValueIsNonArrayObservable ? modelValue.peek() : modelValue, + saveOldValue = oldElemValue; + oldElemValue = elemValue; + + if (saveOldValue !== elemValue) { + // When we're responding to the checkedValue changing, and the element is + // currently checked, replace the old elem value with the new elem value + // in the model array. + if (isChecked) { + writableValue.push(elemValue); + writableValue.remove(saveOldValue); + } + } else { + // When we're responding to the user having checked/unchecked a checkbox, + // add/remove the element value to the model array. + isChecked ? writableValue.push(elemValue) : writableValue.remove(elemValue); + } + + if (rawValueIsNonArrayObservable && ko.isWriteableObservable(modelValue)) { + modelValue(writableValue); + } + } else { + if (isCheckbox) { + if (elemValue === undefined) { + elemValue = isChecked; + } else if (!isChecked) { + elemValue = undefined; + } + } + ko.expressionRewriting.writeValueToProperty(modelValue, allBindings, 'checked', elemValue, true); + } + } + + var rawValue = valueAccessor(), + valueIsArray = isCheckbox && (ko.utils.unwrapObservable(rawValue) instanceof Array), + rawValueIsNonArrayObservable = !(valueIsArray && rawValue.push && rawValue.splice), + useElementValue = isRadio || valueIsArray, + oldElemValue = valueIsArray ? checkedValue() : undefined; + + // IE 6 won't allow radio buttons to be selected unless they have a name + if (isRadio && !element.name) + ko.bindingHandlers['uniqueName']['init'](element, function() { return true }); + + // Set up two computeds to update the binding: + + // The first responds to changes in the checkedValue value and to element clicks + ko.computed(updateModel, null, { disposeWhenNodeIsRemoved: element }); + element.addEventListener("click", updateModel); // The second responds to changes in the model value (the one associated with the checked binding) ko.computed(() => { // This updates the view value from the model value. // It runs in response to changes in the bound (checked) value. - var modelValue = ko.utils.unwrapObservable(valueAccessor()); - element.checked = isCheckbox ? !!modelValue : (checkedValue() === modelValue); + var modelValue = ko.utils.unwrapObservable(valueAccessor()), + elemValue = checkedValue(); + + if (valueIsArray) { + // When a checkbox is bound to an array, being checked represents its value being present in that array + element.checked = modelValue.includes(elemValue); + oldElemValue = elemValue; + } else if (isCheckbox && elemValue === undefined) { + // When a checkbox is bound to any other value (not an array) and "checkedValue" is not defined, + // being checked represents the value being trueish + element.checked = !!modelValue; + } else { + // Otherwise, being checked means that the checkbox or radio button's value corresponds to the model value + element.checked = (checkedValue() === modelValue); + } }, null, { disposeWhenNodeIsRemoved: element }); + + rawValue = undefined; } } }; - ko.expressionRewriting.twoWayBindings['checked'] = true; +ko.bindingHandlers['checkedValue'] = { + 'update': function (element, valueAccessor) { + element.value = ko.utils.unwrapObservable(valueAccessor()); + } +}; + })(); var classesWrittenByBindingKey = '__ko__cssValue', toggleClasses = (node, classNames, force) => diff --git a/vendors/knockout/build/output/knockout-latest.js b/vendors/knockout/build/output/knockout-latest.js index 55ac99c20..27de8b34c 100644 --- a/vendors/knockout/build/output/knockout-latest.js +++ b/vendors/knockout/build/output/knockout-latest.js @@ -4,71 +4,72 @@ * License: MIT (http://www.opensource.org/licenses/mit-license.php) */ -(V=>{function P(a,b){return null===a||da[typeof a]?a===b:!1}function ea(a,b){var d;return()=>{d||(d=setTimeout(()=>{d=0;a()},b))}}function fa(a,b){var d;return()=>{clearTimeout(d);d=setTimeout(a,b)}}function ha(a,b){b?.A?.()}function ia(a,b){var d=this.$b,f=d[y];f.$||(this.Za&&this.za[b]?(d.vb(b,a,this.za[b]),this.za[b]=null,--this.Za):f.B[b]||d.vb(b,a,f.C?{X:a}:d.Sb(a)),a.ja&&a.Wb())}function W(a){a=c.g.j.get(a,K);var b=a?.I;b&&(a.I=null,b.Mb())}function X(a,b){for(var d,f=c.m.firstChild(b);d=f;)f= -c.m.nextSibling(d),Y(a,d);c.l.notify(b,c.l.H)}function Y(a,b){var d=a;if(1===b.nodeType||c.Ab.nc(b))d=Z(b,null,a).bindingContextForDescendants;d&&!b.matches?.("SCRIPT,TEXTAREA,TEMPLATE")&&X(d,b)}function ja(a){var b=[],d={},f=[];c.g.P(a,function e(l){if(!d[l]){var g=c.h[l];g&&(g.after&&(f.push(l),g.after.forEach(h=>{if(a[h]){if(f.includes(h))throw Error("Cannot combine the following bindings, because they have a cyclic dependency: "+f.join(", "));e(h)}}),f.length--),b.push({key:l,Ib:g}));d[l]=!0}}); -return b}function Z(a,b,d){var f=c.g.j.fb(a,K,{}),k=f.Xb;if(!b){if(k)throw Error("You cannot apply bindings multiple times to the same element.");f.Xb=!0}k||(f.context=d);f.hb||(f.hb={});if(b&&"function"!==typeof b)var l=b;else{var e=c.u(()=>{if(l=b?b(d,a):c.Ab.cc(a,d))d[L]?.(),d[aa]?.();return l},{s:a});l&&e.isActive()||(e=null)}var g=d,h;if(l){var n=e?m=>()=>e()[m]():m=>l[m],p={get:m=>l[m]&&n(m)(),has:m=>m in l};c.l.H in l&&c.l.subscribe(a,c.l.H,()=>{var m=l[c.l.H]();if(m){var r=c.m.childNodes(a); -r.length&&m(r,c.Eb(r[0]))}});c.l.ga in l&&(g=c.l.mb(a,d),c.l.subscribe(a,c.l.ga,()=>{var m=l[c.l.ga]();m&&c.m.firstChild(a)&&m(a)}));ja(l).forEach(m=>{var r=m.Ib.init,q=m.Ib.update,t=m.key;if(8===a.nodeType&&!c.m.ca[t])throw Error("The binding '"+t+"' cannot be used with virtual elements");try{"function"==typeof r&&c.o.M(()=>{var u=r(a,n(t),p,g.$data,g);if(u&&u.controlsDescendantBindings){if(void 0!==h)throw Error("Multiple bindings ("+h+" and "+t+") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element."); -h=t}}),"function"==typeof q&&c.u(()=>q(a,n(t),p,g.$data,g),{s:a})}catch(u){throw u.message='Unable to process binding "'+t+": "+l[t]+'"\nMessage: '+u.message,u;}})}f=void 0===h;return{shouldBindDescendants:f,bindingContextForDescendants:f&&g}}function Q(a,b){return a&&a instanceof c.ea?a:new c.ea(a,void 0,void 0,b)}var M=V.document,R={},c="undefined"!==typeof R?R:{};c.v=(a,b)=>{a=a.split(".");for(var d=c,f=0,k=a.length-1;f{a[b]=d};c.v("version","3.5.1-sm"); -c.g={extend:(a,b)=>b?Object.assign(a,b):a,P:(a,b)=>a&&Object.entries(a).forEach(d=>b(d[0],d[1])),cb:a=>[...a.childNodes].forEach(b=>c.removeNode(b)),Lb:a=>{a=[...a];var b=(a[0]?.ownerDocument||M).createElement("div");a.forEach(d=>b.append(c.fa(d)));return b},ya:(a,b)=>Array.prototype.map.call(a,b?d=>c.fa(d.cloneNode(!0)):d=>d.cloneNode(!0)),ua:(a,b)=>{c.g.cb(a);b&&a.append(...b)},Ba:(a,b)=>{if(a.length){for(b=8===b.nodeType&&b.parentNode||b;a.length&&a[0].parentNode!==b;)a.splice(0,1);for(;1null==a?"":a.trim?a.trim():a.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g,""),bb:a=>a.ownerDocument.documentElement.contains(1!==a.nodeType?a.parentNode:a),Tb:(a,b)=>{if(!a?.nodeType)throw Error("element must be a DOM node when calling triggerEvent");a.dispatchEvent(new Event(b))},i:a=>c.T(a)?a():a,lb:(a,b)=>a.textContent=c.g.i(b)||""};c.v("utils", -c.g);c.v("unwrap",c.g.i);(()=>{let a=0,b="__ko__"+Date.now(),d=new WeakMap;c.g.j={get:(f,k)=>(d.get(f)||{})[k],set:(f,k,l)=>{d.has(f)?d.get(f)[k]=l:d.set(f,{[k]:l});return l},fb:function(f,k,l){return this.get(f,k)||this.set(f,k,l)},clear:f=>d.delete(f),Z:()=>a++ +b}})();c.g.K=(()=>{var a=c.g.j.Z(),b={1:1,8:1,9:1},d={1:1,9:1};const f=(e,g)=>{var h=c.g.j.get(e,a);g&&!h&&(h=new Set,c.g.j.set(e,a,h));return h},k=e=>{var g=f(e);g&&(new Set(g)).forEach(h=>h(e));c.g.j.clear(e);d[e.nodeType]&&l(e.childNodes, -!0)},l=(e,g)=>{for(var h=[],n,p=0;p{if("function"!=typeof g)throw Error("Callback must be a function");f(e,1).add(g)},kb:(e,g)=>{var h=f(e);h&&(h.delete(g),h.size||c.g.j.set(e,a,null))},fa:e=>{c.o.M(()=>{b[e.nodeType]&&(k(e),d[e.nodeType]&&l(e.getElementsByTagName("*")))});return e},removeNode:e=>{c.fa(e);e.parentNode&&e.parentNode.removeChild(e)}}})();c.fa=c.g.K.fa;c.removeNode= -c.g.K.removeNode;c.v("utils.domNodeDisposal",c.g.K);c.v("utils.domNodeDisposal.addDisposeCallback",c.g.K.ma);c.eb={debounce:(a,b)=>a.Ja(d=>fa(d,b)),rateLimit:(a,b)=>{if("number"==typeof b)var d=b;else{d=b.timeout;var f=b.method}var k="function"==typeof f?f:ea;a.Ja(l=>k(l,d,b))},notify:(a,b)=>{a.pa="always"==b?null:P}};var da={undefined:1,"boolean":1,number:1,string:1};c.v("extenders",c.eb);class ka{constructor(a,b,d){this.X=a;this.pb=b;this.Da=d;this.Ra=!1;this.L=this.ia=null;c.ha(this,"dispose", -this.A)}A(){this.Ra||(this.L&&c.g.K.kb(this.ia,this.L),this.Ra=!0,this.Da(),this.X=this.pb=this.Da=this.ia=this.L=null)}s(a){this.ia=a;c.g.K.ma(a,this.L=this.A.bind(this))}}c.V=function(){Object.setPrototypeOf(this,D);D.Fa(this)};var D={Fa:a=>{a.W=new Map;a.W.set("change",new Set);a.ub=1},subscribe:function(a,b,d){var f=this;d=d||"change";var k=new ka(f,b?a.bind(b):a,()=>{f.W.get(d).delete(k);f.Sa?.(d)});f.Ua?.(d);f.W.has(d)||f.W.set(d,new Set);f.W.get(d).add(k);return k},D:function(a,b){b=b||"change"; -"change"===b&&this.Na();if(this.ra(b)){b="change"===b&&this.Ub||new Set(this.W.get(b));try{c.o.zb(),b.forEach(d=>{d.Ra||d.pb(a)})}finally{c.o.end()}}},Ca:function(){return this.ub},fc:function(a){return this.Ca()!==a},Na:function(){++this.ub},Ja:function(a){var b=this,d=c.T(b),f,k,l,e,g;b.wa||(b.wa=b.D,b.D=(n,p)=>{p&&"change"!==p?"beforeChange"===p?b.rb(n):b.wa(n,p):b.sb(n)});var h=a(()=>{b.ja=!1;d&&e===b&&(e=b.qb?b.qb():b());var n=k||g&&b.Ha(l,e);g=k=f=!1;n&&b.wa(l=e)});b.sb=(n,p)=>{p&&b.ja||(g= -!p);b.Ub=new Set(b.W.get("change"));b.ja=f=!0;e=n;h()};b.rb=n=>{f||(l=n,b.wa(n,"beforeChange"))};b.tb=()=>{g=!0};b.Wb=()=>{b.Ha(l,b.R(!0))&&(k=!0)}},ra:function(a){return(this.W.get(a)||[]).size},Ha:function(a,b){return!this.pa||!this.pa(a,b)},toString:()=>"[object Object]",extend:function(a){var b=this;a&&c.g.P(a,(d,f)=>{d=c.eb[d];"function"==typeof d&&(b=d(b,f)||b)});return b}};c.ha(D,"init",D.Fa);c.ha(D,"subscribe",D.subscribe);c.ha(D,"extend",D.extend);c.V.fn=Object.setPrototypeOf(D,Function.prototype); -c.kc=a=>"function"==typeof a?.subscribe&&"function"==typeof a.D;(()=>{var a=[],b,d=0;c.o={zb:f=>{a.push(b);b=f},end:()=>b=a.pop(),Pb:f=>{if(b){if(!c.kc(f))throw Error("Only subscribable things can act as dependencies");b.Yb.call(b.Zb,f,f.Vb||(f.Vb=++d))}},M:(f,k,l)=>{try{return a.push(b),b=void 0,f.apply(k,l||[])}finally{b=a.pop()}},qa:()=>b?.u.qa(),Ia:()=>b?.Ia,u:()=>b?.u}})();const B=Symbol("_latestValue");c.ba=a=>{function b(){if(0null==b[B]?void 0:b[B].length});c.V.fn.Fa(b);return Object.setPrototypeOf(b,F)};var F={toJSON:function(){let a=this[B];return a?.toJSON?.()||a},pa:P,R:function(){return this[B]},Oa:function(){this.D(this[B],"spectate");this.D(this[B])},ob:function(){this.D(this[B],"beforeChange")}};Object.setPrototypeOf(F,c.V.fn);var G=c.ba.qc="__ko_proto__";F[G]=c.ba;c.T=a=>{if((a="function"==typeof a&&a[G])&&a!==F[G]&& -a!==c.u.fn[G])throw Error("Invalid object that looks like an observable; possibly from another Knockout instance");return!!a};c.lc=a=>"function"==typeof a&&(a[G]===F[G]||a[G]===c.u.fn[G]&&a.hc);c.v("observable",c.ba);c.v("isObservable",c.T);c.v("observable.fn",F);c.ha(F,"valueHasMutated",F.Oa);c.ta=a=>{a=a||[];if("object"!=typeof a||!("length"in a))throw Error("The argument passed when initializing an observable array must be an array, or null, or undefined.");return Object.setPrototypeOf(c.ba(a), -c.ta.fn).extend({trackArrayChanges:!0})};c.ta.fn=Object.setPrototypeOf({remove:function(a){for(var b=this.R(),d=!1,f="function"!=typeof a||c.T(a)?e=>e===a:a,k=b.length;k--;){var l=b[k];if(f(l)){if(b[k]!==l)throw Error("Array modified during remove; cannot remove item");d||this.ob();d=!0;b.splice(k,1)}}d&&this.Oa()}},c.ba.fn);Object.getOwnPropertyNames(Array.prototype).forEach(a=>{"function"===typeof Array.prototype[a]&&"constructor"!=a&&("copyWithin fill pop push reverse shift sort splice unshift".split(" ").includes(a)? -c.ta.fn[a]=function(...b){var d=this.R();this.ob();this.Bb(d,a,b);b=d[a](...b);this.Oa();return b===d?this:b}:c.ta.fn[a]=function(...b){return this()[a](...b)})});c.Jb=a=>c.T(a)&&"function"==typeof a.remove&&"function"==typeof a.push;c.v("observableArray",c.ta);c.v("isObservableArray",c.Jb);c.eb.trackArrayChanges=(a,b)=>{function d(){function m(){if(g){var r=[].concat(a.R()||[]);if(a.ra("arrayChange")){if(!k||1++g,null,"spectate"),h=[].concat(a.R()||[]),k=null,l=a.subscribe(m))}a.Wa={};"object"==typeof b&&c.g.extend(a.Wa,b);a.Wa.sparse=!0;if(!a.Bb){var f=!1,k=null,l,e,g=0,h,n=a.Ua,p=a.Sa;a.Ua=m=>{n?.call(a,m);"arrayChange"===m&&d()};a.Sa=m=>{p?.call(a,m);"arrayChange"!==m||a.ra("arrayChange")||(l?.A(),e?.A(),e=l=null,f=!1,h=void 0)};a.Bb=(m,r,q)=>{function t(A,x,I){return u[u.length]={status:A,value:x,index:I}}if(f&&!g){var u=[],w=m.length,v=q.length,z=0;switch(r){case "push":z=w;case "unshift":for(m= -0;mq[0]?w+q[0]:q[0]),w);w=1===v?w:Math.min(z+(q[1]||0),w);v=z+v-2;r=Math.max(w,v);for(var C=[],H=[],O=2;z{function d(){if(0{d.A()});return d};var J={pa:P,qa:function(){return this[y].J},dc:function(){var a=[];c.g.P(this[y].B,(b,d)=>a[d.ka]=d.X);return a},gb:function(a){if(!this[y].J)return!1;var b=this.dc();return b.includes(a)||!!b.find(d=>d.gb&&d.gb(a))},vb:function(a,b,d){if(this[y].jb&&b===this)throw Error("A 'pure' computed must not be called recursively");this[y].B[a]=d;d.ka=this[y].J++;d.la=b.Ca()},sa:function(){var a, -b=this[y].B;for(a in b)if(Object.prototype.hasOwnProperty.call(b,a)){var d=b[a];if(this.va&&d.X.ja||d.X.fc(d.la))return!0}},vc:function(){this[y].Ga||this.va?.(!1)},isActive:function(){var a=this[y];return a.Y||0a.U(!0),b)):a.va?a.va(!0):a.U(!0)},U:function(a){var b=this[y],d=b.na, -f=!1;if(!b.Ga&&!b.$){if(b.s&&!c.g.bb(b.s)||d?.()){if(!b.nb){this.A();return}}else b.nb=!1;try{b.Ga=!0,f=this.bc(a)}finally{b.Ga=!1}return f}},bc:function(a){var b=this[y],d=b.jb?void 0:!b.J;var f={$b:this,za:b.B,Za:b.J};c.o.zb({Zb:f,Yb:ia,u:this,Ia:d});b.B={};b.J=0;a:{try{var k=b.Ob();break a}finally{c.o.end(),f.Za&&!b.C&&c.g.P(f.za,ha),b.aa=b.Y=!1}k=void 0}b.J?f=this.Ha(b.N,k):(this.A(),f=!0);f&&(b.C?this.Na():this.D(b.N,"beforeChange"),b.N=k,this.D(b.N,"spectate"),!b.C&&a&&this.D(b.N),this.tb&& -this.tb());d&&this.D(b.N,"awake");return f},R:function(a){var b=this[y];(b.Y&&(a||!b.J)||b.C&&this.sa())&&this.U();return b.N},Ja:function(a){var b=this;c.V.fn.Ja.call(b,a);b.qb=()=>{b[y].C||(b[y].aa?b.U():b[y].Y=!1);return b[y].N};b.va=d=>{b.rb(b[y].N);b[y].Y=!0;d&&(b[y].aa=!0);b.sb(b,!d)}},A:function(){var a=this[y];!a.C&&a.B&&c.g.P(a.B,(b,d)=>d.A?.());a.s&&a.ab&&c.g.K.kb(a.s,a.ab);a.B=void 0;a.J=0;a.$=!0;a.aa=!1;a.Y=!1;a.C=!1;a.s=void 0;a.na=void 0;a.Ob=void 0}},la={Ua:function(a){var b=this,d= -b[y];if(!d.$&&d.C&&"change"==a){d.C=!1;if(d.aa||b.sa())d.B=null,d.J=0,b.U()&&b.Na();else{var f=[];c.g.P(d.B,(k,l)=>f[l.ka]=k);f.forEach((k,l)=>{var e=d.B[k],g=b.Sb(e.X);g.ka=l;g.la=e.la;d.B[k]=g});b.sa()&&b.U()&&b.Na()}d.$||b.D(d.N,"awake")}},Sa:function(a){var b=this[y];b.$||"change"!=a||this.ra("change")||(c.g.P(b.B,(d,f)=>{f.A&&(b.B[d]={X:f.X,ka:f.ka,la:f.la},f.A())}),b.C=!0,this.D(void 0,"asleep"))},Ca:function(){var a=this[y];a.C&&(a.aa||this.sa())&&this.U();return c.V.fn.Ca.call(this)}};Object.setPrototypeOf(J, -c.V.fn);var S=c.ba.qc;J[S]=c.u;c.v("computed",c.u);c.v("isComputed",a=>"function"==typeof a&&a[S]===J[S]);c.v("computed.fn",J);c.ha(J,"dispose",J.A);c.Nb=a=>{if("function"===typeof a)return c.u(a,{pure:!0});a={...a,pure:!0};return c.u(a)};c.F={S:a=>{switch(a.nodeName){case "OPTION":return!0===a.__ko__hasDomDataOptionValue__?c.g.j.get(a,c.h.options.ib):a.value;case "SELECT":return 0<=a.selectedIndex?c.F.S(a.options[a.selectedIndex]):void 0;default:return a.value}},Pa:(a,b,d)=>{switch(a.nodeName){case "OPTION":"string"=== +(V=>{function P(a,b){return null===a||da[typeof a]?a===b:!1}function ea(a,b){var d;return()=>{d||(d=setTimeout(()=>{d=0;a()},b))}}function fa(a,b){var d;return()=>{clearTimeout(d);d=setTimeout(a,b)}}function ha(a,b){b?.A?.()}function ia(a,b){var d=this.ac,f=d[y];f.$||(this.Za&&this.za[b]?(d.vb(b,a,this.za[b]),this.za[b]=null,--this.Za):f.B[b]||d.vb(b,a,f.C?{X:a}:d.Tb(a)),a.ja&&a.Xb())}function W(a){a=c.g.j.get(a,K);var b=a?.I;b&&(a.I=null,b.Nb())}function X(a,b){for(var d,f=c.m.firstChild(b);d=f;)f= +c.m.nextSibling(d),Y(a,d);c.l.notify(b,c.l.H)}function Y(a,b){var d=a;if(1===b.nodeType||c.Ab.nc(b))d=Z(b,null,a).bindingContextForDescendants;d&&!b.matches?.("SCRIPT,TEXTAREA,TEMPLATE")&&X(d,b)}function ja(a){var b=[],d={},f=[];c.g.R(a,function e(l){if(!d[l]){var g=c.h[l];g&&(g.after&&(f.push(l),g.after.forEach(h=>{if(a[h]){if(f.includes(h))throw Error("Cannot combine the following bindings, because they have a cyclic dependency: "+f.join(", "));e(h)}}),f.length--),b.push({key:l,Ib:g}));d[l]=!0}}); +return b}function Z(a,b,d){var f=c.g.j.fb(a,K,{}),k=f.Yb;if(!b){if(k)throw Error("You cannot apply bindings multiple times to the same element.");f.Yb=!0}k||(f.context=d);f.hb||(f.hb={});if(b&&"function"!==typeof b)var l=b;else{var e=c.s(()=>{if(l=b?b(d,a):c.Ab.dc(a,d))d[L]?.(),d[aa]?.();return l},{o:a});l&&e.isActive()||(e=null)}var g=d,h;if(l){var p=e?m=>()=>e()[m]():m=>l[m],n={get:m=>l[m]&&p(m)(),has:m=>m in l};c.l.H in l&&c.l.subscribe(a,c.l.H,()=>{var m=l[c.l.H]();if(m){var r=c.m.childNodes(a); +r.length&&m(r,c.Eb(r[0]))}});c.l.ga in l&&(g=c.l.mb(a,d),c.l.subscribe(a,c.l.ga,()=>{var m=l[c.l.ga]();m&&c.m.firstChild(a)&&m(a)}));ja(l).forEach(m=>{var r=m.Ib.init,q=m.Ib.update,t=m.key;if(8===a.nodeType&&!c.m.ca[t])throw Error("The binding '"+t+"' cannot be used with virtual elements");try{"function"==typeof r&&c.u.N(()=>{var u=r(a,p(t),n,g.$data,g);if(u&&u.controlsDescendantBindings){if(void 0!==h)throw Error("Multiple bindings ("+h+" and "+t+") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element."); +h=t}}),"function"==typeof q&&c.s(()=>q(a,p(t),n,g.$data,g),{o:a})}catch(u){throw u.message='Unable to process binding "'+t+": "+l[t]+'"\nMessage: '+u.message,u;}})}f=void 0===h;return{shouldBindDescendants:f,bindingContextForDescendants:f&&g}}function Q(a,b){return a&&a instanceof c.ea?a:new c.ea(a,void 0,void 0,b)}var M=V.document,R={},c="undefined"!==typeof R?R:{};c.v=(a,b)=>{a=a.split(".");for(var d=c,f=0,k=a.length-1;f{a[b]=d};c.v("version","3.5.1-sm"); +c.g={extend:(a,b)=>b?Object.assign(a,b):a,R:(a,b)=>a&&Object.entries(a).forEach(d=>b(d[0],d[1])),cb:a=>[...a.childNodes].forEach(b=>c.removeNode(b)),Mb:a=>{a=[...a];var b=(a[0]?.ownerDocument||M).createElement("div");a.forEach(d=>b.append(c.fa(d)));return b},ya:(a,b)=>Array.prototype.map.call(a,b?d=>c.fa(d.cloneNode(!0)):d=>d.cloneNode(!0)),ua:(a,b)=>{c.g.cb(a);b&&a.append(...b)},Ba:(a,b)=>{if(a.length){for(b=8===b.nodeType&&b.parentNode||b;a.length&&a[0].parentNode!==b;)a.splice(0,1);for(;1null==a?"":a.trim?a.trim():a.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g,""),bb:a=>a.ownerDocument.documentElement.contains(1!==a.nodeType?a.parentNode:a),Ub:(a,b)=>{if(!a?.nodeType)throw Error("element must be a DOM node when calling triggerEvent");a.dispatchEvent(new Event(b))},i:a=>c.T(a)?a():a,lb:(a,b)=>a.textContent=c.g.i(b)||""};c.v("utils", +c.g);c.v("unwrap",c.g.i);(()=>{let a=0,b="__ko__"+Date.now(),d=new WeakMap;c.g.j={get:(f,k)=>(d.get(f)||{})[k],set:(f,k,l)=>{d.has(f)?d.get(f)[k]=l:d.set(f,{[k]:l});return l},fb:function(f,k,l){return this.get(f,k)||this.set(f,k,l)},clear:f=>d.delete(f),Z:()=>a++ +b}})();c.g.L=(()=>{var a=c.g.j.Z(),b={1:1,8:1,9:1},d={1:1,9:1};const f=(e,g)=>{var h=c.g.j.get(e,a);g&&!h&&(h=new Set,c.g.j.set(e,a,h));return h},k=e=>{var g=f(e);g&&(new Set(g)).forEach(h=>h(e));c.g.j.clear(e);d[e.nodeType]&&l(e.childNodes, +!0)},l=(e,g)=>{for(var h=[],p,n=0;n{if("function"!=typeof g)throw Error("Callback must be a function");f(e,1).add(g)},kb:(e,g)=>{var h=f(e);h&&(h.delete(g),h.size||c.g.j.set(e,a,null))},fa:e=>{c.u.N(()=>{b[e.nodeType]&&(k(e),d[e.nodeType]&&l(e.getElementsByTagName("*")))});return e},removeNode:e=>{c.fa(e);e.parentNode&&e.parentNode.removeChild(e)}}})();c.fa=c.g.L.fa;c.removeNode= +c.g.L.removeNode;c.v("utils.domNodeDisposal",c.g.L);c.v("utils.domNodeDisposal.addDisposeCallback",c.g.L.ma);c.eb={debounce:(a,b)=>a.Ja(d=>fa(d,b)),rateLimit:(a,b)=>{if("number"==typeof b)var d=b;else{d=b.timeout;var f=b.method}var k="function"==typeof f?f:ea;a.Ja(l=>k(l,d,b))},notify:(a,b)=>{a.pa="always"==b?null:P}};var da={undefined:1,"boolean":1,number:1,string:1};c.v("extenders",c.eb);class ka{constructor(a,b,d){this.X=a;this.pb=b;this.Da=d;this.Ra=!1;this.M=this.ia=null;c.ha(this,"dispose", +this.A)}A(){this.Ra||(this.M&&c.g.L.kb(this.ia,this.M),this.Ra=!0,this.Da(),this.X=this.pb=this.Da=this.ia=this.M=null)}o(a){this.ia=a;c.g.L.ma(a,this.M=this.A.bind(this))}}c.V=function(){Object.setPrototypeOf(this,D);D.Fa(this)};var D={Fa:a=>{a.W=new Map;a.W.set("change",new Set);a.ub=1},subscribe:function(a,b,d){var f=this;d=d||"change";var k=new ka(f,b?a.bind(b):a,()=>{f.W.get(d).delete(k);f.Sa?.(d)});f.Ua?.(d);f.W.has(d)||f.W.set(d,new Set);f.W.get(d).add(k);return k},D:function(a,b){b=b||"change"; +"change"===b&&this.Na();if(this.ra(b)){b="change"===b&&this.Vb||new Set(this.W.get(b));try{c.u.zb(),b.forEach(d=>{d.Ra||d.pb(a)})}finally{c.u.end()}}},Ca:function(){return this.ub},hc:function(a){return this.Ca()!==a},Na:function(){++this.ub},Ja:function(a){var b=this,d=c.T(b),f,k,l,e,g;b.wa||(b.wa=b.D,b.D=(p,n)=>{n&&"change"!==n?"beforeChange"===n?b.rb(p):b.wa(p,n):b.sb(p)});var h=a(()=>{b.ja=!1;d&&e===b&&(e=b.qb?b.qb():b());var p=k||g&&b.Ha(l,e);g=k=f=!1;p&&b.wa(l=e)});b.sb=(p,n)=>{n&&b.ja||(g= +!n);b.Vb=new Set(b.W.get("change"));b.ja=f=!0;e=p;h()};b.rb=p=>{f||(l=p,b.wa(p,"beforeChange"))};b.tb=()=>{g=!0};b.Xb=()=>{b.Ha(l,b.J(!0))&&(k=!0)}},ra:function(a){return(this.W.get(a)||[]).size},Ha:function(a,b){return!this.pa||!this.pa(a,b)},toString:()=>"[object Object]",extend:function(a){var b=this;a&&c.g.R(a,(d,f)=>{d=c.eb[d];"function"==typeof d&&(b=d(b,f)||b)});return b}};c.ha(D,"init",D.Fa);c.ha(D,"subscribe",D.subscribe);c.ha(D,"extend",D.extend);c.V.fn=Object.setPrototypeOf(D,Function.prototype); +c.lc=a=>"function"==typeof a?.subscribe&&"function"==typeof a.D;(()=>{var a=[],b,d=0;c.u={zb:f=>{a.push(b);b=f},end:()=>b=a.pop(),Qb:f=>{if(b){if(!c.lc(f))throw Error("Only subscribable things can act as dependencies");b.Zb.call(b.$b,f,f.Wb||(f.Wb=++d))}},N:(f,k,l)=>{try{return a.push(b),b=void 0,f.apply(k,l||[])}finally{b=a.pop()}},qa:()=>b?.s.qa(),Ia:()=>b?.Ia,s:()=>b?.s}})();const B=Symbol("_latestValue");c.ba=a=>{function b(){if(0null==b[B]?void 0:b[B].length});c.V.fn.Fa(b);return Object.setPrototypeOf(b,F)};var F={toJSON:function(){let a=this[B];return a?.toJSON?.()||a},pa:P,J:function(){return this[B]},Oa:function(){this.D(this[B],"spectate");this.D(this[B])},ob:function(){this.D(this[B],"beforeChange")}};Object.setPrototypeOf(F,c.V.fn);var G=c.ba.qc="__ko_proto__";F[G]=c.ba;c.T=a=>{if((a="function"==typeof a&&a[G])&&a!==F[G]&& +a!==c.s.fn[G])throw Error("Invalid object that looks like an observable; possibly from another Knockout instance");return!!a};c.Kb=a=>"function"==typeof a&&(a[G]===F[G]||a[G]===c.s.fn[G]&&a.ic);c.v("observable",c.ba);c.v("isObservable",c.T);c.v("observable.fn",F);c.ha(F,"valueHasMutated",F.Oa);c.ta=a=>{a=a||[];if("object"!=typeof a||!("length"in a))throw Error("The argument passed when initializing an observable array must be an array, or null, or undefined.");return Object.setPrototypeOf(c.ba(a), +c.ta.fn).extend({trackArrayChanges:!0})};c.ta.fn=Object.setPrototypeOf({remove:function(a){for(var b=this.J(),d=!1,f="function"!=typeof a||c.T(a)?e=>e===a:a,k=b.length;k--;){var l=b[k];if(f(l)){if(b[k]!==l)throw Error("Array modified during remove; cannot remove item");d||this.ob();d=!0;b.splice(k,1)}}d&&this.Oa()}},c.ba.fn);Object.getOwnPropertyNames(Array.prototype).forEach(a=>{"function"===typeof Array.prototype[a]&&"constructor"!=a&&("copyWithin fill pop push reverse shift sort splice unshift".split(" ").includes(a)? +c.ta.fn[a]=function(...b){var d=this.J();this.ob();this.Bb(d,a,b);b=d[a](...b);this.Oa();return b===d?this:b}:c.ta.fn[a]=function(...b){return this()[a](...b)})});c.Jb=a=>c.T(a)&&"function"==typeof a.remove&&"function"==typeof a.push;c.v("observableArray",c.ta);c.v("isObservableArray",c.Jb);c.eb.trackArrayChanges=(a,b)=>{function d(){function m(){if(g){var r=[].concat(a.J()||[]);if(a.ra("arrayChange")){if(!k||1++g,null,"spectate"),h=[].concat(a.J()||[]),k=null,l=a.subscribe(m))}a.Wa={};"object"==typeof b&&c.g.extend(a.Wa,b);a.Wa.sparse=!0;if(!a.Bb){var f=!1,k=null,l,e,g=0,h,p=a.Ua,n=a.Sa;a.Ua=m=>{p?.call(a,m);"arrayChange"===m&&d()};a.Sa=m=>{n?.call(a,m);"arrayChange"!==m||a.ra("arrayChange")||(l?.A(),e?.A(),e=l=null,f=!1,h=void 0)};a.Bb=(m,r,q)=>{function t(A,x,I){return u[u.length]={status:A,value:x,index:I}}if(f&&!g){var u=[],v=m.length,w=q.length,z=0;switch(r){case "push":z=v;case "unshift":for(m= +0;mq[0]?v+q[0]:q[0]),v);v=1===w?v:Math.min(z+(q[1]||0),v);w=z+w-2;r=Math.max(v,w);for(var C=[],H=[],O=2;z{function d(){if(0{d.A()});return d};var J={pa:P,qa:function(){return this[y].K},ec:function(){var a=[];c.g.R(this[y].B,(b,d)=>a[d.ka]=d.X);return a},gb:function(a){if(!this[y].K)return!1;var b=this.ec();return b.includes(a)||!!b.find(d=>d.gb&&d.gb(a))},vb:function(a,b,d){if(this[y].jb&&b===this)throw Error("A 'pure' computed must not be called recursively");this[y].B[a]=d;d.ka=this[y].K++;d.la=b.Ca()},sa:function(){var a, +b=this[y].B;for(a in b)if(Object.prototype.hasOwnProperty.call(b,a)){var d=b[a];if(this.va&&d.X.ja||d.X.hc(d.la))return!0}},vc:function(){this[y].Ga||this.va?.(!1)},isActive:function(){var a=this[y];return a.Y||0a.U(!0),b)):a.va?a.va(!0):a.U(!0)},U:function(a){var b=this[y],d=b.na, +f=!1;if(!b.Ga&&!b.$){if(b.o&&!c.g.bb(b.o)||d?.()){if(!b.nb){this.A();return}}else b.nb=!1;try{b.Ga=!0,f=this.cc(a)}finally{b.Ga=!1}return f}},cc:function(a){var b=this[y],d=b.jb?void 0:!b.K;var f={ac:this,za:b.B,Za:b.K};c.u.zb({$b:f,Zb:ia,s:this,Ia:d});b.B={};b.K=0;a:{try{var k=b.Pb();break a}finally{c.u.end(),f.Za&&!b.C&&c.g.R(f.za,ha),b.aa=b.Y=!1}k=void 0}b.K?f=this.Ha(b.O,k):(this.A(),f=!0);f&&(b.C?this.Na():this.D(b.O,"beforeChange"),b.O=k,this.D(b.O,"spectate"),!b.C&&a&&this.D(b.O),this.tb&& +this.tb());d&&this.D(b.O,"awake");return f},J:function(a){var b=this[y];(b.Y&&(a||!b.K)||b.C&&this.sa())&&this.U();return b.O},Ja:function(a){var b=this;c.V.fn.Ja.call(b,a);b.qb=()=>{b[y].C||(b[y].aa?b.U():b[y].Y=!1);return b[y].O};b.va=d=>{b.rb(b[y].O);b[y].Y=!0;d&&(b[y].aa=!0);b.sb(b,!d)}},A:function(){var a=this[y];!a.C&&a.B&&c.g.R(a.B,(b,d)=>d.A?.());a.o&&a.ab&&c.g.L.kb(a.o,a.ab);a.B=void 0;a.K=0;a.$=!0;a.aa=!1;a.Y=!1;a.C=!1;a.o=void 0;a.na=void 0;a.Pb=void 0}},la={Ua:function(a){var b=this,d= +b[y];if(!d.$&&d.C&&"change"==a){d.C=!1;if(d.aa||b.sa())d.B=null,d.K=0,b.U()&&b.Na();else{var f=[];c.g.R(d.B,(k,l)=>f[l.ka]=k);f.forEach((k,l)=>{var e=d.B[k],g=b.Tb(e.X);g.ka=l;g.la=e.la;d.B[k]=g});b.sa()&&b.U()&&b.Na()}d.$||b.D(d.O,"awake")}},Sa:function(a){var b=this[y];b.$||"change"!=a||this.ra("change")||(c.g.R(b.B,(d,f)=>{f.A&&(b.B[d]={X:f.X,ka:f.ka,la:f.la},f.A())}),b.C=!0,this.D(void 0,"asleep"))},Ca:function(){var a=this[y];a.C&&(a.aa||this.sa())&&this.U();return c.V.fn.Ca.call(this)}};Object.setPrototypeOf(J, +c.V.fn);var S=c.ba.qc;J[S]=c.s;c.v("computed",c.s);c.v("isComputed",a=>"function"==typeof a&&a[S]===J[S]);c.v("computed.fn",J);c.ha(J,"dispose",J.A);c.Ob=a=>{if("function"===typeof a)return c.s(a,{pure:!0});a={...a,pure:!0};return c.s(a)};c.F={S:a=>{switch(a.nodeName){case "OPTION":return!0===a.__ko__hasDomDataOptionValue__?c.g.j.get(a,c.h.options.ib):a.value;case "SELECT":return 0<=a.selectedIndex?c.F.S(a.options[a.selectedIndex]):void 0;default:return a.value}},Pa:(a,b,d)=>{switch(a.nodeName){case "OPTION":"string"=== typeof b?(c.g.j.set(a,c.h.options.ib,void 0),delete a.__ko__hasDomDataOptionValue__,a.value=b):(c.g.j.set(a,c.h.options.ib,b),a.__ko__hasDomDataOptionValue__=!0,a.value="number"===typeof b?b:"");break;case "SELECT":for(var f=-1,k=""===b||null==b,l=a.options.length,e;l--;)if(e=c.F.S(a.options[l]),e==b||""===e&&k){f=l;break}if(d||0<=f||k&&1{var a=["true","false","null","undefined"],b=/^(?:[$_a-z][$\w]*|(.+)(\.\s*[$_a-z][$\w]*|\[.+\]))$/i, -d=RegExp("\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*'|`(?:\\\\.|[^`])*`|/\\*(?:[^*]|\\*+[^*/])*\\*+/|//.*\n|/(?:\\\\.|[^/])+/w*|[^\\s:,/][^,\"'`{}()/:[\\]]*[^\\s,\"'`{}()/:[\\]]|[^\\s]","g"),f=/[\])"'A-Za-z0-9_$]+$/,k={"in":1,"return":1,"typeof":1},l=g=>{g=c.g.Rb(g);123===g.charCodeAt(0)&&(g=g.slice(1,-1));g+="\n,";var h=[],n=g.match(d),p=[],m=0;if(1=m){h.push(u&&p.length?{key:u,value:p.join("")}:{unknown:u||p.join("")});var u=m= -0;p=[];continue}}else if(58===t){if(!m&&!u&&1===p.length){u=p.pop();continue}}else if(47===t&&1 -{var n=[],p=[],m=h?.valueAccessors,r=h?.bindingParams,q=(t,u)=>{if(!r){var w=c.h[t];if(w?.preprocess&&!(u=w.preprocess(u,t,q)))return;if(w=e.has(t)){var v=u;a.includes(v)?v=!1:(w=v.match(b),v=null===w?!1:w[1]?"Object("+w[1]+")"+w[2]:v);w=v}w&&p.push("'"+t+"':function(_z){"+v+"=_z}")}m&&(u="function(){return "+u+" }");n.push("'"+t+"':"+u)};("string"===typeof g?l(g):g).forEach(t=>q(t.key||t.unknown,t.value));p.length&&q("_ko_property_writers","{"+p.join(",")+" }");return n.join(",")},mc:(g,h)=>-1 -n.key==h),Qa:(g,h,n,p,m)=>{if(g&&c.T(g))!c.lc(g)||m&&g.R()===p||g(p);else h.get("_ko_property_writers")?.[n]?.(p)}}})();(()=>{function a(e){return 8==e.nodeType&&f.test(e.nodeValue)}function b(e){return 8==e.nodeType&&k.test(e.nodeValue)}function d(e,g){for(var h=e,n=1,p=[];h=h.nextSibling;){if(b(h)&&(c.g.j.set(h,l,!0),!--n))return p;p.push(h);a(h)&&++n}if(!g)throw Error("Cannot find closing comment tag to match: "+e.nodeValue);return null}var f=/^\s*ko(?:\s+([\s\S]+))?\s*$/,k=/^\s*\/ko\s*$/,l="__ko_matchedEndComment__"; -c.m={ca:{},childNodes:e=>a(e)?d(e):e.childNodes,oa:e=>{a(e)?(e=d(e))&&[...e].forEach(g=>c.removeNode(g)):c.g.cb(e)},ua:(e,g)=>{a(e)?(c.m.oa(e),e.after(...g)):c.g.ua(e,g)},prepend:(e,g)=>{a(e)?e.nextSibling.before(g):e.prepend(g)},jc:(e,g,h)=>{h?h.after(g):c.m.prepend(e,g)},firstChild:e=>{if(a(e))return e=e.nextSibling,!e||b(e)?null:e;let g=e.firstChild;if(g&&b(g))throw Error("Found invalid end comment, as the first child of "+e);return g},nextSibling:e=>{if(a(e)){var g=d(e,void 0);e=g?(g.length?g[g.length- -1]:e).nextSibling:null}if((g=e.nextSibling)&&b(g)){if(b(g)&&!c.g.j.get(g,l))throw Error("Found end comment without a matching opening comment, as child of "+e);return null}return g},ec:a,uc:e=>(e=e.nodeValue.match(f))?e[1]:null}})();const ba=new Map;c.Ab=new class{nc(a){switch(a.nodeType){case 1:return null!=a.getAttribute("data-bind");case 8:return c.m.ec(a)}return!1}cc(a,b){a:{switch(a.nodeType){case 1:var d=a.getAttribute("data-bind");break a;case 8:d=c.m.uc(a);break a}d=null}if(d)try{let k={valueAccessors:!0}, -l=ba.get(d);if(!l){var f="with($context){with($data||{}){return{"+c.G.pc(d,k)+"}}}";l=new Function("$context","$element",f);ba.set(d,l)}return l(b,a)}catch(k){throw k.message="Unable to parse bindings.\nBindings value: "+d+"\nMessage: "+k.message,k;}return null}};const L=Symbol("_subscribable"),N=Symbol("_ancestorBindingInfo"),aa=Symbol("_dataDependency"),ca={},K=c.g.j.Z();c.h={};c.ea=class{constructor(a,b,d,f,k){var l=this,e=a===ca,g=e?void 0:a,h="function"==typeof g&&!c.T(g),n=k?.dataDependency; -a=()=>{var m=h?g():g,r=c.g.i(m);b?(c.g.extend(l,b),N in b&&(l[N]=b[N])):(l.$parents=[],l.$root=r,l.ko=c);l[L]=p;e?r=l.$data:(l.$rawData=m,l.$data=r);d&&(l[d]=r);f?.(l,b,r);if(b?.[L]&&!c.o.u().gb(b[L]))b[L]();n&&(l[aa]=n);return l.$data};if(k?.exportDependencies)a();else{var p=c.Nb(a);p.R();p.isActive()?p.pa=null:l[L]=void 0}}createChildContext(a,b,d,f){!f&&b&&"object"==typeof b&&(f=b,b=f.as,d=f.extend);return new c.ea(a,this,b,(k,l)=>{k.$parentContext=l;k.$parent=l.$data;k.$parents=(l.$parents||[]).slice(0); -k.$parents.unshift(k.$parent);d&&d(k)},f)}extend(a,b){return new c.ea(ca,this,null,d=>c.g.extend(d,"function"==typeof a?a(d):a),b)}};class ma{constructor(a,b,d){this.L=a;this.ia=b;this.xa=new Set;this.H=!1;b.I||c.g.K.ma(a,W);d?.I&&(d.I.xa.add(a),this.Da=d)}Mb(){this.Da?.I?.ac(this.L)}ac(a){this.xa.delete(a);this.xa.size||this.Db?.()}Db(){this.H=!0;this.ia.I&&!this.xa.size&&(this.ia.I=null,c.g.K.kb(this.L,W),c.l.notify(this.L,c.l.ga),this.Mb())}}c.l={H:"childrenComplete",ga:"descendantsComplete",subscribe:(a, -b,d,f,k)=>{var l=c.g.j.fb(a,K,{});l.Aa||(l.Aa=new c.V);k?.notifyImmediately&&l.hb[b]&&c.o.M(d,f,[a]);return l.Aa.subscribe(d,f,b)},notify:(a,b)=>{var d=c.g.j.get(a,K);if(d&&(d.hb[b]=!0,d.Aa?.D(a,b),b==c.l.H))if(d.I)d.I.Db();else if(void 0===d.I&&d.Aa?.ra(c.l.ga))throw Error("descendantsComplete event not supported for bindings on this node");},mb:(a,b)=>{var d=c.g.j.fb(a,K,{});d.I||(d.I=new ma(a,d,b[N]));return b[N]==d?b:b.extend(f=>{f[N]=d})}};c.tc=a=>(a=c.g.j.get(a,K))&&a.context;c.wb=(a,b,d)=> +d=RegExp("\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*'|`(?:\\\\.|[^`])*`|/\\*(?:[^*]|\\*+[^*/])*\\*+/|//.*\n|/(?:\\\\.|[^/])+/w*|[^\\s:,/][^,\"'`{}()/:[\\]]*[^\\s,\"'`{}()/:[\\]]|[^\\s]","g"),f=/[\])"'A-Za-z0-9_$]+$/,k={"in":1,"return":1,"typeof":1},l=g=>{g=c.g.Sb(g);123===g.charCodeAt(0)&&(g=g.slice(1,-1));g+="\n,";var h=[],p=g.match(d),n=[],m=0;if(1=m){h.push(u&&n.length?{key:u,value:n.join("")}:{unknown:u||n.join("")});var u=m= +0;n=[];continue}}else if(58===t){if(!m&&!u&&1===n.length){u=n.pop();continue}}else if(47===t&&1 +{var p=[],n=[],m=h?.valueAccessors,r=h?.bindingParams,q=(t,u)=>{if(!r){var v=c.h[t];if(v?.preprocess&&!(u=v.preprocess(u,t,q)))return;if(v=e.has(t)){var w=u;a.includes(w)?w=!1:(v=w.match(b),w=null===v?!1:v[1]?"Object("+v[1]+")"+v[2]:w);v=w}v&&n.push("'"+t+"':function(_z){"+w+"=_z}")}m&&(u="function(){return "+u+" }");p.push("'"+t+"':"+u)};("string"===typeof g?l(g):g).forEach(t=>q(t.key||t.unknown,t.value));n.length&&q("_ko_property_writers","{"+n.join(",")+" }");return p.join(",")},mc:(g,h)=>-1 +p.key==h),Qa:(g,h,p,n,m)=>{if(g&&c.T(g))!c.Kb(g)||m&&g.J()===n||g(n);else h.get("_ko_property_writers")?.[p]?.(n)}}})();(()=>{function a(e){return 8==e.nodeType&&f.test(e.nodeValue)}function b(e){return 8==e.nodeType&&k.test(e.nodeValue)}function d(e,g){for(var h=e,p=1,n=[];h=h.nextSibling;){if(b(h)&&(c.g.j.set(h,l,!0),!--p))return n;n.push(h);a(h)&&++p}if(!g)throw Error("Cannot find closing comment tag to match: "+e.nodeValue);return null}var f=/^\s*ko(?:\s+([\s\S]+))?\s*$/,k=/^\s*\/ko\s*$/,l="__ko_matchedEndComment__"; +c.m={ca:{},childNodes:e=>a(e)?d(e):e.childNodes,oa:e=>{a(e)?(e=d(e))&&[...e].forEach(g=>c.removeNode(g)):c.g.cb(e)},ua:(e,g)=>{a(e)?(c.m.oa(e),e.after(...g)):c.g.ua(e,g)},prepend:(e,g)=>{a(e)?e.nextSibling.before(g):e.prepend(g)},kc:(e,g,h)=>{h?h.after(g):c.m.prepend(e,g)},firstChild:e=>{if(a(e))return e=e.nextSibling,!e||b(e)?null:e;let g=e.firstChild;if(g&&b(g))throw Error("Found invalid end comment, as the first child of "+e);return g},nextSibling:e=>{if(a(e)){var g=d(e,void 0);e=g?(g.length?g[g.length- +1]:e).nextSibling:null}if((g=e.nextSibling)&&b(g)){if(b(g)&&!c.g.j.get(g,l))throw Error("Found end comment without a matching opening comment, as child of "+e);return null}return g},fc:a,uc:e=>(e=e.nodeValue.match(f))?e[1]:null}})();const ba=new Map;c.Ab=new class{nc(a){switch(a.nodeType){case 1:return null!=a.getAttribute("data-bind");case 8:return c.m.fc(a)}return!1}dc(a,b){a:{switch(a.nodeType){case 1:var d=a.getAttribute("data-bind");break a;case 8:d=c.m.uc(a);break a}d=null}if(d)try{let k={valueAccessors:!0}, +l=ba.get(d);if(!l){var f="with($context){with($data||{}){return{"+c.G.pc(d,k)+"}}}";l=new Function("$context","$element",f);ba.set(d,l)}return l(b,a)}catch(k){throw k.message="Unable to parse bindings.\nBindings value: "+d+"\nMessage: "+k.message,k;}return null}};const L=Symbol("_subscribable"),N=Symbol("_ancestorBindingInfo"),aa=Symbol("_dataDependency"),ca={},K=c.g.j.Z();c.h={};c.ea=class{constructor(a,b,d,f,k){var l=this,e=a===ca,g=e?void 0:a,h="function"==typeof g&&!c.T(g),p=k?.dataDependency; +a=()=>{var m=h?g():g,r=c.g.i(m);b?(c.g.extend(l,b),N in b&&(l[N]=b[N])):(l.$parents=[],l.$root=r,l.ko=c);l[L]=n;e?r=l.$data:(l.$rawData=m,l.$data=r);d&&(l[d]=r);f?.(l,b,r);if(b?.[L]&&!c.u.s().gb(b[L]))b[L]();p&&(l[aa]=p);return l.$data};if(k?.exportDependencies)a();else{var n=c.Ob(a);n.J();n.isActive()?n.pa=null:l[L]=void 0}}createChildContext(a,b,d,f){!f&&b&&"object"==typeof b&&(f=b,b=f.as,d=f.extend);return new c.ea(a,this,b,(k,l)=>{k.$parentContext=l;k.$parent=l.$data;k.$parents=(l.$parents||[]).slice(0); +k.$parents.unshift(k.$parent);d&&d(k)},f)}extend(a,b){return new c.ea(ca,this,null,d=>c.g.extend(d,"function"==typeof a?a(d):a),b)}};class ma{constructor(a,b,d){this.M=a;this.ia=b;this.xa=new Set;this.H=!1;b.I||c.g.L.ma(a,W);d?.I&&(d.I.xa.add(a),this.Da=d)}Nb(){this.Da?.I?.bc(this.M)}bc(a){this.xa.delete(a);this.xa.size||this.Db?.()}Db(){this.H=!0;this.ia.I&&!this.xa.size&&(this.ia.I=null,c.g.L.kb(this.M,W),c.l.notify(this.M,c.l.ga),this.Nb())}}c.l={H:"childrenComplete",ga:"descendantsComplete",subscribe:(a, +b,d,f,k)=>{var l=c.g.j.fb(a,K,{});l.Aa||(l.Aa=new c.V);k?.notifyImmediately&&l.hb[b]&&c.u.N(d,f,[a]);return l.Aa.subscribe(d,f,b)},notify:(a,b)=>{var d=c.g.j.get(a,K);if(d&&(d.hb[b]=!0,d.Aa?.D(a,b),b==c.l.H))if(d.I)d.I.Db();else if(void 0===d.I&&d.Aa?.ra(c.l.ga))throw Error("descendantsComplete event not supported for bindings on this node");},mb:(a,b)=>{var d=c.g.j.fb(a,K,{});d.I||(d.I=new ma(a,d,b[N]));return b[N]==d?b:b.extend(f=>{f[N]=d})}};c.tc=a=>(a=c.g.j.get(a,K))&&a.context;c.wb=(a,b,d)=> Z(a,b,Q(d));c.yb=(a,b)=>{1!==b.nodeType&&8!==b.nodeType||X(Q(a),b)};c.xb=function(a,b,d){if(2>arguments.length){if(b=M.body,!b)throw Error("ko.applyBindings: could not find document.body; has the document been loaded?");}else if(!b||1!==b.nodeType&&8!==b.nodeType)throw Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");Y(Q(a,d),b)};c.Eb=a=>(a=a&&[1,8].includes(a.nodeType)&&c.tc(a))?a.$data:void 0;c.v("bindingHandlers",c.h);c.v("applyBindings", -c.xb);c.v("applyBindingAccessorsToNode",c.wb);c.v("dataFor",c.Eb);(()=>{var a=Object.create(null),b=new Map;c.Xa={get:(l,e)=>{if(b.has(l))e(b.get(l));else{var g=a[l];g?g.subscribe(e):(g=a[l]=new c.V,g.subscribe(e),k(l,h=>{b.set(l,h);delete a[l];g.D(h)}))}},register:(l,e)=>{if(!e)throw Error("Invalid configuration for "+l);if(d[l])throw Error("Component "+l+" is already registered");d[l]=e}};var d=Object.create(null),f=(l,e)=>{throw Error(`Component '${l}': ${e}`);},k=(l,e)=>{var g={},h=d[l]||{},n= -h.template;h=h.viewModel;if(n){n.element||f(l,"Unknown template value: "+n);n=n.element;var p=M.getElementById(n);p||f(l,"Cannot find element with ID "+n);p.matches("TEMPLATE")||f(l,"Template Source Element not a