(function(){/*

 Copyright The Closure Library Authors.
 SPDX-License-Identifier: Apache-2.0
*/
var n;function aa(a){var b=0;return function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}}}function ba(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");}var ca=ba(this);
function ea(a){var b="undefined"!=typeof Symbol&&Symbol.iterator&&a[Symbol.iterator];if(b)return b.call(a);if("number"==typeof a.length)return{next:aa(a)};throw Error(String(a)+" is not an iterable or ArrayLike");}function w(a){if(!(a instanceof Array)){a=ea(a);for(var b,c=[];!(b=a.next()).done;)c.push(b.value);a=c}return a}function A(){for(var a=Number(this),b=[],c=a;c<arguments.length;c++)b[c-a]=arguments[c];return b};/*

 Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
 This code may only be used under the BSD style license found at
 http://polymer.github.io/LICENSE.txt The complete set of authors may be found
 at http://polymer.github.io/AUTHORS.txt The complete set of contributors may
 be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by
 Google as part of the polymer project is also subject to an additional IP
 rights grant found at http://polymer.github.io/PATENTS.txt
*/
Array.from||(Array.from=function(a){return[].slice.call(a)});Object.assign||(Object.assign=function(a){for(var b=[].slice.call(arguments,1),c=0,d;c<b.length;c++)if(d=b[c])for(var e=a,f=Object.keys(d),g=0;g<f.length;g++){var h=f[g];e[h]=d[h]}return a});/*


 Copyright (c) 2014 Taylor Hakes
 Copyright (c) 2014 Forbes Lindesay

 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
 in the Software without restriction, including without limitation the rights
 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:

 The above copyright notice and this permission notice shall be included in
 all copies or substantial portions of the Software.

 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
*/
var fa=setTimeout;function ia(){}function ka(a,b){return function(){a.apply(b,arguments)}}function B(a){if(!(this instanceof B))throw new TypeError("Promises must be constructed via new");if("function"!==typeof a)throw new TypeError("not a function");this.C=0;this.Ya=!1;this.s=void 0;this.V=[];la(a,this)}
function qa(a,b){for(;3===a.C;)a=a.s;0===a.C?a.V.push(b):(a.Ya=!0,ra(function(){var c=1===a.C?b.Nc:b.Oc;if(null===c)(1===a.C?sa:ta)(b.promise,a.s);else{try{var d=c(a.s)}catch(e){ta(b.promise,e);return}sa(b.promise,d)}}))}
function sa(a,b){try{if(b===a)throw new TypeError("A promise cannot be resolved with itself.");if(b&&("object"===typeof b||"function"===typeof b)){var c=b.then;if(b instanceof B){a.C=3;a.s=b;ua(a);return}if("function"===typeof c){la(ka(c,b),a);return}}a.C=1;a.s=b;ua(a)}catch(d){ta(a,d)}}function ta(a,b){a.C=2;a.s=b;ua(a)}
function ua(a){2===a.C&&0===a.V.length&&ra(function(){a.Ya||"undefined"!==typeof console&&console&&console.warn("Possible Unhandled Promise Rejection:",a.s)});for(var b=0,c=a.V.length;b<c;b++)qa(a,a.V[b]);a.V=null}function va(a,b,c){this.Nc="function"===typeof a?a:null;this.Oc="function"===typeof b?b:null;this.promise=c}function la(a,b){var c=!1;try{a(function(d){c||(c=!0,sa(b,d))},function(d){c||(c=!0,ta(b,d))})}catch(d){c||(c=!0,ta(b,d))}}B.prototype["catch"]=function(a){return this.then(null,a)};
B.prototype.then=function(a,b){var c=new this.constructor(ia);qa(this,new va(a,b,c));return c};B.prototype["finally"]=function(a){var b=this.constructor;return this.then(function(c){return b.resolve(a()).then(function(){return c})},function(c){return b.resolve(a()).then(function(){return b.reject(c)})})};
function wa(a){return new B(function(b,c){function d(h,k){try{if(k&&("object"===typeof k||"function"===typeof k)){var l=k.then;if("function"===typeof l){l.call(k,function(p){d(h,p)},c);return}}e[h]=k;0===--f&&b(e)}catch(p){c(p)}}if(!a||"undefined"===typeof a.length)throw new TypeError("Promise.all accepts an array");var e=Array.prototype.slice.call(a);if(0===e.length)return b([]);for(var f=e.length,g=0;g<e.length;g++)d(g,e[g])})}
function xa(a){return a&&"object"===typeof a&&a.constructor===B?a:new B(function(b){b(a)})}function Aa(a){return new B(function(b,c){c(a)})}function Ba(a){return new B(function(b,c){for(var d=0,e=a.length;d<e;d++)a[d].then(b,c)})}var ra="function"===typeof setImmediate&&function(a){setImmediate(a)}||function(a){fa(a,0)};/*

Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at
http://polymer.github.io/LICENSE.txt The complete set of authors may be found at
http://polymer.github.io/AUTHORS.txt The complete set of contributors may be
found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as
part of the polymer project is also subject to an additional IP rights grant
found at http://polymer.github.io/PATENTS.txt
*/
if(!window.Promise){window.Promise=B;B.prototype.then=B.prototype.then;B.all=wa;B.race=Ba;B.resolve=xa;B.reject=Aa;var Ca=document.createTextNode(""),Da=[];(new MutationObserver(function(){for(var a=Da.length,b=0;b<a;b++)Da[b]();Da.splice(0,a)})).observe(Ca,{characterData:!0});ra=function(a){Da.push(a);Ca.textContent=0<Ca.textContent.length?"":"a"}};var Ea=document.createEvent("Event");Ea.initEvent("foo",!0,!0);Ea.preventDefault();if(!Ea.defaultPrevented){var Fa=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(Fa.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var Ga=/Trident/.test(navigator.userAgent);
if(!window.Event||Ga&&"function"!==typeof window.Event){var Ha=window.Event;window.Event=function(a,b){b=b||{};var c=document.createEvent("Event");c.initEvent(a,!!b.bubbles,!!b.cancelable);return c};if(Ha){for(var Ia in Ha)window.Event[Ia]=Ha[Ia];window.Event.prototype=Ha.prototype}}
if(!window.CustomEvent||Ga&&"function"!==typeof window.CustomEvent)window.CustomEvent=function(a,b){b=b||{};var c=document.createEvent("CustomEvent");c.initCustomEvent(a,!!b.bubbles,!!b.cancelable,b.detail);return c},window.CustomEvent.prototype=window.Event.prototype;
if(!window.MouseEvent||Ga&&"function"!==typeof window.MouseEvent){var Ja=window.MouseEvent;window.MouseEvent=function(a,b){b=b||{};var c=document.createEvent("MouseEvent");c.initMouseEvent(a,!!b.bubbles,!!b.cancelable,b.view||window,b.detail,b.screenX,b.screenY,b.clientX,b.clientY,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b.button,b.relatedTarget);return c};if(Ja)for(var Ka in Ja)window.MouseEvent[Ka]=Ja[Ka];window.MouseEvent.prototype=Ja.prototype};var La=function(){function a(){e++}var b=!1,c=!1,d={get capture(){return b=!0},get once(){return c=!0}},e=0,f=document.createElement("div");f.addEventListener("click",a,d);var g=b&&c;g&&(f.dispatchEvent(new Event("click")),f.dispatchEvent(new Event("click")),g=1==e);f.removeEventListener("click",a,d);return g}(),Ma,Na=null!=(Ma=window.EventTarget)?Ma:window.Node;
if(!La&&"addEventListener"in Na.prototype){var Oa=function(a){if(!a||"object"!==typeof a&&"function"!==typeof a){var b=!!a;a=!1}else b=!!a.capture,a=!!a.once;return{capture:b,once:a}},Pa=Na.prototype.addEventListener,Qa=Na.prototype.removeEventListener,Ta=new WeakMap,Ua=new WeakMap,Va=function(a,b,c){var d=c?Ta:Ua;c=d.get(a);void 0===c&&d.set(a,c=new Map);a=c.get(b);void 0===a&&c.set(b,a=new WeakMap);return a};Na.prototype.addEventListener=function(a,b,c){var d=this;if(null!=b){c=Oa(c);var e=c.capture;
c=c.once;var f=Va(this,a,e);if(!f.has(b)){var g=c?function(k){f.delete(b);Qa.call(d,a,g,e);if("function"===typeof b)return b.call(d,k);if("function"===typeof(null==b?void 0:b.handleEvent))return b.handleEvent(k)}:null;f.set(b,g);var h;Pa.call(this,a,null!=(h=g)?h:b,e)}}};Na.prototype.removeEventListener=function(a,b,c){if(null!=b){c=Oa(c).capture;var d=Va(this,a,c),e=d.get(b);void 0!==e&&(d.delete(b),Qa.call(this,a,null!=e?e:b,c))}}};/*

Copyright (c) 2020 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at
http://polymer.github.io/LICENSE.txt The complete set of authors may be found at
http://polymer.github.io/AUTHORS.txt The complete set of contributors may be
found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as
part of the polymer project is also subject to an additional IP rights grant
found at http://polymer.github.io/PATENTS.txt
*/
var Wa=Element.prototype,Xa,Ya,Za,$a=null!=(Za=null==(Ya=null!=(Xa=Object.getOwnPropertyDescriptor(Wa,"attributes"))?Xa:Object.getOwnPropertyDescriptor(Node.prototype,"attributes"))?void 0:Ya.get)?Za:function(){return this.attributes},ab=Array.prototype.map;Wa.hasOwnProperty("getAttributeNames")||(Wa.getAttributeNames=function(){return ab.call($a.call(this),function(a){return a.name})});var bb=Element.prototype;if(!bb.hasOwnProperty("matches")){var cb;bb.matches=null!=(cb=bb.webkitMatchesSelector)?cb:bb.msMatchesSelector};/*

Copyright (c) 2020 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
var db=Node.prototype.appendChild;function eb(a){a=a.prototype;a.hasOwnProperty("append")||Object.defineProperty(a,"append",{configurable:!0,enumerable:!0,writable:!0,value:function(){for(var b=ea(A.apply(0,arguments)),c=b.next();!c.done;c=b.next())c=c.value,db.call(this,"string"===typeof c?document.createTextNode(c):c)}})}eb(Document);eb(DocumentFragment);eb(Element);var fb=Node.prototype.insertBefore,gb,jb,kb=null!=(jb=null==(gb=Object.getOwnPropertyDescriptor(Node.prototype,"firstChild"))?void 0:gb.get)?jb:function(){return this.firstChild};function lb(a){a=a.prototype;a.hasOwnProperty("prepend")||Object.defineProperty(a,"prepend",{configurable:!0,enumerable:!0,writable:!0,value:function(){var b=A.apply(0,arguments),c=kb.call(this);b=ea(b);for(var d=b.next();!d.done;d=b.next())d=d.value,fb.call(this,"string"===typeof d?document.createTextNode(d):d,c)}})}lb(Document);
lb(DocumentFragment);lb(Element);var mb=Node.prototype.appendChild,nb=Node.prototype.removeChild,ob,pb,qb=null!=(pb=null==(ob=Object.getOwnPropertyDescriptor(Node.prototype,"firstChild"))?void 0:ob.get)?pb:function(){return this.firstChild};
function rb(a){a=a.prototype;a.hasOwnProperty("replaceChildren")||Object.defineProperty(a,"replaceChildren",{configurable:!0,enumerable:!0,writable:!0,value:function(){for(var b=A.apply(0,arguments),c;null!==(c=qb.call(this));)nb.call(this,c);b=ea(b);for(c=b.next();!c.done;c=b.next())c=c.value,mb.call(this,"string"===typeof c?document.createTextNode(c):c)}})}rb(Document);rb(DocumentFragment);rb(Element);var sb=Node.prototype.insertBefore,tb,ub,vb=null!=(ub=null==(tb=Object.getOwnPropertyDescriptor(Node.prototype,"parentNode"))?void 0:tb.get)?ub:function(){return this.parentNode},wb,xb,yb=null!=(xb=null==(wb=Object.getOwnPropertyDescriptor(Node.prototype,"nextSibling"))?void 0:wb.get)?xb:function(){return this.nextSibling};
function zb(a){a=a.prototype;a.hasOwnProperty("after")||Object.defineProperty(a,"after",{configurable:!0,enumerable:!0,writable:!0,value:function(){var b=A.apply(0,arguments),c=vb.call(this);if(null!==c){var d=yb.call(this);b=ea(b);for(var e=b.next();!e.done;e=b.next())e=e.value,sb.call(c,"string"===typeof e?document.createTextNode(e):e,d)}}})}zb(CharacterData);zb(Element);var Ab=Node.prototype.insertBefore,Bb,Cb,Db=null!=(Cb=null==(Bb=Object.getOwnPropertyDescriptor(Node.prototype,"parentNode"))?void 0:Bb.get)?Cb:function(){return this.parentNode};
function Eb(a){a=a.prototype;a.hasOwnProperty("before")||Object.defineProperty(a,"before",{configurable:!0,enumerable:!0,writable:!0,value:function(){var b=A.apply(0,arguments),c=Db.call(this);if(null!==c){b=ea(b);for(var d=b.next();!d.done;d=b.next())d=d.value,Ab.call(c,"string"===typeof d?document.createTextNode(d):d,this)}}})}Eb(CharacterData);Eb(Element);var Fb=Node.prototype.removeChild,Gb,Hb,Ib=null!=(Hb=null==(Gb=Object.getOwnPropertyDescriptor(Node.prototype,"parentNode"))?void 0:Gb.get)?Hb:function(){return this.parentNode};function Jb(a){a=a.prototype;a.hasOwnProperty("remove")||Object.defineProperty(a,"remove",{configurable:!0,enumerable:!0,writable:!0,value:function(){var b=Ib.call(this);b&&Fb.call(b,this)}})}Jb(CharacterData);Jb(Element);var Kb=Node.prototype.insertBefore,Lb=Node.prototype.removeChild,Mb,Nb,Ob=null!=(Nb=null==(Mb=Object.getOwnPropertyDescriptor(Node.prototype,"parentNode"))?void 0:Mb.get)?Nb:function(){return this.parentNode};
function Pb(a){a=a.prototype;a.hasOwnProperty("replaceWith")||Object.defineProperty(a,"replaceWith",{configurable:!0,enumerable:!0,writable:!0,value:function(){var b=A.apply(0,arguments),c=Ob.call(this);if(null!==c){b=ea(b);for(var d=b.next();!d.done;d=b.next())d=d.value,Kb.call(c,"string"===typeof d?document.createTextNode(d):d,this);Lb.call(c,this)}}})}Pb(CharacterData);Pb(Element);var Qb=window.Element.prototype,Rb=window.HTMLElement.prototype,Sb=window.SVGElement.prototype;!Rb.hasOwnProperty("classList")||Qb.hasOwnProperty("classList")||Sb.hasOwnProperty("classList")||Object.defineProperty(Qb,"classList",Object.getOwnPropertyDescriptor(Rb,"classList"));/*

 Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
 This code may only be used under the BSD style license found at
 http://polymer.github.io/LICENSE.txt The complete set of authors may be found
 at http://polymer.github.io/AUTHORS.txt The complete set of contributors may
 be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by
 Google as part of the polymer project is also subject to an additional IP
 rights grant found at http://polymer.github.io/PATENTS.txt
*/
var Tb=document.createElement("style");Tb.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var Ub=document.querySelector("head");Ub.insertBefore(Tb,Ub.firstChild);var Vb=window;Vb.WebComponents=Vb.WebComponents||{flags:{}};var Wb=document.querySelector('script[src*="webcomponents-lite.js"]'),Xb=/wc-(.+)/,bc={};if(!bc.noOpts){location.search.slice(1).split("&").forEach(function(a){a=a.split("=");var b;a[0]&&(b=a[0].match(Xb))&&(bc[b[1]]=a[1]||!0)});if(Wb)for(var cc=0,dc=void 0;dc=Wb.attributes[cc];cc++)"src"!==dc.name&&(bc[dc.name]=dc.value||!0);var ec={};bc.log&&bc.log.split&&bc.log.split(",").forEach(function(a){ec[a]=!0});bc.log=ec}
Vb.WebComponents.flags=bc;var fc=bc.shadydom;fc&&(Vb.ShadyDOM=Vb.ShadyDOM||{},Vb.ShadyDOM.force=fc);var gc=bc.register||bc.ce;gc&&window.customElements&&(Vb.customElements.forcePolyfill=gc);/*

 Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
 This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
 The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
 Code distributed by Google as part of the polymer project is also
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
(function(){function a(){}function b(t,u){if(!t.childNodes.length)return[];switch(t.nodeType){case Node.DOCUMENT_NODE:return Ra.call(t,u);case Node.DOCUMENT_FRAGMENT_NODE:return Yb.call(t,u);default:return Zb.call(t,u)}}var c="undefined"===typeof HTMLTemplateElement,d=!(document.createDocumentFragment().cloneNode()instanceof DocumentFragment),e=!1;/Trident/.test(navigator.userAgent)&&function(){function t(z,N){if(z instanceof DocumentFragment)for(var hb;hb=z.firstChild;)D.call(this,hb,N);else D.call(this,
z,N);return z}e=!0;var u=Node.prototype.cloneNode;Node.prototype.cloneNode=function(z){z=u.call(this,z);this instanceof DocumentFragment&&(z.__proto__=DocumentFragment.prototype);return z};DocumentFragment.prototype.querySelectorAll=HTMLElement.prototype.querySelectorAll;DocumentFragment.prototype.querySelector=HTMLElement.prototype.querySelector;Object.defineProperties(DocumentFragment.prototype,{nodeType:{get:function(){return Node.DOCUMENT_FRAGMENT_NODE},configurable:!0},localName:{get:function(){},
configurable:!0},nodeName:{get:function(){return"#document-fragment"},configurable:!0}});var D=Node.prototype.insertBefore;Node.prototype.insertBefore=t;var G=Node.prototype.appendChild;Node.prototype.appendChild=function(z){z instanceof DocumentFragment?t.call(this,z,null):G.call(this,z);return z};var X=Node.prototype.removeChild,ha=Node.prototype.replaceChild;Node.prototype.replaceChild=function(z,N){z instanceof DocumentFragment?(t.call(this,z,N),X.call(this,N)):ha.call(this,z,N);return N};Document.prototype.createDocumentFragment=
function(){var z=this.createElement("df");z.__proto__=DocumentFragment.prototype;return z};var ma=Document.prototype.importNode;Document.prototype.importNode=function(z,N){N=ma.call(this,z,N||!1);z instanceof DocumentFragment&&(N.__proto__=DocumentFragment.prototype);return N}}();var f=Node.prototype.cloneNode,g=Document.prototype.createElement,h=Document.prototype.importNode,k=Node.prototype.removeChild,l=Node.prototype.appendChild,p=Node.prototype.replaceChild,x=DOMParser.prototype.parseFromString,
F=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML")||{get:function(){return this.innerHTML},set:function(t){this.innerHTML=t}},da=Object.getOwnPropertyDescriptor(window.Node.prototype,"childNodes")||{get:function(){return this.childNodes}},Zb=Element.prototype.querySelectorAll,Ra=Document.prototype.querySelectorAll,Yb=DocumentFragment.prototype.querySelectorAll,$b=function(){if(!c){var t=document.createElement("template"),u=document.createElement("template");u.content.appendChild(document.createElement("div"));
t.content.appendChild(u);t=t.cloneNode(!0);return 0===t.content.childNodes.length||0===t.content.firstChild.content.childNodes.length||d}}();if(c){var ja=document.implementation.createHTMLDocument("template"),R=!0,na=document.createElement("style");na.textContent="template{display:none;}";var ya=document.head;ya.insertBefore(na,ya.firstElementChild);a.prototype=Object.create(HTMLElement.prototype);var za=!document.createElement("div").hasOwnProperty("innerHTML");a.S=function(t){if(!t.content&&t.namespaceURI===
document.documentElement.namespaceURI){t.content=ja.createDocumentFragment();for(var u;u=t.firstChild;)l.call(t.content,u);if(za)t.__proto__=a.prototype;else if(t.cloneNode=function(D){return a.za(this,D)},R)try{oa(t),m(t)}catch(D){R=!1}a.bootstrap(t.content)}};var Sa={option:["select"],thead:["table"],col:["colgroup","table"],tr:["tbody","table"],th:["tr","tbody","table"],td:["tr","tbody","table"]},oa=function(t){Object.defineProperty(t,"innerHTML",{get:function(){return E(this)},set:function(u){var D=
Sa[(/<([a-z][^/\0>\x20\t\r\n\f]+)/i.exec(u)||["",""])[1].toLowerCase()];if(D)for(var G=0;G<D.length;G++)u="<"+D[G]+">"+u+"</"+D[G]+">";ja.body.innerHTML=u;for(a.bootstrap(ja);this.content.firstChild;)k.call(this.content,this.content.firstChild);u=ja.body;if(D)for(G=0;G<D.length;G++)u=u.lastChild;for(;u.firstChild;)l.call(this.content,u.firstChild)},configurable:!0})},m=function(t){Object.defineProperty(t,"outerHTML",{get:function(){return"<template>"+this.innerHTML+"</template>"},set:function(u){if(this.parentNode){ja.body.innerHTML=
u;for(u=this.ownerDocument.createDocumentFragment();ja.body.firstChild;)l.call(u,ja.body.firstChild);p.call(this.parentNode,u,this)}else throw Error("Failed to set the 'outerHTML' property on 'Element': This element has no parent node.");},configurable:!0})};oa(a.prototype);m(a.prototype);a.bootstrap=function(t){t=b(t,"template");for(var u=0,D=t.length,G;u<D&&(G=t[u]);u++)a.S(G)};document.addEventListener("DOMContentLoaded",function(){a.bootstrap(document)});Document.prototype.createElement=function(){var t=
g.apply(this,arguments);"template"===t.localName&&a.S(t);return t};DOMParser.prototype.parseFromString=function(){var t=x.apply(this,arguments);a.bootstrap(t);return t};Object.defineProperty(HTMLElement.prototype,"innerHTML",{get:function(){return E(this)},set:function(t){F.set.call(this,t);a.bootstrap(this)},configurable:!0,enumerable:!0});var q=/[&\u00A0"]/g,r=/[&\u00A0<>]/g,v=function(t){switch(t){case "&":return"&amp;";case "<":return"&lt;";case ">":return"&gt;";case '"':return"&quot;";case "\u00a0":return"&nbsp;"}};
na=function(t){for(var u={},D=0;D<t.length;D++)u[t[D]]=!0;return u};var C=na("area base br col command embed hr img input keygen link meta param source track wbr".split(" ")),y=na("style script xmp iframe noembed noframes plaintext noscript".split(" ")),E=function(t,u){"template"===t.localName&&(t=t.content);for(var D="",G=u?u(t):da.get.call(t),X=0,ha=G.length,ma;X<ha&&(ma=G[X]);X++){a:{var z=ma;var N=t;var hb=u;switch(z.nodeType){case Node.ELEMENT_NODE:for(var ac=z.localName,ib="<"+ac,Xg=z.attributes,
de=0;N=Xg[de];de++)ib+=" "+N.name+'="'+N.value.replace(q,v)+'"';ib+=">";z=C[ac]?ib:ib+E(z,hb)+"</"+ac+">";break a;case Node.TEXT_NODE:z=z.data;z=N&&y[N.localName]?z:z.replace(r,v);break a;case Node.COMMENT_NODE:z="\x3c!--"+z.data+"--\x3e";break a;default:throw window.console.error(z),Error("not implemented");}}D+=z}return D}}if(c||$b){a.za=function(t,u){var D=f.call(t,!1);this.S&&this.S(D);u&&(l.call(D.content,f.call(t.content,!0)),pa(D.content,t.content));return D};var pa=function(t,u){if(u.querySelectorAll&&
(u=b(u,"template"),0!==u.length)){t=b(t,"template");for(var D=0,G=t.length,X,ha;D<G;D++)ha=u[D],X=t[D],a&&a.S&&a.S(ha),p.call(X.parentNode,Yg.call(ha,!0),X)}},Yg=Node.prototype.cloneNode=function(t){if(!e&&d&&this instanceof DocumentFragment)if(t)var u=Zg.call(this.ownerDocument,this,!0);else return this.ownerDocument.createDocumentFragment();else u=this.nodeType===Node.ELEMENT_NODE&&"template"===this.localName&&this.namespaceURI==document.documentElement.namespaceURI?a.za(this,t):f.call(this,t);
t&&pa(u,this);return u},Zg=Document.prototype.importNode=function(t,u){u=u||!1;if("template"===t.localName)return a.za(t,u);var D=h.call(this,t,u);if(u){pa(D,t);t=b(D,'script:not([type]),script[type="application/javascript"],script[type="text/javascript"]');for(var G,X=0;X<t.length;X++){G=t[X];u=g.call(document,"script");u.textContent=G.textContent;for(var ha=G.attributes,ma=0,z;ma<ha.length;ma++)z=ha[ma],u.setAttribute(z.name,z.value);p.call(G.parentNode,u,G)}}return D}}c&&(window.HTMLTemplateElement=
a)})();(function(a){function b(m,q){if("function"===typeof window.CustomEvent)return new CustomEvent(m,q);var r=document.createEvent("CustomEvent");r.initCustomEvent(m,!!q.bubbles,!!q.cancelable,q.detail);return r}function c(m){if(da)return m.ownerDocument!==document?m.ownerDocument:null;var q=m.__importDoc;if(!q&&m.parentNode){q=m.parentNode;if("function"===typeof q.closest)q=q.closest("link[rel=import]");else for(;!h(q)&&(q=q.parentNode););m.__importDoc=q}return q}function d(m){var q=p(document,"link[rel=import]:not([import-dependency])"),
r=q.length;r?x(q,function(v){return g(v,function(){0===--r&&m()})}):m()}function e(m){function q(){"loading"!==document.readyState&&document.body&&(document.removeEventListener("readystatechange",q),m())}document.addEventListener("readystatechange",q);q()}function f(m){e(function(){return d(function(){return m&&m()})})}function g(m,q){if(m.__loaded)q&&q();else if("script"===m.localName&&!m.src||"style"===m.localName&&!m.firstChild||"style"===m.localName&&"http://www.w3.org/2000/svg"===m.namespaceURI)m.__loaded=
!0,q&&q();else{var r=function(v){m.removeEventListener(v.type,r);m.__loaded=!0;q&&q()};m.addEventListener("load",r);"style"===m.localName&&(ya||za)||m.addEventListener("error",r)}}function h(m){return m.nodeType===Node.ELEMENT_NODE&&"link"===m.localName&&"import"===m.rel}function k(){var m=this;this.I={};this.Z=0;this.Ka=new MutationObserver(function(q){return m.Gc(q)});this.Ka.observe(document.head,{childList:!0,subtree:!0});this.loadImports(document)}function l(m){x(p(m,"template"),function(q){x(p(q.content,
'script:not([type]),script[type="application/javascript"],script[type="text/javascript"],script[type="module"]'),function(r){var v=document.createElement("script");x(r.attributes,function(C){return v.setAttribute(C.name,C.value)});v.textContent=r.textContent;r.parentNode.replaceChild(v,r)});l(q.content)})}function p(m,q){return m.childNodes.length?m.querySelectorAll(q):Zb}function x(m,q,r){var v=m?m.length:0,C=r?-1:1;for(r=r?v-1:0;r<v&&0<=r;r+=C)q(m[r],r)}var F=document.createElement("link"),da="import"in
F,Zb=F.querySelectorAll("*"),Ra=null;!1==="currentScript"in document&&Object.defineProperty(document,"currentScript",{get:function(){return Ra||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null)},configurable:!0});var Yb=/(url\()([^)]*)(\))/g,$b=/(@import[\s]+(?!url\())([^;]*)(;)/g,ja=/(<link[^>]*)(rel=['|"]?stylesheet['|"]?[^>]*>)/g,R={Ec:function(m,q){m.href&&m.setAttribute("href",R.va(m.getAttribute("href"),q));m.src&&m.setAttribute("src",R.va(m.getAttribute("src"),
q));if("style"===m.localName){var r=R.ub(m.textContent,q,Yb);m.textContent=R.ub(r,q,$b)}},ub:function(m,q,r){return m.replace(r,function(v,C,y,E){v=y.replace(/["']/g,"");q&&(v=R.va(v,q));return C+"'"+v+"'"+E})},va:function(m,q){if(void 0===R.xa){R.xa=!1;try{var r=new URL("b","http://a");r.pathname="c%20d";R.xa="http://a/c%20d"===r.href}catch(v){}}if(R.xa)return(new URL(m,q)).href;r=R.Eb;r||(r=document.implementation.createHTMLDocument("temp"),R.Eb=r,r.Pa=r.createElement("base"),r.head.appendChild(r.Pa),
r.Oa=r.createElement("a"));r.Pa.href=q;r.Oa.href=m;return r.Oa.href||m}},na={async:!0,load:function(m,q,r){if(m)if(m.match(/^data:/)){m=m.split(",");var v=m[1];v=-1<m[0].indexOf(";base64")?atob(v):decodeURIComponent(v);q(v)}else{var C=new XMLHttpRequest;C.open("GET",m,na.async);C.onload=function(){var y,E=null!=(y=C.responseURL||C.getResponseHeader("Location"))?y:void 0;E&&0===E.indexOf("/")&&(E=(location.origin||location.protocol+"//"+location.host)+E);y=C.response||C.responseText;304===C.status||
0===C.status||200<=C.status&&300>C.status?q(y,E):r(y)};C.send()}else r("error: href must be specified")}},ya=/Trident/.test(navigator.userAgent),za=/Edge\/\d./i.test(navigator.userAgent);k.prototype.loadImports=function(m){var q=this;m=p(m,"link[rel=import]");x(m,function(r){return q.rb(r)})};k.prototype.rb=function(m){var q=this,r=m.href;if(void 0!==this.I[r]){var v=this.I[r];v&&v.__loaded&&(m.__import=v,this.pb(m))}else this.Z++,this.I[r]="pending",na.load(r,function(C,y){C=q.Mc(C,y||r);q.I[r]=
C;q.Z--;q.loadImports(C);q.tb()},function(){q.I[r]=null;q.Z--;q.tb()})};k.prototype.Mc=function(m,q){var r=this;if(!m)return document.createDocumentFragment();if(ya||za)m=m.replace(ja,function(y,E,pa){return-1===y.indexOf("type=")?E+" type=import-disable "+pa:y});var v=document.createElement("template");v.innerHTML=m;if(v.content)m=v.content,l(m);else for(m=document.createDocumentFragment();v.firstChild;)m.appendChild(v.firstChild);if(v=m.querySelector("base"))q=R.va(v.getAttribute("href"),q),v.removeAttribute("href");
v=p(m,'link[rel=import],link[rel=stylesheet][href][type=import-disable],style:not([type]),link[rel=stylesheet][href]:not([type]),script:not([type]),script[type="application/javascript"],script[type="text/javascript"],script[type="module"]');var C=0;x(v,function(y){g(y);R.Ec(y,q);if("style"===y.localName&&r.wb(y)){var E=r.zc(y);g(E);y.parentNode.replaceChild(E,y);y=E}y.setAttribute("import-dependency","");if("script"===y.localName&&!y.src&&y.textContent){if("module"===y.type)throw Error("Inline module scripts are not supported in HTML Imports.");
y.setAttribute("src","data:text/javascript;charset=utf-8,"+encodeURIComponent(y.textContent+("\n//# sourceURL="+q+(C?"-"+C:"")+".js\n")));y.textContent="";C++}});return m};k.prototype.wb=function(m){return za&&-1<m.textContent.indexOf("@import")};k.prototype.zc=function(m){var q=m.ownerDocument.createElement("style");q.textContent=m.textContent;x(m.attributes,function(r){return q.setAttribute(r.name,r.value)});return q};k.prototype.tb=function(){var m=this;if(!this.Z){this.Ka.disconnect();this.flatten(document);
var q=!1,r=!1,v=function(){r&&q&&(m.loadImports(document),m.Z||(m.Ka.observe(document.head,{childList:!0,subtree:!0}),m.Dc()))};this.bd(function(){r=!0;v()});this.Sc(function(){q=!0;v()})}};k.prototype.flatten=function(m){var q=this;m=p(m,"link[rel=import]");x(m,function(r){var v=q.I[r.href];(r.__import=v)&&v.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&(q.I[r.href]=r,r.readyState="loading",r.__import=r,q.flatten(v),r.appendChild(v))})};k.prototype.Sc=function(m){function q(C){if(C<v){var y=r[C],E=document.createElement("script");
y.removeAttribute("import-dependency");x(y.attributes,function(pa){return E.setAttribute(pa.name,pa.value)});Ra=E;y.parentNode.replaceChild(E,y);g(E,function(){Ra=null;q(C+1)})}else m()}var r=p(document,"script[import-dependency]"),v=r.length;q(0)};k.prototype.bd=function(m){var q=this,r=p(document,"style[import-dependency],link[rel=stylesheet][import-dependency]"),v=r.length;if(v){var C=(ya||za)&&!!document.querySelector("link[rel=stylesheet][href][type=import-disable]");x(r,function(y){C&&q.wb(y)&&
y.ownerDocument.defaultView!==window.top&&(y.__loaded=!0);g(y,function(){y.removeAttribute("import-dependency");0===--v&&m()});if(C&&y.parentNode!==document.head){var E=document.createElement(y.localName);E.__appliedElement=y;E.setAttribute("type","import-placeholder");y.parentNode.insertBefore(E,y.nextSibling);for(E=c(y);E&&c(E);)E=c(E);E.parentNode!==document.head&&(E=null);document.head.insertBefore(y,E);y.removeAttribute("type")}})}else m()};k.prototype.Dc=function(){var m=this,q=p(document,"link[rel=import]");
x(q,function(r){return m.pb(r)},!0)};k.prototype.pb=function(m){m.__loaded||(m.__loaded=!0,m.import&&(m.import.readyState="complete"),m.dispatchEvent(b(m.import?"load":"error",{bubbles:!1,cancelable:!1,detail:void 0})))};k.prototype.Gc=function(m){var q=this;x(m,function(r){return x(r.addedNodes,function(v){v&&v.nodeType===Node.ELEMENT_NODE&&(h(v)?q.rb(v):q.loadImports(v))})})};var Sa=null;if(da)F=p(document,"link[rel=import]"),x(F,function(m){m.import&&"loading"===m.import.readyState||(m.__loaded=
!0)}),F=function(m){m=m.target;h(m)&&(m.__loaded=!0)},document.addEventListener("load",F,!0),document.addEventListener("error",F,!0);else{var oa=Object.getOwnPropertyDescriptor(Node.prototype,"baseURI");Object.defineProperty((!oa||oa.configurable?Node:Element).prototype,"baseURI",{get:function(){var m=h(this)?this:c(this);return m?m.href:oa&&oa.get?oa.get.call(this):(document.querySelector("base")||window.location).href},configurable:!0,enumerable:!0});Object.defineProperty(HTMLLinkElement.prototype,
"import",{get:function(){return this.__import||null},configurable:!0,enumerable:!0});e(function(){Sa=new k})}f(function(){return document.dispatchEvent(b("HTMLImportsLoaded",{cancelable:!0,bubbles:!0,detail:void 0}))});a.useNative=da;a.whenReady=f;a.importForElement=c;a.loadImports=function(m){Sa&&Sa.loadImports(m)}})(window.HTMLImports=window.HTMLImports||{});/*

Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
function hc(){}hc.prototype.toJSON=function(){return{}};function H(a){a.__shady||(a.__shady=new hc);return a.__shady}function I(a){return a&&a.__shady};var J=window.ShadyDOM||{};J.Hc=!(!Element.prototype.attachShadow||!Node.prototype.getRootNode);var ic=Object.getOwnPropertyDescriptor(Node.prototype,"firstChild");J.j=!!(ic&&ic.configurable&&ic.get);J.inUse=J.force||!J.Hc;J.noPatch=J.noPatch||!1;J.ca=J.preferPerformance;J.Ma="on-demand"===J.noPatch;var jc;var kc=J.querySelectorImplementation;jc=-1<["native","selectorEngine"].indexOf(kc)?kc:void 0;J.querySelectorImplementation=jc;var lc=navigator.userAgent.match("Trident");J.zb=lc;
function mc(){return Document.prototype.msElementsFromPoint?"msElementsFromPoint":"elementsFromPoint"}function nc(a){return(a=I(a))&&void 0!==a.firstChild}function K(a){return a instanceof ShadowRoot}function oc(a){return(a=(a=I(a))&&a.root)&&a.Za()}var pc=Element.prototype,qc=pc.matches||pc.matchesSelector||pc.mozMatchesSelector||pc.msMatchesSelector||pc.oMatchesSelector||pc.webkitMatchesSelector,rc=document.createTextNode(""),sc=0,tc=[];
(new MutationObserver(function(){for(;tc.length;)try{tc.shift()()}catch(a){throw rc.textContent=sc++,a;}})).observe(rc,{characterData:!0});function uc(a){tc.push(a);rc.textContent=sc++}var vc=document.contains?function(a,b){return a.__shady_native_contains(b)}:function(a,b){return a===b||a.documentElement&&a.documentElement.__shady_native_contains(b)};function wc(a,b){for(;b;){if(b==a)return!0;b=b.__shady_parentNode}return!1}
function xc(a){for(var b=a.length-1;0<=b;b--){var c=a[b],d=c.getAttribute("id")||c.getAttribute("name");d&&"length"!==d&&isNaN(d)&&(a[d]=c)}a.item=function(e){return a[e]};a.namedItem=function(e){if("length"!==e&&isNaN(e)&&a[e])return a[e];for(var f=ea(a),g=f.next();!g.done;g=f.next())if(g=g.value,(g.getAttribute("id")||g.getAttribute("name"))==e)return g;return null};return a}function yc(a){var b=[];for(a=a.__shady_native_firstChild;a;a=a.__shady_native_nextSibling)b.push(a);return b}
function zc(a){var b=[];for(a=a.__shady_firstChild;a;a=a.__shady_nextSibling)b.push(a);return b}function Ac(a,b,c){c.configurable=!0;if(c.value)a[b]=c.value;else try{Object.defineProperty(a,b,c)}catch(d){}}function L(a,b,c,d){c=void 0===c?"":c;for(var e in b)d&&0<=d.indexOf(e)||Ac(a,c+e,b[e])}function Bc(a,b){for(var c in b)c in a&&Ac(a,c,b[c])}function M(a){var b={};Object.getOwnPropertyNames(a).forEach(function(c){b[c]=Object.getOwnPropertyDescriptor(a,c)});return b}
function Cc(a,b){for(var c=Object.getOwnPropertyNames(b),d=0,e;d<c.length;d++)e=c[d],a[e]=b[e]}function Dc(a){return a instanceof Node?a:document.createTextNode(""+a)}function Ec(){var a=A.apply(0,arguments);if(1===a.length)return Dc(a[0]);var b=document.createDocumentFragment();a=ea(a);for(var c=a.next();!c.done;c=a.next())b.appendChild(Dc(c.value));return b}
function Fc(a){var b;for(b=void 0===b?1:b;0<b;b--)a=a.reduce(function(c,d){Array.isArray(d)?c.push.apply(c,w(d)):c.push(d);return c},[]);return a}function Gc(a){var b=[],c=new Set;a=ea(a);for(var d=a.next();!d.done;d=a.next())d=d.value,c.has(d)||(b.push(d),c.add(d));return b};var Hc=[],Ic;function Jc(a){Ic||(Ic=!0,uc(Kc));Hc.push(a)}function Kc(){Ic=!1;for(var a=!!Hc.length;Hc.length;)Hc.shift()();return a}Kc.list=Hc;function Lc(){this.ma=!1;this.addedNodes=[];this.removedNodes=[];this.ra=new Set}function Mc(a){a.ma||(a.ma=!0,uc(function(){a.flush()}))}Lc.prototype.flush=function(){if(this.ma){this.ma=!1;var a=this.takeRecords();a.length&&this.ra.forEach(function(b){b(a)})}};Lc.prototype.takeRecords=function(){if(this.addedNodes.length||this.removedNodes.length){var a=[{addedNodes:this.addedNodes,removedNodes:this.removedNodes}];this.addedNodes=[];this.removedNodes=[];return a}return[]};
function Nc(a,b){var c=H(a);c.ba||(c.ba=new Lc);c.ba.ra.add(b);var d=c.ba;return{Hb:b,O:d,ec:a,takeRecords:function(){return d.takeRecords()}}}function Oc(a){var b=a&&a.O;b&&(b.ra.delete(a.Hb),b.ra.size||(H(a.ec).ba=null))}
function Pc(a,b){var c=b.getRootNode();return a.map(function(d){var e=c===d.target.getRootNode();if(e&&d.addedNodes){if(e=[].slice.call(d.addedNodes).filter(function(f){return c===f.getRootNode()}),e.length)return d=Object.create(d),Object.defineProperty(d,"addedNodes",{value:e,configurable:!0}),d}else if(e)return d}).filter(function(d){return d})};var Qc=/[&\u00A0"]/g,Rc=/[&\u00A0<>]/g;function Sc(a){switch(a){case "&":return"&amp;";case "<":return"&lt;";case ">":return"&gt;";case '"':return"&quot;";case "\u00a0":return"&nbsp;"}}function Tc(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}var Uc=Tc("area base br col command embed hr img input keygen link meta param source track wbr".split(" ")),Vc=Tc("style script xmp iframe noembed noframes plaintext noscript".split(" "));
function Wc(a,b){"template"===a.localName&&(a=a.content);for(var c="",d=b?b(a):a.childNodes,e=0,f=d.length,g=void 0;e<f&&(g=d[e]);e++){a:{var h=g;var k=a,l=b;switch(h.nodeType){case Node.ELEMENT_NODE:k=h.localName;for(var p="<"+k,x=h.attributes,F=0,da;da=x[F];F++)p+=" "+da.name+'="'+da.value.replace(Qc,Sc)+'"';p+=">";h=Uc[k]?p:p+Wc(h,l)+"</"+k+">";break a;case Node.TEXT_NODE:h=h.data;h=k&&Vc[k.localName]?h:h.replace(Rc,Sc);break a;case Node.COMMENT_NODE:h="\x3c!--"+h.data+"--\x3e";break a;default:throw window.console.error(h),
Error("not implemented");}}c+=h}return c};var Xc=J.j,Yc={querySelector:function(a){return this.__shady_native_querySelector(a)},querySelectorAll:function(a){return this.__shady_native_querySelectorAll(a)}},Zc={};function $c(a){Zc[a]=function(b){return b["__shady_native_"+a]}}function ad(a,b){L(a,b,"__shady_native_");for(var c in b)$c(c)}function O(a,b){b=void 0===b?[]:b;for(var c=0;c<b.length;c++){var d=b[c],e=Object.getOwnPropertyDescriptor(a,d);e&&(Object.defineProperty(a,"__shady_native_"+d,e),e.value?Yc[d]||(Yc[d]=e.value):$c(d))}}
var P=document.createTreeWalker(document,NodeFilter.SHOW_ALL,null,!1),Q=document.createTreeWalker(document,NodeFilter.SHOW_ELEMENT,null,!1),bd=document.implementation.createHTMLDocument("inert");function cd(a){for(var b;b=a.__shady_native_firstChild;)a.__shady_native_removeChild(b)}var dd=["firstElementChild","lastElementChild","children","childElementCount"],ed=["querySelector","querySelectorAll","append","prepend","replaceChildren"];
function fd(){var a=["dispatchEvent","addEventListener","removeEventListener"];window.EventTarget?(O(window.EventTarget.prototype,a),void 0===window.__shady_native_addEventListener&&O(Window.prototype,a)):(O(Node.prototype,a),O(Window.prototype,a),O(XMLHttpRequest.prototype,a));Xc?O(Node.prototype,"parentNode firstChild lastChild previousSibling nextSibling childNodes parentElement textContent".split(" ")):ad(Node.prototype,{parentNode:{get:function(){P.currentNode=this;return P.parentNode()}},firstChild:{get:function(){P.currentNode=
this;return P.firstChild()}},lastChild:{get:function(){P.currentNode=this;return P.lastChild()}},previousSibling:{get:function(){P.currentNode=this;return P.previousSibling()}},nextSibling:{get:function(){P.currentNode=this;return P.nextSibling()}},childNodes:{get:function(){var b=[];P.currentNode=this;for(var c=P.firstChild();c;)b.push(c),c=P.nextSibling();return b}},parentElement:{get:function(){Q.currentNode=this;return Q.parentNode()}},textContent:{get:function(){switch(this.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:for(var b=
document.createTreeWalker(this,NodeFilter.SHOW_TEXT,null,!1),c="",d;d=b.nextNode();)c+=d.nodeValue;return c;default:return this.nodeValue}},set:function(b){if("undefined"===typeof b||null===b)b="";switch(this.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:cd(this);(0<b.length||this.nodeType===Node.ELEMENT_NODE)&&this.__shady_native_insertBefore(document.createTextNode(b),void 0);break;default:this.nodeValue=b}}}});O(Node.prototype,"appendChild insertBefore removeChild replaceChild cloneNode contains".split(" "));
O(HTMLElement.prototype,["parentElement","contains"]);a={firstElementChild:{get:function(){Q.currentNode=this;return Q.firstChild()}},lastElementChild:{get:function(){Q.currentNode=this;return Q.lastChild()}},children:{get:function(){var b=[];Q.currentNode=this;for(var c=Q.firstChild();c;)b.push(c),c=Q.nextSibling();return xc(b)}},childElementCount:{get:function(){return this.children?this.children.length:0}}};Xc?(O(Element.prototype,dd),O(Element.prototype,["previousElementSibling","nextElementSibling",
"innerHTML","className"]),O(HTMLElement.prototype,["children","innerHTML","className"])):(ad(Element.prototype,a),ad(Element.prototype,{previousElementSibling:{get:function(){Q.currentNode=this;return Q.previousSibling()}},nextElementSibling:{get:function(){Q.currentNode=this;return Q.nextSibling()}},innerHTML:{get:function(){return Wc(this,yc)},set:function(b){var c="template"===this.localName?this.content:this;cd(c);var d=this.localName||"div";d=this.namespaceURI&&this.namespaceURI!==bd.namespaceURI?
bd.createElementNS(this.namespaceURI,d):bd.createElement(d);d.innerHTML=b;for(b="template"===this.localName?d.content:d;d=b.__shady_native_firstChild;)c.__shady_native_insertBefore(d,void 0)}},className:{get:function(){return this.getAttribute("class")||""},set:function(b){this.setAttribute("class",b)}}}));O(Element.prototype,"setAttribute getAttribute hasAttribute removeAttribute toggleAttribute focus blur".split(" "));O(Element.prototype,ed);O(HTMLElement.prototype,["focus","blur"]);window.HTMLTemplateElement&&
O(window.HTMLTemplateElement.prototype,["innerHTML"]);Xc?O(DocumentFragment.prototype,dd):ad(DocumentFragment.prototype,a);O(DocumentFragment.prototype,ed);Xc?(O(Document.prototype,dd),O(Document.prototype,["activeElement"])):ad(Document.prototype,a);O(Document.prototype,["importNode","getElementById","elementFromPoint",mc()]);O(Document.prototype,ed)};var gd=M({get childNodes(){return this.__shady_childNodes},get firstChild(){return this.__shady_firstChild},get lastChild(){return this.__shady_lastChild},get childElementCount(){return this.__shady_childElementCount},get children(){return this.__shady_children},get firstElementChild(){return this.__shady_firstElementChild},get lastElementChild(){return this.__shady_lastElementChild},get shadowRoot(){return this.__shady_shadowRoot}}),hd=M({get textContent(){return this.__shady_textContent},set textContent(a){this.__shady_textContent=
a},get innerHTML(){return this.__shady_innerHTML},set innerHTML(a){this.__shady_innerHTML=a}}),id=M({get parentElement(){return this.__shady_parentElement},get parentNode(){return this.__shady_parentNode},get nextSibling(){return this.__shady_nextSibling},get previousSibling(){return this.__shady_previousSibling},get nextElementSibling(){return this.__shady_nextElementSibling},get previousElementSibling(){return this.__shady_previousElementSibling},get className(){return this.__shady_className},set className(a){this.__shady_className=
a}});function jd(a){for(var b in a){var c=a[b];c&&(c.enumerable=!1)}}jd(gd);jd(hd);jd(id);var kd=J.j||!0===J.noPatch,ld=kd?function(){}:function(a){var b=H(a);b.Cb||(b.Cb=!0,Bc(a,id))},md=kd?function(){}:function(a){var b=H(a);b.Bb||(b.Bb=!0,Bc(a,gd),window.customElements&&window.customElements.polyfillWrapFlushCallback&&!J.noPatch||Bc(a,hd))};var nd="__eventWrappers"+Date.now(),od=function(){var a=Object.getOwnPropertyDescriptor(Event.prototype,"composed");return a?function(b){return a.get.call(b)}:null}(),pd=function(){function a(){}var b=!1,c={get capture(){b=!0;return!1}};window.addEventListener("test",a,c);window.removeEventListener("test",a,c);return b}();function qd(a){if(null===a||"object"!==typeof a&&"function"!==typeof a){var b=!!a;var c=!1}else{b=!!a.capture;c=!!a.once;var d=a.K}return{vb:d,capture:b,once:c,sb:pd?a:b}}
var rd={blur:!0,focus:!0,focusin:!0,focusout:!0,click:!0,dblclick:!0,mousedown:!0,mouseenter:!0,mouseleave:!0,mousemove:!0,mouseout:!0,mouseover:!0,mouseup:!0,wheel:!0,beforeinput:!0,input:!0,keydown:!0,keyup:!0,compositionstart:!0,compositionupdate:!0,compositionend:!0,touchstart:!0,touchend:!0,touchmove:!0,touchcancel:!0,pointerover:!0,pointerenter:!0,pointerdown:!0,pointermove:!0,pointerup:!0,pointercancel:!0,pointerout:!0,pointerleave:!0,gotpointercapture:!0,lostpointercapture:!0,dragstart:!0,
drag:!0,dragenter:!0,dragleave:!0,dragover:!0,drop:!0,dragend:!0,DOMActivate:!0,DOMFocusIn:!0,DOMFocusOut:!0,keypress:!0},sd={DOMAttrModified:!0,DOMAttributeNameChanged:!0,DOMCharacterDataModified:!0,DOMElementNameChanged:!0,DOMNodeInserted:!0,DOMNodeInsertedIntoDocument:!0,DOMNodeRemoved:!0,DOMNodeRemovedFromDocument:!0,DOMSubtreeModified:!0};function td(a){return a instanceof Node?a.__shady_getRootNode():a}
function ud(a,b){var c=[],d=a;for(a=td(a);d;)c.push(d),d=d.__shady_assignedSlot?d.__shady_assignedSlot:d.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&d.host&&(b||d!==a)?d.host:d.__shady_parentNode;c[c.length-1]===document&&c.push(window);return c}function vd(a){a.__composedPath||(a.__composedPath=ud(a.target,!0));return a.__composedPath}function wd(a,b){if(!K)return a;a=ud(a,!0);for(var c=0,d,e=void 0,f,g=void 0;c<b.length;c++)if(d=b[c],f=td(d),f!==e&&(g=a.indexOf(f),e=f),!K(f)||-1<g)return d}
var xd={get composed(){void 0===this.__composed&&(od?this.__composed="focusin"===this.type||"focusout"===this.type||od(this):!1!==this.isTrusted&&(this.__composed=rd[this.type]));return this.__composed||!1},composedPath:function(){this.__composedPath||(this.__composedPath=ud(this.__target,this.composed));return this.__composedPath},get target(){return wd(this.currentTarget||this.__previousCurrentTarget,this.composedPath())},get relatedTarget(){if(!this.__relatedTarget)return null;this.__relatedTargetComposedPath||
(this.__relatedTargetComposedPath=ud(this.__relatedTarget,!0));return wd(this.currentTarget||this.__previousCurrentTarget,this.__relatedTargetComposedPath)},stopPropagation:function(){Event.prototype.stopPropagation.call(this);this.wa=!0},stopImmediatePropagation:function(){Event.prototype.stopImmediatePropagation.call(this);this.wa=this.__immediatePropagationStopped=!0}},yd=J.j&&Object.getOwnPropertyDescriptor(Event.prototype,"eventPhase");
yd&&(Object.defineProperty(xd,"eventPhase",{get:function(){return this.currentTarget===this.target?Event.AT_TARGET:this.__shady_native_eventPhase},enumerable:!0,configurable:!0}),Object.defineProperty(xd,"__shady_native_eventPhase",yd));function zd(a){function b(c,d){c=new a(c,d);c.__composed=d&&!!d.composed;return c}b.__proto__=a;b.prototype=a.prototype;return b}var Ad={focus:!0,blur:!0};function Bd(a){return a.__target!==a.target||a.__relatedTarget!==a.relatedTarget}
function Cd(a,b,c){if(c=b.__handlers&&b.__handlers[a.type]&&b.__handlers[a.type][c])for(var d=0,e;(e=c[d])&&(!Bd(a)||a.target!==a.relatedTarget)&&(e.call(b,a),!a.__immediatePropagationStopped);d++);}var Dd=(new Event("e")).hasOwnProperty("currentTarget");
function Ed(a){a=Dd?Object.create(a):a;var b=a.composedPath(),c=b.map(function(p){return wd(p,b)}),d=a.bubbles,e=Object.getOwnPropertyDescriptor(a,"currentTarget");Object.defineProperty(a,"currentTarget",{configurable:!0,enumerable:!0,get:function(){return k}});var f=Event.CAPTURING_PHASE,g=Object.getOwnPropertyDescriptor(a,"eventPhase");Object.defineProperty(a,"eventPhase",{configurable:!0,enumerable:!0,get:function(){return f}});try{for(var h=b.length-1;0<=h;h--){var k=b[h];f=k===c[h]?Event.AT_TARGET:
Event.CAPTURING_PHASE;Cd(a,k,"capture");if(a.wa)return}for(h=0;h<b.length;h++){k=b[h];var l=k===c[h];if(l||d)if(f=l?Event.AT_TARGET:Event.BUBBLING_PHASE,Cd(a,k,"bubble"),a.wa)break}}finally{Dd||(e?Object.defineProperty(a,"currentTarget",e):delete a.currentTarget,g?Object.defineProperty(a,"eventPhase",g):delete a.eventPhase)}}function Fd(a,b,c,d){for(var e=0;e<a.length;e++){var f=a[e],g=f.type,h=f.capture;if(b===f.node&&c===g&&d===h)return e}return-1}
function Gd(a){Kc();return!J.ca&&this instanceof Node&&!vc(document,this)?(a.__target||Hd(a,this),Ed(a)):this.__shady_native_dispatchEvent(a)}
function Id(a,b,c){var d=this,e=qd(c),f=e.capture,g=e.once,h=e.vb;e=e.sb;if(b){var k=typeof b;if("function"===k||"object"===k)if("object"!==k||b.handleEvent&&"function"===typeof b.handleEvent){if(sd[a])return this.__shady_native_addEventListener(a,b,e);var l=h||this;if(h=b[nd]){if(-1<Fd(h,l,a,f))return}else b[nd]=[];h=function(p){g&&d.__shady_removeEventListener(a,b,c);p.__target||Hd(p);if(l!==d){var x=Object.getOwnPropertyDescriptor(p,"currentTarget");Object.defineProperty(p,"currentTarget",{get:function(){return l},
configurable:!0});var F=Object.getOwnPropertyDescriptor(p,"eventPhase");Object.defineProperty(p,"eventPhase",{configurable:!0,enumerable:!0,get:function(){return f?Event.CAPTURING_PHASE:Event.BUBBLING_PHASE}})}p.__previousCurrentTarget=p.currentTarget;if(!K(l)&&"slot"!==l.localName||-1!=p.composedPath().indexOf(l))if(p.composed||-1<p.composedPath().indexOf(l))if(Bd(p)&&p.target===p.relatedTarget)p.eventPhase===Event.BUBBLING_PHASE&&p.stopImmediatePropagation();else if(p.eventPhase===Event.CAPTURING_PHASE||
p.bubbles||p.target===l||l instanceof Window){var da="function"===k?b.call(l,p):b.handleEvent&&b.handleEvent(p);l!==d&&(x?(Object.defineProperty(p,"currentTarget",x),x=null):delete p.currentTarget,F?(Object.defineProperty(p,"eventPhase",F),F=null):delete p.eventPhase);return da}};b[nd].push({node:l,type:a,capture:f,cd:h});this.__handlers=this.__handlers||{};this.__handlers[a]=this.__handlers[a]||{capture:[],bubble:[]};this.__handlers[a][f?"capture":"bubble"].push(h);Ad[a]||this.__shady_native_addEventListener(a,
h,e)}}}function Jd(a,b,c){if(b){var d=qd(c);c=d.capture;var e=d.vb;d=d.sb;if(sd[a])return this.__shady_native_removeEventListener(a,b,d);var f=e||this;e=void 0;var g=null;try{g=b[nd]}catch(h){}g&&(f=Fd(g,f,a,c),-1<f&&(e=g.splice(f,1)[0].cd,g.length||(b[nd]=void 0)));this.__shady_native_removeEventListener(a,e||b,d);e&&this.__handlers&&this.__handlers[a]&&(a=this.__handlers[a][c?"capture":"bubble"],b=a.indexOf(e),-1<b&&a.splice(b,1))}}
function Kd(){for(var a in Ad)window.__shady_native_addEventListener(a,function(b){b.__target||(Hd(b),Ed(b))},!0)}var Ld=M(xd);function Hd(a,b){b=void 0===b?a.target:b;a.__target=b;a.__relatedTarget=a.relatedTarget;if(J.j){b=Object.getPrototypeOf(a);if(!b.hasOwnProperty("__shady_patchedProto")){var c=Object.create(b);c.__shady_sourceProto=b;L(c,Ld);b.__shady_patchedProto=c}a.__proto__=b.__shady_patchedProto}else L(a,Ld)}var Md=zd(Event),Nd=zd(CustomEvent),Od=zd(MouseEvent);
function Pd(){if(!od&&Object.getOwnPropertyDescriptor(Event.prototype,"isTrusted")){var a=function(){var b=new MouseEvent("click",{bubbles:!0,cancelable:!0,composed:!0});this.__shady_dispatchEvent(b)};Element.prototype.click?Element.prototype.click=a:HTMLElement.prototype.click&&(HTMLElement.prototype.click=a)}}
var Qd=Object.getOwnPropertyNames(Element.prototype).filter(function(a){return"on"===a.substring(0,2)}),Rd=Object.getOwnPropertyNames(HTMLElement.prototype).filter(function(a){return"on"===a.substring(0,2)});function Sd(a){return{set:function(b){var c=H(this),d=a.substring(2);c.J||(c.J={});c.J[a]&&this.removeEventListener(d,c.J[a]);this.__shady_addEventListener(d,b);c.J[a]=b},get:function(){var b=I(this);return b&&b.J&&b.J[a]},configurable:!0}};function Td(a,b){return{index:a,da:[],qa:b}}
function Ud(a,b,c,d){var e=0,f=0,g=0,h=0,k=Math.min(b-e,d-f);if(0==e&&0==f)a:{for(g=0;g<k;g++)if(a[g]!==c[g])break a;g=k}if(b==a.length&&d==c.length){h=a.length;for(var l=c.length,p=0;p<k-g&&Vd(a[--h],c[--l]);)p++;h=p}e+=g;f+=g;b-=h;d-=h;if(0==b-e&&0==d-f)return[];if(e==b){for(b=Td(e,0);f<d;)b.da.push(c[f++]);return[b]}if(f==d)return[Td(e,b-e)];k=e;g=f;d=d-g+1;h=b-k+1;b=Array(d);for(l=0;l<d;l++)b[l]=Array(h),b[l][0]=l;for(l=0;l<h;l++)b[0][l]=l;for(l=1;l<d;l++)for(p=1;p<h;p++)if(a[k+p-1]===c[g+l-1])b[l][p]=
b[l-1][p-1];else{var x=b[l-1][p]+1,F=b[l][p-1]+1;b[l][p]=x<F?x:F}k=b.length-1;g=b[0].length-1;d=b[k][g];for(a=[];0<k||0<g;)0==k?(a.push(2),g--):0==g?(a.push(3),k--):(h=b[k-1][g-1],l=b[k-1][g],p=b[k][g-1],x=l<p?l<h?l:h:p<h?p:h,x==h?(h==d?a.push(0):(a.push(1),d=h),k--,g--):x==l?(a.push(3),k--,d=l):(a.push(2),g--,d=p));a.reverse();b=void 0;k=[];for(g=0;g<a.length;g++)switch(a[g]){case 0:b&&(k.push(b),b=void 0);e++;f++;break;case 1:b||(b=Td(e,0));b.qa++;e++;b.da.push(c[f]);f++;break;case 2:b||(b=Td(e,
0));b.qa++;e++;break;case 3:b||(b=Td(e,0)),b.da.push(c[f]),f++}b&&k.push(b);return k}function Vd(a,b){return a===b};var Wd=M({dispatchEvent:Gd,addEventListener:Id,removeEventListener:Jd});var Xd=null;function Yd(){Xd||(Xd=window.ShadyCSS&&window.ShadyCSS.ScopingShim);return Xd||null}function Zd(a,b,c){var d=Yd();return d&&"class"===b?(d.setElementClass(a,c),!0):!1}function $d(a,b){var c=Yd();c&&c.unscopeNode(a,b)}function ae(a,b){var c=Yd();if(!c)return!0;if(a.nodeType===Node.DOCUMENT_FRAGMENT_NODE){c=!0;for(a=a.__shady_firstChild;a;a=a.__shady_nextSibling)c=c&&ae(a,b);return c}return a.nodeType!==Node.ELEMENT_NODE?!0:c.currentScopeForNode(a)===b}
function be(a){if(a.nodeType!==Node.ELEMENT_NODE)return"";var b=Yd();return b?b.currentScopeForNode(a):""}function ce(a,b){if(a)for(a.nodeType===Node.ELEMENT_NODE&&b(a),a=a.__shady_firstChild;a;a=a.__shady_nextSibling)a.nodeType===Node.ELEMENT_NODE&&ce(a,b)};var ee=window.document,fe=J.ca,ge=Object.getOwnPropertyDescriptor(Node.prototype,"isConnected"),he=ge&&ge.get;function ie(a){for(var b;b=a.__shady_firstChild;)a.__shady_removeChild(b)}function je(a){var b=I(a);if(b&&void 0!==b.ua)for(b=a.__shady_firstChild;b;b=b.__shady_nextSibling)je(b);if(a=I(a))a.ua=void 0}function ke(a){var b=a;if(a&&"slot"===a.localName){var c=I(a);(c=c&&c.T)&&(b=c.length?c[0]:ke(a.__shady_nextSibling))}return b}
function le(a,b,c){if(a=(a=I(a))&&a.ba){if(b)if(b.nodeType===Node.DOCUMENT_FRAGMENT_NODE)for(var d=0,e=b.childNodes.length;d<e;d++)a.addedNodes.push(b.childNodes[d]);else a.addedNodes.push(b);c&&a.removedNodes.push(c);Mc(a)}}
var pe=M({get parentNode(){var a=I(this);a=a&&a.parentNode;return void 0!==a?a:this.__shady_native_parentNode},get firstChild(){var a=I(this);a=a&&a.firstChild;return void 0!==a?a:this.__shady_native_firstChild},get lastChild(){var a=I(this);a=a&&a.lastChild;return void 0!==a?a:this.__shady_native_lastChild},get nextSibling(){var a=I(this);a=a&&a.nextSibling;return void 0!==a?a:this.__shady_native_nextSibling},get previousSibling(){var a=I(this);a=a&&a.previousSibling;return void 0!==a?a:this.__shady_native_previousSibling},
get childNodes(){if(nc(this)){var a=I(this);if(!a.childNodes){a.childNodes=[];for(var b=this.__shady_firstChild;b;b=b.__shady_nextSibling)a.childNodes.push(b)}var c=a.childNodes}else c=this.__shady_native_childNodes;c.item=function(d){return c[d]};return c},get parentElement(){var a=I(this);(a=a&&a.parentNode)&&a.nodeType!==Node.ELEMENT_NODE&&(a=null);return void 0!==a?a:this.__shady_native_parentElement},get isConnected(){if(he&&he.call(this))return!0;if(this.nodeType==Node.DOCUMENT_FRAGMENT_NODE)return!1;
var a=this.ownerDocument;if(null===a||vc(a,this))return!0;for(a=this;a&&!(a instanceof Document);)a=a.__shady_parentNode||(K(a)?a.host:void 0);return!!(a&&a instanceof Document)},get textContent(){if(nc(this)){for(var a=[],b=this.__shady_firstChild;b;b=b.__shady_nextSibling)b.nodeType!==Node.COMMENT_NODE&&a.push(b.__shady_textContent);return a.join("")}return this.__shady_native_textContent},set textContent(a){if("undefined"===typeof a||null===a)a="";switch(this.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:if(!nc(this)&&
J.j){var b=this.__shady_firstChild;(b!=this.__shady_lastChild||b&&b.nodeType!=Node.TEXT_NODE)&&ie(this);this.__shady_native_textContent=a}else ie(this),(0<a.length||this.nodeType===Node.ELEMENT_NODE)&&this.__shady_insertBefore(document.createTextNode(a));break;default:this.nodeValue=a}},insertBefore:function(a,b){if(this.ownerDocument!==ee&&a.ownerDocument!==ee)return this.__shady_native_insertBefore(a,b),a;if(a===this)throw Error("Failed to execute 'appendChild' on 'Node': The new child element contains the parent.");
if(b){var c=I(b);c=c&&c.parentNode;if(void 0!==c&&c!==this||void 0===c&&b.__shady_native_parentNode!==this)throw Error("Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.");}if(b===a)return a;le(this,a);var d=[],e=(c=me(this))?c.host.localName:be(this),f=a.__shady_parentNode;if(f){var g=be(a);var h=!!c||!me(a)||fe&&void 0!==this.__noInsertionPoint;f.__shady_removeChild(a,h)}f=!0;var k=(!fe||void 0===a.__noInsertionPoint&&void 0===
this.__noInsertionPoint)&&!ae(a,e),l=c&&!a.__noInsertionPoint&&(!fe||a.nodeType===Node.DOCUMENT_FRAGMENT_NODE);if(l||k)k&&(g=g||be(a)),ce(a,function(p){l&&"slot"===p.localName&&d.push(p);if(k){var x=g;Yd()&&(x&&$d(p,x),(x=Yd())&&x.scopeNode(p,e))}});d.length&&(c.Ra(d),c.u());nc(this)&&(ne(a,this,b),h=I(this),h.root?(f=!1,oc(this)&&h.root.u()):c&&"slot"===this.localName&&(f=!1,c.u()));f?(c=K(this)?this.host:this,b?(b=ke(b),c.__shady_native_insertBefore(a,b)):c.__shady_native_appendChild(a)):a.ownerDocument!==
this.ownerDocument&&this.ownerDocument.adoptNode(a);return a},appendChild:function(a){if(this!=a||!K(a))return this.__shady_insertBefore(a)},removeChild:function(a,b){b=void 0===b?!1:b;if(this.ownerDocument!==ee)return this.__shady_native_removeChild(a);if(a.__shady_parentNode!==this)throw Error("The node to be removed is not a child of this node: "+a);le(this,null,a);var c=me(a),d=c&&c.ic(a),e=I(this);if(nc(this)&&(oe(a,this),oc(this))){e.root.u();var f=!0}if(Yd()&&!b&&c&&a.nodeType!==Node.TEXT_NODE){var g=
be(a);ce(a,function(h){$d(h,g)})}je(a);c&&((b="slot"===this.localName)&&(f=!0),(d||b)&&c.u());f||(f=K(this)?this.host:this,(!e.root&&"slot"!==a.localName||f===a.__shady_native_parentNode)&&f.__shady_native_removeChild(a));return a},replaceChild:function(a,b){this.__shady_insertBefore(a,b);this.__shady_removeChild(b);return a},cloneNode:function(a){if("template"==this.localName)return this.__shady_native_cloneNode(a);var b=this.__shady_native_cloneNode(!1);if(a&&b.nodeType!==Node.ATTRIBUTE_NODE){a=
this.__shady_firstChild;for(var c;a;a=a.__shady_nextSibling)c=a.__shady_cloneNode(!0),b.__shady_appendChild(c)}return b},getRootNode:function(a){if(this&&this.nodeType){var b=H(this),c=b.ua;void 0===c&&(K(this)?(c=this,b.ua=c):(c=(c=this.__shady_parentNode)?c.__shady_getRootNode(a):this,document.documentElement.__shady_native_contains(this)&&(b.ua=c)));return c}},contains:function(a){return wc(this,a)}});var qe=M({get assignedSlot(){var a=this.__shady_parentNode;(a=a&&a.__shady_shadowRoot)&&a.la();return(a=I(this))&&a.assignedSlot||null}});/*

 Copyright (c) 2022 The Polymer Project Authors
 SPDX-License-Identifier: BSD-3-Clause
*/
var re=new Map;[["(",{end:")",ta:!0}],["[",{end:"]",ta:!0}],['"',{end:'"',ta:!1}],["'",{end:"'",ta:!1}]].forEach(function(a){var b=ea(a);a=b.next().value;b=b.next().value;re.set(a,b)});function se(a,b,c,d){for(d=void 0===d?!0:d;b<a.length;b++)if("\\"===a[b]&&b<a.length-1&&"\n"!==a[b+1])b++;else{if(-1!==c.indexOf(a[b]))return b;if(d&&re.has(a[b])){var e=re.get(a[b]);b=se(a,b+1,[e.end],e.ta)}}return a.length}
function te(a){function b(){if(0<d.length){for(;" "===d[d.length-1];)d.pop();c.push({ob:d.filter(function(k,l){return 0===l%2}),Bc:d.filter(function(k,l){return 1===l%2})});d.length=0}}for(var c=[],d=[],e=0;e<a.length;){var f=d[d.length-1],g=se(a,e,[","," ",">","+","~"]),h=g===e?a[e]:a.substring(e,g);if(","===h)b();else if(-1===[void 0," ",">","+","~"].indexOf(f)||" "!==h)" "===f&&-1!==[">","+","~"].indexOf(h)?d[d.length-1]=h:d.push(h);e=g+(g===e?1:0)}b();return c};function ue(a,b,c){var d=[];ve(a,b,c,d);return d}function ve(a,b,c,d){for(a=a.__shady_firstChild;a;a=a.__shady_nextSibling){var e;if(e=a.nodeType===Node.ELEMENT_NODE){e=a;var f=b,g=c,h=d,k=f(e);k&&h.push(e);g&&g(k)?e=k:(ve(e,f,g,h),e=void 0)}if(e)break}}
var we={get firstElementChild(){var a=I(this);if(a&&void 0!==a.firstChild){for(a=this.__shady_firstChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.__shady_nextSibling;return a}return this.__shady_native_firstElementChild},get lastElementChild(){var a=I(this);if(a&&void 0!==a.lastChild){for(a=this.__shady_lastChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.__shady_previousSibling;return a}return this.__shady_native_lastElementChild},get children(){return nc(this)?xc(Array.prototype.filter.call(zc(this),
function(a){return a.nodeType===Node.ELEMENT_NODE})):this.__shady_native_children},get childElementCount(){var a=this.__shady_children;return a?a.length:0}},xe=M((we.append=function(){this.__shady_insertBefore(Ec.apply(null,w(A.apply(0,arguments))),null)},we.prepend=function(){this.__shady_insertBefore(Ec.apply(null,w(A.apply(0,arguments))),this.__shady_firstChild)},we.replaceChildren=function(){for(var a=A.apply(0,arguments),b;null!==(b=this.__shady_firstChild);)this.__shady_removeChild(b);this.__shady_insertBefore(Ec.apply(null,
w(a)),null)},we));
function ye(a,b){function c(e,f){return(e===a||-1===f.indexOf(":scope"))&&qc.call(e,f)}var d=te(b);if(1>d.length)return[];for(b=Fc(ue(a,function(){return!0}).map(function(e){return Fc(d.map(function(f){var g=f.ob,h=g.length-1;return c(e,g[h])?{target:e,Y:f,aa:e,index:h}:[]}))}));b.some(function(e){return 0<e.index});)b=Fc(b.map(function(e){if(0>=e.index)return e;var f=e.target,g=e.aa,h=e.Y;e=e.index-1;var k=h.Bc[e],l=h.ob[e];if(" "===k){k=[];for(g=g.__shady_parentElement;g;g=g.__shady_parentElement)c(g,l)&&
k.push({target:f,Y:h,aa:g,index:e});return k}if(">"===k)return g=g.__shady_parentElement,c(g,l)?{target:f,Y:h,aa:g,index:e}:[];if("+"===k)return(g=g.__shady_previousElementSibling)&&c(g,l)?{target:f,Y:h,aa:g,index:e}:[];if("~"===k){k=[];for(g=g.__shady_previousElementSibling;g;g=g.__shady_previousElementSibling)c(g,l)&&k.push({target:f,Y:h,aa:g,index:e});return k}throw Error("Unrecognized combinator: '"+k+"'.");}));return Gc(b.map(function(e){return e.target}))}
var ze=J.querySelectorImplementation,Ae=M({querySelector:function(a){if("native"===ze){var b=Array.prototype.slice.call((this instanceof ShadowRoot?this.host:this).__shady_native_querySelectorAll(a)),c=this.__shady_getRootNode();b=ea(b);for(var d=b.next();!d.done;d=b.next())if(d=d.value,d.__shady_getRootNode()==c)return d;return null}if("selectorEngine"===ze)return ye(this,a)[0]||null;if(void 0===ze)return ue(this,function(e){return qc.call(e,a)},function(e){return!!e})[0]||null;throw Error("Unrecognized value of ShadyDOM.querySelectorImplementation: '"+
(ze+"'"));},querySelectorAll:function(a,b){if(b||"native"===ze){b=Array.prototype.slice.call((this instanceof ShadowRoot?this.host:this).__shady_native_querySelectorAll(a));var c=this.__shady_getRootNode();return xc(b.filter(function(d){return d.__shady_getRootNode()==c}))}if("selectorEngine"===ze)return xc(ye(this,a));if(void 0===ze)return xc(ue(this,function(d){return qc.call(d,a)}));throw Error("Unrecognized value of ShadyDOM.querySelectorImplementation: '"+(ze+"'"));}}),Be=J.ca&&!J.noPatch?Cc({},
xe):xe;Cc(xe,Ae);var Ce=M({after:function(){var a=this.__shady_parentNode;if(null!==a){var b=this.__shady_nextSibling;a.__shady_insertBefore(Ec.apply(null,w(A.apply(0,arguments))),b)}},before:function(){var a=this.__shady_parentNode;null!==a&&a.__shady_insertBefore(Ec.apply(null,w(A.apply(0,arguments))),this)},remove:function(){var a=this.__shady_parentNode;null!==a&&a.__shady_removeChild(this)},replaceWith:function(){var a=A.apply(0,arguments),b=this.__shady_parentNode;if(null!==b){var c=this.__shady_nextSibling;
b.__shady_removeChild(this);b.__shady_insertBefore(Ec.apply(null,w(a)),c)}}});var De=window.document;function Ee(a,b){"slot"===b?(a=a.__shady_parentNode,oc(a)&&I(a).root.u()):"slot"===a.localName&&"name"===b&&(b=me(a))&&(b.wc(a),b.u())}
var Fe=M({get previousElementSibling(){var a=I(this);if(a&&void 0!==a.previousSibling){for(a=this.__shady_previousSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.__shady_previousSibling;return a}return this.__shady_native_previousElementSibling},get nextElementSibling(){var a=I(this);if(a&&void 0!==a.nextSibling){for(a=this.__shady_nextSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.__shady_nextSibling;return a}return this.__shady_native_nextElementSibling},get slot(){return this.getAttribute("slot")},
set slot(a){this.__shady_setAttribute("slot",a)},get className(){return this.getAttribute("class")||""},set className(a){this.__shady_setAttribute("class",a)},setAttribute:function(a,b){this.ownerDocument!==De?this.__shady_native_setAttribute(a,b):Zd(this,a,b)||(this.__shady_native_setAttribute(a,b),Ee(this,a))},removeAttribute:function(a){this.ownerDocument!==De?this.__shady_native_removeAttribute(a):Zd(this,a,"")?""===this.getAttribute(a)&&this.__shady_native_removeAttribute(a):(this.__shady_native_removeAttribute(a),
Ee(this,a))},toggleAttribute:function(a,b){if(this.ownerDocument!==De)return this.__shady_native_toggleAttribute(a,b);if(!Zd(this,a,""))return b=this.__shady_native_toggleAttribute(a,b),Ee(this,a),b;if(""===this.getAttribute(a)&&!b)return this.__shady_native_toggleAttribute(a,b)}});J.ca||Qd.forEach(function(a){Fe[a]=Sd(a)});
var Je=M({attachShadow:function(a){if(!this)throw Error("Must provide a host.");if(!a)throw Error("Not enough arguments.");if(a.shadyUpgradeFragment&&!J.zb){var b=a.shadyUpgradeFragment;b.__proto__=ShadowRoot.prototype;b.bb(this,a);Ge(b,b);a=b.__noInsertionPoint?null:b.querySelectorAll("slot");b.__noInsertionPoint=void 0;a&&a.length&&(b.Ra(a),b.u());b.host.__shady_native_appendChild(b)}else b=new He(Ie,this,a);return this.__CE_shadowRoot=b},get shadowRoot(){var a=I(this);return a&&a.Qc||null}});
Cc(Fe,Je);var Ke=document.implementation.createHTMLDocument("inert"),Le=M({get innerHTML(){return nc(this)?Wc("template"===this.localName?this.content:this,zc):this.__shady_native_innerHTML},set innerHTML(a){if("template"===this.localName)this.__shady_native_innerHTML=a;else{ie(this);var b=this.localName||"div";b=this.namespaceURI&&this.namespaceURI!==Ke.namespaceURI?Ke.createElementNS(this.namespaceURI,b):Ke.createElement(b);for(J.j?b.__shady_native_innerHTML=a:b.innerHTML=a;a=b.__shady_firstChild;)this.__shady_insertBefore(a)}}});var Me=M({blur:function(){var a=I(this);(a=(a=a&&a.root)&&a.activeElement)?a.__shady_blur():this.__shady_native_blur()}});J.ca||Rd.forEach(function(a){Me[a]=Sd(a)});var Ne=M({assignedNodes:function(a){if("slot"===this.localName){var b=this.__shady_getRootNode();b&&K(b)&&b.la();return(b=I(this))?(a&&a.flatten?b.T:b.assignedNodes)||[]:[]}},addEventListener:function(a,b,c){if("slot"!==this.localName||"slotchange"===a)Id.call(this,a,b,c);else{"object"!==typeof c&&(c={capture:!!c});var d=this.__shady_parentNode;if(!d)throw Error("ShadyDOM cannot attach event to slot unless it has a `parentNode`");c.K=this;d.__shady_addEventListener(a,b,c)}},removeEventListener:function(a,
b,c){if("slot"!==this.localName||"slotchange"===a)Jd.call(this,a,b,c);else{"object"!==typeof c&&(c={capture:!!c});var d=this.__shady_parentNode;if(!d)throw Error("ShadyDOM cannot attach event to slot unless it has a `parentNode`");c.K=this;d.__shady_removeEventListener(a,b,c)}}});var Oe=M({getElementById:function(a){return""===a?null:ue(this,function(b){return b.id==a},function(b){return!!b})[0]||null}});function Pe(a,b){for(var c;b&&!a.has(c=b.__shady_getRootNode());)b=c.host;return b}function Qe(a){var b=new Set;for(b.add(a);K(a)&&a.host;)a=a.host.__shady_getRootNode(),b.add(a);return b}
var Re="__shady_native_"+mc(),Se=M({get activeElement(){var a=J.j?document.__shady_native_activeElement:document.activeElement;if(!a||!a.nodeType)return null;var b=!!K(this);if(!(this===document||b&&this.host!==a&&this.host.__shady_native_contains(a)))return null;for(b=me(a);b&&b!==this;)a=b.host,b=me(a);return this===document?b?null:a:b===this?a:null},elementsFromPoint:function(a,b){a=document[Re](a,b);if(this===document&&J.useNativeDocumentEFP)return a;a=[].slice.call(a);b=Qe(this);for(var c=new Set,
d=0;d<a.length;d++)c.add(Pe(b,a[d]));var e=[];c.forEach(function(f){return e.push(f)});return e},elementFromPoint:function(a,b){return this===document&&J.useNativeDocumentEFP?this.__shady_native_elementFromPoint(a,b):this.__shady_elementsFromPoint(a,b)[0]||null}});var Te=window.document,Ue=M({importNode:function(a,b){if(a.ownerDocument!==Te||"template"===a.localName)return this.__shady_native_importNode(a,b);var c=this.__shady_native_importNode(a,!1);if(b)for(a=a.__shady_firstChild;a;a=a.__shady_nextSibling)b=this.__shady_importNode(a,!0),c.__shady_appendChild(b);return c}});var Ve=M({dispatchEvent:Gd,addEventListener:Id.bind(window),removeEventListener:Jd.bind(window)});var We={};Object.getOwnPropertyDescriptor(HTMLElement.prototype,"parentElement")&&(We.parentElement=pe.parentElement);Object.getOwnPropertyDescriptor(HTMLElement.prototype,"contains")&&(We.contains=pe.contains);Object.getOwnPropertyDescriptor(HTMLElement.prototype,"children")&&(We.children=xe.children);Object.getOwnPropertyDescriptor(HTMLElement.prototype,"innerHTML")&&(We.innerHTML=Le.innerHTML);Object.getOwnPropertyDescriptor(HTMLElement.prototype,"className")&&(We.className=Fe.className);
var Xe={EventTarget:[Wd],Node:[pe,window.EventTarget?null:Wd],Text:[qe],Comment:[qe],CDATASection:[qe],ProcessingInstruction:[qe],Element:[Fe,xe,Ce,qe,!J.j||"innerHTML"in Element.prototype?Le:null,window.HTMLSlotElement?null:Ne],HTMLElement:[Me,We],HTMLSlotElement:[Ne],DocumentFragment:[Be,Oe],Document:[Ue,Be,Oe,Se],Window:[Ve],CharacterData:[Ce],XMLHttpRequest:[window.EventTarget?null:Wd]},Ye=J.j?null:["innerHTML","textContent"];
function Ze(a,b,c,d){b.forEach(function(e){return a&&e&&L(a,e,c,d)})}function $e(a){var b=a?null:Ye,c;for(c in Xe)Ze(window[c]&&window[c].prototype,Xe[c],a,b)}["Text","Comment","CDATASection","ProcessingInstruction"].forEach(function(a){var b=window[a],c=Object.create(b.prototype);c.__shady_protoIsPatched=!0;Ze(c,Xe.EventTarget);Ze(c,Xe.Node);Xe[a]&&Ze(c,Xe[a]);b.prototype.__shady_patchedProto=c});
function af(a){a.__shady_protoIsPatched=!0;Ze(a,Xe.EventTarget);Ze(a,Xe.Node);Ze(a,Xe.Element);Ze(a,Xe.HTMLElement);Ze(a,Xe.HTMLSlotElement);return a};var bf=J.Ma,cf=J.j;function df(a,b){if(bf&&!a.__shady_protoIsPatched&&!K(a)){var c=Object.getPrototypeOf(a),d=c.hasOwnProperty("__shady_patchedProto")&&c.__shady_patchedProto;d||(d=Object.create(c),af(d),c.__shady_patchedProto=d);Object.setPrototypeOf(a,d)}cf||(1===b?ld(a):2===b&&md(a))}
function ef(a,b,c,d){df(a,1);d=d||null;var e=H(a),f=d?H(d):null;e.previousSibling=d?f.previousSibling:b.__shady_lastChild;if(f=I(e.previousSibling))f.nextSibling=a;if(f=I(e.nextSibling=d))f.previousSibling=a;e.parentNode=b;d?d===c.firstChild&&(c.firstChild=a):(c.lastChild=a,c.firstChild||(c.firstChild=a));c.childNodes=null}
function ne(a,b,c){df(b,2);var d=H(b);void 0!==d.firstChild&&(d.childNodes=null);if(a.nodeType===Node.DOCUMENT_FRAGMENT_NODE)for(a=a.__shady_native_firstChild;a;a=a.__shady_native_nextSibling)ef(a,b,d,c);else ef(a,b,d,c)}
function oe(a,b){var c=H(a);b=H(b);a===b.firstChild&&(b.firstChild=c.nextSibling);a===b.lastChild&&(b.lastChild=c.previousSibling);a=c.previousSibling;var d=c.nextSibling;a&&(H(a).nextSibling=d);d&&(H(d).previousSibling=a);c.parentNode=c.previousSibling=c.nextSibling=void 0;void 0!==b.childNodes&&(b.childNodes=null)}
function Ge(a,b){var c=H(a);if(b||void 0===c.firstChild){c.childNodes=null;var d=c.firstChild=a.__shady_native_firstChild;c.lastChild=a.__shady_native_lastChild;df(a,2);c=d;for(d=void 0;c;c=c.__shady_native_nextSibling){var e=H(c);e.parentNode=b||a;e.nextSibling=c.__shady_native_nextSibling;e.previousSibling=d||null;d=c;df(c,1)}}};var ff=M({addEventListener:function(a,b,c){"object"!==typeof c&&(c={capture:!!c});c.K=c.K||this;this.host.__shady_addEventListener(a,b,c)},removeEventListener:function(a,b,c){"object"!==typeof c&&(c={capture:!!c});c.K=c.K||this;this.host.__shady_removeEventListener(a,b,c)}});function gf(a,b){L(a,ff,b);L(a,Se,b);L(a,Le,b);L(a,xe,b);J.noPatch&&!b?(L(a,pe,b),L(a,Oe,b)):J.j||(L(a,id),L(a,gd),L(a,hd))};var Ie={},hf=J.deferConnectionCallbacks&&"loading"===document.readyState,jf;function kf(a){var b=[];do b.unshift(a);while(a=a.__shady_parentNode);return b}function He(a,b,c){if(a!==Ie)throw new TypeError("Illegal constructor");this.g=null;this.bb(b,c)}n=He.prototype;
n.bb=function(a,b){this.host=a;this.mode=b&&b.mode;Ge(this.host);a=H(this.host);a.root=this;a.Qc="closed"!==this.mode?this:null;a=H(this);a.firstChild=a.lastChild=a.parentNode=a.nextSibling=a.previousSibling=null;if(J.preferPerformance)for(;a=this.host.__shady_native_firstChild;)this.host.__shady_native_removeChild(a);else this.u()};n.u=function(){var a=this;this.P||(this.P=!0,Jc(function(){return a.la()}))};n.Vb=function(){for(var a,b=this;b;)b.P&&(a=b),b=b.Ub();return a};
n.Ub=function(){var a=this.host.__shady_getRootNode();if(K(a)){var b=I(this.host);if(b&&0<b.ga)return a}};n.la=function(){var a=this.P&&this.Vb();a&&a._renderSelf()};n.Qb=function(){!this.ab&&this.P&&this.la()};
n._renderSelf=function(){var a=hf;hf=!0;this.P=!1;this.g&&(this.Lb(),this.Jb());if(!J.preferPerformance&&!this.ab)for(var b=this.host.__shady_firstChild;b;b=b.__shady_nextSibling){var c=I(b);b.__shady_native_parentNode!==this.host||"slot"!==b.localName&&c.assignedSlot||this.host.__shady_native_removeChild(b)}this.ab=!0;hf=a;jf&&jf()};
n.Lb=function(){this.pa();for(var a=0,b;a<this.g.length;a++)b=this.g[a],this.Ib(b);for(a=this.host.__shady_firstChild;a;a=a.__shady_nextSibling)this.Ua(a);for(a=0;a<this.g.length;a++){b=this.g[a];var c=I(b);if(!c.assignedNodes.length)for(var d=b.__shady_firstChild;d;d=d.__shady_nextSibling)this.Ua(d,b);(d=(d=I(b.__shady_parentNode))&&d.root)&&(d.Za()||d.P)&&d._renderSelf();this.Qa(c.T,c.assignedNodes);if(d=c.gb){for(var e=0;e<d.length;e++)I(d[e]).Ea=null;c.gb=null;d.length>c.assignedNodes.length&&
(c.Ja=!0)}c.Ja&&(c.Ja=!1,this.Wa(b))}};n.Ua=function(a,b){var c=H(a),d=c.Ea;c.Ea=null;b||(b=(b=this.i[a.__shady_slot||"__catchall"])&&b[0]);b?(H(b).assignedNodes.push(a),c.assignedSlot=b):c.assignedSlot=void 0;d!==c.assignedSlot&&c.assignedSlot&&(H(c.assignedSlot).Ja=!0)};n.Ib=function(a){var b=I(a),c=b.assignedNodes;b.assignedNodes=[];b.T=[];if(b.gb=c)for(b=0;b<c.length;b++){var d=I(c[b]);d.Ea=d.assignedSlot;d.assignedSlot===a&&(d.assignedSlot=null)}};
n.Qa=function(a,b){for(var c=0,d=void 0;c<b.length&&(d=b[c]);c++)if("slot"==d.localName){var e=I(d).assignedNodes;e&&e.length&&this.Qa(a,e)}else a.push(b[c])};n.Wa=function(a){a.__shady_native_dispatchEvent(new Event("slotchange"));a=I(a);a.assignedSlot&&this.Wa(a.assignedSlot)};n.Jb=function(){for(var a=this.g,b=[],c=0;c<a.length;c++){var d=a[c].__shady_parentNode,e=I(d);e&&e.root||!(0>b.indexOf(d))||b.push(d)}for(a=0;a<b.length;a++)c=b[a],this.vc(c===this?this.host:c,this.Kb(c))};
n.Kb=function(a){var b=[];for(a=a.__shady_firstChild;a;a=a.__shady_nextSibling)if(this.Yb(a))for(var c=I(a).T,d=0;d<c.length;d++)b.push(c[d]);else b.push(a);return b};n.Yb=function(a){return"slot"==a.localName};
n.vc=function(a,b){for(var c=yc(a),d=Ud(b,b.length,c,c.length),e=0,f=0,g=void 0;e<d.length&&(g=d[e]);e++){for(var h=0,k=void 0;h<g.da.length&&(k=g.da[h]);h++)k.__shady_native_parentNode===a&&a.__shady_native_removeChild(k),c.splice(g.index+f,1);f-=g.qa}e=0;for(f=void 0;e<d.length&&(f=d[e]);e++)for(g=c[f.index],h=f.index;h<f.index+f.qa;h++)k=b[h],a.__shady_native_insertBefore(k,g),c.splice(h,0,k)};n.Pb=function(){this.H=this.H||[];this.g=this.g||[];this.i=this.i||{}};
n.Ra=function(a){this.Pb();this.H.push.apply(this.H,w(a))};n.pa=function(){this.H&&this.H.length&&(this.cc(this.H),this.H=[])};n.cc=function(a){for(var b,c=0;c<a.length;c++){var d=a[c];Ge(d);var e=d.__shady_parentNode;Ge(e);e=I(e);e.ga=(e.ga||0)+1;e=this.eb(d);this.i[e]?(b=b||{},b[e]=!0,this.i[e].push(d)):this.i[e]=[d];this.g.push(d)}if(b)for(var f in b)this.i[f]=this.jb(this.i[f])};n.eb=function(a){var b=a.name||a.getAttribute("name")||"__catchall";return a.Db=b};
n.jb=function(a){return a.sort(function(b,c){b=kf(b);for(var d=kf(c),e=0;e<b.length;e++){c=b[e];var f=d[e];if(c!==f)return b=zc(c.__shady_parentNode),b.indexOf(c)-b.indexOf(f)}})};n.ic=function(a){if(this.g){this.pa();var b=this.i,c;for(c in b)for(var d=b[c],e=0;e<d.length;e++){var f=d[e];if(wc(a,f)){d.splice(e,1);var g=this.g.indexOf(f);0<=g&&(this.g.splice(g,1),(g=I(f.__shady_parentNode))&&g.ga&&g.ga--);e--;this.jc(f);g=!0}}return g}};
n.wc=function(a){if(this.g){this.pa();var b=a.Db,c=this.eb(a);if(c!==b){b=this.i[b];var d=b.indexOf(a);0<=d&&b.splice(d,1);b=this.i[c]||(this.i[c]=[]);b.push(a);1<b.length&&(this.i[c]=this.jb(b))}}};n.jc=function(a){a=I(a);var b=a.T;if(b)for(var c=0;c<b.length;c++){var d=b[c],e=d.__shady_native_parentNode;e&&e.__shady_native_removeChild(d)}a.T=[];a.assignedNodes=[]};n.Za=function(){this.pa();return!(!this.g||!this.g.length)};
(function(a){a.__proto__=DocumentFragment.prototype;gf(a,"__shady_");gf(a);Object.defineProperties(a,{nodeType:{value:Node.DOCUMENT_FRAGMENT_NODE,configurable:!0},nodeName:{value:"#document-fragment",configurable:!0},nodeValue:{value:null,configurable:!0}});["localName","namespaceURI","prefix"].forEach(function(b){Object.defineProperty(a,b,{value:void 0,configurable:!0})});["ownerDocument","baseURI","isConnected"].forEach(function(b){Object.defineProperty(a,b,{get:function(){return this.host[b]},
configurable:!0})})})(He.prototype);
if(window.customElements&&window.customElements.define&&J.inUse&&!J.preferPerformance){var lf=new Map;jf=function(){var a=[];lf.forEach(function(d,e){a.push([e,d])});lf.clear();for(var b=0;b<a.length;b++){var c=a[b][0];a[b][1]?c.__shadydom_connectedCallback():c.__shadydom_disconnectedCallback()}};hf&&document.addEventListener("readystatechange",function(){hf=!1;jf()},{once:!0});var mf=function(a,b,c){var d=0,e="__isConnected"+d++;if(b||c)a.prototype.connectedCallback=a.prototype.__shadydom_connectedCallback=
function(){hf?lf.set(this,!0):this[e]||(this[e]=!0,b&&b.call(this))},a.prototype.disconnectedCallback=a.prototype.__shadydom_disconnectedCallback=function(){hf?this.isConnected||lf.set(this,!1):this[e]&&(this[e]=!1,c&&c.call(this))};return a},nf=window.customElements.define,of=function(a,b){var c=b.prototype.connectedCallback,d=b.prototype.disconnectedCallback;nf.call(window.customElements,a,mf(b,c,d));b.prototype.connectedCallback=c;b.prototype.disconnectedCallback=d};window.customElements.define=
of;Object.defineProperty(window.CustomElementRegistry.prototype,"define",{value:of,configurable:!0})}function me(a){a=a.__shady_getRootNode();if(K(a))return a};function pf(a){this.node=a}n=pf.prototype;n.addEventListener=function(a,b,c){return this.node.__shady_addEventListener(a,b,c)};n.removeEventListener=function(a,b,c){return this.node.__shady_removeEventListener(a,b,c)};n.appendChild=function(a){return this.node.__shady_appendChild(a)};n.insertBefore=function(a,b){return this.node.__shady_insertBefore(a,b)};n.removeChild=function(a){return this.node.__shady_removeChild(a)};n.replaceChild=function(a,b){return this.node.__shady_replaceChild(a,b)};
n.cloneNode=function(a){return this.node.__shady_cloneNode(a)};n.getRootNode=function(a){return this.node.__shady_getRootNode(a)};n.contains=function(a){return this.node.__shady_contains(a)};n.dispatchEvent=function(a){return this.node.__shady_dispatchEvent(a)};n.setAttribute=function(a,b){this.node.__shady_setAttribute(a,b)};n.getAttribute=function(a){return this.node.__shady_native_getAttribute(a)};n.hasAttribute=function(a){return this.node.__shady_native_hasAttribute(a)};n.removeAttribute=function(a){this.node.__shady_removeAttribute(a)};
n.toggleAttribute=function(a,b){return this.node.__shady_toggleAttribute(a,b)};n.attachShadow=function(a){return this.node.__shady_attachShadow(a)};n.focus=function(){this.node.__shady_native_focus()};n.blur=function(){this.node.__shady_blur()};n.importNode=function(a,b){if(this.node.nodeType===Node.DOCUMENT_NODE)return this.node.__shady_importNode(a,b)};n.getElementById=function(a){if(this.node.nodeType===Node.DOCUMENT_NODE)return this.node.__shady_getElementById(a)};
n.elementsFromPoint=function(a,b){return this.node.__shady_elementsFromPoint(a,b)};n.elementFromPoint=function(a,b){return this.node.__shady_elementFromPoint(a,b)};n.querySelector=function(a){return this.node.__shady_querySelector(a)};n.querySelectorAll=function(a,b){return this.node.__shady_querySelectorAll(a,b)};n.assignedNodes=function(a){if("slot"===this.node.localName)return this.node.__shady_assignedNodes(a)};n.append=function(){return this.node.__shady_append.apply(this.node,w(A.apply(0,arguments)))};
n.prepend=function(){return this.node.__shady_prepend.apply(this.node,w(A.apply(0,arguments)))};n.replaceChildren=function(){return this.node.__shady_replaceChildren.apply(this.node,w(A.apply(0,arguments)))};n.after=function(){return this.node.__shady_after.apply(this.node,w(A.apply(0,arguments)))};n.before=function(){return this.node.__shady_before.apply(this.node,w(A.apply(0,arguments)))};n.remove=function(){return this.node.__shady_remove()};
n.replaceWith=function(){return this.node.__shady_replaceWith.apply(this.node,w(A.apply(0,arguments)))};
ca.Object.defineProperties(pf.prototype,{activeElement:{configurable:!0,enumerable:!0,get:function(){if(K(this.node)||this.node.nodeType===Node.DOCUMENT_NODE)return this.node.__shady_activeElement}},_activeElement:{configurable:!0,enumerable:!0,get:function(){return this.activeElement}},host:{configurable:!0,enumerable:!0,get:function(){if(K(this.node))return this.node.host}},parentNode:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_parentNode}},firstChild:{configurable:!0,
enumerable:!0,get:function(){return this.node.__shady_firstChild}},lastChild:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_lastChild}},nextSibling:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_nextSibling}},previousSibling:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_previousSibling}},childNodes:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_childNodes}},parentElement:{configurable:!0,enumerable:!0,
get:function(){return this.node.__shady_parentElement}},firstElementChild:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_firstElementChild}},lastElementChild:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_lastElementChild}},nextElementSibling:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_nextElementSibling}},previousElementSibling:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_previousElementSibling}},
children:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_children}},childElementCount:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_childElementCount}},shadowRoot:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_shadowRoot}},assignedSlot:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_assignedSlot}},isConnected:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_isConnected}},innerHTML:{configurable:!0,
enumerable:!0,get:function(){return this.node.__shady_innerHTML},set:function(a){this.node.__shady_innerHTML=a}},textContent:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_textContent},set:function(a){this.node.__shady_textContent=a}},slot:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_slot},set:function(a){this.node.__shady_slot=a}},className:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_className},set:function(a){this.node.__shady_className=
a}}});function qf(a){Object.defineProperty(pf.prototype,a,{get:function(){return this.node["__shady_"+a]},set:function(b){this.node["__shady_"+a]=b},configurable:!0})}Qd.forEach(function(a){return qf(a)});Rd.forEach(function(a){return qf(a)});var rf=new WeakMap;function sf(a){if(K(a)||a instanceof pf)return a;var b=rf.get(a);b||(b=new pf(a),rf.set(a,b));return b};if(J.inUse){var tf=J.j?function(a){return a}:function(a){md(a);ld(a);return a};window.ShadyDOM={inUse:J.inUse,patch:tf,isShadyRoot:K,enqueue:Jc,flush:Kc,flushInitial:function(a){a.Qb()},settings:J,filterMutations:Pc,observeChildren:Nc,unobserveChildren:Oc,deferConnectionCallbacks:J.deferConnectionCallbacks,preferPerformance:J.preferPerformance,handlesDynamicScoping:!0,wrap:J.noPatch?sf:tf,wrapIfNeeded:!0===J.noPatch?sf:function(a){return a},Wrapper:pf,composedPath:vd,noPatch:J.noPatch,patchOnDemand:J.Ma,
nativeMethods:Yc,nativeTree:Zc,patchElementProto:af,querySelectorImplementation:J.querySelectorImplementation};fd();$e("__shady_");Object.defineProperty(document,"_activeElement",Se.activeElement);L(Window.prototype,Ve,"__shady_");J.noPatch?J.Ma&&L(Element.prototype,Je):($e(),Pd());Kd();window.Event=Md;window.CustomEvent=Nd;window.MouseEvent=Od;window.ShadowRoot=He};var uf=window.Document.prototype.createElement,vf=window.Document.prototype.createElementNS,wf=window.Document.prototype.importNode,xf=window.Document.prototype.prepend,yf=window.Document.prototype.append,zf=window.DocumentFragment.prototype.prepend,Af=window.DocumentFragment.prototype.append,Bf=window.Node.prototype.cloneNode,Cf=window.Node.prototype.appendChild,Df=window.Node.prototype.insertBefore,Ef=window.Node.prototype.removeChild,Ff=window.Node.prototype.replaceChild,Gf=Object.getOwnPropertyDescriptor(window.Node.prototype,
"textContent"),Hf=window.Element.prototype.attachShadow,If=Object.getOwnPropertyDescriptor(window.Element.prototype,"innerHTML"),Jf=window.Element.prototype.getAttribute,Kf=window.Element.prototype.setAttribute,Lf=window.Element.prototype.removeAttribute,Mf=window.Element.prototype.toggleAttribute,Nf=window.Element.prototype.getAttributeNS,Of=window.Element.prototype.setAttributeNS,Pf=window.Element.prototype.removeAttributeNS,Qf=window.Element.prototype.insertAdjacentElement,Rf=window.Element.prototype.insertAdjacentHTML,
Sf=window.Element.prototype.prepend,Tf=window.Element.prototype.append,Uf=window.Element.prototype.before,Vf=window.Element.prototype.after,Wf=window.Element.prototype.replaceWith,Xf=window.Element.prototype.remove,Yf=window.HTMLElement,Zf=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML"),$f=window.HTMLElement.prototype.insertAdjacentElement,ag=window.HTMLElement.prototype.insertAdjacentHTML;var bg=function(){var a=new Set;"annotation-xml color-profile font-face font-face-src font-face-uri font-face-format font-face-name missing-glyph".split(" ").forEach(function(b){return a.add(b)});return a}();function cg(a){var b=bg.has(a);a=/^[a-z][.0-9_a-z]*-[-.0-9_a-z]*$/.test(a);return!b&&a}var dg=document.contains?document.contains.bind(document):document.documentElement.contains.bind(document.documentElement);
function S(a){var b=a.isConnected;if(void 0!==b)return b;if(dg(a))return!0;for(;a&&!(a.__CE_isImportDocument||a instanceof Document);)a=a.parentNode||(window.ShadowRoot&&a instanceof ShadowRoot?a.host:void 0);return!(!a||!(a.__CE_isImportDocument||a instanceof Document))}function eg(a){var b=a.children;if(b)return Array.prototype.slice.call(b);b=[];for(a=a.firstChild;a;a=a.nextSibling)a.nodeType===Node.ELEMENT_NODE&&b.push(a);return b}
function fg(a,b){for(;b&&b!==a&&!b.nextSibling;)b=b.parentNode;return b&&b!==a?b.nextSibling:null}
function gg(a,b,c){for(var d=a;d;){if(d.nodeType===Node.ELEMENT_NODE){var e=d;b(e);var f=e.localName;if("link"===f&&"import"===e.getAttribute("rel")){d=e.import;void 0===c&&(c=new Set);if(d instanceof Node&&!c.has(d))for(c.add(d),d=d.firstChild;d;d=d.nextSibling)gg(d,b,c);d=fg(a,e);continue}else if("template"===f){d=fg(a,e);continue}if(e=e.__CE_shadowRoot)for(e=e.firstChild;e;e=e.nextSibling)gg(e,b,c)}d=d.firstChild?d.firstChild:fg(a,d)}};function hg(){var a=!(null==ig||!ig.noDocumentConstructionObserver),b=!(null==ig||!ig.shadyDomFastWalk);this.X=[];this.Da=[];this.N=!1;this.shadyDomFastWalk=b;this.Zc=!a}function jg(a,b,c,d){var e=window.ShadyDOM;if(a.shadyDomFastWalk&&e&&e.inUse){if(b.nodeType===Node.ELEMENT_NODE&&c(b),b.querySelectorAll)for(a=e.nativeMethods.querySelectorAll.call(b,"*"),b=0;b<a.length;b++)c(a[b])}else gg(b,c,d)}function kg(a,b){a.N=!0;a.X.push(b)}function lg(a,b){a.N=!0;a.Da.push(b)}
function mg(a,b){a.N&&jg(a,b,function(c){return ng(a,c)})}function ng(a,b){if(a.N&&!b.__CE_patched){b.__CE_patched=!0;for(var c=0;c<a.X.length;c++)a.X[c](b);for(c=0;c<a.Da.length;c++)a.Da[c](b)}}function og(a,b){var c=[];jg(a,b,function(e){return c.push(e)});for(b=0;b<c.length;b++){var d=c[b];1===d.__CE_state?a.connectedCallback(d):pg(a,d)}}function qg(a,b){var c=[];jg(a,b,function(e){return c.push(e)});for(b=0;b<c.length;b++){var d=c[b];1===d.__CE_state&&a.disconnectedCallback(d)}}
function rg(a,b,c){c=void 0===c?{}:c;var d=c.ad,e=c.upgrade||function(g){return pg(a,g)},f=[];jg(a,b,function(g){a.N&&ng(a,g);if("link"===g.localName&&"import"===g.getAttribute("rel")){var h=g.import;h instanceof Node&&(h.__CE_isImportDocument=!0,h.__CE_registry=document.__CE_registry);h&&"complete"===h.readyState?h.__CE_documentLoadHandled=!0:g.addEventListener("load",function(){var k=g.import;if(!k.__CE_documentLoadHandled){k.__CE_documentLoadHandled=!0;var l=new Set;d&&(d.forEach(function(p){return l.add(p)}),
l.delete(k));rg(a,k,{ad:l,upgrade:e})}})}else f.push(g)},d);for(b=0;b<f.length;b++)e(f[b])}function pg(a,b){try{var c=a.bc(b.ownerDocument,b.localName);c&&a.xc(b,c)}catch(d){sg(d)}}n=hg.prototype;
n.xc=function(a,b){if(void 0===a.__CE_state){b.constructionStack.push(a);try{try{if(new b.constructorFunction!==a)throw Error("The custom element constructor did not produce the element being upgraded.");}finally{b.constructionStack.pop()}}catch(f){throw a.__CE_state=2,f;}a.__CE_state=1;a.__CE_definition=b;if(b.attributeChangedCallback&&a.hasAttributes()){b=b.observedAttributes;for(var c=0;c<b.length;c++){var d=b[c],e=a.getAttribute(d);null!==e&&this.attributeChangedCallback(a,d,null,e,null)}}S(a)&&
this.connectedCallback(a)}};n.connectedCallback=function(a){var b=a.__CE_definition;if(b.connectedCallback)try{b.connectedCallback.call(a)}catch(c){sg(c)}};n.disconnectedCallback=function(a){var b=a.__CE_definition;if(b.disconnectedCallback)try{b.disconnectedCallback.call(a)}catch(c){sg(c)}};n.attributeChangedCallback=function(a,b,c,d,e){var f=a.__CE_definition;if(f.attributeChangedCallback&&-1<f.observedAttributes.indexOf(b))try{f.attributeChangedCallback.call(a,b,c,d,e)}catch(g){sg(g)}};
n.bc=function(a,b){var c=a.__CE_registry;if(c&&(a.defaultView||a.__CE_isImportDocument))return tg(c,b)};
function ug(a,b,c,d){var e=b.__CE_registry;if(e&&(null===d||"http://www.w3.org/1999/xhtml"===d)&&(e=tg(e,c)))try{var f=new e.constructorFunction;if(void 0===f.__CE_state||void 0===f.__CE_definition)throw Error("Failed to construct '"+c+"': The returned value was not constructed with the HTMLElement constructor.");if("http://www.w3.org/1999/xhtml"!==f.namespaceURI)throw Error("Failed to construct '"+c+"': The constructed element's namespace must be the HTML namespace.");if(f.hasAttributes())throw Error("Failed to construct '"+
c+"': The constructed element must not have any attributes.");if(null!==f.firstChild)throw Error("Failed to construct '"+c+"': The constructed element must not have any children.");if(null!==f.parentNode)throw Error("Failed to construct '"+c+"': The constructed element must not have a parent node.");if(f.ownerDocument!==b)throw Error("Failed to construct '"+c+"': The constructed element's owner document is incorrect.");if(f.localName!==c)throw Error("Failed to construct '"+c+"': The constructed element's local name is incorrect.");
return f}catch(g){return sg(g),b=null===d?uf.call(b,c):vf.call(b,d,c),Object.setPrototypeOf(b,HTMLUnknownElement.prototype),b.__CE_state=2,b.__CE_definition=void 0,ng(a,b),b}b=null===d?uf.call(b,c):vf.call(b,d,c);ng(a,b);return b}
function sg(a){var b="",c="",d=0,e=0;a instanceof Error?(b=a.message,c=a.sourceURL||a.fileName||"",d=a.line||a.lineNumber||0,e=a.column||a.columnNumber||0):b="Uncaught "+String(a);var f=void 0;void 0===ErrorEvent.prototype.initErrorEvent?f=new ErrorEvent("error",{cancelable:!0,message:b,filename:c,lineno:d,colno:e,error:a}):(f=document.createEvent("ErrorEvent"),f.initErrorEvent("error",!1,!0,b,c,d),f.preventDefault=function(){Object.defineProperty(this,"defaultPrevented",{configurable:!0,get:function(){return!0}})});
void 0===f.error&&Object.defineProperty(f,"error",{configurable:!0,enumerable:!0,get:function(){return a}});window.dispatchEvent(f);f.defaultPrevented||console.error(a)};function vg(){var a=this;this.s=void 0;this.hb=new Promise(function(b){a.mc=b})}vg.prototype.resolve=function(a){if(this.s)throw Error("Already resolved.");this.s=a;this.mc(a)};function wg(a){var b=document;this.O=void 0;this.G=a;this.ha=b;rg(this.G,this.ha);"loading"===this.ha.readyState&&(this.O=new MutationObserver(this.Xb.bind(this)),this.O.observe(this.ha,{childList:!0,subtree:!0}))}wg.prototype.disconnect=function(){this.O&&this.O.disconnect()};wg.prototype.Xb=function(a){var b=this.ha.readyState;"interactive"!==b&&"complete"!==b||this.disconnect();for(b=0;b<a.length;b++)for(var c=a[b].addedNodes,d=0;d<c.length;d++)rg(this.G,c[d])};function T(a){this.ja=new Map;this.ka=new Map;this.Ta=new Map;this.Aa=!1;this.Ia=new Map;this.ia=function(b){return b()};this.M=!1;this.oa=[];this.G=a;this.Va=a.Zc?new wg(a):void 0}n=T.prototype;n.Pc=function(a,b){var c=this;if(!(b instanceof Function))throw new TypeError("Custom element constructor getters must be functions.");xg(this,a);this.ja.set(a,b);this.oa.push(a);this.M||(this.M=!0,this.ia(function(){return c.Xa()}))};
n.define=function(a,b){var c=this;if(!(b instanceof Function))throw new TypeError("Custom element constructors must be functions.");xg(this,a);yg(this,a,b);this.oa.push(a);this.M||(this.M=!0,this.ia(function(){return c.Xa()}))};
function xg(a,b){if(!cg(b))throw new SyntaxError("The element name '"+b+"' is not valid.");if(tg(a,b)&&!window.enableHotReplacement)throw Error("A custom element with name '"+(b+"' has already been defined."));if(a.Aa)throw Error("A custom element is already being defined.");}
function yg(a,b,c){a.Aa=!0;var d;try{var e=c.prototype;if(!(e instanceof Object))throw new TypeError("The custom element constructor's prototype is not an object.");var f=function(p){var x=e[p];if(void 0!==x&&!(x instanceof Function))throw Error("The '"+p+"' callback must be a function.");return x};var g=f("connectedCallback");var h=f("disconnectedCallback");var k=f("adoptedCallback");var l=(d=f("attributeChangedCallback"))&&c.observedAttributes||[]}catch(p){throw p;}finally{a.Aa=!1}c={localName:b,
constructorFunction:c,connectedCallback:g,disconnectedCallback:h,adoptedCallback:k,attributeChangedCallback:d,observedAttributes:l,constructionStack:[]};a.ka.set(b,c);a.Ta.set(c.constructorFunction,c);return c}n.upgrade=function(a){rg(this.G,a)};
n.Xa=function(){var a=this;if(!1!==this.M){this.M=!1;for(var b=[],c=this.oa,d=new Map,e=0;e<c.length;e++)d.set(c[e],[]);rg(this.G,document,{upgrade:function(k){if(void 0===k.__CE_state){var l=k.localName,p=d.get(l);p?p.push(k):a.ka.has(l)&&b.push(k)}}});for(e=0;e<b.length;e++)pg(this.G,b[e]);for(e=0;e<c.length;e++){for(var f=c[e],g=d.get(f),h=0;h<g.length;h++)pg(this.G,g[h]);(f=this.Ia.get(f))&&f.resolve(void 0)}c.length=0}};n.get=function(a){if(a=tg(this,a))return a.constructorFunction};
n.whenDefined=function(a){if(!cg(a))return Promise.reject(new SyntaxError("'"+a+"' is not a valid custom element name."));var b=this.Ia.get(a);if(b)return b.hb;b=new vg;this.Ia.set(a,b);var c=this.ka.has(a)||this.ja.has(a);a=-1===this.oa.indexOf(a);c&&a&&b.resolve(void 0);return b.hb};n.polyfillWrapFlushCallback=function(a){this.Va&&this.Va.disconnect();var b=this.ia;this.ia=function(c){return a(function(){return b(c)})}};
function tg(a,b){var c=a.ka.get(b);if(c)return c;if(c=a.ja.get(b)){a.ja.delete(b);try{return yg(a,b,c())}catch(d){sg(d)}}}T.prototype.define=T.prototype.define;T.prototype.upgrade=T.prototype.upgrade;T.prototype.get=T.prototype.get;T.prototype.whenDefined=T.prototype.whenDefined;T.prototype.polyfillDefineLazy=T.prototype.Pc;T.prototype.polyfillWrapFlushCallback=T.prototype.polyfillWrapFlushCallback;function zg(a,b,c){function d(e){return function(){for(var f=A.apply(0,arguments),g=[],h=[],k=0;k<f.length;k++){var l=f[k];l instanceof Element&&S(l)&&h.push(l);if(l instanceof DocumentFragment)for(l=l.firstChild;l;l=l.nextSibling)g.push(l);else g.push(l)}e.apply(this,f);for(f=0;f<h.length;f++)qg(a,h[f]);if(S(this))for(h=0;h<g.length;h++)f=g[h],f instanceof Element&&og(a,f)}}void 0!==c.prepend&&(b.prepend=d(c.prepend));void 0!==c.append&&(b.append=d(c.append))};function Ag(a){Document.prototype.createElement=function(b){return ug(a,this,b,null)};Document.prototype.importNode=function(b,c){b=wf.call(this,b,!!c);this.__CE_registry?rg(a,b):mg(a,b);return b};Document.prototype.createElementNS=function(b,c){return ug(a,this,c,b)};zg(a,Document.prototype,{prepend:xf,append:yf})};function Bg(a){function b(d){return function(){for(var e=A.apply(0,arguments),f=[],g=[],h=0;h<e.length;h++){var k=e[h];k instanceof Element&&S(k)&&g.push(k);if(k instanceof DocumentFragment)for(k=k.firstChild;k;k=k.nextSibling)f.push(k);else f.push(k)}d.apply(this,e);for(e=0;e<g.length;e++)qg(a,g[e]);if(S(this))for(g=0;g<f.length;g++)e=f[g],e instanceof Element&&og(a,e)}}var c=Element.prototype;void 0!==Uf&&(c.before=b(Uf));void 0!==Vf&&(c.after=b(Vf));void 0!==Wf&&(c.replaceWith=function(){for(var d=
A.apply(0,arguments),e=[],f=[],g=0;g<d.length;g++){var h=d[g];h instanceof Element&&S(h)&&f.push(h);if(h instanceof DocumentFragment)for(h=h.firstChild;h;h=h.nextSibling)e.push(h);else e.push(h)}g=S(this);Wf.apply(this,d);for(d=0;d<f.length;d++)qg(a,f[d]);if(g)for(qg(a,this),f=0;f<e.length;f++)d=e[f],d instanceof Element&&og(a,d)});void 0!==Xf&&(c.remove=function(){var d=S(this);Xf.call(this);d&&qg(a,this)})};function Cg(a){function b(e,f){Object.defineProperty(e,"innerHTML",{enumerable:f.enumerable,configurable:!0,get:f.get,set:function(g){var h=this,k=void 0;S(this)&&(k=[],jg(a,this,function(x){x!==h&&k.push(x)}));f.set.call(this,g);if(k)for(var l=0;l<k.length;l++){var p=k[l];1===p.__CE_state&&a.disconnectedCallback(p)}this.ownerDocument.__CE_registry?rg(a,this):mg(a,this);return g}})}function c(e,f){e.insertAdjacentElement=function(g,h){var k=S(h);g=f.call(this,g,h);k&&qg(a,h);S(g)&&og(a,h);return g}}
function d(e,f){function g(h,k){for(var l=[];h!==k;h=h.nextSibling)l.push(h);for(k=0;k<l.length;k++)rg(a,l[k])}e.insertAdjacentHTML=function(h,k){h=h.toLowerCase();if("beforebegin"===h){var l=this.previousSibling;f.call(this,h,k);g(l||this.parentNode.firstChild,this)}else if("afterbegin"===h)l=this.firstChild,f.call(this,h,k),g(this.firstChild,l);else if("beforeend"===h)l=this.lastChild,f.call(this,h,k),g(l||this.firstChild,null);else if("afterend"===h)l=this.nextSibling,f.call(this,h,k),g(this.nextSibling,
l);else throw new SyntaxError("The value provided ("+String(h)+") is not one of 'beforebegin', 'afterbegin', 'beforeend', or 'afterend'.");}}Hf&&(Element.prototype.attachShadow=function(e){e=Hf.call(this,e);if(a.N&&!e.__CE_patched){e.__CE_patched=!0;for(var f=0;f<a.X.length;f++)a.X[f](e)}return this.__CE_shadowRoot=e});If&&If.get?b(Element.prototype,If):Zf&&Zf.get?b(HTMLElement.prototype,Zf):lg(a,function(e){b(e,{enumerable:!0,configurable:!0,get:function(){return Bf.call(this,!0).innerHTML},set:function(f){var g=
"template"===this.localName,h=g?this.content:this,k=vf.call(document,this.namespaceURI,this.localName);for(k.innerHTML=f;0<h.childNodes.length;)Ef.call(h,h.childNodes[0]);for(f=g?k.content:k;0<f.childNodes.length;)Cf.call(h,f.childNodes[0])}})});Element.prototype.setAttribute=function(e,f){if(1!==this.__CE_state)return Kf.call(this,e,f);var g=Jf.call(this,e);Kf.call(this,e,f);f=Jf.call(this,e);a.attributeChangedCallback(this,e,g,f,null)};Element.prototype.setAttributeNS=function(e,f,g){if(1!==this.__CE_state)return Of.call(this,
e,f,g);var h=Nf.call(this,e,f);Of.call(this,e,f,g);g=Nf.call(this,e,f);a.attributeChangedCallback(this,f,h,g,e)};Element.prototype.removeAttribute=function(e){if(1!==this.__CE_state)return Lf.call(this,e);var f=Jf.call(this,e);Lf.call(this,e);null!==f&&a.attributeChangedCallback(this,e,f,null,null)};Mf&&(Element.prototype.toggleAttribute=function(e,f){if(1!==this.__CE_state)return Mf.call(this,e,f);var g=Jf.call(this,e),h=null!==g;f=Mf.call(this,e,f);if(h!==f){var k;null==a||null==(k=a.attributeChangedCallback)||
k.call(a,this,e,g,f?"":null,null)}return f});Element.prototype.removeAttributeNS=function(e,f){if(1!==this.__CE_state)return Pf.call(this,e,f);var g=Nf.call(this,e,f);Pf.call(this,e,f);var h=Nf.call(this,e,f);g!==h&&a.attributeChangedCallback(this,f,g,h,e)};$f?c(HTMLElement.prototype,$f):Qf&&c(Element.prototype,Qf);ag?d(HTMLElement.prototype,ag):Rf&&d(Element.prototype,Rf);zg(a,Element.prototype,{prepend:Sf,append:Tf});Bg(a)};var Dg={};function Eg(a){function b(){var c=this.constructor;var d=document.__CE_registry.Ta.get(c);if(!d)throw Error("Failed to construct a custom element: The constructor was not registered with `customElements`.");var e=d.constructionStack;if(0===e.length)return e=uf.call(document,d.localName),Object.setPrototypeOf(e,c.prototype),e.__CE_state=1,e.__CE_definition=d,ng(a,e),e;var f=e.length-1,g=e[f];if(g===Dg)throw Error("Failed to construct '"+d.localName+"': This element was already constructed.");e[f]=
Dg;Object.setPrototypeOf(g,c.prototype);ng(a,g);return g}b.prototype=Yf.prototype;Object.defineProperty(HTMLElement.prototype,"constructor",{writable:!0,configurable:!0,enumerable:!1,value:b});window.HTMLElement=b};function Fg(a){function b(c,d){Object.defineProperty(c,"textContent",{enumerable:d.enumerable,configurable:!0,get:d.get,set:function(e){if(this.nodeType===Node.TEXT_NODE)d.set.call(this,e);else{var f=void 0;if(this.firstChild){var g=this.childNodes,h=g.length;if(0<h&&S(this)){f=Array(h);for(var k=0;k<h;k++)f[k]=g[k]}}d.set.call(this,e);if(f)for(e=0;e<f.length;e++)qg(a,f[e])}}})}Node.prototype.insertBefore=function(c,d){if(c instanceof DocumentFragment){var e=eg(c);c=Df.call(this,c,d);if(S(this))for(d=
0;d<e.length;d++)og(a,e[d]);return c}e=c instanceof Element&&S(c);d=Df.call(this,c,d);e&&qg(a,c);S(this)&&og(a,c);return d};Node.prototype.appendChild=function(c){if(c instanceof DocumentFragment){var d=eg(c);c=Cf.call(this,c);if(S(this))for(var e=0;e<d.length;e++)og(a,d[e]);return c}d=c instanceof Element&&S(c);e=Cf.call(this,c);d&&qg(a,c);S(this)&&og(a,c);return e};Node.prototype.cloneNode=function(c){c=Bf.call(this,!!c);this.ownerDocument.__CE_registry?rg(a,c):mg(a,c);return c};Node.prototype.removeChild=
function(c){var d=c instanceof Element&&S(c),e=Ef.call(this,c);d&&qg(a,c);return e};Node.prototype.replaceChild=function(c,d){if(c instanceof DocumentFragment){var e=eg(c);c=Ff.call(this,c,d);if(S(this))for(qg(a,d),d=0;d<e.length;d++)og(a,e[d]);return c}e=c instanceof Element&&S(c);var f=Ff.call(this,c,d),g=S(this);g&&qg(a,d);e&&qg(a,c);g&&og(a,c);return f};Gf&&Gf.get?b(Node.prototype,Gf):kg(a,function(c){b(c,{enumerable:!0,configurable:!0,get:function(){for(var d=[],e=this.firstChild;e;e=e.nextSibling)e.nodeType!==
Node.COMMENT_NODE&&d.push(e.textContent);return d.join("")},set:function(d){for(;this.firstChild;)Ef.call(this,this.firstChild);null!=d&&""!==d&&Cf.call(this,document.createTextNode(d))}})})};var ig=window.customElements;function Gg(){var a=new hg;Eg(a);Ag(a);zg(a,DocumentFragment.prototype,{prepend:zf,append:Af});Fg(a);Cg(a);window.CustomElementRegistry=T;a=new T(a);document.__CE_registry=a;Object.defineProperty(window,"customElements",{configurable:!0,enumerable:!0,value:a})}ig&&!ig.forcePolyfill&&"function"==typeof ig.define&&"function"==typeof ig.get||Gg();window.__CE_installPolyfill=Gg;/*

Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
function Hg(){this.end=this.start=0;this.rules=this.parent=this.previous=null;this.cssText=this.parsedCssText="";this.atRule=!1;this.type=0;this.parsedSelector=this.selector=this.keyframesName=""}
function Ig(a){var b=a=a.replace(Jg,"").replace(Kg,""),c=new Hg;c.start=0;c.end=b.length;for(var d=c,e=0,f=b.length;e<f;e++)if("{"===b[e]){d.rules||(d.rules=[]);var g=d,h=g.rules[g.rules.length-1]||null;d=new Hg;d.start=e+1;d.parent=g;d.previous=h;g.rules.push(d)}else"}"===b[e]&&(d.end=e+1,d=d.parent||c);return Lg(c,a)}
function Lg(a,b){var c=b.substring(a.start,a.end-1);a.parsedCssText=a.cssText=c.trim();a.parent&&(c=b.substring(a.previous?a.previous.end:a.parent.start,a.start-1),c=_expandUnicodeEscapes$$module$third_party$javascript$polymer$v2$shadycss$src$css_parse(c),c=c.replace(Mg," "),c=c.substring(c.lastIndexOf(";")+1),c=a.parsedSelector=a.selector=c.trim(),a.atRule=0===c.indexOf("@"),a.atRule?0===c.indexOf("@media")?a.type=4:c.match(Ng)&&(a.type=7,a.keyframesName=a.selector.split(Mg).pop()):a.type=0===c.indexOf("--")?
1E3:1);if(c=a.rules)for(var d=0,e=c.length,f=void 0;d<e&&(f=c[d]);d++)Lg(f,b);return a}function _expandUnicodeEscapes$$module$third_party$javascript$polymer$v2$shadycss$src$css_parse(a){return a.replace(/\\([0-9a-f]{1,6})\s/gi,function(b,c){b=c;for(c=6-b.length;c--;)b="0"+b;return"\\"+b})}
function Og(a,b,c){c=void 0===c?"":c;var d="";if(a.cssText||a.rules){var e=a.rules;if(e&&!_hasMixinRules$$module$third_party$javascript$polymer$v2$shadycss$src$css_parse(e))for(var f=0,g=e.length,h=void 0;f<g&&(h=e[f]);f++)d=Og(h,b,d);else b?b=a.cssText:(b=a.cssText,b=b.replace(Pg,"").replace(Qg,""),b=b.replace(Rg,"").replace(Sg,"")),(d=b.trim())&&(d="  "+d+"\n")}d&&(a.selector&&(c+=a.selector+" {\n"),c+=d,a.selector&&(c+="}\n\n"));return c}
function _hasMixinRules$$module$third_party$javascript$polymer$v2$shadycss$src$css_parse(a){a=a[0];return!!a&&!!a.selector&&0===a.selector.indexOf("--")}var Jg=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,Kg=/@import[^;]*;/gim,Pg=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim,Qg=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim,Rg=/@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim,Sg=/[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim,Ng=/^@[^\s]*keyframes/,Mg=/\s+/g;var U=!(window.ShadyDOM&&window.ShadyDOM.inUse),Tg;function Ug(a){Tg=a&&a.shimcssproperties?!1:U||!(navigator.userAgent.match(/AppleWebKit\/601|Edge\/15/)||!window.CSS||!CSS.supports||!CSS.supports("box-shadow","0 0 0 var(--foo)"))}var Vg;window.ShadyCSS&&void 0!==window.ShadyCSS.cssBuild&&(Vg=window.ShadyCSS.cssBuild);var Wg=!(!window.ShadyCSS||!window.ShadyCSS.disableRuntime);
window.ShadyCSS&&void 0!==window.ShadyCSS.nativeCss?Tg=window.ShadyCSS.nativeCss:window.ShadyCSS?(Ug(window.ShadyCSS),window.ShadyCSS=void 0):Ug(window.WebComponents&&window.WebComponents.flags);var V=Tg;var $g=/(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};{])+)|\{([^}]*)\}(?:(?=[;\s}])|$))/gi,ah=/(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi,bh=/(--[\w-]+)\s*([:,;)]|$)/gi,ch=/(animation\s*:)|(animation-name\s*:)/,dh=/@media\s(.*)/,eh=/\{[^}]*\}/g;var fh=new Set;function gh(a,b){if(!a)return"";"string"===typeof a&&(a=Ig(a));b&&hh(a,b);return Og(a,V)}function ih(a){!a.__cssRules&&a.textContent&&(a.__cssRules=Ig(a.textContent));return a.__cssRules||null}function jh(a){return!!a.parent&&7===a.parent.type}function hh(a,b,c,d){if(a){var e=!1,f=a.type;if(d&&4===f){var g=a.selector.match(dh);g&&(window.matchMedia(g[1]).matches||(e=!0))}1===f?b(a):c&&7===f?c(a):1E3===f&&(e=!0);if((a=a.rules)&&!e)for(e=0,f=a.length,g=void 0;e<f&&(g=a[e]);e++)hh(g,b,c,d)}}
function kh(a,b,c,d){var e=document.createElement("style");b&&e.setAttribute("scope",b);e.textContent=a;if(window.enableHotReplacement&&(a=document.head.querySelector("style[scope="+b+"]")))return a.parentElement.replaceChild(e,a),e;lh(e,c,d);return e}var mh=null;function nh(a){a=document.createComment(" Shady DOM styles for "+a+" ");var b=document.head;b.insertBefore(a,(mh?mh.nextSibling:null)||b.firstChild);return mh=a}
function lh(a,b,c){b=b||document.head;b.insertBefore(a,c&&c.nextSibling||b.firstChild);mh?a.compareDocumentPosition(mh)===Node.DOCUMENT_POSITION_PRECEDING&&(mh=a):mh=a}function oh(a,b){for(var c=0,d=a.length;b<d;b++)if("("===a[b])c++;else if(")"===a[b]&&0===--c)return b;return-1}
function ph(a,b){var c=a.indexOf("var(");if(-1===c)return b(a,"","","");var d=oh(a,c+3),e=a.substring(c+4,d);c=a.substring(0,c);a=ph(a.substring(d+1),b);d=e.indexOf(",");return-1===d?b(c,e.trim(),"",a):b(c,e.substring(0,d).trim(),e.substring(d+1).trim(),a)}function qh(a,b){U?a.setAttribute("class",b):window.ShadyDOM.nativeMethods.setAttribute.call(a,"class",b)}var rh=window.ShadyDOM&&window.ShadyDOM.wrap||function(a){return a};
function sh(a){var b=a.localName,c="";b?-1<b.indexOf("-")||(c=b,b=a.getAttribute&&a.getAttribute("is")||""):(b=a.is,c=a.extends);return{is:b,ea:c}}function th(a){for(var b=[],c="",d=0;0<=d&&d<a.length;d++)if("("===a[d]){var e=oh(a,d);c+=a.slice(d,e+1);d=e}else","===a[d]?(b.push(c),c=""):c+=a[d];c&&b.push(c);return b}
function uh(a){if(void 0!==Vg)return Vg;if(void 0===a.__cssBuild){var b=a.getAttribute("css-build");if(b)a.__cssBuild=b;else{a:{b="template"===a.localName?a.content.firstChild:a.firstChild;if(b instanceof Comment&&(b=b.textContent.trim().split(":"),"css-build"===b[0])){b=b[1];break a}b=""}if(""!==b){var c="template"===a.localName?a.content.firstChild:a.firstChild;c.parentNode.removeChild(c)}a.__cssBuild=b}}return a.__cssBuild||""}
function vh(a){a=void 0===a?"":a;return""!==a&&V?U?"shadow"===a:"shady"===a:!1};function wh(a,b){var c=window.shadyCSSStyleTransformHooks;return c&&(c=c.didTransformSelector,"function"===typeof c)?c(a,b):a}function xh(){}function yh(a,b){var c=W;c.na(a,function(d){c.element(d,b||"")})}n=xh.prototype;n.na=function(a,b){a.nodeType===Node.ELEMENT_NODE&&b(a);if(a="template"===a.localName?(a.content||a._content||a).childNodes:a.children||a.childNodes)for(var c=0;c<a.length;c++)this.na(a[c],b)};
n.element=function(a,b,c){if(b)if(a.classList)c?(a.classList.remove("style-scope"),a.classList.remove(b)):(a.classList.add("style-scope"),a.classList.add(b));else if(a.getAttribute){var d=a.getAttribute("class");c?d&&(b=d.replace("style-scope","").replace(b,""),qh(a,b)):qh(a,(d?d+" ":"")+"style-scope "+b)}};function zh(a,b,c){var d=W;d.na(a,function(e){d.element(e,b,!0);d.element(e,c)})}function Ah(a,b){var c=W;c.na(a,function(d){c.element(d,b||"",!0)})}
function Bh(a,b,c,d,e){var f=W;e=void 0===e?"":e;""===e&&(U||"shady"===(void 0===d?"":d)?e=gh(b,c):(a=sh(a),e=Ch(f,b,a.is,a.ea,c)+"\n\n"));return e.trim()}function Ch(a,b,c,d,e){var f=a.ya(c,d);c=a.Sa(c);return gh(b,function(g){g.Kc||(a.kb(g,a.Ga,c,f),g.Kc=!0);e&&e(g,c,f)})}n.Sa=function(a){return a?"."+a:""};n.ya=function(a,b){return b?"[is="+a+"]":a};n.kb=function(a,b,c,d){a.selector=a.o=this.lb(a,b,c,d)};
n.lb=function(a,b,c,d){var e=th(a.selector);if(!jh(a)){a=0;for(var f=e.length,g=void 0;a<f&&(g=e[a]);a++)e[a]=b.call(this,g,c,d)}return e.filter(function(h){return!!h}).join(",")};n.nb=function(a){return a.replace(Dh,function(b,c,d){-1<d.indexOf("+")?d=d.replace(/\+/g,"___"):-1<d.indexOf("___")&&(d=d.replace(/___/g,"+"));return":"+c+"("+d+")"})};
n.hc=function(a){for(var b=[],c;c=a.match(Eh);){var d=c.index,e=oh(a,d);if(-1===e)throw Error(c.input+" selector missing ')'");c=a.slice(d,e+1);a=a.replace(c,"\ue000");b.push(c)}return{Na:a,matches:b}};n.lc=function(a,b){var c=a.split("\ue000");return b.reduce(function(d,e,f){return d+e+c[f+1]},c[0])};
n.Ga=function(a,b,c){var d=this,e=!1;a=a.trim();var f=Dh.test(a);f&&(a=a.replace(Dh,function(k,l,p){return":"+l+"("+p.replace(/\s/g,"")+")"}),a=this.nb(a));var g=Eh.test(a);if(g){var h=this.hc(a);a=h.Na;h=h.matches}a=a.replace(Fh,":host $1");a=a.replace(Gh,function(k,l,p){e||(k=d.sc(p,l,b,c),e=e||k.stop,l=k.Ac,p=k.value);return l+p});g&&(a=this.lc(a,h));f&&(a=this.nb(a));a=a.replace(Hh,function(k,l,p,x){return'[dir="'+p+'"] '+l+x+", "+l+'[dir="'+p+'"]'+x});return wh(a,b)};
n.sc=function(a,b,c,d){var e=a.indexOf("::slotted");0<=a.indexOf(":host")?a=this.uc(a,d):0!==e&&(a=c?this.mb(a,c):a);c=!1;0<=e&&(b="",c=!0);if(c){var f=!0;c&&(a=a.replace(Ih,function(g,h){return" > "+h}))}return{value:a,Ac:b,stop:f}};n.mb=function(a,b){a=a.split(/(\[.+?\])/);for(var c=[],d=0;d<a.length;d++)if(1===d%2)c.push(a[d]);else{var e=a[d];if(""!==e||d!==a.length-1)e=e.split(":"),e[0]+=b,c.push(e.join(":"))}return c.join("")};
n.uc=function(a,b){var c=a.match(Jh);return(c=c&&c[2].trim()||"")?c[0].match(Kh)?a.replace(Jh,function(d,e,f){return b+f}):c.split(Kh)[0]===b?c:"should_not_match":a.replace(":host",b)};function Lh(a){":root"===a.selector&&(a.selector="html")}n.tc=function(a){return a.match(":host")?"":a.match("::slotted")?this.Ga(a,":not(.style-scope)"):wh(this.mb(a.trim(),":not(.style-scope)"),":not(.style-scope)")};ca.Object.defineProperties(xh.prototype,{fa:{configurable:!0,enumerable:!0,get:function(){return"style-scope"}}});
var Dh=/:(nth[-\w]+)\(([^)]+)\)/,Gh=/(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=[])+)/g,Kh=/[[.:#*]/,Fh=RegExp("^(::slotted)"),Jh=/(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Ih=/(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Hh=/(.*):dir\((?:(ltr|rtl))\)(.*)/,Eh=/:(?:matches|any|-(?:webkit|moz)-any)/,W=new xh;function Mh(a,b,c,d,e){this.A=a||null;this.placeholder=b||null;this.La=c||[];this.U=null;this.cssBuild=e||"";this.ea=d||"";this.R=this.v=this.F=null}function Nh(a){return a?a.__styleInfo:null}function Oh(a,b){return a.__styleInfo=b}Mh.prototype.Wb=function(){return this.A};Mh.prototype._getStyleRules=Mh.prototype.Wb;function Ph(a){var b=this.matches||this.matchesSelector||this.mozMatchesSelector||this.msMatchesSelector||this.oMatchesSelector||this.webkitMatchesSelector;return b&&b.call(this,a)}var Qh=/:host\s*>\s*/,Rh=navigator.userAgent.match("Trident");function Sh(){}function Th(a){var b={},c=[],d=0;hh(a,function(f){Uh(f);f.index=d++;f=f.l.cssText;for(var g;g=bh.exec(f);){var h=g[1];":"!==g[2]&&(b[h]=!0)}},function(f){c.push(f)});a.Zb=c;a=[];for(var e in b)a.push(e);return a}
function Uh(a){if(!a.l){var b={},c={};Vh(a,c)&&(b.D=c,a.rules=null);b.cssText=a.parsedCssText.replace(eh,"").replace($g,"");a.l=b}}function Vh(a,b){var c=a.l;if(c){if(c.D)return Object.assign(b,c.D),!0}else{c=a.parsedCssText;for(var d;a=$g.exec(c);){d=(a[2]||a[3]).trim();if("inherit"!==d||"unset"!==d)b[a[1].trim()]=d;d=!0}return d}}
function Wh(a,b,c){b&&(b=0<=b.indexOf(";")?Xh(a,b,c):ph(b,function(d,e,f,g){if(!e)return d+g;(e=Wh(a,c[e],c))&&"initial"!==e?"apply-shim-inherit"===e&&(e="inherit"):e=Wh(a,c[f]||f,c)||f;return d+(e||"")+g}));return b&&b.trim()||""}
function Xh(a,b,c){b=b.split(";");for(var d=0,e,f;d<b.length;d++)if(e=b[d]){ah.lastIndex=0;if(f=ah.exec(e))e=Wh(a,c[f[1]],c);else if(f=e.indexOf(":"),-1!==f){var g=e.substring(f);g=g.trim();g=Wh(a,g,c)||g;e=e.substring(0,f)+g}b[d]=e&&e.lastIndexOf(";")===e.length-1?e.slice(0,-1):e||""}return b.join(";")}
function Yh(a,b){var c={},d=[];hh(a,function(e){e.l||Uh(e);var f=e.o||e.parsedSelector;b&&e.l.D&&f&&Ph.call(b,f)&&(Vh(e,c),e=e.index,f=parseInt(e/32,10),d[f]=(d[f]||0)|1<<e%32)},null,!0);return{D:c,key:d}}
function Zh(a,b,c,d){b.l||Uh(b);if(b.l.D){var e=sh(a);a=e.is;e=e.ea;e=a?W.ya(a,e):"html";var f=b.parsedSelector;var g=!!f.match(Qh)||"html"===e&&-1<f.indexOf("html");var h=0===f.indexOf(":host")&&!g;"shady"===c&&(g=f===e+" > *."+e||-1!==f.indexOf("html"),h=!g&&0===f.indexOf(e));if(g||h)c=e,h&&(b.o||(b.o=W.lb(b,W.Ga,W.Sa(a),e)),c=b.o||e),g&&"html"===e&&(c=b.o||b.ed),d({Na:c,Jc:h,dd:g})}}
function $h(a,b,c){var d={},e={};hh(b,function(f){Zh(a,f,c,function(g){Ph.call(a._element||a,g.Na)&&(g.Jc?Vh(f,d):Vh(f,e))})},null,!0);return{Rc:e,Ic:d}}
function ai(a,b,c,d){var e=sh(b),f=W.ya(e.is,e.ea),g=new RegExp("(?:^|[^.#[:])"+(b.extends?"\\"+f.slice(0,-1)+"\\]":f)+"($|[.:[\\s>+~])"),h=Nh(b);e=h.A;h=h.cssBuild;var k=a.Mb(b,e,d);return Bh(b,e,function(l){var p="";l.l||Uh(l);l.l.cssText&&(p=Xh(a,l.l.cssText,c));l.cssText=p;if(!U&&!jh(l)&&l.cssText){var x=p=l.cssText;null==l.qb&&(l.qb=ch.test(p));if(l.qb)if(null==l.sa){l.sa=[];for(var F in k)x=k[F],x=x(p),p!==x&&(p=x,l.sa.push(F))}else{for(F=0;F<l.sa.length;++F)x=k[l.sa[F]],p=x(p);x=p}l.cssText=
x;a.qc(l,g,f,d)}},h)}Sh.prototype.Mb=function(a,b,c){a=b.Zb;b={};if(!U&&a)for(var d=0,e=a[d];d<a.length;e=a[++d])this.pc(e,c),b[e.keyframesName]=this.ac(e);return b};Sh.prototype.ac=function(a){return function(b){return b.replace(a.Lc,a.yb)}};Sh.prototype.pc=function(a,b){a.Lc=new RegExp("\\b"+a.keyframesName+"(?!\\B|-)","g");a.yb=a.keyframesName+"-"+b;a.o=a.o||a.selector;a.selector=a.o.replace(a.keyframesName,a.yb)};
Sh.prototype.qc=function(a,b,c,d){a.o=a.o||a.selector;d="."+d;for(var e=th(a.o),f=0,g=e.length,h=void 0;f<g&&(h=e[f]);f++)e[f]=h.match(b)?h.replace(c,d):d+" "+h;a.selector=e.join(",")};function bi(a,b){var c=ci,d=ih(a);a.textContent=gh(d,function(e){var f=e.cssText=e.parsedCssText;e.l&&e.l.cssText&&(f=f.replace(Pg,"").replace(Qg,""),e.cssText=Xh(c,f,b))})}ca.Object.defineProperties(Sh.prototype,{Ab:{configurable:!0,enumerable:!0,get:function(){return"x-scope"}}});var ci=new Sh;var di={},ei=window.customElements;if(ei&&!U&&!Wg){var fi=ei.define;ei.define=function(a,b,c){di[a]||(di[a]=nh(a));fi.call(ei,a,b,c)}};function gi(){this.cache={};this.Xc=100}gi.prototype.yc=function(a,b,c){for(var d=0;d<c.length;d++){var e=c[d];if(a.D[e]!==b[e])return!1}return!0};gi.prototype.store=function(a,b,c,d){var e=this.cache[a]||[];e.push({D:b,styleElement:c,v:d});e.length>this.Xc&&e.shift();this.cache[a]=e};gi.prototype.fetch=function(a,b,c){if(a=this.cache[a])for(var d=a.length-1;0<=d;d--){var e=a[d];if(this.yc(e,b,c))return e}};function hi(){}var ii=new RegExp(W.fa+"\\s*([^\\s]*)");function ji(a){return(a=(a.classList&&a.classList.value?a.classList.value:a.getAttribute("class")||"").match(ii))?a[1]:""}function ki(a){var b=rh(a).getRootNode();return b===a||b===a.ownerDocument?"":(a=b.host)?sh(a).is:""}
function li(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.target!==document.documentElement&&c.target!==document.head)for(var d=0;d<c.addedNodes.length;d++){var e=c.addedNodes[d];if(e.nodeType===Node.ELEMENT_NODE){var f=e.getRootNode(),g=ji(e);if(g&&f===e.ownerDocument&&("style"!==e.localName&&"template"!==e.localName||""===uh(e)))Ah(e,g);else if(f instanceof ShadowRoot)for(f=ki(e),f!==g&&zh(e,g,f),e=window.ShadyDOM.nativeMethods.querySelectorAll.call(e,":not(."+W.fa+")"),g=0;g<e.length;g++){f=e[g];
var h=ki(f);h&&W.element(f,h)}}}}}
if(!(U||window.ShadyDOM&&window.ShadyDOM.handlesDynamicScoping)){var mi=new MutationObserver(li),ni=function(a){mi.observe(a,{childList:!0,subtree:!0})};if(window.customElements&&!window.customElements.polyfillWrapFlushCallback)ni(document);else{var oi=function(){ni(document.body)};window.HTMLImports?window.HTMLImports.whenReady(oi):requestAnimationFrame(function(){if("loading"===document.readyState){var a=function(){oi();document.removeEventListener("readystatechange",a)};document.addEventListener("readystatechange",
a)}else oi()})}hi=function(){li(mi.takeRecords())}};var pi={};var qi=Promise.resolve();function ri(a){if(a=pi[a])a._applyShimCurrentVersion=a._applyShimCurrentVersion||0,a._applyShimValidatingVersion=a._applyShimValidatingVersion||0,a._applyShimNextVersion=(a._applyShimNextVersion||0)+1}function si(a){return a._applyShimCurrentVersion===a._applyShimNextVersion}function ti(a){a._applyShimValidatingVersion=a._applyShimNextVersion;a._validating||(a._validating=!0,qi.then(function(){a._applyShimCurrentVersion=a._applyShimNextVersion;a._validating=!1}))};var ui={},vi=new gi;function Y(){this.ib={};this.L=document.documentElement;var a=new Hg;a.rules=[];this.B=Oh(this.L,new Mh(a));this.Ba=!1;this.h=this.m=null}n=Y.prototype;n.flush=function(){hi()};n.Sb=function(a){var b=this.ib[a]=(this.ib[a]||0)+1;return a+"-"+b};n.Fc=function(a){return ih(a)};n.Wc=function(a){return gh(a)};
n.Rb=function(a){var b=[];a=a.content.querySelectorAll("style");for(var c=0;c<a.length;c++){var d=a[c];if(d.hasAttribute("shady-unscoped")){if(!U){var e=d.textContent;if(!fh.has(e)){fh.add(e);var f=document.createElement("style");f.setAttribute("shady-unscoped","");f.textContent=e;document.head.appendChild(f)}d.parentNode.removeChild(d)}}else b.push(d.textContent),d.parentNode.removeChild(d)}return b.join("").trim()};
n.prepareTemplate=function(a,b,c){this.prepareTemplateDom(a,b);this.prepareTemplateStyles(a,b,c)};
n.prepareTemplateStyles=function(a,b,c){if(!a._prepared&&!Wg){U||di[b]||(di[b]=nh(b));a._prepared=!0;a.name=b;a.extends=c;pi[b]=a;var d=uh(a),e=vh(d);c={is:b,extends:c};var f=this.Rb(a)+(ui[b]||"");this.W();if(!e){var g;if(g=!d)g=ah.test(f)||$g.test(f),ah.lastIndex=0,$g.lastIndex=0;var h=Ig(f);g&&V&&this.m&&this.m.transformRules(h,b);a._styleAst=h}g=[];V||(g=Th(a._styleAst));if(!g.length||V)b=this.Tb(c,a._styleAst,U?a.content:null,di[b]||null,d,e?f:""),a._style=b;a.fc=g}};
n.prepareAdoptedCssText=function(a,b){ui[b]=a.join(" ")};n.prepareTemplateDom=function(a,b){if(!Wg){var c=uh(a);U||"shady"===c||a._domPrepared||(a._domPrepared=!0,yh(a.content,b))}};n.Tb=function(a,b,c,d,e,f){f=Bh(a,b,null,e,f);return f.length?kh(f,a.is,c,d):null};n.fb=function(a){var b=sh(a),c=b.is;b=b.ea;var d=di[c]||null,e=pi[c];if(e){c=e._styleAst;var f=e.fc;e=uh(e);b=new Mh(c,d,f,b,e);Oh(a,b);return b}};
n.Nb=function(){return!this.m&&window.ShadyCSS&&window.ShadyCSS.ApplyShim?(this.m=window.ShadyCSS.ApplyShim,this.m.invalidCallback=ri,!0):!1};n.Ob=function(){var a=this;!this.h&&window.ShadyCSS&&window.ShadyCSS.CustomStyleInterface&&(this.h=window.ShadyCSS.CustomStyleInterface,this.h.transformCallback=function(b){a.xb(b)},this.h.validateCallback=function(){requestAnimationFrame(function(){(a.h.enqueued||a.Ba)&&a.flushCustomStyles()})})};n.W=function(){var a=this.Nb();this.Ob();return a};
n.flushCustomStyles=function(){if(!Wg){var a=this.W();if(this.h){var b=this.h.processStyles();!a&&!this.h.enqueued||vh(this.B.cssBuild)||(V?this.B.cssBuild||this.oc(b):(this.kc(b),this.Ha(this.L,this.B),this.Fb(b),this.Ba&&this.styleDocument()),this.h.enqueued=!1)}}};
n.kc=function(a){var b=this;a=a.map(function(c){return b.h.getStyleForCustomStyle(c)}).filter(function(c){return!!c});a.sort(function(c,d){c=d.compareDocumentPosition(c);return c&Node.DOCUMENT_POSITION_FOLLOWING?1:c&Node.DOCUMENT_POSITION_PRECEDING?-1:0});this.B.A.rules=a.map(function(c){return ih(c)})};
n.styleElement=function(a,b){if(Wg){if(b){Nh(a)||Oh(a,new Mh(null));var c=Nh(a);this.cb(c,b);wi(this,a,c)}}else if(c=Nh(a)||this.fb(a))this.Ca(a)||(this.Ba=!0),b&&this.cb(c,b),V?wi(this,a,c):(this.flush(),this.Ha(a,c),c.La&&c.La.length&&this.Gb(a,c))};n.cb=function(a,b){a.U=a.U||{};Object.assign(a.U,b)};
function wi(a,b,c){var d=sh(b).is;if(c.U){var e=c.U,f;for(f in e)null===f?b.style.removeProperty(f):b.style.setProperty(f,e[f])}if(((e=pi[d])||a.Ca(b))&&(!e||""===uh(e))&&e&&e._style&&!si(e)){if(si(e)||e._applyShimValidatingVersion!==e._applyShimNextVersion)a.W(),a.m&&a.m.transformRules(e._styleAst,d),e._style.textContent=Bh(b,c.A),ti(e);U&&(a=b.shadowRoot)&&(a=a.querySelector("style"))&&(a.textContent=Bh(b,c.A));c.A=e._styleAst}}
n.Fa=function(a){return(a=rh(a).getRootNode().host)?Nh(a)||this.fb(a)?a:this.Fa(a):this.L};n.Ca=function(a){return a===this.L};
n.Gb=function(a,b){var c=sh(a).is,d=vi.fetch(c,b.F,b.La),e=d?d.styleElement:null,f=b.v;b.v=d&&d.v||this.Sb(c);var g=b.v;var h=ci;h=e?e.textContent||"":ai(h,a,b.F,g);var k=Nh(a),l=k.R;l&&!U&&l!==e&&(l._useCount--,0>=l._useCount&&l.parentNode&&l.parentNode.removeChild(l));U?k.R?(k.R.textContent=h,e=k.R):h&&(e=kh(h,g,a.shadowRoot,k.placeholder)):e?e.parentNode||(Rh&&-1<h.indexOf("@media")&&(e.textContent=h),lh(e,null,k.placeholder)):h&&(e=kh(h,g,null,k.placeholder));e&&(e._useCount=e._useCount||0,k.R!=
e&&e._useCount++,k.R=e);g=e;U||(e=b.v,k=h=a.getAttribute("class")||"",f&&(k=h.replace(new RegExp("\\s*x-scope\\s*"+f+"\\s*","g")," ")),k+=(k?" ":"")+"x-scope "+e,h!==k&&qh(a,k));d||vi.store(c,b.F,g,b.v);return g};n.Ha=function(a,b){var c=this.Fa(a),d=Nh(c),e=d.F;c===this.L||e||(this.Ha(c,d),e=d.F);c=Object.create(e||null);e=$h(a,b.A,b.cssBuild);a=Yh(d.A,a).D;Object.assign(c,e.Ic,a,e.Rc);this.dc(c,b.U);a=ci;d=Object.getOwnPropertyNames(c);e=0;for(var f;e<d.length;e++)f=d[e],c[f]=Wh(a,c[f],c);b.F=c};
n.dc=function(a,b){for(var c in b){var d=b[c];if(d||0===d)a[c]=d}};n.styleDocument=function(a){this.styleSubtree(this.L,a)};n.styleSubtree=function(a,b){var c=rh(a),d=c.shadowRoot,e=this.Ca(a);(d||e)&&this.styleElement(a,b);if(a=e?c:d)for(a=Array.from(a.querySelectorAll("*")).filter(function(f){return rh(f).shadowRoot}),b=0;b<a.length;b++)this.styleSubtree(a[b])};n.oc=function(a){for(var b=0;b<a.length;b++){var c=this.h.getStyleForCustomStyle(a[b]);c&&this.nc(c)}};
n.Fb=function(a){for(var b=0;b<a.length;b++){var c=this.h.getStyleForCustomStyle(a[b]);c&&bi(c,this.B.F)}};n.xb=function(a){var b=this,c=uh(a);c!==this.B.cssBuild&&(this.B.cssBuild=c);if(!vh(c)){var d=ih(a);hh(d,function(e){if(U)Lh(e);else{var f=W;e.selector=e.parsedSelector;Lh(e);f.kb(e,f.tc)}V&&""===c&&(b.W(),b.m&&b.m.transformRule(e))});V?a.textContent=gh(d):this.B.A.rules.push(d)}};n.nc=function(a){if(V&&this.m){var b=ih(a);this.W();this.m.transformRules(b);a.textContent=gh(b)}};
n.getComputedStyleValue=function(a,b){var c;V||(c=(Nh(a)||Nh(this.Fa(a))).F[b]);return(c=c||window.getComputedStyle(a).getPropertyValue(b))?c.trim():""};n.Vc=function(a,b){var c=rh(a).getRootNode();b=b?("string"===typeof b?b:String(b)).split(/\s/):[];c=c.host&&c.host.localName;if(!c){var d=a.getAttribute("class");if(d){d=d.split(/\s/);for(var e=0;e<d.length;e++)if(d[e]===W.fa){c=d[e+1];break}}}c&&b.push(W.fa,c);V||(c=Nh(a))&&c.v&&b.push(ci.Ab,c.v);qh(a,b.join(" "))};n.rc=function(a){return Nh(a)};
n.Uc=function(a,b){W.element(a,b)};n.Yc=function(a,b){W.element(a,b,!0)};n.Tc=function(a){return ki(a)};n.Cc=function(a){return ji(a)};Y.prototype.flush=Y.prototype.flush;Y.prototype.prepareTemplate=Y.prototype.prepareTemplate;Y.prototype.styleElement=Y.prototype.styleElement;Y.prototype.styleDocument=Y.prototype.styleDocument;Y.prototype.styleSubtree=Y.prototype.styleSubtree;Y.prototype.getComputedStyleValue=Y.prototype.getComputedStyleValue;Y.prototype.setElementClass=Y.prototype.Vc;
Y.prototype._styleInfoForNode=Y.prototype.rc;Y.prototype.transformCustomStyleForDocument=Y.prototype.xb;Y.prototype.getStyleAst=Y.prototype.Fc;Y.prototype.styleAstToString=Y.prototype.Wc;Y.prototype.flushCustomStyles=Y.prototype.flushCustomStyles;Y.prototype.scopeNode=Y.prototype.Uc;Y.prototype.unscopeNode=Y.prototype.Yc;Y.prototype.scopeForNode=Y.prototype.Tc;Y.prototype.currentScopeForNode=Y.prototype.Cc;Y.prototype.prepareAdoptedCssText=Y.prototype.prepareAdoptedCssText;
Object.defineProperties(Y.prototype,{nativeShadow:{get:function(){return U}},nativeCss:{get:function(){return V}}});var Z=new Y,xi,yi;window.ShadyCSS&&(xi=window.ShadyCSS.ApplyShim,yi=window.ShadyCSS.CustomStyleInterface);
window.ShadyCSS={ScopingShim:Z,prepareTemplate:function(a,b,c){Z.flushCustomStyles();Z.prepareTemplate(a,b,c)},prepareTemplateDom:function(a,b){Z.prepareTemplateDom(a,b)},prepareTemplateStyles:function(a,b,c){Z.flushCustomStyles();Z.prepareTemplateStyles(a,b,c)},styleSubtree:function(a,b){Z.flushCustomStyles();Z.styleSubtree(a,b)},styleElement:function(a){Z.flushCustomStyles();Z.styleElement(a)},styleDocument:function(a){Z.flushCustomStyles();Z.styleDocument(a)},flushCustomStyles:function(){Z.flushCustomStyles()},
getComputedStyleValue:function(a,b){return Z.getComputedStyleValue(a,b)},nativeCss:V,nativeShadow:U,cssBuild:Vg,disableRuntime:Wg};xi&&(window.ShadyCSS.ApplyShim=xi);yi&&(window.ShadyCSS.CustomStyleInterface=yi);/*

Copyright (c) 2019 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
var zi=window.customElements,Ai=window.HTMLImports,Bi=!1,Ci=null;zi.polyfillWrapFlushCallback&&zi.polyfillWrapFlushCallback(function(a){Ci=a;Bi&&a()});function Di(){window.HTMLTemplateElement.bootstrap&&window.HTMLTemplateElement.bootstrap(window.document);Ai.whenReady(function(){Ci&&Ci();Bi=!0;window.WebComponents.ready=!0;document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})}
"complete"!==document.readyState?(window.addEventListener("load",Di),window.addEventListener("DOMContentLoaded",function(){window.removeEventListener("load",Di);Di()})):Di();})();
//# sourceMappingURL=webcomponents-lite.js.map
