From bc6d2f61d8ea3aca4f637c93911e4d660bb3e9e6 Mon Sep 17 00:00:00 2001 From: George Raptis Date: Fri, 18 Oct 2024 18:38:10 +0300 Subject: [PATCH] Updates --- aperture.4bf28ce8.svg | 1 - camera-reverse.284e8ac9.svg | 1 - index.09064714.js | 511 ----------------- index.09064714.js.map | 1 - index.4434df8a.js | 530 ++++++++++++++++++ index.4434df8a.js.map | 1 + index.6d86f4dd.js | 511 ----------------- index.6d86f4dd.js.map | 1 - index.9a005d69.js | 530 ++++++++++++++++++ index.9a005d69.js.map | 1 + index.f1f30278.css => index.b4cc57ad.css | 4 +- index.b4cc57ad.css.map | 1 + index.f1f30278.css.map | 1 - index.html | 2 +- ...e.34c3c44d.js => index.runtime.ddd227ef.js | 4 +- ...4d.js.map => index.runtime.ddd227ef.js.map | 2 +- ...e.491ea605.js => index.runtime.fd3a20bd.js | 4 +- ...05.js.map => index.runtime.fd3a20bd.js.map | 2 +- service-worker.js | 2 +- service-worker.js.map | 2 +- 20 files changed, 1074 insertions(+), 1038 deletions(-) delete mode 100644 aperture.4bf28ce8.svg delete mode 100644 camera-reverse.284e8ac9.svg delete mode 100644 index.09064714.js delete mode 100644 index.09064714.js.map create mode 100644 index.4434df8a.js create mode 100644 index.4434df8a.js.map delete mode 100644 index.6d86f4dd.js delete mode 100644 index.6d86f4dd.js.map create mode 100644 index.9a005d69.js create mode 100644 index.9a005d69.js.map rename index.f1f30278.css => index.b4cc57ad.css (97%) create mode 100644 index.b4cc57ad.css.map delete mode 100644 index.f1f30278.css.map rename index.runtime.34c3c44d.js => index.runtime.ddd227ef.js (91%) rename index.runtime.34c3c44d.js.map => index.runtime.ddd227ef.js.map (95%) rename index.runtime.491ea605.js => index.runtime.fd3a20bd.js (91%) rename index.runtime.491ea605.js.map => index.runtime.fd3a20bd.js.map (95%) diff --git a/aperture.4bf28ce8.svg b/aperture.4bf28ce8.svg deleted file mode 100644 index 105d953..0000000 --- a/aperture.4bf28ce8.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/camera-reverse.284e8ac9.svg b/camera-reverse.284e8ac9.svg deleted file mode 100644 index 894c46c..0000000 --- a/camera-reverse.284e8ac9.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/index.09064714.js b/index.09064714.js deleted file mode 100644 index 903ba41..0000000 --- a/index.09064714.js +++ /dev/null @@ -1,511 +0,0 @@ -let e,t;function o(e){return e&&e.__esModule?e.default:e}function i(e){if("string"!=typeof e||!e)throw Error("expected a non-empty string, got: "+e)}function n(e){if("number"!=typeof e)throw Error("expected a number, got: "+e)}const a="emoji",r="keyvalue",s="favorites",l="tokens",d="count",c="group-order",u="eTag",h="skinTone",m="readonly",p="readwrite",g="skinUnicodes";function b(e){return function(e,t){let o=new Set,i=[];for(let n of e){let e=t(n);o.has(e)||(o.add(e),i.push(n))}return i}(e,e=>e.unicode)}const f={},v={},y={};function w(e,t,o){o.onerror=()=>t(o.error),o.onblocked=()=>t(Error("IDB blocked")),o.onsuccess=()=>e(o.result)}async function k(e){let t=await new Promise((t,o)=>{let i=indexedDB.open(e,1);f[e]=i,i.onupgradeneeded=e=>{e.oldVersion<1&&function(e){function t(t,o,i){let n=o?e.createObjectStore(t,{keyPath:o}):e.createObjectStore(t);if(i)for(let[e,[t,o]]of Object.entries(i))n.createIndex(e,t,{multiEntry:o});return n}t(r),t(a,"unicode",{[l]:["tokens",!0],[c]:[["group","order"]],[g]:["skinUnicodes",!0]}),t(s,void 0,{[d]:[""]})}(i.result)},w(t,o,i)});return t.onclose=()=>x(e),t}function E(e,t,o,i){return new Promise((n,a)=>{let r;let s=e.transaction(t,o,{durability:"relaxed"});i("string"==typeof t?s.objectStore(t):t.map(e=>s.objectStore(e)),s,e=>{r=e}),s.oncomplete=()=>n(r),s.onerror=()=>a(s.error)})}function x(e){let t=f[e],o=t&&t.result;if(o){o.close();let t=y[e];if(t)for(let e of t)e()}delete f[e],delete v[e],delete y[e]}const S=new Set([":D","XD",":'D","O:)",":X",":P",";P","XP",":L",":Z",":j","8D","XO","8)",":B",":O",":S",":'o","Dx","X(","D:",":C",">0)",":3","!e.match(/\w/)||S.has(e)?e.toLowerCase():e.replace(/[)(:,]/g,"").replace(/’/g,"'").toLowerCase()).filter(Boolean)}function j(e){return e.filter(Boolean).map(e=>e.toLowerCase()).filter(e=>e.length>=2)}function T(e,t,o,i){e[t](o).onsuccess=e=>i&&i(e.target.result)}function A(e,t,o){T(e,"get",t,o)}function L(e,t,o){T(e,"getAll",t,o)}function z(e){e.commit&&e.commit()}function D(e,t){let o=function(e,t){let o=e[0];for(let i=1;it(n)&&(o=n)}return o}(e,e=>e.length),i=[];for(let n of o)e.some(e=>-1===e.findIndex(e=>t(e)===t(n)))||i.push(n);return i}async function $(e){return!await P(e,r,"url")}async function _(e,t,o){let[i,n]=await Promise.all([u,"url"].map(t=>P(e,r,t)));return i===o&&n===t}async function I(e,t){return E(e,a,m,(e,o,i)=>{let n;let a=()=>{e.getAll(n&&IDBKeyRange.lowerBound(n,!0),50).onsuccess=e=>{let o=e.target.result;for(let e of o)if(n=e.unicode,t(e))return i(e);if(o.length<50)return i();a()}};a()})}async function B(e,t,o,i){{let n=t.map(({annotation:e,emoticon:t,group:o,order:i,shortcodes:n,skins:a,tags:r,emoji:s,version:l})=>{let d=[...new Set(j([...(n||[]).map(C).flat(),...r.map(C).flat(),...C(e),t]))].sort(),c={annotation:e,group:o,order:i,tags:r,tokens:d,unicode:s,version:l};if(t&&(c.emoticon=t),n&&(c.shortcodes=n),a)for(let{tone:e,emoji:t,version:o}of(c.skinTones=[],c.skinUnicodes=[],c.skinVersions=[],a))c.skinTones.push(e),c.skinUnicodes.push(t),c.skinVersions.push(o);return c});await E(e,[a,r],p,([e,t],a)=>{let r,s;let l=0;function d(){2==++l&&function(){if(r!==i||s!==o){for(let t of(e.clear(),n))e.put(t);t.put(i,u),t.put(o,"url"),z(a)}}()}A(t,u,e=>{r=e,d()}),A(t,"url",e=>{s=e,d()})})}}async function R(e,t){return E(e,a,m,(e,o,i)=>{let n=IDBKeyRange.bound([t,0],[t+1,0],!1,!0);L(e.index(c),n,i)})}async function M(e,t){let o=j(C(t));return o.length?E(e,a,m,(e,t,i)=>{let n=[],a=()=>{n.length===o.length&&r()},r=()=>{i(D(n,e=>e.unicode).sort((e,t)=>e.order{n.push(e),a()})}}):[]}async function F(e,t){let o=await M(e,t);return o.length?o.filter(e=>(e.shortcodes||[]).map(e=>e.toLowerCase()).includes(t.toLowerCase()))[0]||null:await I(e,e=>(e.shortcodes||[]).includes(t.toLowerCase()))||null}async function N(e,t){return E(e,a,m,(e,o,i)=>A(e,t,o=>{if(o)return i(o);A(e.index(g),t,e=>i(e||null))}))}function P(e,t,o){return E(e,t,m,(e,t,i)=>A(e,o,i))}const O=["name","url"];function U(e){!function(e){let t=e&&Array.isArray(e),o=t&&e.length&&(!e[0]||O.some(t=>!(t in e[0])));if(!t||o)throw Error("Custom emojis are in the wrong format")}(e);let t=(e,t)=>e.name.toLowerCase(){let i=o;for(let t=0;te[0][...new Set((e.shortcodes||[]).map(e=>C(e)).flat())]),n=e=>i(e,!0),a=e=>i(e,!1),r=new Map,s=new Map;for(let t of e)for(let e of(s.set(t.name.toLowerCase(),t),t.shortcodes||[]))r.set(e.toLowerCase(),t);return{all:o,search:e=>{let o=C(e);return D(o.map((e,t)=>(te.name).sort(t)},byShortcode:e=>r.get(e.toLowerCase()),byName:e=>s.get(e.toLowerCase())}}const q="undefined"!=typeof wrappedJSObject;function H(e){if(!e)return e;if(q&&(e=structuredClone(e)),delete e.tokens,e.skinTones){let t=e.skinTones.length;e.skins=Array(t);for(let o=0;o!(t in e[0])))throw Error("Emoji data is in the wrong format")}(i),[o,i]}async function K(e){let t=function(e){for(var t=e.length,o=new ArrayBuffer(t),i=new Uint8Array(o),n=-1;++n(this._ready||(this._ready=this._init()),this._ready);await e(),this._db||await e()}async getEmojiByGroup(e){return n(e),await this.ready(),b(await R(this._db,e)).map(H)}async getEmojiBySearchQuery(e){return i(e),await this.ready(),[...this._custom.search(e),...b(await M(this._db,e)).map(H)]}async getEmojiByShortcode(e){return i(e),await this.ready(),this._custom.byShortcode(e)||H(await F(this._db,e))}async getEmojiByUnicodeOrName(e){return i(e),await this.ready(),this._custom.byName(e)||H(await N(this._db,e))}async getPreferredSkinTone(){return await this.ready(),await P(this._db,r,h)||0}async setPreferredSkinTone(e){return n(e),await this.ready(),E(this._db,r,p,(t,o)=>{t.put(e,h),z(o)})}async incrementFavoriteEmojiCount(e){return i(e),await this.ready(),E(this._db,s,p,(t,o)=>A(t,e,i=>{t.put((i||0)+1,e),z(o)}))}async getTopFavoriteEmoji(e){var t,o;return n(e),await this.ready(),(await (t=this._db,o=this._custom,0===e?[]:E(t,[s,a],m,([t,i],n,a)=>{let r=[];t.index(d).openCursor(void 0,"prev").onsuccess=t=>{let n=t.target.result;if(!n)return a(r);function s(t){if(r.push(t),r.length===e)return a(r);n.continue()}let l=n.primaryKey,d=o.byName(l);if(d)return s(d);A(i,l,e=>{if(e)return s(e);n.continue()})}}))).map(H)}set customEmoji(e){this._custom=U(e)}get customEmoji(){return this._custom.all}async _shutdown(){await this.ready();try{await this._lazyUpdate}catch(e){}}_clear(){this._db=this._ready=this._lazyUpdate=void 0}async close(){await this._shutdown(),await x(this._dbName)}async delete(){var e;await this._shutdown(),await (e=this._dbName,new Promise((t,o)=>{x(e),w(t,o,indexedDB.deleteDatabase(e))}))}}const ee=[[-1,"✨","custom"],[0,"\uD83D\uDE00","smileys-emotion"],[1,"\uD83D\uDC4B","people-body"],[3,"\uD83D\uDC31","animals-nature"],[4,"\uD83C\uDF4E","food-drink"],[5,"\uD83C\uDFE0️","travel-places"],[6,"⚽","activities"],[7,"\uD83D\uDCDD","objects"],[8,"⛔️","symbols"],[9,"\uD83C\uDFC1","flags"]].map(([e,t,o])=>({id:e,emoji:t,name:o})),et=ee.slice(1),eo="function"==typeof requestIdleCallback?requestIdleCallback:setTimeout;function ei(e){return e.unicode.includes("‍")}const en={"\uD83E\uDEE8":15.1,"\uD83E\uDEE0":14,"\uD83E\uDD72":13.1,"\uD83E\uDD7B":12.1,"\uD83E\uDD70":11,"\uD83E\uDD29":5,"\uD83D\uDC71‍♀️":4,"\uD83E\uDD23":3,"\uD83D\uDC41️‍\uD83D\uDDE8️":2,"\uD83D\uDE00":1,"\uD83D\uDE10️":.7,"\uD83D\uDE03":.6},ea=["\uD83D\uDE0A","\uD83D\uDE12","❤️","\uD83D\uDC4D️","\uD83D\uDE0D","\uD83D\uDE02","\uD83D\uDE2D","☺️","\uD83D\uDE14","\uD83D\uDE29","\uD83D\uDE0F","\uD83D\uDC95","\uD83D\uDE4C","\uD83D\uDE18"],er='"Twemoji Mozilla","Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji","EmojiOne Color","Android Emoji",sans-serif',es=(e,t)=>et?1:0,el=(e,t)=>{let o=document.createElement("canvas");o.width=o.height=1;let i=o.getContext("2d");return i.textBaseline="top",i.font=`100px ${er}`,i.fillStyle=t,i.scale(.01,.01),i.fillText(e,0,0),i.getImageData(0,0,1,1).data},ed=(e,t)=>{let o=[...e].join(",");return o===[...t].join(",")&&!o.startsWith("0,0,0,")},ec=()=>(e||(e=new Promise(e=>eo(()=>e(function(){let e=Object.entries(en);try{for(let[t,o]of e)if(function(e){let t=el(e,"#000"),o=el(e,"#fff");return t&&o&&ed(t,o)}(t))return o}catch(e){}finally{}return e[0][1]}())))),e),eu=new Map;function eh(e){e.preventDefault(),e.stopPropagation()}function em(e,t,o){return(t+=e?-1:1)<0?t=o.length-1:t>=o.length&&(t=0),t}function ep(e,t){let o=new Set,i=[];for(let n of e){let e=t(n);o.has(e)||(o.add(e),i.push(n))}return i}const eg=requestAnimationFrame;let eb="function"==typeof ResizeObserver;function ef(e){{let t=document.createRange();return t.selectNode(e.firstChild),t.getBoundingClientRect().width}}function ev(e,t,o){let i=e.get(t);return i||(i=o(),e.set(t,i)),i}const ey=new WeakMap,ew=new WeakMap,ek=Symbol("un-keyed"),eE="replaceChildren"in Element.prototype,ex="function"==typeof queueMicrotask?queueMicrotask:e=>Promise.resolve().then(e);function eS(e,t,o){if(e.length!==t.length)return!1;for(let i=0;i{if(i)return;let e=[...a];a.clear();try{for(let t of e)t()}finally{o=!1,a.size&&(o=!0,ex(r))}},s=new Proxy({},{get(e,o){if(t){let e=n.get(o);e||(e=new Set,n.set(o,e)),e.add(t)}return e[o]},set(e,t,i){e[t]=i;let s=n.get(t);if(s){for(let e of s)a.add(e);o||(o=!0,ex(r))}return!0}});return e.addEventListener("abort",()=>{i=!0}),{state:s,createEffect:e=>{let o=()=>{let i=t;t=o;try{return e()}finally{t=i}};return o()}}}(a);ej(r,{skinToneEmoji:void 0,i18n:void 0,database:void 0,customEmoji:void 0,customCategorySorting:void 0,emojiVersion:void 0}),ej(r,o),ej(r,{initialLoad:!0,currentEmojis:[],currentEmojisWithCategories:[],rawSearchText:"",searchText:"",searchMode:!1,activeSearchItem:-1,message:void 0,skinTonePickerExpanded:!1,skinTonePickerExpandedAfterAnimation:!1,currentSkinTone:0,activeSkinTone:0,skinToneButtonText:void 0,pickerStyle:void 0,skinToneButtonLabel:"",skinTones:[],currentFavorites:[],defaultFavoriteEmojis:void 0,numColumns:8,isRtl:!1,scrollbarWidth:0,currentGroupIndex:0,groups:et,databaseLoaded:!1,activeSearchItemId:void 0}),s(()=>{r.currentGroup!==r.groups[r.currentGroupIndex]&&(r.currentGroup=r.groups[r.currentGroupIndex])});let l=t=>{e.getElementById(t).focus()},d=t=>e.getElementById(`emo-${t.id}`),c=(e,t)=>{i.rootElement.dispatchEvent(new CustomEvent(e,{detail:t,bubbles:!0,composed:!0}))},u=(e,t)=>e.id===t.id,h=(e,t)=>{let{category:o,emojis:i}=e,{category:n,emojis:a}=t;return o===n&&eS(i,a,u)},m=e=>{eS(r.currentEmojis,e,u)||(r.currentEmojis=e)},p=e=>{r.searchMode!==e&&(r.searchMode=e)},g=e=>{eS(r.currentEmojisWithCategories,e,h)||(r.currentEmojisWithCategories=e)},b=(e,t)=>t&&e.skins&&e.skins[t]||e.unicode,f={labelWithSkin:(e,t)=>ep([e.name||b(e,t),e.annotation,...e.shortcodes||eC].filter(Boolean),e=>e).join(", "),titleForEmoji:e=>e.annotation||(e.shortcodes||eC).join(", "),unicodeWithSkin:b},v={onClickSkinToneButton:function(e){r.skinTonePickerExpanded=!r.skinTonePickerExpanded,r.activeSkinTone=r.currentSkinTone,r.skinTonePickerExpanded&&(eh(e),eg(()=>l("skintone-list")))},onEmojiClick:A,onNavClick:function(e){let{target:t}=e,o=t.closest(".nav-button");if(!o)return;let n=parseInt(o.dataset.groupId,10);i.searchElement.value="",r.rawSearchText="",r.searchText="",r.activeSearchItem=-1,r.currentGroupIndex=r.groups.findIndex(e=>e.id===n)},onNavKeydown:function(e){let{target:t,key:o}=e,i=t=>{t&&(eh(e),t.focus())};switch(o){case"ArrowLeft":return i(t.previousElementSibling);case"ArrowRight":return i(t.nextElementSibling);case"Home":return i(t.parentElement.firstElementChild);case"End":return i(t.parentElement.lastElementChild)}},onSearchKeydown:function(e){if(!r.searchMode||!r.currentEmojis.length)return;let t=t=>{eh(e),r.activeSearchItem=em(t,r.activeSearchItem,r.currentEmojis)};switch(e.key){case"ArrowDown":return t(!1);case"ArrowUp":return t(!0);case"Enter":if(-1!==r.activeSearchItem)return eh(e),T(r.currentEmojis[r.activeSearchItem].id);r.activeSearchItem=0}},onSkinToneOptionsClick:function(e){let{target:{id:t}}=e,o=t&&t.match(/^skintone-(\d)/);o&&(eh(e),L(parseInt(o[1],10)))},onSkinToneOptionsFocusOut:z,onSkinToneOptionsKeydown:function(e){if(!r.skinTonePickerExpanded)return;let t=async t=>{eh(e),r.activeSkinTone=t};switch(e.key){case"ArrowUp":return t(em(!0,r.activeSkinTone,r.skinTones));case"ArrowDown":return t(em(!1,r.activeSkinTone,r.skinTones));case"Home":return t(0);case"End":return t(r.skinTones.length-1);case"Enter":return eh(e),L(r.activeSkinTone);case"Escape":return eh(e),r.skinTonePickerExpanded=!1,l("skintone-button")}},onSkinToneOptionsKeyup:function(e){if(r.skinTonePickerExpanded&&" "===e.key)return eh(e),L(r.activeSkinTone)},onSearchInput:function(e){r.rawSearchText=e.target.value}},y={calculateEmojiGridStyle:function(e){var t;let o;t=t=>{{let o=getComputedStyle(i.rootElement),n=parseInt(o.getPropertyValue("--num-columns"),10),a="rtl"===o.getPropertyValue("direction"),s=e.parentElement.getBoundingClientRect().width;r.numColumns=n,r.scrollbarWidth=s-t,r.isRtl=a}},eb?(o=new ResizeObserver(e=>t(e[0].contentRect.width))).observe(e):eg(()=>t(e.getBoundingClientRect().width)),a.addEventListener("abort",()=>{o&&o.disconnect()})}},w=!0;function k(){r.database.customEmoji=r.customEmoji||eC}function E(e){return!e.unicode||!ei(e)||eu.get(e.unicode)}async function x(e){let t=r.emojiVersion||await ec();return e.filter(({version:e})=>!e||e<=t)}async function S(e){return function(e,t){let o=e=>{let o={};for(let i of e)"number"==typeof i.tone&&i.version<=t&&(o[i.tone]=i.unicode);return o};return e.map(({unicode:e,skins:t,shortcodes:i,url:n,name:a,category:r,annotation:s})=>({unicode:e,name:a,shortcodes:i,url:n,category:r,annotation:s,id:e||a,skins:t&&o(t)}))}(e,r.emojiVersion||await ec())}async function C(e){let t=-1===e?r.customEmoji:await r.database.getEmojiByGroup(e);return S(await x(t))}async function j(e){return S(await x(await r.database.getEmojiBySearchQuery(e)))}async function T(e){let t=await r.database.getEmojiByUnicodeOrName(e),o=[...r.currentEmojis,...r.currentFavorites].find(t=>t.id===e),i=o.unicode&&b(o,r.currentSkinTone);await r.database.incrementFavoriteEmojiCount(e),c("emoji-click",{emoji:t,skinTone:r.currentSkinTone,...i&&{unicode:i},...o.name&&{name:o.name}})}async function A(e){let{target:t}=e;t.classList.contains("emoji")&&(eh(e),T(t.id.substring(4)))}function L(e){r.currentSkinTone=e,r.skinTonePickerExpanded=!1,l("skintone-button"),c("skin-tone-change",{skinTone:e}),r.database.setPreferredSkinTone(e)}async function z(e){let{relatedTarget:t}=e;t&&"skintone-list"===t.id||(r.skinTonePickerExpanded=!1)}return s(()=>{(function(e,t,o,i,n,a,r,s){let{labelWithSkin:l,titleForEmoji:d,unicodeWithSkin:c}=o,{html:u,map:h}=function(e){let t=ev(ew,e,()=>new Map),o=ek;return{map:function(e,t,i){return e.map((e,n)=>{let a=o;o=i(e);try{return t(e,n)}finally{o=a}})},html:function(e,...i){let n=ev(t,e,()=>new Map);return ev(n,o,()=>(function(e){let{template:t,elementsToBindings:o}=ev(ey,e,()=>(function(e){let t="",o=!1,i=!1,n=-1,a=new Map,r=[];for(let s=0,l=e.length;s":o=!1,i=!1;break;case"=":i=!0}let m=ev(a,r[r.length-1],()=>[]);if(i){let t=/(\S+)="?([^"=]*)$/.exec(h);d=t[1],c=t[2],u=/^[^">]*/.exec(e[s+1])[0]}let p={attributeName:d,attributeValuePre:c,attributeValuePost:u,expressionIndex:s};m.push(p),o||i||(t+=" ")}return{template:function(e){let t=document.createElement("template");return t.innerHTML=e,t}(t),elementsToBindings:a}})(e)),i=t.cloneNode(!0).content.firstElementChild,n=function(e,t){let o=[],i=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),n=e,a=-1;do{let e=t.get(++a);if(e)for(let t=0;tu``,e=>`${i}-${e.id}`)}let p=u`
${t.i18n.searchDescription}
${t.i18n.skinToneDescription}
${h(t.skinTones,(e,o)=>u`
${e}
`,e=>e)}
${h(t.currentEmojisWithCategories,(e,o)=>u`
${m(e.emojis,t.searchMode,"emo")}
`,e=>e.category)}
`;if(s){e.appendChild(p);let t=(t,o)=>{for(let i of e.querySelectorAll(`[${t}]`))o(i,i.getAttribute(t))};for(let e of["click","focusout","input","keydown","keyup"])t(`data-on-${e}`,(t,o)=>{t.addEventListener(e,i[o])});t("data-ref",(e,t)=>{a[t]=e}),t("data-action",(e,t)=>{n[t](e)}),r.addEventListener("abort",()=>{e.removeChild(p)})}})(e,r,f,v,y,i,a,w),w=!1}),r.emojiVersion||ec().then(e=>{e||(r.message=r.i18n.emojiUnsupportedMessage)}),s(()=>{async function e(){let e=!1,t=setTimeout(()=>{e=!0,r.message=r.i18n.loadingMessage},1e3);try{await r.database.ready(),r.databaseLoaded=!0}catch(e){console.error(e),r.message=r.i18n.networkErrorMessage}finally{clearTimeout(t),e&&(e=!1,r.message="")}}r.database&&e()}),s(()=>{r.pickerStyle=` - --num-groups: ${r.groups.length}; - --indicator-opacity: ${r.searchMode?0:1}; - --num-skintones: 6;`}),s(()=>{r.customEmoji&&r.database&&k()}),s(()=>{r.customEmoji&&r.customEmoji.length?r.groups!==ee&&(r.groups=ee):r.groups!==et&&(r.currentGroupIndex&&r.currentGroupIndex--,r.groups=et)}),s(()=>{(async function(){r.databaseLoaded&&(r.currentSkinTone=await r.database.getPreferredSkinTone())})()}),s(()=>{r.skinTones=Array(6).fill().map((e,t)=>(function(e,t){if(0===t)return e;let o=e.indexOf("‍");return -1!==o?e.substring(0,o)+String.fromCodePoint(127995+t-1)+e.substring(o):(e.endsWith("️")&&(e=e.substring(0,e.length-1)),e+"\ud83c"+String.fromCodePoint(57339+t-1))})(r.skinToneEmoji,t))}),s(()=>{r.skinToneButtonText=r.skinTones[r.currentSkinTone]}),s(()=>{r.skinToneButtonLabel=r.i18n.skinToneLabel.replace("{skinTone}",r.i18n.skinTones[r.currentSkinTone])}),s(()=>{async function e(){let{database:e}=r,t=(await Promise.all(ea.map(t=>e.getEmojiByUnicodeOrName(t)))).filter(Boolean);r.defaultFavoriteEmojis=t}r.databaseLoaded&&e()}),s(()=>{async function e(){k();let{database:e,defaultFavoriteEmojis:t,numColumns:o}=r,i=await e.getTopFavoriteEmoji(o),n=await S(ep([...i,...t],e=>e.unicode||e.name).slice(0,o));r.currentFavorites=n}r.databaseLoaded&&r.defaultFavoriteEmojis&&e()}),s(()=>{(async function(){let{searchText:e,currentGroup:t,databaseLoaded:o,customEmoji:i}=r;if(o){if(e.length>=2){let t=await j(e);r.searchText===e&&(m(t),p(!0))}else{let{id:e}=t;if(-1!==e||i&&i.length){let t=await C(e);r.currentGroup.id===e&&(m(t),p(!1))}}}else r.currentEmojis=[],r.searchMode=!1})()}),s(()=>{let{currentEmojis:e,emojiVersion:o}=r,n=e.filter(e=>e.unicode).filter(e=>ei(e)&&!eu.has(e.unicode));!o&&n.length?(m(e),eg(()=>{(function(e,o,i){for(let n of e){let e=ef(i(n));void 0===t&&(t=ef(o));let a=e/1.8{var e;(e=i.tabpanelElement)&&(e.scrollTop=0)}))}),s(()=>{}),s(()=>{g(function(){let{searchMode:e,currentEmojis:t}=r;if(e)return[{category:"",emojis:t}];let o=new Map;for(let e of t){let t=e.category||"",i=o.get(t);i||(i=[],o.set(t,i)),i.push(e)}return[...o.entries()].map(([e,t])=>({category:e,emojis:t})).sort((e,t)=>r.customCategorySorting(e.category,t.category))}())}),s(()=>{r.activeSearchItemId=-1!==r.activeSearchItem&&r.currentEmojis[r.activeSearchItem].id}),s(()=>{let{rawSearchText:e}=r;eo(()=>{r.searchText=(e||"").trim(),r.activeSearchItem=-1})}),s(()=>{r.skinTonePickerExpanded?i.skinToneDropdown.addEventListener("transitionend",()=>{r.skinTonePickerExpandedAfterAnimation=!0},{once:!0}):r.skinTonePickerExpandedAfterAnimation=!1}),{$set(e){ej(r,e)},$destroy(){n.abort()}}}(this.shadowRoot,this._ctx))}disconnectedCallback(){ex(()=>{if(!this.isConnected&&this._cmp){this._cmp.$destroy(),this._cmp=void 0;let{database:e}=this._ctx;e.close().catch(e=>console.error(e))}})}static get observedAttributes(){return["locale","data-source","skin-tone-emoji","emoji-version"]}attributeChangedCallback(e,t,o){this._set(e.replace(/-([a-z])/g,(e,t)=>t.toUpperCase()),"emoji-version"===e?parseFloat(o):o)}_set(e,t){this._ctx[e]=t,this._cmp&&this._cmp.$set({[e]:t}),["locale","dataSource"].includes(e)&&this._dbFlush()}_dbCreate(){let{locale:e,dataSource:t,database:o}=this._ctx;o&&o.locale===e&&o.dataSource===t||this._set("database",new Z({locale:e,dataSource:t}))}_dbFlush(){ex(()=>this._dbCreate())}}const e$={};for(const e of eL)e$[e]={get(){return"database"===e&&this._dbCreate(),this._ctx[e]},set(t){if("database"===e)throw Error("database is read-only");this._set(e,t)}};function e_(e){if("TEXTAREA"!==e.nodeName)return!1;if(void 0===eT){var t=document.createElement("textarea");t.value=1,eT=!!t.firstChild}return eT}Object.defineProperties(eD.prototype,e$),customElements.get("emoji-picker")||customElements.define("emoji-picker",eD);var eI=function(e,t){if(e.focus(),document.selection){var o=document.selection.createRange();o.text=t,o.collapse(!1),o.select();return}if(!document.execCommand("insertText",!1,t)){var i=e.selectionStart,n=e.selectionEnd;if("function"==typeof e.setRangeText)e.setRangeText(t);else{var a=document.createRange(),r=document.createTextNode(t);if(e_(e)){var s=e.firstChild;if(s){for(var l=0,d=null,c=null;s&&(null===d||null===c);){var u=s.nodeValue.length;i>=l&&i<=l+u&&a.setStart(d=s,i-l),n>=l&&n<=l+u&&a.setEnd(c=s,n-l),l+=u,s=s.nextSibling}i!==n&&a.deleteContents()}else e.appendChild(r)}if(e_(e)&&"#text"===a.commonAncestorContainer.nodeName)a.insertNode(r);else{var h=e.value;e.value=h.slice(0,i)+t+h.slice(n)}}e.setSelectionRange(i+t.length,i+t.length);var m=document.createEvent("UIEvent");m.initEvent("input",!0,!1),e.dispatchEvent(m)}};function eB(e){return null!==e&&"object"==typeof e?"share"in navigator&&"canShare"in navigator&&navigator.canShare(e):"share"in navigator}Object.defineProperty({},"WebShare",{get:function(){return eF},set:void 0,enumerable:!0,configurable:!0});let eR=` - :host { - display: inline-block; - } -`,eM=document.createElement("template");eM.innerHTML=` - - -`;class eF extends HTMLElement{#e;#t;#o=[];constructor(){super(),this.shadowRoot||this.attachShadow({mode:"open",delegatesFocus:!0}).appendChild(eM.content.cloneNode(!0)),this.#e=this.shadowRoot?.querySelector('slot[name="button"]')||null,this.#t=this.#i()}static get observedAttributes(){return["disabled"]}attributeChangedCallback(e,t,o){"disabled"===e&&t!==o&&this.#t&&(this.#t.toggleAttribute("disabled",this.disabled),this.#t.setAttribute("aria-disabled",this.disabled.toString()),this.#t.part&&this.#t.part.contains("button")&&this.#t.part.toggle("button--disabled",this.disabled))}connectedCallback(){this.#n("shareUrl"),this.#n("shareTitle"),this.#n("shareText"),this.#n("shareFiles"),this.#n("disabled"),this.#e?.addEventListener("slotchange",this.#a),this.#t?.addEventListener("click",this.#r)}disconnectedCallback(){this.#e?.removeEventListener("slotchange",this.#a),this.#t?.removeEventListener("click",this.#r)}get disabled(){return this.hasAttribute("disabled")}set disabled(e){this.toggleAttribute("disabled",!!e)}get shareUrl(){return this.getAttribute("share-url")||""}set shareUrl(e){this.setAttribute("share-url",e)}get shareTitle(){return this.getAttribute("share-title")||""}set shareTitle(e){this.setAttribute("share-title",e)}get shareText(){return this.getAttribute("share-text")||""}set shareText(e){this.setAttribute("share-text",e)}get shareFiles(){return this.#o}set shareFiles(e){Array.isArray(e)&&e.length>0&&(this.#o=e)}async share(){if(!this.disabled)try{let e={};this.shareUrl&&(e.url=this.shareUrl),this.shareTitle&&(e.title=this.shareTitle),this.shareText&&(e.text=this.shareText),Array.isArray(this.shareFiles)&&this.shareFiles.length>0&&navigator.canShare&&navigator.canShare({files:this.shareFiles})&&(e.files=this.shareFiles),await navigator.share(e),this.dispatchEvent(new CustomEvent("web-share:success",{bubbles:!0,composed:!0,detail:{shareData:e}}))}catch(e){if(e instanceof Error&&"AbortError"===e.name){this.dispatchEvent(new CustomEvent("web-share:abort",{bubbles:!0,composed:!0,detail:{error:e}}));return}this.dispatchEvent(new CustomEvent("web-share:error",{bubbles:!0,composed:!0,detail:{error:e}}))}}#r=e=>{e.preventDefault(),this.disabled||this.share()};#a=e=>{e.target&&"button"===e.target.name&&(this.#t?.removeEventListener("click",this.#r),this.#t=this.#i(),this.#t&&(this.#t.addEventListener("click",this.#r),"BUTTON"===this.#t.nodeName||this.#t.hasAttribute("role")||this.#t.setAttribute("role","button")))};#i(){return this.#e&&this.#e.assignedElements({flatten:!0}).find(e=>"BUTTON"===e.nodeName||"button"===e.getAttribute("slot"))||null}#n(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}static defineCustomElement(e="web-share"){"undefined"==typeof window||window.customElements.get(e)||window.customElements.define(e,eF)}}eF.defineCustomElement(),Object.defineProperty({},"CapturePhoto",{get:function(){return eq},set:void 0,enumerable:!0,configurable:!0});let eN=(e,t,o)=>(Number.isNaN(t)&&(t=0),Number.isNaN(o)&&(o=0),Math.min(Math.max(e,Math.min(t,o)),Math.max(t,o))),eP="capture-photo",eO=` - :host { - display: block; - box-sizing: border-box; - } - - :host *, - :host *::before, - :host *::after { - box-sizing: inherit; - } - - :host([hidden]), - [hidden], - ::slotted([hidden]) { - display: none; - } - - video { - display: block; - } - - #output:empty { - display: none; - } -`,eU=document.createElement("template");eU.innerHTML=` - - - - - - -
- - - - - - - -
- - - -
-`;class eq extends HTMLElement{#e={};#t=null;#i=null;#s=null;#r=null;#a=null;#o=null;#n=null;#l=null;constructor(){super(),this.#e=this.getSupportedConstraints(),this.shadowRoot||this.attachShadow({mode:"open"}).appendChild(eU.content.cloneNode(!0))}static get observedAttributes(){return["no-image","facing-mode","camera-resolution","pan","tilt","zoom"]}attributeChangedCallback(e,t,o){if(!this.isConnected)return;let i=this.getTrackCapabilities(),n=this.getTrackSettings();if("no-image"===e&&t!==o&&this.#d(),"facing-mode"===e&&t!==o&&"facingMode"in this.#e){let e=["user","environment"].includes(this.facingMode||"");"facingMode"in n&&e&&(this.stopVideoStream(),this.startVideoStream())}if("camera-resolution"===e&&t!==o&&"string"==typeof this.cameraResolution&&this.cameraResolution.trim().length>0){let[e=0,t=0]=this.cameraResolution.split("x").map(e=>Number(e));if(e>0&&t>0&&"width"in i&&"height"in i){let o=!!(i.width?.min&&i.width?.max)&&e>=i?.width?.min&&e<=i?.width?.max,a=!!(i.height?.min&&i.height?.max)&&t>=i?.height?.min&&t<=i?.height?.max;"width"in n&&"height"in n&&o&&a&&(this.stopVideoStream(),this.startVideoStream())}}if("pan"===e&&t!==o&&"pan"in this.#e){let e=!!("pan"in i&&i.pan?.min&&i.pan?.max)&&this.pan>=i.pan.min&&this.pan<=i.pan.max;"pan"in n&&"number"==typeof this.pan&&e&&this.#c("pan",this.pan)}if("tilt"===e&&t!==o&&"tilt"in this.#e){let e=!!("tilt"in i&&i.tilt?.min&&i.tilt?.max)&&this.tilt>=i.tilt.min&&this.tilt<=i.tilt.max;"tilt"in n&&"number"==typeof this.tilt&&e&&this.#c("tilt",this.tilt)}if("zoom"===e&&t!==o&&"zoom"in this.#e){let e=!!("zoom"in i&&i.zoom?.min&&i.zoom?.max)&&this.zoom>=i.zoom.min&&this.zoom<=i.zoom.max;"zoom"in n&&"number"==typeof this.zoom&&e&&this.#c("zoom",this.zoom)}}connectedCallback(){if(this.#u("autpoPlay"),this.#u("noImage"),this.#u("facingMode"),this.#u("cameraResolution"),this.#u("pan"),this.#u("tilt"),this.#u("zoom"),this.#u("calculateFileSize"),this.#i=this.shadowRoot?.querySelector("canvas")||null,this.#s=this.shadowRoot?.getElementById("output")||null,this.#r=this.shadowRoot?.querySelector("video")||null,this.#a=this.shadowRoot?.querySelector('slot[name="capture-button"]')||null,this.#o=this.#h(),this.#n=this.shadowRoot?.querySelector('slot[name="facing-mode-button"]')||null,this.#l=this.#m(),this.#r?.addEventListener("loadedmetadata",this.#p),this.#a?.addEventListener("slotchange",this.#g),this.#o?.addEventListener("click",this.#b),this.#n?.addEventListener("slotchange",this.#f),this.#l?.addEventListener("click",this.#v),!eq.isSupported())return this.dispatchEvent(new CustomEvent(`${eP}:error`,{bubbles:!0,composed:!0,detail:{error:{name:"NotSupportedError",message:"Not supported"}}}));this.autoPlay&&this.startVideoStream()}disconnectedCallback(){this.stopVideoStream(),this.#l?.removeEventListener("click",this.#v),this.#o?.removeEventListener("click",this.#b),this.#r?.removeEventListener("canplay",this.#p),this.#a?.removeEventListener("slotchange",this.#g),this.#n?.removeEventListener("slotchange",this.#f)}get autoPlay(){return this.hasAttribute("auto-play")}set autoPlay(e){this.toggleAttribute("auto-play",!!e)}get noImage(){return this.hasAttribute("no-image")}set noImage(e){this.toggleAttribute("no-image",!!e)}get facingMode(){return this.getAttribute("facing-mode")||"user"}set facingMode(e){this.setAttribute("facing-mode",e)}get cameraResolution(){return this.getAttribute("camera-resolution")||""}set cameraResolution(e){this.setAttribute("camera-resolution",e)}get pan(){return Number(this.getAttribute("pan"))||0}set pan(e){this.setAttribute("pan",null!=e?e.toString():e)}get tilt(){return Number(this.getAttribute("tilt"))||0}set tilt(e){this.setAttribute("tilt",null!=e?e.toString():e)}get zoom(){return Number(this.getAttribute("zoom"))||1}set zoom(e){this.setAttribute("zoom",null!=e?e.toString():e)}get loading(){return this.hasAttribute("loading")}get calculateFileSize(){return this.hasAttribute("calculate-file-size")}set calculateFileSize(e){this.toggleAttribute("calculate-file-size",!!e)}#v=e=>{e.preventDefault(),this.loading||(this.facingMode="user"!==this.facingMode&&this.facingMode?"user":"environment")};#b=e=>{e.preventDefault(),this.capture()};#p=e=>{let t=e.target;t.play().then(()=>{this.dispatchEvent(new CustomEvent(`${eP}:video-play`,{bubbles:!0,composed:!0,detail:{video:t}}))}).catch(e=>{this.dispatchEvent(new CustomEvent(`${eP}:error`,{bubbles:!0,composed:!0,detail:{error:e}}))}).finally(()=>{this.removeAttribute("loading")})};#d(){this.#s&&Array.from(this.#s.childNodes).forEach(e=>e.remove())}#c(e,t){if(!this.#t||!e||!t)return;let[o]=this.#t.getVideoTracks(),i=this.getTrackCapabilities();e in this.getTrackSettings()&&o.applyConstraints({advanced:[{[e]:eN(Number(t),i[e]?.min||1,i[e]?.max||1)}]})}#g=e=>{e.target?.name==="capture-button"&&(this.#o?.removeEventListener("click",this.#b),this.#o=this.#h(),this.#o&&(this.#o.addEventListener("click",this.#b),"BUTTON"===this.#o.nodeName||this.#o.hasAttribute("role")||this.#o.setAttribute("role","button")))};#f=e=>{e.target?.name==="facing-mode-button"&&(this.#l?.removeEventListener("click",this.#v),this.#l=this.#m(),this.#l&&(this.#l.addEventListener("click",this.#v),"BUTTON"===this.#l.nodeName||this.#l.hasAttribute("role")||this.#l.setAttribute("role","button")))};#m(){return this.#n&&this.#n.assignedElements({flatten:!0}).find(e=>"BUTTON"===e.nodeName||"facing-mode-button"===e.getAttribute("slot"))||null}#h(){return this.#a&&this.#a.assignedElements({flatten:!0}).find(e=>"BUTTON"===e.nodeName||"capture-button"===e.getAttribute("slot"))||null}#u(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}async startVideoStream(){if(!eq.isSupported()||this.#t)return;this.setAttribute("loading","");let e={video:{facingMode:{ideal:this.facingMode||"user"},pan:!0,tilt:!0,zoom:!0},audio:!1};if("string"==typeof this.cameraResolution&&this.cameraResolution.trim().length>0){let[t=0,o=0]=this.cameraResolution.split("x").map(e=>Number(e));t>0&&o>0&&(e.video.width=t,e.video.height=o)}try{this.#t=await navigator.mediaDevices.getUserMedia(e),this.#r&&(this.#r.srcObject=this.#t),this.#c("pan",this.pan),this.#c("tilt",this.tilt),this.#c("zoom",this.zoom);let t=this.getTrackSettings();"facingMode"in t&&this.#n&&(this.#n.hidden=!1)}catch(e){this.dispatchEvent(new CustomEvent(`${eP}:error`,{bubbles:!0,composed:!0,detail:{error:e}}))}finally{this.removeAttribute("loading")}}stopVideoStream(){if(!this.#r||!this.#t)return;let[e]=this.#t.getVideoTracks();e?.stop(),this.#r.srcObject=null,this.#t=null}async capture(){if(!this.loading&&this.#i&&this.#r)try{let e=this.#i.getContext("2d"),t=this.#r.videoWidth,o=this.#r.videoHeight;this.#i.width=t,this.#i.height=o,e?.drawImage(this.#r,0,0,t,o);let i=this.#i.toDataURL("image/png");if("string"==typeof i&&i.includes("data:image")){if(!this.noImage){let e=new Image;e.src=i,e.width=t,e.height=o,e.setAttribute("part","output-image"),this.#d(),this.#s?.appendChild(e)}let e={dataURI:i,width:t,height:o};if(this.calculateFileSize)try{let t=await fetch(i),o=(await t.blob()).size;o&&(e.size=o)}catch(e){}this.dispatchEvent(new CustomEvent(`${eP}:success`,{bubbles:!0,composed:!0,detail:e}))}}catch(e){this.dispatchEvent(new CustomEvent(`${eP}:error`,{bubbles:!0,composed:!0,detail:{error:e}}))}}getSupportedConstraints(){return eq.isSupported()&&navigator.mediaDevices.getSupportedConstraints()||{}}getTrackCapabilities(){if(!this.#t)return{};let[e]=this.#t.getVideoTracks();return e&&"function"==typeof e.getCapabilities&&e.getCapabilities()||{}}getTrackSettings(){if(!this.#t)return{};let[e]=this.#t.getVideoTracks();return e&&"function"==typeof e.getSettings&&e.getSettings()||{}}static isSupported(){return!!navigator.mediaDevices?.getUserMedia}static defineCustomElement(e=eP){"undefined"==typeof window||window.customElements.get(e)||window.customElements.define(e,eq)}}eq.defineCustomElement(),Object.defineProperty({},"ModalElement",{get:function(){return eV},set:void 0,enumerable:!0,configurable:!0});let eH=document.createElement("template"),eW=` - :host { - --me-width: 32rem; - --me-height: fit-content; - --me-border-color: initial; - --me-border-style: solid; - --me-border-width: initial; - --me-border-radius: 0; - --me-box-shadow: none; - --me-background-color: canvas; - --me-header-spacing: 1rem; - --me-body-spacing: 1rem; - --me-footer-spacing: 1rem; - --me-header-background-color: transparent; - --me-body-background-color: transparent; - --me-footer-background-color: transparent; - --me-close-border-radius: 0; - --me-close-background-color: transparent; - --me-backdrop-background: rgba(0, 0, 0, 0.5); - --me-backdrop-filter: none; - - display: contents; - box-sizing: border-box; - } - - :host *, - :host *:after, - :host *:before { - box-sizing: inherit; - } - - :host([hidden]), - [hidden] { - display: none !important; - } - - /* Dialog */ - .dialog { - --dialog-placement-margin: calc((2em + 6px) / 2); - - width: var(--me-width); - height: var(--me-height); - padding: 0; - border-color: var(--me-border-color); - border-style: var(--me-border-style); - border-width: var(--me-border-width); - border-radius: var(--me-border-radius); - box-shadow: var(--me-box-shadow); - background-color: var(--me-background-color); - } - - .dialog[open] { - display: flex; - } - - :host([fullscreen]) .dialog { - max-width: 100%; - max-height: 100%; - width: 100%; - height: 100%; - } - - .dialog::backdrop { - background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5)); - backdrop-filter: var(--me-backdrop-filter, none); - opacity: 0; - } - - .dialog[open]::backdrop { - opacity: 1; - } - - /* Dialog placement */ - :host(:not([fullscreen])[placement="top-start"]) .dialog { - margin-block-start: var(--dialog-placement-margin); - margin-inline-start: var(--dialog-placement-margin); - } - - :host(:not([fullscreen])[placement="top-center"]) .dialog { - margin-block-start: var(--dialog-placement-margin); - } - - :host(:not([fullscreen])[placement="top-end"]) .dialog { - margin-block-start: var(--dialog-placement-margin); - margin-inline-end: var(--dialog-placement-margin); - } - - :host(:not([fullscreen])[placement="center-start"]) .dialog { - margin-inline-start: var(--dialog-placement-margin); - } - - :host(:not([fullscreen])[placement="center"]) .dialog { - margin: auto; - } - - :host(:not([fullscreen])[placement="center-end"]) .dialog { - margin-inline-end: var(--dialog-placement-margin); - } - - :host(:not([fullscreen])[placement="bottom-start"]) .dialog { - margin-block-end: var(--dialog-placement-margin); - margin-inline-start: var(--dialog-placement-margin); - } - - :host(:not([fullscreen])[placement="bottom-center"]) .dialog { - margin-block-end: var(--dialog-placement-margin); - } - - :host(:not([fullscreen])[placement="bottom-end"]) .dialog { - margin-block-end: var(--dialog-placement-margin); - margin-inline-end: var(--dialog-placement-margin); - } - - /* Dialog animations */ - @media (prefers-reduced-motion: no-preference) { - .dialog:not(.dialog--no-animations), - .dialog:not(.dialog--no-animations)::backdrop { - transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete; - } - - /* 1. IS-OPEN STATE */ - .dialog[open] { - transform: scale(1); - opacity: 1; - } - - /* 2. EXIT STATE */ - .dialog { - transform: scale(0.95); - opacity: 0; - } - - /* 0. BEFORE-OPEN STATE */ - @starting-style { - .dialog[open] { - transform: scale(0.95); - opacity: 0; - } - - .dialog[open]::backdrop { - opacity: 0; - } - } - - .dialog--pulse:not(.dialog--no-animations) { - animation-name: pulse; - animation-duration: 300ms; - animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9); - } - - @keyframes pulse { - 0% { transform: scale(1); } - 50% { transform: scale(1.02); } - 100% { transform: scale(1); } - } - } - - /* Dialog panel, header, body, footer */ - .dialog__panel { - display: flex; - flex-direction: column; - flex: 1 1 auto; - width: 100%; - } - - .dialog__header { - display: flex; - align-items: center; - padding: var(--me-header-spacing); - column-gap: 0.5rem; - background-color: var(--me-header-background-color); - } - - :host([no-close-button]) .dialog__header { - column-gap: 0; - } - - .dialog__title { - display: block; - flex: 1 1 auto; - padding: 0; - margin: 0; - } - - .dialog__body { - display: block; - flex: 1 1 auto; - padding: var(--me-body-spacing); - overflow: auto; - background-color: var(--me-body-background-color); - overscroll-behavior: contain; - } - - .dialog__footer { - flex: 0 0 auto; - text-align: end; - - padding: var(--me-footer-spacing); - background-color: var(--me-footer-background-color); - } - - .dialog__close { - display: inline-flex; - align-items: center; - justify-content: center; - padding: 0.4375rem; - border: none; - background-color: transparent; - } - - .dialog__close:not(:disabled) { - cursor: pointer; - } - - .dialog__close:disabled { - cursor: not-allowed; - } -`;eH.innerHTML=` - - - -
-
- - -
- -
-
- - - -
- -
-
-
-`;class eV extends HTMLElement{#t=null;#e=null;#s=null;#l=void 0;constructor(){super(),this.shadowRoot||this.attachShadow({mode:"open"}).appendChild(eH.content.cloneNode(!0)),this.shadowRoot&&(this.#t=this.shadowRoot.querySelector("dialog"),this.#e=this.shadowRoot.querySelector('slot[name="footer"]'),this.#s=this.shadowRoot.querySelector('slot[name="close"]'))}static get observedAttributes(){return["open","no-header","no-animations","no-close-button","close-label"]}attributeChangedCallback(e,t,o){if(null!==this.#t){if("open"===e&&t!==o&&(this.open?(this.#t.showModal(),this.dispatchEvent(new CustomEvent("me-open",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow="hidden")):this.#t.close()),"no-header"===e&&t!==o){let e=this.#t.querySelector(".dialog__header");null!==e&&(e.hidden=this.noHeader)}if("no-animations"===e&&t!==o&&this.#t.classList.toggle("dialog--no-animations",this.noAnimations),"no-close-button"===e&&t!==o){let e=this.#t.querySelector(".dialog__close");null!==e&&(e.hidden=this.noCloseButton)}"close-label"===e&&t!==o&&this.#a()}}connectedCallback(){this.#i("open"),this.#i("staticBackdrop"),this.#i("noHeader"),this.#i("noAnimations"),this.#i("noCloseButton"),this.#i("fullscreen"),this.#i("preserveOverflow"),this.#i("placement"),this.#i("closeLabel"),this.#t?.addEventListener("click",this.#r),this.#t?.addEventListener("close",this.#n),this.#t?.addEventListener("cancel",this.#o),this.#t?.querySelector('form[method="dialog"]')?.addEventListener("submit",this.#u),this.#e?.addEventListener("slotchange",this.#h),this.#s?.addEventListener("slotchange",this.#c)}disconnectedCallback(){this.#l&&clearTimeout(this.#l),this.#t?.addEventListener("click",this.#r),this.#t?.removeEventListener("close",this.#n),this.#t?.removeEventListener("cancel",this.#o),this.#t?.querySelector('form[method="dialog"]')?.removeEventListener("submit",this.#u),this.#e?.removeEventListener("slotchange",this.#h),this.#s?.removeEventListener("slotchange",this.#c)}get open(){return this.hasAttribute("open")}set open(e){this.toggleAttribute("open",!!e)}get staticBackdrop(){return this.hasAttribute("static-backdrop")}set staticBackdrop(e){this.toggleAttribute("static-backdrop",!!e)}get noHeader(){return this.hasAttribute("no-header")}set noHeader(e){this.toggleAttribute("no-header",!!e)}get noAnimations(){return this.hasAttribute("no-animations")}set noAnimations(e){this.toggleAttribute("no-animations",!!e)}get noCloseButton(){return this.hasAttribute("no-close-button")}set noCloseButton(e){this.toggleAttribute("no-close-button",!!e)}get fullscreen(){return this.hasAttribute("fullscreen")}set fullscreen(e){this.toggleAttribute("fullscreen",!!e)}get preserveOverflow(){return this.hasAttribute("preserve-overflow")}set preserveOverflow(e){this.toggleAttribute("preserve-overflow",!!e)}get placement(){return this.getAttribute("placement")||"center"}set placement(e){this.setAttribute("placement",null!=e?e.toString():e)}get closeLabel(){return this.getAttribute("close-label")||"Close"}set closeLabel(e){this.setAttribute("close-label",null!=e?e.toString():e)}#a(){if(null===this.#t)return;let e=this.#t.querySelector(".dialog__close");if(null===e)return;let t=this.#s?.assignedElements()||[];t?.some(e=>e.textContent?.replace(/\s/g,"")!=="")?e.removeAttribute("aria-label"):e.setAttribute("aria-label",this.closeLabel)}#g(){this.#l||(this.#t?.classList.add("dialog--pulse"),this.#l=setTimeout(()=>{this.#t?.classList.remove("dialog--pulse"),clearTimeout(this.#l),this.#l=void 0},300))}#n=()=>{this.open=!1,this.dispatchEvent(new CustomEvent("me-close",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow="")};#o=e=>{let t=this.#m("escape-key");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#g())};#u=e=>{let t=this.#m("close-button");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#g())};#r=e=>{let t=e.target;if(t===e.currentTarget){let e=this.#m("backdrop-click");this.dispatchEvent(e),e.defaultPrevented||this.staticBackdrop?this.noAnimations||this.#g():this.hide()}if(t instanceof HTMLElement&&null!==t.closest("[data-me-close]")){let e=this.#m("external-invoker");this.dispatchEvent(e),e.defaultPrevented?this.noAnimations||this.#g():this.hide()}};#h=()=>{if(null===this.#t)return;let e=this.#t.querySelector(".dialog__footer");if(null===e)return;let t=this.#e?.assignedNodes(),o=!!t&&t.length>0;e.hidden=!o};#c=()=>{this.#a()};#m(e){return new CustomEvent("me-request-close",{bubbles:!0,composed:!0,cancelable:!0,detail:{reason:e,element:this}})}#i(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}show(){this.open||(this.open=!0)}hide(){this.open&&(this.open=!1)}static defineCustomElement(e="modal-element"){"undefined"==typeof window||window.customElements.get(e)||window.customElements.define(e,eV)}}eV.defineCustomElement(),Object.defineProperty({},"FilesDropzone",{get:function(){return e7},set:void 0,enumerable:!0,configurable:!0});let eG=new Map([["aac","audio/aac"],["abw","application/x-abiword"],["arc","application/x-freearc"],["avif","image/avif"],["avi","video/x-msvideo"],["azw","application/vnd.amazon.ebook"],["bin","application/octet-stream"],["bmp","image/bmp"],["bz","application/x-bzip"],["bz2","application/x-bzip2"],["cda","application/x-cdf"],["csh","application/x-csh"],["css","text/css"],["csv","text/csv"],["doc","application/msword"],["docx","application/vnd.openxmlformats-officedocument.wordprocessingml.document"],["eot","application/vnd.ms-fontobject"],["epub","application/epub+zip"],["gz","application/gzip"],["gif","image/gif"],["heic","image/heic"],["heif","image/heif"],["htm","text/html"],["html","text/html"],["ico","image/vnd.microsoft.icon"],["ics","text/calendar"],["jar","application/java-archive"],["jpeg","image/jpeg"],["jpg","image/jpeg"],["jxl","image/jxl"],["js","text/javascript"],["json","application/json"],["jsonld","application/ld+json"],["markdown","text/markdown"],["md","text/markdown"],["mid","audio/midi"],["midi","audio/midi"],["mjs","text/javascript"],["mp3","audio/mpeg"],["mp4","video/mp4"],["mpeg","video/mpeg"],["mpkg","application/vnd.apple.installer+xml"],["odp","application/vnd.oasis.opendocument.presentation"],["ods","application/vnd.oasis.opendocument.spreadsheet"],["odt","application/vnd.oasis.opendocument.text"],["oga","audio/ogg"],["ogv","video/ogg"],["ogx","application/ogg"],["opus","audio/opus"],["otf","font/otf"],["png","image/png"],["pdf","application/pdf"],["php","application/x-httpd-php"],["ppt","application/vnd.ms-powerpoint"],["pptx","application/vnd.openxmlformats-officedocument.presentationml.presentation"],["rar","application/vnd.rar"],["rtf","application/rtf"],["sh","application/x-sh"],["svg","image/svg+xml"],["swf","application/x-shockwave-flash"],["tar","application/x-tar"],["tif","image/tiff"],["tiff","image/tiff"],["ts","video/mp2t"],["ttf","font/ttf"],["txt","text/plain"],["vsd","application/vnd.visio"],["wav","audio/wav"],["weba","audio/webm"],["webm","video/webm"],["webp","image/webp"],["woff","font/woff"],["woff2","font/woff2"],["xhtml","application/xhtml+xml"],["xls","application/vnd.ms-excel"],["xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],["xml","application/xml"],["xul","application/vnd.mozilla.xul+xml"],["zip","application/zip"],["7z","application/x-7z-compressed"],["mkv","video/x-matroska"],["mov","video/quicktime"],["msg","application/vnd.ms-outlook"]]),eX=[".DS_Store","Thumbs.db"],eY=e=>{let{name:t}=e;if(t&&-1!==t.lastIndexOf(".")&&!e.type){let o=(t.split(".").pop()||"").toLowerCase(),i=eG.get(o);i&&Object.defineProperty(e,"type",{value:i,writable:!1,configurable:!1,enumerable:!0})}return e},eK=(e,t)=>{let o=eY(e);if("string"!=typeof o.path){let{webkitRelativePath:i}=e;Object.defineProperty(o,"path",{value:"string"==typeof t?t:i||e.name,writable:!1,configurable:!1,enumerable:!0})}return o},eJ=async e=>await new Promise((t,o)=>{e.readEntries(t,o)}),eQ=async e=>{let t=[],o=await eJ(e);for(;o.length>0;)t.push(...o),o=await eJ(e);return t},eZ=e=>new Promise((t,o)=>{e.file(o=>t(eK(o,e.fullPath)),o)}),e0=async e=>{let t=[],o=[];for(let t of e){if("file"!==t.kind)continue;let e=t.getAsEntry?t.getAsEntry():t.webkitGetAsEntry();o.push(e)}for(;o.length>0;){let e=o.shift();if(e){if(e.isFile){let o=await eZ(e);-1===eX.indexOf(o.name)&&t.push(o)}else e.isDirectory&&o.push(...await eQ(e.createReader()))}}return t},e1=async e=>{let t=[];for(let o of e)-1===eX.indexOf(o.name)&&t.push(eK(o));return t},e8=async e=>e.dataTransfer?e.dataTransfer.items?await e0(e.dataTransfer.items):await e1(e.dataTransfer.files):await e1(e.target.files),e3="files-dropzone",e2="TOO_MANY_FILES",e5=document.createElement("template"),e4=` - *, - *::before, - *::after { - box-sizing: border-box; - } - - :host([hidden]), - [hidden] { - display: none !important; - } - - :host { - --dropzone-border-width: 2px; - --dropzone-border-style: dashed; - --dropzone-border-radius: 0.25rem; - --dropzone-border-color: #6c757d; - --dropzone-border-color-dragover: #0d6efd; - --dropzone-border-color-hover: var(--dropzone-border-color-dragover); - --dropzone-background-color: #ffffff; - --dropzone-background-color-dragover: #f4f4f5; - --dropzone-background-color-hover: var(--dropzone-background-color-dragover); - --dropzone-body-color: #3f3f46; - --dropzone-body-color-dragover: var(--dropzone-body-color); - --dropzone-body-color-hover: var(--dropzone-body-color-dragover); - --dropzone-focus-shadow-rgb: 49,132,253; - --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5); - --transition-duration: 0.2s; /* for backwards compatibility */ - --dropzone-transition-duration: var(--transition-duration); - - display: block; - } - - :host(:not([no-style])) .dropzone { - border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color); - border-radius: var(--dropzone-border-radius); - padding: 3rem 1rem; - overflow: hidden; - background-color: var(--dropzone-background-color); - color: var(--dropzone-body-color); - text-align: center; - cursor: pointer; - transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out; - } - - :host(:not([no-style])[disabled]) .dropzone { - opacity: 0.8; - cursor: not-allowed; - user-select: none; - } - - :host(:not([no-style]):not([disabled])) .dropzone--dragover { - border-color: var(--dropzone-border-color-dragover); - background-color: var(--dropzone-background-color-dragover); - color: var(--dropzone-body-color-dragover); - } - - :host(:not([no-style]):not([disabled])) .dropzone:focus-visible { - outline: none; - box-shadow: var(--dropzone-focus-box-shadow); - } - - @media (hover: hover) { - :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover { - border-color: var(--dropzone-border-color-hover); - background-color: var(--dropzone-background-color-hover); - color: var(--dropzone-body-color-hover); - } - } -`;e5.innerHTML=` - - - - -
- Drag 'n' drop files here, or click to select files -
-`;class e7 extends HTMLElement{#t=null;#e=null;constructor(){super(),this.shadowRoot||this.attachShadow({mode:"open",delegatesFocus:!0}).appendChild(e5.content.cloneNode(!0)),this.shadowRoot&&(this.#t=this.shadowRoot.getElementById("file-input"),this.#e=this.shadowRoot.getElementById("dropzone"))}static get observedAttributes(){return["accept","disabled","multiple"]}attributeChangedCallback(e,t,o){"accept"===e&&t!==o&&this.#t&&(this.#t.accept=this.accept),"disabled"===e&&t!==o&&this.#t&&(this.#t.disabled=this.disabled,this.disabled?(this.#e?.removeAttribute("tabindex"),this.#e?.setAttribute("aria-disabled","true")):(this.#e?.setAttribute("tabindex","0"),this.#e?.setAttribute("aria-disabled","false"))),"multiple"===e&&t!==o&&this.#t&&(this.#t.multiple=this.multiple)}connectedCallback(){this.#s("accept"),this.#s("disabled"),this.#s("maxFiles"),this.#s("maxSize"),this.#s("minSize"),this.#s("multiple"),this.#s("autoFocus"),this.#s("noStyle"),this.#t?.addEventListener("change",this.#i),this.#e?.addEventListener("dragenter",this.#n),this.#e?.addEventListener("dragover",this.#a),this.#e?.addEventListener("dragleave",this.#r),this.#e?.addEventListener("drop",this.#o),this.#e?.addEventListener("click",this.#u),this.#e?.addEventListener("keyup",this.#l),this.autoFocus&&this.#e?.focus()}disconnectedCallback(){this.#t?.removeEventListener("change",this.#i),this.#e?.removeEventListener("dragenter",this.#n),this.#e?.removeEventListener("dragover",this.#a),this.#e?.removeEventListener("dragleave",this.#r),this.#e?.removeEventListener("drop",this.#o),this.#e?.removeEventListener("click",this.#u),this.#e?.removeEventListener("keyup",this.#l)}get accept(){return this.getAttribute("accept")||""}set accept(e){this.setAttribute("accept",null!=e?e.toString():e)}get disabled(){return this.hasAttribute("disabled")}set disabled(e){this.toggleAttribute("disabled",!!e)}get maxFiles(){let e=Number(this.getAttribute("max-files"))||0;return e<=0?1/0:Math.floor(Math.abs(e))}set maxFiles(e){this.setAttribute("max-files",null!=e?e.toString():e)}get maxSize(){let e=this.getAttribute("max-size");if(null===e)return 1/0;let t=Number(e);return Number.isNaN(t)?1/0:t}set maxSize(e){this.setAttribute("max-size",null!=e?e.toString():e)}get minSize(){let e=this.getAttribute("min-size");if(null===e)return 0;let t=Number(e);return Number.isNaN(t)?0:t}set minSize(e){this.setAttribute("min-size",null!=e?e.toString():e)}get multiple(){return this.hasAttribute("multiple")}set multiple(e){this.toggleAttribute("multiple",!!e)}get autoFocus(){return this.hasAttribute("auto-focus")}set autoFocus(e){this.toggleAttribute("auto-focus",!!e)}get noStyle(){return this.hasAttribute("no-style")}set noStyle(e){this.toggleAttribute("no-style",!!e)}#i=async e=>{try{this.#p(await e8(e))}catch(e){this.dispatchEvent(new CustomEvent(`${e3}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}};#n=()=>{this.disabled||this.dispatchEvent(new Event(`${e3}-dragenter`,{bubbles:!0,composed:!0}))};#a=e=>{if(e.preventDefault(),this.disabled){e.dataTransfer.dropEffect="none";return}e.dataTransfer.dropEffect="copy",this.#e&&(this.#e.classList.add("dropzone--dragover"),this.#e.part.add("dropzone--dragover")),this.dispatchEvent(new Event(`${e3}-dragover`,{bubbles:!0,composed:!0}))};#r=()=>{this.disabled||(this.#e&&(this.#e.classList.remove("dropzone--dragover"),this.#e.part.remove("dropzone--dragover")),this.dispatchEvent(new Event(`${e3}-dragleave`,{bubbles:!0,composed:!0})))};#o=async e=>{if(!this.disabled){e.preventDefault(),this.#e&&(this.#e.classList.remove("dropzone--dragover"),this.#e.part.remove("dropzone--dragover"));try{this.#p(await e8(e))}catch(e){this.dispatchEvent(new CustomEvent(`${e3}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}}};#u=()=>{this.disabled||this.#t?.click()};#l=e=>{this.disabled||" "!==e.key&&"Enter"!==e.key||this.#t?.click()};#p(e){if(!Array.isArray(e)||!e.length)return;let t=[],o=[],i=e.length;if(!this.multiple&&i>1)for(let t of e)o.push({file:t,errors:[{code:e2,message:"Too many files selected. Only 1 file is allowed."}]});else if(this.multiple&&i>this.maxFiles)for(let t of e)o.push({file:t,errors:[{code:e2,message:`Too many files selected. Only ${this.maxFiles} ${this.maxFiles>1?"files are":"file is"} allowed.`}]});else for(let i of e){let e=function(e,t=""){if(!t)return!0;let o=[...new Set(t.split(",").map(e=>e.trim()).filter(Boolean))],i=e.type,n=i.replace(/\/.*$/,"");for(let t of o)if("."===t.charAt(0)){if(-1!==e.name.toLowerCase().indexOf(t.toLowerCase(),e.name.length-t.length))return!0}else if(/\/\*$/.test(t)){if(n===t.replace(/\/.*$/,""))return!0}else if(i===t)return!0;return!1}(i,this.accept),n=i.size>this.maxSize,a=i.size0&&this.dispatchEvent(new CustomEvent(`${e3}-drop-accepted`,{bubbles:!0,composed:!0,detail:{acceptedFiles:t}})),o.length>0&&this.dispatchEvent(new CustomEvent(`${e3}-drop-rejected`,{bubbles:!0,composed:!0,detail:{rejectedFiles:o}})),this.#t&&(this.#t.value=this.#t.defaultValue)}openFileDialog(){this.disabled||this.#t?.click()}#s(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}static defineCustomElement(e=e3){"undefined"==typeof window||window.customElements.get(e)||window.customElements.define(e,e7)}}e7.defineCustomElement();const e6=["image/jpg","image/jpeg","image/png","image/apng","image/gif","image/webp","image/avif"],e9=(e="",t="")=>{let o=Math.random().toString(36).substring(2,8);return`${"string"==typeof e&&""!==e?e+"-":""}${o}${"string"==typeof t&&""!==t?"-"+t:""}`},te=async(e={})=>{let t=await fetch(e.url),o=await t.blob(),i=e.mimeType||o.type||"";if(!e6.includes(i))throw Error(`This is not an accepted image format. Accepted MIME types are: ${e6.join(", ")}`);return new File([o],e.filename||"",o)},tt=localStorage,to=new class{#y=null;#w=null;constructor(e,t=localStorage){if(!e)throw Error("Storage prefix is required");if(t!==localStorage&&t!==sessionStorage)throw Error("Storage provider is not supported");this.#y=e,this.#w=t}set(e,t){try{this.#w.setItem(`${this.#y}${e}`,JSON.stringify(t))}catch(e){console.error("Error saving to storage",e)}}get(e){try{let t=this.#w.getItem(`${this.#y}${e}`);return t?JSON.parse(t):null}catch(e){return console.error("Error getting from storage",e),null}}}("meme-generator/",tt),ti=e=>"string"==typeof e;var tn={};tn=new URL("Pressuru.684952ea.ttf",import.meta.url).toString();var ta={};ta=new URL("Oswald-Regular.89ec7d89.ttf",import.meta.url).toString();var tr={};tr=new URL("Oswald-Bold.0f6a7ca6.ttf",import.meta.url).toString();var ts={};ts=new URL("Roboto-Regular.ca197847.ttf",import.meta.url).toString();var tl={};tl=new URL("Roboto-Bold.fdb9b54a.ttf",import.meta.url).toString();var td={};td=new URL("RobotoCondensed-Regular.d585f5c7.ttf",import.meta.url).toString();var tc={};tc=new URL("RobotoCondensed-Bold.e1f96d4b.ttf",import.meta.url).toString();var tu={};tu=new URL("CourierPrime-Regular.3a25a501.ttf",import.meta.url).toString();var th={};th=new URL("CourierPrime-Bold.3d6bf689.ttf",import.meta.url).toString();var tm={};tm=new URL("OpenSans-Regular.edf9e01b.ttf",import.meta.url).toString();var tp={};tp=new URL("OpenSans-Bold.8fceb72b.ttf",import.meta.url).toString();const tg=[{name:"Pressuru",label:"Pressuru",path:o(tn),style:"normal",weight:"400"},{name:"Oswald-Regular",label:"Oswald",path:o(ta),style:"normal",weight:"400"},{name:"Oswald-Bold",label:"Oswald Bold",path:o(tr),style:"normal",weight:"700"},{name:"Roboto-Regular",label:"Roboto",path:o(ts),style:"normal",weight:"400"},{name:"Roboto-Bold",label:"Roboto Bold",path:o(tl),style:"normal",weight:"700"},{name:"RobotoCondensed-Regular",label:"Roboto Condensed",path:o(td),style:"normal",weight:"400"},{name:"RobotoCondensed-Bold",label:"Roboto Condensed Bold",path:o(tc),style:"normal",weight:"700"},{name:"CourierPrime-Regular",label:"Courier Prime",path:o(tu),style:"normal",weight:"400"},{name:"CourierPrime-Bold",label:"Courier Prime Bold",path:o(th),style:"normal",weight:"700"},{name:"OpenSans-Regular",label:"Open Sans",path:o(tm),style:"normal",weight:"400"},{name:"OpenSans-Bold",label:"Open Sans Bold",path:o(tp),style:"normal",weight:"400"}],tb=async(e,t,o={})=>{try{let i=new FontFace(e,`url(${t})`,{...o});await i.load(),document.fonts.add(i)}catch(e){console.error(e)}},tf=document.getElementById("errorsContainer"),tv=e=>{let t=e.currentTarget;t.removeEventListener("click",tv),tf.removeChild(t.parentNode)},ty=(e="",t="info")=>{["info","warning","danger"].includes(t)||(t="info");let o=` - ${e} - - `,i=document.createElement("div");i.className=`alert alert-${t} alert-dismissible text-break mb-2 fade`,i.innerHTML=o,i.querySelector("button").addEventListener("click",tv),tf.appendChild(i),setTimeout(()=>i.classList.add("show"),100)},tw={id:"",text:"",fillColor:"#ffffff",strokeColor:"#000000",font:"Pressuru",fontSize:40,fontWeight:"normal",textAlign:"center",shadowBlur:0,strokeWidth:1.5,offsetY:0,offsetX:0,rotate:0,allCaps:!0},tk=new Map;class tE{constructor(e){let t=e9("textbox",Date.now().toString(36));this.data=e?{...e,id:t}:{...tw,id:t},tk.set(t,this),document.dispatchEvent(new CustomEvent("textbox-create",{bubbles:!0,composed:!0,detail:{textbox:this}}))}getData(){return this.data}static create(e){return new tE(e)}static getAll(){return tk}static getById(e){return tk.get(e)}static remove(e){tk.delete(e),document.dispatchEvent(new CustomEvent("textbox-remove",{bubbles:!0,composed:!0,detail:{id:e}}))}static createElement(e,t=!0){if(!(e instanceof tE))return;let o=e.getData(),{id:i,text:n,fillColor:a,strokeColor:r,fontSize:s,shadowBlur:l,strokeWidth:d,offsetX:c,offsetY:u,rotate:h}=o,m=` -
- - - - - -
- - - - - - - -
-
- - - `,p=document.createDocumentFragment(),g=document.createElement("div");g.setAttribute("id",i),g.setAttribute("data-section","textbox"),g.className="bg-light border shadow-sm mb-3 rounded",g.innerHTML=m,g.querySelectorAll("select").forEach(e=>e.value=o[e.dataset.input]),g.querySelectorAll('input[type="checkbox"]').forEach(e=>e.checked=o[e.dataset.input]);let b=p.appendChild(g);return t&&setTimeout(()=>b.querySelector('[data-input="text"]').focus(),0),b}}class tx{#k=null;#E=null;constructor(e){this.#k=e,this.#E=this.#k.getContext("2d")}get width(){return this.#k.width}set width(e){this.#k.width=e}get height(){return this.#k.height}set height(e){this.#k.height=e}getDimensions(){return{width:this.width,height:this.height}}setDimensions({width:e,height:t}){return this.width=e,this.height=t,this}toDataURL(){return this.#k.toDataURL()}draw(e,t=new Map){if(null==e)return;let o=this.#k,i=this.#E;i.clearRect(0,0,o.width,o.height),ti(e)?(i.fillStyle=e,i.fillRect(0,0,o.width,o.height)):i.drawImage(e,0,0,o.width,o.height);let n=0;return t.forEach(e=>{let{data:t}=e;n+=1,i.save(),i.font=`${t.fontWeight} ${t.fontSize*o.width/1e3}px ${t.font}`,i.fillStyle=t.fillColor,i.textAlign=t.textAlign,i.strokeStyle=t.strokeColor;let a=i.measureText("M").width+t.fontSize/2,r=o.width/2,s=t.shadowBlur,l=(!0===t.allCaps?t.text.toUpperCase():t.text).split("\n");0!==s&&(i.shadowOffsetX=0,i.shadowOffsetY=0,i.shadowBlur=Math.min(s,20),i.shadowColor=t.strokeColor),i.translate(r+t.offsetX,a*n+t.offsetY),i.rotate(Math.min(t.rotate,360)*Math.PI/180),l.forEach((e,t)=>i.fillText(e,0,t*a)),0!==s&&(i.shadowBlur=0,l.forEach((e,t)=>i.fillText(e,0,t*a))),t.strokeWidth>0&&(i.lineWidth=Math.min(t.strokeWidth,20),l.forEach((e,t)=>i.strokeText(e,0,t*a))),i.restore()}),this}clear(){return this.#E.clearRect(0,0,this.#k.width,this.#k.height),this}show(){return this.#k.hidden=!1,this}hide(){return this.#k.hidden=!0,this}static createInstance(e){return new tx(e)}}const tS=tx.createInstance(document.getElementById("canvas")),tC=document.getElementById("videoModal"),tj=document.getElementById("downloadModal"),tT=document.querySelector("files-dropzone"),tA=document.getElementById("instructions"),tL=document.getElementById("imageUploadMethodSelect"),tz=document.getElementById("fileSelectBtn"),tD=document.getElementById("imageUrlForm"),t$=document.getElementById("addTextboxBtn"),t_=document.getElementById("textboxesContainer"),tI=document.getElementById("generateMemeBtn"),tB=document.getElementById("openVideoModalBtn"),tR=document.getElementById("downloadMemeBtn"),tM=document.getElementById("downloadMemePreview"),tF=document.querySelector("web-share"),tN=document.getElementById("gallery"),tP=document.getElementById("gallerySearch"),tO=tN.querySelector(".gallery__no-results"),tU=document.getElementById("solidColorForm"),tq=document.querySelectorAll(".upload-method"),tH=document.getElementById("removeConfirmationModal"),tW=document.getElementById("removeTextForm"),tV=document.getElementById("maxImageDimensionsForm"),tG=tV.maxImageDimensions,tX=document.getElementById("clearCanvasBtn"),tY=to.get("maxImageDimensions");let tK=!1,tJ=null,tQ=null;const tZ=async()=>{let e=tS.toDataURL("image/png"),t=`${e9("meme")}.png`,o=e.replace("image/png","image/octet-stream");if(tR.download=t,tR.href=o,tM.width=tS.getDimensions().width,tM.height=tS.getDimensions().height,tM.src=o,eB())try{let o=await te({url:e,filename:t,mimeType:"image/png"}).catch(e=>ty(e.message,"danger"));o&&eB({files:[o]})&&(tF.shareFiles=[o],tF.hidden=!1)}catch(e){console.error(e)}window.requestAnimationFrame(()=>{tj.open=!0})},t0=e=>{let[t,o]=tV.maxImageDimensions.value.split("x"),i=Number(t)||800,n=Number(o)||600,a=e.width,r=e.height;a>r?a>i&&(r*=i/a,a=i):r>n&&(a*=n/r,r=n),tS.setDimensions({width:a,height:r})},t1=()=>{tS.draw(tJ,tE.getAll()).show(),tT.classList.add("dropzone--accepted"),tT.disabled=!0,tI.disabled=!1,tA.hidden=!0,tX.hidden=!1},t8=e=>{t0(tJ=e.target),t1()},t3=e=>{if(!e)return;let t=new Image,o=new FileReader;o.addEventListener("load",function(e){let o=e.target.result;t.addEventListener("load",t8),t.src=o}),o.readAsDataURL(e)},t2=(e,t,o)=>{let i=tE.getById(t).getData();switch(e.type){case"checkbox":i[o]=e.checked;break;case"number":i[o]=Number(e.value);break;default:i[o]=e.value}tS.draw(tJ,tE.getAll())},t5=async e=>{e.preventDefault();let t=e.target,o=t.querySelector('button[type="submit"]'),i=t.imageUrl.value;if(i.trim()){o.disabled=!0,o.querySelector(".spinner").hidden=!1,o.querySelector(".label").hidden=!0;try{let e=await te({url:i}).catch(e=>ty(e.message,"danger"));e&&t3(e)}catch{ty(`Failed to load image from "${i}".`,"danger")}finally{o.disabled=!1,o.querySelector(".spinner").hidden=!0,o.querySelector(".label").hidden=!1}}},t4=(e,t)=>()=>{let o=document.getElementById(e),i=o.querySelector('[data-input="offsetY"]'),n=o.querySelector('[data-input="offsetX"]'),a=tE.getById(e);if(!a)return;let r=a.getData();switch(t=t.toLowerCase()){case"up":r.offsetY-=1,i.value=r.offsetY;break;case"down":r.offsetY+=1,i.value=r.offsetY;break;case"left":r.offsetX-=1,n.value=r.offsetX;break;case"right":r.offsetX+=1,n.value=r.offsetX}tS.draw(tJ,tE.getAll()),tQ=requestAnimationFrame(t4(e,t))},t7=async e=>{let t=e.target.closest("button");if(!t)return;let o=t.querySelector("img");try{let e=await te({url:o.src}).catch(e=>ty(e.message,"danger"));e&&t3(e)}catch{ty(`Failed to load image: "${o.alt}".`,"danger")}};tz.addEventListener("click",()=>{"function"==typeof tT.openFileDialog&&tT.openFileDialog()}),tB.addEventListener("click",()=>{tC.open=!0}),t$.addEventListener("click",()=>tE.create()),tI.addEventListener("click",tZ),tR.addEventListener("click",()=>tj.open=!1),tD.addEventListener("submit",t5),tT.addEventListener("files-dropzone-drop-accepted",e=>{let[t]=e.detail.acceptedFiles;t&&t3(t)}),t_.addEventListener("input",e=>{let t;let o=e.target,i=o.closest('[data-section="textbox"]').id;o.matches('[data-input="text"]')?t="text":o.matches('[data-input="fillColor"]')?t="fillColor":o.matches('[data-input="strokeColor"]')?t="strokeColor":o.matches('[data-input="font"]')?t="font":o.matches('[data-input="fontSize"]')?t="fontSize":o.matches('[data-input="fontWeight"]')?t="fontWeight":o.matches('[data-input="textAlign"]')?t="textAlign":o.matches('[data-input="shadowBlur"]')?t="shadowBlur":o.matches('[data-input="offsetY"]')?t="offsetY":o.matches('[data-input="offsetX"]')?t="offsetX":o.matches('[data-input="rotate"]')?t="rotate":o.matches('[data-input="strokeWidth"]')&&(t="strokeWidth"),t&&t2(o,i,t)}),t_.addEventListener("change",e=>{let t;let o=e.target,i=o.closest('[data-section="textbox"]').id;o.matches('[data-input="allCaps"]')&&(t="allCaps"),t&&t2(o,i,t)}),t_.addEventListener("click",e=>{let t=e.target;if(t.matches('[data-button="settings"]')){let e=t.closest('[data-section="textbox"]'),o=e?.querySelector('[data-section="settings"]');o&&(o.hidden=!o.hidden)}if(t.matches('[data-button="duplicate-text-box"')){let e=t.closest('[data-section="textbox"]'),o=tE.getById(e.id);tE.create({...o.data})}if(t.matches('[data-button="delete-text-box"]')){let e=t.closest('[data-section="textbox"]').id,o=tE.getById(e);if(o&&o.data.text.trim()){let t=tW["textbox-id"];t&&(t.value=e,tH.open=!0)}else tE.remove(e)}}),t_.addEventListener("pointerdown",e=>{let t=e.target,o=t.closest('[data-section="textbox"]');o&&t.matches('[data-action="move-text"]')&&(tQ=requestAnimationFrame(t4(o.id,t.getAttribute("aria-label"))))}),t_.addEventListener("pointerup",e=>{e.target.matches('[data-action="move-text"]')&&(cancelAnimationFrame&&cancelAnimationFrame(tQ),tQ=null)}),t_.addEventListener("pointerout",e=>{e.target.matches('[data-action="move-text"]')&&(cancelAnimationFrame&&cancelAnimationFrame(tQ),tQ=null)}),t_.addEventListener("keydown",e=>{let t=e.target,o=t.closest('[data-section="textbox"]');t.matches('[data-action="move-text"]')&&(" "===e.key||"Enter"===e.key)&&(tQ&&cancelAnimationFrame(tQ),tQ=requestAnimationFrame(t4(o.id,t.getAttribute("aria-label"))))}),t_.addEventListener("keyup",e=>{e.target.matches('[data-action="move-text"]')&&(" "===e.key||"Enter"===e.key)&&(tQ&&cancelAnimationFrame(tQ),tQ=null)}),tL.addEventListener("change",e=>{tq.forEach(t=>t.hidden=t.id!==e.target.value),tV.hidden="solidColorForm"===e.target.value}),tN.addEventListener("click",t7),tP.addEventListener("input",e=>{let t=e.target.value.toLowerCase().trim();tN.querySelectorAll("button").forEach(e=>{let o=(e.querySelector("img").getAttribute("alt")||"").toLowerCase();e.hidden=!o.includes(t)}),tO.hidden=!!tN.querySelector("button:not([hidden])")}),tU.addEventListener("input",e=>{e.target===tU.canvasColor&&(tJ=e.target.value),ti(tJ)&&(tS.setDimensions({width:Number(tU.canvasWidth.value)||800,height:Number(tU.canvasHeight.value)||600}),t1())}),document.addEventListener("web-share:error",()=>{tj.open=!1,ty("There was an error while trying to share your meme.","danger")}),document.addEventListener("capture-photo:error",e=>{let t=e.detail.error,o="An error occurred while trying to capture photo.";t instanceof Error&&("NotAllowedError"===t.name||"NotFoundError"===t.name)&&(o+=" Make sure you have a camera connected and you have granted the appropriate permissions."),ty(o,"danger"),tC.open=!1,console.error(t)}),document.addEventListener("capture-photo:success",e=>{tC.open=!1;let t=new Image;t.addEventListener("load",t8),t.src=e.detail.dataURI}),document.addEventListener("me-open",e=>{if("videoModal"===e.target.id){let e=tC.querySelector("capture-photo");e&&"function"==typeof e.startVideoStream&&e.startVideoStream()}}),document.addEventListener("me-close",e=>{if("videoModal"===e.target.id){let e=tC.querySelector("capture-photo");e&&"function"==typeof e.stopVideoStream&&e.stopVideoStream()}"removeConfirmationModal"===e.target.id&&tW.reset()}),document.addEventListener("emoji-click",e=>{let t=e.target.closest('[data-section="textbox"]');if(t){let o=t.querySelector('[data-input="text"]'),i=e.detail.unicode;o&&eI(o,i)}}),document.addEventListener("textbox-create",e=>{let t=e.detail.textbox,o=tE.createElement(t,tK);tK=!0,t_.appendChild(o),t.getData().text&&tS.draw(tJ,tE.getAll())}),document.addEventListener("textbox-remove",e=>{let t=document.getElementById(e.detail.id);t&&t.remove(),t_.querySelectorAll('[data-section="textbox"]').forEach((e,t)=>{e.querySelector('[data-input="text"]').setAttribute("placeholder",`Text #${t+1}`)}),tS.draw(tJ,tE.getAll())}),tW.addEventListener("submit",e=>{e.preventDefault();let t=e.target["textbox-id"].value;t&&(tE.remove(t),tH.open=!1)}),tV.addEventListener("change",e=>{e.target.matches('[name="maxImageDimensions"]')&&to.set("maxImageDimensions",e.target.value),!tJ||ti(tJ)||(t0(tJ),tS.draw(tJ,tE.getAll()))}),tX.addEventListener("click",e=>{tJ&&(e.stopPropagation(),tJ=null,tT.classList.remove("dropzone--accepted"),tI.disabled=!0,tA.hidden=!1,tX.hidden=!0,tT.disabled=!1,tS.clear().hide())}),tN.querySelectorAll("button > img")?.forEach(e=>{e.setAttribute("title",e.getAttribute("alt"))}),tE.create(),tT.accept=e6,((e,t)=>{if(!t)return;let o=e.map(e=>e.split("/")[1]),i=`Supported image formats: ${o.join(", ")}`,n=document.createElement("div"),a=document.createElement("small");a.textContent=i,n.appendChild(a),t.appendChild(a)})(e6,tA),tg.forEach(({name:e,path:t,style:o,weight:i})=>{tb(e,t,{style:o,weight:i})}),tY&&(tG.value=tY),tG.disabled=!1; -//# sourceMappingURL=index.09064714.js.map diff --git a/index.09064714.js.map b/index.09064714.js.map deleted file mode 100644 index de675e3..0000000 --- a/index.09064714.js.map +++ /dev/null @@ -1 +0,0 @@ -{"mappings":"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","sources":["","src/js/index.js","node_modules/emoji-picker-element/index.js","node_modules/emoji-picker-element/picker.js","node_modules/emoji-picker-element/database.js","node_modules/insert-text-at-cursor/dist/index.esm.js","node_modules/insert-text-at-cursor/index.js","node_modules/@georapbox/web-share-element/dist/is-web-share-supported.js","node_modules/@georapbox/web-share-element/dist/","node_modules/@georapbox/web-share-element/dist/src/is-web-share-supported.js","node_modules/@georapbox/web-share-element/dist/web-share-defined.js","node_modules/@georapbox/web-share-element/dist/src/web-share-defined.js","node_modules/@georapbox/web-share-element/dist/src/web-share.js","node_modules/@georapbox/capture-photo-element/dist/capture-photo-defined.js","node_modules/@georapbox/capture-photo-element/dist/","node_modules/@georapbox/capture-photo-element/dist/src/capture-photo-defined.js","node_modules/@georapbox/capture-photo-element/dist/src/capture-photo.js","node_modules/@georapbox/capture-photo-element/dist/src/utils/clamp.js","node_modules/@georapbox/modal-element/dist/modal-element-defined.js","node_modules/@georapbox/modal-element/dist/","node_modules/@georapbox/modal-element/dist/src/modal-element-defined.js","node_modules/@georapbox/modal-element/dist/src/modal-element.js","node_modules/@georapbox/files-dropzone-element/dist/files-dropzone-defined.js","node_modules/@georapbox/files-dropzone-element/dist/","node_modules/@georapbox/files-dropzone-element/dist/src/files-dropzone-defined.js","node_modules/@georapbox/files-dropzone-element/dist/src/files-dropzone.js","node_modules/@georapbox/files-dropzone-element/dist/src/utils/is-valid-file.js","node_modules/@georapbox/files-dropzone-element/dist/src/utils/files-selector.js","src/js/constants.js","src/js/utils/uid.js","src/js/utils/file-from-url.js","src/js/utils/storage.js","src/js/utils/is-solid-color-selected.js","src/js/custom-fonts.js","node_modules/@parcel/runtime-js/lib/runtime-b3ed033b67fa1807.js","node_modules/@parcel/runtime-js/lib/runtime-1d2531ee422c6f6d.js","node_modules/@parcel/runtime-js/lib/runtime-371408043a3b5910.js","node_modules/@parcel/runtime-js/lib/runtime-43269cb69083298e.js","node_modules/@parcel/runtime-js/lib/runtime-462b3570f4df41f9.js","node_modules/@parcel/runtime-js/lib/runtime-3b33b0d4ba540b9c.js","node_modules/@parcel/runtime-js/lib/runtime-4c4c76c87cd13631.js","node_modules/@parcel/runtime-js/lib/runtime-c183c1a7d5597306.js","node_modules/@parcel/runtime-js/lib/runtime-cad0444e16370079.js","node_modules/@parcel/runtime-js/lib/runtime-ea95caeac56af137.js","node_modules/@parcel/runtime-js/lib/runtime-71967538b9c77f3f.js","src/js/toast-alert.js","src/js/textbox.js","src/js/canvas.js"],"sourcesContent":["\nfunction $parcel$interopDefault(a) {\n return a && a.__esModule ? a.default : a;\n}\nfunction $736431a7b9521865$var$assertNonEmptyString(str) {\n if (typeof str !== \"string\" || !str) throw new Error(\"expected a non-empty string, got: \" + str);\n}\nfunction $736431a7b9521865$var$assertNumber(number) {\n if (typeof number !== \"number\") throw new Error(\"expected a number, got: \" + number);\n}\nconst $736431a7b9521865$var$DB_VERSION_CURRENT = 1;\nconst $736431a7b9521865$var$DB_VERSION_INITIAL = 1;\nconst $736431a7b9521865$var$STORE_EMOJI = \"emoji\";\nconst $736431a7b9521865$var$STORE_KEYVALUE = \"keyvalue\";\nconst $736431a7b9521865$var$STORE_FAVORITES = \"favorites\";\nconst $736431a7b9521865$var$FIELD_TOKENS = \"tokens\";\nconst $736431a7b9521865$var$INDEX_TOKENS = \"tokens\";\nconst $736431a7b9521865$var$FIELD_UNICODE = \"unicode\";\nconst $736431a7b9521865$var$INDEX_COUNT = \"count\";\nconst $736431a7b9521865$var$FIELD_GROUP = \"group\";\nconst $736431a7b9521865$var$FIELD_ORDER = \"order\";\nconst $736431a7b9521865$var$INDEX_GROUP_AND_ORDER = \"group-order\";\nconst $736431a7b9521865$var$KEY_ETAG = \"eTag\";\nconst $736431a7b9521865$var$KEY_URL = \"url\";\nconst $736431a7b9521865$var$KEY_PREFERRED_SKINTONE = \"skinTone\";\nconst $736431a7b9521865$var$MODE_READONLY = \"readonly\";\nconst $736431a7b9521865$var$MODE_READWRITE = \"readwrite\";\nconst $736431a7b9521865$var$INDEX_SKIN_UNICODE = \"skinUnicodes\";\nconst $736431a7b9521865$var$FIELD_SKIN_UNICODE = \"skinUnicodes\";\nconst $736431a7b9521865$var$DEFAULT_DATA_SOURCE = \"https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json\";\nconst $736431a7b9521865$var$DEFAULT_LOCALE = \"en\";\n// like lodash's uniqBy but much smaller\nfunction $736431a7b9521865$var$uniqBy(arr, func) {\n const set = new Set();\n const res = [];\n for (const item of arr){\n const key = func(item);\n if (!set.has(key)) {\n set.add(key);\n res.push(item);\n }\n }\n return res;\n}\nfunction $736431a7b9521865$var$uniqEmoji(emojis) {\n return $736431a7b9521865$var$uniqBy(emojis, (_)=>_.unicode);\n}\nfunction $736431a7b9521865$var$initialMigration(db) {\n function createObjectStore(name, keyPath, indexes) {\n const store = keyPath ? db.createObjectStore(name, {\n keyPath: keyPath\n }) : db.createObjectStore(name);\n if (indexes) for (const [indexName, [keyPath, multiEntry]] of Object.entries(indexes))store.createIndex(indexName, keyPath, {\n multiEntry: multiEntry\n });\n return store;\n }\n createObjectStore($736431a7b9521865$var$STORE_KEYVALUE);\n createObjectStore($736431a7b9521865$var$STORE_EMOJI, /* keyPath */ $736431a7b9521865$var$FIELD_UNICODE, {\n [$736431a7b9521865$var$INDEX_TOKENS]: [\n $736431a7b9521865$var$FIELD_TOKENS,\n /* multiEntry */ true\n ],\n [$736431a7b9521865$var$INDEX_GROUP_AND_ORDER]: [\n [\n $736431a7b9521865$var$FIELD_GROUP,\n $736431a7b9521865$var$FIELD_ORDER\n ]\n ],\n [$736431a7b9521865$var$INDEX_SKIN_UNICODE]: [\n $736431a7b9521865$var$FIELD_SKIN_UNICODE,\n /* multiEntry */ true\n ]\n });\n createObjectStore($736431a7b9521865$var$STORE_FAVORITES, undefined, {\n [$736431a7b9521865$var$INDEX_COUNT]: [\n \"\"\n ]\n });\n}\nconst $736431a7b9521865$var$openIndexedDBRequests = {};\nconst $736431a7b9521865$var$databaseCache = {};\nconst $736431a7b9521865$var$onCloseListeners = {};\nfunction $736431a7b9521865$var$handleOpenOrDeleteReq(resolve, reject, req) {\n // These things are almost impossible to test with fakeIndexedDB sadly\n /* istanbul ignore next */ req.onerror = ()=>reject(req.error);\n /* istanbul ignore next */ req.onblocked = ()=>reject(new Error(\"IDB blocked\"));\n req.onsuccess = ()=>resolve(req.result);\n}\nasync function $736431a7b9521865$var$createDatabase(dbName) {\n const db = await new Promise((resolve, reject)=>{\n const req = indexedDB.open(dbName, $736431a7b9521865$var$DB_VERSION_CURRENT);\n $736431a7b9521865$var$openIndexedDBRequests[dbName] = req;\n req.onupgradeneeded = (e)=>{\n // Technically there is only one version, so we don't need this `if` check\n // But if an old version of the JS is in another browser tab\n // and it gets upgraded in the future and we have a new DB version, well...\n // better safe than sorry.\n /* istanbul ignore else */ if (e.oldVersion < $736431a7b9521865$var$DB_VERSION_INITIAL) $736431a7b9521865$var$initialMigration(req.result);\n };\n $736431a7b9521865$var$handleOpenOrDeleteReq(resolve, reject, req);\n });\n // Handle abnormal closes, e.g. \"delete database\" in chrome dev tools.\n // No need for removeEventListener, because once the DB can no longer\n // fire \"close\" events, it will auto-GC.\n // Unfortunately cannot test in fakeIndexedDB: https://github.com/dumbmatter/fakeIndexedDB/issues/50\n /* istanbul ignore next */ db.onclose = ()=>$736431a7b9521865$var$closeDatabase(dbName);\n return db;\n}\nfunction $736431a7b9521865$var$openDatabase(dbName) {\n if (!$736431a7b9521865$var$databaseCache[dbName]) $736431a7b9521865$var$databaseCache[dbName] = $736431a7b9521865$var$createDatabase(dbName);\n return $736431a7b9521865$var$databaseCache[dbName];\n}\nfunction $736431a7b9521865$var$dbPromise(db, storeName, readOnlyOrReadWrite, cb) {\n return new Promise((resolve, reject)=>{\n // Use relaxed durability because neither the emoji data nor the favorites/preferred skin tone\n // are really irreplaceable data. IndexedDB is just a cache in this case.\n const txn = db.transaction(storeName, readOnlyOrReadWrite, {\n durability: \"relaxed\"\n });\n const store = typeof storeName === \"string\" ? txn.objectStore(storeName) : storeName.map((name)=>txn.objectStore(name));\n let res;\n cb(store, txn, (result)=>{\n res = result;\n });\n txn.oncomplete = ()=>resolve(res);\n /* istanbul ignore next */ txn.onerror = ()=>reject(txn.error);\n });\n}\nfunction $736431a7b9521865$var$closeDatabase(dbName) {\n // close any open requests\n const req = $736431a7b9521865$var$openIndexedDBRequests[dbName];\n const db = req && req.result;\n if (db) {\n db.close();\n const listeners = $736431a7b9521865$var$onCloseListeners[dbName];\n /* istanbul ignore else */ if (listeners) for (const listener of listeners)listener();\n }\n delete $736431a7b9521865$var$openIndexedDBRequests[dbName];\n delete $736431a7b9521865$var$databaseCache[dbName];\n delete $736431a7b9521865$var$onCloseListeners[dbName];\n}\nfunction $736431a7b9521865$var$deleteDatabase(dbName) {\n return new Promise((resolve, reject)=>{\n // close any open requests\n $736431a7b9521865$var$closeDatabase(dbName);\n const req = indexedDB.deleteDatabase(dbName);\n $736431a7b9521865$var$handleOpenOrDeleteReq(resolve, reject, req);\n });\n}\n// The \"close\" event occurs during an abnormal shutdown, e.g. a user clearing their browser data.\n// However, it doesn't occur with the normal \"close\" event, so we handle that separately.\n// https://www.w3.org/TR/IndexedDB/#close-a-database-connection\nfunction $736431a7b9521865$var$addOnCloseListener(dbName, listener) {\n let listeners = $736431a7b9521865$var$onCloseListeners[dbName];\n if (!listeners) listeners = $736431a7b9521865$var$onCloseListeners[dbName] = [];\n listeners.push(listener);\n}\n// list of emoticons that don't match a simple \\W+ regex\n// extracted using:\n// require('emoji-picker-element-data/en/emojibase/data.json').map(_ => _.emoticon).filter(Boolean).filter(_ => !/^\\W+$/.test(_))\nconst $736431a7b9521865$var$irregularEmoticons = new Set([\n \":D\",\n \"XD\",\n \":'D\",\n \"O:)\",\n \":X\",\n \":P\",\n \";P\",\n \"XP\",\n \":L\",\n \":Z\",\n \":j\",\n \"8D\",\n \"XO\",\n \"8)\",\n \":B\",\n \":O\",\n \":S\",\n \":'o\",\n \"Dx\",\n \"X(\",\n \"D:\",\n \":C\",\n \">0)\",\n \":3\",\n \"{\n if (!word.match(/\\w/) || $736431a7b9521865$var$irregularEmoticons.has(word)) // for pure emoticons like :) or :-), just leave them as-is\n return word.toLowerCase();\n return word.replace(/[)(:,]/g, \"\").replace(/’/g, \"'\").toLowerCase();\n }).filter(Boolean);\n}\nconst $736431a7b9521865$var$MIN_SEARCH_TEXT_LENGTH = 2;\n// This is an extra step in addition to extractTokens(). The difference here is that we expect\n// the input to have already been run through extractTokens(). This is useful for cases like\n// emoticons, where we don't want to do any tokenization (because it makes no sense to split up\n// \">:)\" by the colon) but we do want to lowercase it to have consistent search results, so that\n// the user can type ':P' or ':p' and still get the same result.\nfunction $736431a7b9521865$var$normalizeTokens(str) {\n return str.filter(Boolean).map((_)=>_.toLowerCase()).filter((_)=>_.length >= $736431a7b9521865$var$MIN_SEARCH_TEXT_LENGTH);\n}\n// Transform emoji data for storage in IDB\nfunction $736431a7b9521865$var$transformEmojiData(emojiData) {\n const res = emojiData.map(({ annotation: annotation, emoticon: emoticon, group: group, order: order, shortcodes: shortcodes, skins: skins, tags: tags, emoji: emoji, version: version })=>{\n const tokens = [\n ...new Set($736431a7b9521865$var$normalizeTokens([\n ...(shortcodes || []).map($736431a7b9521865$var$extractTokens).flat(),\n ...tags.map($736431a7b9521865$var$extractTokens).flat(),\n ...$736431a7b9521865$var$extractTokens(annotation),\n emoticon\n ]))\n ].sort();\n const res = {\n annotation: annotation,\n group: group,\n order: order,\n tags: tags,\n tokens: tokens,\n unicode: emoji,\n version: version\n };\n if (emoticon) res.emoticon = emoticon;\n if (shortcodes) res.shortcodes = shortcodes;\n if (skins) {\n res.skinTones = [];\n res.skinUnicodes = [];\n res.skinVersions = [];\n for (const { tone: tone, emoji: emoji, version: version } of skins){\n res.skinTones.push(tone);\n res.skinUnicodes.push(emoji);\n res.skinVersions.push(version);\n }\n }\n return res;\n });\n return res;\n}\n// helper functions that help compress the code better\nfunction $736431a7b9521865$var$callStore(store, method, key, cb) {\n store[method](key).onsuccess = (e)=>cb && cb(e.target.result);\n}\nfunction $736431a7b9521865$var$getIDB(store, key, cb) {\n $736431a7b9521865$var$callStore(store, \"get\", key, cb);\n}\nfunction $736431a7b9521865$var$getAllIDB(store, key, cb) {\n $736431a7b9521865$var$callStore(store, \"getAll\", key, cb);\n}\nfunction $736431a7b9521865$var$commit(txn) {\n /* istanbul ignore else */ if (txn.commit) txn.commit();\n}\n// like lodash's minBy\nfunction $736431a7b9521865$var$minBy(array, func) {\n let minItem = array[0];\n for(let i = 1; i < array.length; i++){\n const item = array[i];\n if (func(minItem) > func(item)) minItem = item;\n }\n return minItem;\n}\n// return an array of results representing all items that are found in each one of the arrays\n//\nfunction $736431a7b9521865$var$findCommonMembers(arrays, uniqByFunc) {\n const shortestArray = $736431a7b9521865$var$minBy(arrays, (_)=>_.length);\n const results = [];\n for (const item of shortestArray)// if this item is included in every array in the intermediate results, add it to the final results\n if (!arrays.some((array)=>array.findIndex((_)=>uniqByFunc(_) === uniqByFunc(item)) === -1)) results.push(item);\n return results;\n}\nasync function $736431a7b9521865$var$isEmpty(db) {\n return !await $736431a7b9521865$var$get(db, $736431a7b9521865$var$STORE_KEYVALUE, $736431a7b9521865$var$KEY_URL);\n}\nasync function $736431a7b9521865$var$hasData(db, url, eTag) {\n const [oldETag, oldUrl] = await Promise.all([\n $736431a7b9521865$var$KEY_ETAG,\n $736431a7b9521865$var$KEY_URL\n ].map((key)=>$736431a7b9521865$var$get(db, $736431a7b9521865$var$STORE_KEYVALUE, key)));\n return oldETag === eTag && oldUrl === url;\n}\nasync function $736431a7b9521865$var$doFullDatabaseScanForSingleResult(db, predicate) {\n // This batching algorithm is just a perf improvement over a basic\n // cursor. The BATCH_SIZE is an estimate of what would give the best\n // perf for doing a full DB scan (worst case).\n //\n // Mini-benchmark for determining the best batch size:\n //\n // PERF=1 pnpm build:rollup && pnpm test:adhoc\n //\n // (async () => {\n // performance.mark('start')\n // await $('emoji-picker').database.getEmojiByShortcode('doesnotexist')\n // performance.measure('total', 'start')\n // console.log(performance.getEntriesByName('total').slice(-1)[0].duration)\n // })()\n const BATCH_SIZE = 50; // Typically around 150ms for 6x slowdown in Chrome for above benchmark\n return $736431a7b9521865$var$dbPromise(db, $736431a7b9521865$var$STORE_EMOJI, $736431a7b9521865$var$MODE_READONLY, (emojiStore, txn, cb)=>{\n let lastKey;\n const processNextBatch = ()=>{\n emojiStore.getAll(lastKey && IDBKeyRange.lowerBound(lastKey, true), BATCH_SIZE).onsuccess = (e)=>{\n const results = e.target.result;\n for (const result of results){\n lastKey = result.unicode;\n if (predicate(result)) return cb(result);\n }\n if (results.length < BATCH_SIZE) return cb();\n processNextBatch();\n };\n };\n processNextBatch();\n });\n}\nasync function $736431a7b9521865$var$loadData(db, emojiData, url, eTag) {\n {\n const transformedData = $736431a7b9521865$var$transformEmojiData(emojiData);\n await $736431a7b9521865$var$dbPromise(db, [\n $736431a7b9521865$var$STORE_EMOJI,\n $736431a7b9521865$var$STORE_KEYVALUE\n ], $736431a7b9521865$var$MODE_READWRITE, ([emojiStore, metaStore], txn)=>{\n let oldETag;\n let oldUrl;\n let todo = 0;\n function checkFetched() {\n if (++todo === 2) onFetched();\n }\n function onFetched() {\n if (oldETag === eTag && oldUrl === url) // check again within the transaction to guard against concurrency, e.g. multiple browser tabs\n return;\n // delete old data\n emojiStore.clear();\n // insert new data\n for (const data of transformedData)emojiStore.put(data);\n metaStore.put(eTag, $736431a7b9521865$var$KEY_ETAG);\n metaStore.put(url, $736431a7b9521865$var$KEY_URL);\n $736431a7b9521865$var$commit(txn);\n }\n $736431a7b9521865$var$getIDB(metaStore, $736431a7b9521865$var$KEY_ETAG, (result)=>{\n oldETag = result;\n checkFetched();\n });\n $736431a7b9521865$var$getIDB(metaStore, $736431a7b9521865$var$KEY_URL, (result)=>{\n oldUrl = result;\n checkFetched();\n });\n });\n }\n}\nasync function $736431a7b9521865$var$getEmojiByGroup(db, group) {\n return $736431a7b9521865$var$dbPromise(db, $736431a7b9521865$var$STORE_EMOJI, $736431a7b9521865$var$MODE_READONLY, (emojiStore, txn, cb)=>{\n const range = IDBKeyRange.bound([\n group,\n 0\n ], [\n group + 1,\n 0\n ], false, true);\n $736431a7b9521865$var$getAllIDB(emojiStore.index($736431a7b9521865$var$INDEX_GROUP_AND_ORDER), range, cb);\n });\n}\nasync function $736431a7b9521865$var$getEmojiBySearchQuery(db, query) {\n const tokens = $736431a7b9521865$var$normalizeTokens($736431a7b9521865$var$extractTokens(query));\n if (!tokens.length) return [];\n return $736431a7b9521865$var$dbPromise(db, $736431a7b9521865$var$STORE_EMOJI, $736431a7b9521865$var$MODE_READONLY, (emojiStore, txn, cb)=>{\n // get all results that contain all tokens (i.e. an AND query)\n const intermediateResults = [];\n const checkDone = ()=>{\n if (intermediateResults.length === tokens.length) onDone();\n };\n const onDone = ()=>{\n const results = $736431a7b9521865$var$findCommonMembers(intermediateResults, (_)=>_.unicode);\n cb(results.sort((a, b)=>a.order < b.order ? -1 : 1));\n };\n for(let i = 0; i < tokens.length; i++){\n const token = tokens[i];\n const range = i === tokens.length - 1 ? IDBKeyRange.bound(token, token + \"\\uFFFF\", false, true) // treat last token as a prefix search\n : IDBKeyRange.only(token); // treat all other tokens as an exact match\n $736431a7b9521865$var$getAllIDB(emojiStore.index($736431a7b9521865$var$INDEX_TOKENS), range, (result)=>{\n intermediateResults.push(result);\n checkDone();\n });\n }\n });\n}\n// This could have been implemented as an IDB index on shortcodes, but it seemed wasteful to do that\n// when we can already query by tokens and this will give us what we're looking for 99.9% of the time\nasync function $736431a7b9521865$var$getEmojiByShortcode(db, shortcode) {\n const emojis = await $736431a7b9521865$var$getEmojiBySearchQuery(db, shortcode);\n // In very rare cases (e.g. the shortcode \"v\" as in \"v for victory\"), we cannot search because\n // there are no usable tokens (too short in this case). In that case, we have to do an inefficient\n // full-database scan, which I believe is an acceptable tradeoff for not having to have an extra\n // index on shortcodes.\n if (!emojis.length) {\n const predicate = (_)=>(_.shortcodes || []).includes(shortcode.toLowerCase());\n return await $736431a7b9521865$var$doFullDatabaseScanForSingleResult(db, predicate) || null;\n }\n return emojis.filter((_)=>{\n const lowerShortcodes = (_.shortcodes || []).map((_)=>_.toLowerCase());\n return lowerShortcodes.includes(shortcode.toLowerCase());\n })[0] || null;\n}\nasync function $736431a7b9521865$var$getEmojiByUnicode(db, unicode) {\n return $736431a7b9521865$var$dbPromise(db, $736431a7b9521865$var$STORE_EMOJI, $736431a7b9521865$var$MODE_READONLY, (emojiStore, txn, cb)=>$736431a7b9521865$var$getIDB(emojiStore, unicode, (result)=>{\n if (result) return cb(result);\n $736431a7b9521865$var$getIDB(emojiStore.index($736431a7b9521865$var$INDEX_SKIN_UNICODE), unicode, (result)=>cb(result || null));\n }));\n}\nfunction $736431a7b9521865$var$get(db, storeName, key) {\n return $736431a7b9521865$var$dbPromise(db, storeName, $736431a7b9521865$var$MODE_READONLY, (store, txn, cb)=>$736431a7b9521865$var$getIDB(store, key, cb));\n}\nfunction $736431a7b9521865$var$set(db, storeName, key, value) {\n return $736431a7b9521865$var$dbPromise(db, storeName, $736431a7b9521865$var$MODE_READWRITE, (store, txn)=>{\n store.put(value, key);\n $736431a7b9521865$var$commit(txn);\n });\n}\nfunction $736431a7b9521865$var$incrementFavoriteEmojiCount(db, unicode) {\n return $736431a7b9521865$var$dbPromise(db, $736431a7b9521865$var$STORE_FAVORITES, $736431a7b9521865$var$MODE_READWRITE, (store, txn)=>$736431a7b9521865$var$getIDB(store, unicode, (result)=>{\n store.put((result || 0) + 1, unicode);\n $736431a7b9521865$var$commit(txn);\n }));\n}\nfunction $736431a7b9521865$var$getTopFavoriteEmoji(db, customEmojiIndex, limit) {\n if (limit === 0) return [];\n return $736431a7b9521865$var$dbPromise(db, [\n $736431a7b9521865$var$STORE_FAVORITES,\n $736431a7b9521865$var$STORE_EMOJI\n ], $736431a7b9521865$var$MODE_READONLY, ([favoritesStore, emojiStore], txn, cb)=>{\n const results = [];\n favoritesStore.index($736431a7b9521865$var$INDEX_COUNT).openCursor(undefined, \"prev\").onsuccess = (e)=>{\n const cursor = e.target.result;\n if (!cursor) return cb(results);\n function addResult(result) {\n results.push(result);\n if (results.length === limit) return cb(results) // done, reached the limit\n ;\n cursor.continue();\n }\n const unicodeOrName = cursor.primaryKey;\n const custom = customEmojiIndex.byName(unicodeOrName);\n if (custom) return addResult(custom);\n // This could be done in parallel (i.e. make the cursor and the get()s parallelized),\n // but my testing suggests it's not actually faster.\n $736431a7b9521865$var$getIDB(emojiStore, unicodeOrName, (emoji)=>{\n if (emoji) return addResult(emoji);\n // emoji not found somehow, ignore (may happen if custom emoji change)\n cursor.continue();\n });\n };\n });\n}\n// trie data structure for prefix searches\n// loosely based on https://github.com/nolanlawson/substring-trie\nconst $736431a7b9521865$var$CODA_MARKER = \"\"; // marks the end of the string\nfunction $736431a7b9521865$var$trie(arr, itemToTokens) {\n const map = new Map();\n for (const item of arr){\n const tokens = itemToTokens(item);\n for (const token of tokens){\n let currentMap = map;\n for(let i = 0; i < token.length; i++){\n const char = token.charAt(i);\n let nextMap = currentMap.get(char);\n if (!nextMap) {\n nextMap = new Map();\n currentMap.set(char, nextMap);\n }\n currentMap = nextMap;\n }\n let valuesAtCoda = currentMap.get($736431a7b9521865$var$CODA_MARKER);\n if (!valuesAtCoda) {\n valuesAtCoda = [];\n currentMap.set($736431a7b9521865$var$CODA_MARKER, valuesAtCoda);\n }\n valuesAtCoda.push(item);\n }\n }\n const search = (query, exact)=>{\n let currentMap = map;\n for(let i = 0; i < query.length; i++){\n const char = query.charAt(i);\n const nextMap = currentMap.get(char);\n if (nextMap) currentMap = nextMap;\n else return [];\n }\n if (exact) {\n const results = currentMap.get($736431a7b9521865$var$CODA_MARKER);\n return results || [];\n }\n const results = [];\n // traverse\n const queue = [\n currentMap\n ];\n while(queue.length){\n const currentMap = queue.shift();\n const entriesSortedByKey = [\n ...currentMap.entries()\n ].sort((a, b)=>a[0] < b[0] ? -1 : 1);\n for (const [key, value] of entriesSortedByKey)if (key === $736431a7b9521865$var$CODA_MARKER) results.push(...value);\n else queue.push(value);\n }\n return results;\n };\n return search;\n}\nconst $736431a7b9521865$var$requiredKeys$1 = [\n \"name\",\n \"url\"\n];\nfunction $736431a7b9521865$var$assertCustomEmojis(customEmojis) {\n const isArray = customEmojis && Array.isArray(customEmojis);\n const firstItemIsFaulty = isArray && customEmojis.length && (!customEmojis[0] || $736431a7b9521865$var$requiredKeys$1.some((key)=>!(key in customEmojis[0])));\n if (!isArray || firstItemIsFaulty) throw new Error(\"Custom emojis are in the wrong format\");\n}\nfunction $736431a7b9521865$var$customEmojiIndex(customEmojis) {\n $736431a7b9521865$var$assertCustomEmojis(customEmojis);\n const sortByName = (a, b)=>a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1;\n //\n // all()\n //\n const all = customEmojis.sort(sortByName);\n //\n // search()\n //\n const emojiToTokens = (emoji)=>[\n ...new Set((emoji.shortcodes || []).map((shortcode)=>$736431a7b9521865$var$extractTokens(shortcode)).flat())\n ];\n const searchTrie = $736431a7b9521865$var$trie(customEmojis, emojiToTokens);\n const searchByExactMatch = (_)=>searchTrie(_, true);\n const searchByPrefix = (_)=>searchTrie(_, false);\n // Search by query for custom emoji. Similar to how we do this in IDB, the last token\n // is treated as a prefix search, but every other one is treated as an exact match.\n // Then we AND the results together\n const search = (query)=>{\n const tokens = $736431a7b9521865$var$extractTokens(query);\n const intermediateResults = tokens.map((token, i)=>(i < tokens.length - 1 ? searchByExactMatch : searchByPrefix)(token));\n return $736431a7b9521865$var$findCommonMembers(intermediateResults, (_)=>_.name).sort(sortByName);\n };\n //\n // byShortcode, byName\n //\n const shortcodeToEmoji = new Map();\n const nameToEmoji = new Map();\n for (const customEmoji of customEmojis){\n nameToEmoji.set(customEmoji.name.toLowerCase(), customEmoji);\n for (const shortcode of customEmoji.shortcodes || [])shortcodeToEmoji.set(shortcode.toLowerCase(), customEmoji);\n }\n const byShortcode = (shortcode)=>shortcodeToEmoji.get(shortcode.toLowerCase());\n const byName = (name)=>nameToEmoji.get(name.toLowerCase());\n return {\n all: all,\n search: search,\n byShortcode: byShortcode,\n byName: byName\n };\n}\nconst $736431a7b9521865$var$isFirefoxContentScript = typeof wrappedJSObject !== \"undefined\";\n// remove some internal implementation details, i.e. the \"tokens\" array on the emoji object\n// essentially, convert the emoji from the version stored in IDB to the version used in-memory\nfunction $736431a7b9521865$var$cleanEmoji(emoji) {\n if (!emoji) return emoji;\n // if inside a Firefox content script, need to clone the emoji object to prevent Firefox from complaining about\n // cross-origin object. See: https://github.com/nolanlawson/emoji-picker-element/issues/356\n /* istanbul ignore if */ if ($736431a7b9521865$var$isFirefoxContentScript) emoji = structuredClone(emoji);\n delete emoji.tokens;\n if (emoji.skinTones) {\n const len = emoji.skinTones.length;\n emoji.skins = Array(len);\n for(let i = 0; i < len; i++)emoji.skins[i] = {\n tone: emoji.skinTones[i],\n unicode: emoji.skinUnicodes[i],\n version: emoji.skinVersions[i]\n };\n delete emoji.skinTones;\n delete emoji.skinUnicodes;\n delete emoji.skinVersions;\n }\n return emoji;\n}\nfunction $736431a7b9521865$var$warnETag(eTag) {\n if (!eTag) console.warn(\"emoji-picker-element is more efficient if the dataSource server exposes an ETag header.\");\n}\nconst $736431a7b9521865$var$requiredKeys = [\n \"annotation\",\n \"emoji\",\n \"group\",\n \"order\",\n \"tags\",\n \"version\"\n];\nfunction $736431a7b9521865$var$assertEmojiData(emojiData) {\n if (!emojiData || !Array.isArray(emojiData) || !emojiData[0] || typeof emojiData[0] !== \"object\" || $736431a7b9521865$var$requiredKeys.some((key)=>!(key in emojiData[0]))) throw new Error(\"Emoji data is in the wrong format\");\n}\nfunction $736431a7b9521865$var$assertStatus(response, dataSource) {\n if (Math.floor(response.status / 100) !== 2) throw new Error(\"Failed to fetch: \" + dataSource + \": \" + response.status);\n}\nasync function $736431a7b9521865$var$getETag(dataSource) {\n const response = await fetch(dataSource, {\n method: \"HEAD\"\n });\n $736431a7b9521865$var$assertStatus(response, dataSource);\n const eTag = response.headers.get(\"etag\");\n $736431a7b9521865$var$warnETag(eTag);\n return eTag;\n}\nasync function $736431a7b9521865$var$getETagAndData(dataSource) {\n const response = await fetch(dataSource);\n $736431a7b9521865$var$assertStatus(response, dataSource);\n const eTag = response.headers.get(\"etag\");\n $736431a7b9521865$var$warnETag(eTag);\n const emojiData = await response.json();\n $736431a7b9521865$var$assertEmojiData(emojiData);\n return [\n eTag,\n emojiData\n ];\n}\n// TODO: including these in blob-util.ts causes typedoc to generate docs for them,\n// even with --excludePrivate ¯\\_(ツ)_/¯\n/** @private */ /**\n * Convert an `ArrayBuffer` to a binary string.\n *\n * Example:\n *\n * ```js\n * var myString = blobUtil.arrayBufferToBinaryString(arrayBuff)\n * ```\n *\n * @param buffer - array buffer\n * @returns binary string\n */ function $736431a7b9521865$var$arrayBufferToBinaryString(buffer) {\n var binary = \"\";\n var bytes = new Uint8Array(buffer);\n var length = bytes.byteLength;\n var i = -1;\n while(++i < length)binary += String.fromCharCode(bytes[i]);\n return binary;\n}\n/**\n * Convert a binary string to an `ArrayBuffer`.\n *\n * ```js\n * var myBuffer = blobUtil.binaryStringToArrayBuffer(binaryString)\n * ```\n *\n * @param binary - binary string\n * @returns array buffer\n */ function $736431a7b9521865$var$binaryStringToArrayBuffer(binary) {\n var length = binary.length;\n var buf = new ArrayBuffer(length);\n var arr = new Uint8Array(buf);\n var i = -1;\n while(++i < length)arr[i] = binary.charCodeAt(i);\n return buf;\n}\n// generate a checksum based on the stringified JSON\nasync function $736431a7b9521865$var$jsonChecksum(object) {\n const inString = JSON.stringify(object);\n let inBuffer = $736431a7b9521865$var$binaryStringToArrayBuffer(inString);\n // this does not need to be cryptographically secure, SHA-1 is fine\n const outBuffer = await crypto.subtle.digest(\"SHA-1\", inBuffer);\n const outBinString = $736431a7b9521865$var$arrayBufferToBinaryString(outBuffer);\n const res = btoa(outBinString);\n return res;\n}\nasync function $736431a7b9521865$var$checkForUpdates(db, dataSource) {\n // just do a simple HEAD request first to see if the eTags match\n let emojiData;\n let eTag = await $736431a7b9521865$var$getETag(dataSource);\n if (!eTag) {\n const eTagAndData = await $736431a7b9521865$var$getETagAndData(dataSource);\n eTag = eTagAndData[0];\n emojiData = eTagAndData[1];\n if (!eTag) eTag = await $736431a7b9521865$var$jsonChecksum(emojiData);\n }\n if (await $736431a7b9521865$var$hasData(db, dataSource, eTag)) ;\n else {\n if (!emojiData) {\n const eTagAndData = await $736431a7b9521865$var$getETagAndData(dataSource);\n emojiData = eTagAndData[1];\n }\n await $736431a7b9521865$var$loadData(db, emojiData, dataSource, eTag);\n }\n}\nasync function $736431a7b9521865$var$loadDataForFirstTime(db, dataSource) {\n let [eTag, emojiData] = await $736431a7b9521865$var$getETagAndData(dataSource);\n if (!eTag) // Handle lack of support for ETag or Access-Control-Expose-Headers\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers#Browser_compatibility\n eTag = await $736431a7b9521865$var$jsonChecksum(emojiData);\n await $736431a7b9521865$var$loadData(db, emojiData, dataSource, eTag);\n}\nclass $736431a7b9521865$export$2e2bcd8739ae039 {\n constructor({ dataSource: dataSource = $736431a7b9521865$var$DEFAULT_DATA_SOURCE, locale: locale = $736431a7b9521865$var$DEFAULT_LOCALE, customEmoji: customEmoji = [] } = {}){\n this.dataSource = dataSource;\n this.locale = locale;\n this._dbName = `emoji-picker-element-${this.locale}`;\n this._db = undefined;\n this._lazyUpdate = undefined;\n this._custom = $736431a7b9521865$var$customEmojiIndex(customEmoji);\n this._clear = this._clear.bind(this);\n this._ready = this._init();\n }\n async _init() {\n const db = this._db = await $736431a7b9521865$var$openDatabase(this._dbName);\n $736431a7b9521865$var$addOnCloseListener(this._dbName, this._clear);\n const dataSource = this.dataSource;\n const empty = await $736431a7b9521865$var$isEmpty(db);\n if (empty) await $736431a7b9521865$var$loadDataForFirstTime(db, dataSource);\n else this._lazyUpdate = $736431a7b9521865$var$checkForUpdates(db, dataSource);\n }\n async ready() {\n const checkReady = async ()=>{\n if (!this._ready) this._ready = this._init();\n return this._ready;\n };\n await checkReady();\n // There's a possibility of a race condition where the element gets added, removed, and then added again\n // with a particular timing, which would set the _db to undefined.\n // We *could* do a while loop here, but that seems excessive and could lead to an infinite loop.\n if (!this._db) await checkReady();\n }\n async getEmojiByGroup(group) {\n $736431a7b9521865$var$assertNumber(group);\n await this.ready();\n return $736431a7b9521865$var$uniqEmoji(await $736431a7b9521865$var$getEmojiByGroup(this._db, group)).map($736431a7b9521865$var$cleanEmoji);\n }\n async getEmojiBySearchQuery(query) {\n $736431a7b9521865$var$assertNonEmptyString(query);\n await this.ready();\n const customs = this._custom.search(query);\n const natives = $736431a7b9521865$var$uniqEmoji(await $736431a7b9521865$var$getEmojiBySearchQuery(this._db, query)).map($736431a7b9521865$var$cleanEmoji);\n return [\n ...customs,\n ...natives\n ];\n }\n async getEmojiByShortcode(shortcode) {\n $736431a7b9521865$var$assertNonEmptyString(shortcode);\n await this.ready();\n const custom = this._custom.byShortcode(shortcode);\n if (custom) return custom;\n return $736431a7b9521865$var$cleanEmoji(await $736431a7b9521865$var$getEmojiByShortcode(this._db, shortcode));\n }\n async getEmojiByUnicodeOrName(unicodeOrName) {\n $736431a7b9521865$var$assertNonEmptyString(unicodeOrName);\n await this.ready();\n const custom = this._custom.byName(unicodeOrName);\n if (custom) return custom;\n return $736431a7b9521865$var$cleanEmoji(await $736431a7b9521865$var$getEmojiByUnicode(this._db, unicodeOrName));\n }\n async getPreferredSkinTone() {\n await this.ready();\n return await $736431a7b9521865$var$get(this._db, $736431a7b9521865$var$STORE_KEYVALUE, $736431a7b9521865$var$KEY_PREFERRED_SKINTONE) || 0;\n }\n async setPreferredSkinTone(skinTone) {\n $736431a7b9521865$var$assertNumber(skinTone);\n await this.ready();\n return $736431a7b9521865$var$set(this._db, $736431a7b9521865$var$STORE_KEYVALUE, $736431a7b9521865$var$KEY_PREFERRED_SKINTONE, skinTone);\n }\n async incrementFavoriteEmojiCount(unicodeOrName) {\n $736431a7b9521865$var$assertNonEmptyString(unicodeOrName);\n await this.ready();\n return $736431a7b9521865$var$incrementFavoriteEmojiCount(this._db, unicodeOrName);\n }\n async getTopFavoriteEmoji(limit) {\n $736431a7b9521865$var$assertNumber(limit);\n await this.ready();\n return (await $736431a7b9521865$var$getTopFavoriteEmoji(this._db, this._custom, limit)).map($736431a7b9521865$var$cleanEmoji);\n }\n set customEmoji(customEmojis) {\n this._custom = $736431a7b9521865$var$customEmojiIndex(customEmojis);\n }\n get customEmoji() {\n return this._custom.all;\n }\n async _shutdown() {\n await this.ready(); // reopen if we've already been closed/deleted\n try {\n await this._lazyUpdate; // allow any lazy updates to process before closing/deleting\n } catch (err) {}\n }\n // clear references to IDB, e.g. during a close event\n _clear() {\n // We don't need to call removeEventListener or remove the manual \"close\" listeners.\n // The memory leak tests prove this is unnecessary. It's because:\n // 1) IDBDatabases that can no longer fire \"close\" automatically have listeners GCed\n // 2) we clear the manual close listeners in databaseLifecycle.js.\n this._db = this._ready = this._lazyUpdate = undefined;\n }\n async close() {\n await this._shutdown();\n await $736431a7b9521865$var$closeDatabase(this._dbName);\n }\n async delete() {\n await this._shutdown();\n await $736431a7b9521865$var$deleteDatabase(this._dbName);\n }\n}\n\n\n// via https://unpkg.com/browse/emojibase-data@6.0.0/meta/groups.json\nconst $9e9d3488b14d9168$var$allGroups = [\n [\n -1,\n \"\\u2728\",\n \"custom\"\n ],\n [\n 0,\n \"\\uD83D\\uDE00\",\n \"smileys-emotion\"\n ],\n [\n 1,\n \"\\uD83D\\uDC4B\",\n \"people-body\"\n ],\n [\n 3,\n \"\\uD83D\\uDC31\",\n \"animals-nature\"\n ],\n [\n 4,\n \"\\uD83C\\uDF4E\",\n \"food-drink\"\n ],\n [\n 5,\n \"\\uD83C\\uDFE0\\uFE0F\",\n \"travel-places\"\n ],\n [\n 6,\n \"\\u26BD\",\n \"activities\"\n ],\n [\n 7,\n \"\\uD83D\\uDCDD\",\n \"objects\"\n ],\n [\n 8,\n \"\\u26D4\\uFE0F\",\n \"symbols\"\n ],\n [\n 9,\n \"\\uD83C\\uDFC1\",\n \"flags\"\n ]\n].map(([id, emoji, name])=>({\n id: id,\n emoji: emoji,\n name: name\n }));\nconst $9e9d3488b14d9168$var$groups = $9e9d3488b14d9168$var$allGroups.slice(1);\nconst $9e9d3488b14d9168$var$MIN_SEARCH_TEXT_LENGTH = 2;\nconst $9e9d3488b14d9168$var$NUM_SKIN_TONES = 6;\n/* istanbul ignore next */ const $9e9d3488b14d9168$var$rIC = typeof requestIdleCallback === \"function\" ? requestIdleCallback : setTimeout;\n// check for ZWJ (zero width joiner) character\nfunction $9e9d3488b14d9168$var$hasZwj(emoji) {\n return emoji.unicode.includes(\"\\u200D\");\n}\n// Find one good representative emoji from each version to test by checking its color.\n// Ideally it should have color in the center. For some inspiration, see:\n// https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/\n//\n// Note that for certain versions (12.1, 13.1), there is no point in testing them explicitly, because\n// all the emoji from this version are compound-emoji from previous versions. So they would pass a color\n// test, even in browsers that display them as double emoji. (E.g. \"face in clouds\" might render as\n// \"face without mouth\" plus \"fog\".) These emoji can only be filtered using the width test,\n// which happens in checkZwjSupport.js.\nconst $9e9d3488b14d9168$var$versionsAndTestEmoji = {\n \"\\uD83E\\uDEE8\": 15.1,\n \"\\uD83E\\uDEE0\": 14,\n \"\\uD83E\\uDD72\": 13.1,\n \"\\uD83E\\uDD7B\": 12.1,\n \"\\uD83E\\uDD70\": 11,\n \"\\uD83E\\uDD29\": 5,\n \"\\uD83D\\uDC71\\u200D\\u2640\\uFE0F\": 4,\n \"\\uD83E\\uDD23\": 3,\n \"\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8\\uFE0F\": 2,\n \"\\uD83D\\uDE00\": 1,\n \"\\uD83D\\uDE10\\uFE0F\": 0.7,\n \"\\uD83D\\uDE03\": 0.6\n};\nconst $9e9d3488b14d9168$var$TIMEOUT_BEFORE_LOADING_MESSAGE = 1000; // 1 second\nconst $9e9d3488b14d9168$var$DEFAULT_SKIN_TONE_EMOJI = \"\\uD83D\\uDD90\\uFE0F\";\nconst $9e9d3488b14d9168$var$DEFAULT_NUM_COLUMNS = 8;\n// Based on https://fivethirtyeight.com/features/the-100-most-used-emojis/ and\n// https://blog.emojipedia.org/facebook-reveals-most-and-least-used-emojis/ with\n// a bit of my own curation. (E.g. avoid the \"OK\" gesture because of connotations:\n// https://emojipedia.org/ok-hand/)\nconst $9e9d3488b14d9168$var$MOST_COMMONLY_USED_EMOJI = [\n \"\\uD83D\\uDE0A\",\n \"\\uD83D\\uDE12\",\n \"\\u2764\\uFE0F\",\n \"\\uD83D\\uDC4D\\uFE0F\",\n \"\\uD83D\\uDE0D\",\n \"\\uD83D\\uDE02\",\n \"\\uD83D\\uDE2D\",\n \"\\u263A\\uFE0F\",\n \"\\uD83D\\uDE14\",\n \"\\uD83D\\uDE29\",\n \"\\uD83D\\uDE0F\",\n \"\\uD83D\\uDC95\",\n \"\\uD83D\\uDE4C\",\n \"\\uD83D\\uDE18\"\n];\n// It's important to list Twemoji Mozilla before everything else, because Mozilla bundles their\n// own font on some platforms (notably Windows and Linux as of this writing). Typically, Mozilla\n// updates faster than the underlying OS, and we don't want to render older emoji in one font and\n// newer emoji in another font:\n// https://github.com/nolanlawson/emoji-picker-element/pull/268#issuecomment-1073347283\nconst $9e9d3488b14d9168$var$FONT_FAMILY = '\"Twemoji Mozilla\",\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\",\"EmojiOne Color\",\"Android Emoji\",sans-serif';\n/* istanbul ignore next */ const $9e9d3488b14d9168$var$DEFAULT_CATEGORY_SORTING = (a, b)=>a < b ? -1 : a > b ? 1 : 0;\n// Test if an emoji is supported by rendering it to canvas and checking that the color is not black\n// See https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/\n// and https://www.npmjs.com/package/if-emoji for inspiration\n// This implementation is largely borrowed from if-emoji, adding the font-family\nconst $9e9d3488b14d9168$var$getTextFeature = (text, color)=>{\n const canvas = document.createElement(\"canvas\");\n canvas.width = canvas.height = 1;\n const ctx = canvas.getContext(\"2d\");\n ctx.textBaseline = \"top\";\n ctx.font = `100px ${$9e9d3488b14d9168$var$FONT_FAMILY}`;\n ctx.fillStyle = color;\n ctx.scale(0.01, 0.01);\n ctx.fillText(text, 0, 0);\n return ctx.getImageData(0, 0, 1, 1).data;\n};\nconst $9e9d3488b14d9168$var$compareFeatures = (feature1, feature2)=>{\n const feature1Str = [\n ...feature1\n ].join(\",\");\n const feature2Str = [\n ...feature2\n ].join(\",\");\n // This is RGBA, so for 0,0,0, we are checking that the first RGB is not all zeroes.\n // Most of the time when unsupported this is 0,0,0,0, but on Chrome on Mac it is\n // 0,0,0,61 - there is a transparency here.\n return feature1Str === feature2Str && !feature1Str.startsWith(\"0,0,0,\");\n};\nfunction $9e9d3488b14d9168$var$testColorEmojiSupported(text) {\n // Render white and black and then compare them to each other and ensure they're the same\n // color, and neither one is black. This shows that the emoji was rendered in color.\n const feature1 = $9e9d3488b14d9168$var$getTextFeature(text, \"#000\");\n const feature2 = $9e9d3488b14d9168$var$getTextFeature(text, \"#fff\");\n return feature1 && feature2 && $9e9d3488b14d9168$var$compareFeatures(feature1, feature2);\n}\n// rather than check every emoji ever, which would be expensive, just check some representatives from the\n// different emoji releases to determine what the font supports\nfunction $9e9d3488b14d9168$var$determineEmojiSupportLevel() {\n const entries = Object.entries($9e9d3488b14d9168$var$versionsAndTestEmoji);\n try {\n // start with latest emoji and work backwards\n for (const [emoji, version] of entries){\n if ($9e9d3488b14d9168$var$testColorEmojiSupported(emoji)) return version;\n }\n } catch (e) {} finally{}\n // In case of an error, be generous and just assume all emoji are supported (e.g. for canvas errors\n // due to anti-fingerprinting add-ons). Better to show some gray boxes than nothing at all.\n return entries[0][1] // first one in the list is the most recent version\n ;\n}\n// Check which emojis we know for sure aren't supported, based on Unicode version level\nlet $9e9d3488b14d9168$var$promise;\nconst $9e9d3488b14d9168$var$detectEmojiSupportLevel = ()=>{\n if (!$9e9d3488b14d9168$var$promise) // Delay so it can run while the IDB database is being created by the browser (on another thread).\n // This helps especially with first load – we want to start pre-populating the database on the main thread,\n // and then wait for IDB to commit everything, and while waiting we run this check.\n $9e9d3488b14d9168$var$promise = new Promise((resolve)=>$9e9d3488b14d9168$var$rIC(()=>resolve($9e9d3488b14d9168$var$determineEmojiSupportLevel()) // delay so ideally this can run while IDB is first populating\n ));\n return $9e9d3488b14d9168$var$promise;\n};\n// determine which emojis containing ZWJ (zero width joiner) characters\n// are supported (rendered as one glyph) rather than unsupported (rendered as two or more glyphs)\nconst $9e9d3488b14d9168$var$supportedZwjEmojis = new Map();\nconst $9e9d3488b14d9168$var$VARIATION_SELECTOR = \"\\uFE0F\";\nconst $9e9d3488b14d9168$var$SKINTONE_MODIFIER = \"\\ud83c\";\nconst $9e9d3488b14d9168$var$ZWJ = \"\\u200D\";\nconst $9e9d3488b14d9168$var$LIGHT_SKIN_TONE = 0x1F3FB;\nconst $9e9d3488b14d9168$var$LIGHT_SKIN_TONE_MODIFIER = 0xdffb;\n// TODO: this is a naive implementation, we can improve it later\n// It's only used for the skintone picker, so as long as people don't customize with\n// really exotic emoji then it should work fine\nfunction $9e9d3488b14d9168$var$applySkinTone(str, skinTone) {\n if (skinTone === 0) return str;\n const zwjIndex = str.indexOf($9e9d3488b14d9168$var$ZWJ);\n if (zwjIndex !== -1) return str.substring(0, zwjIndex) + String.fromCodePoint($9e9d3488b14d9168$var$LIGHT_SKIN_TONE + skinTone - 1) + str.substring(zwjIndex);\n if (str.endsWith($9e9d3488b14d9168$var$VARIATION_SELECTOR)) str = str.substring(0, str.length - 1);\n return str + $9e9d3488b14d9168$var$SKINTONE_MODIFIER + String.fromCodePoint($9e9d3488b14d9168$var$LIGHT_SKIN_TONE_MODIFIER + skinTone - 1);\n}\nfunction $9e9d3488b14d9168$var$halt(event) {\n event.preventDefault();\n event.stopPropagation();\n}\n// Implementation left/right or up/down navigation, circling back when you\n// reach the start/end of the list\nfunction $9e9d3488b14d9168$var$incrementOrDecrement(decrement, val, arr) {\n val += decrement ? -1 : 1;\n if (val < 0) val = arr.length - 1;\n else if (val >= arr.length) val = 0;\n return val;\n}\n// like lodash's uniqBy but much smaller\nfunction $9e9d3488b14d9168$var$uniqBy(arr, func) {\n const set = new Set();\n const res = [];\n for (const item of arr){\n const key = func(item);\n if (!set.has(key)) {\n set.add(key);\n res.push(item);\n }\n }\n return res;\n}\n// We don't need all the data on every emoji, and there are specific things we need\n// for the UI, so build a \"view model\" from the emoji object we got from the database\nfunction $9e9d3488b14d9168$var$summarizeEmojisForUI(emojis, emojiSupportLevel) {\n const toSimpleSkinsMap = (skins)=>{\n const res = {};\n for (const skin of skins)// ignore arrays like [1, 2] with multiple skin tones\n // also ignore variants that are in an unsupported emoji version\n // (these do exist - variants from a different version than their base emoji)\n if (typeof skin.tone === \"number\" && skin.version <= emojiSupportLevel) res[skin.tone] = skin.unicode;\n return res;\n };\n return emojis.map(({ unicode: unicode, skins: skins, shortcodes: shortcodes, url: url, name: name, category: category, annotation: annotation })=>({\n unicode: unicode,\n name: name,\n shortcodes: shortcodes,\n url: url,\n category: category,\n annotation: annotation,\n id: unicode || name,\n skins: skins && toSimpleSkinsMap(skins)\n }));\n}\n// import rAF from one place so that the bundle size is a bit smaller\nconst $9e9d3488b14d9168$var$rAF = requestAnimationFrame;\n// Svelte action to calculate the width of an element and auto-update\n// using ResizeObserver. If ResizeObserver is unsupported, we just use rAF once\n// and don't bother to update.\nlet $9e9d3488b14d9168$var$resizeObserverSupported = typeof ResizeObserver === \"function\";\nfunction $9e9d3488b14d9168$var$calculateWidth(node, abortSignal, onUpdate) {\n let resizeObserver;\n if ($9e9d3488b14d9168$var$resizeObserverSupported) {\n resizeObserver = new ResizeObserver((entries)=>onUpdate(entries[0].contentRect.width));\n resizeObserver.observe(node);\n } else $9e9d3488b14d9168$var$rAF(()=>onUpdate(node.getBoundingClientRect().width));\n // cleanup function (called on destroy)\n abortSignal.addEventListener(\"abort\", ()=>{\n if (resizeObserver) resizeObserver.disconnect();\n });\n}\n// get the width of the text inside of a DOM node, via https://stackoverflow.com/a/59525891/680742\nfunction $9e9d3488b14d9168$var$calculateTextWidth(node) {\n /* istanbul ignore else */ {\n const range = document.createRange();\n range.selectNode(node.firstChild);\n return range.getBoundingClientRect().width;\n }\n}\nlet $9e9d3488b14d9168$var$baselineEmojiWidth;\nfunction $9e9d3488b14d9168$var$checkZwjSupport(zwjEmojisToCheck, baselineEmoji, emojiToDomNode) {\n for (const emoji of zwjEmojisToCheck){\n const domNode = emojiToDomNode(emoji);\n const emojiWidth = $9e9d3488b14d9168$var$calculateTextWidth(domNode);\n if (typeof $9e9d3488b14d9168$var$baselineEmojiWidth === \"undefined\") $9e9d3488b14d9168$var$baselineEmojiWidth = $9e9d3488b14d9168$var$calculateTextWidth(baselineEmoji);\n // On Windows, some supported emoji are ~50% bigger than the baseline emoji, but what we really want to guard\n // against are the ones that are 2x the size, because those are truly broken (person with red hair = person with\n // floating red wig, black cat = cat with black square, polar bear = bear with snowflake, etc.)\n // So here we set the threshold at 1.8 times the size of the baseline emoji.\n const supported = emojiWidth / 1.8 < $9e9d3488b14d9168$var$baselineEmojiWidth;\n $9e9d3488b14d9168$var$supportedZwjEmojis.set(emoji.unicode, supported);\n }\n}\n// like lodash's uniq\nfunction $9e9d3488b14d9168$var$uniq(arr) {\n return $9e9d3488b14d9168$var$uniqBy(arr, (_)=>_);\n}\n// Note we put this in its own function outside Picker.js to avoid Svelte doing an invalidation on the \"setter\" here.\n// At best the invalidation is useless, at worst it can cause infinite loops:\n// https://github.com/nolanlawson/emoji-picker-element/pull/180\n// https://github.com/sveltejs/svelte/issues/6521\n// Also note tabpanelElement can be null if the element is disconnected immediately after connected\nfunction $9e9d3488b14d9168$var$resetScrollTopIfPossible(element) {\n /* istanbul ignore else */ if (element) element.scrollTop = 0;\n}\nfunction $9e9d3488b14d9168$var$getFromMap(cache, key, func) {\n let cached = cache.get(key);\n if (!cached) {\n cached = func();\n cache.set(key, cached);\n }\n return cached;\n}\nfunction $9e9d3488b14d9168$var$toString(value) {\n return \"\" + value;\n}\nfunction $9e9d3488b14d9168$var$parseTemplate(htmlString) {\n const template = document.createElement(\"template\");\n template.innerHTML = htmlString;\n return template;\n}\nconst $9e9d3488b14d9168$var$parseCache = new WeakMap();\nconst $9e9d3488b14d9168$var$domInstancesCache = new WeakMap();\n// This needs to be a symbol because it needs to be different from any possible output of a key function\nconst $9e9d3488b14d9168$var$unkeyedSymbol = Symbol(\"un-keyed\");\n// Not supported in Safari <=13\nconst $9e9d3488b14d9168$var$hasReplaceChildren = \"replaceChildren\" in Element.prototype;\nfunction $9e9d3488b14d9168$var$replaceChildren(parentNode, newChildren) {\n /* istanbul ignore else */ if ($9e9d3488b14d9168$var$hasReplaceChildren) parentNode.replaceChildren(...newChildren);\n else {\n parentNode.innerHTML = \"\";\n parentNode.append(...newChildren);\n }\n}\nfunction $9e9d3488b14d9168$var$doChildrenNeedRerender(parentNode, newChildren) {\n let oldChild = parentNode.firstChild;\n let oldChildrenCount = 0;\n // iterate using firstChild/nextSibling because browsers use a linked list under the hood\n while(oldChild){\n const newChild = newChildren[oldChildrenCount];\n // check if the old child and new child are the same\n if (newChild !== oldChild) return true;\n oldChild = oldChild.nextSibling;\n oldChildrenCount++;\n }\n // if new children length is different from old, we must re-render\n return oldChildrenCount !== newChildren.length;\n}\nfunction $9e9d3488b14d9168$var$patchChildren(newChildren, instanceBinding) {\n const { targetNode: targetNode } = instanceBinding;\n let { targetParentNode: targetParentNode } = instanceBinding;\n let needsRerender = false;\n if (targetParentNode) needsRerender = $9e9d3488b14d9168$var$doChildrenNeedRerender(targetParentNode, newChildren);\n else {\n needsRerender = true;\n instanceBinding.targetNode = undefined; // placeholder node not needed anymore, free memory\n instanceBinding.targetParentNode = targetParentNode = targetNode.parentNode;\n }\n // avoid re-rendering list if the dom nodes are exactly the same before and after\n if (needsRerender) $9e9d3488b14d9168$var$replaceChildren(targetParentNode, newChildren);\n}\nfunction $9e9d3488b14d9168$var$patch(expressions, instanceBindings) {\n for (const instanceBinding of instanceBindings){\n const { targetNode: targetNode, currentExpression: currentExpression, binding: { expressionIndex: expressionIndex, attributeName: attributeName, attributeValuePre: attributeValuePre, attributeValuePost: attributeValuePost } } = instanceBinding;\n const expression = expressions[expressionIndex];\n if (currentExpression === expression) continue;\n instanceBinding.currentExpression = expression;\n if (attributeName) targetNode.setAttribute(attributeName, attributeValuePre + $9e9d3488b14d9168$var$toString(expression) + attributeValuePost);\n else {\n let newNode;\n if (Array.isArray(expression)) $9e9d3488b14d9168$var$patchChildren(expression, instanceBinding);\n else if (expression instanceof Element) {\n newNode = expression;\n targetNode.replaceWith(newNode);\n } else // nodeValue is faster than textContent supposedly https://www.youtube.com/watch?v=LY6y3HbDVmg\n // note we may be replacing the value in a placeholder text node\n targetNode.nodeValue = $9e9d3488b14d9168$var$toString(expression);\n if (newNode) instanceBinding.targetNode = newNode;\n }\n }\n}\nfunction $9e9d3488b14d9168$var$parse(tokens) {\n let htmlString = \"\";\n let withinTag = false;\n let withinAttribute = false;\n let elementIndexCounter = -1; // depth-first traversal order\n const elementsToBindings = new Map();\n const elementIndexes = [];\n for(let i = 0, len = tokens.length; i < len; i++){\n const token = tokens[i];\n htmlString += token;\n if (i === len - 1) break; // no need to process characters - no more expressions to be found\n for(let j = 0; j < token.length; j++){\n const char = token.charAt(j);\n switch(char){\n case \"<\":\n {\n const nextChar = token.charAt(j + 1);\n if (nextChar === \"/\") // leaving an element\n elementIndexes.pop();\n else {\n withinTag = true;\n elementIndexes.push(++elementIndexCounter);\n }\n break;\n }\n case \">\":\n withinTag = false;\n withinAttribute = false;\n break;\n case \"=\":\n withinAttribute = true;\n break;\n }\n }\n const elementIndex = elementIndexes[elementIndexes.length - 1];\n const bindings = $9e9d3488b14d9168$var$getFromMap(elementsToBindings, elementIndex, ()=>[]);\n let attributeName;\n let attributeValuePre;\n let attributeValuePost;\n if (withinAttribute) {\n // I never use single-quotes for attribute values in HTML, so just support double-quotes or no-quotes\n const match = /(\\S+)=\"?([^\"=]*)$/.exec(token);\n attributeName = match[1];\n attributeValuePre = match[2];\n attributeValuePost = /^[^\">]*/.exec(tokens[i + 1])[0];\n }\n const binding = {\n attributeName: attributeName,\n attributeValuePre: attributeValuePre,\n attributeValuePost: attributeValuePost,\n expressionIndex: i\n };\n bindings.push(binding);\n if (!withinTag && !withinAttribute) // Add a placeholder text node, so we can find it later. Note we only support one dynamic child text node\n htmlString += \" \";\n }\n const template = $9e9d3488b14d9168$var$parseTemplate(htmlString);\n return {\n template: template,\n elementsToBindings: elementsToBindings\n };\n}\nfunction $9e9d3488b14d9168$var$traverseAndSetupBindings(dom, elementsToBindings) {\n const instanceBindings = [];\n // traverse dom\n const treeWalker = document.createTreeWalker(dom, NodeFilter.SHOW_ELEMENT);\n let element = dom;\n let elementIndex = -1;\n do {\n const bindings = elementsToBindings.get(++elementIndex);\n if (bindings) for(let i = 0; i < bindings.length; i++){\n const binding = bindings[i];\n const targetNode = binding.attributeName ? element // attribute binding, just use the element itself\n : element.firstChild; // not an attribute binding, so has a placeholder text node\n const instanceBinding = {\n binding: binding,\n targetNode: targetNode,\n targetParentNode: undefined,\n currentExpression: undefined\n };\n instanceBindings.push(instanceBinding);\n }\n }while (element = treeWalker.nextNode());\n return instanceBindings;\n}\nfunction $9e9d3488b14d9168$var$parseHtml(tokens) {\n // All templates and bound expressions are unique per tokens array\n const { template: template, elementsToBindings: elementsToBindings } = $9e9d3488b14d9168$var$getFromMap($9e9d3488b14d9168$var$parseCache, tokens, ()=>$9e9d3488b14d9168$var$parse(tokens));\n // When we parseHtml, we always return a fresh DOM instance ready to be updated\n const dom = template.cloneNode(true).content.firstElementChild;\n const instanceBindings = $9e9d3488b14d9168$var$traverseAndSetupBindings(dom, elementsToBindings);\n return function updateDomInstance(expressions) {\n $9e9d3488b14d9168$var$patch(expressions, instanceBindings);\n return dom;\n };\n}\nfunction $9e9d3488b14d9168$var$createFramework(state) {\n const domInstances = $9e9d3488b14d9168$var$getFromMap($9e9d3488b14d9168$var$domInstancesCache, state, ()=>new Map());\n let domInstanceCacheKey = $9e9d3488b14d9168$var$unkeyedSymbol;\n function html(tokens, ...expressions) {\n // Each unique lexical usage of map() is considered unique due to the html`` tagged template call it makes,\n // which has lexically unique tokens. The unkeyed symbol is just used for html`` usage outside of a map().\n const domInstancesForTokens = $9e9d3488b14d9168$var$getFromMap(domInstances, tokens, ()=>new Map());\n const updateDomInstance = $9e9d3488b14d9168$var$getFromMap(domInstancesForTokens, domInstanceCacheKey, ()=>$9e9d3488b14d9168$var$parseHtml(tokens));\n return updateDomInstance(expressions) // update with expressions\n ;\n }\n function map(array, callback, keyFunction) {\n return array.map((item, index)=>{\n const originalCacheKey = domInstanceCacheKey;\n domInstanceCacheKey = keyFunction(item);\n try {\n return callback(item, index);\n } finally{\n domInstanceCacheKey = originalCacheKey;\n }\n });\n }\n return {\n map: map,\n html: html\n };\n}\nfunction $9e9d3488b14d9168$var$render(container, state, helpers, events, actions, refs, abortSignal, firstRender) {\n const { labelWithSkin: labelWithSkin, titleForEmoji: titleForEmoji, unicodeWithSkin: unicodeWithSkin } = helpers;\n const { html: html, map: map } = $9e9d3488b14d9168$var$createFramework(state);\n function emojiList(emojis, searchMode, prefix) {\n return map(emojis, (emoji, i)=>{\n return html``;\n // It's important for the cache key to be unique based on the prefix, because the framework caches based on the\n // unique tokens + cache key, and the same emoji may be used in the tab as well as in the fav bar\n }, (emoji)=>`${prefix}-${emoji.id}`);\n }\n const section = ()=>{\n return html`
${state.i18n.searchDescription}
${state.i18n.skinToneDescription}
${map(state.skinTones, (skinTone, i)=>{\n return html`
${skinTone}
`;\n }, (skinTone)=>skinTone)}
${map(state.groups, (group)=>{\n return html``;\n }, (group)=>group.id)}
${state.message}
${map(state.currentEmojisWithCategories, (emojiWithCategory, i)=>{\n return html`
${state.searchMode ? state.i18n.searchResultsLabel : emojiWithCategory.category ? emojiWithCategory.category : state.currentEmojisWithCategories.length > 1 ? state.i18n.categories.custom : state.i18n.categories[state.currentGroup.name]}
${emojiList(emojiWithCategory.emojis, state.searchMode, /* prefix */ \"emo\")}
`;\n }, (emojiWithCategory)=>emojiWithCategory.category)}
${emojiList(state.currentFavorites, /* searchMode */ false, /* prefix */ \"fav\")}
`;\n };\n const rootDom = section();\n if (firstRender) {\n container.appendChild(rootDom);\n // we only bind events/refs/actions once - there is no need to find them again given this component structure\n // helper for traversing the dom, finding elements by an attribute, and getting the attribute value\n const forElementWithAttribute = (attributeName, callback)=>{\n for (const element of container.querySelectorAll(`[${attributeName}]`))callback(element, element.getAttribute(attributeName));\n };\n // bind events\n for (const eventName of [\n \"click\",\n \"focusout\",\n \"input\",\n \"keydown\",\n \"keyup\"\n ])forElementWithAttribute(`data-on-${eventName}`, (element, listenerName)=>{\n element.addEventListener(eventName, events[listenerName]);\n });\n // find refs\n forElementWithAttribute(\"data-ref\", (element, ref)=>{\n refs[ref] = element;\n });\n // set up actions\n forElementWithAttribute(\"data-action\", (element, action)=>{\n actions[action](element);\n });\n // destroy/abort logic\n abortSignal.addEventListener(\"abort\", ()=>{\n container.removeChild(rootDom);\n });\n }\n}\n/* istanbul ignore next */ const $9e9d3488b14d9168$var$qM = typeof queueMicrotask === \"function\" ? queueMicrotask : (callback)=>Promise.resolve().then(callback);\nfunction $9e9d3488b14d9168$var$createState(abortSignal) {\n let destroyed = false;\n let currentObserver;\n const propsToObservers = new Map();\n const dirtyObservers = new Set();\n let queued;\n const flush = ()=>{\n if (destroyed) return;\n const observersToRun = [\n ...dirtyObservers\n ];\n dirtyObservers.clear(); // clear before running to force any new updates to run in another tick of the loop\n try {\n for (const observer of observersToRun)observer();\n } finally{\n queued = false;\n if (dirtyObservers.size) {\n queued = true;\n $9e9d3488b14d9168$var$qM(flush);\n }\n }\n };\n const state = new Proxy({}, {\n get (target, prop) {\n if (currentObserver) {\n let observers = propsToObservers.get(prop);\n if (!observers) {\n observers = new Set();\n propsToObservers.set(prop, observers);\n }\n observers.add(currentObserver);\n }\n return target[prop];\n },\n set (target, prop, newValue) {\n target[prop] = newValue;\n const observers = propsToObservers.get(prop);\n if (observers) {\n for (const observer of observers)dirtyObservers.add(observer);\n if (!queued) {\n queued = true;\n $9e9d3488b14d9168$var$qM(flush);\n }\n }\n return true;\n }\n });\n const createEffect = (callback)=>{\n const runnable = ()=>{\n const oldObserver = currentObserver;\n currentObserver = runnable;\n try {\n return callback();\n } finally{\n currentObserver = oldObserver;\n }\n };\n return runnable();\n };\n // destroy logic\n abortSignal.addEventListener(\"abort\", ()=>{\n destroyed = true;\n });\n return {\n state: state,\n createEffect: createEffect\n };\n}\n// Compare two arrays, with a function called on each item in the two arrays that returns true if the items are equal\nfunction $9e9d3488b14d9168$var$arraysAreEqualByFunction(left, right, areEqualFunc) {\n if (left.length !== right.length) return false;\n for(let i = 0; i < left.length; i++){\n if (!areEqualFunc(left[i], right[i])) return false;\n }\n return true;\n}\n/* eslint-disable prefer-const,no-labels,no-inner-declarations */ // constants\nconst $9e9d3488b14d9168$var$EMPTY_ARRAY = [];\nconst { assign: $9e9d3488b14d9168$var$assign } = Object;\nfunction $9e9d3488b14d9168$var$createRoot(shadowRoot, props) {\n const refs = {};\n const abortController = new AbortController();\n const abortSignal = abortController.signal;\n const { state: state, createEffect: createEffect } = $9e9d3488b14d9168$var$createState(abortSignal);\n // initial state\n $9e9d3488b14d9168$var$assign(state, {\n skinToneEmoji: undefined,\n i18n: undefined,\n database: undefined,\n customEmoji: undefined,\n customCategorySorting: undefined,\n emojiVersion: undefined\n });\n // public props\n $9e9d3488b14d9168$var$assign(state, props);\n // private props\n $9e9d3488b14d9168$var$assign(state, {\n initialLoad: true,\n currentEmojis: [],\n currentEmojisWithCategories: [],\n rawSearchText: \"\",\n searchText: \"\",\n searchMode: false,\n activeSearchItem: -1,\n message: undefined,\n skinTonePickerExpanded: false,\n skinTonePickerExpandedAfterAnimation: false,\n currentSkinTone: 0,\n activeSkinTone: 0,\n skinToneButtonText: undefined,\n pickerStyle: undefined,\n skinToneButtonLabel: \"\",\n skinTones: [],\n currentFavorites: [],\n defaultFavoriteEmojis: undefined,\n numColumns: $9e9d3488b14d9168$var$DEFAULT_NUM_COLUMNS,\n isRtl: false,\n scrollbarWidth: 0,\n currentGroupIndex: 0,\n groups: $9e9d3488b14d9168$var$groups,\n databaseLoaded: false,\n activeSearchItemId: undefined\n });\n //\n // Update the current group based on the currentGroupIndex\n //\n createEffect(()=>{\n if (state.currentGroup !== state.groups[state.currentGroupIndex]) state.currentGroup = state.groups[state.currentGroupIndex];\n });\n //\n // Utils/helpers\n //\n const focus = (id)=>{\n shadowRoot.getElementById(id).focus();\n };\n const emojiToDomNode = (emoji)=>shadowRoot.getElementById(`emo-${emoji.id}`);\n // fire a custom event that crosses the shadow boundary\n const fireEvent = (name, detail)=>{\n refs.rootElement.dispatchEvent(new CustomEvent(name, {\n detail: detail,\n bubbles: true,\n composed: true\n }));\n };\n //\n // Comparison utils\n //\n const compareEmojiArrays = (a, b)=>a.id === b.id;\n const compareCurrentEmojisWithCategories = (a, b)=>{\n const { category: aCategory, emojis: aEmojis } = a;\n const { category: bCategory, emojis: bEmojis } = b;\n if (aCategory !== bCategory) return false;\n return $9e9d3488b14d9168$var$arraysAreEqualByFunction(aEmojis, bEmojis, compareEmojiArrays);\n };\n //\n // Update utils to avoid excessive re-renders\n //\n // avoid excessive re-renders by checking the value before setting\n const updateCurrentEmojis = (newEmojis)=>{\n if (!$9e9d3488b14d9168$var$arraysAreEqualByFunction(state.currentEmojis, newEmojis, compareEmojiArrays)) state.currentEmojis = newEmojis;\n };\n // avoid excessive re-renders\n const updateSearchMode = (newSearchMode)=>{\n if (state.searchMode !== newSearchMode) state.searchMode = newSearchMode;\n };\n // avoid excessive re-renders\n const updateCurrentEmojisWithCategories = (newEmojisWithCategories)=>{\n if (!$9e9d3488b14d9168$var$arraysAreEqualByFunction(state.currentEmojisWithCategories, newEmojisWithCategories, compareCurrentEmojisWithCategories)) state.currentEmojisWithCategories = newEmojisWithCategories;\n };\n // Helpers used by PickerTemplate\n const unicodeWithSkin = (emoji, currentSkinTone)=>currentSkinTone && emoji.skins && emoji.skins[currentSkinTone] || emoji.unicode;\n const labelWithSkin = (emoji, currentSkinTone)=>$9e9d3488b14d9168$var$uniq([\n emoji.name || unicodeWithSkin(emoji, currentSkinTone),\n emoji.annotation,\n ...emoji.shortcodes || $9e9d3488b14d9168$var$EMPTY_ARRAY\n ].filter(Boolean)).join(\", \");\n const titleForEmoji = (emoji)=>emoji.annotation || (emoji.shortcodes || $9e9d3488b14d9168$var$EMPTY_ARRAY).join(\", \");\n const helpers = {\n labelWithSkin: labelWithSkin,\n titleForEmoji: titleForEmoji,\n unicodeWithSkin: unicodeWithSkin\n };\n const events = {\n onClickSkinToneButton: onClickSkinToneButton,\n onEmojiClick: onEmojiClick,\n onNavClick: onNavClick,\n onNavKeydown: onNavKeydown,\n onSearchKeydown: onSearchKeydown,\n onSkinToneOptionsClick: onSkinToneOptionsClick,\n onSkinToneOptionsFocusOut: onSkinToneOptionsFocusOut,\n onSkinToneOptionsKeydown: onSkinToneOptionsKeydown,\n onSkinToneOptionsKeyup: onSkinToneOptionsKeyup,\n onSearchInput: onSearchInput\n };\n const actions = {\n calculateEmojiGridStyle: calculateEmojiGridStyle\n };\n let firstRender = true;\n createEffect(()=>{\n $9e9d3488b14d9168$var$render(shadowRoot, state, helpers, events, actions, refs, abortSignal, firstRender);\n firstRender = false;\n });\n //\n // Determine the emoji support level (in requestIdleCallback)\n //\n // mount logic\n if (!state.emojiVersion) $9e9d3488b14d9168$var$detectEmojiSupportLevel().then((level)=>{\n // Can't actually test emoji support in Jest/Vitest/JSDom, emoji never render in color in Cairo\n /* istanbul ignore next */ if (!level) state.message = state.i18n.emojiUnsupportedMessage;\n });\n //\n // Set or update the database object\n //\n createEffect(()=>{\n // show a Loading message if it takes a long time, or show an error if there's a network/IDB error\n async function handleDatabaseLoading() {\n let showingLoadingMessage = false;\n const timeoutHandle = setTimeout(()=>{\n showingLoadingMessage = true;\n state.message = state.i18n.loadingMessage;\n }, $9e9d3488b14d9168$var$TIMEOUT_BEFORE_LOADING_MESSAGE);\n try {\n await state.database.ready();\n state.databaseLoaded = true; // eslint-disable-line no-unused-vars\n } catch (err) {\n console.error(err);\n state.message = state.i18n.networkErrorMessage;\n } finally{\n clearTimeout(timeoutHandle);\n if (showingLoadingMessage) {\n showingLoadingMessage = false;\n state.message = \"\"; // eslint-disable-line no-unused-vars\n }\n }\n }\n if (state.database) /* no await */ handleDatabaseLoading();\n });\n //\n // Global styles for the entire picker\n //\n createEffect(()=>{\n state.pickerStyle = `\n --num-groups: ${state.groups.length}; \n --indicator-opacity: ${state.searchMode ? 0 : 1}; \n --num-skintones: ${$9e9d3488b14d9168$var$NUM_SKIN_TONES};`;\n });\n //\n // Set or update the customEmoji\n //\n createEffect(()=>{\n if (state.customEmoji && state.database) updateCustomEmoji(); // re-run whenever customEmoji change\n });\n createEffect(()=>{\n if (state.customEmoji && state.customEmoji.length) {\n if (state.groups !== $9e9d3488b14d9168$var$allGroups) state.groups = $9e9d3488b14d9168$var$allGroups;\n } else if (state.groups !== $9e9d3488b14d9168$var$groups) {\n if (state.currentGroupIndex) // If the current group is anything other than \"custom\" (which is first), decrement.\n // This fixes the odd case where you set customEmoji, then pick a category, then unset customEmoji\n state.currentGroupIndex--;\n state.groups = $9e9d3488b14d9168$var$groups;\n }\n });\n //\n // Set or update the preferred skin tone\n //\n createEffect(()=>{\n async function updatePreferredSkinTone() {\n if (state.databaseLoaded) state.currentSkinTone = await state.database.getPreferredSkinTone();\n }\n /* no await */ updatePreferredSkinTone();\n });\n createEffect(()=>{\n state.skinTones = Array($9e9d3488b14d9168$var$NUM_SKIN_TONES).fill().map((_, i)=>$9e9d3488b14d9168$var$applySkinTone(state.skinToneEmoji, i));\n });\n createEffect(()=>{\n state.skinToneButtonText = state.skinTones[state.currentSkinTone];\n });\n createEffect(()=>{\n state.skinToneButtonLabel = state.i18n.skinToneLabel.replace(\"{skinTone}\", state.i18n.skinTones[state.currentSkinTone]);\n });\n //\n // Set or update the favorites emojis\n //\n createEffect(()=>{\n async function updateDefaultFavoriteEmojis() {\n const { database: database } = state;\n const favs = (await Promise.all($9e9d3488b14d9168$var$MOST_COMMONLY_USED_EMOJI.map((unicode)=>database.getEmojiByUnicodeOrName(unicode)))).filter(Boolean); // filter because in Jest/Vitest tests we don't have all the emoji in the DB\n state.defaultFavoriteEmojis = favs;\n }\n if (state.databaseLoaded) /* no await */ updateDefaultFavoriteEmojis();\n });\n function updateCustomEmoji() {\n // Certain effects have an implicit dependency on customEmoji since it affects the database\n // Getting it here on the state ensures this effect re-runs when customEmoji change.\n // Setting it on the database is pointless but prevents this code from being removed by a minifier.\n state.database.customEmoji = state.customEmoji || $9e9d3488b14d9168$var$EMPTY_ARRAY;\n }\n createEffect(()=>{\n async function updateFavorites() {\n updateCustomEmoji(); // re-run whenever customEmoji change\n const { database: database, defaultFavoriteEmojis: defaultFavoriteEmojis, numColumns: numColumns } = state;\n const dbFavorites = await database.getTopFavoriteEmoji(numColumns);\n const favorites = await summarizeEmojis($9e9d3488b14d9168$var$uniqBy([\n ...dbFavorites,\n ...defaultFavoriteEmojis\n ], (_)=>_.unicode || _.name).slice(0, numColumns));\n state.currentFavorites = favorites;\n }\n if (state.databaseLoaded && state.defaultFavoriteEmojis) /* no await */ updateFavorites();\n });\n //\n // Calculate the width of the emoji grid. This serves two purposes:\n // 1) Re-calculate the --num-columns var because it may have changed\n // 2) Re-calculate the scrollbar width because it may have changed\n // (i.e. because the number of items changed)\n // 3) Re-calculate whether we're in RTL mode or not.\n //\n // The benefit of doing this in one place is to align with rAF/ResizeObserver\n // and do all the calculations in one go. RTL vs LTR is not strictly width-related,\n // but since we're already reading the style here, and since it's already aligned with\n // the rAF loop, this is the most appropriate place to do it perf-wise.\n //\n function calculateEmojiGridStyle(node) {\n $9e9d3488b14d9168$var$calculateWidth(node, abortSignal, (width)=>{\n /* istanbul ignore next */ {\n // read all the style/layout calculations we need to make\n const style = getComputedStyle(refs.rootElement);\n const newNumColumns = parseInt(style.getPropertyValue(\"--num-columns\"), 10);\n const newIsRtl = style.getPropertyValue(\"direction\") === \"rtl\";\n const parentWidth = node.parentElement.getBoundingClientRect().width;\n const newScrollbarWidth = parentWidth - width;\n // write to state variables\n state.numColumns = newNumColumns;\n state.scrollbarWidth = newScrollbarWidth; // eslint-disable-line no-unused-vars\n state.isRtl = newIsRtl; // eslint-disable-line no-unused-vars\n }\n });\n }\n //\n // Set or update the currentEmojis. Check for invalid ZWJ renderings\n // (i.e. double emoji).\n //\n createEffect(()=>{\n async function updateEmojis() {\n const { searchText: searchText, currentGroup: currentGroup, databaseLoaded: databaseLoaded, customEmoji: customEmoji } = state;\n if (!databaseLoaded) {\n state.currentEmojis = [];\n state.searchMode = false;\n } else if (searchText.length >= $9e9d3488b14d9168$var$MIN_SEARCH_TEXT_LENGTH) {\n const newEmojis = await getEmojisBySearchQuery(searchText);\n if (state.searchText === searchText) {\n updateCurrentEmojis(newEmojis);\n updateSearchMode(true);\n }\n } else {\n const { id: currentGroupId } = currentGroup;\n // avoid race condition where currentGroupId is -1 and customEmoji is undefined/empty\n if (currentGroupId !== -1 || customEmoji && customEmoji.length) {\n const newEmojis = await getEmojisByGroup(currentGroupId);\n if (state.currentGroup.id === currentGroupId) {\n updateCurrentEmojis(newEmojis);\n updateSearchMode(false);\n }\n }\n }\n }\n /* no await */ updateEmojis();\n });\n // Some emojis have their ligatures rendered as two or more consecutive emojis\n // We want to treat these the same as unsupported emojis, so we compare their\n // widths against the baseline widths and remove them as necessary\n createEffect(()=>{\n const { currentEmojis: currentEmojis, emojiVersion: emojiVersion } = state;\n const zwjEmojisToCheck = currentEmojis.filter((emoji)=>emoji.unicode) // filter custom emoji\n .filter((emoji)=>$9e9d3488b14d9168$var$hasZwj(emoji) && !$9e9d3488b14d9168$var$supportedZwjEmojis.has(emoji.unicode));\n if (!emojiVersion && zwjEmojisToCheck.length) {\n // render now, check their length later\n updateCurrentEmojis(currentEmojis);\n $9e9d3488b14d9168$var$rAF(()=>checkZwjSupportAndUpdate(zwjEmojisToCheck));\n } else {\n const newEmojis = emojiVersion ? currentEmojis : currentEmojis.filter(isZwjSupported);\n updateCurrentEmojis(newEmojis);\n // Reset scroll top to 0 when emojis change\n $9e9d3488b14d9168$var$rAF(()=>$9e9d3488b14d9168$var$resetScrollTopIfPossible(refs.tabpanelElement));\n }\n });\n function checkZwjSupportAndUpdate(zwjEmojisToCheck) {\n $9e9d3488b14d9168$var$checkZwjSupport(zwjEmojisToCheck, refs.baselineEmoji, emojiToDomNode);\n // force update\n // eslint-disable-next-line no-self-assign\n state.currentEmojis = state.currentEmojis;\n }\n function isZwjSupported(emoji) {\n return !emoji.unicode || !$9e9d3488b14d9168$var$hasZwj(emoji) || $9e9d3488b14d9168$var$supportedZwjEmojis.get(emoji.unicode);\n }\n async function filterEmojisByVersion(emojis) {\n const emojiSupportLevel = state.emojiVersion || await $9e9d3488b14d9168$var$detectEmojiSupportLevel();\n // !version corresponds to custom emoji\n return emojis.filter(({ version: version })=>!version || version <= emojiSupportLevel);\n }\n async function summarizeEmojis(emojis) {\n return $9e9d3488b14d9168$var$summarizeEmojisForUI(emojis, state.emojiVersion || await $9e9d3488b14d9168$var$detectEmojiSupportLevel());\n }\n async function getEmojisByGroup(group) {\n // -1 is custom emoji\n const emoji = group === -1 ? state.customEmoji : await state.database.getEmojiByGroup(group);\n return summarizeEmojis(await filterEmojisByVersion(emoji));\n }\n async function getEmojisBySearchQuery(query) {\n return summarizeEmojis(await filterEmojisByVersion(await state.database.getEmojiBySearchQuery(query)));\n }\n createEffect(()=>{});\n //\n // Derive currentEmojisWithCategories from currentEmojis. This is always done even if there\n // are no categories, because it's just easier to code the HTML this way.\n //\n createEffect(()=>{\n function calculateCurrentEmojisWithCategories() {\n const { searchMode: searchMode, currentEmojis: currentEmojis } = state;\n if (searchMode) return [\n {\n category: \"\",\n emojis: currentEmojis\n }\n ];\n const categoriesToEmoji = new Map();\n for (const emoji of currentEmojis){\n const category = emoji.category || \"\";\n let emojis = categoriesToEmoji.get(category);\n if (!emojis) {\n emojis = [];\n categoriesToEmoji.set(category, emojis);\n }\n emojis.push(emoji);\n }\n return [\n ...categoriesToEmoji.entries()\n ].map(([category, emojis])=>({\n category: category,\n emojis: emojis\n })).sort((a, b)=>state.customCategorySorting(a.category, b.category));\n }\n const newEmojisWithCategories = calculateCurrentEmojisWithCategories();\n updateCurrentEmojisWithCategories(newEmojisWithCategories);\n });\n //\n // Handle active search item (i.e. pressing up or down while searching)\n //\n createEffect(()=>{\n state.activeSearchItemId = state.activeSearchItem !== -1 && state.currentEmojis[state.activeSearchItem].id;\n });\n //\n // Handle user input on the search input\n //\n createEffect(()=>{\n const { rawSearchText: rawSearchText } = state;\n $9e9d3488b14d9168$var$rIC(()=>{\n state.searchText = (rawSearchText || \"\").trim(); // defer to avoid input delays, plus we can trim here\n state.activeSearchItem = -1;\n });\n });\n function onSearchKeydown(event) {\n if (!state.searchMode || !state.currentEmojis.length) return;\n const goToNextOrPrevious = (previous)=>{\n $9e9d3488b14d9168$var$halt(event);\n state.activeSearchItem = $9e9d3488b14d9168$var$incrementOrDecrement(previous, state.activeSearchItem, state.currentEmojis);\n };\n switch(event.key){\n case \"ArrowDown\":\n return goToNextOrPrevious(false);\n case \"ArrowUp\":\n return goToNextOrPrevious(true);\n case \"Enter\":\n if (state.activeSearchItem === -1) // focus the first option in the list since the list must be non-empty at this point (it's verified above)\n state.activeSearchItem = 0;\n else {\n $9e9d3488b14d9168$var$halt(event);\n return clickEmoji(state.currentEmojis[state.activeSearchItem].id);\n }\n }\n }\n //\n // Handle user input on nav\n //\n function onNavClick(event) {\n const { target: target } = event;\n const closestTarget = target.closest(\".nav-button\");\n /* istanbul ignore if */ if (!closestTarget) return; // This should never happen, but makes me nervous not to have it\n const groupId = parseInt(closestTarget.dataset.groupId, 10);\n refs.searchElement.value = \"\"; // clear search box input\n state.rawSearchText = \"\";\n state.searchText = \"\";\n state.activeSearchItem = -1;\n state.currentGroupIndex = state.groups.findIndex((_)=>_.id === groupId);\n }\n function onNavKeydown(event) {\n const { target: target, key: key } = event;\n const doFocus = (el)=>{\n if (el) {\n $9e9d3488b14d9168$var$halt(event);\n el.focus();\n }\n };\n switch(key){\n case \"ArrowLeft\":\n return doFocus(target.previousElementSibling);\n case \"ArrowRight\":\n return doFocus(target.nextElementSibling);\n case \"Home\":\n return doFocus(target.parentElement.firstElementChild);\n case \"End\":\n return doFocus(target.parentElement.lastElementChild);\n }\n }\n //\n // Handle user input on an emoji\n //\n async function clickEmoji(unicodeOrName) {\n const emoji = await state.database.getEmojiByUnicodeOrName(unicodeOrName);\n const emojiSummary = [\n ...state.currentEmojis,\n ...state.currentFavorites\n ].find((_)=>_.id === unicodeOrName);\n const skinTonedUnicode = emojiSummary.unicode && unicodeWithSkin(emojiSummary, state.currentSkinTone);\n await state.database.incrementFavoriteEmojiCount(unicodeOrName);\n fireEvent(\"emoji-click\", {\n emoji: emoji,\n skinTone: state.currentSkinTone,\n ...skinTonedUnicode && {\n unicode: skinTonedUnicode\n },\n ...emojiSummary.name && {\n name: emojiSummary.name\n }\n });\n }\n async function onEmojiClick(event) {\n const { target: target } = event;\n /* istanbul ignore if */ if (!target.classList.contains(\"emoji\")) // This should never happen, but makes me nervous not to have it\n return;\n $9e9d3488b14d9168$var$halt(event);\n const id = target.id.substring(4); // replace 'emo-' or 'fav-' prefix\n /* no await */ clickEmoji(id);\n }\n //\n // Handle user input on the skintone picker\n //\n function changeSkinTone(skinTone) {\n state.currentSkinTone = skinTone;\n state.skinTonePickerExpanded = false;\n focus(\"skintone-button\");\n fireEvent(\"skin-tone-change\", {\n skinTone: skinTone\n });\n /* no await */ state.database.setPreferredSkinTone(skinTone);\n }\n function onSkinToneOptionsClick(event) {\n const { target: { id: id } } = event;\n const match = id && id.match(/^skintone-(\\d)/); // skintone option format\n /* istanbul ignore if */ if (!match) return; // This should never happen, but makes me nervous not to have it\n $9e9d3488b14d9168$var$halt(event);\n const skinTone = parseInt(match[1], 10); // remove 'skintone-' prefix\n changeSkinTone(skinTone);\n }\n function onClickSkinToneButton(event) {\n state.skinTonePickerExpanded = !state.skinTonePickerExpanded;\n state.activeSkinTone = state.currentSkinTone;\n // this should always be true, since the button is obscured by the listbox, so this `if` is just to be sure\n if (state.skinTonePickerExpanded) {\n $9e9d3488b14d9168$var$halt(event);\n $9e9d3488b14d9168$var$rAF(()=>focus(\"skintone-list\"));\n }\n }\n // To make the animation nicer, change the z-index of the skintone picker button\n // *after* the animation has played. This makes it appear that the picker box\n // is expanding \"below\" the button\n createEffect(()=>{\n if (state.skinTonePickerExpanded) refs.skinToneDropdown.addEventListener(\"transitionend\", ()=>{\n state.skinTonePickerExpandedAfterAnimation = true; // eslint-disable-line no-unused-vars\n }, {\n once: true\n });\n else state.skinTonePickerExpandedAfterAnimation = false; // eslint-disable-line no-unused-vars\n });\n function onSkinToneOptionsKeydown(event) {\n // this should never happen, but makes me nervous not to have it\n /* istanbul ignore if */ if (!state.skinTonePickerExpanded) return;\n const changeActiveSkinTone = async (nextSkinTone)=>{\n $9e9d3488b14d9168$var$halt(event);\n state.activeSkinTone = nextSkinTone;\n };\n switch(event.key){\n case \"ArrowUp\":\n return changeActiveSkinTone($9e9d3488b14d9168$var$incrementOrDecrement(true, state.activeSkinTone, state.skinTones));\n case \"ArrowDown\":\n return changeActiveSkinTone($9e9d3488b14d9168$var$incrementOrDecrement(false, state.activeSkinTone, state.skinTones));\n case \"Home\":\n return changeActiveSkinTone(0);\n case \"End\":\n return changeActiveSkinTone(state.skinTones.length - 1);\n case \"Enter\":\n // enter on keydown, space on keyup. this is just how browsers work for buttons\n // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html\n $9e9d3488b14d9168$var$halt(event);\n return changeSkinTone(state.activeSkinTone);\n case \"Escape\":\n $9e9d3488b14d9168$var$halt(event);\n state.skinTonePickerExpanded = false;\n return focus(\"skintone-button\");\n }\n }\n function onSkinToneOptionsKeyup(event) {\n // this should never happen, but makes me nervous not to have it\n /* istanbul ignore if */ if (!state.skinTonePickerExpanded) return;\n switch(event.key){\n case \" \":\n // enter on keydown, space on keyup. this is just how browsers work for buttons\n // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html\n $9e9d3488b14d9168$var$halt(event);\n return changeSkinTone(state.activeSkinTone);\n }\n }\n async function onSkinToneOptionsFocusOut(event) {\n // On blur outside of the skintone listbox, collapse the skintone picker.\n const { relatedTarget: relatedTarget } = event;\n // The `else` should never happen, but makes me nervous not to have it\n /* istanbul ignore else */ if (!relatedTarget || relatedTarget.id !== \"skintone-list\") state.skinTonePickerExpanded = false;\n }\n function onSearchInput(event) {\n state.rawSearchText = event.target.value;\n }\n return {\n $set (newState) {\n $9e9d3488b14d9168$var$assign(state, newState);\n },\n $destroy () {\n abortController.abort();\n }\n };\n}\nconst $9e9d3488b14d9168$var$DEFAULT_DATA_SOURCE = \"https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json\";\nconst $9e9d3488b14d9168$var$DEFAULT_LOCALE = \"en\";\nvar $9e9d3488b14d9168$var$enI18n = {\n categoriesLabel: \"Categories\",\n emojiUnsupportedMessage: \"Your browser does not support color emoji.\",\n favoritesLabel: \"Favorites\",\n loadingMessage: \"Loading\\u2026\",\n networkErrorMessage: \"Could not load emoji.\",\n regionLabel: \"Emoji picker\",\n searchDescription: \"When search results are available, press up or down to select and enter to choose.\",\n searchLabel: \"Search\",\n searchResultsLabel: \"Search results\",\n skinToneDescription: \"When expanded, press up or down to select and enter to choose.\",\n skinToneLabel: \"Choose a skin tone (currently {skinTone})\",\n skinTonesLabel: \"Skin tones\",\n skinTones: [\n \"Default\",\n \"Light\",\n \"Medium-Light\",\n \"Medium\",\n \"Medium-Dark\",\n \"Dark\"\n ],\n categories: {\n custom: \"Custom\",\n \"smileys-emotion\": \"Smileys and emoticons\",\n \"people-body\": \"People and body\",\n \"animals-nature\": \"Animals and nature\",\n \"food-drink\": \"Food and drink\",\n \"travel-places\": \"Travel and places\",\n activities: \"Activities\",\n objects: \"Objects\",\n symbols: \"Symbols\",\n flags: \"Flags\"\n }\n};\nvar $9e9d3488b14d9168$var$baseStyles = \":host{--emoji-size:1.375rem;--emoji-padding:0.5rem;--category-emoji-size:var(--emoji-size);--category-emoji-padding:var(--emoji-padding);--indicator-height:3px;--input-border-radius:0.5rem;--input-border-size:1px;--input-font-size:1rem;--input-line-height:1.5;--input-padding:0.25rem;--num-columns:8;--outline-size:2px;--border-size:1px;--skintone-border-radius:1rem;--category-font-size:1rem;display:flex;width:min-content;height:400px}:host,:host(.light){color-scheme:light;--background:#fff;--border-color:#e0e0e0;--indicator-color:#385ac1;--input-border-color:#999;--input-font-color:#111;--input-placeholder-color:#999;--outline-color:#999;--category-font-color:#111;--button-active-background:#e6e6e6;--button-hover-background:#d9d9d9}:host(.dark){color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}@media (prefers-color-scheme:dark){:host{color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}}:host([hidden]){display:none}button{margin:0;padding:0;border:0;background:0 0;box-shadow:none;-webkit-tap-highlight-color:transparent}button::-moz-focus-inner{border:0}input{padding:0;margin:0;line-height:1.15;font-family:inherit}input[type=search]{-webkit-appearance:none}:focus{outline:var(--outline-color) solid var(--outline-size);outline-offset:calc(-1*var(--outline-size))}:host([data-js-focus-visible]) :focus:not([data-focus-visible-added]){outline:0}:focus:not(:focus-visible){outline:0}.hide-focus{outline:0}*{box-sizing:border-box}.picker{contain:content;display:flex;flex-direction:column;background:var(--background);border:var(--border-size) solid var(--border-color);width:100%;height:100%;overflow:hidden;--total-emoji-size:calc(var(--emoji-size) + (2 * var(--emoji-padding)));--total-category-emoji-size:calc(var(--category-emoji-size) + (2 * var(--category-emoji-padding)))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.hidden{opacity:0;pointer-events:none}.abs-pos{position:absolute;left:0;top:0}.gone{display:none!important}.skintone-button-wrapper,.skintone-list{background:var(--background);z-index:3}.skintone-button-wrapper.expanded{z-index:1}.skintone-list{position:absolute;inset-inline-end:0;top:0;z-index:2;overflow:visible;border-bottom:var(--border-size) solid var(--border-color);border-radius:0 0 var(--skintone-border-radius) var(--skintone-border-radius);will-change:transform;transition:transform .2s ease-in-out;transform-origin:center 0}@media (prefers-reduced-motion:reduce){.skintone-list{transition-duration:.001s}}@supports not (inset-inline-end:0){.skintone-list{right:0}}.skintone-list.no-animate{transition:none}.tabpanel{overflow-y:auto;-webkit-overflow-scrolling:touch;will-change:transform;min-height:0;flex:1;contain:content}.emoji-menu{display:grid;grid-template-columns:repeat(var(--num-columns),var(--total-emoji-size));justify-content:space-around;align-items:flex-start;width:100%}.category{padding:var(--emoji-padding);font-size:var(--category-font-size);color:var(--category-font-color)}.custom-emoji,.emoji,button.emoji{height:var(--total-emoji-size);width:var(--total-emoji-size)}.emoji,button.emoji{font-size:var(--emoji-size);display:flex;align-items:center;justify-content:center;border-radius:100%;line-height:1;overflow:hidden;font-family:var(--emoji-font-family);cursor:pointer}@media (hover:hover) and (pointer:fine){.emoji:hover,button.emoji:hover{background:var(--button-hover-background)}}.emoji.active,.emoji:active,button.emoji.active,button.emoji:active{background:var(--button-active-background)}.custom-emoji{padding:var(--emoji-padding);object-fit:contain;pointer-events:none;background-repeat:no-repeat;background-position:center center;background-size:var(--emoji-size) var(--emoji-size)}.nav,.nav-button{align-items:center}.nav{display:grid;justify-content:space-between;contain:content}.nav-button{display:flex;justify-content:center}.nav-emoji{font-size:var(--category-emoji-size);width:var(--total-category-emoji-size);height:var(--total-category-emoji-size)}.indicator-wrapper{display:flex;border-bottom:1px solid var(--border-color)}.indicator{width:calc(100%/var(--num-groups));height:var(--indicator-height);opacity:var(--indicator-opacity);background-color:var(--indicator-color);will-change:transform,opacity;transition:opacity .1s linear,transform .25s ease-in-out}@media (prefers-reduced-motion:reduce){.indicator{will-change:opacity;transition:opacity .1s linear}}.pad-top,input.search{background:var(--background);width:100%}.pad-top{height:var(--emoji-padding);z-index:3}.search-row{display:flex;align-items:center;position:relative;padding-inline-start:var(--emoji-padding);padding-bottom:var(--emoji-padding)}.search-wrapper{flex:1;min-width:0}input.search{padding:var(--input-padding);border-radius:var(--input-border-radius);border:var(--input-border-size) solid var(--input-border-color);color:var(--input-font-color);font-size:var(--input-font-size);line-height:var(--input-line-height)}input.search::placeholder{color:var(--input-placeholder-color)}.favorites{display:flex;flex-direction:row;border-top:var(--border-size) solid var(--border-color);contain:content}.message{padding:var(--emoji-padding)}\";\nconst $9e9d3488b14d9168$var$PROPS = [\n \"customEmoji\",\n \"customCategorySorting\",\n \"database\",\n \"dataSource\",\n \"i18n\",\n \"locale\",\n \"skinToneEmoji\",\n \"emojiVersion\"\n];\n// Styles injected ourselves, so we can declare the FONT_FAMILY variable in one place\nconst $9e9d3488b14d9168$var$EXTRA_STYLES = `:host{--emoji-font-family:${$9e9d3488b14d9168$var$FONT_FAMILY}}`;\nclass $9e9d3488b14d9168$export$2e2bcd8739ae039 extends HTMLElement {\n constructor(props){\n super();\n this.attachShadow({\n mode: \"open\"\n });\n const style = document.createElement(\"style\");\n style.textContent = $9e9d3488b14d9168$var$baseStyles + $9e9d3488b14d9168$var$EXTRA_STYLES;\n this.shadowRoot.appendChild(style);\n this._ctx = {\n // Set defaults\n locale: $9e9d3488b14d9168$var$DEFAULT_LOCALE,\n dataSource: $9e9d3488b14d9168$var$DEFAULT_DATA_SOURCE,\n skinToneEmoji: $9e9d3488b14d9168$var$DEFAULT_SKIN_TONE_EMOJI,\n customCategorySorting: $9e9d3488b14d9168$var$DEFAULT_CATEGORY_SORTING,\n customEmoji: null,\n i18n: $9e9d3488b14d9168$var$enI18n,\n emojiVersion: null,\n ...props\n };\n // Handle properties set before the element was upgraded\n for (const prop of $9e9d3488b14d9168$var$PROPS)if (prop !== \"database\" && Object.prototype.hasOwnProperty.call(this, prop)) {\n this._ctx[prop] = this[prop];\n delete this[prop];\n }\n this._dbFlush(); // wait for a flush before creating the db, in case the user calls e.g. a setter or setAttribute\n }\n connectedCallback() {\n // The _cmp may be defined if the component was immediately disconnected and then reconnected. In that case,\n // do nothing (preserve the state)\n if (!this._cmp) this._cmp = $9e9d3488b14d9168$var$createRoot(this.shadowRoot, this._ctx);\n }\n disconnectedCallback() {\n // Check in a microtask if the element is still connected. If so, treat this as a \"move\" rather than a disconnect\n // Inspired by Vue: https://vuejs.org/guide/extras/web-components.html#building-custom-elements-with-vue\n $9e9d3488b14d9168$var$qM(()=>{\n // this._cmp may be defined if connect-disconnect-connect-disconnect occurs synchronously\n if (!this.isConnected && this._cmp) {\n this._cmp.$destroy();\n this._cmp = undefined;\n const { database: database } = this._ctx;\n database.close()// only happens if the database failed to load in the first place, so we don't care\n .catch((err)=>console.error(err));\n }\n });\n }\n static get observedAttributes() {\n return [\n \"locale\",\n \"data-source\",\n \"skin-tone-emoji\",\n \"emoji-version\"\n ] // complex objects aren't supported, also use kebab-case\n ;\n }\n attributeChangedCallback(attrName, oldValue, newValue) {\n this._set(// convert from kebab-case to camelcase\n // see https://github.com/sveltejs/svelte/issues/3852#issuecomment-665037015\n attrName.replace(/-([a-z])/g, (_, up)=>up.toUpperCase()), // convert string attribute to float if necessary\n attrName === \"emoji-version\" ? parseFloat(newValue) : newValue);\n }\n _set(prop, newValue) {\n this._ctx[prop] = newValue;\n if (this._cmp) this._cmp.$set({\n [prop]: newValue\n });\n if ([\n \"locale\",\n \"dataSource\"\n ].includes(prop)) this._dbFlush();\n }\n _dbCreate() {\n const { locale: locale, dataSource: dataSource, database: database } = this._ctx;\n // only create a new database if we really need to\n if (!database || database.locale !== locale || database.dataSource !== dataSource) this._set(\"database\", new (0, $736431a7b9521865$export$2e2bcd8739ae039)({\n locale: locale,\n dataSource: dataSource\n }));\n }\n // Update the Database in one microtask if the locale/dataSource change. We do one microtask\n // so we don't create two Databases if e.g. both the locale and the dataSource change\n _dbFlush() {\n $9e9d3488b14d9168$var$qM(()=>this._dbCreate());\n }\n}\nconst $9e9d3488b14d9168$var$definitions = {};\nfor (const prop of $9e9d3488b14d9168$var$PROPS)$9e9d3488b14d9168$var$definitions[prop] = {\n get () {\n if (prop === \"database\") // in rare cases, the microtask may not be flushed yet, so we need to instantiate the DB\n // now if the user is asking for it\n this._dbCreate();\n return this._ctx[prop];\n },\n set (val) {\n if (prop === \"database\") throw new Error(\"database is read-only\");\n this._set(prop, val);\n }\n};\nObject.defineProperties($9e9d3488b14d9168$export$2e2bcd8739ae039.prototype, $9e9d3488b14d9168$var$definitions);\n/* istanbul ignore else */ if (!customElements.get(\"emoji-picker\")) customElements.define(\"emoji-picker\", $9e9d3488b14d9168$export$2e2bcd8739ae039);\n\n\n\n\n\nvar $bf4f0cf05f6fd378$var$browserSupportsTextareaTextNodes;\n/**\n * @param {HTMLElement} input\n * @return {boolean}\n */ function $bf4f0cf05f6fd378$var$canManipulateViaTextNodes(input) {\n if (input.nodeName !== \"TEXTAREA\") return false;\n if (typeof $bf4f0cf05f6fd378$var$browserSupportsTextareaTextNodes === \"undefined\") {\n var textarea = document.createElement(\"textarea\");\n textarea.value = 1;\n $bf4f0cf05f6fd378$var$browserSupportsTextareaTextNodes = !!textarea.firstChild;\n }\n return $bf4f0cf05f6fd378$var$browserSupportsTextareaTextNodes;\n}\n/**\n * @param {HTMLTextAreaElement|HTMLInputElement} input\n * @param {string} text\n * @returns {void}\n */ function $bf4f0cf05f6fd378$var$index(input, text) {\n // Most of the used APIs only work with the field selected\n input.focus(); // IE 8-10\n if (document.selection) {\n var ieRange = document.selection.createRange();\n ieRange.text = text; // Move cursor after the inserted text\n ieRange.collapse(false);\n ieRange.select();\n return;\n } // Webkit + Edge\n var isSuccess = document.execCommand(\"insertText\", false, text);\n if (!isSuccess) {\n var start = input.selectionStart;\n var end = input.selectionEnd; // Firefox (non-standard method)\n if (typeof input.setRangeText === \"function\") input.setRangeText(text);\n else {\n // To make a change we just need a Range, not a Selection\n var range = document.createRange();\n var textNode = document.createTextNode(text);\n if ($bf4f0cf05f6fd378$var$canManipulateViaTextNodes(input)) {\n var node = input.firstChild; // If textarea is empty, just insert the text\n if (!node) input.appendChild(textNode);\n else {\n // Otherwise we need to find a nodes for start and end\n var offset = 0;\n var startNode = null;\n var endNode = null;\n while(node && (startNode === null || endNode === null)){\n var nodeLength = node.nodeValue.length; // if start of the selection falls into current node\n if (start >= offset && start <= offset + nodeLength) range.setStart(startNode = node, start - offset);\n // if end of the selection falls into current node\n if (end >= offset && end <= offset + nodeLength) range.setEnd(endNode = node, end - offset);\n offset += nodeLength;\n node = node.nextSibling;\n } // If there is some text selected, remove it as we should replace it\n if (start !== end) range.deleteContents();\n }\n } // If the node is a textarea and the range doesn't span outside the element\n //\n // Get the commonAncestorContainer of the selected range and test its type\n // If the node is of type `#text` it means that we're still working with text nodes within our textarea element\n // otherwise, if it's of type `#document` for example it means our selection spans outside the textarea.\n if ($bf4f0cf05f6fd378$var$canManipulateViaTextNodes(input) && range.commonAncestorContainer.nodeName === \"#text\") // Finally insert a new node. The browser will automatically split start and end nodes into two if necessary\n range.insertNode(textNode);\n else {\n // If the node is not a textarea or the range spans outside a textarea the only way is to replace the whole value\n var value = input.value;\n input.value = value.slice(0, start) + text + value.slice(end);\n }\n } // Correct the cursor position to be at the end of the insertion\n input.setSelectionRange(start + text.length, start + text.length); // Notify any possible listeners of the change\n var e = document.createEvent(\"UIEvent\");\n e.initEvent(\"input\", true, false);\n input.dispatchEvent(e);\n }\n}\nvar $bf4f0cf05f6fd378$export$2e2bcd8739ae039 = $bf4f0cf05f6fd378$var$index;\n\n\nfunction $7a2aca835bb05064$export$c37129e465f64ef0(a) {\n return null !== a && \"object\" == typeof a ? \"share\" in navigator && \"canShare\" in navigator && navigator.canShare(a) : \"share\" in navigator;\n}\n\n\nObject.defineProperty({}, \"WebShare\", {\n get: function() {\n return $cd62c5572235e737$export$30b344bef3e55b67;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $cd62c5572235e737$var$t = `\n :host {\n display: inline-block;\n }\n`, $cd62c5572235e737$var$e = document.createElement(\"template\");\n$cd62c5572235e737$var$e.innerHTML = `\n \n \n`;\nclass $cd62c5572235e737$export$30b344bef3e55b67 extends HTMLElement {\n #t;\n #e;\n #s = [];\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\",\n delegatesFocus: !0\n }).appendChild($cd62c5572235e737$var$e.content.cloneNode(!0)), this.#t = this.shadowRoot?.querySelector('slot[name=\"button\"]') || null, this.#e = this.#i();\n }\n static get observedAttributes() {\n return [\n \"disabled\"\n ];\n }\n attributeChangedCallback(t, e, s) {\n \"disabled\" === t && e !== s && this.#e && (this.#e.toggleAttribute(\"disabled\", this.disabled), this.#e.setAttribute(\"aria-disabled\", this.disabled.toString()), this.#e.part && this.#e.part.contains(\"button\") && this.#e.part.toggle(\"button--disabled\", this.disabled));\n }\n connectedCallback() {\n this.#r(\"shareUrl\"), this.#r(\"shareTitle\"), this.#r(\"shareText\"), this.#r(\"shareFiles\"), this.#r(\"disabled\"), this.#t?.addEventListener(\"slotchange\", this.#a), this.#e?.addEventListener(\"click\", this.#n);\n }\n disconnectedCallback() {\n this.#t?.removeEventListener(\"slotchange\", this.#a), this.#e?.removeEventListener(\"click\", this.#n);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(t) {\n this.toggleAttribute(\"disabled\", !!t);\n }\n get shareUrl() {\n return this.getAttribute(\"share-url\") || \"\";\n }\n set shareUrl(t) {\n this.setAttribute(\"share-url\", t);\n }\n get shareTitle() {\n return this.getAttribute(\"share-title\") || \"\";\n }\n set shareTitle(t) {\n this.setAttribute(\"share-title\", t);\n }\n get shareText() {\n return this.getAttribute(\"share-text\") || \"\";\n }\n set shareText(t) {\n this.setAttribute(\"share-text\", t);\n }\n get shareFiles() {\n return this.#s;\n }\n set shareFiles(t) {\n Array.isArray(t) && t.length > 0 && (this.#s = t);\n }\n async share() {\n if (!this.disabled) try {\n let t = {};\n this.shareUrl && (t.url = this.shareUrl), this.shareTitle && (t.title = this.shareTitle), this.shareText && (t.text = this.shareText), Array.isArray(this.shareFiles) && this.shareFiles.length > 0 && navigator.canShare && navigator.canShare({\n files: this.shareFiles\n }) && (t.files = this.shareFiles), await navigator.share(t), this.dispatchEvent(new CustomEvent(\"web-share:success\", {\n bubbles: !0,\n composed: !0,\n detail: {\n shareData: t\n }\n }));\n } catch (t) {\n if (t instanceof Error && \"AbortError\" === t.name) {\n this.dispatchEvent(new CustomEvent(\"web-share:abort\", {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n return;\n }\n this.dispatchEvent(new CustomEvent(\"web-share:error\", {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n }\n }\n #n = (t)=>{\n t.preventDefault(), this.disabled || this.share();\n };\n #a = (t)=>{\n t.target && \"button\" === t.target.name && (this.#e?.removeEventListener(\"click\", this.#n), this.#e = this.#i(), this.#e && (this.#e.addEventListener(\"click\", this.#n), \"BUTTON\" === this.#e.nodeName || this.#e.hasAttribute(\"role\") || this.#e.setAttribute(\"role\", \"button\")));\n };\n #i() {\n return this.#t && this.#t.assignedElements({\n flatten: !0\n }).find((t)=>\"BUTTON\" === t.nodeName || \"button\" === t.getAttribute(\"slot\")) || null;\n }\n #r(t) {\n if (Object.prototype.hasOwnProperty.call(this, t)) {\n let e = this[t];\n delete this[t], this[t] = e;\n }\n }\n static defineCustomElement(t = \"web-share\") {\n \"undefined\" == typeof window || window.customElements.get(t) || window.customElements.define(t, $cd62c5572235e737$export$30b344bef3e55b67);\n }\n}\n$cd62c5572235e737$export$30b344bef3e55b67.defineCustomElement();\n\n\nObject.defineProperty({}, \"CapturePhoto\", {\n get: function() {\n return $dced0d224c6d876e$export$cc30a98fe3890794;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $dced0d224c6d876e$var$t = (t, e, i)=>(Number.isNaN(e) && (e = 0), Number.isNaN(i) && (i = 0), Math.min(Math.max(t, Math.min(e, i)), Math.max(e, i))), $dced0d224c6d876e$var$e = \"capture-photo\", $dced0d224c6d876e$var$i = `\n :host {\n display: block;\n box-sizing: border-box;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none;\n }\n\n video {\n display: block;\n }\n\n #output:empty {\n display: none;\n }\n`, $dced0d224c6d876e$var$o = document.createElement(\"template\");\n$dced0d224c6d876e$var$o.innerHTML = `\n \n\n \n\n \n\n
\n \n \n \n\n \n\n \n
\n\n \n\n
\n`;\nclass $dced0d224c6d876e$export$cc30a98fe3890794 extends HTMLElement {\n #t = {};\n #e = null;\n #i = null;\n #o = null;\n #n = null;\n #a = null;\n #s = null;\n #r = null;\n #l = null;\n constructor(){\n super(), this.#t = this.getSupportedConstraints(), this.shadowRoot || this.attachShadow({\n mode: \"open\"\n }).appendChild($dced0d224c6d876e$var$o.content.cloneNode(!0));\n }\n static get observedAttributes() {\n return [\n \"no-image\",\n \"facing-mode\",\n \"camera-resolution\",\n \"pan\",\n \"tilt\",\n \"zoom\"\n ];\n }\n attributeChangedCallback(t, e, i) {\n if (!this.isConnected) return;\n let o = this.getTrackCapabilities(), n = this.getTrackSettings();\n if (\"no-image\" === t && e !== i && this.#u(), \"facing-mode\" === t && e !== i && \"facingMode\" in this.#t) {\n let t = [\n \"user\",\n \"environment\"\n ].includes(this.facingMode || \"\");\n \"facingMode\" in n && t && (this.stopVideoStream(), this.startVideoStream());\n }\n if (\"camera-resolution\" === t && e !== i && \"string\" == typeof this.cameraResolution && this.cameraResolution.trim().length > 0) {\n let [t = 0, e = 0] = this.cameraResolution.split(\"x\").map((t)=>Number(t));\n if (t > 0 && e > 0 && \"width\" in o && \"height\" in o) {\n let i = !!(o.width?.min && o.width?.max) && t >= o?.width?.min && t <= o?.width?.max, a = !!(o.height?.min && o.height?.max) && e >= o?.height?.min && e <= o?.height?.max;\n \"width\" in n && \"height\" in n && i && a && (this.stopVideoStream(), this.startVideoStream());\n }\n }\n if (\"pan\" === t && e !== i && \"pan\" in this.#t) {\n let t = !!(\"pan\" in o && o.pan?.min && o.pan?.max) && this.pan >= o.pan.min && this.pan <= o.pan.max;\n \"pan\" in n && \"number\" == typeof this.pan && t && this.#h(\"pan\", this.pan);\n }\n if (\"tilt\" === t && e !== i && \"tilt\" in this.#t) {\n let t = !!(\"tilt\" in o && o.tilt?.min && o.tilt?.max) && this.tilt >= o.tilt.min && this.tilt <= o.tilt.max;\n \"tilt\" in n && \"number\" == typeof this.tilt && t && this.#h(\"tilt\", this.tilt);\n }\n if (\"zoom\" === t && e !== i && \"zoom\" in this.#t) {\n let t = !!(\"zoom\" in o && o.zoom?.min && o.zoom?.max) && this.zoom >= o.zoom.min && this.zoom <= o.zoom.max;\n \"zoom\" in n && \"number\" == typeof this.zoom && t && this.#h(\"zoom\", this.zoom);\n }\n }\n connectedCallback() {\n if (this.#d(\"autpoPlay\"), this.#d(\"noImage\"), this.#d(\"facingMode\"), this.#d(\"cameraResolution\"), this.#d(\"pan\"), this.#d(\"tilt\"), this.#d(\"zoom\"), this.#d(\"calculateFileSize\"), this.#i = this.shadowRoot?.querySelector(\"canvas\") || null, this.#o = this.shadowRoot?.getElementById(\"output\") || null, this.#n = this.shadowRoot?.querySelector(\"video\") || null, this.#a = this.shadowRoot?.querySelector('slot[name=\"capture-button\"]') || null, this.#s = this.#c(), this.#r = this.shadowRoot?.querySelector('slot[name=\"facing-mode-button\"]') || null, this.#l = this.#m(), this.#n?.addEventListener(\"loadedmetadata\", this.#p), this.#a?.addEventListener(\"slotchange\", this.#g), this.#s?.addEventListener(\"click\", this.#b), this.#r?.addEventListener(\"slotchange\", this.#f), this.#l?.addEventListener(\"click\", this.#v), !$dced0d224c6d876e$export$cc30a98fe3890794.isSupported()) return this.dispatchEvent(new CustomEvent(`${$dced0d224c6d876e$var$e}:error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: {\n name: \"NotSupportedError\",\n message: \"Not supported\"\n }\n }\n }));\n this.autoPlay && this.startVideoStream();\n }\n disconnectedCallback() {\n this.stopVideoStream(), this.#l?.removeEventListener(\"click\", this.#v), this.#s?.removeEventListener(\"click\", this.#b), this.#n?.removeEventListener(\"canplay\", this.#p), this.#a?.removeEventListener(\"slotchange\", this.#g), this.#r?.removeEventListener(\"slotchange\", this.#f);\n }\n get autoPlay() {\n return this.hasAttribute(\"auto-play\");\n }\n set autoPlay(t) {\n this.toggleAttribute(\"auto-play\", !!t);\n }\n get noImage() {\n return this.hasAttribute(\"no-image\");\n }\n set noImage(t) {\n this.toggleAttribute(\"no-image\", !!t);\n }\n get facingMode() {\n return this.getAttribute(\"facing-mode\") || \"user\";\n }\n set facingMode(t) {\n this.setAttribute(\"facing-mode\", t);\n }\n get cameraResolution() {\n return this.getAttribute(\"camera-resolution\") || \"\";\n }\n set cameraResolution(t) {\n this.setAttribute(\"camera-resolution\", t);\n }\n get pan() {\n return Number(this.getAttribute(\"pan\")) || 0;\n }\n set pan(t) {\n this.setAttribute(\"pan\", null != t ? t.toString() : t);\n }\n get tilt() {\n return Number(this.getAttribute(\"tilt\")) || 0;\n }\n set tilt(t) {\n this.setAttribute(\"tilt\", null != t ? t.toString() : t);\n }\n get zoom() {\n return Number(this.getAttribute(\"zoom\")) || 1;\n }\n set zoom(t) {\n this.setAttribute(\"zoom\", null != t ? t.toString() : t);\n }\n get loading() {\n return this.hasAttribute(\"loading\");\n }\n get calculateFileSize() {\n return this.hasAttribute(\"calculate-file-size\");\n }\n set calculateFileSize(t) {\n this.toggleAttribute(\"calculate-file-size\", !!t);\n }\n #v = (t)=>{\n t.preventDefault(), this.loading || (this.facingMode = \"user\" !== this.facingMode && this.facingMode ? \"user\" : \"environment\");\n };\n #b = (t)=>{\n t.preventDefault(), this.capture();\n };\n #p = (t)=>{\n let i = t.target;\n i.play().then(()=>{\n this.dispatchEvent(new CustomEvent(`${$dced0d224c6d876e$var$e}:video-play`, {\n bubbles: !0,\n composed: !0,\n detail: {\n video: i\n }\n }));\n }).catch((t)=>{\n this.dispatchEvent(new CustomEvent(`${$dced0d224c6d876e$var$e}:error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n }).finally(()=>{\n this.removeAttribute(\"loading\");\n });\n };\n #u() {\n this.#o && Array.from(this.#o.childNodes).forEach((t)=>t.remove());\n }\n #h(e, i) {\n if (!this.#e || !e || !i) return;\n let [o] = this.#e.getVideoTracks(), n = this.getTrackCapabilities();\n e in this.getTrackSettings() && o.applyConstraints({\n advanced: [\n {\n [e]: $dced0d224c6d876e$var$t(Number(i), n[e]?.min || 1, n[e]?.max || 1)\n }\n ]\n });\n }\n #g = (t)=>{\n t.target?.name === \"capture-button\" && (this.#s?.removeEventListener(\"click\", this.#b), this.#s = this.#c(), this.#s && (this.#s.addEventListener(\"click\", this.#b), \"BUTTON\" === this.#s.nodeName || this.#s.hasAttribute(\"role\") || this.#s.setAttribute(\"role\", \"button\")));\n };\n #f = (t)=>{\n t.target?.name === \"facing-mode-button\" && (this.#l?.removeEventListener(\"click\", this.#v), this.#l = this.#m(), this.#l && (this.#l.addEventListener(\"click\", this.#v), \"BUTTON\" === this.#l.nodeName || this.#l.hasAttribute(\"role\") || this.#l.setAttribute(\"role\", \"button\")));\n };\n #m() {\n return this.#r && this.#r.assignedElements({\n flatten: !0\n }).find((t)=>\"BUTTON\" === t.nodeName || \"facing-mode-button\" === t.getAttribute(\"slot\")) || null;\n }\n #c() {\n return this.#a && this.#a.assignedElements({\n flatten: !0\n }).find((t)=>\"BUTTON\" === t.nodeName || \"capture-button\" === t.getAttribute(\"slot\")) || null;\n }\n #d(t) {\n if (Object.prototype.hasOwnProperty.call(this, t)) {\n let e = this[t];\n delete this[t], this[t] = e;\n }\n }\n async startVideoStream() {\n if (!$dced0d224c6d876e$export$cc30a98fe3890794.isSupported() || this.#e) return;\n this.setAttribute(\"loading\", \"\");\n let t = {\n video: {\n facingMode: {\n ideal: this.facingMode || \"user\"\n },\n pan: !0,\n tilt: !0,\n zoom: !0\n },\n audio: !1\n };\n if (\"string\" == typeof this.cameraResolution && this.cameraResolution.trim().length > 0) {\n let [e = 0, i = 0] = this.cameraResolution.split(\"x\").map((t)=>Number(t));\n e > 0 && i > 0 && (t.video.width = e, t.video.height = i);\n }\n try {\n this.#e = await navigator.mediaDevices.getUserMedia(t), this.#n && (this.#n.srcObject = this.#e), this.#h(\"pan\", this.pan), this.#h(\"tilt\", this.tilt), this.#h(\"zoom\", this.zoom);\n let e = this.getTrackSettings();\n \"facingMode\" in e && this.#r && (this.#r.hidden = !1);\n } catch (t) {\n this.dispatchEvent(new CustomEvent(`${$dced0d224c6d876e$var$e}:error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n } finally{\n this.removeAttribute(\"loading\");\n }\n }\n stopVideoStream() {\n if (!this.#n || !this.#e) return;\n let [t] = this.#e.getVideoTracks();\n t?.stop(), this.#n.srcObject = null, this.#e = null;\n }\n async capture() {\n if (!this.loading && this.#i && this.#n) try {\n let t = this.#i.getContext(\"2d\"), i = this.#n.videoWidth, o = this.#n.videoHeight;\n this.#i.width = i, this.#i.height = o, t?.drawImage(this.#n, 0, 0, i, o);\n let n = this.#i.toDataURL(\"image/png\");\n if (\"string\" == typeof n && n.includes(\"data:image\")) {\n if (!this.noImage) {\n let t = new Image;\n t.src = n, t.width = i, t.height = o, t.setAttribute(\"part\", \"output-image\"), this.#u(), this.#o?.appendChild(t);\n }\n let t = {\n dataURI: n,\n width: i,\n height: o\n };\n if (this.calculateFileSize) try {\n let e = await fetch(n), i = (await e.blob()).size;\n i && (t.size = i);\n } catch (t) {}\n this.dispatchEvent(new CustomEvent(`${$dced0d224c6d876e$var$e}:success`, {\n bubbles: !0,\n composed: !0,\n detail: t\n }));\n }\n } catch (t) {\n this.dispatchEvent(new CustomEvent(`${$dced0d224c6d876e$var$e}:error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n }\n }\n getSupportedConstraints() {\n return $dced0d224c6d876e$export$cc30a98fe3890794.isSupported() && navigator.mediaDevices.getSupportedConstraints() || {};\n }\n getTrackCapabilities() {\n if (!this.#e) return {};\n let [t] = this.#e.getVideoTracks();\n return t && \"function\" == typeof t.getCapabilities && t.getCapabilities() || {};\n }\n getTrackSettings() {\n if (!this.#e) return {};\n let [t] = this.#e.getVideoTracks();\n return t && \"function\" == typeof t.getSettings && t.getSettings() || {};\n }\n static isSupported() {\n return !!navigator.mediaDevices?.getUserMedia;\n }\n static defineCustomElement(t = $dced0d224c6d876e$var$e) {\n \"undefined\" == typeof window || window.customElements.get(t) || window.customElements.define(t, $dced0d224c6d876e$export$cc30a98fe3890794);\n }\n}\n$dced0d224c6d876e$export$cc30a98fe3890794.defineCustomElement();\n\n\nObject.defineProperty({}, \"ModalElement\", {\n get: function() {\n return $d9c5053bade2d3f8$export$32589115725b904b;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $d9c5053bade2d3f8$var$e = document.createElement(\"template\"), $d9c5053bade2d3f8$var$t = /* css */ `\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n --dialog-placement-margin: calc((2em + 6px) / 2);\n\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n /* Dialog placement */\n :host(:not([fullscreen])[placement=\"top-start\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-center\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-end\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center-start\"]) .dialog {\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center\"]) .dialog {\n margin: auto;\n }\n\n :host(:not([fullscreen])[placement=\"center-end\"]) .dialog {\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-start\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-center\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-end\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n /* Dialog animations */\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: 300ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: end;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n$d9c5053bade2d3f8$var$e.innerHTML = /* html */ `\n \n\n \n
\n
\n \n\n
\n \n
\n
\n\n \n\n
\n \n
\n
\n
\n`; /**\n * @summary A custom element that renders a modal dialog.\n * @documentation https://github.com/georapbox/modal-element\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines whether the modal is open or not.\n * @property {boolean} staticBackdrop - Determines whether the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines whether the modal should have a header or not.\n * @property {boolean} noAnimations - Determines whether the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines whether the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines whether the modal should be fullscreen or not.\n * @property {boolean} preserveOverflow - Determines whether the overflow of the body should be preserved when the modal is open.\n * @property {string} placement - Determines the placement of the modal.\n * @property {string} closeLabel - The label of the default close button, used as the aria-label attribute of the close button.\n *\n * @attribute {boolean} open - Reflects the open property.\n * @attribute {boolean} static-backdrop - Reflects the staticBackdrop property.\n * @attribute {boolean} no-header - Reflects the noHeader property.\n * @attribute {boolean} no-animations - Reflects the noAnimations property.\n * @attribute {boolean} no-close-button - Reflects the noCloseButton property.\n * @attribute {boolean} fullscreen - Reflects the fullscreen property.\n * @attribute {boolean} preserve-overflow - Reflects the preserveOverflow property.\n * @attribute {string} placement - Reflects the placement property.\n * @attribute {string} close-label - Reflects the closeLabel property.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n */ \nclass $d9c5053bade2d3f8$export$32589115725b904b extends HTMLElement {\n #e = null;\n #t = null;\n #o = null;\n #l = void 0;\n constructor(){\n if (super(), !this.shadowRoot) {\n let t = this.attachShadow({\n mode: \"open\"\n });\n t.appendChild($d9c5053bade2d3f8$var$e.content.cloneNode(!0));\n }\n this.shadowRoot && (this.#e = this.shadowRoot.querySelector(\"dialog\"), this.#t = this.shadowRoot.querySelector('slot[name=\"footer\"]'), this.#o = this.shadowRoot.querySelector('slot[name=\"close\"]'));\n }\n static get observedAttributes() {\n return [\n \"open\",\n \"no-header\",\n \"no-animations\",\n \"no-close-button\",\n \"close-label\"\n ];\n }\n attributeChangedCallback(e, t, o) {\n if (null !== this.#e) {\n if (\"open\" === e && t !== o && (this.open ? (this.#e.showModal(), this.dispatchEvent(new CustomEvent(\"me-open\", {\n bubbles: !0,\n composed: !0,\n detail: {\n element: this\n }\n })), document.body && !this.preserveOverflow && (document.body.style.overflow = \"hidden\")) : this.#e.close()), \"no-header\" === e && t !== o) {\n let e = this.#e.querySelector(\".dialog__header\");\n null !== e && (e.hidden = this.noHeader);\n }\n if (\"no-animations\" === e && t !== o && this.#e.classList.toggle(\"dialog--no-animations\", this.noAnimations), \"no-close-button\" === e && t !== o) {\n let e = this.#e.querySelector(\".dialog__close\");\n null !== e && (e.hidden = this.noCloseButton);\n }\n \"close-label\" === e && t !== o && this.#a();\n }\n }\n connectedCallback() {\n this.#i(\"open\"), this.#i(\"staticBackdrop\"), this.#i(\"noHeader\"), this.#i(\"noAnimations\"), this.#i(\"noCloseButton\"), this.#i(\"fullscreen\"), this.#i(\"preserveOverflow\"), this.#i(\"placement\"), this.#i(\"closeLabel\"), this.#e?.addEventListener(\"click\", this.#n), this.#e?.addEventListener(\"close\", this.#r), this.#e?.addEventListener(\"cancel\", this.#s), this.#e?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\", this.#d), this.#t?.addEventListener(\"slotchange\", this.#c), this.#o?.addEventListener(\"slotchange\", this.#h);\n }\n disconnectedCallback() {\n this.#l && clearTimeout(this.#l), this.#e?.addEventListener(\"click\", this.#n), this.#e?.removeEventListener(\"close\", this.#r), this.#e?.removeEventListener(\"cancel\", this.#s), this.#e?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\", this.#d), this.#t?.removeEventListener(\"slotchange\", this.#c), this.#o?.removeEventListener(\"slotchange\", this.#h);\n }\n get open() {\n return this.hasAttribute(\"open\");\n }\n set open(e) {\n this.toggleAttribute(\"open\", !!e);\n }\n get staticBackdrop() {\n return this.hasAttribute(\"static-backdrop\");\n }\n set staticBackdrop(e) {\n this.toggleAttribute(\"static-backdrop\", !!e);\n }\n get noHeader() {\n return this.hasAttribute(\"no-header\");\n }\n set noHeader(e) {\n this.toggleAttribute(\"no-header\", !!e);\n }\n get noAnimations() {\n return this.hasAttribute(\"no-animations\");\n }\n set noAnimations(e) {\n this.toggleAttribute(\"no-animations\", !!e);\n }\n get noCloseButton() {\n return this.hasAttribute(\"no-close-button\");\n }\n set noCloseButton(e) {\n this.toggleAttribute(\"no-close-button\", !!e);\n }\n get fullscreen() {\n return this.hasAttribute(\"fullscreen\");\n }\n set fullscreen(e) {\n this.toggleAttribute(\"fullscreen\", !!e);\n }\n get preserveOverflow() {\n return this.hasAttribute(\"preserve-overflow\");\n }\n set preserveOverflow(e) {\n this.toggleAttribute(\"preserve-overflow\", !!e);\n }\n get placement() {\n return this.getAttribute(\"placement\") || \"center\";\n }\n set placement(e) {\n this.setAttribute(\"placement\", null != e ? e.toString() : e);\n }\n get closeLabel() {\n return this.getAttribute(\"close-label\") || \"Close\";\n }\n set closeLabel(e) {\n this.setAttribute(\"close-label\", null != e ? e.toString() : e);\n }\n #a() {\n if (null === this.#e) return;\n let e = this.#e.querySelector(\".dialog__close\");\n if (null === e) return;\n let t = this.#o?.assignedElements() || [], o = t?.some((e)=>e.textContent?.replace(/\\s/g, \"\") !== \"\");\n o ? e.removeAttribute(\"aria-label\") : e.setAttribute(\"aria-label\", this.closeLabel);\n }\n #g() {\n this.#l || (this.#e?.classList.add(\"dialog--pulse\"), this.#l = setTimeout(()=>{\n this.#e?.classList.remove(\"dialog--pulse\"), clearTimeout(this.#l), this.#l = void 0;\n }, 300));\n }\n #r = ()=>{\n // the open property when the dialog is closed by the user.\n this.open = !1, this.dispatchEvent(new CustomEvent(\"me-close\", {\n bubbles: !0,\n composed: !0,\n detail: {\n element: this\n }\n })), document.body && !this.preserveOverflow && (document.body.style.overflow = \"\");\n };\n #s = (e)=>{\n let t = this.#m(\"escape-key\");\n this.dispatchEvent(t), t.defaultPrevented && (e.preventDefault(), this.noAnimations || this.#g());\n };\n #d = (e)=>{\n let t = this.#m(\"close-button\");\n this.dispatchEvent(t), t.defaultPrevented && (e.preventDefault(), this.noAnimations || this.#g());\n };\n #n = (e)=>{\n let t = e.target, o = e.currentTarget; // Close the dialog when the backdrop is clicked.\n if (t === o) {\n let e = this.#m(\"backdrop-click\");\n this.dispatchEvent(e), e.defaultPrevented || this.staticBackdrop ? this.noAnimations || this.#g() : this.hide();\n } // Close the dialog when external invoker is clicked.\n if (t instanceof HTMLElement && null !== t.closest(\"[data-me-close]\")) {\n let e = this.#m(\"external-invoker\");\n this.dispatchEvent(e), e.defaultPrevented ? this.noAnimations || this.#g() : this.hide();\n }\n };\n #c = ()=>{\n if (null === this.#e) return; /** @type {Nullable} */ \n let e = this.#e.querySelector(\".dialog__footer\");\n if (null === e) return;\n let t = this.#t?.assignedNodes(), o = !!t && t.length > 0;\n e.hidden = !o;\n };\n #h = ()=>{\n this.#a();\n };\n #m(e) {\n return new CustomEvent(\"me-request-close\", {\n bubbles: !0,\n composed: !0,\n cancelable: !0,\n detail: {\n reason: e,\n element: this\n }\n });\n }\n #i(e) {\n if (Object.prototype.hasOwnProperty.call(this, e)) {\n let t = this[e];\n delete this[e], this[e] = t;\n }\n }\n show() {\n this.open || (this.open = !0);\n }\n hide() {\n this.open && (this.open = !1);\n }\n static defineCustomElement(e = \"modal-element\") {\n \"undefined\" == typeof window || window.customElements.get(e) || window.customElements.define(e, $d9c5053bade2d3f8$export$32589115725b904b);\n }\n}\n$d9c5053bade2d3f8$export$32589115725b904b.defineCustomElement();\n //# sourceMappingURL=modal-element-defined.js.map\n\n\nObject.defineProperty({}, \"FilesDropzone\", {\n get: function() {\n return $9351176e8d763a78$export$6ccd1735166caad9;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $9351176e8d763a78$var$e = new Map([\n [\n \"aac\",\n \"audio/aac\"\n ],\n [\n \"abw\",\n \"application/x-abiword\"\n ],\n [\n \"arc\",\n \"application/x-freearc\"\n ],\n [\n \"avif\",\n \"image/avif\"\n ],\n [\n \"avi\",\n \"video/x-msvideo\"\n ],\n [\n \"azw\",\n \"application/vnd.amazon.ebook\"\n ],\n [\n \"bin\",\n \"application/octet-stream\"\n ],\n [\n \"bmp\",\n \"image/bmp\"\n ],\n [\n \"bz\",\n \"application/x-bzip\"\n ],\n [\n \"bz2\",\n \"application/x-bzip2\"\n ],\n [\n \"cda\",\n \"application/x-cdf\"\n ],\n [\n \"csh\",\n \"application/x-csh\"\n ],\n [\n \"css\",\n \"text/css\"\n ],\n [\n \"csv\",\n \"text/csv\"\n ],\n [\n \"doc\",\n \"application/msword\"\n ],\n [\n \"docx\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n ],\n [\n \"eot\",\n \"application/vnd.ms-fontobject\"\n ],\n [\n \"epub\",\n \"application/epub+zip\"\n ],\n [\n \"gz\",\n \"application/gzip\"\n ],\n [\n \"gif\",\n \"image/gif\"\n ],\n [\n \"heic\",\n \"image/heic\"\n ],\n [\n \"heif\",\n \"image/heif\"\n ],\n [\n \"htm\",\n \"text/html\"\n ],\n [\n \"html\",\n \"text/html\"\n ],\n [\n \"ico\",\n \"image/vnd.microsoft.icon\"\n ],\n [\n \"ics\",\n \"text/calendar\"\n ],\n [\n \"jar\",\n \"application/java-archive\"\n ],\n [\n \"jpeg\",\n \"image/jpeg\"\n ],\n [\n \"jpg\",\n \"image/jpeg\"\n ],\n [\n \"jxl\",\n \"image/jxl\"\n ],\n [\n \"js\",\n \"text/javascript\"\n ],\n [\n \"json\",\n \"application/json\"\n ],\n [\n \"jsonld\",\n \"application/ld+json\"\n ],\n [\n \"markdown\",\n \"text/markdown\"\n ],\n [\n \"md\",\n \"text/markdown\"\n ],\n [\n \"mid\",\n \"audio/midi\"\n ],\n [\n \"midi\",\n \"audio/midi\"\n ],\n [\n \"mjs\",\n \"text/javascript\"\n ],\n [\n \"mp3\",\n \"audio/mpeg\"\n ],\n [\n \"mp4\",\n \"video/mp4\"\n ],\n [\n \"mpeg\",\n \"video/mpeg\"\n ],\n [\n \"mpkg\",\n \"application/vnd.apple.installer+xml\"\n ],\n [\n \"odp\",\n \"application/vnd.oasis.opendocument.presentation\"\n ],\n [\n \"ods\",\n \"application/vnd.oasis.opendocument.spreadsheet\"\n ],\n [\n \"odt\",\n \"application/vnd.oasis.opendocument.text\"\n ],\n [\n \"oga\",\n \"audio/ogg\"\n ],\n [\n \"ogv\",\n \"video/ogg\"\n ],\n [\n \"ogx\",\n \"application/ogg\"\n ],\n [\n \"opus\",\n \"audio/opus\"\n ],\n [\n \"otf\",\n \"font/otf\"\n ],\n [\n \"png\",\n \"image/png\"\n ],\n [\n \"pdf\",\n \"application/pdf\"\n ],\n [\n \"php\",\n \"application/x-httpd-php\"\n ],\n [\n \"ppt\",\n \"application/vnd.ms-powerpoint\"\n ],\n [\n \"pptx\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n ],\n [\n \"rar\",\n \"application/vnd.rar\"\n ],\n [\n \"rtf\",\n \"application/rtf\"\n ],\n [\n \"sh\",\n \"application/x-sh\"\n ],\n [\n \"svg\",\n \"image/svg+xml\"\n ],\n [\n \"swf\",\n \"application/x-shockwave-flash\"\n ],\n [\n \"tar\",\n \"application/x-tar\"\n ],\n [\n \"tif\",\n \"image/tiff\"\n ],\n [\n \"tiff\",\n \"image/tiff\"\n ],\n [\n \"ts\",\n \"video/mp2t\"\n ],\n [\n \"ttf\",\n \"font/ttf\"\n ],\n [\n \"txt\",\n \"text/plain\"\n ],\n [\n \"vsd\",\n \"application/vnd.visio\"\n ],\n [\n \"wav\",\n \"audio/wav\"\n ],\n [\n \"weba\",\n \"audio/webm\"\n ],\n [\n \"webm\",\n \"video/webm\"\n ],\n [\n \"webp\",\n \"image/webp\"\n ],\n [\n \"woff\",\n \"font/woff\"\n ],\n [\n \"woff2\",\n \"font/woff2\"\n ],\n [\n \"xhtml\",\n \"application/xhtml+xml\"\n ],\n [\n \"xls\",\n \"application/vnd.ms-excel\"\n ],\n [\n \"xlsx\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n ],\n [\n \"xml\",\n \"application/xml\"\n ],\n [\n \"xul\",\n \"application/vnd.mozilla.xul+xml\"\n ],\n [\n \"zip\",\n \"application/zip\"\n ],\n [\n \"7z\",\n \"application/x-7z-compressed\"\n ],\n [\n \"mkv\",\n \"video/x-matroska\"\n ],\n [\n \"mov\",\n \"video/quicktime\"\n ],\n [\n \"msg\",\n \"application/vnd.ms-outlook\"\n ]\n]), $9351176e8d763a78$var$t = [\n \".DS_Store\",\n \"Thumbs.db\"\n], $9351176e8d763a78$var$o = (t)=>{\n let { name: o } = t;\n if (o && -1 !== o.lastIndexOf(\".\") && !t.type) {\n let i = (o.split(\".\").pop() || \"\").toLowerCase(), r = $9351176e8d763a78$var$e.get(i);\n r && Object.defineProperty(t, \"type\", {\n value: r,\n writable: !1,\n configurable: !1,\n enumerable: !0\n });\n }\n return t;\n}, $9351176e8d763a78$var$i = (e, t)=>{\n let i = $9351176e8d763a78$var$o(e);\n if (\"string\" != typeof i.path) {\n let { webkitRelativePath: o } = e;\n Object.defineProperty(i, \"path\", {\n value: \"string\" == typeof t ? t : o || e.name,\n writable: !1,\n configurable: !1,\n enumerable: !0\n });\n }\n return i;\n}, $9351176e8d763a78$var$r = async (e)=>await new Promise((t, o)=>{\n e.readEntries(t, o);\n }), $9351176e8d763a78$var$a = async (e)=>{\n let t = [], o = await $9351176e8d763a78$var$r(e);\n for(; o.length > 0;)t.push(...o), o = await $9351176e8d763a78$var$r(e);\n return t;\n}, $9351176e8d763a78$var$n = (e)=>new Promise((t, o)=>{\n e.file((o)=>t($9351176e8d763a78$var$i(o, e.fullPath)), o);\n }), $9351176e8d763a78$var$s = async (e)=>{\n let o = [], i = [];\n for (let t of e){\n if (\"file\" !== t.kind) continue;\n let e = t.getAsEntry ? t.getAsEntry() : t.webkitGetAsEntry();\n i.push(e);\n }\n for(; i.length > 0;){\n let e = i.shift();\n if (e) {\n if (e.isFile) {\n let i = await $9351176e8d763a78$var$n(e);\n -1 === $9351176e8d763a78$var$t.indexOf(i.name) && o.push(i);\n } else e.isDirectory && i.push(...await $9351176e8d763a78$var$a(e.createReader()));\n }\n }\n return o;\n}, $9351176e8d763a78$var$d = async (e)=>{\n let o = [];\n for (let r of e)-1 === $9351176e8d763a78$var$t.indexOf(r.name) && o.push($9351176e8d763a78$var$i(r));\n return o;\n}, $9351176e8d763a78$var$l = async (e)=>e.dataTransfer ? e.dataTransfer.items ? await $9351176e8d763a78$var$s(e.dataTransfer.items) : await $9351176e8d763a78$var$d(e.dataTransfer.files) : await $9351176e8d763a78$var$d(e.target.files), $9351176e8d763a78$var$p = \"files-dropzone\", $9351176e8d763a78$var$c = \"TOO_MANY_FILES\", $9351176e8d763a78$var$h = document.createElement(\"template\"), $9351176e8d763a78$var$u = `\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n$9351176e8d763a78$var$h.innerHTML = `\n \n\n \n\n
\n Drag 'n' drop files here, or click to select files\n
\n`;\nclass $9351176e8d763a78$export$6ccd1735166caad9 extends HTMLElement {\n #e = null;\n #t = null;\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\",\n delegatesFocus: !0\n }).appendChild($9351176e8d763a78$var$h.content.cloneNode(!0)), this.shadowRoot && (this.#e = this.shadowRoot.getElementById(\"file-input\"), this.#t = this.shadowRoot.getElementById(\"dropzone\"));\n }\n static get observedAttributes() {\n return [\n \"accept\",\n \"disabled\",\n \"multiple\"\n ];\n }\n attributeChangedCallback(e, t, o) {\n \"accept\" === e && t !== o && this.#e && (this.#e.accept = this.accept), \"disabled\" === e && t !== o && this.#e && (this.#e.disabled = this.disabled, this.disabled ? (this.#t?.removeAttribute(\"tabindex\"), this.#t?.setAttribute(\"aria-disabled\", \"true\")) : (this.#t?.setAttribute(\"tabindex\", \"0\"), this.#t?.setAttribute(\"aria-disabled\", \"false\"))), \"multiple\" === e && t !== o && this.#e && (this.#e.multiple = this.multiple);\n }\n connectedCallback() {\n this.#o(\"accept\"), this.#o(\"disabled\"), this.#o(\"maxFiles\"), this.#o(\"maxSize\"), this.#o(\"minSize\"), this.#o(\"multiple\"), this.#o(\"autoFocus\"), this.#o(\"noStyle\"), this.#e?.addEventListener(\"change\", this.#i), this.#t?.addEventListener(\"dragenter\", this.#r), this.#t?.addEventListener(\"dragover\", this.#a), this.#t?.addEventListener(\"dragleave\", this.#n), this.#t?.addEventListener(\"drop\", this.#s), this.#t?.addEventListener(\"click\", this.#d), this.#t?.addEventListener(\"keyup\", this.#l), this.autoFocus && this.#t?.focus();\n }\n disconnectedCallback() {\n this.#e?.removeEventListener(\"change\", this.#i), this.#t?.removeEventListener(\"dragenter\", this.#r), this.#t?.removeEventListener(\"dragover\", this.#a), this.#t?.removeEventListener(\"dragleave\", this.#n), this.#t?.removeEventListener(\"drop\", this.#s), this.#t?.removeEventListener(\"click\", this.#d), this.#t?.removeEventListener(\"keyup\", this.#l);\n }\n get accept() {\n return this.getAttribute(\"accept\") || \"\";\n }\n set accept(e) {\n this.setAttribute(\"accept\", null != e ? e.toString() : e);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(e) {\n this.toggleAttribute(\"disabled\", !!e);\n }\n get maxFiles() {\n let e = Number(this.getAttribute(\"max-files\")) || 0;\n return e <= 0 ? 1 / 0 : Math.floor(Math.abs(e));\n }\n set maxFiles(e) {\n this.setAttribute(\"max-files\", null != e ? e.toString() : e);\n }\n get maxSize() {\n let e = this.getAttribute(\"max-size\");\n if (null === e) return 1 / 0;\n let t = Number(e);\n return Number.isNaN(t) ? 1 / 0 : t;\n }\n set maxSize(e) {\n this.setAttribute(\"max-size\", null != e ? e.toString() : e);\n }\n get minSize() {\n let e = this.getAttribute(\"min-size\");\n if (null === e) return 0;\n let t = Number(e);\n return Number.isNaN(t) ? 0 : t;\n }\n set minSize(e) {\n this.setAttribute(\"min-size\", null != e ? e.toString() : e);\n }\n get multiple() {\n return this.hasAttribute(\"multiple\");\n }\n set multiple(e) {\n this.toggleAttribute(\"multiple\", !!e);\n }\n get autoFocus() {\n return this.hasAttribute(\"auto-focus\");\n }\n set autoFocus(e) {\n this.toggleAttribute(\"auto-focus\", !!e);\n }\n get noStyle() {\n return this.hasAttribute(\"no-style\");\n }\n set noStyle(e) {\n this.toggleAttribute(\"no-style\", !!e);\n }\n #i = async (e)=>{\n try {\n this.#p(await $9351176e8d763a78$var$l(e));\n } catch (e) {\n this.dispatchEvent(new CustomEvent(`${$9351176e8d763a78$var$p}-error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: e\n }\n }));\n }\n };\n #r = ()=>{\n this.disabled || this.dispatchEvent(new Event(`${$9351176e8d763a78$var$p}-dragenter`, {\n bubbles: !0,\n composed: !0\n }));\n };\n #a = (e)=>{\n if (e.preventDefault(), this.disabled) {\n e.dataTransfer.dropEffect = \"none\";\n return;\n }\n e.dataTransfer.dropEffect = \"copy\", this.#t && (this.#t.classList.add(\"dropzone--dragover\"), this.#t.part.add(\"dropzone--dragover\")), this.dispatchEvent(new Event(`${$9351176e8d763a78$var$p}-dragover`, {\n bubbles: !0,\n composed: !0\n }));\n };\n #n = ()=>{\n this.disabled || (this.#t && (this.#t.classList.remove(\"dropzone--dragover\"), this.#t.part.remove(\"dropzone--dragover\")), this.dispatchEvent(new Event(`${$9351176e8d763a78$var$p}-dragleave`, {\n bubbles: !0,\n composed: !0\n })));\n };\n #s = async (e)=>{\n if (!this.disabled) {\n e.preventDefault(), this.#t && (this.#t.classList.remove(\"dropzone--dragover\"), this.#t.part.remove(\"dropzone--dragover\"));\n try {\n this.#p(await $9351176e8d763a78$var$l(e));\n } catch (e) {\n this.dispatchEvent(new CustomEvent(`${$9351176e8d763a78$var$p}-error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: e\n }\n }));\n }\n }\n };\n #d = ()=>{\n this.disabled || this.#e?.click();\n };\n #l = (e)=>{\n this.disabled || \" \" !== e.key && \"Enter\" !== e.key || this.#e?.click();\n };\n #p(e) {\n if (!Array.isArray(e) || !e.length) return;\n let t = [], o = [], i = e.length;\n if (!this.multiple && i > 1) for (let t of e)o.push({\n file: t,\n errors: [\n {\n code: $9351176e8d763a78$var$c,\n message: \"Too many files selected. Only 1 file is allowed.\"\n }\n ]\n });\n else if (this.multiple && i > this.maxFiles) for (let t of e)o.push({\n file: t,\n errors: [\n {\n code: $9351176e8d763a78$var$c,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? \"files are\" : \"file is\"} allowed.`\n }\n ]\n });\n else for (let i of e){\n let e = function(e, t = \"\") {\n if (!t) return !0;\n let o = [\n ...new Set(t.split(\",\").map((e)=>e.trim()).filter(Boolean))\n ], i = e.type, r = i.replace(/\\/.*$/, \"\");\n for (let t of o)if (\".\" === t.charAt(0)) {\n if (-1 !== e.name.toLowerCase().indexOf(t.toLowerCase(), e.name.length - t.length)) return !0;\n } else if (/\\/\\*$/.test(t)) {\n if (r === t.replace(/\\/.*$/, \"\")) return !0;\n } else if (i === t) return !0;\n return !1;\n }(i, this.accept), r = i.size > this.maxSize, a = i.size < this.minSize;\n if (!e || r || a) {\n let t = [];\n e || t.push({\n code: \"INVALID_MIME_TYPE\",\n message: `File type \"${i.type}\" is not accepted.`\n }), r && t.push({\n code: \"FILE_TOO_LARGE\",\n message: `File size ${i.size} exceeds the maximum size of ${this.maxSize}.`\n }), a && t.push({\n code: \"FILE_TOO_SMALL\",\n message: `File size ${i.size} is smaller than the minimum size of ${this.minSize}.`\n }), o.push({\n file: i,\n errors: t\n });\n } else t.push(i);\n }\n this.dispatchEvent(new CustomEvent(`${$9351176e8d763a78$var$p}-drop`, {\n bubbles: !0,\n composed: !0,\n detail: {\n acceptedFiles: t,\n rejectedFiles: o\n }\n })), t.length > 0 && this.dispatchEvent(new CustomEvent(`${$9351176e8d763a78$var$p}-drop-accepted`, {\n bubbles: !0,\n composed: !0,\n detail: {\n acceptedFiles: t\n }\n })), o.length > 0 && this.dispatchEvent(new CustomEvent(`${$9351176e8d763a78$var$p}-drop-rejected`, {\n bubbles: !0,\n composed: !0,\n detail: {\n rejectedFiles: o\n }\n })), this.#e && (this.#e.value = this.#e.defaultValue);\n }\n openFileDialog() {\n this.disabled || this.#e?.click();\n }\n #o(e) {\n if (Object.prototype.hasOwnProperty.call(this, e)) {\n let t = this[e];\n delete this[e], this[e] = t;\n }\n }\n static defineCustomElement(e = $9351176e8d763a78$var$p) {\n \"undefined\" == typeof window || window.customElements.get(e) || window.customElements.define(e, $9351176e8d763a78$export$6ccd1735166caad9);\n }\n}\n$9351176e8d763a78$export$6ccd1735166caad9.defineCustomElement();\n\n\n\n\nconst $65136e012e05e2d7$export$63e7bed68b07a85c = [\n \"image/jpg\",\n \"image/jpeg\",\n \"image/png\",\n \"image/apng\",\n \"image/gif\",\n \"image/webp\",\n \"image/avif\"\n];\nconst $65136e012e05e2d7$export$62045be72fe457b4 = 20;\nconst $65136e012e05e2d7$export$8f089f0a062560ff = 20;\nconst $65136e012e05e2d7$export$d3f4819a57998cf7 = 360;\n\n\n/**\n * Generates a unique id of the form `${prefix}-${randomString}-${suffix}`.\n *\n * @param {string} [prefix=''] - The prefix to use for the id.\n * @param {string} [suffix=''] - The suffix to use for the id.\n * @returns {string} - The unique id.\n */ const $17004b28c97c1306$export$e2a22331486dcca0 = (prefix = \"\", suffix = \"\")=>{\n const prefixString = typeof prefix === \"string\" && prefix !== \"\" ? prefix + \"-\" : \"\";\n const suffixString = typeof suffix === \"string\" && suffix !== \"\" ? \"-\" + suffix : \"\";\n const randomString = Math.random().toString(36).substring(2, 8); // Pseudo-random string of six alphanumeric characters.\n return `${prefixString}${randomString}${suffixString}`;\n};\n\n\n\nconst $2669cb7c28251d2a$export$6539e087749cf9d3 = async (options = {})=>{\n const res = await fetch(options.url);\n const blob = await res.blob();\n const mimeType = options.mimeType || blob.type || \"\";\n if (!(0, $65136e012e05e2d7$export$63e7bed68b07a85c).includes(mimeType)) throw new Error(`This is not an accepted image format. Accepted MIME types are: ${(0, $65136e012e05e2d7$export$63e7bed68b07a85c).join(\", \")}`);\n return new File([\n blob\n ], options.filename || \"\", blob);\n};\n\n\n/**\n * A class representing a storage utility for managing data in `localStorage` or `sessionStorage`.\n */ class $9e093dbdf49c6d51$export$bf2a15d34f3c441c {\n /**\n * The prefix to be added to all keys.\n *\n * @type {string}\n * @private\n */ #keyPrefix = null;\n /**\n * The storage provider (`localStorage` or `sessionStorage`).\n *\n * @type {Storage}\n * @private\n */ #provider = null;\n /**\n * Creates an instance of Storage.\n *\n * @param {string} prefix - The prefix to be added to all keys when storing/retrieving data.\n * @param {Storage} [provider=localStorage] - The storage provider (`localStorage` or `sessionStorage`).\n * @throws {Error} If prefix is not provided or if the provider is not supported.\n */ constructor(prefix, provider = localStorage){\n if (!prefix) throw new Error(\"Storage prefix is required\");\n if (provider !== localStorage && provider !== sessionStorage) throw new Error(\"Storage provider is not supported\");\n this.#keyPrefix = prefix;\n this.#provider = provider;\n }\n /**\n * Sets a key-value pair in the storage.\n *\n * @param {string} key - The key for the data.\n * @param {*} value - The value to be stored (will be converted to JSON string).\n */ set(key, value) {\n try {\n this.#provider.setItem(`${this.#keyPrefix}${key}`, JSON.stringify(value));\n } catch (err) {\n console.error(\"Error saving to storage\", err);\n }\n }\n /**\n * Retrieves the value associated with the given key from the storage.\n *\n * @param {string} key - The key to retrieve the value for.\n * @returns {*} The value associated with the key, or `null` if key is not found or an error occurs.\n */ get(key) {\n try {\n const value = this.#provider.getItem(`${this.#keyPrefix}${key}`);\n return value ? JSON.parse(value) : null;\n } catch (err) {\n console.error(\"Error getting from storage\", err);\n return null;\n }\n }\n}\nconst $9e093dbdf49c6d51$var$DEFAULT_STORAGE_PREFIX = \"meme-generator/\";\nconst $9e093dbdf49c6d51$var$DEFAULT_STORAGE_PROVIDER = localStorage;\nconst $9e093dbdf49c6d51$export$ddcffe0146c8f882 = new $9e093dbdf49c6d51$export$bf2a15d34f3c441c($9e093dbdf49c6d51$var$DEFAULT_STORAGE_PREFIX, $9e093dbdf49c6d51$var$DEFAULT_STORAGE_PROVIDER);\n\n\nconst $c38b15b964e67d8b$export$de75f46579dcf24 = (selectedImage)=>{\n return typeof selectedImage === \"string\";\n};\n\n\nvar $e42bddb24cbeb64a$exports = {};\n$e42bddb24cbeb64a$exports = new URL(\"Pressuru.684952ea.ttf\", import.meta.url).toString();\n\n\nvar $73cffea1ce7b4c65$exports = {};\n$73cffea1ce7b4c65$exports = new URL(\"Oswald-Regular.89ec7d89.ttf\", import.meta.url).toString();\n\n\nvar $7ffd9e1ede1ff6e8$exports = {};\n$7ffd9e1ede1ff6e8$exports = new URL(\"Oswald-Bold.0f6a7ca6.ttf\", import.meta.url).toString();\n\n\nvar $4c6967df0d437c45$exports = {};\n$4c6967df0d437c45$exports = new URL(\"Roboto-Regular.ca197847.ttf\", import.meta.url).toString();\n\n\nvar $3b8ba92249dba9f8$exports = {};\n$3b8ba92249dba9f8$exports = new URL(\"Roboto-Bold.fdb9b54a.ttf\", import.meta.url).toString();\n\n\nvar $6ae2d9e238daf807$exports = {};\n$6ae2d9e238daf807$exports = new URL(\"RobotoCondensed-Regular.d585f5c7.ttf\", import.meta.url).toString();\n\n\nvar $16764e62b86810da$exports = {};\n$16764e62b86810da$exports = new URL(\"RobotoCondensed-Bold.e1f96d4b.ttf\", import.meta.url).toString();\n\n\nvar $d78526ca6254cbd7$exports = {};\n$d78526ca6254cbd7$exports = new URL(\"CourierPrime-Regular.3a25a501.ttf\", import.meta.url).toString();\n\n\nvar $2ba9f93d92a312e8$exports = {};\n$2ba9f93d92a312e8$exports = new URL(\"CourierPrime-Bold.3d6bf689.ttf\", import.meta.url).toString();\n\n\nvar $94512d98527e27c0$exports = {};\n$94512d98527e27c0$exports = new URL(\"OpenSans-Regular.edf9e01b.ttf\", import.meta.url).toString();\n\n\nvar $0ef27a7a117f4923$exports = {};\n$0ef27a7a117f4923$exports = new URL(\"OpenSans-Bold.8fceb72b.ttf\", import.meta.url).toString();\n\n\nconst $56b863c8b6be7003$export$6874249d87f2602a = [\n {\n name: \"Pressuru\",\n label: \"Pressuru\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($e42bddb24cbeb64a$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"Oswald-Regular\",\n label: \"Oswald\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($73cffea1ce7b4c65$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"Oswald-Bold\",\n label: \"Oswald Bold\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($7ffd9e1ede1ff6e8$exports))),\n style: \"normal\",\n weight: \"700\"\n },\n {\n name: \"Roboto-Regular\",\n label: \"Roboto\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($4c6967df0d437c45$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"Roboto-Bold\",\n label: \"Roboto Bold\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($3b8ba92249dba9f8$exports))),\n style: \"normal\",\n weight: \"700\"\n },\n {\n name: \"RobotoCondensed-Regular\",\n label: \"Roboto Condensed\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($6ae2d9e238daf807$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"RobotoCondensed-Bold\",\n label: \"Roboto Condensed Bold\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($16764e62b86810da$exports))),\n style: \"normal\",\n weight: \"700\"\n },\n {\n name: \"CourierPrime-Regular\",\n label: \"Courier Prime\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($d78526ca6254cbd7$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"CourierPrime-Bold\",\n label: \"Courier Prime Bold\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($2ba9f93d92a312e8$exports))),\n style: \"normal\",\n weight: \"700\"\n },\n {\n name: \"OpenSans-Regular\",\n label: \"Open Sans\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($94512d98527e27c0$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"OpenSans-Bold\",\n label: \"Open Sans Bold\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($0ef27a7a117f4923$exports))),\n style: \"normal\",\n weight: \"400\"\n }\n];\nconst $56b863c8b6be7003$export$59eceaef0c7797b2 = async (name, path, options = {})=>{\n try {\n const font = new FontFace(name, `url(${path})`, {\n ...options\n });\n await font.load();\n document.fonts.add(font);\n } catch (err) {\n console.error(err);\n }\n};\n\n\nconst $3969451ff60cb8d5$var$errorsContainer = document.getElementById(\"errorsContainer\");\nconst $3969451ff60cb8d5$var$hideError = (evt)=>{\n const target = evt.currentTarget;\n target.removeEventListener(\"click\", $3969451ff60cb8d5$var$hideError);\n $3969451ff60cb8d5$var$errorsContainer.removeChild(target.parentNode);\n};\nconst $3969451ff60cb8d5$export$af04143326425dbd = (message = \"\", type = \"info\")=>{\n const types = [\n \"info\",\n \"warning\",\n \"danger\"\n ];\n if (!types.includes(type)) type = \"info\";\n const template = /* html */ `\n ${message}\n \n `;\n const div = document.createElement(\"div\");\n div.className = `alert alert-${type} alert-dismissible text-break mb-2 fade`;\n div.innerHTML = template;\n div.querySelector(\"button\").addEventListener(\"click\", $3969451ff60cb8d5$var$hideError);\n $3969451ff60cb8d5$var$errorsContainer.appendChild(div);\n setTimeout(()=>div.classList.add(\"show\"), 100);\n};\n\n\n\n\n\nconst $a5e4a78f80aa8693$var$defaultTextboxData = {\n id: \"\",\n text: \"\",\n fillColor: \"#ffffff\",\n strokeColor: \"#000000\",\n font: \"Pressuru\",\n fontSize: 40,\n fontWeight: \"normal\",\n textAlign: \"center\",\n shadowBlur: 0,\n strokeWidth: 1.5,\n offsetY: 0,\n offsetX: 0,\n rotate: 0,\n allCaps: true\n};\nconst $a5e4a78f80aa8693$var$textboxes = new Map();\nclass $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b {\n constructor(data){\n const id = (0, $17004b28c97c1306$export$e2a22331486dcca0)(\"textbox\", Date.now().toString(36));\n this.data = data ? {\n ...data,\n id: id\n } : {\n ...$a5e4a78f80aa8693$var$defaultTextboxData,\n id: id\n };\n $a5e4a78f80aa8693$var$textboxes.set(id, this);\n document.dispatchEvent(new CustomEvent(`textbox-create`, {\n bubbles: true,\n composed: true,\n detail: {\n textbox: this\n }\n }));\n }\n getData() {\n return this.data;\n }\n static create(data) {\n return new $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b(data);\n }\n static getAll() {\n return $a5e4a78f80aa8693$var$textboxes;\n }\n static getById(id) {\n return $a5e4a78f80aa8693$var$textboxes.get(id);\n }\n static remove(id) {\n $a5e4a78f80aa8693$var$textboxes.delete(id);\n document.dispatchEvent(new CustomEvent(`textbox-remove`, {\n bubbles: true,\n composed: true,\n detail: {\n id: id\n }\n }));\n }\n static createElement(textbox, autoFocus = true) {\n if (!(textbox instanceof $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b)) return;\n const data = textbox.getData();\n const { id: id, text: text, fillColor: fillColor, strokeColor: strokeColor, fontSize: fontSize, shadowBlur: shadowBlur, strokeWidth: strokeWidth, offsetX: offsetX, offsetY: offsetY, rotate: rotate } = data;\n const template = /* html */ `\n
\n \n \n\n \n\n
\n \n \n\n \n \n\n \n
\n
\n\n \n `;\n const fragment = document.createDocumentFragment();\n const div = document.createElement(\"div\");\n div.setAttribute(\"id\", id);\n div.setAttribute(\"data-section\", \"textbox\");\n div.className = \"bg-light border shadow-sm mb-3 rounded\";\n div.innerHTML = template;\n div.querySelectorAll(\"select\").forEach((el)=>el.value = data[el.dataset.input]);\n div.querySelectorAll('input[type=\"checkbox\"]').forEach((el)=>el.checked = data[el.dataset.input]);\n const textboxEl = fragment.appendChild(div);\n if (autoFocus) setTimeout(()=>textboxEl.querySelector('[data-input=\"text\"]').focus(), 0);\n return textboxEl;\n }\n}\n\n\n\n\nclass $9b58d7721ff4a93e$export$8d01c972ee8b14a9 {\n #canvas = null;\n #ctx = null;\n constructor(canvasEl){\n this.#canvas = canvasEl;\n this.#ctx = this.#canvas.getContext(\"2d\");\n }\n get width() {\n return this.#canvas.width;\n }\n set width(value) {\n this.#canvas.width = value;\n }\n get height() {\n return this.#canvas.height;\n }\n set height(value) {\n this.#canvas.height = value;\n }\n getDimensions() {\n return {\n width: this.width,\n height: this.height\n };\n }\n setDimensions({ width: width, height: height }) {\n this.width = width;\n this.height = height;\n return this;\n }\n toDataURL() {\n return this.#canvas.toDataURL();\n }\n draw(image, textboxes = new Map()) {\n if (image == null) return;\n const canvas = this.#canvas;\n const ctx = this.#ctx;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n if ((0, $c38b15b964e67d8b$export$de75f46579dcf24)(image)) {\n ctx.fillStyle = image;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n } else ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n let multiplier = 0;\n textboxes.forEach((textbox)=>{\n const { data: data } = textbox;\n multiplier += 1;\n ctx.save();\n ctx.font = `${data.fontWeight} ${data.fontSize * canvas.width / 1000}px ${data.font}`;\n ctx.fillStyle = data.fillColor;\n ctx.textAlign = data.textAlign;\n ctx.strokeStyle = data.strokeColor;\n const lineHeight = ctx.measureText(\"M\").width + data.fontSize / 2;\n const xPos = canvas.width / 2;\n const shadowBlur = data.shadowBlur;\n const text = data.allCaps === true ? data.text.toUpperCase() : data.text;\n const textLines = text.split(\"\\n\");\n if (shadowBlur !== 0) {\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n ctx.shadowBlur = Math.min(shadowBlur, (0, $65136e012e05e2d7$export$62045be72fe457b4));\n ctx.shadowColor = data.strokeColor;\n }\n ctx.translate(xPos + data.offsetX, lineHeight * multiplier + data.offsetY);\n ctx.rotate(Math.min(data.rotate, (0, $65136e012e05e2d7$export$d3f4819a57998cf7)) * Math.PI / 180);\n // First draw each line with shadow.\n textLines.forEach((text, index)=>ctx.fillText(text, 0, index * lineHeight));\n // Since shadows of multiline text may be drawn over letters of neighbour lines\n // (when shadow blur is big enough), re-draw text without shadows.\n if (shadowBlur !== 0) {\n ctx.shadowBlur = 0;\n textLines.forEach((text, index)=>ctx.fillText(text, 0, index * lineHeight));\n }\n if (data.strokeWidth > 0) {\n ctx.lineWidth = Math.min(data.strokeWidth, (0, $65136e012e05e2d7$export$8f089f0a062560ff));\n textLines.forEach((text, index)=>ctx.strokeText(text, 0, index * lineHeight));\n }\n ctx.restore();\n });\n return this;\n }\n clear() {\n this.#ctx.clearRect(0, 0, this.#canvas.width, this.#canvas.height);\n return this;\n }\n show() {\n this.#canvas.hidden = false;\n return this;\n }\n hide() {\n this.#canvas.hidden = true;\n return this;\n }\n static createInstance(canvasEl) {\n return new $9b58d7721ff4a93e$export$8d01c972ee8b14a9(canvasEl);\n }\n}\n\n\nconst $85a5f86b715fe7db$var$canvas = (0, $9b58d7721ff4a93e$export$8d01c972ee8b14a9).createInstance(document.getElementById(\"canvas\"));\nconst $85a5f86b715fe7db$var$videoModal = document.getElementById(\"videoModal\");\nconst $85a5f86b715fe7db$var$downloadModal = document.getElementById(\"downloadModal\");\nconst $85a5f86b715fe7db$var$dropzoneEl = document.querySelector(\"files-dropzone\");\nconst $85a5f86b715fe7db$var$instructionsEl = document.getElementById(\"instructions\");\nconst $85a5f86b715fe7db$var$imageUploadMethodSelect = document.getElementById(\"imageUploadMethodSelect\");\nconst $85a5f86b715fe7db$var$fileSelectBtn = document.getElementById(\"fileSelectBtn\");\nconst $85a5f86b715fe7db$var$imageUrlForm = document.getElementById(\"imageUrlForm\");\nconst $85a5f86b715fe7db$var$addTextboxBtn = document.getElementById(\"addTextboxBtn\");\nconst $85a5f86b715fe7db$var$textboxesContainer = document.getElementById(\"textboxesContainer\");\nconst $85a5f86b715fe7db$var$generateMemeBtn = document.getElementById(\"generateMemeBtn\");\nconst $85a5f86b715fe7db$var$openVideoModalBtn = document.getElementById(\"openVideoModalBtn\");\nconst $85a5f86b715fe7db$var$downloadMemeBtn = document.getElementById(\"downloadMemeBtn\");\nconst $85a5f86b715fe7db$var$downloadMemePreview = document.getElementById(\"downloadMemePreview\");\nconst $85a5f86b715fe7db$var$webShareComponent = document.querySelector(\"web-share\");\nconst $85a5f86b715fe7db$var$galleryEl = document.getElementById(\"gallery\");\nconst $85a5f86b715fe7db$var$gallerySearchEl = document.getElementById(\"gallerySearch\");\nconst $85a5f86b715fe7db$var$galleryNoResultsEl = $85a5f86b715fe7db$var$galleryEl.querySelector(\".gallery__no-results\");\nconst $85a5f86b715fe7db$var$solidColorForm = document.getElementById(\"solidColorForm\");\nconst $85a5f86b715fe7db$var$uploadMethodEls = document.querySelectorAll(\".upload-method\");\nconst $85a5f86b715fe7db$var$removeConfirmationModal = document.getElementById(\"removeConfirmationModal\");\nconst $85a5f86b715fe7db$var$removeTextForm = document.getElementById(\"removeTextForm\");\nconst $85a5f86b715fe7db$var$maxImageDimensionsForm = document.getElementById(\"maxImageDimensionsForm\");\nconst $85a5f86b715fe7db$var$maxImageDimensionsSelect = $85a5f86b715fe7db$var$maxImageDimensionsForm[\"maxImageDimensions\"];\nconst $85a5f86b715fe7db$var$clearCanvasBtn = document.getElementById(\"clearCanvasBtn\");\nconst $85a5f86b715fe7db$var$maxImageDimensionsFromStorage = (0, $9e093dbdf49c6d51$export$ddcffe0146c8f882).get(\"maxImageDimensions\");\nlet $85a5f86b715fe7db$var$shouldFocusOnTextboxCreate = false;\nlet $85a5f86b715fe7db$var$selectedImage = null;\nlet $85a5f86b715fe7db$var$reqAnimFrame = null;\nconst $85a5f86b715fe7db$var$renderAcceptedImageFormats = (acceptedMimeTypes, rootEl)=>{\n if (!rootEl) return;\n const extensions = acceptedMimeTypes.map((mimeType)=>mimeType.split(\"/\")[1]);\n const str = `Supported image formats: ${extensions.join(\", \")}`;\n const div = document.createElement(\"div\");\n const small = document.createElement(\"small\");\n small.textContent = str;\n div.appendChild(small);\n rootEl.appendChild(small);\n};\nconst $85a5f86b715fe7db$var$generateMeme = async ()=>{\n const dataUrl = $85a5f86b715fe7db$var$canvas.toDataURL(\"image/png\");\n const filename = `${(0, $17004b28c97c1306$export$e2a22331486dcca0)(\"meme\")}.png`;\n // Prepare download link\n const downloadLink = dataUrl.replace(\"image/png\", \"image/octet-stream\");\n $85a5f86b715fe7db$var$downloadMemeBtn.download = filename;\n $85a5f86b715fe7db$var$downloadMemeBtn.href = downloadLink;\n $85a5f86b715fe7db$var$downloadMemePreview.width = $85a5f86b715fe7db$var$canvas.getDimensions().width;\n $85a5f86b715fe7db$var$downloadMemePreview.height = $85a5f86b715fe7db$var$canvas.getDimensions().height;\n $85a5f86b715fe7db$var$downloadMemePreview.src = downloadLink;\n // Prepare for sharing file\n if ((0, $7a2aca835bb05064$export$c37129e465f64ef0)()) try {\n const file = await (0, $2669cb7c28251d2a$export$6539e087749cf9d3)({\n url: dataUrl,\n filename: filename,\n mimeType: \"image/png\"\n }).catch((err)=>(0, $3969451ff60cb8d5$export$af04143326425dbd)(err.message, \"danger\"));\n if (file && (0, $7a2aca835bb05064$export$c37129e465f64ef0)({\n files: [\n file\n ]\n })) {\n $85a5f86b715fe7db$var$webShareComponent.shareFiles = [\n file\n ];\n $85a5f86b715fe7db$var$webShareComponent.hidden = false;\n }\n } catch (error) {\n console.error(error);\n }\n window.requestAnimationFrame(()=>{\n $85a5f86b715fe7db$var$downloadModal.open = true;\n });\n};\nconst $85a5f86b715fe7db$var$setImageMaxDimensions = (image)=>{\n const maxImageDimensionsSelect = $85a5f86b715fe7db$var$maxImageDimensionsForm[\"maxImageDimensions\"];\n const [maxWidthValue, maxHeightValue] = maxImageDimensionsSelect.value.split(\"x\");\n const MAX_WIDTH = Number(maxWidthValue) || 800;\n const MAX_HEIGHT = Number(maxHeightValue) || 600;\n let width = image.width;\n let height = image.height;\n if (width > height) {\n if (width > MAX_WIDTH) {\n height *= MAX_WIDTH / width;\n width = MAX_WIDTH;\n }\n } else if (height > MAX_HEIGHT) {\n width *= MAX_HEIGHT / height;\n height = MAX_HEIGHT;\n }\n $85a5f86b715fe7db$var$canvas.setDimensions({\n width: width,\n height: height\n });\n};\nconst $85a5f86b715fe7db$var$afterImageSelect = ()=>{\n $85a5f86b715fe7db$var$canvas.draw($85a5f86b715fe7db$var$selectedImage, (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).getAll()).show();\n $85a5f86b715fe7db$var$dropzoneEl.classList.add(\"dropzone--accepted\");\n $85a5f86b715fe7db$var$dropzoneEl.disabled = true;\n $85a5f86b715fe7db$var$generateMemeBtn.disabled = false;\n $85a5f86b715fe7db$var$instructionsEl.hidden = true;\n $85a5f86b715fe7db$var$clearCanvasBtn.hidden = false;\n};\nconst $85a5f86b715fe7db$var$handleImageLoad = (evt)=>{\n $85a5f86b715fe7db$var$selectedImage = evt.target;\n $85a5f86b715fe7db$var$setImageMaxDimensions($85a5f86b715fe7db$var$selectedImage);\n $85a5f86b715fe7db$var$afterImageSelect();\n};\nconst $85a5f86b715fe7db$var$handleSolidColorFormInput = (evt)=>{\n const DEFAULT_WIDTH = 800;\n const DEFAULT_HEIGHT = 600;\n if (evt.target === $85a5f86b715fe7db$var$solidColorForm[\"canvasColor\"]) $85a5f86b715fe7db$var$selectedImage = evt.target.value;\n if ((0, $c38b15b964e67d8b$export$de75f46579dcf24)($85a5f86b715fe7db$var$selectedImage)) {\n $85a5f86b715fe7db$var$canvas.setDimensions({\n width: Number($85a5f86b715fe7db$var$solidColorForm[\"canvasWidth\"].value) || DEFAULT_WIDTH,\n height: Number($85a5f86b715fe7db$var$solidColorForm[\"canvasHeight\"].value) || DEFAULT_HEIGHT\n });\n $85a5f86b715fe7db$var$afterImageSelect();\n }\n};\nconst $85a5f86b715fe7db$var$handleFileSelect = (file)=>{\n if (!file) return;\n const image = new Image();\n const reader = new FileReader();\n reader.addEventListener(\"load\", function(evt) {\n const data = evt.target.result;\n image.addEventListener(\"load\", $85a5f86b715fe7db$var$handleImageLoad);\n image.src = data;\n });\n reader.readAsDataURL(file);\n};\nconst $85a5f86b715fe7db$var$handleOpenVideoModalButtonClick = ()=>{\n $85a5f86b715fe7db$var$videoModal.open = true;\n};\nconst $85a5f86b715fe7db$var$handleTextPropChange = (element, textboxId, prop)=>{\n const textboxData = (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).getById(textboxId).getData();\n switch(element.type){\n case \"checkbox\":\n textboxData[prop] = element.checked;\n break;\n case \"number\":\n textboxData[prop] = Number(element.value);\n break;\n default:\n textboxData[prop] = element.value;\n }\n $85a5f86b715fe7db$var$canvas.draw($85a5f86b715fe7db$var$selectedImage, (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).getAll());\n};\nconst $85a5f86b715fe7db$var$handleAddTextboxBtnClick = ()=>(0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).create();\nconst $85a5f86b715fe7db$var$handleImageUploadFromURL = async (evt)=>{\n evt.preventDefault();\n const form = evt.target;\n const submitButton = form.querySelector('button[type=\"submit\"]');\n const imageUrl = form[\"imageUrl\"].value;\n if (!imageUrl.trim()) return;\n submitButton.disabled = true;\n submitButton.querySelector(\".spinner\").hidden = false;\n submitButton.querySelector(\".label\").hidden = true;\n try {\n const file = await (0, $2669cb7c28251d2a$export$6539e087749cf9d3)({\n url: imageUrl\n }).catch((err)=>(0, $3969451ff60cb8d5$export$af04143326425dbd)(err.message, \"danger\"));\n if (file) $85a5f86b715fe7db$var$handleFileSelect(file);\n } catch {\n (0, $3969451ff60cb8d5$export$af04143326425dbd)(`Failed to load image from \"${imageUrl}\".`, \"danger\");\n } finally{\n submitButton.disabled = false;\n submitButton.querySelector(\".spinner\").hidden = true;\n submitButton.querySelector(\".label\").hidden = false;\n }\n};\nconst $85a5f86b715fe7db$var$moveTextUsingArrowbuttons = (textboxId, direction)=>()=>{\n const textboxEl = document.getElementById(textboxId);\n const offsetYInput = textboxEl.querySelector('[data-input=\"offsetY\"]');\n const offsetXInput = textboxEl.querySelector('[data-input=\"offsetX\"]');\n const textbox = (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).getById(textboxId);\n if (!textbox) return;\n const textboxData = textbox.getData();\n direction = direction.toLowerCase();\n switch(direction){\n case \"up\":\n textboxData.offsetY -= 1;\n offsetYInput.value = textboxData.offsetY;\n break;\n case \"down\":\n textboxData.offsetY += 1;\n offsetYInput.value = textboxData.offsetY;\n break;\n case \"left\":\n textboxData.offsetX -= 1;\n offsetXInput.value = textboxData.offsetX;\n break;\n case \"right\":\n textboxData.offsetX += 1;\n offsetXInput.value = textboxData.offsetX;\n break;\n }\n $85a5f86b715fe7db$var$canvas.draw($85a5f86b715fe7db$var$selectedImage, (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).getAll());\n $85a5f86b715fe7db$var$reqAnimFrame = requestAnimationFrame($85a5f86b715fe7db$var$moveTextUsingArrowbuttons(textboxId, direction));\n };\nconst $85a5f86b715fe7db$var$handleUploadMethodChange = (evt)=>{\n $85a5f86b715fe7db$var$uploadMethodEls.forEach((el)=>el.hidden = el.id !== evt.target.value);\n $85a5f86b715fe7db$var$maxImageDimensionsForm.hidden = evt.target.value === \"solidColorForm\";\n};\nconst $85a5f86b715fe7db$var$handleFileSelectClick = ()=>{\n if (typeof $85a5f86b715fe7db$var$dropzoneEl.openFileDialog === \"function\") $85a5f86b715fe7db$var$dropzoneEl.openFileDialog();\n};\nconst $85a5f86b715fe7db$var$handleDropFilesAccepted = (evt)=>{\n const [file] = evt.detail.acceptedFiles;\n if (file) $85a5f86b715fe7db$var$handleFileSelect(file);\n};\nconst $85a5f86b715fe7db$var$handleTextboxesContainerInput = (evt)=>{\n const element = evt.target;\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n let prop;\n if (element.matches('[data-input=\"text\"]')) prop = \"text\";\n else if (element.matches('[data-input=\"fillColor\"]')) prop = \"fillColor\";\n else if (element.matches('[data-input=\"strokeColor\"]')) prop = \"strokeColor\";\n else if (element.matches('[data-input=\"font\"]')) prop = \"font\";\n else if (element.matches('[data-input=\"fontSize\"]')) prop = \"fontSize\";\n else if (element.matches('[data-input=\"fontWeight\"]')) prop = \"fontWeight\";\n else if (element.matches('[data-input=\"textAlign\"]')) prop = \"textAlign\";\n else if (element.matches('[data-input=\"shadowBlur\"]')) prop = \"shadowBlur\";\n else if (element.matches('[data-input=\"offsetY\"]')) prop = \"offsetY\";\n else if (element.matches('[data-input=\"offsetX\"]')) prop = \"offsetX\";\n else if (element.matches('[data-input=\"rotate\"]')) prop = \"rotate\";\n else if (element.matches('[data-input=\"strokeWidth\"]')) prop = \"strokeWidth\";\n if (prop) $85a5f86b715fe7db$var$handleTextPropChange(element, textboxId, prop);\n};\nconst $85a5f86b715fe7db$var$handleTextboxesContainerChange = (evt)=>{\n const element = evt.target;\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n let prop;\n if (element.matches('[data-input=\"allCaps\"]')) prop = \"allCaps\";\n if (prop) $85a5f86b715fe7db$var$handleTextPropChange(element, textboxId, prop);\n};\nconst $85a5f86b715fe7db$var$handleTextboxesContainerClick = (evt)=>{\n const element = evt.target;\n if (element.matches('[data-button=\"settings\"]')) {\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n const textboxSettingsEl = textboxEl?.querySelector('[data-section=\"settings\"]');\n if (textboxSettingsEl) textboxSettingsEl.hidden = !textboxSettingsEl.hidden;\n }\n if (element.matches('[data-button=\"duplicate-text-box\"')) {\n const currentTextboxEl = element.closest('[data-section=\"textbox\"]');\n const currentTextboxData = (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).getById(currentTextboxEl.id);\n (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).create({\n ...currentTextboxData.data\n });\n }\n if (element.matches('[data-button=\"delete-text-box\"]')) {\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n const textboxToDelete = (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).getById(textboxId);\n if (textboxToDelete && textboxToDelete.data.text.trim()) {\n const textboxIdInput = $85a5f86b715fe7db$var$removeTextForm[\"textbox-id\"];\n if (textboxIdInput) {\n textboxIdInput.value = textboxId;\n $85a5f86b715fe7db$var$removeConfirmationModal.open = true;\n }\n } else (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).remove(textboxId);\n }\n};\nconst $85a5f86b715fe7db$var$handleTextRemoveFormSubmit = (evt)=>{\n evt.preventDefault();\n const textboxId = evt.target[\"textbox-id\"].value;\n if (textboxId) {\n (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).remove(textboxId);\n $85a5f86b715fe7db$var$removeConfirmationModal.open = false;\n }\n};\nconst $85a5f86b715fe7db$var$handleTextboxesContainerPointerdown = (evt)=>{\n const element = evt.target;\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n if (!textboxEl) return;\n if (element.matches('[data-action=\"move-text\"]')) $85a5f86b715fe7db$var$reqAnimFrame = requestAnimationFrame($85a5f86b715fe7db$var$moveTextUsingArrowbuttons(textboxEl.id, element.getAttribute(\"aria-label\")));\n};\nconst $85a5f86b715fe7db$var$handleTextboxesContainerPointerup = (evt)=>{\n const element = evt.target;\n if (element.matches('[data-action=\"move-text\"]')) {\n cancelAnimationFrame && cancelAnimationFrame($85a5f86b715fe7db$var$reqAnimFrame);\n $85a5f86b715fe7db$var$reqAnimFrame = null;\n }\n};\nconst $85a5f86b715fe7db$var$handleTextboxesContainerPointerout = (evt)=>{\n const element = evt.target;\n if (element.matches('[data-action=\"move-text\"]')) {\n cancelAnimationFrame && cancelAnimationFrame($85a5f86b715fe7db$var$reqAnimFrame);\n $85a5f86b715fe7db$var$reqAnimFrame = null;\n }\n};\nconst $85a5f86b715fe7db$var$handleTextboxesContainerKeyDown = (evt)=>{\n const element = evt.target;\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n if (element.matches('[data-action=\"move-text\"]')) {\n if (evt.key === \" \" || evt.key === \"Enter\") {\n $85a5f86b715fe7db$var$reqAnimFrame && cancelAnimationFrame($85a5f86b715fe7db$var$reqAnimFrame);\n $85a5f86b715fe7db$var$reqAnimFrame = requestAnimationFrame($85a5f86b715fe7db$var$moveTextUsingArrowbuttons(textboxEl.id, element.getAttribute(\"aria-label\")));\n }\n }\n};\nconst $85a5f86b715fe7db$var$handleTextboxesContainerKeyUp = (evt)=>{\n const element = evt.target;\n if (element.matches('[data-action=\"move-text\"]')) {\n if (evt.key === \" \" || evt.key === \"Enter\") {\n $85a5f86b715fe7db$var$reqAnimFrame && cancelAnimationFrame($85a5f86b715fe7db$var$reqAnimFrame);\n $85a5f86b715fe7db$var$reqAnimFrame = null;\n }\n }\n};\nconst $85a5f86b715fe7db$var$handleGalleryClick = async (evt)=>{\n const button = evt.target.closest(\"button\");\n if (!button) return;\n const img = button.querySelector(\"img\");\n try {\n const file = await (0, $2669cb7c28251d2a$export$6539e087749cf9d3)({\n url: img.src\n }).catch((err)=>(0, $3969451ff60cb8d5$export$af04143326425dbd)(err.message, \"danger\"));\n if (file) $85a5f86b715fe7db$var$handleFileSelect(file);\n } catch {\n (0, $3969451ff60cb8d5$export$af04143326425dbd)(`Failed to load image: \"${img.alt}\".`, \"danger\");\n }\n};\nconst $85a5f86b715fe7db$var$handleGallerySearchInput = (evt)=>{\n const query = evt.target.value.toLowerCase().trim();\n const galleryItems = $85a5f86b715fe7db$var$galleryEl.querySelectorAll(\"button\");\n galleryItems.forEach((item)=>{\n const alt = (item.querySelector(\"img\").getAttribute(\"alt\") || \"\").toLowerCase();\n item.hidden = !alt.includes(query);\n });\n $85a5f86b715fe7db$var$galleryNoResultsEl.hidden = !!$85a5f86b715fe7db$var$galleryEl.querySelector(\"button:not([hidden])\");\n};\nconst $85a5f86b715fe7db$var$handleWebShareError = ()=>{\n $85a5f86b715fe7db$var$downloadModal.open = false;\n (0, $3969451ff60cb8d5$export$af04143326425dbd)(\"There was an error while trying to share your meme.\", \"danger\");\n};\nconst $85a5f86b715fe7db$var$handleCapturePhotoError = (evt)=>{\n const error = evt.detail.error;\n let errorMessage = \"An error occurred while trying to capture photo.\";\n if (error instanceof Error && (error.name === \"NotAllowedError\" || error.name === \"NotFoundError\")) errorMessage += \" Make sure you have a camera connected and you have granted the appropriate permissions.\";\n (0, $3969451ff60cb8d5$export$af04143326425dbd)(errorMessage, \"danger\");\n $85a5f86b715fe7db$var$videoModal.open = false;\n console.error(error);\n};\nconst $85a5f86b715fe7db$var$handleCapturePhotoSuccess = (evt)=>{\n $85a5f86b715fe7db$var$videoModal.open = false;\n const image = new Image();\n image.addEventListener(\"load\", $85a5f86b715fe7db$var$handleImageLoad);\n image.src = evt.detail.dataURI;\n};\nconst $85a5f86b715fe7db$var$handleModalOpen = (evt)=>{\n if (evt.target.id === \"videoModal\") {\n const capturePhotoComponent = $85a5f86b715fe7db$var$videoModal.querySelector(\"capture-photo\");\n if (capturePhotoComponent && typeof capturePhotoComponent.startVideoStream === \"function\") capturePhotoComponent.startVideoStream();\n }\n};\nconst $85a5f86b715fe7db$var$handleModalClose = (evt)=>{\n if (evt.target.id === \"videoModal\") {\n const capturePhotoComponent = $85a5f86b715fe7db$var$videoModal.querySelector(\"capture-photo\");\n if (capturePhotoComponent && typeof capturePhotoComponent.stopVideoStream === \"function\") capturePhotoComponent.stopVideoStream();\n }\n if (evt.target.id === \"removeConfirmationModal\") $85a5f86b715fe7db$var$removeTextForm.reset();\n};\nconst $85a5f86b715fe7db$var$handleEmojiPickerSelection = (evt)=>{\n const textboxEl = evt.target.closest('[data-section=\"textbox\"]');\n if (textboxEl) {\n const input = textboxEl.querySelector('[data-input=\"text\"]');\n const emoji = evt.detail.unicode;\n if (input) (0, $bf4f0cf05f6fd378$export$2e2bcd8739ae039)(input, emoji);\n }\n};\nconst $85a5f86b715fe7db$var$handleMaxImageDimensionsFormChange = (evt)=>{\n if (evt.target.matches('[name=\"maxImageDimensions\"]')) (0, $9e093dbdf49c6d51$export$ddcffe0146c8f882).set(\"maxImageDimensions\", evt.target.value);\n if (!$85a5f86b715fe7db$var$selectedImage || (0, $c38b15b964e67d8b$export$de75f46579dcf24)($85a5f86b715fe7db$var$selectedImage)) return;\n $85a5f86b715fe7db$var$setImageMaxDimensions($85a5f86b715fe7db$var$selectedImage);\n $85a5f86b715fe7db$var$canvas.draw($85a5f86b715fe7db$var$selectedImage, (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).getAll());\n};\nconst $85a5f86b715fe7db$var$handleTextboxCreate = (evt)=>{\n const textbox = evt.detail.textbox;\n const textboxEl = (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).createElement(textbox, $85a5f86b715fe7db$var$shouldFocusOnTextboxCreate);\n $85a5f86b715fe7db$var$shouldFocusOnTextboxCreate = true;\n $85a5f86b715fe7db$var$textboxesContainer.appendChild(textboxEl);\n if (textbox.getData().text) $85a5f86b715fe7db$var$canvas.draw($85a5f86b715fe7db$var$selectedImage, (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).getAll());\n};\nconst $85a5f86b715fe7db$var$handleTextboxDelete = (evt)=>{\n const textboxEl = document.getElementById(evt.detail.id);\n textboxEl && textboxEl.remove();\n $85a5f86b715fe7db$var$textboxesContainer.querySelectorAll('[data-section=\"textbox\"]').forEach((el, idx)=>{\n el.querySelector('[data-input=\"text\"]').setAttribute(\"placeholder\", `Text #${idx + 1}`);\n });\n $85a5f86b715fe7db$var$canvas.draw($85a5f86b715fe7db$var$selectedImage, (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).getAll());\n};\nconst $85a5f86b715fe7db$var$handleClearCanvas = (evt)=>{\n if (!$85a5f86b715fe7db$var$selectedImage) return;\n evt.stopPropagation();\n $85a5f86b715fe7db$var$selectedImage = null;\n $85a5f86b715fe7db$var$dropzoneEl.classList.remove(\"dropzone--accepted\");\n $85a5f86b715fe7db$var$generateMemeBtn.disabled = true;\n $85a5f86b715fe7db$var$instructionsEl.hidden = false;\n $85a5f86b715fe7db$var$clearCanvasBtn.hidden = true;\n $85a5f86b715fe7db$var$dropzoneEl.disabled = false;\n $85a5f86b715fe7db$var$canvas.clear().hide();\n};\n$85a5f86b715fe7db$var$fileSelectBtn.addEventListener(\"click\", $85a5f86b715fe7db$var$handleFileSelectClick);\n$85a5f86b715fe7db$var$openVideoModalBtn.addEventListener(\"click\", $85a5f86b715fe7db$var$handleOpenVideoModalButtonClick);\n$85a5f86b715fe7db$var$addTextboxBtn.addEventListener(\"click\", $85a5f86b715fe7db$var$handleAddTextboxBtnClick);\n$85a5f86b715fe7db$var$generateMemeBtn.addEventListener(\"click\", $85a5f86b715fe7db$var$generateMeme);\n$85a5f86b715fe7db$var$downloadMemeBtn.addEventListener(\"click\", ()=>$85a5f86b715fe7db$var$downloadModal.open = false);\n$85a5f86b715fe7db$var$imageUrlForm.addEventListener(\"submit\", $85a5f86b715fe7db$var$handleImageUploadFromURL);\n$85a5f86b715fe7db$var$dropzoneEl.addEventListener(\"files-dropzone-drop-accepted\", $85a5f86b715fe7db$var$handleDropFilesAccepted);\n$85a5f86b715fe7db$var$textboxesContainer.addEventListener(\"input\", $85a5f86b715fe7db$var$handleTextboxesContainerInput);\n$85a5f86b715fe7db$var$textboxesContainer.addEventListener(\"change\", $85a5f86b715fe7db$var$handleTextboxesContainerChange);\n$85a5f86b715fe7db$var$textboxesContainer.addEventListener(\"click\", $85a5f86b715fe7db$var$handleTextboxesContainerClick);\n$85a5f86b715fe7db$var$textboxesContainer.addEventListener(\"pointerdown\", $85a5f86b715fe7db$var$handleTextboxesContainerPointerdown);\n$85a5f86b715fe7db$var$textboxesContainer.addEventListener(\"pointerup\", $85a5f86b715fe7db$var$handleTextboxesContainerPointerup);\n$85a5f86b715fe7db$var$textboxesContainer.addEventListener(\"pointerout\", $85a5f86b715fe7db$var$handleTextboxesContainerPointerout);\n$85a5f86b715fe7db$var$textboxesContainer.addEventListener(\"keydown\", $85a5f86b715fe7db$var$handleTextboxesContainerKeyDown);\n$85a5f86b715fe7db$var$textboxesContainer.addEventListener(\"keyup\", $85a5f86b715fe7db$var$handleTextboxesContainerKeyUp);\n$85a5f86b715fe7db$var$imageUploadMethodSelect.addEventListener(\"change\", $85a5f86b715fe7db$var$handleUploadMethodChange);\n$85a5f86b715fe7db$var$galleryEl.addEventListener(\"click\", $85a5f86b715fe7db$var$handleGalleryClick);\n$85a5f86b715fe7db$var$gallerySearchEl.addEventListener(\"input\", $85a5f86b715fe7db$var$handleGallerySearchInput);\n$85a5f86b715fe7db$var$solidColorForm.addEventListener(\"input\", $85a5f86b715fe7db$var$handleSolidColorFormInput);\ndocument.addEventListener(\"web-share:error\", $85a5f86b715fe7db$var$handleWebShareError);\ndocument.addEventListener(\"capture-photo:error\", $85a5f86b715fe7db$var$handleCapturePhotoError);\ndocument.addEventListener(\"capture-photo:success\", $85a5f86b715fe7db$var$handleCapturePhotoSuccess);\ndocument.addEventListener(\"me-open\", $85a5f86b715fe7db$var$handleModalOpen);\ndocument.addEventListener(\"me-close\", $85a5f86b715fe7db$var$handleModalClose);\ndocument.addEventListener(\"emoji-click\", $85a5f86b715fe7db$var$handleEmojiPickerSelection);\ndocument.addEventListener(\"textbox-create\", $85a5f86b715fe7db$var$handleTextboxCreate);\ndocument.addEventListener(\"textbox-remove\", $85a5f86b715fe7db$var$handleTextboxDelete);\n$85a5f86b715fe7db$var$removeTextForm.addEventListener(\"submit\", $85a5f86b715fe7db$var$handleTextRemoveFormSubmit);\n$85a5f86b715fe7db$var$maxImageDimensionsForm.addEventListener(\"change\", $85a5f86b715fe7db$var$handleMaxImageDimensionsFormChange);\n$85a5f86b715fe7db$var$clearCanvasBtn.addEventListener(\"click\", $85a5f86b715fe7db$var$handleClearCanvas);\n$85a5f86b715fe7db$var$galleryEl.querySelectorAll(\"button > img\")?.forEach((image)=>{\n image.setAttribute(\"title\", image.getAttribute(\"alt\"));\n});\n(0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).create();\n$85a5f86b715fe7db$var$dropzoneEl.accept = (0, $65136e012e05e2d7$export$63e7bed68b07a85c);\n$85a5f86b715fe7db$var$renderAcceptedImageFormats((0, $65136e012e05e2d7$export$63e7bed68b07a85c), $85a5f86b715fe7db$var$instructionsEl);\n(0, $56b863c8b6be7003$export$6874249d87f2602a).forEach(({ name: name, path: path, style: style, weight: weight })=>{\n (0, $56b863c8b6be7003$export$59eceaef0c7797b2)(name, path, {\n style: style,\n weight: weight\n });\n});\nif ($85a5f86b715fe7db$var$maxImageDimensionsFromStorage) $85a5f86b715fe7db$var$maxImageDimensionsSelect.value = $85a5f86b715fe7db$var$maxImageDimensionsFromStorage;\n$85a5f86b715fe7db$var$maxImageDimensionsSelect.disabled = false;\n\n\n//# sourceMappingURL=index.09064714.js.map\n","import 'emoji-picker-element';\nimport insertTextAtCursor from 'insert-text-at-cursor';\nimport { isWebShareSupported } from '@georapbox/web-share-element/dist/is-web-share-supported.js';\nimport '@georapbox/web-share-element/dist/web-share-defined.js';\nimport '@georapbox/capture-photo-element/dist/capture-photo-defined.js';\nimport '@georapbox/modal-element/dist/modal-element-defined.js';\nimport '@georapbox/files-dropzone-element/dist/files-dropzone-defined.js';\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport '../css/main.css';\nimport { ACCEPTED_MIME_TYPES } from './constants.js';\nimport { uid } from './utils/uid.js';\nimport { fileFromUrl } from './utils/file-from-url.js';\nimport { storage } from './utils/storage.js';\nimport { isSolidColorSelected } from './utils/is-solid-color-selected.js';\nimport { customFonts, loadCustomFont } from './custom-fonts.js';\nimport { toastAlert } from './toast-alert.js';\nimport { Textbox } from './textbox.js';\nimport { Canvas } from './canvas.js';\n\nconst canvas = Canvas.createInstance(document.getElementById('canvas'));\nconst videoModal = document.getElementById('videoModal');\nconst downloadModal = document.getElementById('downloadModal');\nconst dropzoneEl = document.querySelector('files-dropzone');\nconst instructionsEl = document.getElementById('instructions');\nconst imageUploadMethodSelect = document.getElementById('imageUploadMethodSelect');\nconst fileSelectBtn = document.getElementById('fileSelectBtn');\nconst imageUrlForm = document.getElementById('imageUrlForm');\nconst addTextboxBtn = document.getElementById('addTextboxBtn');\nconst textboxesContainer = document.getElementById('textboxesContainer');\nconst generateMemeBtn = document.getElementById('generateMemeBtn');\nconst openVideoModalBtn = document.getElementById('openVideoModalBtn');\nconst downloadMemeBtn = document.getElementById('downloadMemeBtn');\nconst downloadMemePreview = document.getElementById('downloadMemePreview');\nconst webShareComponent = document.querySelector('web-share');\nconst galleryEl = document.getElementById('gallery');\nconst gallerySearchEl = document.getElementById('gallerySearch');\nconst galleryNoResultsEl = galleryEl.querySelector('.gallery__no-results');\nconst solidColorForm = document.getElementById('solidColorForm');\nconst uploadMethodEls = document.querySelectorAll('.upload-method');\nconst removeConfirmationModal = document.getElementById('removeConfirmationModal');\nconst removeTextForm = document.getElementById('removeTextForm');\nconst maxImageDimensionsForm = document.getElementById('maxImageDimensionsForm');\nconst maxImageDimensionsSelect = maxImageDimensionsForm['maxImageDimensions'];\nconst clearCanvasBtn = document.getElementById('clearCanvasBtn');\nconst maxImageDimensionsFromStorage = storage.get('maxImageDimensions');\nlet shouldFocusOnTextboxCreate = false;\nlet selectedImage = null;\nlet reqAnimFrame = null;\n\nconst renderAcceptedImageFormats = (acceptedMimeTypes, rootEl) => {\n if (!rootEl) {\n return;\n }\n\n const extensions = acceptedMimeTypes.map(mimeType => mimeType.split('/')[1]);\n const str = `Supported image formats: ${extensions.join(', ')}`;\n const div = document.createElement('div');\n const small = document.createElement('small');\n\n small.textContent = str;\n div.appendChild(small);\n rootEl.appendChild(small);\n};\n\nconst generateMeme = async () => {\n const dataUrl = canvas.toDataURL('image/png');\n const filename = `${uid('meme')}.png`;\n\n // Prepare download link\n const downloadLink = dataUrl.replace('image/png', 'image/octet-stream');\n downloadMemeBtn.download = filename;\n downloadMemeBtn.href = downloadLink;\n downloadMemePreview.width = canvas.getDimensions().width;\n downloadMemePreview.height = canvas.getDimensions().height;\n downloadMemePreview.src = downloadLink;\n\n // Prepare for sharing file\n if (isWebShareSupported()) {\n try {\n const file = await fileFromUrl({\n url: dataUrl,\n filename,\n mimeType: 'image/png'\n }).catch(err => toastAlert(err.message, 'danger'));\n\n if (file && isWebShareSupported({ files: [file] })) {\n webShareComponent.shareFiles = [file];\n webShareComponent.hidden = false;\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n window.requestAnimationFrame(() => {\n downloadModal.open = true;\n });\n};\n\nconst setImageMaxDimensions = image => {\n const maxImageDimensionsSelect = maxImageDimensionsForm['maxImageDimensions'];\n const [maxWidthValue, maxHeightValue] = maxImageDimensionsSelect.value.split('x');\n const MAX_WIDTH = Number(maxWidthValue) || 800;\n const MAX_HEIGHT = Number(maxHeightValue) || 600;\n let width = image.width;\n let height = image.height;\n\n if (width > height) {\n if (width > MAX_WIDTH) {\n height *= MAX_WIDTH / width;\n width = MAX_WIDTH;\n }\n } else {\n if (height > MAX_HEIGHT) {\n width *= MAX_HEIGHT / height;\n height = MAX_HEIGHT;\n }\n }\n\n canvas.setDimensions({ width, height });\n};\n\nconst afterImageSelect = () => {\n canvas.draw(selectedImage, Textbox.getAll()).show();\n dropzoneEl.classList.add('dropzone--accepted');\n dropzoneEl.disabled = true;\n generateMemeBtn.disabled = false;\n instructionsEl.hidden = true;\n clearCanvasBtn.hidden = false;\n};\n\nconst handleImageLoad = evt => {\n selectedImage = evt.target;\n setImageMaxDimensions(selectedImage);\n afterImageSelect();\n};\n\nconst handleSolidColorFormInput = evt => {\n const DEFAULT_WIDTH = 800;\n const DEFAULT_HEIGHT = 600;\n\n if (evt.target === solidColorForm['canvasColor']) {\n selectedImage = evt.target.value;\n }\n\n if (isSolidColorSelected(selectedImage)) {\n canvas.setDimensions({\n width: Number(solidColorForm['canvasWidth'].value) || DEFAULT_WIDTH,\n height: Number(solidColorForm['canvasHeight'].value) || DEFAULT_HEIGHT\n });\n\n afterImageSelect();\n }\n};\n\nconst handleFileSelect = file => {\n if (!file) {\n return;\n }\n\n const image = new Image();\n const reader = new FileReader();\n\n reader.addEventListener('load', function (evt) {\n const data = evt.target.result;\n image.addEventListener('load', handleImageLoad);\n image.src = data;\n });\n\n reader.readAsDataURL(file);\n};\n\nconst handleOpenVideoModalButtonClick = () => {\n videoModal.open = true;\n};\n\nconst handleTextPropChange = (element, textboxId, prop) => {\n const textboxData = Textbox.getById(textboxId).getData();\n\n switch (element.type) {\n case 'checkbox':\n textboxData[prop] = element.checked;\n break;\n case 'number':\n textboxData[prop] = Number(element.value);\n break;\n default:\n textboxData[prop] = element.value;\n }\n\n canvas.draw(selectedImage, Textbox.getAll());\n};\n\nconst handleAddTextboxBtnClick = () => Textbox.create();\n\nconst handleImageUploadFromURL = async evt => {\n evt.preventDefault();\n\n const form = evt.target;\n const submitButton = form.querySelector('button[type=\"submit\"]');\n const imageUrl = form['imageUrl'].value;\n\n if (!imageUrl.trim()) {\n return;\n }\n\n submitButton.disabled = true;\n submitButton.querySelector('.spinner').hidden = false;\n submitButton.querySelector('.label').hidden = true;\n\n try {\n const file = await fileFromUrl({\n url: imageUrl\n }).catch(err => toastAlert(err.message, 'danger'));\n\n if (file) {\n handleFileSelect(file);\n }\n } catch {\n toastAlert(`Failed to load image from \"${imageUrl}\".`, 'danger');\n } finally {\n submitButton.disabled = false;\n submitButton.querySelector('.spinner').hidden = true;\n submitButton.querySelector('.label').hidden = false;\n }\n};\n\nconst moveTextUsingArrowbuttons = (textboxId, direction) => () => {\n const textboxEl = document.getElementById(textboxId);\n const offsetYInput = textboxEl.querySelector('[data-input=\"offsetY\"]');\n const offsetXInput = textboxEl.querySelector('[data-input=\"offsetX\"]');\n const textbox = Textbox.getById(textboxId);\n\n if (!textbox) {\n return;\n }\n\n const textboxData = textbox.getData();\n\n direction = direction.toLowerCase();\n\n switch (direction) {\n case 'up':\n textboxData.offsetY -= 1;\n offsetYInput.value = textboxData.offsetY;\n break;\n case 'down':\n textboxData.offsetY += 1;\n offsetYInput.value = textboxData.offsetY;\n break;\n case 'left':\n textboxData.offsetX -= 1;\n offsetXInput.value = textboxData.offsetX;\n break;\n case 'right':\n textboxData.offsetX += 1;\n offsetXInput.value = textboxData.offsetX;\n break;\n }\n\n canvas.draw(selectedImage, Textbox.getAll());\n\n reqAnimFrame = requestAnimationFrame(moveTextUsingArrowbuttons(textboxId, direction));\n};\n\nconst handleUploadMethodChange = evt => {\n uploadMethodEls.forEach(el => (el.hidden = el.id !== evt.target.value));\n maxImageDimensionsForm.hidden = evt.target.value === 'solidColorForm';\n};\n\nconst handleFileSelectClick = () => {\n if (typeof dropzoneEl.openFileDialog === 'function') {\n dropzoneEl.openFileDialog();\n }\n};\n\nconst handleDropFilesAccepted = evt => {\n const [file] = evt.detail.acceptedFiles;\n\n if (file) {\n handleFileSelect(file);\n }\n};\n\nconst handleTextboxesContainerInput = evt => {\n const element = evt.target;\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n let prop;\n\n if (element.matches('[data-input=\"text\"]')) {\n prop = 'text';\n } else if (element.matches('[data-input=\"fillColor\"]')) {\n prop = 'fillColor';\n } else if (element.matches('[data-input=\"strokeColor\"]')) {\n prop = 'strokeColor';\n } else if (element.matches('[data-input=\"font\"]')) {\n prop = 'font';\n } else if (element.matches('[data-input=\"fontSize\"]')) {\n prop = 'fontSize';\n } else if (element.matches('[data-input=\"fontWeight\"]')) {\n prop = 'fontWeight';\n } else if (element.matches('[data-input=\"textAlign\"]')) {\n prop = 'textAlign';\n } else if (element.matches('[data-input=\"shadowBlur\"]')) {\n prop = 'shadowBlur';\n } else if (element.matches('[data-input=\"offsetY\"]')) {\n prop = 'offsetY';\n } else if (element.matches('[data-input=\"offsetX\"]')) {\n prop = 'offsetX';\n } else if (element.matches('[data-input=\"rotate\"]')) {\n prop = 'rotate';\n } else if (element.matches('[data-input=\"strokeWidth\"]')) {\n prop = 'strokeWidth';\n }\n\n if (prop) {\n handleTextPropChange(element, textboxId, prop);\n }\n};\n\nconst handleTextboxesContainerChange = evt => {\n const element = evt.target;\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n let prop;\n\n if (element.matches('[data-input=\"allCaps\"]')) {\n prop = 'allCaps';\n }\n\n if (prop) {\n handleTextPropChange(element, textboxId, prop);\n }\n};\n\nconst handleTextboxesContainerClick = evt => {\n const element = evt.target;\n\n if (element.matches('[data-button=\"settings\"]')) {\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n const textboxSettingsEl = textboxEl?.querySelector('[data-section=\"settings\"]');\n\n if (textboxSettingsEl) {\n textboxSettingsEl.hidden = !textboxSettingsEl.hidden;\n }\n }\n\n if (element.matches('[data-button=\"duplicate-text-box\"')) {\n const currentTextboxEl = element.closest('[data-section=\"textbox\"]');\n const currentTextboxData = Textbox.getById(currentTextboxEl.id);\n Textbox.create({ ...currentTextboxData.data });\n }\n\n if (element.matches('[data-button=\"delete-text-box\"]')) {\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n const textboxToDelete = Textbox.getById(textboxId);\n\n if (textboxToDelete && textboxToDelete.data.text.trim()) {\n const textboxIdInput = removeTextForm['textbox-id'];\n\n if (textboxIdInput) {\n textboxIdInput.value = textboxId;\n removeConfirmationModal.open = true;\n }\n } else {\n Textbox.remove(textboxId);\n }\n }\n};\n\nconst handleTextRemoveFormSubmit = evt => {\n evt.preventDefault();\n const textboxId = evt.target['textbox-id'].value;\n\n if (textboxId) {\n Textbox.remove(textboxId);\n removeConfirmationModal.open = false;\n }\n};\n\nconst handleTextboxesContainerPointerdown = evt => {\n const element = evt.target;\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n\n if (!textboxEl) {\n return;\n }\n\n if (element.matches('[data-action=\"move-text\"]')) {\n reqAnimFrame = requestAnimationFrame(\n moveTextUsingArrowbuttons(textboxEl.id, element.getAttribute('aria-label'))\n );\n }\n};\n\nconst handleTextboxesContainerPointerup = evt => {\n const element = evt.target;\n\n if (element.matches('[data-action=\"move-text\"]')) {\n cancelAnimationFrame && cancelAnimationFrame(reqAnimFrame);\n reqAnimFrame = null;\n }\n};\n\nconst handleTextboxesContainerPointerout = evt => {\n const element = evt.target;\n\n if (element.matches('[data-action=\"move-text\"]')) {\n cancelAnimationFrame && cancelAnimationFrame(reqAnimFrame);\n reqAnimFrame = null;\n }\n};\n\nconst handleTextboxesContainerKeyDown = evt => {\n const element = evt.target;\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n\n if (element.matches('[data-action=\"move-text\"]')) {\n if (evt.key === ' ' || evt.key === 'Enter') {\n reqAnimFrame && cancelAnimationFrame(reqAnimFrame);\n reqAnimFrame = requestAnimationFrame(\n moveTextUsingArrowbuttons(textboxEl.id, element.getAttribute('aria-label'))\n );\n }\n }\n};\n\nconst handleTextboxesContainerKeyUp = evt => {\n const element = evt.target;\n\n if (element.matches('[data-action=\"move-text\"]')) {\n if (evt.key === ' ' || evt.key === 'Enter') {\n reqAnimFrame && cancelAnimationFrame(reqAnimFrame);\n reqAnimFrame = null;\n }\n }\n};\n\nconst handleGalleryClick = async evt => {\n const button = evt.target.closest('button');\n\n if (!button) {\n return;\n }\n\n const img = button.querySelector('img');\n\n try {\n const file = await fileFromUrl({\n url: img.src\n }).catch(err => toastAlert(err.message, 'danger'));\n\n if (file) {\n handleFileSelect(file);\n }\n } catch {\n toastAlert(`Failed to load image: \"${img.alt}\".`, 'danger');\n }\n};\n\nconst handleGallerySearchInput = evt => {\n const query = evt.target.value.toLowerCase().trim();\n const galleryItems = galleryEl.querySelectorAll('button');\n\n galleryItems.forEach(item => {\n const alt = (item.querySelector('img').getAttribute('alt') || '').toLowerCase();\n item.hidden = !alt.includes(query);\n });\n\n galleryNoResultsEl.hidden = !!galleryEl.querySelector('button:not([hidden])');\n};\n\nconst handleWebShareError = () => {\n downloadModal.open = false;\n toastAlert('There was an error while trying to share your meme.', 'danger');\n};\n\nconst handleCapturePhotoError = evt => {\n const error = evt.detail.error;\n let errorMessage = 'An error occurred while trying to capture photo.';\n\n if (\n error instanceof Error &&\n (error.name === 'NotAllowedError' || error.name === 'NotFoundError')\n ) {\n errorMessage +=\n ' Make sure you have a camera connected and you have granted the appropriate permissions.';\n }\n\n toastAlert(errorMessage, 'danger');\n videoModal.open = false;\n console.error(error);\n};\n\nconst handleCapturePhotoSuccess = evt => {\n videoModal.open = false;\n const image = new Image();\n image.addEventListener('load', handleImageLoad);\n image.src = evt.detail.dataURI;\n};\n\nconst handleModalOpen = evt => {\n if (evt.target.id === 'videoModal') {\n const capturePhotoComponent = videoModal.querySelector('capture-photo');\n\n if (capturePhotoComponent && typeof capturePhotoComponent.startVideoStream === 'function') {\n capturePhotoComponent.startVideoStream();\n }\n }\n};\n\nconst handleModalClose = evt => {\n if (evt.target.id === 'videoModal') {\n const capturePhotoComponent = videoModal.querySelector('capture-photo');\n\n if (capturePhotoComponent && typeof capturePhotoComponent.stopVideoStream === 'function') {\n capturePhotoComponent.stopVideoStream();\n }\n }\n\n if (evt.target.id === 'removeConfirmationModal') {\n removeTextForm.reset();\n }\n};\n\nconst handleEmojiPickerSelection = evt => {\n const textboxEl = evt.target.closest('[data-section=\"textbox\"]');\n\n if (textboxEl) {\n const input = textboxEl.querySelector('[data-input=\"text\"]');\n const emoji = evt.detail.unicode;\n\n if (input) {\n insertTextAtCursor(input, emoji);\n }\n }\n};\n\nconst handleMaxImageDimensionsFormChange = evt => {\n if (evt.target.matches('[name=\"maxImageDimensions\"]')) {\n storage.set('maxImageDimensions', evt.target.value);\n }\n\n if (!selectedImage || isSolidColorSelected(selectedImage)) {\n return;\n }\n\n setImageMaxDimensions(selectedImage);\n canvas.draw(selectedImage, Textbox.getAll());\n};\n\nconst handleTextboxCreate = evt => {\n const textbox = evt.detail.textbox;\n const textboxEl = Textbox.createElement(textbox, shouldFocusOnTextboxCreate);\n\n shouldFocusOnTextboxCreate = true;\n textboxesContainer.appendChild(textboxEl);\n\n if (textbox.getData().text) {\n canvas.draw(selectedImage, Textbox.getAll());\n }\n};\n\nconst handleTextboxDelete = evt => {\n const textboxEl = document.getElementById(evt.detail.id);\n textboxEl && textboxEl.remove();\n\n textboxesContainer.querySelectorAll('[data-section=\"textbox\"]').forEach((el, idx) => {\n el.querySelector('[data-input=\"text\"]').setAttribute('placeholder', `Text #${idx + 1}`);\n });\n\n canvas.draw(selectedImage, Textbox.getAll());\n};\n\nconst handleClearCanvas = evt => {\n if (!selectedImage) {\n return;\n }\n\n evt.stopPropagation();\n selectedImage = null;\n dropzoneEl.classList.remove('dropzone--accepted');\n generateMemeBtn.disabled = true;\n instructionsEl.hidden = false;\n clearCanvasBtn.hidden = true;\n dropzoneEl.disabled = false;\n canvas.clear().hide();\n};\n\nfileSelectBtn.addEventListener('click', handleFileSelectClick);\nopenVideoModalBtn.addEventListener('click', handleOpenVideoModalButtonClick);\naddTextboxBtn.addEventListener('click', handleAddTextboxBtnClick);\ngenerateMemeBtn.addEventListener('click', generateMeme);\ndownloadMemeBtn.addEventListener('click', () => (downloadModal.open = false));\nimageUrlForm.addEventListener('submit', handleImageUploadFromURL);\ndropzoneEl.addEventListener('files-dropzone-drop-accepted', handleDropFilesAccepted);\ntextboxesContainer.addEventListener('input', handleTextboxesContainerInput);\ntextboxesContainer.addEventListener('change', handleTextboxesContainerChange);\ntextboxesContainer.addEventListener('click', handleTextboxesContainerClick);\ntextboxesContainer.addEventListener('pointerdown', handleTextboxesContainerPointerdown);\ntextboxesContainer.addEventListener('pointerup', handleTextboxesContainerPointerup);\ntextboxesContainer.addEventListener('pointerout', handleTextboxesContainerPointerout);\ntextboxesContainer.addEventListener('keydown', handleTextboxesContainerKeyDown);\ntextboxesContainer.addEventListener('keyup', handleTextboxesContainerKeyUp);\nimageUploadMethodSelect.addEventListener('change', handleUploadMethodChange);\ngalleryEl.addEventListener('click', handleGalleryClick);\ngallerySearchEl.addEventListener('input', handleGallerySearchInput);\nsolidColorForm.addEventListener('input', handleSolidColorFormInput);\ndocument.addEventListener('web-share:error', handleWebShareError);\ndocument.addEventListener('capture-photo:error', handleCapturePhotoError);\ndocument.addEventListener('capture-photo:success', handleCapturePhotoSuccess);\ndocument.addEventListener('me-open', handleModalOpen);\ndocument.addEventListener('me-close', handleModalClose);\ndocument.addEventListener('emoji-click', handleEmojiPickerSelection);\ndocument.addEventListener('textbox-create', handleTextboxCreate);\ndocument.addEventListener('textbox-remove', handleTextboxDelete);\nremoveTextForm.addEventListener('submit', handleTextRemoveFormSubmit);\nmaxImageDimensionsForm.addEventListener('change', handleMaxImageDimensionsFormChange);\nclearCanvasBtn.addEventListener('click', handleClearCanvas);\n\ngalleryEl.querySelectorAll('button > img')?.forEach(image => {\n image.setAttribute('title', image.getAttribute('alt'));\n});\n\nTextbox.create();\n\ndropzoneEl.accept = ACCEPTED_MIME_TYPES;\n\nrenderAcceptedImageFormats(ACCEPTED_MIME_TYPES, instructionsEl);\n\ncustomFonts.forEach(({ name, path, style, weight }) => {\n loadCustomFont(name, path, { style, weight });\n});\n\nif (maxImageDimensionsFromStorage) {\n maxImageDimensionsSelect.value = maxImageDimensionsFromStorage;\n}\n\nmaxImageDimensionsSelect.disabled = false;\n","import Picker from './picker.js'\nimport Database from './database.js'\nexport { Picker, Database }\n","import Database from './database.js';\n\n// via https://unpkg.com/browse/emojibase-data@6.0.0/meta/groups.json\nconst allGroups = [\n [-1, '✨', 'custom'],\n [0, '😀', 'smileys-emotion'],\n [1, '👋', 'people-body'],\n [3, '🐱', 'animals-nature'],\n [4, '🍎', 'food-drink'],\n [5, '🏠️', 'travel-places'],\n [6, '⚽', 'activities'],\n [7, '📝', 'objects'],\n [8, '⛔️', 'symbols'],\n [9, '🏁', 'flags']\n].map(([id, emoji, name]) => ({ id, emoji, name }));\n\nconst groups = allGroups.slice(1);\n\nconst MIN_SEARCH_TEXT_LENGTH = 2;\nconst NUM_SKIN_TONES = 6;\n\n/* istanbul ignore next */\nconst rIC = typeof requestIdleCallback === 'function' ? requestIdleCallback : setTimeout;\n\n// check for ZWJ (zero width joiner) character\nfunction hasZwj (emoji) {\n return emoji.unicode.includes('\\u200d')\n}\n\n// Find one good representative emoji from each version to test by checking its color.\n// Ideally it should have color in the center. For some inspiration, see:\n// https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/\n//\n// Note that for certain versions (12.1, 13.1), there is no point in testing them explicitly, because\n// all the emoji from this version are compound-emoji from previous versions. So they would pass a color\n// test, even in browsers that display them as double emoji. (E.g. \"face in clouds\" might render as\n// \"face without mouth\" plus \"fog\".) These emoji can only be filtered using the width test,\n// which happens in checkZwjSupport.js.\nconst versionsAndTestEmoji = {\n '🫨': 15.1, // shaking head, technically from v15 but see note above\n '🫠': 14,\n '🥲': 13.1, // smiling face with tear, technically from v13 but see note above\n '🥻': 12.1, // sari, technically from v12 but see note above\n '🥰': 11,\n '🤩': 5,\n '👱‍♀️': 4,\n '🤣': 3,\n '👁️‍🗨️': 2,\n '😀': 1,\n '😐️': 0.7,\n '😃': 0.6\n};\n\nconst TIMEOUT_BEFORE_LOADING_MESSAGE = 1000; // 1 second\nconst DEFAULT_SKIN_TONE_EMOJI = '🖐️';\nconst DEFAULT_NUM_COLUMNS = 8;\n\n// Based on https://fivethirtyeight.com/features/the-100-most-used-emojis/ and\n// https://blog.emojipedia.org/facebook-reveals-most-and-least-used-emojis/ with\n// a bit of my own curation. (E.g. avoid the \"OK\" gesture because of connotations:\n// https://emojipedia.org/ok-hand/)\nconst MOST_COMMONLY_USED_EMOJI = [\n '😊',\n '😒',\n '❤️',\n '👍️',\n '😍',\n '😂',\n '😭',\n '☺️',\n '😔',\n '😩',\n '😏',\n '💕',\n '🙌',\n '😘'\n];\n\n// It's important to list Twemoji Mozilla before everything else, because Mozilla bundles their\n// own font on some platforms (notably Windows and Linux as of this writing). Typically, Mozilla\n// updates faster than the underlying OS, and we don't want to render older emoji in one font and\n// newer emoji in another font:\n// https://github.com/nolanlawson/emoji-picker-element/pull/268#issuecomment-1073347283\nconst FONT_FAMILY = '\"Twemoji Mozilla\",\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",' +\n '\"Noto Color Emoji\",\"EmojiOne Color\",\"Android Emoji\",sans-serif';\n\n/* istanbul ignore next */\nconst DEFAULT_CATEGORY_SORTING = (a, b) => a < b ? -1 : a > b ? 1 : 0;\n\n// Test if an emoji is supported by rendering it to canvas and checking that the color is not black\n// See https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/\n// and https://www.npmjs.com/package/if-emoji for inspiration\n// This implementation is largely borrowed from if-emoji, adding the font-family\n\n\nconst getTextFeature = (text, color) => {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = 1;\n\n const ctx = canvas.getContext('2d');\n ctx.textBaseline = 'top';\n ctx.font = `100px ${FONT_FAMILY}`;\n ctx.fillStyle = color;\n ctx.scale(0.01, 0.01);\n ctx.fillText(text, 0, 0);\n\n return ctx.getImageData(0, 0, 1, 1).data\n};\n\nconst compareFeatures = (feature1, feature2) => {\n const feature1Str = [...feature1].join(',');\n const feature2Str = [...feature2].join(',');\n // This is RGBA, so for 0,0,0, we are checking that the first RGB is not all zeroes.\n // Most of the time when unsupported this is 0,0,0,0, but on Chrome on Mac it is\n // 0,0,0,61 - there is a transparency here.\n return feature1Str === feature2Str && !feature1Str.startsWith('0,0,0,')\n};\n\nfunction testColorEmojiSupported (text) {\n // Render white and black and then compare them to each other and ensure they're the same\n // color, and neither one is black. This shows that the emoji was rendered in color.\n const feature1 = getTextFeature(text, '#000');\n const feature2 = getTextFeature(text, '#fff');\n return feature1 && feature2 && compareFeatures(feature1, feature2)\n}\n\n// rather than check every emoji ever, which would be expensive, just check some representatives from the\n// different emoji releases to determine what the font supports\n\nfunction determineEmojiSupportLevel () {\n const entries = Object.entries(versionsAndTestEmoji);\n try {\n // start with latest emoji and work backwards\n for (const [emoji, version] of entries) {\n if (testColorEmojiSupported(emoji)) {\n return version\n }\n }\n } catch (e) { // canvas error\n } finally {\n }\n // In case of an error, be generous and just assume all emoji are supported (e.g. for canvas errors\n // due to anti-fingerprinting add-ons). Better to show some gray boxes than nothing at all.\n return entries[0][1] // first one in the list is the most recent version\n}\n\n// Check which emojis we know for sure aren't supported, based on Unicode version level\nlet promise;\nconst detectEmojiSupportLevel = () => {\n if (!promise) {\n // Delay so it can run while the IDB database is being created by the browser (on another thread).\n // This helps especially with first load – we want to start pre-populating the database on the main thread,\n // and then wait for IDB to commit everything, and while waiting we run this check.\n promise = new Promise(resolve => (\n rIC(() => (\n resolve(determineEmojiSupportLevel()) // delay so ideally this can run while IDB is first populating\n ))\n ));\n }\n return promise\n};\n// determine which emojis containing ZWJ (zero width joiner) characters\n// are supported (rendered as one glyph) rather than unsupported (rendered as two or more glyphs)\nconst supportedZwjEmojis = new Map();\n\nconst VARIATION_SELECTOR = '\\ufe0f';\nconst SKINTONE_MODIFIER = '\\ud83c';\nconst ZWJ = '\\u200d';\nconst LIGHT_SKIN_TONE = 0x1F3FB;\nconst LIGHT_SKIN_TONE_MODIFIER = 0xdffb;\n\n// TODO: this is a naive implementation, we can improve it later\n// It's only used for the skintone picker, so as long as people don't customize with\n// really exotic emoji then it should work fine\nfunction applySkinTone (str, skinTone) {\n if (skinTone === 0) {\n return str\n }\n const zwjIndex = str.indexOf(ZWJ);\n if (zwjIndex !== -1) {\n return str.substring(0, zwjIndex) +\n String.fromCodePoint(LIGHT_SKIN_TONE + skinTone - 1) +\n str.substring(zwjIndex)\n }\n if (str.endsWith(VARIATION_SELECTOR)) {\n str = str.substring(0, str.length - 1);\n }\n return str + SKINTONE_MODIFIER + String.fromCodePoint(LIGHT_SKIN_TONE_MODIFIER + skinTone - 1)\n}\n\nfunction halt (event) {\n event.preventDefault();\n event.stopPropagation();\n}\n\n// Implementation left/right or up/down navigation, circling back when you\n// reach the start/end of the list\nfunction incrementOrDecrement (decrement, val, arr) {\n val += (decrement ? -1 : 1);\n if (val < 0) {\n val = arr.length - 1;\n } else if (val >= arr.length) {\n val = 0;\n }\n return val\n}\n\n// like lodash's uniqBy but much smaller\nfunction uniqBy (arr, func) {\n const set = new Set();\n const res = [];\n for (const item of arr) {\n const key = func(item);\n if (!set.has(key)) {\n set.add(key);\n res.push(item);\n }\n }\n return res\n}\n\n// We don't need all the data on every emoji, and there are specific things we need\n// for the UI, so build a \"view model\" from the emoji object we got from the database\n\nfunction summarizeEmojisForUI (emojis, emojiSupportLevel) {\n const toSimpleSkinsMap = skins => {\n const res = {};\n for (const skin of skins) {\n // ignore arrays like [1, 2] with multiple skin tones\n // also ignore variants that are in an unsupported emoji version\n // (these do exist - variants from a different version than their base emoji)\n if (typeof skin.tone === 'number' && skin.version <= emojiSupportLevel) {\n res[skin.tone] = skin.unicode;\n }\n }\n return res\n };\n\n return emojis.map(({ unicode, skins, shortcodes, url, name, category, annotation }) => ({\n unicode,\n name,\n shortcodes,\n url,\n category,\n annotation,\n id: unicode || name,\n skins: skins && toSimpleSkinsMap(skins)\n }))\n}\n\n// import rAF from one place so that the bundle size is a bit smaller\nconst rAF = requestAnimationFrame;\n\n// Svelte action to calculate the width of an element and auto-update\n// using ResizeObserver. If ResizeObserver is unsupported, we just use rAF once\n// and don't bother to update.\n\n\nlet resizeObserverSupported = typeof ResizeObserver === 'function';\n\nfunction calculateWidth (node, abortSignal, onUpdate) {\n let resizeObserver;\n if (resizeObserverSupported) {\n resizeObserver = new ResizeObserver(entries => (\n onUpdate(entries[0].contentRect.width)\n ));\n resizeObserver.observe(node);\n } else { // just set the width once, don't bother trying to track it\n rAF(() => (\n onUpdate(node.getBoundingClientRect().width)\n ));\n }\n\n // cleanup function (called on destroy)\n abortSignal.addEventListener('abort', () => {\n if (resizeObserver) {\n resizeObserver.disconnect();\n }\n });\n}\n\n// get the width of the text inside of a DOM node, via https://stackoverflow.com/a/59525891/680742\nfunction calculateTextWidth (node) {\n /* istanbul ignore else */\n {\n const range = document.createRange();\n range.selectNode(node.firstChild);\n return range.getBoundingClientRect().width\n }\n}\n\nlet baselineEmojiWidth;\n\nfunction checkZwjSupport (zwjEmojisToCheck, baselineEmoji, emojiToDomNode) {\n for (const emoji of zwjEmojisToCheck) {\n const domNode = emojiToDomNode(emoji);\n const emojiWidth = calculateTextWidth(domNode);\n if (typeof baselineEmojiWidth === 'undefined') { // calculate the baseline emoji width only once\n baselineEmojiWidth = calculateTextWidth(baselineEmoji);\n }\n // On Windows, some supported emoji are ~50% bigger than the baseline emoji, but what we really want to guard\n // against are the ones that are 2x the size, because those are truly broken (person with red hair = person with\n // floating red wig, black cat = cat with black square, polar bear = bear with snowflake, etc.)\n // So here we set the threshold at 1.8 times the size of the baseline emoji.\n const supported = emojiWidth / 1.8 < baselineEmojiWidth;\n supportedZwjEmojis.set(emoji.unicode, supported);\n }\n}\n\n// like lodash's uniq\n\nfunction uniq (arr) {\n return uniqBy(arr, _ => _)\n}\n\n// Note we put this in its own function outside Picker.js to avoid Svelte doing an invalidation on the \"setter\" here.\n// At best the invalidation is useless, at worst it can cause infinite loops:\n// https://github.com/nolanlawson/emoji-picker-element/pull/180\n// https://github.com/sveltejs/svelte/issues/6521\n// Also note tabpanelElement can be null if the element is disconnected immediately after connected\nfunction resetScrollTopIfPossible (element) {\n /* istanbul ignore else */\n if (element) { // Makes me nervous not to have this `if` guard\n element.scrollTop = 0;\n }\n}\n\nfunction getFromMap (cache, key, func) {\n let cached = cache.get(key);\n if (!cached) {\n cached = func();\n cache.set(key, cached);\n }\n return cached\n}\n\nfunction toString (value) {\n return '' + value\n}\n\nfunction parseTemplate (htmlString) {\n const template = document.createElement('template');\n template.innerHTML = htmlString;\n return template\n}\n\nconst parseCache = new WeakMap();\nconst domInstancesCache = new WeakMap();\n// This needs to be a symbol because it needs to be different from any possible output of a key function\nconst unkeyedSymbol = Symbol('un-keyed');\n\n// Not supported in Safari <=13\nconst hasReplaceChildren = 'replaceChildren' in Element.prototype;\nfunction replaceChildren (parentNode, newChildren) {\n /* istanbul ignore else */\n if (hasReplaceChildren) {\n parentNode.replaceChildren(...newChildren);\n } else { // minimal polyfill for Element.prototype.replaceChildren\n parentNode.innerHTML = '';\n parentNode.append(...newChildren);\n }\n}\n\nfunction doChildrenNeedRerender (parentNode, newChildren) {\n let oldChild = parentNode.firstChild;\n let oldChildrenCount = 0;\n // iterate using firstChild/nextSibling because browsers use a linked list under the hood\n while (oldChild) {\n const newChild = newChildren[oldChildrenCount];\n // check if the old child and new child are the same\n if (newChild !== oldChild) {\n return true\n }\n oldChild = oldChild.nextSibling;\n oldChildrenCount++;\n }\n // if new children length is different from old, we must re-render\n return oldChildrenCount !== newChildren.length\n}\n\nfunction patchChildren (newChildren, instanceBinding) {\n const { targetNode } = instanceBinding;\n let { targetParentNode } = instanceBinding;\n\n let needsRerender = false;\n\n if (targetParentNode) { // already rendered once\n needsRerender = doChildrenNeedRerender(targetParentNode, newChildren);\n } else { // first render of list\n needsRerender = true;\n instanceBinding.targetNode = undefined; // placeholder node not needed anymore, free memory\n instanceBinding.targetParentNode = targetParentNode = targetNode.parentNode;\n }\n // avoid re-rendering list if the dom nodes are exactly the same before and after\n if (needsRerender) {\n replaceChildren(targetParentNode, newChildren);\n }\n}\n\nfunction patch (expressions, instanceBindings) {\n for (const instanceBinding of instanceBindings) {\n const {\n targetNode,\n currentExpression,\n binding: {\n expressionIndex,\n attributeName,\n attributeValuePre,\n attributeValuePost\n }\n } = instanceBinding;\n\n const expression = expressions[expressionIndex];\n\n if (currentExpression === expression) {\n // no need to update, same as before\n continue\n }\n\n instanceBinding.currentExpression = expression;\n\n if (attributeName) { // attribute replacement\n targetNode.setAttribute(attributeName, attributeValuePre + toString(expression) + attributeValuePost);\n } else { // text node / child element / children replacement\n let newNode;\n if (Array.isArray(expression)) { // array of DOM elements produced by tag template literals\n patchChildren(expression, instanceBinding);\n } else if (expression instanceof Element) { // html tag template returning a DOM element\n newNode = expression;\n targetNode.replaceWith(newNode);\n } else { // primitive - string, number, etc\n // nodeValue is faster than textContent supposedly https://www.youtube.com/watch?v=LY6y3HbDVmg\n // note we may be replacing the value in a placeholder text node\n targetNode.nodeValue = toString(expression);\n }\n if (newNode) {\n instanceBinding.targetNode = newNode;\n }\n }\n }\n}\n\nfunction parse (tokens) {\n let htmlString = '';\n\n let withinTag = false;\n let withinAttribute = false;\n let elementIndexCounter = -1; // depth-first traversal order\n\n const elementsToBindings = new Map();\n const elementIndexes = [];\n\n for (let i = 0, len = tokens.length; i < len; i++) {\n const token = tokens[i];\n htmlString += token;\n\n if (i === len - 1) {\n break // no need to process characters - no more expressions to be found\n }\n\n for (let j = 0; j < token.length; j++) {\n const char = token.charAt(j);\n switch (char) {\n case '<': {\n const nextChar = token.charAt(j + 1);\n if (nextChar === '/') { // closing tag\n // leaving an element\n elementIndexes.pop();\n } else { // not a closing tag\n withinTag = true;\n elementIndexes.push(++elementIndexCounter);\n }\n break\n }\n case '>': {\n withinTag = false;\n withinAttribute = false;\n break\n }\n case '=': {\n withinAttribute = true;\n break\n }\n }\n }\n\n const elementIndex = elementIndexes[elementIndexes.length - 1];\n const bindings = getFromMap(elementsToBindings, elementIndex, () => []);\n\n let attributeName;\n let attributeValuePre;\n let attributeValuePost;\n if (withinAttribute) {\n // I never use single-quotes for attribute values in HTML, so just support double-quotes or no-quotes\n const match = /(\\S+)=\"?([^\"=]*)$/.exec(token);\n attributeName = match[1];\n attributeValuePre = match[2];\n attributeValuePost = /^[^\">]*/.exec(tokens[i + 1])[0];\n }\n\n const binding = {\n attributeName,\n attributeValuePre,\n attributeValuePost,\n expressionIndex: i\n };\n\n bindings.push(binding);\n\n if (!withinTag && !withinAttribute) {\n // Add a placeholder text node, so we can find it later. Note we only support one dynamic child text node\n htmlString += ' ';\n }\n }\n\n const template = parseTemplate(htmlString);\n\n return {\n template,\n elementsToBindings\n }\n}\n\nfunction traverseAndSetupBindings (dom, elementsToBindings) {\n const instanceBindings = [];\n // traverse dom\n const treeWalker = document.createTreeWalker(dom, NodeFilter.SHOW_ELEMENT);\n\n let element = dom;\n let elementIndex = -1;\n do {\n const bindings = elementsToBindings.get(++elementIndex);\n if (bindings) {\n for (let i = 0; i < bindings.length; i++) {\n const binding = bindings[i];\n\n const targetNode = binding.attributeName\n ? element // attribute binding, just use the element itself\n : element.firstChild; // not an attribute binding, so has a placeholder text node\n\n const instanceBinding = {\n binding,\n targetNode,\n targetParentNode: undefined,\n currentExpression: undefined\n };\n\n instanceBindings.push(instanceBinding);\n }\n }\n } while ((element = treeWalker.nextNode()))\n\n return instanceBindings\n}\n\nfunction parseHtml (tokens) {\n // All templates and bound expressions are unique per tokens array\n const { template, elementsToBindings } = getFromMap(parseCache, tokens, () => parse(tokens));\n\n // When we parseHtml, we always return a fresh DOM instance ready to be updated\n const dom = template.cloneNode(true).content.firstElementChild;\n const instanceBindings = traverseAndSetupBindings(dom, elementsToBindings);\n\n return function updateDomInstance (expressions) {\n patch(expressions, instanceBindings);\n return dom\n }\n}\n\nfunction createFramework (state) {\n const domInstances = getFromMap(domInstancesCache, state, () => new Map());\n let domInstanceCacheKey = unkeyedSymbol;\n\n function html (tokens, ...expressions) {\n // Each unique lexical usage of map() is considered unique due to the html`` tagged template call it makes,\n // which has lexically unique tokens. The unkeyed symbol is just used for html`` usage outside of a map().\n const domInstancesForTokens = getFromMap(domInstances, tokens, () => new Map());\n const updateDomInstance = getFromMap(domInstancesForTokens, domInstanceCacheKey, () => parseHtml(tokens));\n\n return updateDomInstance(expressions) // update with expressions\n }\n\n function map (array, callback, keyFunction) {\n return array.map((item, index) => {\n const originalCacheKey = domInstanceCacheKey;\n domInstanceCacheKey = keyFunction(item);\n try {\n return callback(item, index)\n } finally {\n domInstanceCacheKey = originalCacheKey;\n }\n })\n }\n\n return { map, html }\n}\n\nfunction render (container, state, helpers, events, actions, refs, abortSignal, firstRender) {\n const { labelWithSkin, titleForEmoji, unicodeWithSkin } = helpers;\n const { html, map } = createFramework(state);\n\n function emojiList (emojis, searchMode, prefix) {\n return map(emojis, (emoji, i) => {\n return html``\n // It's important for the cache key to be unique based on the prefix, because the framework caches based on the\n // unique tokens + cache key, and the same emoji may be used in the tab as well as in the fav bar\n }, emoji => `${prefix}-${emoji.id}`)\n }\n\n const section = () => {\n return html`
${state.i18n.searchDescription}
${state.i18n.skinToneDescription}
${\n map(state.skinTones, (skinTone, i) => {\n return html`
${skinTone}
`\n }, skinTone => skinTone)\n }
${\n map(state.groups, (group) => {\n return html``\n }, group => group.id)\n }
${state.message}
${\n map(state.currentEmojisWithCategories, (emojiWithCategory, i) => {\n return html`
${\n state.searchMode\n ? state.i18n.searchResultsLabel\n : (\n emojiWithCategory.category\n ? emojiWithCategory.category\n : (\n state.currentEmojisWithCategories.length > 1\n ? state.i18n.categories.custom\n : state.i18n.categories[state.currentGroup.name]\n )\n )\n }
${\n emojiList(emojiWithCategory.emojis, state.searchMode, /* prefix */ 'emo')\n }
`\n }, emojiWithCategory => emojiWithCategory.category)\n }
${\n emojiList(state.currentFavorites, /* searchMode */ false, /* prefix */ 'fav')\n }
`\n };\n\n const rootDom = section();\n\n if (firstRender) { // not a re-render\n container.appendChild(rootDom);\n\n // we only bind events/refs/actions once - there is no need to find them again given this component structure\n\n // helper for traversing the dom, finding elements by an attribute, and getting the attribute value\n const forElementWithAttribute = (attributeName, callback) => {\n for (const element of container.querySelectorAll(`[${attributeName}]`)) {\n callback(element, element.getAttribute(attributeName));\n }\n };\n\n // bind events\n for (const eventName of ['click', 'focusout', 'input', 'keydown', 'keyup']) {\n forElementWithAttribute(`data-on-${eventName}`, (element, listenerName) => {\n element.addEventListener(eventName, events[listenerName]);\n });\n }\n\n // find refs\n forElementWithAttribute('data-ref', (element, ref) => {\n refs[ref] = element;\n });\n\n // set up actions\n forElementWithAttribute('data-action', (element, action) => {\n actions[action](element);\n });\n\n // destroy/abort logic\n abortSignal.addEventListener('abort', () => {\n container.removeChild(rootDom);\n });\n }\n}\n\n/* istanbul ignore next */\nconst qM = typeof queueMicrotask === 'function' ? queueMicrotask : callback => Promise.resolve().then(callback);\n\nfunction createState (abortSignal) {\n let destroyed = false;\n let currentObserver;\n\n const propsToObservers = new Map();\n const dirtyObservers = new Set();\n\n let queued;\n\n const flush = () => {\n if (destroyed) {\n return\n }\n const observersToRun = [...dirtyObservers];\n dirtyObservers.clear(); // clear before running to force any new updates to run in another tick of the loop\n try {\n for (const observer of observersToRun) {\n observer();\n }\n } finally {\n queued = false;\n if (dirtyObservers.size) { // new updates, queue another one\n queued = true;\n qM(flush);\n }\n }\n };\n\n const state = new Proxy({}, {\n get (target, prop) {\n if (currentObserver) {\n let observers = propsToObservers.get(prop);\n if (!observers) {\n observers = new Set();\n propsToObservers.set(prop, observers);\n }\n observers.add(currentObserver);\n }\n return target[prop]\n },\n set (target, prop, newValue) {\n target[prop] = newValue;\n const observers = propsToObservers.get(prop);\n if (observers) {\n for (const observer of observers) {\n dirtyObservers.add(observer);\n }\n if (!queued) {\n queued = true;\n qM(flush);\n }\n }\n return true\n }\n });\n\n const createEffect = (callback) => {\n const runnable = () => {\n const oldObserver = currentObserver;\n currentObserver = runnable;\n try {\n return callback()\n } finally {\n currentObserver = oldObserver;\n }\n };\n return runnable()\n };\n\n // destroy logic\n abortSignal.addEventListener('abort', () => {\n destroyed = true;\n });\n\n return {\n state,\n createEffect\n }\n}\n\n// Compare two arrays, with a function called on each item in the two arrays that returns true if the items are equal\nfunction arraysAreEqualByFunction (left, right, areEqualFunc) {\n if (left.length !== right.length) {\n return false\n }\n for (let i = 0; i < left.length; i++) {\n if (!areEqualFunc(left[i], right[i])) {\n return false\n }\n }\n return true\n}\n\n/* eslint-disable prefer-const,no-labels,no-inner-declarations */\n\n// constants\nconst EMPTY_ARRAY = [];\n\nconst { assign } = Object;\n\nfunction createRoot (shadowRoot, props) {\n const refs = {};\n const abortController = new AbortController();\n const abortSignal = abortController.signal;\n const { state, createEffect } = createState(abortSignal);\n\n // initial state\n assign(state, {\n skinToneEmoji: undefined,\n i18n: undefined,\n database: undefined,\n customEmoji: undefined,\n customCategorySorting: undefined,\n emojiVersion: undefined\n });\n\n // public props\n assign(state, props);\n\n // private props\n assign(state, {\n initialLoad: true,\n currentEmojis: [],\n currentEmojisWithCategories: [],\n rawSearchText: '',\n searchText: '',\n searchMode: false,\n activeSearchItem: -1,\n message: undefined,\n skinTonePickerExpanded: false,\n skinTonePickerExpandedAfterAnimation: false,\n currentSkinTone: 0,\n activeSkinTone: 0,\n skinToneButtonText: undefined,\n pickerStyle: undefined,\n skinToneButtonLabel: '',\n skinTones: [],\n currentFavorites: [],\n defaultFavoriteEmojis: undefined,\n numColumns: DEFAULT_NUM_COLUMNS,\n isRtl: false,\n scrollbarWidth: 0,\n currentGroupIndex: 0,\n groups: groups,\n databaseLoaded: false,\n activeSearchItemId: undefined\n });\n\n //\n // Update the current group based on the currentGroupIndex\n //\n createEffect(() => {\n if (state.currentGroup !== state.groups[state.currentGroupIndex]) {\n state.currentGroup = state.groups[state.currentGroupIndex];\n }\n });\n\n //\n // Utils/helpers\n //\n\n const focus = id => {\n shadowRoot.getElementById(id).focus();\n };\n\n const emojiToDomNode = emoji => shadowRoot.getElementById(`emo-${emoji.id}`);\n\n // fire a custom event that crosses the shadow boundary\n const fireEvent = (name, detail) => {\n refs.rootElement.dispatchEvent(new CustomEvent(name, {\n detail,\n bubbles: true,\n composed: true\n }));\n };\n\n //\n // Comparison utils\n //\n\n const compareEmojiArrays = (a, b) => a.id === b.id;\n\n const compareCurrentEmojisWithCategories = (a, b) => {\n const { category: aCategory, emojis: aEmojis } = a;\n const { category: bCategory, emojis: bEmojis } = b;\n\n if (aCategory !== bCategory) {\n return false\n }\n\n return arraysAreEqualByFunction(aEmojis, bEmojis, compareEmojiArrays)\n };\n\n //\n // Update utils to avoid excessive re-renders\n //\n\n // avoid excessive re-renders by checking the value before setting\n const updateCurrentEmojis = (newEmojis) => {\n if (!arraysAreEqualByFunction(state.currentEmojis, newEmojis, compareEmojiArrays)) {\n state.currentEmojis = newEmojis;\n }\n };\n\n // avoid excessive re-renders\n const updateSearchMode = (newSearchMode) => {\n if (state.searchMode !== newSearchMode) {\n state.searchMode = newSearchMode;\n }\n };\n\n // avoid excessive re-renders\n const updateCurrentEmojisWithCategories = (newEmojisWithCategories) => {\n if (!arraysAreEqualByFunction(state.currentEmojisWithCategories, newEmojisWithCategories, compareCurrentEmojisWithCategories)) {\n state.currentEmojisWithCategories = newEmojisWithCategories;\n }\n };\n\n // Helpers used by PickerTemplate\n\n const unicodeWithSkin = (emoji, currentSkinTone) => (\n (currentSkinTone && emoji.skins && emoji.skins[currentSkinTone]) || emoji.unicode\n );\n\n const labelWithSkin = (emoji, currentSkinTone) => (\n uniq([\n (emoji.name || unicodeWithSkin(emoji, currentSkinTone)),\n emoji.annotation,\n ...(emoji.shortcodes || EMPTY_ARRAY)\n ].filter(Boolean)).join(', ')\n );\n\n const titleForEmoji = (emoji) => (\n emoji.annotation || (emoji.shortcodes || EMPTY_ARRAY).join(', ')\n );\n\n const helpers = {\n labelWithSkin, titleForEmoji, unicodeWithSkin\n };\n const events = {\n onClickSkinToneButton,\n onEmojiClick,\n onNavClick,\n onNavKeydown,\n onSearchKeydown,\n onSkinToneOptionsClick,\n onSkinToneOptionsFocusOut,\n onSkinToneOptionsKeydown,\n onSkinToneOptionsKeyup,\n onSearchInput\n };\n const actions = {\n calculateEmojiGridStyle\n };\n\n let firstRender = true;\n createEffect(() => {\n render(shadowRoot, state, helpers, events, actions, refs, abortSignal, firstRender);\n firstRender = false;\n });\n\n //\n // Determine the emoji support level (in requestIdleCallback)\n //\n\n // mount logic\n if (!state.emojiVersion) {\n detectEmojiSupportLevel().then(level => {\n // Can't actually test emoji support in Jest/Vitest/JSDom, emoji never render in color in Cairo\n /* istanbul ignore next */\n if (!level) {\n state.message = state.i18n.emojiUnsupportedMessage;\n }\n });\n }\n\n //\n // Set or update the database object\n //\n\n createEffect(() => {\n // show a Loading message if it takes a long time, or show an error if there's a network/IDB error\n async function handleDatabaseLoading () {\n let showingLoadingMessage = false;\n const timeoutHandle = setTimeout(() => {\n showingLoadingMessage = true;\n state.message = state.i18n.loadingMessage;\n }, TIMEOUT_BEFORE_LOADING_MESSAGE);\n try {\n await state.database.ready();\n state.databaseLoaded = true; // eslint-disable-line no-unused-vars\n } catch (err) {\n console.error(err);\n state.message = state.i18n.networkErrorMessage;\n } finally {\n clearTimeout(timeoutHandle);\n if (showingLoadingMessage) { // Seems safer than checking the i18n string, which may change\n showingLoadingMessage = false;\n state.message = ''; // eslint-disable-line no-unused-vars\n }\n }\n }\n\n if (state.database) {\n /* no await */\n handleDatabaseLoading();\n }\n });\n\n //\n // Global styles for the entire picker\n //\n\n createEffect(() => {\n state.pickerStyle = `\n --num-groups: ${state.groups.length}; \n --indicator-opacity: ${state.searchMode ? 0 : 1}; \n --num-skintones: ${NUM_SKIN_TONES};`;\n });\n\n //\n // Set or update the customEmoji\n //\n\n createEffect(() => {\n if (state.customEmoji && state.database) {\n updateCustomEmoji(); // re-run whenever customEmoji change\n }\n });\n\n createEffect(() => {\n if (state.customEmoji && state.customEmoji.length) {\n if (state.groups !== allGroups) { // don't update unnecessarily\n state.groups = allGroups;\n }\n } else if (state.groups !== groups) {\n if (state.currentGroupIndex) {\n // If the current group is anything other than \"custom\" (which is first), decrement.\n // This fixes the odd case where you set customEmoji, then pick a category, then unset customEmoji\n state.currentGroupIndex--;\n }\n state.groups = groups;\n }\n });\n\n //\n // Set or update the preferred skin tone\n //\n\n createEffect(() => {\n async function updatePreferredSkinTone () {\n if (state.databaseLoaded) {\n state.currentSkinTone = await state.database.getPreferredSkinTone();\n }\n }\n\n /* no await */ updatePreferredSkinTone();\n });\n\n createEffect(() => {\n state.skinTones = Array(NUM_SKIN_TONES).fill().map((_, i) => applySkinTone(state.skinToneEmoji, i));\n });\n\n createEffect(() => {\n state.skinToneButtonText = state.skinTones[state.currentSkinTone];\n });\n\n createEffect(() => {\n state.skinToneButtonLabel = state.i18n.skinToneLabel.replace('{skinTone}', state.i18n.skinTones[state.currentSkinTone]);\n });\n\n //\n // Set or update the favorites emojis\n //\n\n createEffect(() => {\n async function updateDefaultFavoriteEmojis () {\n const { database } = state;\n const favs = (await Promise.all(MOST_COMMONLY_USED_EMOJI.map(unicode => (\n database.getEmojiByUnicodeOrName(unicode)\n )))).filter(Boolean); // filter because in Jest/Vitest tests we don't have all the emoji in the DB\n state.defaultFavoriteEmojis = favs;\n }\n\n if (state.databaseLoaded) {\n /* no await */ updateDefaultFavoriteEmojis();\n }\n });\n\n function updateCustomEmoji () {\n // Certain effects have an implicit dependency on customEmoji since it affects the database\n // Getting it here on the state ensures this effect re-runs when customEmoji change.\n // Setting it on the database is pointless but prevents this code from being removed by a minifier.\n state.database.customEmoji = state.customEmoji || EMPTY_ARRAY;\n }\n\n createEffect(() => {\n async function updateFavorites () {\n updateCustomEmoji(); // re-run whenever customEmoji change\n const { database, defaultFavoriteEmojis, numColumns } = state;\n const dbFavorites = await database.getTopFavoriteEmoji(numColumns);\n const favorites = await summarizeEmojis(uniqBy([\n ...dbFavorites,\n ...defaultFavoriteEmojis\n ], _ => (_.unicode || _.name)).slice(0, numColumns));\n state.currentFavorites = favorites;\n }\n\n if (state.databaseLoaded && state.defaultFavoriteEmojis) {\n /* no await */ updateFavorites();\n }\n });\n\n //\n // Calculate the width of the emoji grid. This serves two purposes:\n // 1) Re-calculate the --num-columns var because it may have changed\n // 2) Re-calculate the scrollbar width because it may have changed\n // (i.e. because the number of items changed)\n // 3) Re-calculate whether we're in RTL mode or not.\n //\n // The benefit of doing this in one place is to align with rAF/ResizeObserver\n // and do all the calculations in one go. RTL vs LTR is not strictly width-related,\n // but since we're already reading the style here, and since it's already aligned with\n // the rAF loop, this is the most appropriate place to do it perf-wise.\n //\n\n function calculateEmojiGridStyle (node) {\n calculateWidth(node, abortSignal, width => {\n /* istanbul ignore next */\n { // jsdom throws errors for this kind of fancy stuff\n // read all the style/layout calculations we need to make\n const style = getComputedStyle(refs.rootElement);\n const newNumColumns = parseInt(style.getPropertyValue('--num-columns'), 10);\n const newIsRtl = style.getPropertyValue('direction') === 'rtl';\n const parentWidth = node.parentElement.getBoundingClientRect().width;\n const newScrollbarWidth = parentWidth - width;\n\n // write to state variables\n state.numColumns = newNumColumns;\n state.scrollbarWidth = newScrollbarWidth; // eslint-disable-line no-unused-vars\n state.isRtl = newIsRtl; // eslint-disable-line no-unused-vars\n }\n });\n }\n\n //\n // Set or update the currentEmojis. Check for invalid ZWJ renderings\n // (i.e. double emoji).\n //\n\n createEffect(() => {\n async function updateEmojis () {\n const { searchText, currentGroup, databaseLoaded, customEmoji } = state;\n if (!databaseLoaded) {\n state.currentEmojis = [];\n state.searchMode = false;\n } else if (searchText.length >= MIN_SEARCH_TEXT_LENGTH) {\n const newEmojis = await getEmojisBySearchQuery(searchText);\n if (state.searchText === searchText) { // if the situation changes asynchronously, do not update\n updateCurrentEmojis(newEmojis);\n updateSearchMode(true);\n }\n } else { // database is loaded and we're not in search mode, so we're in normal category mode\n const { id: currentGroupId } = currentGroup;\n // avoid race condition where currentGroupId is -1 and customEmoji is undefined/empty\n if (currentGroupId !== -1 || (customEmoji && customEmoji.length)) {\n const newEmojis = await getEmojisByGroup(currentGroupId);\n if (state.currentGroup.id === currentGroupId) { // if the situation changes asynchronously, do not update\n updateCurrentEmojis(newEmojis);\n updateSearchMode(false);\n }\n }\n }\n }\n\n /* no await */ updateEmojis();\n });\n\n // Some emojis have their ligatures rendered as two or more consecutive emojis\n // We want to treat these the same as unsupported emojis, so we compare their\n // widths against the baseline widths and remove them as necessary\n createEffect(() => {\n const { currentEmojis, emojiVersion } = state;\n const zwjEmojisToCheck = currentEmojis\n .filter(emoji => emoji.unicode) // filter custom emoji\n .filter(emoji => hasZwj(emoji) && !supportedZwjEmojis.has(emoji.unicode));\n if (!emojiVersion && zwjEmojisToCheck.length) {\n // render now, check their length later\n updateCurrentEmojis(currentEmojis);\n rAF(() => checkZwjSupportAndUpdate(zwjEmojisToCheck));\n } else {\n const newEmojis = emojiVersion ? currentEmojis : currentEmojis.filter(isZwjSupported);\n updateCurrentEmojis(newEmojis);\n // Reset scroll top to 0 when emojis change\n rAF(() => resetScrollTopIfPossible(refs.tabpanelElement));\n }\n });\n\n function checkZwjSupportAndUpdate (zwjEmojisToCheck) {\n checkZwjSupport(zwjEmojisToCheck, refs.baselineEmoji, emojiToDomNode);\n // force update\n // eslint-disable-next-line no-self-assign\n state.currentEmojis = state.currentEmojis;\n }\n\n function isZwjSupported (emoji) {\n return !emoji.unicode || !hasZwj(emoji) || supportedZwjEmojis.get(emoji.unicode)\n }\n\n async function filterEmojisByVersion (emojis) {\n const emojiSupportLevel = state.emojiVersion || await detectEmojiSupportLevel();\n // !version corresponds to custom emoji\n return emojis.filter(({ version }) => !version || version <= emojiSupportLevel)\n }\n\n async function summarizeEmojis (emojis) {\n return summarizeEmojisForUI(emojis, state.emojiVersion || await detectEmojiSupportLevel())\n }\n\n async function getEmojisByGroup (group) {\n // -1 is custom emoji\n const emoji = group === -1 ? state.customEmoji : await state.database.getEmojiByGroup(group);\n return summarizeEmojis(await filterEmojisByVersion(emoji))\n }\n\n async function getEmojisBySearchQuery (query) {\n return summarizeEmojis(await filterEmojisByVersion(await state.database.getEmojiBySearchQuery(query)))\n }\n\n createEffect(() => {\n });\n\n //\n // Derive currentEmojisWithCategories from currentEmojis. This is always done even if there\n // are no categories, because it's just easier to code the HTML this way.\n //\n\n createEffect(() => {\n function calculateCurrentEmojisWithCategories () {\n const { searchMode, currentEmojis } = state;\n if (searchMode) {\n return [\n {\n category: '',\n emojis: currentEmojis\n }\n ]\n }\n const categoriesToEmoji = new Map();\n for (const emoji of currentEmojis) {\n const category = emoji.category || '';\n let emojis = categoriesToEmoji.get(category);\n if (!emojis) {\n emojis = [];\n categoriesToEmoji.set(category, emojis);\n }\n emojis.push(emoji);\n }\n return [...categoriesToEmoji.entries()]\n .map(([category, emojis]) => ({ category, emojis }))\n .sort((a, b) => state.customCategorySorting(a.category, b.category))\n }\n\n const newEmojisWithCategories = calculateCurrentEmojisWithCategories();\n updateCurrentEmojisWithCategories(newEmojisWithCategories);\n });\n\n //\n // Handle active search item (i.e. pressing up or down while searching)\n //\n\n createEffect(() => {\n state.activeSearchItemId = state.activeSearchItem !== -1 && state.currentEmojis[state.activeSearchItem].id;\n });\n\n //\n // Handle user input on the search input\n //\n\n createEffect(() => {\n const { rawSearchText } = state;\n rIC(() => {\n state.searchText = (rawSearchText || '').trim(); // defer to avoid input delays, plus we can trim here\n state.activeSearchItem = -1;\n });\n });\n\n function onSearchKeydown (event) {\n if (!state.searchMode || !state.currentEmojis.length) {\n return\n }\n\n const goToNextOrPrevious = (previous) => {\n halt(event);\n state.activeSearchItem = incrementOrDecrement(previous, state.activeSearchItem, state.currentEmojis);\n };\n\n switch (event.key) {\n case 'ArrowDown':\n return goToNextOrPrevious(false)\n case 'ArrowUp':\n return goToNextOrPrevious(true)\n case 'Enter':\n if (state.activeSearchItem === -1) {\n // focus the first option in the list since the list must be non-empty at this point (it's verified above)\n state.activeSearchItem = 0;\n } else { // there is already an active search item\n halt(event);\n return clickEmoji(state.currentEmojis[state.activeSearchItem].id)\n }\n }\n }\n\n //\n // Handle user input on nav\n //\n\n function onNavClick (event) {\n const { target } = event;\n const closestTarget = target.closest('.nav-button');\n /* istanbul ignore if */\n if (!closestTarget) {\n return // This should never happen, but makes me nervous not to have it\n }\n const groupId = parseInt(closestTarget.dataset.groupId, 10);\n refs.searchElement.value = ''; // clear search box input\n state.rawSearchText = '';\n state.searchText = '';\n state.activeSearchItem = -1;\n state.currentGroupIndex = state.groups.findIndex(_ => _.id === groupId);\n }\n\n function onNavKeydown (event) {\n const { target, key } = event;\n\n const doFocus = el => {\n if (el) {\n halt(event);\n el.focus();\n }\n };\n\n switch (key) {\n case 'ArrowLeft':\n return doFocus(target.previousElementSibling)\n case 'ArrowRight':\n return doFocus(target.nextElementSibling)\n case 'Home':\n return doFocus(target.parentElement.firstElementChild)\n case 'End':\n return doFocus(target.parentElement.lastElementChild)\n }\n }\n\n //\n // Handle user input on an emoji\n //\n\n async function clickEmoji (unicodeOrName) {\n const emoji = await state.database.getEmojiByUnicodeOrName(unicodeOrName);\n const emojiSummary = [...state.currentEmojis, ...state.currentFavorites]\n .find(_ => (_.id === unicodeOrName));\n const skinTonedUnicode = emojiSummary.unicode && unicodeWithSkin(emojiSummary, state.currentSkinTone);\n await state.database.incrementFavoriteEmojiCount(unicodeOrName);\n fireEvent('emoji-click', {\n emoji,\n skinTone: state.currentSkinTone,\n ...(skinTonedUnicode && { unicode: skinTonedUnicode }),\n ...(emojiSummary.name && { name: emojiSummary.name })\n });\n }\n\n async function onEmojiClick (event) {\n const { target } = event;\n /* istanbul ignore if */\n if (!target.classList.contains('emoji')) {\n // This should never happen, but makes me nervous not to have it\n return\n }\n halt(event);\n const id = target.id.substring(4); // replace 'emo-' or 'fav-' prefix\n\n /* no await */ clickEmoji(id);\n }\n\n //\n // Handle user input on the skintone picker\n //\n\n function changeSkinTone (skinTone) {\n state.currentSkinTone = skinTone;\n state.skinTonePickerExpanded = false;\n focus('skintone-button');\n fireEvent('skin-tone-change', { skinTone });\n /* no await */ state.database.setPreferredSkinTone(skinTone);\n }\n\n function onSkinToneOptionsClick (event) {\n const { target: { id } } = event;\n const match = id && id.match(/^skintone-(\\d)/); // skintone option format\n /* istanbul ignore if */\n if (!match) { // not a skintone option\n return // This should never happen, but makes me nervous not to have it\n }\n halt(event);\n const skinTone = parseInt(match[1], 10); // remove 'skintone-' prefix\n changeSkinTone(skinTone);\n }\n\n function onClickSkinToneButton (event) {\n state.skinTonePickerExpanded = !state.skinTonePickerExpanded;\n state.activeSkinTone = state.currentSkinTone;\n // this should always be true, since the button is obscured by the listbox, so this `if` is just to be sure\n if (state.skinTonePickerExpanded) {\n halt(event);\n rAF(() => focus('skintone-list'));\n }\n }\n\n // To make the animation nicer, change the z-index of the skintone picker button\n // *after* the animation has played. This makes it appear that the picker box\n // is expanding \"below\" the button\n createEffect(() => {\n if (state.skinTonePickerExpanded) {\n refs.skinToneDropdown.addEventListener('transitionend', () => {\n state.skinTonePickerExpandedAfterAnimation = true; // eslint-disable-line no-unused-vars\n }, { once: true });\n } else {\n state.skinTonePickerExpandedAfterAnimation = false; // eslint-disable-line no-unused-vars\n }\n });\n\n function onSkinToneOptionsKeydown (event) {\n // this should never happen, but makes me nervous not to have it\n /* istanbul ignore if */\n if (!state.skinTonePickerExpanded) {\n return\n }\n const changeActiveSkinTone = async nextSkinTone => {\n halt(event);\n state.activeSkinTone = nextSkinTone;\n };\n\n switch (event.key) {\n case 'ArrowUp':\n return changeActiveSkinTone(incrementOrDecrement(true, state.activeSkinTone, state.skinTones))\n case 'ArrowDown':\n return changeActiveSkinTone(incrementOrDecrement(false, state.activeSkinTone, state.skinTones))\n case 'Home':\n return changeActiveSkinTone(0)\n case 'End':\n return changeActiveSkinTone(state.skinTones.length - 1)\n case 'Enter':\n // enter on keydown, space on keyup. this is just how browsers work for buttons\n // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html\n halt(event);\n return changeSkinTone(state.activeSkinTone)\n case 'Escape':\n halt(event);\n state.skinTonePickerExpanded = false;\n return focus('skintone-button')\n }\n }\n\n function onSkinToneOptionsKeyup (event) {\n // this should never happen, but makes me nervous not to have it\n /* istanbul ignore if */\n if (!state.skinTonePickerExpanded) {\n return\n }\n switch (event.key) {\n case ' ':\n // enter on keydown, space on keyup. this is just how browsers work for buttons\n // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html\n halt(event);\n return changeSkinTone(state.activeSkinTone)\n }\n }\n\n async function onSkinToneOptionsFocusOut (event) {\n // On blur outside of the skintone listbox, collapse the skintone picker.\n const { relatedTarget } = event;\n // The `else` should never happen, but makes me nervous not to have it\n /* istanbul ignore else */\n if (!relatedTarget || relatedTarget.id !== 'skintone-list') {\n state.skinTonePickerExpanded = false;\n }\n }\n\n function onSearchInput (event) {\n state.rawSearchText = event.target.value;\n }\n\n return {\n $set (newState) {\n assign(state, newState);\n },\n $destroy () {\n abortController.abort();\n }\n }\n}\n\nconst DEFAULT_DATA_SOURCE = 'https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json';\nconst DEFAULT_LOCALE = 'en';\n\nvar enI18n = {\n categoriesLabel: 'Categories',\n emojiUnsupportedMessage: 'Your browser does not support color emoji.',\n favoritesLabel: 'Favorites',\n loadingMessage: 'Loading…',\n networkErrorMessage: 'Could not load emoji.',\n regionLabel: 'Emoji picker',\n searchDescription: 'When search results are available, press up or down to select and enter to choose.',\n searchLabel: 'Search',\n searchResultsLabel: 'Search results',\n skinToneDescription: 'When expanded, press up or down to select and enter to choose.',\n skinToneLabel: 'Choose a skin tone (currently {skinTone})',\n skinTonesLabel: 'Skin tones',\n skinTones: [\n 'Default',\n 'Light',\n 'Medium-Light',\n 'Medium',\n 'Medium-Dark',\n 'Dark'\n ],\n categories: {\n custom: 'Custom',\n 'smileys-emotion': 'Smileys and emoticons',\n 'people-body': 'People and body',\n 'animals-nature': 'Animals and nature',\n 'food-drink': 'Food and drink',\n 'travel-places': 'Travel and places',\n activities: 'Activities',\n objects: 'Objects',\n symbols: 'Symbols',\n flags: 'Flags'\n }\n};\n\nvar baseStyles = \":host{--emoji-size:1.375rem;--emoji-padding:0.5rem;--category-emoji-size:var(--emoji-size);--category-emoji-padding:var(--emoji-padding);--indicator-height:3px;--input-border-radius:0.5rem;--input-border-size:1px;--input-font-size:1rem;--input-line-height:1.5;--input-padding:0.25rem;--num-columns:8;--outline-size:2px;--border-size:1px;--skintone-border-radius:1rem;--category-font-size:1rem;display:flex;width:min-content;height:400px}:host,:host(.light){color-scheme:light;--background:#fff;--border-color:#e0e0e0;--indicator-color:#385ac1;--input-border-color:#999;--input-font-color:#111;--input-placeholder-color:#999;--outline-color:#999;--category-font-color:#111;--button-active-background:#e6e6e6;--button-hover-background:#d9d9d9}:host(.dark){color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}@media (prefers-color-scheme:dark){:host{color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}}:host([hidden]){display:none}button{margin:0;padding:0;border:0;background:0 0;box-shadow:none;-webkit-tap-highlight-color:transparent}button::-moz-focus-inner{border:0}input{padding:0;margin:0;line-height:1.15;font-family:inherit}input[type=search]{-webkit-appearance:none}:focus{outline:var(--outline-color) solid var(--outline-size);outline-offset:calc(-1*var(--outline-size))}:host([data-js-focus-visible]) :focus:not([data-focus-visible-added]){outline:0}:focus:not(:focus-visible){outline:0}.hide-focus{outline:0}*{box-sizing:border-box}.picker{contain:content;display:flex;flex-direction:column;background:var(--background);border:var(--border-size) solid var(--border-color);width:100%;height:100%;overflow:hidden;--total-emoji-size:calc(var(--emoji-size) + (2 * var(--emoji-padding)));--total-category-emoji-size:calc(var(--category-emoji-size) + (2 * var(--category-emoji-padding)))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.hidden{opacity:0;pointer-events:none}.abs-pos{position:absolute;left:0;top:0}.gone{display:none!important}.skintone-button-wrapper,.skintone-list{background:var(--background);z-index:3}.skintone-button-wrapper.expanded{z-index:1}.skintone-list{position:absolute;inset-inline-end:0;top:0;z-index:2;overflow:visible;border-bottom:var(--border-size) solid var(--border-color);border-radius:0 0 var(--skintone-border-radius) var(--skintone-border-radius);will-change:transform;transition:transform .2s ease-in-out;transform-origin:center 0}@media (prefers-reduced-motion:reduce){.skintone-list{transition-duration:.001s}}@supports not (inset-inline-end:0){.skintone-list{right:0}}.skintone-list.no-animate{transition:none}.tabpanel{overflow-y:auto;-webkit-overflow-scrolling:touch;will-change:transform;min-height:0;flex:1;contain:content}.emoji-menu{display:grid;grid-template-columns:repeat(var(--num-columns),var(--total-emoji-size));justify-content:space-around;align-items:flex-start;width:100%}.category{padding:var(--emoji-padding);font-size:var(--category-font-size);color:var(--category-font-color)}.custom-emoji,.emoji,button.emoji{height:var(--total-emoji-size);width:var(--total-emoji-size)}.emoji,button.emoji{font-size:var(--emoji-size);display:flex;align-items:center;justify-content:center;border-radius:100%;line-height:1;overflow:hidden;font-family:var(--emoji-font-family);cursor:pointer}@media (hover:hover) and (pointer:fine){.emoji:hover,button.emoji:hover{background:var(--button-hover-background)}}.emoji.active,.emoji:active,button.emoji.active,button.emoji:active{background:var(--button-active-background)}.custom-emoji{padding:var(--emoji-padding);object-fit:contain;pointer-events:none;background-repeat:no-repeat;background-position:center center;background-size:var(--emoji-size) var(--emoji-size)}.nav,.nav-button{align-items:center}.nav{display:grid;justify-content:space-between;contain:content}.nav-button{display:flex;justify-content:center}.nav-emoji{font-size:var(--category-emoji-size);width:var(--total-category-emoji-size);height:var(--total-category-emoji-size)}.indicator-wrapper{display:flex;border-bottom:1px solid var(--border-color)}.indicator{width:calc(100%/var(--num-groups));height:var(--indicator-height);opacity:var(--indicator-opacity);background-color:var(--indicator-color);will-change:transform,opacity;transition:opacity .1s linear,transform .25s ease-in-out}@media (prefers-reduced-motion:reduce){.indicator{will-change:opacity;transition:opacity .1s linear}}.pad-top,input.search{background:var(--background);width:100%}.pad-top{height:var(--emoji-padding);z-index:3}.search-row{display:flex;align-items:center;position:relative;padding-inline-start:var(--emoji-padding);padding-bottom:var(--emoji-padding)}.search-wrapper{flex:1;min-width:0}input.search{padding:var(--input-padding);border-radius:var(--input-border-radius);border:var(--input-border-size) solid var(--input-border-color);color:var(--input-font-color);font-size:var(--input-font-size);line-height:var(--input-line-height)}input.search::placeholder{color:var(--input-placeholder-color)}.favorites{display:flex;flex-direction:row;border-top:var(--border-size) solid var(--border-color);contain:content}.message{padding:var(--emoji-padding)}\";\n\nconst PROPS = [\n 'customEmoji',\n 'customCategorySorting',\n 'database',\n 'dataSource',\n 'i18n',\n 'locale',\n 'skinToneEmoji',\n 'emojiVersion'\n];\n\n// Styles injected ourselves, so we can declare the FONT_FAMILY variable in one place\nconst EXTRA_STYLES = `:host{--emoji-font-family:${FONT_FAMILY}}`;\n\nclass PickerElement extends HTMLElement {\n constructor (props) {\n super();\n this.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = baseStyles + EXTRA_STYLES;\n this.shadowRoot.appendChild(style);\n this._ctx = {\n // Set defaults\n locale: DEFAULT_LOCALE,\n dataSource: DEFAULT_DATA_SOURCE,\n skinToneEmoji: DEFAULT_SKIN_TONE_EMOJI,\n customCategorySorting: DEFAULT_CATEGORY_SORTING,\n customEmoji: null,\n i18n: enI18n,\n emojiVersion: null,\n ...props\n };\n // Handle properties set before the element was upgraded\n for (const prop of PROPS) {\n if (prop !== 'database' && Object.prototype.hasOwnProperty.call(this, prop)) {\n this._ctx[prop] = this[prop];\n delete this[prop];\n }\n }\n this._dbFlush(); // wait for a flush before creating the db, in case the user calls e.g. a setter or setAttribute\n }\n\n connectedCallback () {\n // The _cmp may be defined if the component was immediately disconnected and then reconnected. In that case,\n // do nothing (preserve the state)\n if (!this._cmp) {\n this._cmp = createRoot(this.shadowRoot, this._ctx);\n }\n }\n\n disconnectedCallback () {\n // Check in a microtask if the element is still connected. If so, treat this as a \"move\" rather than a disconnect\n // Inspired by Vue: https://vuejs.org/guide/extras/web-components.html#building-custom-elements-with-vue\n qM(() => {\n // this._cmp may be defined if connect-disconnect-connect-disconnect occurs synchronously\n if (!this.isConnected && this._cmp) {\n this._cmp.$destroy();\n this._cmp = undefined;\n\n const { database } = this._ctx;\n database.close()\n // only happens if the database failed to load in the first place, so we don't care\n .catch(err => console.error(err));\n }\n });\n }\n\n static get observedAttributes () {\n return ['locale', 'data-source', 'skin-tone-emoji', 'emoji-version'] // complex objects aren't supported, also use kebab-case\n }\n\n attributeChangedCallback (attrName, oldValue, newValue) {\n this._set(\n // convert from kebab-case to camelcase\n // see https://github.com/sveltejs/svelte/issues/3852#issuecomment-665037015\n attrName.replace(/-([a-z])/g, (_, up) => up.toUpperCase()),\n // convert string attribute to float if necessary\n attrName === 'emoji-version' ? parseFloat(newValue) : newValue\n );\n }\n\n _set (prop, newValue) {\n this._ctx[prop] = newValue;\n if (this._cmp) {\n this._cmp.$set({ [prop]: newValue });\n }\n if (['locale', 'dataSource'].includes(prop)) {\n this._dbFlush();\n }\n }\n\n _dbCreate () {\n const { locale, dataSource, database } = this._ctx;\n // only create a new database if we really need to\n if (!database || database.locale !== locale || database.dataSource !== dataSource) {\n this._set('database', new Database({ locale, dataSource }));\n }\n }\n\n // Update the Database in one microtask if the locale/dataSource change. We do one microtask\n // so we don't create two Databases if e.g. both the locale and the dataSource change\n _dbFlush () {\n qM(() => (\n this._dbCreate()\n ));\n }\n}\n\nconst definitions = {};\n\nfor (const prop of PROPS) {\n definitions[prop] = {\n get () {\n if (prop === 'database') {\n // in rare cases, the microtask may not be flushed yet, so we need to instantiate the DB\n // now if the user is asking for it\n this._dbCreate();\n }\n return this._ctx[prop]\n },\n set (val) {\n if (prop === 'database') {\n throw new Error('database is read-only')\n }\n this._set(prop, val);\n }\n };\n}\n\nObject.defineProperties(PickerElement.prototype, definitions);\n\n/* istanbul ignore else */\nif (!customElements.get('emoji-picker')) { // if already defined, do nothing (e.g. same script imported twice)\n customElements.define('emoji-picker', PickerElement);\n}\n\nexport { PickerElement as default };\n","function assertNonEmptyString (str) {\n if (typeof str !== 'string' || !str) {\n throw new Error('expected a non-empty string, got: ' + str)\n }\n}\n\nfunction assertNumber (number) {\n if (typeof number !== 'number') {\n throw new Error('expected a number, got: ' + number)\n }\n}\n\nconst DB_VERSION_CURRENT = 1;\nconst DB_VERSION_INITIAL = 1;\nconst STORE_EMOJI = 'emoji';\nconst STORE_KEYVALUE = 'keyvalue';\nconst STORE_FAVORITES = 'favorites';\nconst FIELD_TOKENS = 'tokens';\nconst INDEX_TOKENS = 'tokens';\nconst FIELD_UNICODE = 'unicode';\nconst INDEX_COUNT = 'count';\nconst FIELD_GROUP = 'group';\nconst FIELD_ORDER = 'order';\nconst INDEX_GROUP_AND_ORDER = 'group-order';\nconst KEY_ETAG = 'eTag';\nconst KEY_URL = 'url';\nconst KEY_PREFERRED_SKINTONE = 'skinTone';\nconst MODE_READONLY = 'readonly';\nconst MODE_READWRITE = 'readwrite';\nconst INDEX_SKIN_UNICODE = 'skinUnicodes';\nconst FIELD_SKIN_UNICODE = 'skinUnicodes';\n\nconst DEFAULT_DATA_SOURCE = 'https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json';\nconst DEFAULT_LOCALE = 'en';\n\n// like lodash's uniqBy but much smaller\nfunction uniqBy (arr, func) {\n const set = new Set();\n const res = [];\n for (const item of arr) {\n const key = func(item);\n if (!set.has(key)) {\n set.add(key);\n res.push(item);\n }\n }\n return res\n}\n\nfunction uniqEmoji (emojis) {\n return uniqBy(emojis, _ => _.unicode)\n}\n\nfunction initialMigration (db) {\n function createObjectStore (name, keyPath, indexes) {\n const store = keyPath\n ? db.createObjectStore(name, { keyPath })\n : db.createObjectStore(name);\n if (indexes) {\n for (const [indexName, [keyPath, multiEntry]] of Object.entries(indexes)) {\n store.createIndex(indexName, keyPath, { multiEntry });\n }\n }\n return store\n }\n\n createObjectStore(STORE_KEYVALUE);\n createObjectStore(STORE_EMOJI, /* keyPath */ FIELD_UNICODE, {\n [INDEX_TOKENS]: [FIELD_TOKENS, /* multiEntry */ true],\n [INDEX_GROUP_AND_ORDER]: [[FIELD_GROUP, FIELD_ORDER]],\n [INDEX_SKIN_UNICODE]: [FIELD_SKIN_UNICODE, /* multiEntry */ true]\n });\n createObjectStore(STORE_FAVORITES, undefined, {\n [INDEX_COUNT]: ['']\n });\n}\n\nconst openIndexedDBRequests = {};\nconst databaseCache = {};\nconst onCloseListeners = {};\n\nfunction handleOpenOrDeleteReq (resolve, reject, req) {\n // These things are almost impossible to test with fakeIndexedDB sadly\n /* istanbul ignore next */\n req.onerror = () => reject(req.error);\n /* istanbul ignore next */\n req.onblocked = () => reject(new Error('IDB blocked'));\n req.onsuccess = () => resolve(req.result);\n}\n\nasync function createDatabase (dbName) {\n const db = await new Promise((resolve, reject) => {\n const req = indexedDB.open(dbName, DB_VERSION_CURRENT);\n openIndexedDBRequests[dbName] = req;\n req.onupgradeneeded = e => {\n // Technically there is only one version, so we don't need this `if` check\n // But if an old version of the JS is in another browser tab\n // and it gets upgraded in the future and we have a new DB version, well...\n // better safe than sorry.\n /* istanbul ignore else */\n if (e.oldVersion < DB_VERSION_INITIAL) {\n initialMigration(req.result);\n }\n };\n handleOpenOrDeleteReq(resolve, reject, req);\n });\n // Handle abnormal closes, e.g. \"delete database\" in chrome dev tools.\n // No need for removeEventListener, because once the DB can no longer\n // fire \"close\" events, it will auto-GC.\n // Unfortunately cannot test in fakeIndexedDB: https://github.com/dumbmatter/fakeIndexedDB/issues/50\n /* istanbul ignore next */\n db.onclose = () => closeDatabase(dbName);\n return db\n}\n\nfunction openDatabase (dbName) {\n if (!databaseCache[dbName]) {\n databaseCache[dbName] = createDatabase(dbName);\n }\n return databaseCache[dbName]\n}\n\nfunction dbPromise (db, storeName, readOnlyOrReadWrite, cb) {\n return new Promise((resolve, reject) => {\n // Use relaxed durability because neither the emoji data nor the favorites/preferred skin tone\n // are really irreplaceable data. IndexedDB is just a cache in this case.\n const txn = db.transaction(storeName, readOnlyOrReadWrite, { durability: 'relaxed' });\n const store = typeof storeName === 'string'\n ? txn.objectStore(storeName)\n : storeName.map(name => txn.objectStore(name));\n let res;\n cb(store, txn, (result) => {\n res = result;\n });\n\n txn.oncomplete = () => resolve(res);\n /* istanbul ignore next */\n txn.onerror = () => reject(txn.error);\n })\n}\n\nfunction closeDatabase (dbName) {\n // close any open requests\n const req = openIndexedDBRequests[dbName];\n const db = req && req.result;\n if (db) {\n db.close();\n const listeners = onCloseListeners[dbName];\n /* istanbul ignore else */\n if (listeners) {\n for (const listener of listeners) {\n listener();\n }\n }\n }\n delete openIndexedDBRequests[dbName];\n delete databaseCache[dbName];\n delete onCloseListeners[dbName];\n}\n\nfunction deleteDatabase (dbName) {\n return new Promise((resolve, reject) => {\n // close any open requests\n closeDatabase(dbName);\n const req = indexedDB.deleteDatabase(dbName);\n handleOpenOrDeleteReq(resolve, reject, req);\n })\n}\n\n// The \"close\" event occurs during an abnormal shutdown, e.g. a user clearing their browser data.\n// However, it doesn't occur with the normal \"close\" event, so we handle that separately.\n// https://www.w3.org/TR/IndexedDB/#close-a-database-connection\nfunction addOnCloseListener (dbName, listener) {\n let listeners = onCloseListeners[dbName];\n if (!listeners) {\n listeners = onCloseListeners[dbName] = [];\n }\n listeners.push(listener);\n}\n\n// list of emoticons that don't match a simple \\W+ regex\n// extracted using:\n// require('emoji-picker-element-data/en/emojibase/data.json').map(_ => _.emoticon).filter(Boolean).filter(_ => !/^\\W+$/.test(_))\nconst irregularEmoticons = new Set([\n ':D', 'XD', \":'D\", 'O:)',\n ':X', ':P', ';P', 'XP',\n ':L', ':Z', ':j', '8D',\n 'XO', '8)', ':B', ':O',\n ':S', \":'o\", 'Dx', 'X(',\n 'D:', ':C', '>0)', ':3',\n ' {\n if (!word.match(/\\w/) || irregularEmoticons.has(word)) {\n // for pure emoticons like :) or :-), just leave them as-is\n return word.toLowerCase()\n }\n\n return word\n .replace(/[)(:,]/g, '')\n .replace(/’/g, \"'\")\n .toLowerCase()\n }).filter(Boolean)\n}\n\nconst MIN_SEARCH_TEXT_LENGTH = 2;\n\n// This is an extra step in addition to extractTokens(). The difference here is that we expect\n// the input to have already been run through extractTokens(). This is useful for cases like\n// emoticons, where we don't want to do any tokenization (because it makes no sense to split up\n// \">:)\" by the colon) but we do want to lowercase it to have consistent search results, so that\n// the user can type ':P' or ':p' and still get the same result.\nfunction normalizeTokens (str) {\n return str\n .filter(Boolean)\n .map(_ => _.toLowerCase())\n .filter(_ => _.length >= MIN_SEARCH_TEXT_LENGTH)\n}\n\n// Transform emoji data for storage in IDB\nfunction transformEmojiData (emojiData) {\n const res = emojiData.map(({ annotation, emoticon, group, order, shortcodes, skins, tags, emoji, version }) => {\n const tokens = [...new Set(\n normalizeTokens([\n ...(shortcodes || []).map(extractTokens).flat(),\n ...tags.map(extractTokens).flat(),\n ...extractTokens(annotation),\n emoticon\n ])\n )].sort();\n const res = {\n annotation,\n group,\n order,\n tags,\n tokens,\n unicode: emoji,\n version\n };\n if (emoticon) {\n res.emoticon = emoticon;\n }\n if (shortcodes) {\n res.shortcodes = shortcodes;\n }\n if (skins) {\n res.skinTones = [];\n res.skinUnicodes = [];\n res.skinVersions = [];\n for (const { tone, emoji, version } of skins) {\n res.skinTones.push(tone);\n res.skinUnicodes.push(emoji);\n res.skinVersions.push(version);\n }\n }\n return res\n });\n return res\n}\n\n// helper functions that help compress the code better\n\nfunction callStore (store, method, key, cb) {\n store[method](key).onsuccess = e => (cb && cb(e.target.result));\n}\n\nfunction getIDB (store, key, cb) {\n callStore(store, 'get', key, cb);\n}\n\nfunction getAllIDB (store, key, cb) {\n callStore(store, 'getAll', key, cb);\n}\n\nfunction commit (txn) {\n /* istanbul ignore else */\n if (txn.commit) {\n txn.commit();\n }\n}\n\n// like lodash's minBy\nfunction minBy (array, func) {\n let minItem = array[0];\n for (let i = 1; i < array.length; i++) {\n const item = array[i];\n if (func(minItem) > func(item)) {\n minItem = item;\n }\n }\n return minItem\n}\n\n// return an array of results representing all items that are found in each one of the arrays\n//\n\nfunction findCommonMembers (arrays, uniqByFunc) {\n const shortestArray = minBy(arrays, _ => _.length);\n const results = [];\n for (const item of shortestArray) {\n // if this item is included in every array in the intermediate results, add it to the final results\n if (!arrays.some(array => array.findIndex(_ => uniqByFunc(_) === uniqByFunc(item)) === -1)) {\n results.push(item);\n }\n }\n return results\n}\n\nasync function isEmpty (db) {\n return !(await get(db, STORE_KEYVALUE, KEY_URL))\n}\n\nasync function hasData (db, url, eTag) {\n const [oldETag, oldUrl] = await Promise.all([KEY_ETAG, KEY_URL]\n .map(key => get(db, STORE_KEYVALUE, key)));\n return (oldETag === eTag && oldUrl === url)\n}\n\nasync function doFullDatabaseScanForSingleResult (db, predicate) {\n // This batching algorithm is just a perf improvement over a basic\n // cursor. The BATCH_SIZE is an estimate of what would give the best\n // perf for doing a full DB scan (worst case).\n //\n // Mini-benchmark for determining the best batch size:\n //\n // PERF=1 pnpm build:rollup && pnpm test:adhoc\n //\n // (async () => {\n // performance.mark('start')\n // await $('emoji-picker').database.getEmojiByShortcode('doesnotexist')\n // performance.measure('total', 'start')\n // console.log(performance.getEntriesByName('total').slice(-1)[0].duration)\n // })()\n const BATCH_SIZE = 50; // Typically around 150ms for 6x slowdown in Chrome for above benchmark\n return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => {\n let lastKey;\n\n const processNextBatch = () => {\n emojiStore.getAll(lastKey && IDBKeyRange.lowerBound(lastKey, true), BATCH_SIZE).onsuccess = e => {\n const results = e.target.result;\n for (const result of results) {\n lastKey = result.unicode;\n if (predicate(result)) {\n return cb(result)\n }\n }\n if (results.length < BATCH_SIZE) {\n return cb()\n }\n processNextBatch();\n };\n };\n processNextBatch();\n })\n}\n\nasync function loadData (db, emojiData, url, eTag) {\n try {\n const transformedData = transformEmojiData(emojiData);\n await dbPromise(db, [STORE_EMOJI, STORE_KEYVALUE], MODE_READWRITE, ([emojiStore, metaStore], txn) => {\n let oldETag;\n let oldUrl;\n let todo = 0;\n\n function checkFetched () {\n if (++todo === 2) { // 2 requests made\n onFetched();\n }\n }\n\n function onFetched () {\n if (oldETag === eTag && oldUrl === url) {\n // check again within the transaction to guard against concurrency, e.g. multiple browser tabs\n return\n }\n // delete old data\n emojiStore.clear();\n // insert new data\n for (const data of transformedData) {\n emojiStore.put(data);\n }\n metaStore.put(eTag, KEY_ETAG);\n metaStore.put(url, KEY_URL);\n commit(txn);\n }\n\n getIDB(metaStore, KEY_ETAG, result => {\n oldETag = result;\n checkFetched();\n });\n\n getIDB(metaStore, KEY_URL, result => {\n oldUrl = result;\n checkFetched();\n });\n });\n } finally {\n }\n}\n\nasync function getEmojiByGroup (db, group) {\n return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => {\n const range = IDBKeyRange.bound([group, 0], [group + 1, 0], false, true);\n getAllIDB(emojiStore.index(INDEX_GROUP_AND_ORDER), range, cb);\n })\n}\n\nasync function getEmojiBySearchQuery (db, query) {\n const tokens = normalizeTokens(extractTokens(query));\n\n if (!tokens.length) {\n return []\n }\n\n return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => {\n // get all results that contain all tokens (i.e. an AND query)\n const intermediateResults = [];\n\n const checkDone = () => {\n if (intermediateResults.length === tokens.length) {\n onDone();\n }\n };\n\n const onDone = () => {\n const results = findCommonMembers(intermediateResults, _ => _.unicode);\n cb(results.sort((a, b) => a.order < b.order ? -1 : 1));\n };\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n const range = i === tokens.length - 1\n ? IDBKeyRange.bound(token, token + '\\uffff', false, true) // treat last token as a prefix search\n : IDBKeyRange.only(token); // treat all other tokens as an exact match\n getAllIDB(emojiStore.index(INDEX_TOKENS), range, result => {\n intermediateResults.push(result);\n checkDone();\n });\n }\n })\n}\n\n// This could have been implemented as an IDB index on shortcodes, but it seemed wasteful to do that\n// when we can already query by tokens and this will give us what we're looking for 99.9% of the time\nasync function getEmojiByShortcode (db, shortcode) {\n const emojis = await getEmojiBySearchQuery(db, shortcode);\n\n // In very rare cases (e.g. the shortcode \"v\" as in \"v for victory\"), we cannot search because\n // there are no usable tokens (too short in this case). In that case, we have to do an inefficient\n // full-database scan, which I believe is an acceptable tradeoff for not having to have an extra\n // index on shortcodes.\n\n if (!emojis.length) {\n const predicate = _ => ((_.shortcodes || []).includes(shortcode.toLowerCase()));\n return (await doFullDatabaseScanForSingleResult(db, predicate)) || null\n }\n\n return emojis.filter(_ => {\n const lowerShortcodes = (_.shortcodes || []).map(_ => _.toLowerCase());\n return lowerShortcodes.includes(shortcode.toLowerCase())\n })[0] || null\n}\n\nasync function getEmojiByUnicode (db, unicode) {\n return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => (\n getIDB(emojiStore, unicode, result => {\n if (result) {\n return cb(result)\n }\n getIDB(emojiStore.index(INDEX_SKIN_UNICODE), unicode, result => cb(result || null));\n })\n ))\n}\n\nfunction get (db, storeName, key) {\n return dbPromise(db, storeName, MODE_READONLY, (store, txn, cb) => (\n getIDB(store, key, cb)\n ))\n}\n\nfunction set (db, storeName, key, value) {\n return dbPromise(db, storeName, MODE_READWRITE, (store, txn) => {\n store.put(value, key);\n commit(txn);\n })\n}\n\nfunction incrementFavoriteEmojiCount (db, unicode) {\n return dbPromise(db, STORE_FAVORITES, MODE_READWRITE, (store, txn) => (\n getIDB(store, unicode, result => {\n store.put((result || 0) + 1, unicode);\n commit(txn);\n })\n ))\n}\n\nfunction getTopFavoriteEmoji (db, customEmojiIndex, limit) {\n if (limit === 0) {\n return []\n }\n return dbPromise(db, [STORE_FAVORITES, STORE_EMOJI], MODE_READONLY, ([favoritesStore, emojiStore], txn, cb) => {\n const results = [];\n favoritesStore.index(INDEX_COUNT).openCursor(undefined, 'prev').onsuccess = e => {\n const cursor = e.target.result;\n if (!cursor) { // no more results\n return cb(results)\n }\n\n function addResult (result) {\n results.push(result);\n if (results.length === limit) {\n return cb(results) // done, reached the limit\n }\n cursor.continue();\n }\n\n const unicodeOrName = cursor.primaryKey;\n const custom = customEmojiIndex.byName(unicodeOrName);\n if (custom) {\n return addResult(custom)\n }\n // This could be done in parallel (i.e. make the cursor and the get()s parallelized),\n // but my testing suggests it's not actually faster.\n getIDB(emojiStore, unicodeOrName, emoji => {\n if (emoji) {\n return addResult(emoji)\n }\n // emoji not found somehow, ignore (may happen if custom emoji change)\n cursor.continue();\n });\n };\n })\n}\n\n// trie data structure for prefix searches\n// loosely based on https://github.com/nolanlawson/substring-trie\n\nconst CODA_MARKER = ''; // marks the end of the string\n\nfunction trie (arr, itemToTokens) {\n const map = new Map();\n for (const item of arr) {\n const tokens = itemToTokens(item);\n for (const token of tokens) {\n let currentMap = map;\n for (let i = 0; i < token.length; i++) {\n const char = token.charAt(i);\n let nextMap = currentMap.get(char);\n if (!nextMap) {\n nextMap = new Map();\n currentMap.set(char, nextMap);\n }\n currentMap = nextMap;\n }\n let valuesAtCoda = currentMap.get(CODA_MARKER);\n if (!valuesAtCoda) {\n valuesAtCoda = [];\n currentMap.set(CODA_MARKER, valuesAtCoda);\n }\n valuesAtCoda.push(item);\n }\n }\n\n const search = (query, exact) => {\n let currentMap = map;\n for (let i = 0; i < query.length; i++) {\n const char = query.charAt(i);\n const nextMap = currentMap.get(char);\n if (nextMap) {\n currentMap = nextMap;\n } else {\n return []\n }\n }\n\n if (exact) {\n const results = currentMap.get(CODA_MARKER);\n return results || []\n }\n\n const results = [];\n // traverse\n const queue = [currentMap];\n while (queue.length) {\n const currentMap = queue.shift();\n const entriesSortedByKey = [...currentMap.entries()].sort((a, b) => a[0] < b[0] ? -1 : 1);\n for (const [key, value] of entriesSortedByKey) {\n if (key === CODA_MARKER) { // CODA_MARKER always comes first; it's the empty string\n results.push(...value);\n } else {\n queue.push(value);\n }\n }\n }\n return results\n };\n\n return search\n}\n\nconst requiredKeys$1 = [\n 'name',\n 'url'\n];\n\nfunction assertCustomEmojis (customEmojis) {\n const isArray = customEmojis && Array.isArray(customEmojis);\n const firstItemIsFaulty = isArray &&\n customEmojis.length &&\n (!customEmojis[0] || requiredKeys$1.some(key => !(key in customEmojis[0])));\n if (!isArray || firstItemIsFaulty) {\n throw new Error('Custom emojis are in the wrong format')\n }\n}\n\nfunction customEmojiIndex (customEmojis) {\n assertCustomEmojis(customEmojis);\n\n const sortByName = (a, b) => a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1;\n\n //\n // all()\n //\n const all = customEmojis.sort(sortByName);\n\n //\n // search()\n //\n const emojiToTokens = emoji => (\n [...new Set((emoji.shortcodes || []).map(shortcode => extractTokens(shortcode)).flat())]\n );\n const searchTrie = trie(customEmojis, emojiToTokens);\n const searchByExactMatch = _ => searchTrie(_, true);\n const searchByPrefix = _ => searchTrie(_, false);\n\n // Search by query for custom emoji. Similar to how we do this in IDB, the last token\n // is treated as a prefix search, but every other one is treated as an exact match.\n // Then we AND the results together\n const search = query => {\n const tokens = extractTokens(query);\n const intermediateResults = tokens.map((token, i) => (\n (i < tokens.length - 1 ? searchByExactMatch : searchByPrefix)(token)\n ));\n return findCommonMembers(intermediateResults, _ => _.name).sort(sortByName)\n };\n\n //\n // byShortcode, byName\n //\n const shortcodeToEmoji = new Map();\n const nameToEmoji = new Map();\n for (const customEmoji of customEmojis) {\n nameToEmoji.set(customEmoji.name.toLowerCase(), customEmoji);\n for (const shortcode of (customEmoji.shortcodes || [])) {\n shortcodeToEmoji.set(shortcode.toLowerCase(), customEmoji);\n }\n }\n\n const byShortcode = shortcode => shortcodeToEmoji.get(shortcode.toLowerCase());\n const byName = name => nameToEmoji.get(name.toLowerCase());\n\n return {\n all,\n search,\n byShortcode,\n byName\n }\n}\n\nconst isFirefoxContentScript = typeof wrappedJSObject !== 'undefined';\n\n// remove some internal implementation details, i.e. the \"tokens\" array on the emoji object\n// essentially, convert the emoji from the version stored in IDB to the version used in-memory\nfunction cleanEmoji (emoji) {\n if (!emoji) {\n return emoji\n }\n // if inside a Firefox content script, need to clone the emoji object to prevent Firefox from complaining about\n // cross-origin object. See: https://github.com/nolanlawson/emoji-picker-element/issues/356\n /* istanbul ignore if */\n if (isFirefoxContentScript) {\n emoji = structuredClone(emoji);\n }\n delete emoji.tokens;\n if (emoji.skinTones) {\n const len = emoji.skinTones.length;\n emoji.skins = Array(len);\n for (let i = 0; i < len; i++) {\n emoji.skins[i] = {\n tone: emoji.skinTones[i],\n unicode: emoji.skinUnicodes[i],\n version: emoji.skinVersions[i]\n };\n }\n delete emoji.skinTones;\n delete emoji.skinUnicodes;\n delete emoji.skinVersions;\n }\n return emoji\n}\n\nfunction warnETag (eTag) {\n if (!eTag) {\n console.warn('emoji-picker-element is more efficient if the dataSource server exposes an ETag header.');\n }\n}\n\nconst requiredKeys = [\n 'annotation',\n 'emoji',\n 'group',\n 'order',\n 'tags',\n 'version'\n];\n\nfunction assertEmojiData (emojiData) {\n if (!emojiData ||\n !Array.isArray(emojiData) ||\n !emojiData[0] ||\n (typeof emojiData[0] !== 'object') ||\n requiredKeys.some(key => (!(key in emojiData[0])))) {\n throw new Error('Emoji data is in the wrong format')\n }\n}\n\nfunction assertStatus (response, dataSource) {\n if (Math.floor(response.status / 100) !== 2) {\n throw new Error('Failed to fetch: ' + dataSource + ': ' + response.status)\n }\n}\n\nasync function getETag (dataSource) {\n const response = await fetch(dataSource, { method: 'HEAD' });\n assertStatus(response, dataSource);\n const eTag = response.headers.get('etag');\n warnETag(eTag);\n return eTag\n}\n\nasync function getETagAndData (dataSource) {\n const response = await fetch(dataSource);\n assertStatus(response, dataSource);\n const eTag = response.headers.get('etag');\n warnETag(eTag);\n const emojiData = await response.json();\n assertEmojiData(emojiData);\n return [eTag, emojiData]\n}\n\n// TODO: including these in blob-util.ts causes typedoc to generate docs for them,\n// even with --excludePrivate ¯\\_(ツ)_/¯\n/** @private */\n/**\n * Convert an `ArrayBuffer` to a binary string.\n *\n * Example:\n *\n * ```js\n * var myString = blobUtil.arrayBufferToBinaryString(arrayBuff)\n * ```\n *\n * @param buffer - array buffer\n * @returns binary string\n */\nfunction arrayBufferToBinaryString(buffer) {\n var binary = '';\n var bytes = new Uint8Array(buffer);\n var length = bytes.byteLength;\n var i = -1;\n while (++i < length) {\n binary += String.fromCharCode(bytes[i]);\n }\n return binary;\n}\n/**\n * Convert a binary string to an `ArrayBuffer`.\n *\n * ```js\n * var myBuffer = blobUtil.binaryStringToArrayBuffer(binaryString)\n * ```\n *\n * @param binary - binary string\n * @returns array buffer\n */\nfunction binaryStringToArrayBuffer(binary) {\n var length = binary.length;\n var buf = new ArrayBuffer(length);\n var arr = new Uint8Array(buf);\n var i = -1;\n while (++i < length) {\n arr[i] = binary.charCodeAt(i);\n }\n return buf;\n}\n\n// generate a checksum based on the stringified JSON\nasync function jsonChecksum (object) {\n const inString = JSON.stringify(object);\n let inBuffer = binaryStringToArrayBuffer(inString);\n\n // this does not need to be cryptographically secure, SHA-1 is fine\n const outBuffer = await crypto.subtle.digest('SHA-1', inBuffer);\n const outBinString = arrayBufferToBinaryString(outBuffer);\n const res = btoa(outBinString);\n return res\n}\n\nasync function checkForUpdates (db, dataSource) {\n // just do a simple HEAD request first to see if the eTags match\n let emojiData;\n let eTag = await getETag(dataSource);\n if (!eTag) { // work around lack of ETag/Access-Control-Expose-Headers\n const eTagAndData = await getETagAndData(dataSource);\n eTag = eTagAndData[0];\n emojiData = eTagAndData[1];\n if (!eTag) {\n eTag = await jsonChecksum(emojiData);\n }\n }\n if (await hasData(db, dataSource, eTag)) ; else {\n if (!emojiData) {\n const eTagAndData = await getETagAndData(dataSource);\n emojiData = eTagAndData[1];\n }\n await loadData(db, emojiData, dataSource, eTag);\n }\n}\n\nasync function loadDataForFirstTime (db, dataSource) {\n let [eTag, emojiData] = await getETagAndData(dataSource);\n if (!eTag) {\n // Handle lack of support for ETag or Access-Control-Expose-Headers\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers#Browser_compatibility\n eTag = await jsonChecksum(emojiData);\n }\n\n await loadData(db, emojiData, dataSource, eTag);\n}\n\nclass Database {\n constructor ({ dataSource = DEFAULT_DATA_SOURCE, locale = DEFAULT_LOCALE, customEmoji = [] } = {}) {\n this.dataSource = dataSource;\n this.locale = locale;\n this._dbName = `emoji-picker-element-${this.locale}`;\n this._db = undefined;\n this._lazyUpdate = undefined;\n this._custom = customEmojiIndex(customEmoji);\n\n this._clear = this._clear.bind(this);\n this._ready = this._init();\n }\n\n async _init () {\n const db = this._db = await openDatabase(this._dbName);\n\n addOnCloseListener(this._dbName, this._clear);\n const dataSource = this.dataSource;\n const empty = await isEmpty(db);\n\n if (empty) {\n await loadDataForFirstTime(db, dataSource);\n } else { // offline-first - do an update asynchronously\n this._lazyUpdate = checkForUpdates(db, dataSource);\n }\n }\n\n async ready () {\n const checkReady = async () => {\n if (!this._ready) {\n this._ready = this._init();\n }\n return this._ready\n };\n await checkReady();\n // There's a possibility of a race condition where the element gets added, removed, and then added again\n // with a particular timing, which would set the _db to undefined.\n // We *could* do a while loop here, but that seems excessive and could lead to an infinite loop.\n if (!this._db) {\n await checkReady();\n }\n }\n\n async getEmojiByGroup (group) {\n assertNumber(group);\n await this.ready();\n return uniqEmoji(await getEmojiByGroup(this._db, group)).map(cleanEmoji)\n }\n\n async getEmojiBySearchQuery (query) {\n assertNonEmptyString(query);\n await this.ready();\n const customs = this._custom.search(query);\n const natives = uniqEmoji(await getEmojiBySearchQuery(this._db, query)).map(cleanEmoji);\n return [\n ...customs,\n ...natives\n ]\n }\n\n async getEmojiByShortcode (shortcode) {\n assertNonEmptyString(shortcode);\n await this.ready();\n const custom = this._custom.byShortcode(shortcode);\n if (custom) {\n return custom\n }\n return cleanEmoji(await getEmojiByShortcode(this._db, shortcode))\n }\n\n async getEmojiByUnicodeOrName (unicodeOrName) {\n assertNonEmptyString(unicodeOrName);\n await this.ready();\n const custom = this._custom.byName(unicodeOrName);\n if (custom) {\n return custom\n }\n return cleanEmoji(await getEmojiByUnicode(this._db, unicodeOrName))\n }\n\n async getPreferredSkinTone () {\n await this.ready();\n return (await get(this._db, STORE_KEYVALUE, KEY_PREFERRED_SKINTONE)) || 0\n }\n\n async setPreferredSkinTone (skinTone) {\n assertNumber(skinTone);\n await this.ready();\n return set(this._db, STORE_KEYVALUE, KEY_PREFERRED_SKINTONE, skinTone)\n }\n\n async incrementFavoriteEmojiCount (unicodeOrName) {\n assertNonEmptyString(unicodeOrName);\n await this.ready();\n return incrementFavoriteEmojiCount(this._db, unicodeOrName)\n }\n\n async getTopFavoriteEmoji (limit) {\n assertNumber(limit);\n await this.ready();\n return (await getTopFavoriteEmoji(this._db, this._custom, limit)).map(cleanEmoji)\n }\n\n set customEmoji (customEmojis) {\n this._custom = customEmojiIndex(customEmojis);\n }\n\n get customEmoji () {\n return this._custom.all\n }\n\n async _shutdown () {\n await this.ready(); // reopen if we've already been closed/deleted\n try {\n await this._lazyUpdate; // allow any lazy updates to process before closing/deleting\n } catch (err) { /* ignore network errors (offline-first) */ }\n }\n\n // clear references to IDB, e.g. during a close event\n _clear () {\n // We don't need to call removeEventListener or remove the manual \"close\" listeners.\n // The memory leak tests prove this is unnecessary. It's because:\n // 1) IDBDatabases that can no longer fire \"close\" automatically have listeners GCed\n // 2) we clear the manual close listeners in databaseLifecycle.js.\n this._db = this._ready = this._lazyUpdate = undefined;\n }\n\n async close () {\n await this._shutdown();\n await closeDatabase(this._dbName);\n }\n\n async delete () {\n await this._shutdown();\n await deleteDatabase(this._dbName);\n }\n}\n\nexport { Database as default };\n","var browserSupportsTextareaTextNodes;\n/**\n * @param {HTMLElement} input\n * @return {boolean}\n */\n\nfunction canManipulateViaTextNodes(input) {\n if (input.nodeName !== \"TEXTAREA\") {\n return false;\n }\n\n if (typeof browserSupportsTextareaTextNodes === \"undefined\") {\n var textarea = document.createElement(\"textarea\");\n textarea.value = 1;\n browserSupportsTextareaTextNodes = !!textarea.firstChild;\n }\n\n return browserSupportsTextareaTextNodes;\n}\n/**\n * @param {HTMLTextAreaElement|HTMLInputElement} input\n * @param {string} text\n * @returns {void}\n */\n\n\nfunction index (input, text) {\n // Most of the used APIs only work with the field selected\n input.focus(); // IE 8-10\n\n if (document.selection) {\n var ieRange = document.selection.createRange();\n ieRange.text = text; // Move cursor after the inserted text\n\n ieRange.collapse(false\n /* to the end */\n );\n ieRange.select();\n return;\n } // Webkit + Edge\n\n\n var isSuccess = document.execCommand(\"insertText\", false, text);\n\n if (!isSuccess) {\n var start = input.selectionStart;\n var end = input.selectionEnd; // Firefox (non-standard method)\n\n if (typeof input.setRangeText === \"function\") {\n input.setRangeText(text);\n } else {\n // To make a change we just need a Range, not a Selection\n var range = document.createRange();\n var textNode = document.createTextNode(text);\n\n if (canManipulateViaTextNodes(input)) {\n var node = input.firstChild; // If textarea is empty, just insert the text\n\n if (!node) {\n input.appendChild(textNode);\n } else {\n // Otherwise we need to find a nodes for start and end\n var offset = 0;\n var startNode = null;\n var endNode = null;\n\n while (node && (startNode === null || endNode === null)) {\n var nodeLength = node.nodeValue.length; // if start of the selection falls into current node\n\n if (start >= offset && start <= offset + nodeLength) {\n range.setStart(startNode = node, start - offset);\n } // if end of the selection falls into current node\n\n\n if (end >= offset && end <= offset + nodeLength) {\n range.setEnd(endNode = node, end - offset);\n }\n\n offset += nodeLength;\n node = node.nextSibling;\n } // If there is some text selected, remove it as we should replace it\n\n\n if (start !== end) {\n range.deleteContents();\n }\n }\n } // If the node is a textarea and the range doesn't span outside the element\n //\n // Get the commonAncestorContainer of the selected range and test its type\n // If the node is of type `#text` it means that we're still working with text nodes within our textarea element\n // otherwise, if it's of type `#document` for example it means our selection spans outside the textarea.\n\n\n if (canManipulateViaTextNodes(input) && range.commonAncestorContainer.nodeName === \"#text\") {\n // Finally insert a new node. The browser will automatically split start and end nodes into two if necessary\n range.insertNode(textNode);\n } else {\n // If the node is not a textarea or the range spans outside a textarea the only way is to replace the whole value\n var value = input.value;\n input.value = value.slice(0, start) + text + value.slice(end);\n }\n } // Correct the cursor position to be at the end of the insertion\n\n\n input.setSelectionRange(start + text.length, start + text.length); // Notify any possible listeners of the change\n\n var e = document.createEvent(\"UIEvent\");\n e.initEvent(\"input\", true, false);\n input.dispatchEvent(e);\n }\n}\n\nexport default index;\n//# sourceMappingURL=index.esm.js.map\n","let browserSupportsTextareaTextNodes;\n\n/**\n * @param {HTMLElement} input\n * @return {boolean}\n */\nfunction canManipulateViaTextNodes(input) {\n if (input.nodeName !== \"TEXTAREA\") {\n return false;\n }\n if (typeof browserSupportsTextareaTextNodes === \"undefined\") {\n const textarea = document.createElement(\"textarea\");\n textarea.value = 1;\n browserSupportsTextareaTextNodes = !!textarea.firstChild;\n }\n return browserSupportsTextareaTextNodes;\n}\n\n/**\n * @param {HTMLTextAreaElement|HTMLInputElement} input\n * @param {string} text\n * @returns {void}\n */\nexport default function(input, text) {\n // Most of the used APIs only work with the field selected\n input.focus();\n\n // IE 8-10\n if (document.selection) {\n const ieRange = document.selection.createRange();\n ieRange.text = text;\n\n // Move cursor after the inserted text\n ieRange.collapse(false /* to the end */);\n ieRange.select();\n\n return;\n }\n\n // Webkit + Edge\n const isSuccess = document.execCommand(\"insertText\", false, text);\n if (!isSuccess) {\n const start = input.selectionStart;\n const end = input.selectionEnd;\n // Firefox (non-standard method)\n if (typeof input.setRangeText === \"function\") {\n input.setRangeText(text);\n } else {\n // To make a change we just need a Range, not a Selection\n const range = document.createRange();\n const textNode = document.createTextNode(text);\n\n if (canManipulateViaTextNodes(input)) {\n let node = input.firstChild;\n\n // If textarea is empty, just insert the text\n if (!node) {\n input.appendChild(textNode);\n } else {\n // Otherwise we need to find a nodes for start and end\n let offset = 0;\n let startNode = null;\n let endNode = null;\n\n while (node && (startNode === null || endNode === null)) {\n const nodeLength = node.nodeValue.length;\n\n // if start of the selection falls into current node\n if (start >= offset && start <= offset + nodeLength) {\n range.setStart((startNode = node), start - offset);\n }\n\n // if end of the selection falls into current node\n if (end >= offset && end <= offset + nodeLength) {\n range.setEnd((endNode = node), end - offset);\n }\n\n offset += nodeLength;\n node = node.nextSibling;\n }\n\n // If there is some text selected, remove it as we should replace it\n if (start !== end) {\n range.deleteContents();\n }\n }\n }\n\n // If the node is a textarea and the range doesn't span outside the element\n //\n // Get the commonAncestorContainer of the selected range and test its type\n // If the node is of type `#text` it means that we're still working with text nodes within our textarea element\n // otherwise, if it's of type `#document` for example it means our selection spans outside the textarea.\n if (\n canManipulateViaTextNodes(input) &&\n range.commonAncestorContainer.nodeName === \"#text\"\n ) {\n // Finally insert a new node. The browser will automatically split start and end nodes into two if necessary\n range.insertNode(textNode);\n } else {\n // If the node is not a textarea or the range spans outside a textarea the only way is to replace the whole value\n const value = input.value;\n input.value = value.slice(0, start) + text + value.slice(end);\n }\n }\n\n // Correct the cursor position to be at the end of the insertion\n input.setSelectionRange(start + text.length, start + text.length);\n\n // Notify any possible listeners of the change\n const e = document.createEvent(\"UIEvent\");\n e.initEvent(\"input\", true, false);\n input.dispatchEvent(e);\n }\n}\n","function a(a){return null!==a&&\"object\"==typeof a?\"share\"in navigator&&\"canShare\"in navigator&&navigator.canShare(a):\"share\"in navigator}export{a as isWebShareSupported};\n//# sourceMappingURL=is-web-share-supported.js.map\n","function $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $e179325634270afd$exports = {};\n\n$parcel$export($e179325634270afd$exports, \"WebShare\", function () { return $e179325634270afd$export$30b344bef3e55b67; });\n// @ts-check\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */ /**\n * Represents the data to share.\n *\n * @typedef {Object} ShareData\n * @property {string} [url] - The URL to share.\n * @property {string} [title] - The title to share.\n * @property {string} [text] - The text to share.\n * @property {File[]} [files] - The files to share.\n */ const $e179325634270afd$var$styles = /* css */ `\n :host {\n display: inline-block;\n }\n`;\nconst $e179325634270afd$var$template = document.createElement(\"template\");\n$e179325634270afd$var$template.innerHTML = /* html */ `\n \n \n`;\n/**\n * @summary A custom element that provides a button to share content.\n * @documentation https://github.com/georapbox/web-share-element\n *\n * @tagname web-share - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {boolean} disabled - Indicates whether the button is disabled.\n * @property {string} shareUrl - The URL to share.\n * @property {string} shareTitle - The title to share.\n * @property {string} shareText - The text to share.\n * @property {File[]} shareFiles - The files to share.\n *\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {string} share-url - Reflects the shareUrl property.\n * @attribute {string} share-title - Reflects the shareTitle property.\n * @attribute {string} share-text - Reflects the shareText property.\n *\n * @slot button - The button to share content.\n * @slot button-content - The content of the button to share content.\n *\n * @csspart button - The button to share content.\n * @csspart button--disabled - The button to share content when disabled.\n *\n * @event web-share:success - Fired when the share operation is successful.\n * @event web-share:abort - Fired when the share operation is aborted.\n * @event web-share:error - Fired when the share operation fails.\n *\n * @method defineCustomElement - Static method. Defines the custom element with the given name.\n * @method share - Instance method. Shares the shareable data taken from the element's properties.\n */ class $e179325634270afd$export$30b344bef3e55b67 extends HTMLElement {\n /** @type {Nullable} */ #buttonSlot;\n /** @type {Nullable} */ #buttonEl;\n /** @type {File[]} */ #files = [];\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\",\n delegatesFocus: true\n });\n shadowRoot.appendChild($e179325634270afd$var$template.content.cloneNode(true));\n }\n this.#buttonSlot = this.shadowRoot?.querySelector('slot[name=\"button\"]') || null;\n this.#buttonEl = this.#getButton();\n }\n static get observedAttributes() {\n return [\n \"disabled\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"disabled\" && oldValue !== newValue && this.#buttonEl) {\n this.#buttonEl.toggleAttribute(\"disabled\", this.disabled);\n this.#buttonEl.setAttribute(\"aria-disabled\", this.disabled.toString());\n if (this.#buttonEl.part && this.#buttonEl.part.contains(\"button\")) this.#buttonEl.part.toggle(\"button--disabled\", this.disabled);\n }\n }\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"shareUrl\");\n this.#upgradeProperty(\"shareTitle\");\n this.#upgradeProperty(\"shareText\");\n this.#upgradeProperty(\"shareFiles\");\n this.#upgradeProperty(\"disabled\");\n this.#buttonSlot?.addEventListener(\"slotchange\", this.#handleSlotChange);\n this.#buttonEl?.addEventListener(\"click\", this.#handleClick);\n }\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */ disconnectedCallback() {\n this.#buttonSlot?.removeEventListener(\"slotchange\", this.#handleSlotChange);\n this.#buttonEl?.removeEventListener(\"click\", this.#handleClick);\n }\n /**\n * @type {boolean} - Indicates whether the button is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */ get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(value) {\n this.toggleAttribute(\"disabled\", !!value);\n }\n /**\n * @type {string} - The URL to share.\n * @attribute share-url - Reflects the shareUrl property.\n */ get shareUrl() {\n return this.getAttribute(\"share-url\") || \"\";\n }\n set shareUrl(value) {\n this.setAttribute(\"share-url\", value);\n }\n /**\n * @type {string} - The title to share.\n * @attribute share-title - Reflects the shareTitle property.\n */ get shareTitle() {\n return this.getAttribute(\"share-title\") || \"\";\n }\n set shareTitle(value) {\n this.setAttribute(\"share-title\", value);\n }\n /**\n * @type {string} - The text to share.\n * @attribute share-text - Reflects the shareText property.\n */ get shareText() {\n return this.getAttribute(\"share-text\") || \"\";\n }\n set shareText(value) {\n this.setAttribute(\"share-text\", value);\n }\n /**\n * @type {File[]} - The files to share.\n */ get shareFiles() {\n return this.#files;\n }\n set shareFiles(value) {\n if (Array.isArray(value) && value.length > 0) this.#files = value;\n }\n /**\n * Shares the shareable data taken from the element's properties.\n *\n * @returns {Promise} - A promise that resolves when the share operation is complete.\n */ async share() {\n if (this.disabled) return;\n try {\n /** @type {ShareData} */ const shareData = {};\n if (this.shareUrl) shareData.url = this.shareUrl;\n if (this.shareTitle) shareData.title = this.shareTitle;\n if (this.shareText) shareData.text = this.shareText;\n if (Array.isArray(this.shareFiles) && this.shareFiles.length > 0 && navigator.canShare && navigator.canShare({\n files: this.shareFiles\n })) shareData.files = this.shareFiles;\n await navigator.share(shareData);\n this.dispatchEvent(new CustomEvent(\"web-share:success\", {\n bubbles: true,\n composed: true,\n detail: {\n shareData: shareData\n }\n }));\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n this.dispatchEvent(new CustomEvent(\"web-share:abort\", {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n return;\n }\n this.dispatchEvent(new CustomEvent(\"web-share:error\", {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }\n }\n /**\n * Handles the click event on the button.\n *\n * @param {any} evt - The event object.\n */ #handleClick = (evt)=>{\n evt.preventDefault();\n if (this.disabled) return;\n this.share();\n };\n /**\n * Handles the slotchange event on the button slot.\n *\n * @param {any} evt - The event object.\n */ #handleSlotChange = (evt)=>{\n if (evt.target && evt.target.name === \"button\") {\n this.#buttonEl?.removeEventListener(\"click\", this.#handleClick);\n this.#buttonEl = this.#getButton();\n if (this.#buttonEl) {\n this.#buttonEl.addEventListener(\"click\", this.#handleClick);\n if (this.#buttonEl.nodeName !== \"BUTTON\" && !this.#buttonEl.hasAttribute(\"role\")) this.#buttonEl.setAttribute(\"role\", \"button\");\n }\n }\n };\n /**\n * Returns the button element from the button slot.\n *\n * @returns {Nullable} - The button element.\n */ #getButton() {\n if (!this.#buttonSlot) return null;\n return this.#buttonSlot.assignedElements({\n flatten: true\n }).find((el)=>{\n return el.nodeName === \"BUTTON\" || el.getAttribute(\"slot\") === \"button\";\n }) || null;\n }\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'shareUrl' | 'shareTitle' | 'shareText' | 'shareFiles' | 'disabled'} prop - The property name to upgrade.\n */ #upgradeProperty(prop) {\n /** @type {any} */ const instance = this;\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n static defineCustomElement(elementName = \"web-share\") {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $e179325634270afd$export$30b344bef3e55b67);\n }\n}\n\n\n(0, $e179325634270afd$export$30b344bef3e55b67).defineCustomElement();\n\n\nexport {$e179325634270afd$export$30b344bef3e55b67 as WebShare};\n//# sourceMappingURL=web-share-defined.js.map\n","// @ts-check\n\n/**\n * Check if Web Share API is supported by the platform.\n *\n * @param {import('./web-share').ShareData} [options]\n * @returns {boolean} Returns `true` if Web Share API is supported; otherwise `false`.\n */\nfunction isWebShareSupported(options) {\n if (options !== null && typeof options === 'object') {\n return 'share' in navigator && 'canShare' in navigator && navigator.canShare(options);\n }\n\n return 'share' in navigator;\n}\n\nexport { isWebShareSupported };\n","Object.defineProperty({},\"WebShare\",{get:function(){return s},set:void 0,enumerable:!0,configurable:!0});let t=`\n :host {\n display: inline-block;\n }\n`,e=document.createElement(\"template\");e.innerHTML=`\n \n \n`;class s extends HTMLElement{#t;#e;#s=[];constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\",delegatesFocus:!0}).appendChild(e.content.cloneNode(!0)),this.#t=this.shadowRoot?.querySelector('slot[name=\"button\"]')||null,this.#e=this.#i()}static get observedAttributes(){return[\"disabled\"]}attributeChangedCallback(t,e,s){\"disabled\"===t&&e!==s&&this.#e&&(this.#e.toggleAttribute(\"disabled\",this.disabled),this.#e.setAttribute(\"aria-disabled\",this.disabled.toString()),this.#e.part&&this.#e.part.contains(\"button\")&&this.#e.part.toggle(\"button--disabled\",this.disabled))}connectedCallback(){this.#r(\"shareUrl\"),this.#r(\"shareTitle\"),this.#r(\"shareText\"),this.#r(\"shareFiles\"),this.#r(\"disabled\"),this.#t?.addEventListener(\"slotchange\",this.#a),this.#e?.addEventListener(\"click\",this.#n)}disconnectedCallback(){this.#t?.removeEventListener(\"slotchange\",this.#a),this.#e?.removeEventListener(\"click\",this.#n)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){this.toggleAttribute(\"disabled\",!!t)}get shareUrl(){return this.getAttribute(\"share-url\")||\"\"}set shareUrl(t){this.setAttribute(\"share-url\",t)}get shareTitle(){return this.getAttribute(\"share-title\")||\"\"}set shareTitle(t){this.setAttribute(\"share-title\",t)}get shareText(){return this.getAttribute(\"share-text\")||\"\"}set shareText(t){this.setAttribute(\"share-text\",t)}get shareFiles(){return this.#s}set shareFiles(t){Array.isArray(t)&&t.length>0&&(this.#s=t)}async share(){if(!this.disabled)try{let t={};this.shareUrl&&(t.url=this.shareUrl),this.shareTitle&&(t.title=this.shareTitle),this.shareText&&(t.text=this.shareText),Array.isArray(this.shareFiles)&&this.shareFiles.length>0&&navigator.canShare&&navigator.canShare({files:this.shareFiles})&&(t.files=this.shareFiles),await navigator.share(t),this.dispatchEvent(new CustomEvent(\"web-share:success\",{bubbles:!0,composed:!0,detail:{shareData:t}}))}catch(t){if(t instanceof Error&&\"AbortError\"===t.name){this.dispatchEvent(new CustomEvent(\"web-share:abort\",{bubbles:!0,composed:!0,detail:{error:t}}));return}this.dispatchEvent(new CustomEvent(\"web-share:error\",{bubbles:!0,composed:!0,detail:{error:t}}))}}#n=t=>{t.preventDefault(),this.disabled||this.share()};#a=t=>{t.target&&\"button\"===t.target.name&&(this.#e?.removeEventListener(\"click\",this.#n),this.#e=this.#i(),this.#e&&(this.#e.addEventListener(\"click\",this.#n),\"BUTTON\"===this.#e.nodeName||this.#e.hasAttribute(\"role\")||this.#e.setAttribute(\"role\",\"button\")))};#i(){return this.#t&&this.#t.assignedElements({flatten:!0}).find(t=>\"BUTTON\"===t.nodeName||\"button\"===t.getAttribute(\"slot\"))||null}#r(t){if(Object.prototype.hasOwnProperty.call(this,t)){let e=this[t];delete this[t],this[t]=e}}static defineCustomElement(t=\"web-share\"){\"undefined\"==typeof window||window.customElements.get(t)||window.customElements.define(t,s)}}s.defineCustomElement();export{s as WebShare};\n//# sourceMappingURL=web-share-defined.js.map\n","import { WebShare } from './web-share.js';\n\nWebShare.defineCustomElement();\n\nexport { WebShare };\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\n/**\n * Represents the data to share.\n *\n * @typedef {Object} ShareData\n * @property {string} [url] - The URL to share.\n * @property {string} [title] - The title to share.\n * @property {string} [text] - The text to share.\n * @property {File[]} [files] - The files to share.\n */\n\nconst styles = /* css */`\n :host {\n display: inline-block;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */ `\n \n \n`;\n\n/**\n * @summary A custom element that provides a button to share content.\n * @documentation https://github.com/georapbox/web-share-element\n *\n * @tagname web-share - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {boolean} disabled - Indicates whether the button is disabled.\n * @property {string} shareUrl - The URL to share.\n * @property {string} shareTitle - The title to share.\n * @property {string} shareText - The text to share.\n * @property {File[]} shareFiles - The files to share.\n *\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {string} share-url - Reflects the shareUrl property.\n * @attribute {string} share-title - Reflects the shareTitle property.\n * @attribute {string} share-text - Reflects the shareText property.\n *\n * @slot button - The button to share content.\n * @slot button-content - The content of the button to share content.\n *\n * @csspart button - The button to share content.\n * @csspart button--disabled - The button to share content when disabled.\n *\n * @event web-share:success - Fired when the share operation is successful.\n * @event web-share:abort - Fired when the share operation is aborted.\n * @event web-share:error - Fired when the share operation fails.\n *\n * @method defineCustomElement - Static method. Defines the custom element with the given name.\n * @method share - Instance method. Shares the shareable data taken from the element's properties.\n */\nclass WebShare extends HTMLElement {\n /** @type {Nullable} */\n #buttonSlot;\n\n /** @type {Nullable} */\n #buttonEl;\n\n /** @type {File[]} */\n #files = [];\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#buttonSlot = this.shadowRoot?.querySelector('slot[name=\"button\"]') || null;\n this.#buttonEl = this.#getButton();\n }\n\n static get observedAttributes() {\n return ['disabled'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'disabled' && oldValue !== newValue && this.#buttonEl) {\n this.#buttonEl.toggleAttribute('disabled', this.disabled);\n this.#buttonEl.setAttribute('aria-disabled', this.disabled.toString());\n\n if (this.#buttonEl.part && this.#buttonEl.part.contains('button')) {\n this.#buttonEl.part.toggle('button--disabled', this.disabled);\n }\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('shareUrl');\n this.#upgradeProperty('shareTitle');\n this.#upgradeProperty('shareText');\n this.#upgradeProperty('shareFiles');\n this.#upgradeProperty('disabled');\n\n this.#buttonSlot?.addEventListener('slotchange', this.#handleSlotChange);\n this.#buttonEl?.addEventListener('click', this.#handleClick);\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#buttonSlot?.removeEventListener('slotchange', this.#handleSlotChange);\n this.#buttonEl?.removeEventListener('click', this.#handleClick);\n }\n\n /**\n * @type {boolean} - Indicates whether the button is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value) {\n this.toggleAttribute('disabled', !!value);\n }\n\n /**\n * @type {string} - The URL to share.\n * @attribute share-url - Reflects the shareUrl property.\n */\n get shareUrl() {\n return this.getAttribute('share-url') || '';\n }\n\n set shareUrl(value) {\n this.setAttribute('share-url', value);\n }\n\n /**\n * @type {string} - The title to share.\n * @attribute share-title - Reflects the shareTitle property.\n */\n get shareTitle() {\n return this.getAttribute('share-title') || '';\n }\n\n set shareTitle(value) {\n this.setAttribute('share-title', value);\n }\n\n /**\n * @type {string} - The text to share.\n * @attribute share-text - Reflects the shareText property.\n */\n get shareText() {\n return this.getAttribute('share-text') || '';\n }\n\n set shareText(value) {\n this.setAttribute('share-text', value);\n }\n\n /**\n * @type {File[]} - The files to share.\n */\n get shareFiles() {\n return this.#files;\n }\n\n set shareFiles(value) {\n if (Array.isArray(value) && value.length > 0) {\n this.#files = value;\n }\n }\n\n /**\n * Shares the shareable data taken from the element's properties.\n *\n * @returns {Promise} - A promise that resolves when the share operation is complete.\n */\n async share() {\n if (this.disabled) {\n return;\n }\n\n try {\n /** @type {ShareData} */\n const shareData = {};\n\n if (this.shareUrl) {\n shareData.url = this.shareUrl;\n }\n\n if (this.shareTitle) {\n shareData.title = this.shareTitle;\n }\n\n if (this.shareText) {\n shareData.text = this.shareText;\n }\n\n if (\n Array.isArray(this.shareFiles)\n && this.shareFiles.length > 0\n && navigator.canShare\n && navigator.canShare({ files: this.shareFiles })\n ) {\n shareData.files = this.shareFiles;\n }\n\n await navigator.share(shareData);\n\n this.dispatchEvent(new CustomEvent('web-share:success', {\n bubbles: true,\n composed: true,\n detail: { shareData }\n }));\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n this.dispatchEvent(new CustomEvent('web-share:abort', {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n\n return;\n }\n\n this.dispatchEvent(new CustomEvent('web-share:error', {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n }\n\n /**\n * Handles the click event on the button.\n *\n * @param {any} evt - The event object.\n */\n #handleClick = evt => {\n evt.preventDefault();\n\n if (this.disabled) {\n return;\n }\n\n this.share();\n };\n\n /**\n * Handles the slotchange event on the button slot.\n *\n * @param {any} evt - The event object.\n */\n #handleSlotChange = evt => {\n if (evt.target && evt.target.name === 'button') {\n this.#buttonEl?.removeEventListener('click', this.#handleClick);\n this.#buttonEl = this.#getButton();\n\n if (this.#buttonEl) {\n this.#buttonEl.addEventListener('click', this.#handleClick);\n\n if (this.#buttonEl.nodeName !== 'BUTTON' && !this.#buttonEl.hasAttribute('role')) {\n this.#buttonEl.setAttribute('role', 'button');\n }\n }\n }\n };\n\n /**\n * Returns the button element from the button slot.\n *\n * @returns {Nullable} - The button element.\n */\n #getButton() {\n if (!this.#buttonSlot) {\n return null;\n }\n\n return this.#buttonSlot.assignedElements({ flatten: true }).find(el => {\n return el.nodeName === 'BUTTON' || el.getAttribute('slot') === 'button';\n }) || null;\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'shareUrl' | 'shareTitle' | 'shareText' | 'shareFiles' | 'disabled'} prop - The property name to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n static defineCustomElement(elementName = 'web-share') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, WebShare);\n }\n }\n}\n\nexport { WebShare };\n","Object.defineProperty({},\"CapturePhoto\",{get:function(){return n},set:void 0,enumerable:!0,configurable:!0});let t=(t,e,i)=>(Number.isNaN(e)&&(e=0),Number.isNaN(i)&&(i=0),Math.min(Math.max(t,Math.min(e,i)),Math.max(e,i))),e=\"capture-photo\",i=`\n :host {\n display: block;\n box-sizing: border-box;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none;\n }\n\n video {\n display: block;\n }\n\n #output:empty {\n display: none;\n }\n`,o=document.createElement(\"template\");o.innerHTML=`\n \n\n \n\n \n\n
\n \n \n \n\n \n\n \n
\n\n \n\n
\n`;class n extends HTMLElement{#t={};#e=null;#i=null;#o=null;#n=null;#a=null;#s=null;#r=null;#l=null;constructor(){super(),this.#t=this.getSupportedConstraints(),this.shadowRoot||this.attachShadow({mode:\"open\"}).appendChild(o.content.cloneNode(!0))}static get observedAttributes(){return[\"no-image\",\"facing-mode\",\"camera-resolution\",\"pan\",\"tilt\",\"zoom\"]}attributeChangedCallback(t,e,i){if(!this.isConnected)return;let o=this.getTrackCapabilities(),n=this.getTrackSettings();if(\"no-image\"===t&&e!==i&&this.#u(),\"facing-mode\"===t&&e!==i&&\"facingMode\"in this.#t){let t=[\"user\",\"environment\"].includes(this.facingMode||\"\");\"facingMode\"in n&&t&&(this.stopVideoStream(),this.startVideoStream())}if(\"camera-resolution\"===t&&e!==i&&\"string\"==typeof this.cameraResolution&&this.cameraResolution.trim().length>0){let[t=0,e=0]=this.cameraResolution.split(\"x\").map(t=>Number(t));if(t>0&&e>0&&\"width\"in o&&\"height\"in o){let i=!!(o.width?.min&&o.width?.max)&&t>=o?.width?.min&&t<=o?.width?.max,a=!!(o.height?.min&&o.height?.max)&&e>=o?.height?.min&&e<=o?.height?.max;\"width\"in n&&\"height\"in n&&i&&a&&(this.stopVideoStream(),this.startVideoStream())}}if(\"pan\"===t&&e!==i&&\"pan\"in this.#t){let t=!!(\"pan\"in o&&o.pan?.min&&o.pan?.max)&&this.pan>=o.pan.min&&this.pan<=o.pan.max;\"pan\"in n&&\"number\"==typeof this.pan&&t&&this.#h(\"pan\",this.pan)}if(\"tilt\"===t&&e!==i&&\"tilt\"in this.#t){let t=!!(\"tilt\"in o&&o.tilt?.min&&o.tilt?.max)&&this.tilt>=o.tilt.min&&this.tilt<=o.tilt.max;\"tilt\"in n&&\"number\"==typeof this.tilt&&t&&this.#h(\"tilt\",this.tilt)}if(\"zoom\"===t&&e!==i&&\"zoom\"in this.#t){let t=!!(\"zoom\"in o&&o.zoom?.min&&o.zoom?.max)&&this.zoom>=o.zoom.min&&this.zoom<=o.zoom.max;\"zoom\"in n&&\"number\"==typeof this.zoom&&t&&this.#h(\"zoom\",this.zoom)}}connectedCallback(){if(this.#d(\"autpoPlay\"),this.#d(\"noImage\"),this.#d(\"facingMode\"),this.#d(\"cameraResolution\"),this.#d(\"pan\"),this.#d(\"tilt\"),this.#d(\"zoom\"),this.#d(\"calculateFileSize\"),this.#i=this.shadowRoot?.querySelector(\"canvas\")||null,this.#o=this.shadowRoot?.getElementById(\"output\")||null,this.#n=this.shadowRoot?.querySelector(\"video\")||null,this.#a=this.shadowRoot?.querySelector('slot[name=\"capture-button\"]')||null,this.#s=this.#c(),this.#r=this.shadowRoot?.querySelector('slot[name=\"facing-mode-button\"]')||null,this.#l=this.#m(),this.#n?.addEventListener(\"loadedmetadata\",this.#p),this.#a?.addEventListener(\"slotchange\",this.#g),this.#s?.addEventListener(\"click\",this.#b),this.#r?.addEventListener(\"slotchange\",this.#f),this.#l?.addEventListener(\"click\",this.#v),!n.isSupported())return this.dispatchEvent(new CustomEvent(`${e}:error`,{bubbles:!0,composed:!0,detail:{error:{name:\"NotSupportedError\",message:\"Not supported\"}}}));this.autoPlay&&this.startVideoStream()}disconnectedCallback(){this.stopVideoStream(),this.#l?.removeEventListener(\"click\",this.#v),this.#s?.removeEventListener(\"click\",this.#b),this.#n?.removeEventListener(\"canplay\",this.#p),this.#a?.removeEventListener(\"slotchange\",this.#g),this.#r?.removeEventListener(\"slotchange\",this.#f)}get autoPlay(){return this.hasAttribute(\"auto-play\")}set autoPlay(t){this.toggleAttribute(\"auto-play\",!!t)}get noImage(){return this.hasAttribute(\"no-image\")}set noImage(t){this.toggleAttribute(\"no-image\",!!t)}get facingMode(){return this.getAttribute(\"facing-mode\")||\"user\"}set facingMode(t){this.setAttribute(\"facing-mode\",t)}get cameraResolution(){return this.getAttribute(\"camera-resolution\")||\"\"}set cameraResolution(t){this.setAttribute(\"camera-resolution\",t)}get pan(){return Number(this.getAttribute(\"pan\"))||0}set pan(t){this.setAttribute(\"pan\",null!=t?t.toString():t)}get tilt(){return Number(this.getAttribute(\"tilt\"))||0}set tilt(t){this.setAttribute(\"tilt\",null!=t?t.toString():t)}get zoom(){return Number(this.getAttribute(\"zoom\"))||1}set zoom(t){this.setAttribute(\"zoom\",null!=t?t.toString():t)}get loading(){return this.hasAttribute(\"loading\")}get calculateFileSize(){return this.hasAttribute(\"calculate-file-size\")}set calculateFileSize(t){this.toggleAttribute(\"calculate-file-size\",!!t)}#v=t=>{t.preventDefault(),this.loading||(this.facingMode=\"user\"!==this.facingMode&&this.facingMode?\"user\":\"environment\")};#b=t=>{t.preventDefault(),this.capture()};#p=t=>{let i=t.target;i.play().then(()=>{this.dispatchEvent(new CustomEvent(`${e}:video-play`,{bubbles:!0,composed:!0,detail:{video:i}}))}).catch(t=>{this.dispatchEvent(new CustomEvent(`${e}:error`,{bubbles:!0,composed:!0,detail:{error:t}}))}).finally(()=>{this.removeAttribute(\"loading\")})};#u(){this.#o&&Array.from(this.#o.childNodes).forEach(t=>t.remove())}#h(e,i){if(!this.#e||!e||!i)return;let[o]=this.#e.getVideoTracks(),n=this.getTrackCapabilities();e in this.getTrackSettings()&&o.applyConstraints({advanced:[{[e]:t(Number(i),n[e]?.min||1,n[e]?.max||1)}]})}#g=t=>{t.target?.name===\"capture-button\"&&(this.#s?.removeEventListener(\"click\",this.#b),this.#s=this.#c(),this.#s&&(this.#s.addEventListener(\"click\",this.#b),\"BUTTON\"===this.#s.nodeName||this.#s.hasAttribute(\"role\")||this.#s.setAttribute(\"role\",\"button\")))};#f=t=>{t.target?.name===\"facing-mode-button\"&&(this.#l?.removeEventListener(\"click\",this.#v),this.#l=this.#m(),this.#l&&(this.#l.addEventListener(\"click\",this.#v),\"BUTTON\"===this.#l.nodeName||this.#l.hasAttribute(\"role\")||this.#l.setAttribute(\"role\",\"button\")))};#m(){return this.#r&&this.#r.assignedElements({flatten:!0}).find(t=>\"BUTTON\"===t.nodeName||\"facing-mode-button\"===t.getAttribute(\"slot\"))||null}#c(){return this.#a&&this.#a.assignedElements({flatten:!0}).find(t=>\"BUTTON\"===t.nodeName||\"capture-button\"===t.getAttribute(\"slot\"))||null}#d(t){if(Object.prototype.hasOwnProperty.call(this,t)){let e=this[t];delete this[t],this[t]=e}}async startVideoStream(){if(!n.isSupported()||this.#e)return;this.setAttribute(\"loading\",\"\");let t={video:{facingMode:{ideal:this.facingMode||\"user\"},pan:!0,tilt:!0,zoom:!0},audio:!1};if(\"string\"==typeof this.cameraResolution&&this.cameraResolution.trim().length>0){let[e=0,i=0]=this.cameraResolution.split(\"x\").map(t=>Number(t));e>0&&i>0&&(t.video.width=e,t.video.height=i)}try{this.#e=await navigator.mediaDevices.getUserMedia(t),this.#n&&(this.#n.srcObject=this.#e),this.#h(\"pan\",this.pan),this.#h(\"tilt\",this.tilt),this.#h(\"zoom\",this.zoom);let e=this.getTrackSettings();\"facingMode\"in e&&this.#r&&(this.#r.hidden=!1)}catch(t){this.dispatchEvent(new CustomEvent(`${e}:error`,{bubbles:!0,composed:!0,detail:{error:t}}))}finally{this.removeAttribute(\"loading\")}}stopVideoStream(){if(!this.#n||!this.#e)return;let[t]=this.#e.getVideoTracks();t?.stop(),this.#n.srcObject=null,this.#e=null}async capture(){if(!this.loading&&this.#i&&this.#n)try{let t=this.#i.getContext(\"2d\"),i=this.#n.videoWidth,o=this.#n.videoHeight;this.#i.width=i,this.#i.height=o,t?.drawImage(this.#n,0,0,i,o);let n=this.#i.toDataURL(\"image/png\");if(\"string\"==typeof n&&n.includes(\"data:image\")){if(!this.noImage){let t=new Image;t.src=n,t.width=i,t.height=o,t.setAttribute(\"part\",\"output-image\"),this.#u(),this.#o?.appendChild(t)}let t={dataURI:n,width:i,height:o};if(this.calculateFileSize)try{let e=await fetch(n),i=(await e.blob()).size;i&&(t.size=i)}catch(t){}this.dispatchEvent(new CustomEvent(`${e}:success`,{bubbles:!0,composed:!0,detail:t}))}}catch(t){this.dispatchEvent(new CustomEvent(`${e}:error`,{bubbles:!0,composed:!0,detail:{error:t}}))}}getSupportedConstraints(){return n.isSupported()&&navigator.mediaDevices.getSupportedConstraints()||{}}getTrackCapabilities(){if(!this.#e)return{};let[t]=this.#e.getVideoTracks();return t&&\"function\"==typeof t.getCapabilities&&t.getCapabilities()||{}}getTrackSettings(){if(!this.#e)return{};let[t]=this.#e.getVideoTracks();return t&&\"function\"==typeof t.getSettings&&t.getSettings()||{}}static isSupported(){return!!navigator.mediaDevices?.getUserMedia}static defineCustomElement(t=e){\"undefined\"==typeof window||window.customElements.get(t)||window.customElements.define(t,n)}}n.defineCustomElement();export{n as CapturePhoto};\n//# sourceMappingURL=capture-photo-defined.js.map\n","function $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $c290816263f90981$exports = {};\n\n$parcel$export($c290816263f90981$exports, \"CapturePhoto\", function () { return $c290816263f90981$export$cc30a98fe3890794; });\n// @ts-check\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */ /**\n * @typedef {Object} ExtendedMediaTrackCapabilities\n * @property {ULongRange} [width] - The width of the video track.\n * @property {ULongRange} [height] - The height of the video track.\n * @property {ULongRange} [pan] - The pan level of the camera.\n * @property {ULongRange} [tilt] - The tilt level of the camera.\n * @property {ULongRange} [zoom] - The zoom level of the camera.\n * @property {MediaTrackCapabilities} [nativeMediaTrackCapabilities] - The native track capabilities.\n */ /**\n * @typedef {Object} ExtendedMediaTrackConstraints\n * @property {MediaTrackConstraints & {pan: boolean, tilt: boolean, zoom: boolean}} video - The video constraints.\n * @property {MediaTrackConstraints | boolean} audio - The audio constraints.\n */ // @ts-check\n/**\n * Clamps number within the inclusive `min` and `max` bounds,\n * making sure it does not go beyond them on either side.\n * If `min` is greater than `max` the parameters are swapped to support inverted ranges.\n *\n * @param {number} value - The number to clamp.\n * @param {number} lower - The lower bound.\n * @param {number} upper - The upper bound.\n * @throws {TypeError} - If one or more of the arguments passed is not a number.\n * @returns {number} - The clamped number.\n * @example\n *\n * clamp(10, -5, 5);\n * // => 5\n *\n * clamp(-10, -5, 5);\n * // => -5\n *\n * clamp(-15, 0, 100);\n * // => 0\n *\n * clamp(120, 0, 100);\n * // => 100\n *\n * clamp(-5, NaN, 5); // If any of lower or upper bound are `NaN`, they will be converted to `0`.\n * // => 0\n *\n * clamp(120, 100, 0); // The order of lower and upper bounds is reversed (100 > 0)\n * // => 100\n */ const $02ad8beec419df62$export$7d15b64cf5a3a4c4 = (value, lower, upper)=>{\n if (Number.isNaN(lower)) lower = 0;\n if (Number.isNaN(upper)) upper = 0;\n return Math.min(Math.max(value, Math.min(lower, upper)), Math.max(lower, upper));\n};\n\n\nconst $c290816263f90981$var$COMPONENT_NAME = \"capture-photo\";\nconst $c290816263f90981$var$styles = /* css */ `\n :host {\n display: block;\n box-sizing: border-box;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none;\n }\n\n video {\n display: block;\n }\n\n #output:empty {\n display: none;\n }\n`;\nconst $c290816263f90981$var$template = document.createElement(\"template\");\n$c290816263f90981$var$template.innerHTML = /* html */ `\n \n\n \n\n \n\n
\n \n \n \n\n \n\n \n
\n\n \n\n
\n`;\n/**\n * @summary A custom element that implements the MediaDevices.getUserMedia() method of the MediaDevices interface to capture a photo in the browser.\n * @documentation https://github.com/georapbox/capture-photo-element\n *\n * @tagname capture-photo This is the default tag name, unless overridden by the `defineCustomElement` method.\n * @extends HTMLElement\n *\n * @property {boolean} autoPlay - Whether or not to start the video stream automatically.\n * @property {boolean} noImage - Whether or not to show the captured image.\n * @property {string} facingMode - The facing mode of the camera.\n * @property {string} cameraResolution - The resolution of the camera.\n * @property {number} pan - The pan value of the camera.\n * @property {number} tilt - The tilt value of the camera.\n * @property {number} zoom - The zoom value of the camera.\n * @property {boolean} loading - Whether or not the video stream is loading.\n * @property {boolean} calculateFileSize - Whether or not to calculate the file size of the captured image.\n *\n * @atttribute {boolean} auto-play - Reflects the autoPlay property.\n * @atttribute {boolean} no-image - Reflects the noImage property.\n * @atttribute {string} facing-mode - Reflects the facingMode property.\n * @atttribute {string} camera-resolution - Reflects the cameraResolution property.\n * @atttribute {number} pan - Reflects the pan property.\n * @atttribute {number} tilt - Reflects the tilt property.\n * @atttribute {number} zoom - Reflects the zoom property.\n * @atttribute {boolean} loading - Reflects the loading property.\n * @atttribute {boolean} calculate-file-size - Reflects the calculateFileSize property.\n *\n * @slot capture-button - The capture button.\n * @slot capture-button-content - The capture button content.\n * @slot facing-mode-button - The facing mode button.\n * @slot facing-mode-button-content - The facing mode button content.\n * @slot actions - The actions container.\n * @slot - A default un-named slot to add content inside the component.\n *\n * @csspart video - The video element.\n * @csspart actions-container - The actions container.\n * @csspart capture-button - The capture button.\n * @csspart facing-mode-button - The facing mode button.\n * @csspart output-container - The output container.\n * @csspart output-image - The output image.\n *\n * @event capture-photo:video-play - Fires when the video stream is successfully playing.\n * @event capture-photo:success - Fires when the photo is successfully captured.\n * @event capture-photo:error - Fires when an error occurs.\n *\n * @method defineCustomElement - Static method. Defines the custom element with the given name.\n * @method isSupported - Static method. Checks if the MediaDevices.getUserMedia() method is supported.\n * @method startVideoStream - Instance method. Starts the video stream.\n * @method stopVideoStream - Instance method. Stops the video stream.\n * @method capture - Instance method. Captures a photo.\n * @method getSupportedConstraints - Instance method. Gets the supported constraints.\n * @method getTrackCapabilities - Instance method. Gets the track capabilities.\n * @method getTrackSettings - Instance method. Gets the track settings.\n */ class $c290816263f90981$export$cc30a98fe3890794 extends HTMLElement {\n /** @type {MediaTrackSupportedConstraints | {}}*/ #supportedConstraints = {};\n /** @type {Nullable} */ #stream = null;\n /** @type {Nullable} */ #canvasElement = null;\n /** @type {Nullable} */ #outputElement = null;\n /** @type {Nullable} */ #videoElement = null;\n /** @type {Nullable} */ #captureButtonSlot = null;\n /** @type {Nullable} */ #captureButton = null;\n /** @type {Nullable} */ #facingModeButtonSlot = null;\n /** @type {Nullable} */ #facingModeButton = null;\n constructor(){\n super();\n this.#supportedConstraints = this.getSupportedConstraints();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\"\n });\n shadowRoot.appendChild($c290816263f90981$var$template.content.cloneNode(true));\n }\n }\n static get observedAttributes() {\n return [\n \"no-image\",\n \"facing-mode\",\n \"camera-resolution\",\n \"pan\",\n \"tilt\",\n \"zoom\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (!this.isConnected) return;\n /** @type {ExtendedMediaTrackCapabilities} */ const trackCapabilities = this.getTrackCapabilities();\n const trackSettings = this.getTrackSettings();\n if (name === \"no-image\" && oldValue !== newValue) this.#emptyOutputElement();\n if (name === \"facing-mode\" && oldValue !== newValue && \"facingMode\" in this.#supportedConstraints) {\n const isValidFacingMode = [\n \"user\",\n \"environment\"\n ].includes(this.facingMode || \"\");\n if (\"facingMode\" in trackSettings && isValidFacingMode) {\n this.stopVideoStream();\n this.startVideoStream();\n }\n }\n if (name === \"camera-resolution\" && oldValue !== newValue) {\n if (typeof this.cameraResolution === \"string\" && this.cameraResolution.trim().length > 0) {\n const [width = 0, height = 0] = this.cameraResolution.split(\"x\").map((x)=>Number(x));\n if (width > 0 && height > 0 && \"width\" in trackCapabilities && \"height\" in trackCapabilities) {\n const widthInAllowedRange = trackCapabilities.width?.min && trackCapabilities.width?.max ? width >= trackCapabilities?.width?.min && width <= trackCapabilities?.width?.max : false;\n const heightInAllowedRange = trackCapabilities.height?.min && trackCapabilities.height?.max ? height >= trackCapabilities?.height?.min && height <= trackCapabilities?.height?.max : false;\n if (\"width\" in trackSettings && \"height\" in trackSettings && widthInAllowedRange && heightInAllowedRange) {\n this.stopVideoStream();\n this.startVideoStream();\n }\n }\n }\n }\n if (name === \"pan\" && oldValue !== newValue && \"pan\" in this.#supportedConstraints) {\n const panInAllowedRange = \"pan\" in trackCapabilities && trackCapabilities.pan?.min && trackCapabilities.pan?.max ? this.pan >= trackCapabilities.pan.min && this.pan <= trackCapabilities.pan.max : false;\n if (\"pan\" in trackSettings && typeof this.pan === \"number\" && panInAllowedRange) this.#applyPTZ(\"pan\", this.pan);\n }\n if (name === \"tilt\" && oldValue !== newValue && \"tilt\" in this.#supportedConstraints) {\n const tiltInAllowedRange = \"tilt\" in trackCapabilities && trackCapabilities.tilt?.min && trackCapabilities.tilt?.max ? this.tilt >= trackCapabilities.tilt.min && this.tilt <= trackCapabilities.tilt.max : false;\n if (\"tilt\" in trackSettings && typeof this.tilt === \"number\" && tiltInAllowedRange) this.#applyPTZ(\"tilt\", this.tilt);\n }\n if (name === \"zoom\" && oldValue !== newValue && \"zoom\" in this.#supportedConstraints) {\n const zoomInAllowedRange = \"zoom\" in trackCapabilities && trackCapabilities.zoom?.min && trackCapabilities.zoom?.max ? this.zoom >= trackCapabilities.zoom.min && this.zoom <= trackCapabilities.zoom.max : false;\n if (\"zoom\" in trackSettings && typeof this.zoom === \"number\" && zoomInAllowedRange) this.#applyPTZ(\"zoom\", this.zoom);\n }\n }\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"autpoPlay\");\n this.#upgradeProperty(\"noImage\");\n this.#upgradeProperty(\"facingMode\");\n this.#upgradeProperty(\"cameraResolution\");\n this.#upgradeProperty(\"pan\");\n this.#upgradeProperty(\"tilt\");\n this.#upgradeProperty(\"zoom\");\n this.#upgradeProperty(\"calculateFileSize\");\n this.#canvasElement = this.shadowRoot?.querySelector(\"canvas\") || null;\n this.#outputElement = this.shadowRoot?.getElementById(\"output\") || null;\n this.#videoElement = this.shadowRoot?.querySelector(\"video\") || null;\n this.#captureButtonSlot = this.shadowRoot?.querySelector('slot[name=\"capture-button\"]') || null;\n this.#captureButton = this.#getCaptureButton();\n this.#facingModeButtonSlot = this.shadowRoot?.querySelector('slot[name=\"facing-mode-button\"]') || null;\n this.#facingModeButton = this.#getFacingModeButton();\n this.#videoElement?.addEventListener(\"loadedmetadata\", this.#onVideoLoadedMetaData);\n this.#captureButtonSlot?.addEventListener(\"slotchange\", this.#onCaptureButtonSlotChange);\n this.#captureButton?.addEventListener(\"click\", this.#onCapturePhotoButtonClick);\n this.#facingModeButtonSlot?.addEventListener(\"slotchange\", this.#onFacingModeButtonSlotChange);\n this.#facingModeButton?.addEventListener(\"click\", this.#onFacingModeButtonClick);\n if (!$c290816263f90981$export$cc30a98fe3890794.isSupported()) return this.dispatchEvent(new CustomEvent(`${$c290816263f90981$var$COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: {\n name: \"NotSupportedError\",\n message: \"Not supported\"\n }\n }\n }));\n if (this.autoPlay) this.startVideoStream();\n }\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */ disconnectedCallback() {\n this.stopVideoStream();\n this.#facingModeButton?.removeEventListener(\"click\", this.#onFacingModeButtonClick);\n this.#captureButton?.removeEventListener(\"click\", this.#onCapturePhotoButtonClick);\n this.#videoElement?.removeEventListener(\"canplay\", this.#onVideoLoadedMetaData);\n this.#captureButtonSlot?.removeEventListener(\"slotchange\", this.#onCaptureButtonSlotChange);\n this.#facingModeButtonSlot?.removeEventListener(\"slotchange\", this.#onFacingModeButtonSlotChange);\n }\n /**\n * @type {boolean} autoPlay - Whether or not to start the video stream automatically.\n * @attribute auto-play - Reflects the autoPlay attribute.\n */ get autoPlay() {\n return this.hasAttribute(\"auto-play\");\n }\n set autoPlay(value) {\n this.toggleAttribute(\"auto-play\", !!value);\n }\n /**\n * @type {boolean} noImage - Whether or not to show the captured image.\n * @attribute no-image - Reflects the noImage attribute.\n */ get noImage() {\n return this.hasAttribute(\"no-image\");\n }\n set noImage(value) {\n this.toggleAttribute(\"no-image\", !!value);\n }\n /**\n * @type {string} facingMode - The facing mode of the camera.\n * @attribute facing-mode - Reflects the facingMode attribute.\n */ get facingMode() {\n return this.getAttribute(\"facing-mode\") || \"user\";\n }\n set facingMode(value) {\n this.setAttribute(\"facing-mode\", value);\n }\n /**\n * @type {string} cameraResolution - The resolution of the camera.\n * @attribute camera-resolution - Reflects the cameraResolution attribute.\n */ get cameraResolution() {\n return this.getAttribute(\"camera-resolution\") || \"\";\n }\n set cameraResolution(value) {\n this.setAttribute(\"camera-resolution\", value);\n }\n /**\n * @type {number} pan - The pan value of the camera.\n * @attribute pan - Reflects the pan attribute.\n */ get pan() {\n return Number(this.getAttribute(\"pan\")) || 0;\n }\n set pan(value) {\n this.setAttribute(\"pan\", value != null ? value.toString() : value);\n }\n /**\n * @type {number} tilt - The tilt value of the camera.\n * @attribute tilt - Reflects the tilt attribute.\n */ get tilt() {\n return Number(this.getAttribute(\"tilt\")) || 0;\n }\n set tilt(value) {\n this.setAttribute(\"tilt\", value != null ? value.toString() : value);\n }\n /**\n * @type {number} zoom - The zoom value of the camera.\n * @attribute zoom - Reflects the zoom attribute.\n */ get zoom() {\n return Number(this.getAttribute(\"zoom\")) || 1;\n }\n set zoom(value) {\n this.setAttribute(\"zoom\", value != null ? value.toString() : value);\n }\n /**\n * @type {boolean} loading - Whether or not the video stream is loading.\n * @attribute loading - Reflects the loading attribute.\n */ get loading() {\n return this.hasAttribute(\"loading\");\n }\n /**\n * @type {boolean} calculateFileSize - Whether or not to calculate the file size of the captured image.\n * @attribute calculate-file-size - Reflects the calculateFileSize attribute.\n */ get calculateFileSize() {\n return this.hasAttribute(\"calculate-file-size\");\n }\n set calculateFileSize(value) {\n this.toggleAttribute(\"calculate-file-size\", !!value);\n }\n /**\n * Handles the click event of the facing mode button.\n *\n * @param {*} evt - The click event.\n */ #onFacingModeButtonClick = (evt)=>{\n evt.preventDefault();\n if (this.loading) return;\n this.facingMode = this.facingMode === \"user\" || !this.facingMode ? \"environment\" : \"user\";\n };\n /**\n * Handles the click event of the capture button.\n *\n * @param {*} evt - The click event.\n */ #onCapturePhotoButtonClick = (evt)=>{\n evt.preventDefault();\n this.capture();\n };\n /**\n * Handles the loadedmetadata event of the video element.\n *\n * @param {*} evt - The loadedmetadata event.\n */ #onVideoLoadedMetaData = (evt)=>{\n const video = evt.target;\n video.play().then(()=>{\n this.dispatchEvent(new CustomEvent(`${$c290816263f90981$var$COMPONENT_NAME}:video-play`, {\n bubbles: true,\n composed: true,\n detail: {\n video: video\n }\n }));\n }).catch(/** @param {Error} error */ (error)=>{\n this.dispatchEvent(new CustomEvent(`${$c290816263f90981$var$COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }).finally(()=>{\n this.removeAttribute(\"loading\");\n });\n };\n /**\n * Removes all child nodes from the output element.\n */ #emptyOutputElement() {\n if (!this.#outputElement) return;\n Array.from(this.#outputElement.childNodes).forEach((node)=>node.remove());\n }\n /**\n * Applies the pan, tilt or zoom constraint.\n *\n * @param {'pan' | 'tilt' | 'zoom'} constraintName - The name of the constraint.\n * @param {number} constraintValue - The value of the constraint.\n */ #applyPTZ(constraintName, constraintValue) {\n if (!this.#stream || !constraintName || !constraintValue) return;\n const [track] = this.#stream.getVideoTracks();\n /** @type {ExtendedMediaTrackCapabilities} */ const trackCapabilities = this.getTrackCapabilities();\n const trackSettings = this.getTrackSettings();\n if (constraintName in trackSettings) track.applyConstraints({\n advanced: [\n {\n [constraintName]: (0, $02ad8beec419df62$export$7d15b64cf5a3a4c4)(Number(constraintValue), trackCapabilities[constraintName]?.min || 1, trackCapabilities[constraintName]?.max || 1)\n }\n ]\n });\n }\n /**\n * Handles the slotchange event of the capture button slot.\n *\n * @param {*} evt - The slotchange event.\n */ #onCaptureButtonSlotChange = (evt)=>{\n if (evt.target?.name === \"capture-button\") {\n this.#captureButton?.removeEventListener(\"click\", this.#onCapturePhotoButtonClick);\n this.#captureButton = this.#getCaptureButton();\n if (this.#captureButton) {\n this.#captureButton.addEventListener(\"click\", this.#onCapturePhotoButtonClick);\n if (this.#captureButton.nodeName !== \"BUTTON\" && !this.#captureButton.hasAttribute(\"role\")) this.#captureButton.setAttribute(\"role\", \"button\");\n }\n }\n };\n /**\n * Handles the slotchange event of the facing mode button slot.\n *\n * @param {*} evt - The slotchange event.\n */ #onFacingModeButtonSlotChange = (evt)=>{\n if (evt.target?.name === \"facing-mode-button\") {\n this.#facingModeButton?.removeEventListener(\"click\", this.#onFacingModeButtonClick);\n this.#facingModeButton = this.#getFacingModeButton();\n if (this.#facingModeButton) {\n this.#facingModeButton.addEventListener(\"click\", this.#onFacingModeButtonClick);\n if (this.#facingModeButton.nodeName !== \"BUTTON\" && !this.#facingModeButton.hasAttribute(\"role\")) this.#facingModeButton.setAttribute(\"role\", \"button\");\n }\n }\n };\n /**\n * Returns the facing mode button.\n *\n * @returns {Nullable}\n */ #getFacingModeButton() {\n if (!this.#facingModeButtonSlot) return null;\n return this.#facingModeButtonSlot.assignedElements({\n flatten: true\n }).find((el)=>{\n return el.nodeName === \"BUTTON\" || el.getAttribute(\"slot\") === \"facing-mode-button\";\n }) || null;\n }\n /**\n * Returns the capture button.\n *\n * @returns {Nullable}\n */ #getCaptureButton() {\n if (!this.#captureButtonSlot) return null;\n return this.#captureButtonSlot.assignedElements({\n flatten: true\n }).find((el)=>{\n return el.nodeName === \"BUTTON\" || el.getAttribute(\"slot\") === \"capture-button\";\n }) || null;\n }\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and\n * set a value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would\n * miss that property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'autpoPlay' | 'noImage' | 'facingMode' | 'cameraResolution' | 'pan' | 'tilt' | 'zoom' | 'calculateFileSize'} prop\n */ #upgradeProperty(prop) {\n /** @type {any} */ const instance = this;\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n /**\n * Starts the video stream.\n *\n * @returns Promise\n */ async startVideoStream() {\n if (!$c290816263f90981$export$cc30a98fe3890794.isSupported() || this.#stream) return;\n this.setAttribute(\"loading\", \"\");\n /** @type {ExtendedMediaTrackConstraints} */ const constraints = {\n video: {\n facingMode: {\n ideal: this.facingMode || \"user\"\n },\n pan: true,\n tilt: true,\n zoom: true\n },\n audio: false\n };\n if (typeof this.cameraResolution === \"string\" && this.cameraResolution.trim().length > 0) {\n const [width = 0, height = 0] = this.cameraResolution.split(\"x\").map((x)=>Number(x));\n if (width > 0 && height > 0) {\n constraints.video.width = width;\n constraints.video.height = height;\n }\n }\n try {\n this.#stream = await navigator.mediaDevices.getUserMedia(constraints);\n if (this.#videoElement) this.#videoElement.srcObject = this.#stream;\n this.#applyPTZ(\"pan\", this.pan);\n this.#applyPTZ(\"tilt\", this.tilt);\n this.#applyPTZ(\"zoom\", this.zoom);\n const trackSettings = this.getTrackSettings();\n if (\"facingMode\" in trackSettings && this.#facingModeButtonSlot) this.#facingModeButtonSlot.hidden = false;\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${$c290816263f90981$var$COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n } finally{\n this.removeAttribute(\"loading\");\n }\n }\n /**\n * Stops the video stream.\n */ stopVideoStream() {\n if (!this.#videoElement || !this.#stream) return;\n const [track] = this.#stream.getVideoTracks();\n track?.stop();\n this.#videoElement.srcObject = null;\n this.#stream = null;\n }\n /**\n * Captures a photo using the element's properties.\n *\n * @returns Promise\n */ async capture() {\n if (this.loading || !this.#canvasElement || !this.#videoElement) return;\n try {\n const ctx = this.#canvasElement.getContext(\"2d\");\n const width = this.#videoElement.videoWidth;\n const height = this.#videoElement.videoHeight;\n this.#canvasElement.width = width;\n this.#canvasElement.height = height;\n ctx?.drawImage(this.#videoElement, 0, 0, width, height);\n const dataURI = this.#canvasElement.toDataURL(\"image/png\");\n if (typeof dataURI === \"string\" && dataURI.includes(\"data:image\")) {\n if (!this.noImage) {\n const image = new Image();\n image.src = dataURI;\n image.width = width;\n image.height = height;\n image.setAttribute(\"part\", \"output-image\");\n this.#emptyOutputElement();\n this.#outputElement?.appendChild(image);\n }\n /** @type {{ dataURI: string, width: number, height: number, size?: number }} */ const eventDetail = {\n dataURI: dataURI,\n width: width,\n height: height\n };\n if (this.calculateFileSize) try {\n const file = await fetch(dataURI);\n const blob = await file.blob();\n const size = blob.size;\n if (size) eventDetail.size = size;\n } catch (err) {\n // Fail silently...\n }\n this.dispatchEvent(new CustomEvent(`${$c290816263f90981$var$COMPONENT_NAME}:success`, {\n bubbles: true,\n composed: true,\n detail: eventDetail\n }));\n }\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${$c290816263f90981$var$COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }\n }\n /**\n * Returns an object based on the `MediaTrackSupportedConstraints` dictionary,\n * whose member fields each specify one ofthe constrainable properties the user agent understands.\n *\n * @see https://developer.mozilla.org/docs/Web/API/MediaDevices/getSupportedConstraints\n * @returns {MediaTrackSupportedConstraints | {}}\n */ getSupportedConstraints() {\n if (!$c290816263f90981$export$cc30a98fe3890794.isSupported()) return {};\n return navigator.mediaDevices.getSupportedConstraints() || {};\n }\n /**\n * Returns a `MediaTrackCapabilities` object which specifies the values or range of values\n * which each constrainable property, based upon the platform and user agent.\n *\n * @see https://developer.mozilla.org/docs/Web/API/MediaStreamTrack/getCapabilities\n * @returns {MediaTrackCapabilities | {}}\n */ getTrackCapabilities() {\n if (!this.#stream) return {};\n const [track] = this.#stream.getVideoTracks();\n if (track && typeof track.getCapabilities === \"function\") return track.getCapabilities() || {};\n return {};\n }\n /**\n * Returns a `MediaTrackSettings` object containing the current values of each of\n * the constrainable properties for the current MediaStreamTrack.\n *\n * @see https://developer.mozilla.org/docs/Web/API/MediaStreamTrack/getSettings\n * @returns {MediaTrackSettings | {}}\n */ getTrackSettings() {\n if (!this.#stream) return {};\n const [track] = this.#stream.getVideoTracks();\n if (track && typeof track.getSettings === \"function\") return track.getSettings() || {};\n return {};\n }\n /**\n * Checks if the `MediaDevices.getUserMedia()` method is supported.\n *\n * @returns {boolean}\n */ static isSupported() {\n return Boolean(navigator.mediaDevices?.getUserMedia);\n }\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='capture-photo'] - The name of the custom element.\n * @example\n *\n * CapturePhoto.defineCustomElement('my-capture-photo');\n */ static defineCustomElement(elementName = $c290816263f90981$var$COMPONENT_NAME) {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $c290816263f90981$export$cc30a98fe3890794);\n }\n}\n\n\n(0, $c290816263f90981$export$cc30a98fe3890794).defineCustomElement();\n\n\nexport {$c290816263f90981$export$cc30a98fe3890794 as CapturePhoto};\n//# sourceMappingURL=capture-photo-defined.js.map\n","import { CapturePhoto } from './capture-photo.js';\n\nCapturePhoto.defineCustomElement();\n\nexport { CapturePhoto };\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\n/**\n * @typedef {Object} ExtendedMediaTrackCapabilities\n * @property {ULongRange} [width] - The width of the video track.\n * @property {ULongRange} [height] - The height of the video track.\n * @property {ULongRange} [pan] - The pan level of the camera.\n * @property {ULongRange} [tilt] - The tilt level of the camera.\n * @property {ULongRange} [zoom] - The zoom level of the camera.\n * @property {MediaTrackCapabilities} [nativeMediaTrackCapabilities] - The native track capabilities.\n */\n\n/**\n * @typedef {Object} ExtendedMediaTrackConstraints\n * @property {MediaTrackConstraints & {pan: boolean, tilt: boolean, zoom: boolean}} video - The video constraints.\n * @property {MediaTrackConstraints | boolean} audio - The audio constraints.\n */\n\nimport { clamp } from './utils/clamp.js';\n\nconst COMPONENT_NAME = 'capture-photo';\n\nconst styles = /* css */`\n :host {\n display: block;\n box-sizing: border-box;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none;\n }\n\n video {\n display: block;\n }\n\n #output:empty {\n display: none;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n \n\n \n\n
\n \n \n \n\n \n\n \n
\n\n \n\n
\n`;\n\n/**\n * @summary A custom element that implements the MediaDevices.getUserMedia() method of the MediaDevices interface to capture a photo in the browser.\n * @documentation https://github.com/georapbox/capture-photo-element\n *\n * @tagname capture-photo This is the default tag name, unless overridden by the `defineCustomElement` method.\n * @extends HTMLElement\n *\n * @property {boolean} autoPlay - Whether or not to start the video stream automatically.\n * @property {boolean} noImage - Whether or not to show the captured image.\n * @property {string} facingMode - The facing mode of the camera.\n * @property {string} cameraResolution - The resolution of the camera.\n * @property {number} pan - The pan value of the camera.\n * @property {number} tilt - The tilt value of the camera.\n * @property {number} zoom - The zoom value of the camera.\n * @property {boolean} loading - Whether or not the video stream is loading.\n * @property {boolean} calculateFileSize - Whether or not to calculate the file size of the captured image.\n *\n * @atttribute {boolean} auto-play - Reflects the autoPlay property.\n * @atttribute {boolean} no-image - Reflects the noImage property.\n * @atttribute {string} facing-mode - Reflects the facingMode property.\n * @atttribute {string} camera-resolution - Reflects the cameraResolution property.\n * @atttribute {number} pan - Reflects the pan property.\n * @atttribute {number} tilt - Reflects the tilt property.\n * @atttribute {number} zoom - Reflects the zoom property.\n * @atttribute {boolean} loading - Reflects the loading property.\n * @atttribute {boolean} calculate-file-size - Reflects the calculateFileSize property.\n *\n * @slot capture-button - The capture button.\n * @slot capture-button-content - The capture button content.\n * @slot facing-mode-button - The facing mode button.\n * @slot facing-mode-button-content - The facing mode button content.\n * @slot actions - The actions container.\n * @slot - A default un-named slot to add content inside the component.\n *\n * @csspart video - The video element.\n * @csspart actions-container - The actions container.\n * @csspart capture-button - The capture button.\n * @csspart facing-mode-button - The facing mode button.\n * @csspart output-container - The output container.\n * @csspart output-image - The output image.\n *\n * @event capture-photo:video-play - Fires when the video stream is successfully playing.\n * @event capture-photo:success - Fires when the photo is successfully captured.\n * @event capture-photo:error - Fires when an error occurs.\n *\n * @method defineCustomElement - Static method. Defines the custom element with the given name.\n * @method isSupported - Static method. Checks if the MediaDevices.getUserMedia() method is supported.\n * @method startVideoStream - Instance method. Starts the video stream.\n * @method stopVideoStream - Instance method. Stops the video stream.\n * @method capture - Instance method. Captures a photo.\n * @method getSupportedConstraints - Instance method. Gets the supported constraints.\n * @method getTrackCapabilities - Instance method. Gets the track capabilities.\n * @method getTrackSettings - Instance method. Gets the track settings.\n */\nclass CapturePhoto extends HTMLElement {\n /** @type {MediaTrackSupportedConstraints | {}}*/\n #supportedConstraints = {};\n\n /** @type {Nullable} */\n #stream = null;\n\n /** @type {Nullable} */\n #canvasElement = null;\n\n /** @type {Nullable} */\n #outputElement = null;\n\n /** @type {Nullable} */\n #videoElement = null;\n\n /** @type {Nullable} */\n #captureButtonSlot = null;\n\n /** @type {Nullable} */\n #captureButton = null;\n\n /** @type {Nullable} */\n #facingModeButtonSlot = null;\n\n /** @type {Nullable} */\n #facingModeButton = null;\n\n constructor() {\n super();\n\n this.#supportedConstraints = this.getSupportedConstraints();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n }\n\n static get observedAttributes() {\n return ['no-image', 'facing-mode', 'camera-resolution', 'pan', 'tilt', 'zoom'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (!this.isConnected) {\n return;\n }\n\n /** @type {ExtendedMediaTrackCapabilities} */\n const trackCapabilities = this.getTrackCapabilities();\n const trackSettings = this.getTrackSettings();\n\n if (name === 'no-image' && oldValue !== newValue) {\n this.#emptyOutputElement();\n }\n\n if (name === 'facing-mode' && oldValue !== newValue && 'facingMode' in this.#supportedConstraints) {\n const isValidFacingMode = ['user', 'environment'].includes(this.facingMode || '');\n\n if ('facingMode' in trackSettings && isValidFacingMode) {\n this.stopVideoStream();\n this.startVideoStream();\n }\n }\n\n if (name === 'camera-resolution' && oldValue !== newValue) {\n if (typeof this.cameraResolution === 'string' && this.cameraResolution.trim().length > 0) {\n const [width = 0, height = 0] = this.cameraResolution.split('x').map(x => Number(x));\n\n if (width > 0 && height > 0 && 'width' in trackCapabilities && 'height' in trackCapabilities) {\n const widthInAllowedRange = trackCapabilities.width?.min && trackCapabilities.width?.max\n ? width >= trackCapabilities?.width?.min && width <= trackCapabilities?.width?.max\n : false;\n\n const heightInAllowedRange = trackCapabilities.height?.min && trackCapabilities.height?.max\n ? height >= trackCapabilities?.height?.min && height <= trackCapabilities?.height?.max\n : false;\n\n if ('width' in trackSettings && 'height' in trackSettings && widthInAllowedRange && heightInAllowedRange) {\n this.stopVideoStream();\n this.startVideoStream();\n }\n }\n }\n }\n\n if (name === 'pan' && oldValue !== newValue && 'pan' in this.#supportedConstraints) {\n const panInAllowedRange = 'pan' in trackCapabilities && trackCapabilities.pan?.min && trackCapabilities.pan?.max\n ? this.pan >= trackCapabilities.pan.min && this.pan <= trackCapabilities.pan.max\n : false;\n\n if ('pan' in trackSettings && typeof this.pan === 'number' && panInAllowedRange) {\n this.#applyPTZ('pan', this.pan);\n }\n }\n\n if (name === 'tilt' && oldValue !== newValue && 'tilt' in this.#supportedConstraints) {\n const tiltInAllowedRange = 'tilt' in trackCapabilities && trackCapabilities.tilt?.min && trackCapabilities.tilt?.max\n ? this.tilt >= trackCapabilities.tilt.min && this.tilt <= trackCapabilities.tilt.max\n : false;\n\n if ('tilt' in trackSettings && typeof this.tilt === 'number' && tiltInAllowedRange) {\n this.#applyPTZ('tilt', this.tilt);\n }\n }\n\n if (name === 'zoom' && oldValue !== newValue && 'zoom' in this.#supportedConstraints) {\n const zoomInAllowedRange = 'zoom' in trackCapabilities && trackCapabilities.zoom?.min && trackCapabilities.zoom?.max\n ? this.zoom >= trackCapabilities.zoom.min && this.zoom <= trackCapabilities.zoom.max\n : false;\n\n if ('zoom' in trackSettings && typeof this.zoom === 'number' && zoomInAllowedRange) {\n this.#applyPTZ('zoom', this.zoom);\n }\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('autpoPlay');\n this.#upgradeProperty('noImage');\n this.#upgradeProperty('facingMode');\n this.#upgradeProperty('cameraResolution');\n this.#upgradeProperty('pan');\n this.#upgradeProperty('tilt');\n this.#upgradeProperty('zoom');\n this.#upgradeProperty('calculateFileSize');\n\n this.#canvasElement = this.shadowRoot?.querySelector('canvas') || null;\n this.#outputElement = this.shadowRoot?.getElementById('output') || null;\n this.#videoElement = this.shadowRoot?.querySelector('video') || null;\n this.#captureButtonSlot = this.shadowRoot?.querySelector('slot[name=\"capture-button\"]') || null;\n this.#captureButton = this.#getCaptureButton();\n this.#facingModeButtonSlot = this.shadowRoot?.querySelector('slot[name=\"facing-mode-button\"]') || null;\n this.#facingModeButton = this.#getFacingModeButton();\n\n this.#videoElement?.addEventListener('loadedmetadata', this.#onVideoLoadedMetaData);\n this.#captureButtonSlot?.addEventListener('slotchange', this.#onCaptureButtonSlotChange);\n this.#captureButton?.addEventListener('click', this.#onCapturePhotoButtonClick);\n this.#facingModeButtonSlot?.addEventListener('slotchange', this.#onFacingModeButtonSlotChange);\n this.#facingModeButton?.addEventListener('click', this.#onFacingModeButtonClick);\n\n if (!CapturePhoto.isSupported()) {\n return this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: {\n name: 'NotSupportedError',\n message: 'Not supported'\n }\n }\n }));\n }\n\n if (this.autoPlay) {\n this.startVideoStream();\n }\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.stopVideoStream();\n this.#facingModeButton?.removeEventListener('click', this.#onFacingModeButtonClick);\n this.#captureButton?.removeEventListener('click', this.#onCapturePhotoButtonClick);\n this.#videoElement?.removeEventListener('canplay', this.#onVideoLoadedMetaData);\n this.#captureButtonSlot?.removeEventListener('slotchange', this.#onCaptureButtonSlotChange);\n this.#facingModeButtonSlot?.removeEventListener('slotchange', this.#onFacingModeButtonSlotChange);\n }\n\n /**\n * @type {boolean} autoPlay - Whether or not to start the video stream automatically.\n * @attribute auto-play - Reflects the autoPlay attribute.\n */\n get autoPlay() {\n return this.hasAttribute('auto-play');\n }\n\n set autoPlay(value) {\n this.toggleAttribute('auto-play', !!value);\n }\n\n /**\n * @type {boolean} noImage - Whether or not to show the captured image.\n * @attribute no-image - Reflects the noImage attribute.\n */\n get noImage() {\n return this.hasAttribute('no-image');\n }\n\n set noImage(value) {\n this.toggleAttribute('no-image', !!value);\n }\n\n /**\n * @type {string} facingMode - The facing mode of the camera.\n * @attribute facing-mode - Reflects the facingMode attribute.\n */\n get facingMode() {\n return this.getAttribute('facing-mode') || 'user';\n }\n\n set facingMode(value) {\n this.setAttribute('facing-mode', value);\n }\n\n /**\n * @type {string} cameraResolution - The resolution of the camera.\n * @attribute camera-resolution - Reflects the cameraResolution attribute.\n */\n get cameraResolution() {\n return this.getAttribute('camera-resolution') || '';\n }\n\n set cameraResolution(value) {\n this.setAttribute('camera-resolution', value);\n }\n\n /**\n * @type {number} pan - The pan value of the camera.\n * @attribute pan - Reflects the pan attribute.\n */\n get pan() {\n return Number(this.getAttribute('pan')) || 0;\n }\n\n set pan(value) {\n this.setAttribute('pan', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} tilt - The tilt value of the camera.\n * @attribute tilt - Reflects the tilt attribute.\n */\n get tilt() {\n return Number(this.getAttribute('tilt')) || 0;\n }\n\n set tilt(value) {\n this.setAttribute('tilt', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} zoom - The zoom value of the camera.\n * @attribute zoom - Reflects the zoom attribute.\n */\n get zoom() {\n return Number(this.getAttribute('zoom')) || 1;\n }\n\n set zoom(value) {\n this.setAttribute('zoom', value != null ? value.toString() : value);\n }\n\n /**\n * @type {boolean} loading - Whether or not the video stream is loading.\n * @attribute loading - Reflects the loading attribute.\n */\n get loading() {\n return this.hasAttribute('loading');\n }\n\n /**\n * @type {boolean} calculateFileSize - Whether or not to calculate the file size of the captured image.\n * @attribute calculate-file-size - Reflects the calculateFileSize attribute.\n */\n get calculateFileSize() {\n return this.hasAttribute('calculate-file-size');\n }\n\n set calculateFileSize(value) {\n this.toggleAttribute('calculate-file-size', !!value);\n }\n\n /**\n * Handles the click event of the facing mode button.\n *\n * @param {*} evt - The click event.\n */\n #onFacingModeButtonClick = evt => {\n evt.preventDefault();\n\n if (this.loading) {\n return;\n }\n\n this.facingMode = this.facingMode === 'user' || !this.facingMode ? 'environment' : 'user';\n };\n\n /**\n * Handles the click event of the capture button.\n *\n * @param {*} evt - The click event.\n */\n #onCapturePhotoButtonClick = evt => {\n evt.preventDefault();\n this.capture();\n };\n\n /**\n * Handles the loadedmetadata event of the video element.\n *\n * @param {*} evt - The loadedmetadata event.\n */\n #onVideoLoadedMetaData = evt => {\n const video = evt.target;\n\n video.play().then(() => {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}:video-play`, {\n bubbles: true,\n composed: true,\n detail: { video }\n }));\n }).catch(/** @param {Error} error */error => {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }).finally(() => {\n this.removeAttribute('loading');\n });\n };\n\n /**\n * Removes all child nodes from the output element.\n */\n #emptyOutputElement() {\n if (!this.#outputElement) {\n return;\n }\n\n Array.from(this.#outputElement.childNodes).forEach(node => node.remove());\n }\n\n /**\n * Applies the pan, tilt or zoom constraint.\n *\n * @param {'pan' | 'tilt' | 'zoom'} constraintName - The name of the constraint.\n * @param {number} constraintValue - The value of the constraint.\n */\n #applyPTZ(constraintName, constraintValue) {\n if (!this.#stream || !constraintName || !constraintValue) {\n return;\n }\n\n const [track] = this.#stream.getVideoTracks();\n /** @type {ExtendedMediaTrackCapabilities} */\n const trackCapabilities = this.getTrackCapabilities();\n const trackSettings = this.getTrackSettings();\n\n if (constraintName in trackSettings) {\n track.applyConstraints({\n advanced: [{\n [constraintName]: clamp(Number(constraintValue), trackCapabilities[constraintName]?.min || 1, trackCapabilities[constraintName]?.max || 1)\n }]\n });\n }\n }\n\n /**\n * Handles the slotchange event of the capture button slot.\n *\n * @param {*} evt - The slotchange event.\n */\n #onCaptureButtonSlotChange = evt => {\n if (evt.target?.name === 'capture-button') {\n this.#captureButton?.removeEventListener('click', this.#onCapturePhotoButtonClick);\n this.#captureButton = this.#getCaptureButton();\n\n if (this.#captureButton) {\n this.#captureButton.addEventListener('click', this.#onCapturePhotoButtonClick);\n\n if (this.#captureButton.nodeName !== 'BUTTON' && !this.#captureButton.hasAttribute('role')) {\n this.#captureButton.setAttribute('role', 'button');\n }\n }\n }\n };\n\n /**\n * Handles the slotchange event of the facing mode button slot.\n *\n * @param {*} evt - The slotchange event.\n */\n #onFacingModeButtonSlotChange = evt => {\n if (evt.target?.name === 'facing-mode-button') {\n this.#facingModeButton?.removeEventListener('click', this.#onFacingModeButtonClick);\n this.#facingModeButton = this.#getFacingModeButton();\n\n if (this.#facingModeButton) {\n this.#facingModeButton.addEventListener('click', this.#onFacingModeButtonClick);\n\n if (this.#facingModeButton.nodeName !== 'BUTTON' && !this.#facingModeButton.hasAttribute('role')) {\n this.#facingModeButton.setAttribute('role', 'button');\n }\n }\n }\n };\n\n /**\n * Returns the facing mode button.\n *\n * @returns {Nullable}\n */\n #getFacingModeButton() {\n if (!this.#facingModeButtonSlot) {\n return null;\n }\n\n return this.#facingModeButtonSlot.assignedElements({ flatten: true }).find(el => {\n return el.nodeName === 'BUTTON' || el.getAttribute('slot') === 'facing-mode-button';\n }) || null;\n }\n\n /**\n * Returns the capture button.\n *\n * @returns {Nullable}\n */\n #getCaptureButton() {\n if (!this.#captureButtonSlot) {\n return null;\n }\n\n return this.#captureButtonSlot.assignedElements({ flatten: true }).find(el => {\n return el.nodeName === 'BUTTON' || el.getAttribute('slot') === 'capture-button';\n }) || null;\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and\n * set a value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would\n * miss that property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'autpoPlay' | 'noImage' | 'facingMode' | 'cameraResolution' | 'pan' | 'tilt' | 'zoom' | 'calculateFileSize'} prop\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Starts the video stream.\n *\n * @returns Promise\n */\n async startVideoStream() {\n if (!CapturePhoto.isSupported() || this.#stream) {\n return;\n }\n\n this.setAttribute('loading', '');\n\n /** @type {ExtendedMediaTrackConstraints} */\n const constraints = {\n video: {\n facingMode: {\n ideal: this.facingMode || 'user'\n },\n pan: true,\n tilt: true,\n zoom: true\n },\n audio: false\n };\n\n if (typeof this.cameraResolution === 'string' && this.cameraResolution.trim().length > 0) {\n const [width = 0, height = 0] = this.cameraResolution.split('x').map(x => Number(x));\n\n if (width > 0 && height > 0) {\n constraints.video.width = width;\n constraints.video.height = height;\n }\n }\n\n try {\n this.#stream = await navigator.mediaDevices.getUserMedia(constraints);\n\n if (this.#videoElement) {\n this.#videoElement.srcObject = this.#stream;\n }\n\n this.#applyPTZ('pan', this.pan);\n this.#applyPTZ('tilt', this.tilt);\n this.#applyPTZ('zoom', this.zoom);\n\n const trackSettings = this.getTrackSettings();\n\n if ('facingMode' in trackSettings && this.#facingModeButtonSlot) {\n this.#facingModeButtonSlot.hidden = false;\n }\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n } finally {\n this.removeAttribute('loading');\n }\n }\n\n /**\n * Stops the video stream.\n */\n stopVideoStream() {\n if (!this.#videoElement || !this.#stream) {\n return;\n }\n\n const [track] = this.#stream.getVideoTracks();\n\n track?.stop();\n this.#videoElement.srcObject = null;\n this.#stream = null;\n }\n\n /**\n * Captures a photo using the element's properties.\n *\n * @returns Promise\n */\n async capture() {\n if (this.loading || !this.#canvasElement || !this.#videoElement) {\n return;\n }\n\n try {\n const ctx = this.#canvasElement.getContext('2d');\n const width = this.#videoElement.videoWidth;\n const height = this.#videoElement.videoHeight;\n this.#canvasElement.width = width;\n this.#canvasElement.height = height;\n ctx?.drawImage(this.#videoElement, 0, 0, width, height);\n const dataURI = this.#canvasElement.toDataURL('image/png');\n\n if (typeof dataURI === 'string' && dataURI.includes('data:image')) {\n if (!this.noImage) {\n const image = new Image();\n image.src = dataURI;\n image.width = width;\n image.height = height;\n image.setAttribute('part', 'output-image');\n this.#emptyOutputElement();\n this.#outputElement?.appendChild(image);\n }\n\n /** @type {{ dataURI: string, width: number, height: number, size?: number }} */\n const eventDetail = { dataURI, width, height };\n\n if (this.calculateFileSize) {\n try {\n const file = await fetch(dataURI);\n const blob = await file.blob();\n const size = blob.size;\n\n if (size) {\n eventDetail.size = size;\n }\n } catch (err) {\n // Fail silently...\n }\n }\n\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}:success`, {\n bubbles: true,\n composed: true,\n detail: eventDetail\n }));\n }\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n }\n\n /**\n * Returns an object based on the `MediaTrackSupportedConstraints` dictionary,\n * whose member fields each specify one ofthe constrainable properties the user agent understands.\n *\n * @see https://developer.mozilla.org/docs/Web/API/MediaDevices/getSupportedConstraints\n * @returns {MediaTrackSupportedConstraints | {}}\n */\n getSupportedConstraints() {\n if (!CapturePhoto.isSupported()) {\n return {};\n }\n\n return navigator.mediaDevices.getSupportedConstraints() || {};\n }\n\n /**\n * Returns a `MediaTrackCapabilities` object which specifies the values or range of values\n * which each constrainable property, based upon the platform and user agent.\n *\n * @see https://developer.mozilla.org/docs/Web/API/MediaStreamTrack/getCapabilities\n * @returns {MediaTrackCapabilities | {}}\n */\n getTrackCapabilities() {\n if (!this.#stream) {\n return {};\n }\n\n const [track] = this.#stream.getVideoTracks();\n\n if (track && typeof track.getCapabilities === 'function') {\n return track.getCapabilities() || {};\n }\n\n return {};\n }\n\n /**\n * Returns a `MediaTrackSettings` object containing the current values of each of\n * the constrainable properties for the current MediaStreamTrack.\n *\n * @see https://developer.mozilla.org/docs/Web/API/MediaStreamTrack/getSettings\n * @returns {MediaTrackSettings | {}}\n */\n getTrackSettings() {\n if (!this.#stream) {\n return {};\n }\n\n const [track] = this.#stream.getVideoTracks();\n\n if (track && typeof track.getSettings === 'function') {\n return track.getSettings() || {};\n }\n\n return {};\n }\n\n /**\n * Checks if the `MediaDevices.getUserMedia()` method is supported.\n *\n * @returns {boolean}\n */\n static isSupported() {\n return Boolean(navigator.mediaDevices?.getUserMedia);\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='capture-photo'] - The name of the custom element.\n * @example\n *\n * CapturePhoto.defineCustomElement('my-capture-photo');\n */\n static defineCustomElement(elementName = COMPONENT_NAME) {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, CapturePhoto);\n }\n }\n}\n\nexport { CapturePhoto };\n","// @ts-check\n\n/**\n * Clamps number within the inclusive `min` and `max` bounds,\n * making sure it does not go beyond them on either side.\n * If `min` is greater than `max` the parameters are swapped to support inverted ranges.\n *\n * @param {number} value - The number to clamp.\n * @param {number} lower - The lower bound.\n * @param {number} upper - The upper bound.\n * @throws {TypeError} - If one or more of the arguments passed is not a number.\n * @returns {number} - The clamped number.\n * @example\n *\n * clamp(10, -5, 5);\n * // => 5\n *\n * clamp(-10, -5, 5);\n * // => -5\n *\n * clamp(-15, 0, 100);\n * // => 0\n *\n * clamp(120, 0, 100);\n * // => 100\n *\n * clamp(-5, NaN, 5); // If any of lower or upper bound are `NaN`, they will be converted to `0`.\n * // => 0\n *\n * clamp(120, 100, 0); // The order of lower and upper bounds is reversed (100 > 0)\n * // => 100\n */\nexport const clamp = (value, lower, upper) => {\n if (Number.isNaN(lower)) {\n lower = 0;\n }\n\n if (Number.isNaN(upper)) {\n upper = 0;\n }\n\n return Math.min(Math.max(value, Math.min(lower, upper)), Math.max(lower, upper));\n};\n","Object.defineProperty({},\"ModalElement\",{get:function(){return o},set:void 0,enumerable:!0,configurable:!0});let e=document.createElement(\"template\"),t=/* css */`\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n --dialog-placement-margin: calc((2em + 6px) / 2);\n\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n /* Dialog placement */\n :host(:not([fullscreen])[placement=\"top-start\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-center\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-end\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center-start\"]) .dialog {\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center\"]) .dialog {\n margin: auto;\n }\n\n :host(:not([fullscreen])[placement=\"center-end\"]) .dialog {\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-start\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-center\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-end\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n /* Dialog animations */\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: 300ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: end;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;e.innerHTML=/* html */`\n \n\n \n
\n
\n \n\n
\n \n
\n
\n\n \n\n
\n \n
\n
\n
\n`;/**\n * @summary A custom element that renders a modal dialog.\n * @documentation https://github.com/georapbox/modal-element\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines whether the modal is open or not.\n * @property {boolean} staticBackdrop - Determines whether the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines whether the modal should have a header or not.\n * @property {boolean} noAnimations - Determines whether the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines whether the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines whether the modal should be fullscreen or not.\n * @property {boolean} preserveOverflow - Determines whether the overflow of the body should be preserved when the modal is open.\n * @property {string} placement - Determines the placement of the modal.\n * @property {string} closeLabel - The label of the default close button, used as the aria-label attribute of the close button.\n *\n * @attribute {boolean} open - Reflects the open property.\n * @attribute {boolean} static-backdrop - Reflects the staticBackdrop property.\n * @attribute {boolean} no-header - Reflects the noHeader property.\n * @attribute {boolean} no-animations - Reflects the noAnimations property.\n * @attribute {boolean} no-close-button - Reflects the noCloseButton property.\n * @attribute {boolean} fullscreen - Reflects the fullscreen property.\n * @attribute {boolean} preserve-overflow - Reflects the preserveOverflow property.\n * @attribute {string} placement - Reflects the placement property.\n * @attribute {string} close-label - Reflects the closeLabel property.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n */class o extends HTMLElement{/** @type {Nullable} */#e=null;/** @type {Nullable} */#t=null;/** @type {Nullable} */#o=null;/** @type {ReturnType | undefined} */#l=void 0;constructor(){if(super(),!this.shadowRoot){let t=this.attachShadow({mode:\"open\"});t.appendChild(e.content.cloneNode(!0))}this.shadowRoot&&(this.#e=this.shadowRoot.querySelector(\"dialog\"),this.#t=this.shadowRoot.querySelector('slot[name=\"footer\"]'),this.#o=this.shadowRoot.querySelector('slot[name=\"close\"]'))}static get observedAttributes(){return[\"open\",\"no-header\",\"no-animations\",\"no-close-button\",\"close-label\"]}/**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */attributeChangedCallback(e,t,o){if(null!==this.#e){if(\"open\"===e&&t!==o&&(this.open?(this.#e.showModal(),this.dispatchEvent(new CustomEvent(\"me-open\",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow=\"hidden\")):this.#e.close()),\"no-header\"===e&&t!==o){/** @type {Nullable} */let e=this.#e.querySelector(\".dialog__header\");null!==e&&(e.hidden=this.noHeader)}if(\"no-animations\"===e&&t!==o&&this.#e.classList.toggle(\"dialog--no-animations\",this.noAnimations),\"no-close-button\"===e&&t!==o){/** @type {Nullable} */let e=this.#e.querySelector(\".dialog__close\");null!==e&&(e.hidden=this.noCloseButton)}\"close-label\"===e&&t!==o&&this.#a()}}/**\n * Lifecycle method that is called when the element is added to the DOM.\n */connectedCallback(){this.#i(\"open\"),this.#i(\"staticBackdrop\"),this.#i(\"noHeader\"),this.#i(\"noAnimations\"),this.#i(\"noCloseButton\"),this.#i(\"fullscreen\"),this.#i(\"preserveOverflow\"),this.#i(\"placement\"),this.#i(\"closeLabel\"),this.#e?.addEventListener(\"click\",this.#n),this.#e?.addEventListener(\"close\",this.#r),this.#e?.addEventListener(\"cancel\",this.#s),this.#e?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\",this.#d),this.#t?.addEventListener(\"slotchange\",this.#c),this.#o?.addEventListener(\"slotchange\",this.#h)}/**\n * Lifecycle method that is called when the element is removed from the DOM.\n */disconnectedCallback(){this.#l&&clearTimeout(this.#l),this.#e?.addEventListener(\"click\",this.#n),this.#e?.removeEventListener(\"close\",this.#r),this.#e?.removeEventListener(\"cancel\",this.#s),this.#e?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\",this.#d),this.#t?.removeEventListener(\"slotchange\",this.#c),this.#o?.removeEventListener(\"slotchange\",this.#h)}/**\n * Deternimes if the modal is open or not.\n *\n * @type {boolean} - True if the modal is open, otherwise false.\n * @default false\n * @attribute open - Reflects the open property.\n */get open(){return this.hasAttribute(\"open\")}set open(e){this.toggleAttribute(\"open\",!!e)}/**\n * Determines whether the modal should close when the backdrop is clicked.\n *\n * @type {boolean} - True if the modal should close when the backdrop is clicked, otherwise false.\n * @default false\n * @attribute static-backdrop - Reflects the staticBackdrop property.\n */get staticBackdrop(){return this.hasAttribute(\"static-backdrop\")}set staticBackdrop(e){this.toggleAttribute(\"static-backdrop\",!!e)}/**\n * Determines whether the modal should have a header or not.\n *\n * @type {boolean} - True if the modal should have a header, otherwise false.\n * @default false\n * @attribute no-header - Reflects the noHeader property.\n */get noHeader(){return this.hasAttribute(\"no-header\")}set noHeader(e){this.toggleAttribute(\"no-header\",!!e)}/**\n * Determines whether the modal should have animations or not when opening and closing.\n *\n * @type {boolean} - True if the modal should have animations, otherwise false.\n * @default false\n * @attribute no-animations - Reflects the noAnimations property.\n */get noAnimations(){return this.hasAttribute(\"no-animations\")}set noAnimations(e){this.toggleAttribute(\"no-animations\",!!e)}/**\n * Determines whether the modal should have a default close button or not.\n *\n * @type {boolean} - True if the modal should have a close button, otherwise false.\n * @default false\n * @attribute no-close-button - Reflects the noCloseButton property.\n */get noCloseButton(){return this.hasAttribute(\"no-close-button\")}set noCloseButton(e){this.toggleAttribute(\"no-close-button\",!!e)}/**\n * Determines whether the modal should be fullscreen or not.\n *\n * @type {boolean} - True if the modal should be fullscreen, otherwise false.\n * @default false\n * @attribute fullscreen - Reflects the fullscreen property.\n */get fullscreen(){return this.hasAttribute(\"fullscreen\")}set fullscreen(e){this.toggleAttribute(\"fullscreen\",!!e)}/**\n * Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @type {boolean} - True if the overflow of the body should be preserved, otherwise false.\n * @default false\n * @attribute preserve-overflow - Reflects the preserveOverflow property.\n */get preserveOverflow(){return this.hasAttribute(\"preserve-overflow\")}set preserveOverflow(e){this.toggleAttribute(\"preserve-overflow\",!!e)}/**\n * Determines the placement of the modal.\n * Possible values are 'top-start', 'top-center', 'top-end', 'center-start', 'center', 'center-end', 'bottom-start', 'bottom-center', 'bottom-end'.\n *\n * @type {string}\n * @default 'center'\n * @attribute placement - Reflects the placement property.\n */get placement(){return this.getAttribute(\"placement\")||\"center\"}set placement(e){this.setAttribute(\"placement\",null!=e?e.toString():e)}/**\n * The label of the default close button, used as the aria-label attribute of the close button.\n * If user provides text content for the close button using the `close` slot, this property is ignored and the aria-label attribute is removed.\n *\n * @type {string}\n * @default 'Close'\n * @attribute close-label - Reflects the closeLabel property.\n */get closeLabel(){return this.getAttribute(\"close-label\")||\"Close\"}set closeLabel(e){this.setAttribute(\"close-label\",null!=e?e.toString():e)}/**\n * Updates the aria-label attribute of the close button.\n * If the slot for the close button has text content, the aria-label attribute is removed to allow the text content to be used as the label.\n * Otherwise, the aria-label attribute is set to the `closeLabel` property.\n *\n * @returns\n */#a(){if(null===this.#e)return;let e=this.#e.querySelector(\".dialog__close\");if(null===e)return;let t=this.#o?.assignedElements()||[],o=t?.some(e=>e.textContent?.replace(/\\s/g,\"\")!==\"\");o?e.removeAttribute(\"aria-label\"):e.setAttribute(\"aria-label\",this.closeLabel)}/**\n * Applies a pulse effect on the dialog.\n */#g(){this.#l||(this.#e?.classList.add(\"dialog--pulse\"),this.#l=setTimeout(()=>{this.#e?.classList.remove(\"dialog--pulse\"),clearTimeout(this.#l),this.#l=void 0},300))}/**\n * Handles the close event of the dialog.\n */#r=()=>{// This is required because the dialog element does not reset\n// the open property when the dialog is closed by the user.\nthis.open=!1,this.dispatchEvent(new CustomEvent(\"me-close\",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow=\"\")};/**\n * Handles the cancel event of the dialog.\n * This event is fired when the user presses the escape key.\n *\n * @param {Event} evt - The cancel event.\n */#s=e=>{let t=this.#m(\"escape-key\");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#g())};/**\n * Handles the click event of the close button.\n *\n * @param {Event} evt - The click event.\n */#d=e=>{let t=this.#m(\"close-button\");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#g())};/**\n * Handles the click event of the dialog.\n *\n * @param {MouseEvent} evt - The click event.\n */#n=e=>{let t=e.target,o=e.currentTarget;// Close the dialog when the backdrop is clicked.\nif(t===o){let e=this.#m(\"backdrop-click\");this.dispatchEvent(e),e.defaultPrevented||this.staticBackdrop?this.noAnimations||this.#g():this.hide()}// Close the dialog when external invoker is clicked.\nif(t instanceof HTMLElement&&null!==t.closest(\"[data-me-close]\")){let e=this.#m(\"external-invoker\");this.dispatchEvent(e),e.defaultPrevented?this.noAnimations||this.#g():this.hide()}};/**\n * Handles the slotchange event of the footer slot.\n */#c=()=>{if(null===this.#e)return;/** @type {Nullable} */let e=this.#e.querySelector(\".dialog__footer\");if(null===e)return;let t=this.#t?.assignedNodes(),o=!!t&&t.length>0;e.hidden=!o};/**\n * Handles the slotchange event of the close slot.\n */#h=()=>{this.#a()};/**\n * Creates a request close event.\n *\n * @param {CloseRequestReason} reason - The reason that the modal is about to close.\n */#m(e){return new CustomEvent(\"me-request-close\",{bubbles:!0,composed:!0,cancelable:!0,detail:{reason:e,element:this}})}/**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'open' | 'staticBackdrop' | 'noHeader' | 'noAnimations' | 'noCloseButton' | 'fullscreen' | 'preserveOverflow' | 'placement' | 'closeLabel'} prop - The property to upgrade.\n */#i(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}/**\n * Opens the modal if it is closed, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.show();\n */show(){this.open||(this.open=!0)}/**\n * Closes the modal if it is open, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.hide();\n */hide(){this.open&&(this.open=!1)}/**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='modal-element']\n * @example\n * ModalElement.defineCustomElement('my-modal');\n */static defineCustomElement(e=\"modal-element\"){\"undefined\"==typeof window||window.customElements.get(e)||window.customElements.define(e,o)}}o.defineCustomElement();export{o as ModalElement};//# sourceMappingURL=modal-element-defined.js.map\n\n//# sourceMappingURL=modal-element-defined.js.map\n","function $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $180b6dcf923bafc7$exports = {};\n\n$parcel$export($180b6dcf923bafc7$exports, \"ModalElement\", function () { return $180b6dcf923bafc7$export$32589115725b904b; });\n// @ts-check\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */ /**\n * Available values for the request close reason.\n *\n * @typedef {'close-button' | 'escape-key' | 'backdrop-click' | 'external-invoker'} CloseRequestReason\n */ const $180b6dcf923bafc7$var$PULSE_ANIMATION_DURATION = 300; // milliseconds\nconst $180b6dcf923bafc7$var$template = document.createElement(\"template\");\nconst $180b6dcf923bafc7$var$styles = /* css */ `\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n --dialog-placement-margin: calc((2em + 6px) / 2);\n\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n /* Dialog placement */\n :host(:not([fullscreen])[placement=\"top-start\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-center\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-end\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center-start\"]) .dialog {\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center\"]) .dialog {\n margin: auto;\n }\n\n :host(:not([fullscreen])[placement=\"center-end\"]) .dialog {\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-start\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-center\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-end\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n /* Dialog animations */\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: ${$180b6dcf923bafc7$var$PULSE_ANIMATION_DURATION}ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: end;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n$180b6dcf923bafc7$var$template.innerHTML = /* html */ `\n \n\n \n
\n
\n \n\n
\n \n
\n
\n\n \n\n
\n \n
\n
\n
\n`;\n/**\n * @summary A custom element that renders a modal dialog.\n * @documentation https://github.com/georapbox/modal-element\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines whether the modal is open or not.\n * @property {boolean} staticBackdrop - Determines whether the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines whether the modal should have a header or not.\n * @property {boolean} noAnimations - Determines whether the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines whether the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines whether the modal should be fullscreen or not.\n * @property {boolean} preserveOverflow - Determines whether the overflow of the body should be preserved when the modal is open.\n * @property {string} placement - Determines the placement of the modal.\n * @property {string} closeLabel - The label of the default close button, used as the aria-label attribute of the close button.\n *\n * @attribute {boolean} open - Reflects the open property.\n * @attribute {boolean} static-backdrop - Reflects the staticBackdrop property.\n * @attribute {boolean} no-header - Reflects the noHeader property.\n * @attribute {boolean} no-animations - Reflects the noAnimations property.\n * @attribute {boolean} no-close-button - Reflects the noCloseButton property.\n * @attribute {boolean} fullscreen - Reflects the fullscreen property.\n * @attribute {boolean} preserve-overflow - Reflects the preserveOverflow property.\n * @attribute {string} placement - Reflects the placement property.\n * @attribute {string} close-label - Reflects the closeLabel property.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n */ class $180b6dcf923bafc7$export$32589115725b904b extends HTMLElement {\n /** @type {Nullable} */ #dialogEl = null;\n /** @type {Nullable} */ #footerSlotEl = null;\n /** @type {Nullable} */ #closeSlotEl = null;\n /** @type {ReturnType | undefined} */ #pulseAnimationTimeout = void 0;\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\"\n });\n shadowRoot.appendChild($180b6dcf923bafc7$var$template.content.cloneNode(true));\n }\n if (this.shadowRoot) {\n this.#dialogEl = this.shadowRoot.querySelector(\"dialog\");\n this.#footerSlotEl = this.shadowRoot.querySelector('slot[name=\"footer\"]');\n this.#closeSlotEl = this.shadowRoot.querySelector('slot[name=\"close\"]');\n }\n }\n static get observedAttributes() {\n return [\n \"open\",\n \"no-header\",\n \"no-animations\",\n \"no-close-button\",\n \"close-label\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (this.#dialogEl === null) return;\n if (name === \"open\" && oldValue !== newValue) {\n if (this.open) {\n this.#dialogEl.showModal();\n this.dispatchEvent(new CustomEvent(\"me-open\", {\n bubbles: true,\n composed: true,\n detail: {\n element: this\n }\n }));\n if (document.body && !this.preserveOverflow) document.body.style.overflow = \"hidden\";\n } else this.#dialogEl.close();\n }\n if (name === \"no-header\" && oldValue !== newValue) {\n /** @type {Nullable} */ const headerEl = this.#dialogEl.querySelector(\".dialog__header\");\n if (headerEl !== null) headerEl.hidden = this.noHeader;\n }\n if (name === \"no-animations\" && oldValue !== newValue) this.#dialogEl.classList.toggle(\"dialog--no-animations\", this.noAnimations);\n if (name === \"no-close-button\" && oldValue !== newValue) {\n /** @type {Nullable} */ const closeBtnEl = this.#dialogEl.querySelector(\".dialog__close\");\n if (closeBtnEl !== null) closeBtnEl.hidden = this.noCloseButton;\n }\n if (name === \"close-label\" && oldValue !== newValue) this.#updateCloseLabel();\n }\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"open\");\n this.#upgradeProperty(\"staticBackdrop\");\n this.#upgradeProperty(\"noHeader\");\n this.#upgradeProperty(\"noAnimations\");\n this.#upgradeProperty(\"noCloseButton\");\n this.#upgradeProperty(\"fullscreen\");\n this.#upgradeProperty(\"preserveOverflow\");\n this.#upgradeProperty(\"placement\");\n this.#upgradeProperty(\"closeLabel\");\n this.#dialogEl?.addEventListener(\"click\", this.#handleDialogClick);\n this.#dialogEl?.addEventListener(\"close\", this.#handleDialogClose);\n this.#dialogEl?.addEventListener(\"cancel\", this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\", this.#handleCloseButtonClick);\n this.#footerSlotEl?.addEventListener(\"slotchange\", this.#handleFooterSlotChange);\n this.#closeSlotEl?.addEventListener(\"slotchange\", this.#handleCloseSlotChange);\n }\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */ disconnectedCallback() {\n this.#pulseAnimationTimeout && clearTimeout(this.#pulseAnimationTimeout);\n this.#dialogEl?.addEventListener(\"click\", this.#handleDialogClick);\n this.#dialogEl?.removeEventListener(\"close\", this.#handleDialogClose);\n this.#dialogEl?.removeEventListener(\"cancel\", this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\", this.#handleCloseButtonClick);\n this.#footerSlotEl?.removeEventListener(\"slotchange\", this.#handleFooterSlotChange);\n this.#closeSlotEl?.removeEventListener(\"slotchange\", this.#handleCloseSlotChange);\n }\n /**\n * Deternimes if the modal is open or not.\n *\n * @type {boolean} - True if the modal is open, otherwise false.\n * @default false\n * @attribute open - Reflects the open property.\n */ get open() {\n return this.hasAttribute(\"open\");\n }\n set open(value) {\n this.toggleAttribute(\"open\", !!value);\n }\n /**\n * Determines whether the modal should close when the backdrop is clicked.\n *\n * @type {boolean} - True if the modal should close when the backdrop is clicked, otherwise false.\n * @default false\n * @attribute static-backdrop - Reflects the staticBackdrop property.\n */ get staticBackdrop() {\n return this.hasAttribute(\"static-backdrop\");\n }\n set staticBackdrop(value) {\n this.toggleAttribute(\"static-backdrop\", !!value);\n }\n /**\n * Determines whether the modal should have a header or not.\n *\n * @type {boolean} - True if the modal should have a header, otherwise false.\n * @default false\n * @attribute no-header - Reflects the noHeader property.\n */ get noHeader() {\n return this.hasAttribute(\"no-header\");\n }\n set noHeader(value) {\n this.toggleAttribute(\"no-header\", !!value);\n }\n /**\n * Determines whether the modal should have animations or not when opening and closing.\n *\n * @type {boolean} - True if the modal should have animations, otherwise false.\n * @default false\n * @attribute no-animations - Reflects the noAnimations property.\n */ get noAnimations() {\n return this.hasAttribute(\"no-animations\");\n }\n set noAnimations(value) {\n this.toggleAttribute(\"no-animations\", !!value);\n }\n /**\n * Determines whether the modal should have a default close button or not.\n *\n * @type {boolean} - True if the modal should have a close button, otherwise false.\n * @default false\n * @attribute no-close-button - Reflects the noCloseButton property.\n */ get noCloseButton() {\n return this.hasAttribute(\"no-close-button\");\n }\n set noCloseButton(value) {\n this.toggleAttribute(\"no-close-button\", !!value);\n }\n /**\n * Determines whether the modal should be fullscreen or not.\n *\n * @type {boolean} - True if the modal should be fullscreen, otherwise false.\n * @default false\n * @attribute fullscreen - Reflects the fullscreen property.\n */ get fullscreen() {\n return this.hasAttribute(\"fullscreen\");\n }\n set fullscreen(value) {\n this.toggleAttribute(\"fullscreen\", !!value);\n }\n /**\n * Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @type {boolean} - True if the overflow of the body should be preserved, otherwise false.\n * @default false\n * @attribute preserve-overflow - Reflects the preserveOverflow property.\n */ get preserveOverflow() {\n return this.hasAttribute(\"preserve-overflow\");\n }\n set preserveOverflow(value) {\n this.toggleAttribute(\"preserve-overflow\", !!value);\n }\n /**\n * Determines the placement of the modal.\n * Possible values are 'top-start', 'top-center', 'top-end', 'center-start', 'center', 'center-end', 'bottom-start', 'bottom-center', 'bottom-end'.\n *\n * @type {string}\n * @default 'center'\n * @attribute placement - Reflects the placement property.\n */ get placement() {\n return this.getAttribute(\"placement\") || \"center\";\n }\n set placement(value) {\n this.setAttribute(\"placement\", value != null ? value.toString() : value);\n }\n /**\n * The label of the default close button, used as the aria-label attribute of the close button.\n * If user provides text content for the close button using the `close` slot, this property is ignored and the aria-label attribute is removed.\n *\n * @type {string}\n * @default 'Close'\n * @attribute close-label - Reflects the closeLabel property.\n */ get closeLabel() {\n return this.getAttribute(\"close-label\") || \"Close\";\n }\n set closeLabel(value) {\n this.setAttribute(\"close-label\", value != null ? value.toString() : value);\n }\n /**\n * Updates the aria-label attribute of the close button.\n * If the slot for the close button has text content, the aria-label attribute is removed to allow the text content to be used as the label.\n * Otherwise, the aria-label attribute is set to the `closeLabel` property.\n *\n * @returns\n */ #updateCloseLabel() {\n if (this.#dialogEl === null) return;\n const closeButtonEl = this.#dialogEl.querySelector(\".dialog__close\");\n if (closeButtonEl === null) return;\n const assignedElements = this.#closeSlotEl?.assignedElements() || [];\n const hasTextContent = assignedElements?.some((el)=>el.textContent?.replace(/\\s/g, \"\") !== \"\");\n hasTextContent ? closeButtonEl.removeAttribute(\"aria-label\") : closeButtonEl.setAttribute(\"aria-label\", this.closeLabel);\n }\n /**\n * Applies a pulse effect on the dialog.\n */ #applyPulseEffectOnDialog() {\n if (this.#pulseAnimationTimeout) return;\n this.#dialogEl?.classList.add(\"dialog--pulse\");\n this.#pulseAnimationTimeout = setTimeout(()=>{\n this.#dialogEl?.classList.remove(\"dialog--pulse\");\n clearTimeout(this.#pulseAnimationTimeout);\n this.#pulseAnimationTimeout = void 0;\n }, $180b6dcf923bafc7$var$PULSE_ANIMATION_DURATION);\n }\n /**\n * Handles the close event of the dialog.\n */ #handleDialogClose = ()=>{\n // This is required because the dialog element does not reset\n // the open property when the dialog is closed by the user.\n this.open = false;\n this.dispatchEvent(new CustomEvent(\"me-close\", {\n bubbles: true,\n composed: true,\n detail: {\n element: this\n }\n }));\n if (document.body && !this.preserveOverflow) document.body.style.overflow = \"\";\n };\n /**\n * Handles the cancel event of the dialog.\n * This event is fired when the user presses the escape key.\n *\n * @param {Event} evt - The cancel event.\n */ #handleDialogCancel = (evt)=>{\n const requestCloseEvent = this.#createRequestCloseEvent(\"escape-key\");\n this.dispatchEvent(requestCloseEvent);\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n /**\n * Handles the click event of the close button.\n *\n * @param {Event} evt - The click event.\n */ #handleCloseButtonClick = (evt)=>{\n const requestCloseEvent = this.#createRequestCloseEvent(\"close-button\");\n this.dispatchEvent(requestCloseEvent);\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n /**\n * Handles the click event of the dialog.\n *\n * @param {MouseEvent} evt - The click event.\n */ #handleDialogClick = (evt)=>{\n const target = evt.target;\n const currentTarget = evt.currentTarget;\n // Close the dialog when the backdrop is clicked.\n if (target === currentTarget) {\n const requestCloseEvent = this.#createRequestCloseEvent(\"backdrop-click\");\n this.dispatchEvent(requestCloseEvent);\n if (requestCloseEvent.defaultPrevented || this.staticBackdrop) !this.noAnimations && this.#applyPulseEffectOnDialog();\n else this.hide();\n }\n // Close the dialog when external invoker is clicked.\n if (target instanceof HTMLElement && target.closest(\"[data-me-close]\") !== null) {\n const requestCloseEvent = this.#createRequestCloseEvent(\"external-invoker\");\n this.dispatchEvent(requestCloseEvent);\n if (requestCloseEvent.defaultPrevented) !this.noAnimations && this.#applyPulseEffectOnDialog();\n else this.hide();\n }\n };\n /**\n * Handles the slotchange event of the footer slot.\n */ #handleFooterSlotChange = ()=>{\n if (this.#dialogEl === null) return;\n /** @type {Nullable} */ const footerEl = this.#dialogEl.querySelector(\".dialog__footer\");\n if (footerEl === null) return;\n const footerSlotNodes = this.#footerSlotEl?.assignedNodes();\n const hasFooterSlotNodes = footerSlotNodes ? footerSlotNodes.length > 0 : false;\n footerEl.hidden = !hasFooterSlotNodes;\n };\n /**\n * Handles the slotchange event of the close slot.\n */ #handleCloseSlotChange = ()=>{\n this.#updateCloseLabel();\n };\n /**\n * Creates a request close event.\n *\n * @param {CloseRequestReason} reason - The reason that the modal is about to close.\n */ #createRequestCloseEvent(reason) {\n return new CustomEvent(\"me-request-close\", {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: {\n reason: reason,\n element: this\n }\n });\n }\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'open' | 'staticBackdrop' | 'noHeader' | 'noAnimations' | 'noCloseButton' | 'fullscreen' | 'preserveOverflow' | 'placement' | 'closeLabel'} prop - The property to upgrade.\n */ #upgradeProperty(prop) {\n /** @type {any} */ const instance = this;\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n /**\n * Opens the modal if it is closed, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.show();\n */ show() {\n if (this.open) return;\n this.open = true;\n }\n /**\n * Closes the modal if it is open, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.hide();\n */ hide() {\n if (!this.open) return;\n this.open = false;\n }\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='modal-element']\n * @example\n * ModalElement.defineCustomElement('my-modal');\n */ static defineCustomElement(elementName = \"modal-element\") {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $180b6dcf923bafc7$export$32589115725b904b);\n }\n}\n\n\n(0, $180b6dcf923bafc7$export$32589115725b904b).defineCustomElement();\n\n\nexport {$180b6dcf923bafc7$export$32589115725b904b as ModalElement};\n//# sourceMappingURL=modal-element-defined.js.map\n","import { ModalElement } from './modal-element.js';\n\nModalElement.defineCustomElement();\n\nexport { ModalElement };\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\n/**\n * Available values for the request close reason.\n *\n * @typedef {'close-button' | 'escape-key' | 'backdrop-click' | 'external-invoker'} CloseRequestReason\n */\n\nconst PULSE_ANIMATION_DURATION = 300; // milliseconds\nconst template = document.createElement('template');\n\nconst styles = /* css */`\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n --dialog-placement-margin: calc((2em + 6px) / 2);\n\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n /* Dialog placement */\n :host(:not([fullscreen])[placement=\"top-start\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-center\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-end\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center-start\"]) .dialog {\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center\"]) .dialog {\n margin: auto;\n }\n\n :host(:not([fullscreen])[placement=\"center-end\"]) .dialog {\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-start\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-center\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-end\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n /* Dialog animations */\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: ${PULSE_ANIMATION_DURATION}ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: end;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n\ntemplate.innerHTML = /* html */`\n \n\n \n
\n
\n \n\n
\n \n
\n
\n\n \n\n
\n \n
\n
\n
\n`;\n\n/**\n * @summary A custom element that renders a modal dialog.\n * @documentation https://github.com/georapbox/modal-element\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines whether the modal is open or not.\n * @property {boolean} staticBackdrop - Determines whether the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines whether the modal should have a header or not.\n * @property {boolean} noAnimations - Determines whether the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines whether the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines whether the modal should be fullscreen or not.\n * @property {boolean} preserveOverflow - Determines whether the overflow of the body should be preserved when the modal is open.\n * @property {string} placement - Determines the placement of the modal.\n * @property {string} closeLabel - The label of the default close button, used as the aria-label attribute of the close button.\n *\n * @attribute {boolean} open - Reflects the open property.\n * @attribute {boolean} static-backdrop - Reflects the staticBackdrop property.\n * @attribute {boolean} no-header - Reflects the noHeader property.\n * @attribute {boolean} no-animations - Reflects the noAnimations property.\n * @attribute {boolean} no-close-button - Reflects the noCloseButton property.\n * @attribute {boolean} fullscreen - Reflects the fullscreen property.\n * @attribute {boolean} preserve-overflow - Reflects the preserveOverflow property.\n * @attribute {string} placement - Reflects the placement property.\n * @attribute {string} close-label - Reflects the closeLabel property.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n */\nclass ModalElement extends HTMLElement {\n /** @type {Nullable} */\n #dialogEl = null;\n\n /** @type {Nullable} */\n #footerSlotEl = null;\n\n /** @type {Nullable} */\n #closeSlotEl = null;\n\n /** @type {ReturnType | undefined} */\n #pulseAnimationTimeout = void 0;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n if (this.shadowRoot) {\n this.#dialogEl = this.shadowRoot.querySelector('dialog');\n this.#footerSlotEl = this.shadowRoot.querySelector('slot[name=\"footer\"]');\n this.#closeSlotEl = this.shadowRoot.querySelector('slot[name=\"close\"]');\n }\n }\n\n static get observedAttributes() {\n return ['open', 'no-header', 'no-animations', 'no-close-button', 'close-label'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (this.#dialogEl === null) {\n return;\n }\n\n if (name === 'open' && oldValue !== newValue) {\n if (this.open) {\n this.#dialogEl.showModal();\n\n this.dispatchEvent(new CustomEvent('me-open', {\n bubbles: true,\n composed: true,\n detail: { element: this }\n }));\n\n if (document.body && !this.preserveOverflow) {\n document.body.style.overflow = 'hidden';\n }\n } else {\n this.#dialogEl.close();\n }\n }\n\n if (name === 'no-header' && oldValue !== newValue) {\n /** @type {Nullable} */\n const headerEl = this.#dialogEl.querySelector('.dialog__header');\n\n if (headerEl !== null) {\n headerEl.hidden = this.noHeader;\n }\n }\n\n if (name === 'no-animations' && oldValue !== newValue) {\n this.#dialogEl.classList.toggle('dialog--no-animations', this.noAnimations);\n }\n\n if (name === 'no-close-button' && oldValue !== newValue) {\n /** @type {Nullable} */\n const closeBtnEl = this.#dialogEl.querySelector('.dialog__close');\n\n if (closeBtnEl !== null) {\n closeBtnEl.hidden = this.noCloseButton;\n }\n }\n\n if (name === 'close-label' && oldValue !== newValue) {\n this.#updateCloseLabel();\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('open');\n this.#upgradeProperty('staticBackdrop');\n this.#upgradeProperty('noHeader');\n this.#upgradeProperty('noAnimations');\n this.#upgradeProperty('noCloseButton');\n this.#upgradeProperty('fullscreen');\n this.#upgradeProperty('preserveOverflow');\n this.#upgradeProperty('placement');\n this.#upgradeProperty('closeLabel');\n\n this.#dialogEl?.addEventListener('click', this.#handleDialogClick);\n this.#dialogEl?.addEventListener('close', this.#handleDialogClose);\n this.#dialogEl?.addEventListener('cancel', this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.addEventListener('submit', this.#handleCloseButtonClick);\n this.#footerSlotEl?.addEventListener('slotchange', this.#handleFooterSlotChange);\n this.#closeSlotEl?.addEventListener('slotchange', this.#handleCloseSlotChange);\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#pulseAnimationTimeout && clearTimeout(this.#pulseAnimationTimeout);\n this.#dialogEl?.addEventListener('click', this.#handleDialogClick);\n this.#dialogEl?.removeEventListener('close', this.#handleDialogClose);\n this.#dialogEl?.removeEventListener('cancel', this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.removeEventListener('submit', this.#handleCloseButtonClick);\n this.#footerSlotEl?.removeEventListener('slotchange', this.#handleFooterSlotChange);\n this.#closeSlotEl?.removeEventListener('slotchange', this.#handleCloseSlotChange);\n }\n\n /**\n * Deternimes if the modal is open or not.\n *\n * @type {boolean} - True if the modal is open, otherwise false.\n * @default false\n * @attribute open - Reflects the open property.\n */\n get open() {\n return this.hasAttribute('open');\n }\n\n set open(value) {\n this.toggleAttribute('open', !!value);\n }\n\n /**\n * Determines whether the modal should close when the backdrop is clicked.\n *\n * @type {boolean} - True if the modal should close when the backdrop is clicked, otherwise false.\n * @default false\n * @attribute static-backdrop - Reflects the staticBackdrop property.\n */\n get staticBackdrop() {\n return this.hasAttribute('static-backdrop');\n }\n\n set staticBackdrop(value) {\n this.toggleAttribute('static-backdrop', !!value);\n }\n\n /**\n * Determines whether the modal should have a header or not.\n *\n * @type {boolean} - True if the modal should have a header, otherwise false.\n * @default false\n * @attribute no-header - Reflects the noHeader property.\n */\n get noHeader() {\n return this.hasAttribute('no-header');\n }\n\n set noHeader(value) {\n this.toggleAttribute('no-header', !!value);\n }\n\n /**\n * Determines whether the modal should have animations or not when opening and closing.\n *\n * @type {boolean} - True if the modal should have animations, otherwise false.\n * @default false\n * @attribute no-animations - Reflects the noAnimations property.\n */\n get noAnimations() {\n return this.hasAttribute('no-animations');\n }\n\n set noAnimations(value) {\n this.toggleAttribute('no-animations', !!value);\n }\n\n /**\n * Determines whether the modal should have a default close button or not.\n *\n * @type {boolean} - True if the modal should have a close button, otherwise false.\n * @default false\n * @attribute no-close-button - Reflects the noCloseButton property.\n */\n get noCloseButton() {\n return this.hasAttribute('no-close-button');\n }\n\n set noCloseButton(value) {\n this.toggleAttribute('no-close-button', !!value);\n }\n\n /**\n * Determines whether the modal should be fullscreen or not.\n *\n * @type {boolean} - True if the modal should be fullscreen, otherwise false.\n * @default false\n * @attribute fullscreen - Reflects the fullscreen property.\n */\n get fullscreen() {\n return this.hasAttribute('fullscreen');\n }\n\n set fullscreen(value) {\n this.toggleAttribute('fullscreen', !!value);\n }\n\n /**\n * Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @type {boolean} - True if the overflow of the body should be preserved, otherwise false.\n * @default false\n * @attribute preserve-overflow - Reflects the preserveOverflow property.\n */\n get preserveOverflow() {\n return this.hasAttribute('preserve-overflow');\n }\n\n set preserveOverflow(value) {\n this.toggleAttribute('preserve-overflow', !!value);\n }\n\n /**\n * Determines the placement of the modal.\n * Possible values are 'top-start', 'top-center', 'top-end', 'center-start', 'center', 'center-end', 'bottom-start', 'bottom-center', 'bottom-end'.\n *\n * @type {string}\n * @default 'center'\n * @attribute placement - Reflects the placement property.\n */\n get placement() {\n return this.getAttribute('placement') || 'center';\n }\n\n set placement(value) {\n this.setAttribute('placement', value != null ? value.toString() : value);\n }\n\n /**\n * The label of the default close button, used as the aria-label attribute of the close button.\n * If user provides text content for the close button using the `close` slot, this property is ignored and the aria-label attribute is removed.\n *\n * @type {string}\n * @default 'Close'\n * @attribute close-label - Reflects the closeLabel property.\n */\n get closeLabel() {\n return this.getAttribute('close-label') || 'Close';\n }\n\n set closeLabel(value) {\n this.setAttribute('close-label', value != null ? value.toString() : value);\n }\n\n /**\n * Updates the aria-label attribute of the close button.\n * If the slot for the close button has text content, the aria-label attribute is removed to allow the text content to be used as the label.\n * Otherwise, the aria-label attribute is set to the `closeLabel` property.\n *\n * @returns\n */\n #updateCloseLabel() {\n if (this.#dialogEl === null) {\n return;\n }\n\n const closeButtonEl = this.#dialogEl.querySelector('.dialog__close');\n\n if (closeButtonEl === null) {\n return;\n }\n\n const assignedElements = this.#closeSlotEl?.assignedElements() || [];\n const hasTextContent = assignedElements?.some(el => el.textContent?.replace(/\\s/g, '') !== '');\n\n hasTextContent\n ? closeButtonEl.removeAttribute('aria-label')\n : closeButtonEl.setAttribute('aria-label', this.closeLabel);\n }\n\n /**\n * Applies a pulse effect on the dialog.\n */\n #applyPulseEffectOnDialog() {\n if (this.#pulseAnimationTimeout) {\n return;\n }\n\n this.#dialogEl?.classList.add('dialog--pulse');\n\n this.#pulseAnimationTimeout = setTimeout(() => {\n this.#dialogEl?.classList.remove('dialog--pulse');\n clearTimeout(this.#pulseAnimationTimeout);\n this.#pulseAnimationTimeout = void 0;\n }, PULSE_ANIMATION_DURATION);\n }\n\n /**\n * Handles the close event of the dialog.\n */\n #handleDialogClose = () => {\n // This is required because the dialog element does not reset\n // the open property when the dialog is closed by the user.\n this.open = false;\n\n this.dispatchEvent(new CustomEvent('me-close', {\n bubbles: true,\n composed: true,\n detail: { element: this }\n }));\n\n if (document.body && !this.preserveOverflow) {\n document.body.style.overflow = '';\n }\n };\n\n /**\n * Handles the cancel event of the dialog.\n * This event is fired when the user presses the escape key.\n *\n * @param {Event} evt - The cancel event.\n */\n #handleDialogCancel = evt => {\n const requestCloseEvent = this.#createRequestCloseEvent('escape-key');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n\n /**\n * Handles the click event of the close button.\n *\n * @param {Event} evt - The click event.\n */\n #handleCloseButtonClick = evt => {\n const requestCloseEvent = this.#createRequestCloseEvent('close-button');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n\n /**\n * Handles the click event of the dialog.\n *\n * @param {MouseEvent} evt - The click event.\n */\n #handleDialogClick = evt => {\n const target = evt.target;\n const currentTarget = evt.currentTarget;\n\n // Close the dialog when the backdrop is clicked.\n if (target === currentTarget) {\n const requestCloseEvent = this.#createRequestCloseEvent('backdrop-click');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented || this.staticBackdrop) {\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n } else {\n this.hide();\n }\n }\n\n // Close the dialog when external invoker is clicked.\n if (target instanceof HTMLElement && target.closest('[data-me-close]') !== null) {\n const requestCloseEvent = this.#createRequestCloseEvent('external-invoker');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented) {\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n } else {\n this.hide();\n }\n }\n };\n\n /**\n * Handles the slotchange event of the footer slot.\n */\n #handleFooterSlotChange = () => {\n if (this.#dialogEl === null) {\n return;\n }\n\n /** @type {Nullable} */\n const footerEl = this.#dialogEl.querySelector('.dialog__footer');\n\n if (footerEl === null) {\n return;\n }\n\n const footerSlotNodes = this.#footerSlotEl?.assignedNodes();\n const hasFooterSlotNodes = footerSlotNodes ? footerSlotNodes.length > 0 : false;\n\n footerEl.hidden = !hasFooterSlotNodes;\n };\n\n /**\n * Handles the slotchange event of the close slot.\n */\n #handleCloseSlotChange = () => {\n this.#updateCloseLabel();\n };\n\n /**\n * Creates a request close event.\n *\n * @param {CloseRequestReason} reason - The reason that the modal is about to close.\n */\n #createRequestCloseEvent(reason) {\n return new CustomEvent('me-request-close', {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: {\n reason,\n element: this\n }\n });\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'open' | 'staticBackdrop' | 'noHeader' | 'noAnimations' | 'noCloseButton' | 'fullscreen' | 'preserveOverflow' | 'placement' | 'closeLabel'} prop - The property to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Opens the modal if it is closed, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.show();\n */\n show() {\n if (this.open) {\n return;\n }\n\n this.open = true;\n }\n\n /**\n * Closes the modal if it is open, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.hide();\n */\n hide() {\n if (!this.open) {\n return;\n }\n\n this.open = false;\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='modal-element']\n * @example\n * ModalElement.defineCustomElement('my-modal');\n */\n static defineCustomElement(elementName = 'modal-element') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, ModalElement);\n }\n }\n}\n\nexport { ModalElement };\n","Object.defineProperty({},\"FilesDropzone\",{get:function(){return m},set:void 0,enumerable:!0,configurable:!0});let e=new Map([[\"aac\",\"audio/aac\"],[\"abw\",\"application/x-abiword\"],[\"arc\",\"application/x-freearc\"],[\"avif\",\"image/avif\"],[\"avi\",\"video/x-msvideo\"],[\"azw\",\"application/vnd.amazon.ebook\"],[\"bin\",\"application/octet-stream\"],[\"bmp\",\"image/bmp\"],[\"bz\",\"application/x-bzip\"],[\"bz2\",\"application/x-bzip2\"],[\"cda\",\"application/x-cdf\"],[\"csh\",\"application/x-csh\"],[\"css\",\"text/css\"],[\"csv\",\"text/csv\"],[\"doc\",\"application/msword\"],[\"docx\",\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"],[\"eot\",\"application/vnd.ms-fontobject\"],[\"epub\",\"application/epub+zip\"],[\"gz\",\"application/gzip\"],[\"gif\",\"image/gif\"],[\"heic\",\"image/heic\"],[\"heif\",\"image/heif\"],[\"htm\",\"text/html\"],[\"html\",\"text/html\"],[\"ico\",\"image/vnd.microsoft.icon\"],[\"ics\",\"text/calendar\"],[\"jar\",\"application/java-archive\"],[\"jpeg\",\"image/jpeg\"],[\"jpg\",\"image/jpeg\"],[\"jxl\",\"image/jxl\"],[\"js\",\"text/javascript\"],[\"json\",\"application/json\"],[\"jsonld\",\"application/ld+json\"],[\"markdown\",\"text/markdown\"],[\"md\",\"text/markdown\"],[\"mid\",\"audio/midi\"],[\"midi\",\"audio/midi\"],[\"mjs\",\"text/javascript\"],[\"mp3\",\"audio/mpeg\"],[\"mp4\",\"video/mp4\"],[\"mpeg\",\"video/mpeg\"],[\"mpkg\",\"application/vnd.apple.installer+xml\"],[\"odp\",\"application/vnd.oasis.opendocument.presentation\"],[\"ods\",\"application/vnd.oasis.opendocument.spreadsheet\"],[\"odt\",\"application/vnd.oasis.opendocument.text\"],[\"oga\",\"audio/ogg\"],[\"ogv\",\"video/ogg\"],[\"ogx\",\"application/ogg\"],[\"opus\",\"audio/opus\"],[\"otf\",\"font/otf\"],[\"png\",\"image/png\"],[\"pdf\",\"application/pdf\"],[\"php\",\"application/x-httpd-php\"],[\"ppt\",\"application/vnd.ms-powerpoint\"],[\"pptx\",\"application/vnd.openxmlformats-officedocument.presentationml.presentation\"],[\"rar\",\"application/vnd.rar\"],[\"rtf\",\"application/rtf\"],[\"sh\",\"application/x-sh\"],[\"svg\",\"image/svg+xml\"],[\"swf\",\"application/x-shockwave-flash\"],[\"tar\",\"application/x-tar\"],[\"tif\",\"image/tiff\"],[\"tiff\",\"image/tiff\"],[\"ts\",\"video/mp2t\"],[\"ttf\",\"font/ttf\"],[\"txt\",\"text/plain\"],[\"vsd\",\"application/vnd.visio\"],[\"wav\",\"audio/wav\"],[\"weba\",\"audio/webm\"],[\"webm\",\"video/webm\"],[\"webp\",\"image/webp\"],[\"woff\",\"font/woff\"],[\"woff2\",\"font/woff2\"],[\"xhtml\",\"application/xhtml+xml\"],[\"xls\",\"application/vnd.ms-excel\"],[\"xlsx\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"],[\"xml\",\"application/xml\"],[\"xul\",\"application/vnd.mozilla.xul+xml\"],[\"zip\",\"application/zip\"],[\"7z\",\"application/x-7z-compressed\"],[\"mkv\",\"video/x-matroska\"],[\"mov\",\"video/quicktime\"],[\"msg\",\"application/vnd.ms-outlook\"]]),t=[\".DS_Store\",\"Thumbs.db\"],o=t=>{let{name:o}=t;if(o&&-1!==o.lastIndexOf(\".\")&&!t.type){let i=(o.split(\".\").pop()||\"\").toLowerCase(),r=e.get(i);r&&Object.defineProperty(t,\"type\",{value:r,writable:!1,configurable:!1,enumerable:!0})}return t},i=(e,t)=>{let i=o(e);if(\"string\"!=typeof i.path){let{webkitRelativePath:o}=e;Object.defineProperty(i,\"path\",{value:\"string\"==typeof t?t:o||e.name,writable:!1,configurable:!1,enumerable:!0})}return i},r=async e=>await new Promise((t,o)=>{e.readEntries(t,o)}),a=async e=>{let t=[],o=await r(e);for(;o.length>0;)t.push(...o),o=await r(e);return t},n=e=>new Promise((t,o)=>{e.file(o=>t(i(o,e.fullPath)),o)}),s=async e=>{let o=[],i=[];for(let t of e){if(\"file\"!==t.kind)continue;let e=t.getAsEntry?t.getAsEntry():t.webkitGetAsEntry();i.push(e)}for(;i.length>0;){let e=i.shift();if(e){if(e.isFile){let i=await n(e);-1===t.indexOf(i.name)&&o.push(i)}else e.isDirectory&&i.push(...await a(e.createReader()))}}return o},d=async e=>{let o=[];for(let r of e)-1===t.indexOf(r.name)&&o.push(i(r));return o},l=async e=>e.dataTransfer?e.dataTransfer.items?await s(e.dataTransfer.items):await d(e.dataTransfer.files):await d(e.target.files),p=\"files-dropzone\",c=\"TOO_MANY_FILES\",h=document.createElement(\"template\"),u=`\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;h.innerHTML=`\n \n\n \n\n
\n Drag 'n' drop files here, or click to select files\n
\n`;class m extends HTMLElement{#e=null;#t=null;constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\",delegatesFocus:!0}).appendChild(h.content.cloneNode(!0)),this.shadowRoot&&(this.#e=this.shadowRoot.getElementById(\"file-input\"),this.#t=this.shadowRoot.getElementById(\"dropzone\"))}static get observedAttributes(){return[\"accept\",\"disabled\",\"multiple\"]}attributeChangedCallback(e,t,o){\"accept\"===e&&t!==o&&this.#e&&(this.#e.accept=this.accept),\"disabled\"===e&&t!==o&&this.#e&&(this.#e.disabled=this.disabled,this.disabled?(this.#t?.removeAttribute(\"tabindex\"),this.#t?.setAttribute(\"aria-disabled\",\"true\")):(this.#t?.setAttribute(\"tabindex\",\"0\"),this.#t?.setAttribute(\"aria-disabled\",\"false\"))),\"multiple\"===e&&t!==o&&this.#e&&(this.#e.multiple=this.multiple)}connectedCallback(){this.#o(\"accept\"),this.#o(\"disabled\"),this.#o(\"maxFiles\"),this.#o(\"maxSize\"),this.#o(\"minSize\"),this.#o(\"multiple\"),this.#o(\"autoFocus\"),this.#o(\"noStyle\"),this.#e?.addEventListener(\"change\",this.#i),this.#t?.addEventListener(\"dragenter\",this.#r),this.#t?.addEventListener(\"dragover\",this.#a),this.#t?.addEventListener(\"dragleave\",this.#n),this.#t?.addEventListener(\"drop\",this.#s),this.#t?.addEventListener(\"click\",this.#d),this.#t?.addEventListener(\"keyup\",this.#l),this.autoFocus&&this.#t?.focus()}disconnectedCallback(){this.#e?.removeEventListener(\"change\",this.#i),this.#t?.removeEventListener(\"dragenter\",this.#r),this.#t?.removeEventListener(\"dragover\",this.#a),this.#t?.removeEventListener(\"dragleave\",this.#n),this.#t?.removeEventListener(\"drop\",this.#s),this.#t?.removeEventListener(\"click\",this.#d),this.#t?.removeEventListener(\"keyup\",this.#l)}get accept(){return this.getAttribute(\"accept\")||\"\"}set accept(e){this.setAttribute(\"accept\",null!=e?e.toString():e)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(e){this.toggleAttribute(\"disabled\",!!e)}get maxFiles(){let e=Number(this.getAttribute(\"max-files\"))||0;return e<=0?1/0:Math.floor(Math.abs(e))}set maxFiles(e){this.setAttribute(\"max-files\",null!=e?e.toString():e)}get maxSize(){let e=this.getAttribute(\"max-size\");if(null===e)return 1/0;let t=Number(e);return Number.isNaN(t)?1/0:t}set maxSize(e){this.setAttribute(\"max-size\",null!=e?e.toString():e)}get minSize(){let e=this.getAttribute(\"min-size\");if(null===e)return 0;let t=Number(e);return Number.isNaN(t)?0:t}set minSize(e){this.setAttribute(\"min-size\",null!=e?e.toString():e)}get multiple(){return this.hasAttribute(\"multiple\")}set multiple(e){this.toggleAttribute(\"multiple\",!!e)}get autoFocus(){return this.hasAttribute(\"auto-focus\")}set autoFocus(e){this.toggleAttribute(\"auto-focus\",!!e)}get noStyle(){return this.hasAttribute(\"no-style\")}set noStyle(e){this.toggleAttribute(\"no-style\",!!e)}#i=async e=>{try{this.#p(await l(e))}catch(e){this.dispatchEvent(new CustomEvent(`${p}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}};#r=()=>{this.disabled||this.dispatchEvent(new Event(`${p}-dragenter`,{bubbles:!0,composed:!0}))};#a=e=>{if(e.preventDefault(),this.disabled){e.dataTransfer.dropEffect=\"none\";return}e.dataTransfer.dropEffect=\"copy\",this.#t&&(this.#t.classList.add(\"dropzone--dragover\"),this.#t.part.add(\"dropzone--dragover\")),this.dispatchEvent(new Event(`${p}-dragover`,{bubbles:!0,composed:!0}))};#n=()=>{this.disabled||(this.#t&&(this.#t.classList.remove(\"dropzone--dragover\"),this.#t.part.remove(\"dropzone--dragover\")),this.dispatchEvent(new Event(`${p}-dragleave`,{bubbles:!0,composed:!0})))};#s=async e=>{if(!this.disabled){e.preventDefault(),this.#t&&(this.#t.classList.remove(\"dropzone--dragover\"),this.#t.part.remove(\"dropzone--dragover\"));try{this.#p(await l(e))}catch(e){this.dispatchEvent(new CustomEvent(`${p}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}}};#d=()=>{this.disabled||this.#e?.click()};#l=e=>{this.disabled||\" \"!==e.key&&\"Enter\"!==e.key||this.#e?.click()};#p(e){if(!Array.isArray(e)||!e.length)return;let t=[],o=[],i=e.length;if(!this.multiple&&i>1)for(let t of e)o.push({file:t,errors:[{code:c,message:\"Too many files selected. Only 1 file is allowed.\"}]});else if(this.multiple&&i>this.maxFiles)for(let t of e)o.push({file:t,errors:[{code:c,message:`Too many files selected. Only ${this.maxFiles} ${this.maxFiles>1?\"files are\":\"file is\"} allowed.`}]});else for(let i of e){let e=function(e,t=\"\"){if(!t)return!0;let o=[...new Set(t.split(\",\").map(e=>e.trim()).filter(Boolean))],i=e.type,r=i.replace(/\\/.*$/,\"\");for(let t of o)if(\".\"===t.charAt(0)){if(-1!==e.name.toLowerCase().indexOf(t.toLowerCase(),e.name.length-t.length))return!0}else if(/\\/\\*$/.test(t)){if(r===t.replace(/\\/.*$/,\"\"))return!0}else if(i===t)return!0;return!1}(i,this.accept),r=i.size>this.maxSize,a=i.size0&&this.dispatchEvent(new CustomEvent(`${p}-drop-accepted`,{bubbles:!0,composed:!0,detail:{acceptedFiles:t}})),o.length>0&&this.dispatchEvent(new CustomEvent(`${p}-drop-rejected`,{bubbles:!0,composed:!0,detail:{rejectedFiles:o}})),this.#e&&(this.#e.value=this.#e.defaultValue)}openFileDialog(){this.disabled||this.#e?.click()}#o(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}static defineCustomElement(e=p){\"undefined\"==typeof window||window.customElements.get(e)||window.customElements.define(e,m)}}m.defineCustomElement();export{m as FilesDropzone};\n//# sourceMappingURL=files-dropzone-defined.js.map\n","function $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $862aa3736b0514bc$exports = {};\n\n$parcel$export($862aa3736b0514bc$exports, \"FilesDropzone\", function () { return $862aa3736b0514bc$export$6ccd1735166caad9; });\n// @ts-check\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */ // @ts-check\n/**\n * Checks if a file is valid based on the accepted file type specifiers.\n *\n * @param {File} file - The File object to validate.\n * @param {string} [acceptedTypeSpecifiers=''] - The accepted file type specifiers.\n * @returns {boolean} - True if the file is valid, false otherwise.\n */ function $38f222170fd4d21a$export$7c47054fed488f80(file, acceptedTypeSpecifiers = \"\") {\n if (!acceptedTypeSpecifiers) return true;\n const acceptedMimeTypesList = [\n ...new Set(acceptedTypeSpecifiers.split(\",\").map((v)=>v.trim()).filter(Boolean))\n ];\n const fileMimeType = file.type;\n const baseMimeType = fileMimeType.replace(/\\/.*$/, \"\");\n for (const validType of acceptedMimeTypesList){\n if (validType.charAt(0) === \".\") {\n if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) return true;\n } else if (/\\/\\*$/.test(validType)) {\n // Check for mime type that looks like \"image/*\" or similar.\n if (baseMimeType === validType.replace(/\\/.*$/, \"\")) return true;\n } else {\n if (fileMimeType === validType) return true;\n }\n }\n return false;\n}\n\n\n// @ts-check\n/**\n * A map of common file extensions and their associated MIME types.\n */ const $f31161edf38949e9$var$COMMON_MIME_TYPES = new Map([\n // https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types\n [\n \"aac\",\n \"audio/aac\"\n ],\n [\n \"abw\",\n \"application/x-abiword\"\n ],\n [\n \"arc\",\n \"application/x-freearc\"\n ],\n [\n \"avif\",\n \"image/avif\"\n ],\n [\n \"avi\",\n \"video/x-msvideo\"\n ],\n [\n \"azw\",\n \"application/vnd.amazon.ebook\"\n ],\n [\n \"bin\",\n \"application/octet-stream\"\n ],\n [\n \"bmp\",\n \"image/bmp\"\n ],\n [\n \"bz\",\n \"application/x-bzip\"\n ],\n [\n \"bz2\",\n \"application/x-bzip2\"\n ],\n [\n \"cda\",\n \"application/x-cdf\"\n ],\n [\n \"csh\",\n \"application/x-csh\"\n ],\n [\n \"css\",\n \"text/css\"\n ],\n [\n \"csv\",\n \"text/csv\"\n ],\n [\n \"doc\",\n \"application/msword\"\n ],\n [\n \"docx\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n ],\n [\n \"eot\",\n \"application/vnd.ms-fontobject\"\n ],\n [\n \"epub\",\n \"application/epub+zip\"\n ],\n [\n \"gz\",\n \"application/gzip\"\n ],\n [\n \"gif\",\n \"image/gif\"\n ],\n [\n \"heic\",\n \"image/heic\"\n ],\n [\n \"heif\",\n \"image/heif\"\n ],\n [\n \"htm\",\n \"text/html\"\n ],\n [\n \"html\",\n \"text/html\"\n ],\n [\n \"ico\",\n \"image/vnd.microsoft.icon\"\n ],\n [\n \"ics\",\n \"text/calendar\"\n ],\n [\n \"jar\",\n \"application/java-archive\"\n ],\n [\n \"jpeg\",\n \"image/jpeg\"\n ],\n [\n \"jpg\",\n \"image/jpeg\"\n ],\n [\n \"jxl\",\n \"image/jxl\"\n ],\n [\n \"js\",\n \"text/javascript\"\n ],\n [\n \"json\",\n \"application/json\"\n ],\n [\n \"jsonld\",\n \"application/ld+json\"\n ],\n [\n \"markdown\",\n \"text/markdown\"\n ],\n [\n \"md\",\n \"text/markdown\"\n ],\n [\n \"mid\",\n \"audio/midi\"\n ],\n [\n \"midi\",\n \"audio/midi\"\n ],\n [\n \"mjs\",\n \"text/javascript\"\n ],\n [\n \"mp3\",\n \"audio/mpeg\"\n ],\n [\n \"mp4\",\n \"video/mp4\"\n ],\n [\n \"mpeg\",\n \"video/mpeg\"\n ],\n [\n \"mpkg\",\n \"application/vnd.apple.installer+xml\"\n ],\n [\n \"odp\",\n \"application/vnd.oasis.opendocument.presentation\"\n ],\n [\n \"ods\",\n \"application/vnd.oasis.opendocument.spreadsheet\"\n ],\n [\n \"odt\",\n \"application/vnd.oasis.opendocument.text\"\n ],\n [\n \"oga\",\n \"audio/ogg\"\n ],\n [\n \"ogv\",\n \"video/ogg\"\n ],\n [\n \"ogx\",\n \"application/ogg\"\n ],\n [\n \"opus\",\n \"audio/opus\"\n ],\n [\n \"otf\",\n \"font/otf\"\n ],\n [\n \"png\",\n \"image/png\"\n ],\n [\n \"pdf\",\n \"application/pdf\"\n ],\n [\n \"php\",\n \"application/x-httpd-php\"\n ],\n [\n \"ppt\",\n \"application/vnd.ms-powerpoint\"\n ],\n [\n \"pptx\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n ],\n [\n \"rar\",\n \"application/vnd.rar\"\n ],\n [\n \"rtf\",\n \"application/rtf\"\n ],\n [\n \"sh\",\n \"application/x-sh\"\n ],\n [\n \"svg\",\n \"image/svg+xml\"\n ],\n [\n \"swf\",\n \"application/x-shockwave-flash\"\n ],\n [\n \"tar\",\n \"application/x-tar\"\n ],\n [\n \"tif\",\n \"image/tiff\"\n ],\n [\n \"tiff\",\n \"image/tiff\"\n ],\n [\n \"ts\",\n \"video/mp2t\"\n ],\n [\n \"ttf\",\n \"font/ttf\"\n ],\n [\n \"txt\",\n \"text/plain\"\n ],\n [\n \"vsd\",\n \"application/vnd.visio\"\n ],\n [\n \"wav\",\n \"audio/wav\"\n ],\n [\n \"weba\",\n \"audio/webm\"\n ],\n [\n \"webm\",\n \"video/webm\"\n ],\n [\n \"webp\",\n \"image/webp\"\n ],\n [\n \"woff\",\n \"font/woff\"\n ],\n [\n \"woff2\",\n \"font/woff2\"\n ],\n [\n \"xhtml\",\n \"application/xhtml+xml\"\n ],\n [\n \"xls\",\n \"application/vnd.ms-excel\"\n ],\n [\n \"xlsx\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n ],\n [\n \"xml\",\n \"application/xml\"\n ],\n [\n \"xul\",\n \"application/vnd.mozilla.xul+xml\"\n ],\n [\n \"zip\",\n \"application/zip\"\n ],\n [\n \"7z\",\n \"application/x-7z-compressed\"\n ],\n // Others\n [\n \"mkv\",\n \"video/x-matroska\"\n ],\n [\n \"mov\",\n \"video/quicktime\"\n ],\n [\n \"msg\",\n \"application/vnd.ms-outlook\"\n ]\n]);\nconst $f31161edf38949e9$var$FILES_TO_IGNORE = [\n // Thumbnail cache files for macOS and Windows\n \".DS_Store\",\n \"Thumbs.db\" // Windows\n];\n/**\n * Adds a `type` property to the file object if it doesn't have one and the file has an extension.\n * This is needed because Firefox doesn't add a type property to files dragged from the desktop.\n * @bug https://bugzilla.mozilla.org/show_bug.cgi?id=1424689\n *\n * @param {File} file - The file object to add the type property to.\n * @returns {File} - The file object with the type property added.\n */ const $f31161edf38949e9$var$toFileWithMimeType = (file)=>{\n const { name: name } = file;\n const hasExtension = name && name.lastIndexOf(\".\") !== -1;\n if (hasExtension && !file.type) {\n const extension = (name.split(\".\").pop() || \"\").toLowerCase();\n const type = $f31161edf38949e9$var$COMMON_MIME_TYPES.get(extension);\n if (type) Object.defineProperty(file, \"type\", {\n value: type,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n return file;\n};\n/**\n * Adds a `path` property to the file object if it doesn't have one.\n * If `path` is not provided, the `webkitRelativePath` property of the file will be used\n * or the file's name if `webkitRelativePath` is not available.\n *\n * @param {File} file - The file object to add the path property to.\n * @param {string} [path] - The path to set on the file object.\n * @returns {File} - The file object with the path property added.\n */ const $f31161edf38949e9$var$toFileWithPath = (file, path)=>{\n const fileWithMimeType = $f31161edf38949e9$var$toFileWithMimeType(file);\n // @ts-ignore\n if (typeof fileWithMimeType.path !== \"string\") {\n const { webkitRelativePath: webkitRelativePath } = file;\n Object.defineProperty(fileWithMimeType, \"path\", {\n value: typeof path === \"string\" ? path : webkitRelativePath || file.name,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n return fileWithMimeType;\n};\n/**\n * Wrap `FileSystemDirectoryReader.readEntries` in a promise to make working with read entries easier.\n * https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryReader/readEntries\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */ const $f31161edf38949e9$var$readEntriesPromise = async (directoryReader)=>{\n return await new Promise((resolve, reject)=>{\n directoryReader.readEntries(resolve, reject);\n });\n};\n/**\n * Read all entries in a directory or sub-directory\n * by calling `readEntries` until it returns an empty array.\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */ const $f31161edf38949e9$var$readAllDirectoryEntries = async (directoryReader)=>{\n const entries = [];\n let readEntries = await $f31161edf38949e9$var$readEntriesPromise(directoryReader);\n while(readEntries.length > 0){\n entries.push(...readEntries);\n readEntries = await $f31161edf38949e9$var$readEntriesPromise(directoryReader);\n }\n return entries;\n};\n/**\n * Get a `File` object from a `FileSystemFileEntry` object.\n *\n * @param {FileSystemFileEntry} fileEntry - The file entry to get a `File` object from.\n * @returns {Promise} - A promise that resolves with a `File` object.\n */ const $f31161edf38949e9$var$getFileFromFileEntry = (fileEntry)=>{\n return new Promise((resolve, reject)=>{\n fileEntry.file((file)=>resolve($f31161edf38949e9$var$toFileWithPath(file, fileEntry.fullPath)), reject);\n });\n};\n/**\n * Get an array of `File` objects from a `DataTransferItemList` object.\n *\n * @param {DataTransferItemList} dataTransferItemList - The item list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */ const $f31161edf38949e9$var$getFilesFromDataTransferItemList = async (dataTransferItemList)=>{\n const files = [];\n // Chromium browsers read only 100 files at a time as per the spec, so we need to use\n // BFS (Breadth-first search) to traverse the entire directory/file structure.\n // https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/webkitGetAsEntry#javascript_content\n const queue = [];\n for (const item of dataTransferItemList){\n if (item.kind !== \"file\") continue;\n // https://developer.mozilla.org/docs/Web/API/DataTransferItem/webkitGetAsEntry\n // This function is implemented as `webkitGetAsEntry()` in non-WebKit browsers\n // including Firefox at this time but it may be renamed to `getAsEntry()` in the future.\n // @ts-ignore\n const entry = item.getAsEntry ? item.getAsEntry() : item.webkitGetAsEntry();\n queue.push(entry);\n }\n while(queue.length > 0){\n const entry = queue.shift();\n if (!entry) continue;\n else if (entry.isFile) {\n const file = await $f31161edf38949e9$var$getFileFromFileEntry(entry);\n if ($f31161edf38949e9$var$FILES_TO_IGNORE.indexOf(file.name) === -1) files.push(file);\n } else if (entry.isDirectory) queue.push(...await $f31161edf38949e9$var$readAllDirectoryEntries(entry.createReader()));\n }\n return files;\n};\n/**\n * Get an array of `File` objects from a `FileList` object.\n *\n * @param {FileList} fileList - The file list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */ const $f31161edf38949e9$var$getFilesFromFileList = async (fileList)=>{\n const files = [];\n for (const file of fileList)if ($f31161edf38949e9$var$FILES_TO_IGNORE.indexOf(file.name) === -1) files.push($f31161edf38949e9$var$toFileWithPath(file));\n return files;\n};\nconst $f31161edf38949e9$export$6d52664cd15c442 = async (evt)=>{\n if (evt.dataTransfer) return evt.dataTransfer.items ? await $f31161edf38949e9$var$getFilesFromDataTransferItemList(evt.dataTransfer.items) : await $f31161edf38949e9$var$getFilesFromFileList(evt.dataTransfer.files);\n return await $f31161edf38949e9$var$getFilesFromFileList(evt.target.files);\n};\n\n\nconst $862aa3736b0514bc$var$COMPONENT_NAME = \"files-dropzone\";\nconst $862aa3736b0514bc$var$TOO_MANY_FILES = \"TOO_MANY_FILES\";\nconst $862aa3736b0514bc$var$FILE_TOO_LARGE = \"FILE_TOO_LARGE\";\nconst $862aa3736b0514bc$var$FILE_TOO_SMALL = \"FILE_TOO_SMALL\";\nconst $862aa3736b0514bc$var$INVALID_MIME_TYPE = \"INVALID_MIME_TYPE\";\nconst $862aa3736b0514bc$var$template = document.createElement(\"template\");\nconst $862aa3736b0514bc$var$styles = /* css */ `\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n$862aa3736b0514bc$var$template.innerHTML = /* html */ `\n \n\n \n\n
\n Drag 'n' drop files here, or click to select files\n
\n`;\n/**\n * @summary A custom element that allows users to drag and drop files into it.\n * @documentation https://github.com/georapbox/files-dropzone-element\n *\n * @tagname files-dropzone - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {string} accept - A comma-separated list of unique file type specifiers describing file types to allow.\n * @property {boolean} disabled - Determines whether the dropzone is disabled.\n * @property {number} maxFiles - The maximum number of files allowed to be dropped.\n * @property {number} maxSize - The maximum file size allowed in bytes.\n * @property {number} minSize - The minimum file size allowed in bytes.\n * @property {boolean} multiple - Allows multiple files to be dropped.\n * @property {boolean} autoFocus - Automatically focuses the dropzone when it's connected to the DOM.\n * @property {boolean} noStyle - Prevents the dropzone from applying any styling.\n *\n * @attribute {string} accept - Reflects the accept property.\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {number} max-files - Reflects the maxFiles property.\n * @attribute {number} max-size - Reflects the maxSize property.\n * @attribute {number} min-size - Reflects the minSize property.\n * @attribute {boolean} multiple - Reflects the multiple property.\n * @attribute {boolean} auto-focus - Reflects the autoFocus property.\n * @attribute {boolean} no-style - Reflects the noStyle property.\n *\n * @slot - The default slot content of the dropzone.\n *\n * @csspart dropzone - The dropzone element.\n * @csspart dropzone--dragover - The state of the dropzone when dragging over it.\n *\n * @cssproperty --dropzone-border-width - The border width of the dropzone.\n * @cssproperty --dropzone-border-style - The border style of the dropzone.\n * @cssproperty --dropzone-border-radius - The border radius of the dropzone.\n * @cssproperty --dropzone-border-color - The border color of the dropzone.\n * @cssproperty --dropzone-border-color-dragover - The border color of the dropzone when dragging over it.\n * @cssproperty --dropzone-border-color-hover - The border color of the dropzone when hovering over it.\n * @cssproperty --dropzone-background-color - The background color of the dropzone.\n * @cssproperty --dropzone-background-color-dragover - The background color of the dropzone when dragging over it.\n * @cssproperty --dropzone-background-color-hover - The background color of the dropzone when hovering over it.\n * @cssproperty --dropzone-body-color - The text color of the dropzone.\n * @cssproperty --dropzone-body-color-dragover - The text color of the dropzone when dragging over it.\n * @cssproperty --dropzone-body-color-hover - The text color of the dropzone when hovering over it.\n * @cssproperty --dropzone-focus-shadow-rgb - The RGB value of the dropzone's focus shadow.\n * @cssproperty --dropzone-focus-box-shadow - The box shadow of the dropzone when focused.\n * @cssproperty --dropzone-transition-duration - The transition's duration for the dropzone area.\n *\n * @event files-dropzone-drop - Fired when files are dropped.\n * @event files-dropzone-drop-accepted - Fired when files dropped files are accepted.\n * @event files-dropzone-drop-rejected - Fired when files dropped files are rejected.\n * @event files-dropzone-dragenter - Fired when files are dragged into the dropzone.\n * @event files-dropzone-dragover - Fired when files are dragged over the dropzone.\n * @event files-dropzone-dragleave - Fired when files are dragged out of the dropzone.\n * @event files-dropzone-error - Fired when there is any error in the process of reading dropped files or directories.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method openFileDialog - Instance method. Opens the file dialog programmatically.\n */ class $862aa3736b0514bc$export$6ccd1735166caad9 extends HTMLElement {\n /** @type {Nullable} */ #fileInput = null;\n /** @type {Nullable} */ #dropzoneEl = null;\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\",\n delegatesFocus: true\n });\n shadowRoot.appendChild($862aa3736b0514bc$var$template.content.cloneNode(true));\n }\n if (this.shadowRoot) {\n this.#fileInput = /** @type {Nullable} */ this.shadowRoot.getElementById(\"file-input\");\n this.#dropzoneEl = this.shadowRoot.getElementById(\"dropzone\");\n }\n }\n static get observedAttributes() {\n return [\n \"accept\",\n \"disabled\",\n \"multiple\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"accept\" && oldValue !== newValue && this.#fileInput) this.#fileInput.accept = this.accept;\n if (name === \"disabled\" && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.disabled = this.disabled;\n if (this.disabled) {\n this.#dropzoneEl?.removeAttribute(\"tabindex\");\n this.#dropzoneEl?.setAttribute(\"aria-disabled\", \"true\");\n } else {\n this.#dropzoneEl?.setAttribute(\"tabindex\", \"0\");\n this.#dropzoneEl?.setAttribute(\"aria-disabled\", \"false\");\n }\n }\n if (name === \"multiple\" && oldValue !== newValue && this.#fileInput) this.#fileInput.multiple = this.multiple;\n }\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"accept\");\n this.#upgradeProperty(\"disabled\");\n this.#upgradeProperty(\"maxFiles\");\n this.#upgradeProperty(\"maxSize\");\n this.#upgradeProperty(\"minSize\");\n this.#upgradeProperty(\"multiple\");\n this.#upgradeProperty(\"autoFocus\");\n this.#upgradeProperty(\"noStyle\");\n this.#fileInput?.addEventListener(\"change\", this.#handleFileInputChange);\n this.#dropzoneEl?.addEventListener(\"dragenter\", this.#handleDragEnter);\n this.#dropzoneEl?.addEventListener(\"dragover\", this.#handleDragOver);\n this.#dropzoneEl?.addEventListener(\"dragleave\", this.#handleDragLeave);\n this.#dropzoneEl?.addEventListener(\"drop\", this.#handleDrop);\n this.#dropzoneEl?.addEventListener(\"click\", this.#handleClick);\n this.#dropzoneEl?.addEventListener(\"keyup\", this.#handleKeyUp);\n this.autoFocus && this.#dropzoneEl?.focus();\n }\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */ disconnectedCallback() {\n this.#fileInput?.removeEventListener(\"change\", this.#handleFileInputChange);\n this.#dropzoneEl?.removeEventListener(\"dragenter\", this.#handleDragEnter);\n this.#dropzoneEl?.removeEventListener(\"dragover\", this.#handleDragOver);\n this.#dropzoneEl?.removeEventListener(\"dragleave\", this.#handleDragLeave);\n this.#dropzoneEl?.removeEventListener(\"drop\", this.#handleDrop);\n this.#dropzoneEl?.removeEventListener(\"click\", this.#handleClick);\n this.#dropzoneEl?.removeEventListener(\"keyup\", this.#handleKeyUp);\n }\n /**\n * @type {string} - A comma-separated list of unique file type specifiers describing file types to allow.\n * @attribute accept - Reflects the accept property.\n */ get accept() {\n return this.getAttribute(\"accept\") || \"\";\n }\n set accept(value) {\n this.setAttribute(\"accept\", value != null ? value.toString() : value);\n }\n /**\n * @type {boolean} - Determines whether the dropzone is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */ get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(value) {\n this.toggleAttribute(\"disabled\", !!value);\n }\n /**\n * @type {number} - The maximum number of files allowed to be dropped.\n * @default Infinity\n * @attribute max-files - Reflects the maxFiles property.\n */ get maxFiles() {\n const num = Number(this.getAttribute(\"max-files\")) || 0;\n if (num <= 0) return Infinity;\n return Math.floor(Math.abs(num));\n }\n set maxFiles(value) {\n this.setAttribute(\"max-files\", value != null ? value.toString() : value);\n }\n /**\n * @type {number} - The maximum file size allowed in bytes.\n * @default Infinity\n * @attribute max-size - Reflects the maxSize property.\n */ get maxSize() {\n const value = this.getAttribute(\"max-size\");\n if (value === null) return Infinity;\n const num = Number(value);\n return Number.isNaN(num) ? Infinity : num;\n }\n set maxSize(value) {\n this.setAttribute(\"max-size\", value != null ? value.toString() : value);\n }\n /**\n * @type {number} - The minimum file size allowed in bytes.\n * @default 0\n * @attribute min-size - Reflects the minSize property.\n */ get minSize() {\n const value = this.getAttribute(\"min-size\");\n if (value === null) return 0;\n const num = Number(value);\n return Number.isNaN(num) ? 0 : num;\n }\n set minSize(value) {\n this.setAttribute(\"min-size\", value != null ? value.toString() : value);\n }\n /**\n * @type {boolean} - Allows multiple files to be dropped.\n * @default false\n * @attribute multiple - Reflects the multiple property.\n */ get multiple() {\n return this.hasAttribute(\"multiple\");\n }\n set multiple(value) {\n this.toggleAttribute(\"multiple\", !!value);\n }\n /**\n * @type {boolean} - Automatically focuses the dropzone when it's connected to the DOM.\n * @default false\n * @attribute auto-focus - Reflects the autoFocus property.\n */ get autoFocus() {\n return this.hasAttribute(\"auto-focus\");\n }\n set autoFocus(value) {\n this.toggleAttribute(\"auto-focus\", !!value);\n }\n /**\n * @type {boolean} - Prevents the dropzone from applying any styling.\n * @default false\n * @attribute no-style - Reflects the noStyle property.\n */ get noStyle() {\n return this.hasAttribute(\"no-style\");\n }\n set noStyle(value) {\n this.toggleAttribute(\"no-style\", !!value);\n }\n /**\n * Handles the change event of the file input.\n *\n * @param {*} evt - The event object.\n */ #handleFileInputChange = async (evt)=>{\n try {\n this.#handleFilesSelect(await (0, $f31161edf38949e9$export$6d52664cd15c442)(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }\n };\n /**\n * Handles the dragenter event of the dropzone.\n */ #handleDragEnter = ()=>{\n if (this.disabled) return;\n this.dispatchEvent(new Event(`${$862aa3736b0514bc$var$COMPONENT_NAME}-dragenter`, {\n bubbles: true,\n composed: true\n }));\n };\n /**\n * Handles the dragover event of the dropzone.\n *\n * @param {*} evt - The event object.\n */ #handleDragOver = (evt)=>{\n evt.preventDefault();\n if (this.disabled) {\n evt.dataTransfer.dropEffect = \"none\";\n return;\n }\n evt.dataTransfer.dropEffect = \"copy\";\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.add(\"dropzone--dragover\");\n this.#dropzoneEl.part.add(\"dropzone--dragover\");\n }\n this.dispatchEvent(new Event(`${$862aa3736b0514bc$var$COMPONENT_NAME}-dragover`, {\n bubbles: true,\n composed: true\n }));\n };\n /**\n * Handles the dragleave event of the dropzone.\n */ #handleDragLeave = ()=>{\n if (this.disabled) return;\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove(\"dropzone--dragover\");\n this.#dropzoneEl.part.remove(\"dropzone--dragover\");\n }\n this.dispatchEvent(new Event(`${$862aa3736b0514bc$var$COMPONENT_NAME}-dragleave`, {\n bubbles: true,\n composed: true\n }));\n };\n /**\n * Handles the drop event of the dropzone.\n *\n * @param {*} evt - The event object.\n */ #handleDrop = async (evt)=>{\n if (this.disabled) return;\n evt.preventDefault();\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove(\"dropzone--dragover\");\n this.#dropzoneEl.part.remove(\"dropzone--dragover\");\n }\n try {\n this.#handleFilesSelect(await (0, $f31161edf38949e9$export$6d52664cd15c442)(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }\n };\n /**\n * Handles the click event of the dropzone.\n */ #handleClick = ()=>{\n if (this.disabled) return;\n this.#fileInput?.click();\n };\n /**\n * Handles the keyup event of the dropzone.\n *\n * @param {*} evt - The event object.\n */ #handleKeyUp = (evt)=>{\n if (this.disabled) return;\n if (evt.key === \" \" || evt.key === \"Enter\") this.#fileInput?.click();\n };\n /**\n * Handles the selection of files.\n *\n * @param {File[]} files - The files to handle.\n */ #handleFilesSelect(files) {\n if (!Array.isArray(files) || !files.length) return;\n const acceptedFiles = [];\n const rejectedFiles = [];\n const filesLength = files.length;\n // If the component is not in multiple mode, reject all files.\n if (!this.multiple && filesLength > 1) for (const file of files)rejectedFiles.push({\n file: file,\n errors: [\n {\n code: $862aa3736b0514bc$var$TOO_MANY_FILES,\n message: `Too many files selected. Only 1 file is allowed.`\n }\n ]\n });\n else if (this.multiple && filesLength > this.maxFiles) // If the component is in multiple mode, but the number of files exceeds\n // the maxFiles attribute, reject all files.\n for (const file of files)rejectedFiles.push({\n file: file,\n errors: [\n {\n code: $862aa3736b0514bc$var$TOO_MANY_FILES,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? \"files are\" : \"file is\"} allowed.`\n }\n ]\n });\n else // Validate each file. If it's valid, add it to the accepted files array,\n // otherwise add it to the rejected files array.\n for (const file of files){\n const fileHasValidType = (0, $38f222170fd4d21a$export$7c47054fed488f80)(file, this.accept);\n const fileExceedsMaxSize = file.size > this.maxSize;\n const fileIsSmallerThanMinSize = file.size < this.minSize;\n if (fileHasValidType && !fileExceedsMaxSize && !fileIsSmallerThanMinSize) acceptedFiles.push(file);\n else {\n const errors = [];\n if (!fileHasValidType) errors.push({\n code: $862aa3736b0514bc$var$INVALID_MIME_TYPE,\n message: `File type \"${file.type}\" is not accepted.`\n });\n if (fileExceedsMaxSize) errors.push({\n code: $862aa3736b0514bc$var$FILE_TOO_LARGE,\n message: `File size ${file.size} exceeds the maximum size of ${this.maxSize}.`\n });\n if (fileIsSmallerThanMinSize) errors.push({\n code: $862aa3736b0514bc$var$FILE_TOO_SMALL,\n message: `File size ${file.size} is smaller than the minimum size of ${this.minSize}.`\n });\n rejectedFiles.push({\n file: file,\n errors: errors\n });\n }\n }\n this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-drop`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles: acceptedFiles,\n rejectedFiles: rejectedFiles\n }\n }));\n if (acceptedFiles.length > 0) this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-drop-accepted`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles: acceptedFiles\n }\n }));\n if (rejectedFiles.length > 0) this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-drop-rejected`, {\n bubbles: true,\n composed: true,\n detail: {\n rejectedFiles: rejectedFiles\n }\n }));\n if (this.#fileInput) this.#fileInput.value = this.#fileInput.defaultValue;\n }\n /**\n * Opens the file dialog programmatically.\n */ openFileDialog() {\n if (this.disabled) return;\n this.#fileInput?.click();\n }\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'accept' | 'disabled' | 'maxFiles' | 'maxSize' | 'minSize' | 'multiple' | 'autoFocus' | 'noStyle'} prop - The property name to upgrade.\n */ #upgradeProperty(prop) {\n /** @type {any} */ const instance = this;\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='files-dropzone'] - The name of the custom element.\n * @example\n *\n * FilesDropzone.defineCustomElement('my-dropzone');\n */ static defineCustomElement(elementName = $862aa3736b0514bc$var$COMPONENT_NAME) {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $862aa3736b0514bc$export$6ccd1735166caad9);\n }\n}\n\n\n(0, $862aa3736b0514bc$export$6ccd1735166caad9).defineCustomElement();\n\n\nexport {$862aa3736b0514bc$export$6ccd1735166caad9 as FilesDropzone};\n//# sourceMappingURL=files-dropzone-defined.js.map\n","import { FilesDropzone } from './files-dropzone.js';\n\nFilesDropzone.defineCustomElement();\n\nexport { FilesDropzone };\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\nimport { isValidFile } from './utils/is-valid-file.js';\nimport { getFilesFromEvent } from './utils/files-selector.js';\n\nconst COMPONENT_NAME = 'files-dropzone';\nconst TOO_MANY_FILES = 'TOO_MANY_FILES';\nconst FILE_TOO_LARGE = 'FILE_TOO_LARGE';\nconst FILE_TOO_SMALL = 'FILE_TOO_SMALL';\nconst INVALID_MIME_TYPE = 'INVALID_MIME_TYPE';\nconst template = document.createElement('template');\n\nconst styles = /* css */`\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n\ntemplate.innerHTML = /* html */`\n \n\n \n\n
\n Drag 'n' drop files here, or click to select files\n
\n`;\n\n/**\n * @summary A custom element that allows users to drag and drop files into it.\n * @documentation https://github.com/georapbox/files-dropzone-element\n *\n * @tagname files-dropzone - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {string} accept - A comma-separated list of unique file type specifiers describing file types to allow.\n * @property {boolean} disabled - Determines whether the dropzone is disabled.\n * @property {number} maxFiles - The maximum number of files allowed to be dropped.\n * @property {number} maxSize - The maximum file size allowed in bytes.\n * @property {number} minSize - The minimum file size allowed in bytes.\n * @property {boolean} multiple - Allows multiple files to be dropped.\n * @property {boolean} autoFocus - Automatically focuses the dropzone when it's connected to the DOM.\n * @property {boolean} noStyle - Prevents the dropzone from applying any styling.\n *\n * @attribute {string} accept - Reflects the accept property.\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {number} max-files - Reflects the maxFiles property.\n * @attribute {number} max-size - Reflects the maxSize property.\n * @attribute {number} min-size - Reflects the minSize property.\n * @attribute {boolean} multiple - Reflects the multiple property.\n * @attribute {boolean} auto-focus - Reflects the autoFocus property.\n * @attribute {boolean} no-style - Reflects the noStyle property.\n *\n * @slot - The default slot content of the dropzone.\n *\n * @csspart dropzone - The dropzone element.\n * @csspart dropzone--dragover - The state of the dropzone when dragging over it.\n *\n * @cssproperty --dropzone-border-width - The border width of the dropzone.\n * @cssproperty --dropzone-border-style - The border style of the dropzone.\n * @cssproperty --dropzone-border-radius - The border radius of the dropzone.\n * @cssproperty --dropzone-border-color - The border color of the dropzone.\n * @cssproperty --dropzone-border-color-dragover - The border color of the dropzone when dragging over it.\n * @cssproperty --dropzone-border-color-hover - The border color of the dropzone when hovering over it.\n * @cssproperty --dropzone-background-color - The background color of the dropzone.\n * @cssproperty --dropzone-background-color-dragover - The background color of the dropzone when dragging over it.\n * @cssproperty --dropzone-background-color-hover - The background color of the dropzone when hovering over it.\n * @cssproperty --dropzone-body-color - The text color of the dropzone.\n * @cssproperty --dropzone-body-color-dragover - The text color of the dropzone when dragging over it.\n * @cssproperty --dropzone-body-color-hover - The text color of the dropzone when hovering over it.\n * @cssproperty --dropzone-focus-shadow-rgb - The RGB value of the dropzone's focus shadow.\n * @cssproperty --dropzone-focus-box-shadow - The box shadow of the dropzone when focused.\n * @cssproperty --dropzone-transition-duration - The transition's duration for the dropzone area.\n *\n * @event files-dropzone-drop - Fired when files are dropped.\n * @event files-dropzone-drop-accepted - Fired when files dropped files are accepted.\n * @event files-dropzone-drop-rejected - Fired when files dropped files are rejected.\n * @event files-dropzone-dragenter - Fired when files are dragged into the dropzone.\n * @event files-dropzone-dragover - Fired when files are dragged over the dropzone.\n * @event files-dropzone-dragleave - Fired when files are dragged out of the dropzone.\n * @event files-dropzone-error - Fired when there is any error in the process of reading dropped files or directories.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method openFileDialog - Instance method. Opens the file dialog programmatically.\n */\nclass FilesDropzone extends HTMLElement {\n /** @type {Nullable} */\n #fileInput = null;\n\n /** @type {Nullable} */\n #dropzoneEl = null;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n if (this.shadowRoot) {\n this.#fileInput = /** @type {Nullable} */(this.shadowRoot.getElementById('file-input'));\n this.#dropzoneEl = this.shadowRoot.getElementById('dropzone');\n }\n }\n\n static get observedAttributes() {\n return ['accept', 'disabled', 'multiple'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'accept' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.accept = this.accept;\n }\n\n if (name === 'disabled' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.disabled = this.disabled;\n\n if (this.disabled) {\n this.#dropzoneEl?.removeAttribute('tabindex');\n this.#dropzoneEl?.setAttribute('aria-disabled', 'true');\n } else {\n this.#dropzoneEl?.setAttribute('tabindex', '0');\n this.#dropzoneEl?.setAttribute('aria-disabled', 'false');\n }\n }\n\n if (name === 'multiple' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.multiple = this.multiple;\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('accept');\n this.#upgradeProperty('disabled');\n this.#upgradeProperty('maxFiles');\n this.#upgradeProperty('maxSize');\n this.#upgradeProperty('minSize');\n this.#upgradeProperty('multiple');\n this.#upgradeProperty('autoFocus');\n this.#upgradeProperty('noStyle');\n\n this.#fileInput?.addEventListener('change', this.#handleFileInputChange);\n this.#dropzoneEl?.addEventListener('dragenter', this.#handleDragEnter);\n this.#dropzoneEl?.addEventListener('dragover', this.#handleDragOver);\n this.#dropzoneEl?.addEventListener('dragleave', this.#handleDragLeave);\n this.#dropzoneEl?.addEventListener('drop', this.#handleDrop);\n this.#dropzoneEl?.addEventListener('click', this.#handleClick);\n this.#dropzoneEl?.addEventListener('keyup', this.#handleKeyUp);\n\n this.autoFocus && this.#dropzoneEl?.focus();\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#fileInput?.removeEventListener('change', this.#handleFileInputChange);\n this.#dropzoneEl?.removeEventListener('dragenter', this.#handleDragEnter);\n this.#dropzoneEl?.removeEventListener('dragover', this.#handleDragOver);\n this.#dropzoneEl?.removeEventListener('dragleave', this.#handleDragLeave);\n this.#dropzoneEl?.removeEventListener('drop', this.#handleDrop);\n this.#dropzoneEl?.removeEventListener('click', this.#handleClick);\n this.#dropzoneEl?.removeEventListener('keyup', this.#handleKeyUp);\n }\n\n /**\n * @type {string} - A comma-separated list of unique file type specifiers describing file types to allow.\n * @attribute accept - Reflects the accept property.\n */\n get accept() {\n return this.getAttribute('accept') || '';\n }\n\n set accept(value) {\n this.setAttribute('accept', value != null ? value.toString() : value);\n }\n\n /**\n * @type {boolean} - Determines whether the dropzone is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value) {\n this.toggleAttribute('disabled', !!value);\n }\n\n /**\n * @type {number} - The maximum number of files allowed to be dropped.\n * @default Infinity\n * @attribute max-files - Reflects the maxFiles property.\n */\n get maxFiles() {\n const num = Number(this.getAttribute('max-files')) || 0;\n\n if (num <= 0) {\n return Infinity;\n }\n\n return Math.floor(Math.abs(num));\n }\n\n set maxFiles(value) {\n this.setAttribute('max-files', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} - The maximum file size allowed in bytes.\n * @default Infinity\n * @attribute max-size - Reflects the maxSize property.\n */\n get maxSize() {\n const value = this.getAttribute('max-size');\n\n if (value === null) {\n return Infinity;\n }\n\n const num = Number(value);\n\n return Number.isNaN(num) ? Infinity : num;\n }\n\n set maxSize(value) {\n this.setAttribute('max-size', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} - The minimum file size allowed in bytes.\n * @default 0\n * @attribute min-size - Reflects the minSize property.\n */\n get minSize() {\n const value = this.getAttribute('min-size');\n\n if (value === null) {\n return 0;\n }\n\n const num = Number(value);\n\n return Number.isNaN(num) ? 0 : num;\n }\n\n set minSize(value) {\n this.setAttribute('min-size', value != null ? value.toString() : value);\n }\n\n /**\n * @type {boolean} - Allows multiple files to be dropped.\n * @default false\n * @attribute multiple - Reflects the multiple property.\n */\n get multiple() {\n return this.hasAttribute('multiple');\n }\n\n set multiple(value) {\n this.toggleAttribute('multiple', !!value);\n }\n\n /**\n * @type {boolean} - Automatically focuses the dropzone when it's connected to the DOM.\n * @default false\n * @attribute auto-focus - Reflects the autoFocus property.\n */\n get autoFocus() {\n return this.hasAttribute('auto-focus');\n }\n\n set autoFocus(value) {\n this.toggleAttribute('auto-focus', !!value);\n }\n\n /**\n * @type {boolean} - Prevents the dropzone from applying any styling.\n * @default false\n * @attribute no-style - Reflects the noStyle property.\n */\n get noStyle() {\n return this.hasAttribute('no-style');\n }\n\n set noStyle(value) {\n this.toggleAttribute('no-style', !!value);\n }\n\n /**\n * Handles the change event of the file input.\n *\n * @param {*} evt - The event object.\n */\n #handleFileInputChange = async evt => {\n try {\n this.#handleFilesSelect(await getFilesFromEvent(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n };\n\n /**\n * Handles the dragenter event of the dropzone.\n */\n #handleDragEnter = () => {\n if (this.disabled) {\n return;\n }\n\n this.dispatchEvent(new Event(`${COMPONENT_NAME}-dragenter`, {\n bubbles: true,\n composed: true\n }));\n };\n\n /**\n * Handles the dragover event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleDragOver = evt => {\n evt.preventDefault();\n\n if (this.disabled) {\n evt.dataTransfer.dropEffect = 'none';\n return;\n }\n\n evt.dataTransfer.dropEffect = 'copy';\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.add('dropzone--dragover');\n this.#dropzoneEl.part.add('dropzone--dragover');\n }\n\n this.dispatchEvent(new Event(`${COMPONENT_NAME}-dragover`, {\n bubbles: true,\n composed: true\n }));\n };\n\n /**\n * Handles the dragleave event of the dropzone.\n */\n #handleDragLeave = () => {\n if (this.disabled) {\n return;\n }\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove('dropzone--dragover');\n this.#dropzoneEl.part.remove('dropzone--dragover');\n }\n\n this.dispatchEvent(new Event(`${COMPONENT_NAME}-dragleave`, {\n bubbles: true,\n composed: true\n }));\n };\n\n /**\n * Handles the drop event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleDrop = async evt => {\n if (this.disabled) {\n return;\n }\n\n evt.preventDefault();\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove('dropzone--dragover');\n this.#dropzoneEl.part.remove('dropzone--dragover');\n }\n\n try {\n this.#handleFilesSelect(await getFilesFromEvent(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n };\n\n /**\n * Handles the click event of the dropzone.\n */\n #handleClick = () => {\n if (this.disabled) {\n return;\n }\n\n this.#fileInput?.click();\n };\n\n /**\n * Handles the keyup event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleKeyUp = evt => {\n if (this.disabled) {\n return;\n }\n\n if (evt.key === ' ' || evt.key === 'Enter') {\n this.#fileInput?.click();\n }\n };\n\n /**\n * Handles the selection of files.\n *\n * @param {File[]} files - The files to handle.\n */\n #handleFilesSelect(files) {\n if (!Array.isArray(files) || !files.length) {\n return;\n }\n\n const acceptedFiles = [];\n const rejectedFiles = [];\n const filesLength = files.length;\n\n // If the component is not in multiple mode, reject all files.\n if (!this.multiple && filesLength > 1) {\n for (const file of files) {\n rejectedFiles.push({\n file,\n errors: [{\n code: TOO_MANY_FILES,\n message: `Too many files selected. Only 1 file is allowed.`\n }]\n });\n }\n } else if (this.multiple && filesLength > this.maxFiles) {\n // If the component is in multiple mode, but the number of files exceeds\n // the maxFiles attribute, reject all files.\n for (const file of files) {\n rejectedFiles.push({\n file,\n errors: [{\n code: TOO_MANY_FILES,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? 'files are' : 'file is'} allowed.`\n }]\n });\n }\n } else {\n // Validate each file. If it's valid, add it to the accepted files array,\n // otherwise add it to the rejected files array.\n for (const file of files) {\n const fileHasValidType = isValidFile(file, this.accept);\n const fileExceedsMaxSize = file.size > this.maxSize;\n const fileIsSmallerThanMinSize = file.size < this.minSize;\n\n if (fileHasValidType && !fileExceedsMaxSize && !fileIsSmallerThanMinSize) {\n acceptedFiles.push(file);\n } else {\n const errors = [];\n\n if (!fileHasValidType) {\n errors.push({\n code: INVALID_MIME_TYPE,\n message: `File type \"${file.type}\" is not accepted.`\n });\n }\n\n if (fileExceedsMaxSize) {\n errors.push({\n code: FILE_TOO_LARGE,\n message: `File size ${file.size} exceeds the maximum size of ${this.maxSize}.`\n });\n }\n\n if (fileIsSmallerThanMinSize) {\n errors.push({\n code: FILE_TOO_SMALL,\n message: `File size ${file.size} is smaller than the minimum size of ${this.minSize}.`\n });\n }\n\n rejectedFiles.push({ file, errors });\n }\n }\n }\n\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-drop`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles,\n rejectedFiles\n }\n }));\n\n if (acceptedFiles.length > 0) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-drop-accepted`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles\n }\n }));\n }\n\n if (rejectedFiles.length > 0) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-drop-rejected`, {\n bubbles: true,\n composed: true,\n detail: {\n rejectedFiles\n }\n }));\n }\n\n if (this.#fileInput) {\n this.#fileInput.value = this.#fileInput.defaultValue;\n }\n }\n\n /**\n * Opens the file dialog programmatically.\n */\n openFileDialog() {\n if (this.disabled) {\n return;\n }\n\n this.#fileInput?.click();\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'accept' | 'disabled' | 'maxFiles' | 'maxSize' | 'minSize' | 'multiple' | 'autoFocus' | 'noStyle'} prop - The property name to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='files-dropzone'] - The name of the custom element.\n * @example\n *\n * FilesDropzone.defineCustomElement('my-dropzone');\n */\n static defineCustomElement(elementName = COMPONENT_NAME) {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, FilesDropzone);\n }\n }\n}\n\nexport { FilesDropzone };\n","// @ts-check\n\n/**\n * Checks if a file is valid based on the accepted file type specifiers.\n *\n * @param {File} file - The File object to validate.\n * @param {string} [acceptedTypeSpecifiers=''] - The accepted file type specifiers.\n * @returns {boolean} - True if the file is valid, false otherwise.\n */\nexport function isValidFile(file, acceptedTypeSpecifiers = '') {\n if (!acceptedTypeSpecifiers) {\n return true;\n }\n\n const acceptedMimeTypesList = [\n ...new Set(acceptedTypeSpecifiers.split(',').map(v => v.trim()).filter(Boolean))\n ];\n\n const fileMimeType = file.type;\n const baseMimeType = fileMimeType.replace(/\\/.*$/, '');\n\n for (const validType of acceptedMimeTypesList) {\n if (validType.charAt(0) === '.') {\n if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) {\n return true;\n }\n } else if (/\\/\\*$/.test(validType)) {\n // Check for mime type that looks like \"image/*\" or similar.\n if (baseMimeType === validType.replace(/\\/.*$/, '')) {\n return true;\n }\n } else {\n if (fileMimeType === validType) {\n return true;\n }\n }\n }\n\n return false;\n}\n","// @ts-check\n\n/**\n * A map of common file extensions and their associated MIME types.\n */\nconst COMMON_MIME_TYPES = new Map([\n // https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types\n ['aac', 'audio/aac'],\n ['abw', 'application/x-abiword'],\n ['arc', 'application/x-freearc'],\n ['avif', 'image/avif'],\n ['avi', 'video/x-msvideo'],\n ['azw', 'application/vnd.amazon.ebook'],\n ['bin', 'application/octet-stream'],\n ['bmp', 'image/bmp'],\n ['bz', 'application/x-bzip'],\n ['bz2', 'application/x-bzip2'],\n ['cda', 'application/x-cdf'],\n ['csh', 'application/x-csh'],\n ['css', 'text/css'],\n ['csv', 'text/csv'],\n ['doc', 'application/msword'],\n ['docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n ['eot', 'application/vnd.ms-fontobject'],\n ['epub', 'application/epub+zip'],\n ['gz', 'application/gzip'],\n ['gif', 'image/gif'],\n ['heic', 'image/heic'],\n ['heif', 'image/heif'],\n ['htm', 'text/html'],\n ['html', 'text/html'],\n ['ico', 'image/vnd.microsoft.icon'],\n ['ics', 'text/calendar'],\n ['jar', 'application/java-archive'],\n ['jpeg', 'image/jpeg'],\n ['jpg', 'image/jpeg'],\n ['jxl', 'image/jxl'],\n ['js', 'text/javascript'],\n ['json', 'application/json'],\n ['jsonld', 'application/ld+json'],\n ['markdown', 'text/markdown'],\n ['md', 'text/markdown'],\n ['mid', 'audio/midi'],\n ['midi', 'audio/midi'],\n ['mjs', 'text/javascript'],\n ['mp3', 'audio/mpeg'],\n ['mp4', 'video/mp4'],\n ['mpeg', 'video/mpeg'],\n ['mpkg', 'application/vnd.apple.installer+xml'],\n ['odp', 'application/vnd.oasis.opendocument.presentation'],\n ['ods', 'application/vnd.oasis.opendocument.spreadsheet'],\n ['odt', 'application/vnd.oasis.opendocument.text'],\n ['oga', 'audio/ogg'],\n ['ogv', 'video/ogg'],\n ['ogx', 'application/ogg'],\n ['opus', 'audio/opus'],\n ['otf', 'font/otf'],\n ['png', 'image/png'],\n ['pdf', 'application/pdf'],\n ['php', 'application/x-httpd-php'],\n ['ppt', 'application/vnd.ms-powerpoint'],\n ['pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],\n ['rar', 'application/vnd.rar'],\n ['rtf', 'application/rtf'],\n ['sh', 'application/x-sh'],\n ['svg', 'image/svg+xml'],\n ['swf', 'application/x-shockwave-flash'],\n ['tar', 'application/x-tar'],\n ['tif', 'image/tiff'],\n ['tiff', 'image/tiff'],\n ['ts', 'video/mp2t'],\n ['ttf', 'font/ttf'],\n ['txt', 'text/plain'],\n ['vsd', 'application/vnd.visio'],\n ['wav', 'audio/wav'],\n ['weba', 'audio/webm'],\n ['webm', 'video/webm'],\n ['webp', 'image/webp'],\n ['woff', 'font/woff'],\n ['woff2', 'font/woff2'],\n ['xhtml', 'application/xhtml+xml'],\n ['xls', 'application/vnd.ms-excel'],\n ['xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],\n ['xml', 'application/xml'],\n ['xul', 'application/vnd.mozilla.xul+xml'],\n ['zip', 'application/zip'],\n ['7z', 'application/x-7z-compressed'],\n\n // Others\n ['mkv', 'video/x-matroska'],\n ['mov', 'video/quicktime'],\n ['msg', 'application/vnd.ms-outlook']\n]);\n\nconst FILES_TO_IGNORE = [\n // Thumbnail cache files for macOS and Windows\n '.DS_Store', // macOs\n 'Thumbs.db' // Windows\n];\n\n/**\n * Adds a `type` property to the file object if it doesn't have one and the file has an extension.\n * This is needed because Firefox doesn't add a type property to files dragged from the desktop.\n * @bug https://bugzilla.mozilla.org/show_bug.cgi?id=1424689\n *\n * @param {File} file - The file object to add the type property to.\n * @returns {File} - The file object with the type property added.\n */\nconst toFileWithMimeType = file => {\n const { name } = file;\n const hasExtension = name && name.lastIndexOf('.') !== -1;\n\n if (hasExtension && !file.type) {\n const extension = (name.split('.').pop() || '').toLowerCase();\n const type = COMMON_MIME_TYPES.get(extension);\n\n if (type) {\n Object.defineProperty(file, 'type', {\n value: type,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n }\n\n return file;\n};\n\n/**\n * Adds a `path` property to the file object if it doesn't have one.\n * If `path` is not provided, the `webkitRelativePath` property of the file will be used\n * or the file's name if `webkitRelativePath` is not available.\n *\n * @param {File} file - The file object to add the path property to.\n * @param {string} [path] - The path to set on the file object.\n * @returns {File} - The file object with the path property added.\n */\nconst toFileWithPath = (file, path) => {\n const fileWithMimeType = toFileWithMimeType(file);\n\n // @ts-ignore\n if (typeof fileWithMimeType.path !== 'string') {\n const { webkitRelativePath } = file;\n\n Object.defineProperty(fileWithMimeType, 'path', {\n value: typeof path === 'string' ? path : webkitRelativePath || file.name,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n\n return fileWithMimeType;\n};\n\n/**\n * Wrap `FileSystemDirectoryReader.readEntries` in a promise to make working with read entries easier.\n * https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryReader/readEntries\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */\nconst readEntriesPromise = async directoryReader => {\n return await new Promise((resolve, reject) => {\n directoryReader.readEntries(resolve, reject);\n });\n};\n\n/**\n * Read all entries in a directory or sub-directory\n * by calling `readEntries` until it returns an empty array.\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */\nconst readAllDirectoryEntries = async directoryReader => {\n const entries = [];\n let readEntries = await readEntriesPromise(directoryReader);\n\n while (readEntries.length > 0) {\n entries.push(...readEntries);\n readEntries = await readEntriesPromise(directoryReader);\n }\n\n return entries;\n};\n\n/**\n * Get a `File` object from a `FileSystemFileEntry` object.\n *\n * @param {FileSystemFileEntry} fileEntry - The file entry to get a `File` object from.\n * @returns {Promise} - A promise that resolves with a `File` object.\n */\nconst getFileFromFileEntry = fileEntry => {\n return new Promise((resolve, reject) => {\n fileEntry.file(file => resolve(toFileWithPath(file, fileEntry.fullPath)), reject);\n });\n};\n\n/**\n * Get an array of `File` objects from a `DataTransferItemList` object.\n *\n * @param {DataTransferItemList} dataTransferItemList - The item list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nconst getFilesFromDataTransferItemList = async dataTransferItemList => {\n const files = [];\n\n // Chromium browsers read only 100 files at a time as per the spec, so we need to use\n // BFS (Breadth-first search) to traverse the entire directory/file structure.\n // https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/webkitGetAsEntry#javascript_content\n const queue = [];\n\n for (const item of dataTransferItemList) {\n if (item.kind !== 'file') {\n // Ignore non-file items, such as links.\n continue;\n }\n\n // https://developer.mozilla.org/docs/Web/API/DataTransferItem/webkitGetAsEntry\n // This function is implemented as `webkitGetAsEntry()` in non-WebKit browsers\n // including Firefox at this time but it may be renamed to `getAsEntry()` in the future.\n // @ts-ignore\n const entry = item.getAsEntry ? item.getAsEntry() : item.webkitGetAsEntry();\n\n queue.push(entry);\n }\n\n while (queue.length > 0) {\n const entry = queue.shift();\n\n if (!entry) {\n continue;\n } else if (entry.isFile) {\n const file = await getFileFromFileEntry(entry);\n\n if (FILES_TO_IGNORE.indexOf(file.name) === -1) {\n files.push(file);\n }\n } else if (entry.isDirectory) {\n queue.push(...await readAllDirectoryEntries(entry.createReader()));\n }\n }\n\n return files;\n};\n\n/**\n * Get an array of `File` objects from a `FileList` object.\n *\n * @param {FileList} fileList - The file list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nconst getFilesFromFileList = async fileList => {\n const files = [];\n\n for (const file of fileList) {\n if (FILES_TO_IGNORE.indexOf(file.name) === -1) {\n files.push(toFileWithPath(file));\n }\n }\n\n return files;\n};\n\n/**\n * Get an array of `File` objects from an event.\n * This function supports both `drop` and `change` events.\n *\n * @param {*} evt - The event to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nexport const getFilesFromEvent = async evt => {\n if (evt.dataTransfer) {\n return evt.dataTransfer.items\n ? await getFilesFromDataTransferItemList(evt.dataTransfer.items)\n : await getFilesFromFileList(evt.dataTransfer.files);\n }\n\n return await getFilesFromFileList(evt.target.files);\n};\n","export const ACCEPTED_MIME_TYPES = [\n 'image/jpg',\n 'image/jpeg',\n 'image/png',\n 'image/apng',\n 'image/gif',\n 'image/webp',\n 'image/avif'\n];\nexport const MAX_SHADOW_BLUR_SIZE = 20;\nexport const MAX_STROKE_WIDTH = 20;\nexport const MAX_ROTATE = 360;\n","/**\n * Generates a unique id of the form `${prefix}-${randomString}-${suffix}`.\n *\n * @param {string} [prefix=''] - The prefix to use for the id.\n * @param {string} [suffix=''] - The suffix to use for the id.\n * @returns {string} - The unique id.\n */\nconst uid = (prefix = '', suffix = '') => {\n const prefixString = typeof prefix === 'string' && prefix !== '' ? prefix + '-' : '';\n const suffixString = typeof suffix === 'string' && suffix !== '' ? '-' + suffix : '';\n const randomString = Math.random().toString(36).substring(2, 8); // Pseudo-random string of six alphanumeric characters.\n\n return `${prefixString}${randomString}${suffixString}`;\n};\n\nexport { uid };\n","import { ACCEPTED_MIME_TYPES } from '../constants.js';\n\n/**\n * Creates a file from a given URL.\n *\n * @param {{ url: string, filename: string, mimeType: string }} options\n * @param {string} options.url - The URL of the file to fetch.\n * @param {string} options.filename - The name of the file to create.\n * @param {string} options.mimeType - The MIME type of the file to create.\n * @returns {Promise} - A promise that resolves to the file created from the given URL.\n */\nexport const fileFromUrl = async (options = {}) => {\n const res = await fetch(options.url);\n const blob = await res.blob();\n const mimeType = options.mimeType || blob.type || '';\n\n if (!ACCEPTED_MIME_TYPES.includes(mimeType)) {\n throw new Error(\n `This is not an accepted image format. Accepted MIME types are: ${ACCEPTED_MIME_TYPES.join(', ')}`\n );\n }\n\n return new File([blob], options.filename || '', blob);\n};\n","/**\n * A class representing a storage utility for managing data in `localStorage` or `sessionStorage`.\n */\nclass Storage {\n /**\n * The prefix to be added to all keys.\n *\n * @type {string}\n * @private\n */\n #keyPrefix = null;\n\n /**\n * The storage provider (`localStorage` or `sessionStorage`).\n *\n * @type {Storage}\n * @private\n */\n #provider = null;\n\n /**\n * Creates an instance of Storage.\n *\n * @param {string} prefix - The prefix to be added to all keys when storing/retrieving data.\n * @param {Storage} [provider=localStorage] - The storage provider (`localStorage` or `sessionStorage`).\n * @throws {Error} If prefix is not provided or if the provider is not supported.\n */\n constructor(prefix, provider = localStorage) {\n if (!prefix) {\n throw new Error('Storage prefix is required');\n }\n\n if (provider !== localStorage && provider !== sessionStorage) {\n throw new Error('Storage provider is not supported');\n }\n\n this.#keyPrefix = prefix;\n this.#provider = provider;\n }\n\n /**\n * Sets a key-value pair in the storage.\n *\n * @param {string} key - The key for the data.\n * @param {*} value - The value to be stored (will be converted to JSON string).\n */\n set(key, value) {\n try {\n this.#provider.setItem(`${this.#keyPrefix}${key}`, JSON.stringify(value));\n } catch (err) {\n console.error('Error saving to storage', err);\n }\n }\n\n /**\n * Retrieves the value associated with the given key from the storage.\n *\n * @param {string} key - The key to retrieve the value for.\n * @returns {*} The value associated with the key, or `null` if key is not found or an error occurs.\n */\n get(key) {\n try {\n const value = this.#provider.getItem(`${this.#keyPrefix}${key}`);\n return value ? JSON.parse(value) : null;\n } catch (err) {\n console.error('Error getting from storage', err);\n return null;\n }\n }\n}\n\nconst DEFAULT_STORAGE_PREFIX = 'meme-generator/';\nconst DEFAULT_STORAGE_PROVIDER = localStorage;\nconst storage = new Storage(DEFAULT_STORAGE_PREFIX, DEFAULT_STORAGE_PROVIDER);\n\nexport { Storage, storage };\n","export const isSolidColorSelected = selectedImage => {\n return typeof selectedImage === 'string';\n};\n","import Pressuru from 'url:../assets/fonts/Pressuru/Pressuru.ttf';\nimport OswaldRegular from 'url:../assets/fonts/Oswald/Oswald-Regular.ttf';\nimport OswaldBold from 'url:../assets/fonts/Oswald/Oswald-Bold.ttf';\nimport RobotoRegular from 'url:../assets/fonts/Roboto/Roboto-Regular.ttf';\nimport RobotoBold from 'url:../assets/fonts/Roboto/Roboto-Bold.ttf';\nimport RobotoCondensedRegular from 'url:../assets/fonts/RobotoCondensed/RobotoCondensed-Regular.ttf';\nimport RobotoCondensedBold from 'url:../assets/fonts/RobotoCondensed/RobotoCondensed-Bold.ttf';\nimport CourierPrimeRegular from 'url:../assets/fonts/CourierPrime/CourierPrime-Regular.ttf';\nimport CourierPrimeBold from 'url:../assets/fonts/CourierPrime/CourierPrime-Bold.ttf';\nimport OpenSansRegular from 'url:../assets/fonts/OpenSans/OpenSans-Regular.ttf';\nimport OpenSansBold from 'url:../assets/fonts/OpenSans/OpenSans-Bold.ttf';\n\nexport const customFonts = [\n { name: 'Pressuru', label: 'Pressuru', path: Pressuru, style: 'normal', weight: '400' },\n { name: 'Oswald-Regular', label: 'Oswald', path: OswaldRegular, style: 'normal', weight: '400' },\n { name: 'Oswald-Bold', label: 'Oswald Bold', path: OswaldBold, style: 'normal', weight: '700' },\n { name: 'Roboto-Regular', label: 'Roboto', path: RobotoRegular, style: 'normal', weight: '400' },\n { name: 'Roboto-Bold', label: 'Roboto Bold', path: RobotoBold, style: 'normal', weight: '700' },\n {\n name: 'RobotoCondensed-Regular',\n label: 'Roboto Condensed',\n path: RobotoCondensedRegular,\n style: 'normal',\n weight: '400'\n },\n {\n name: 'RobotoCondensed-Bold',\n label: 'Roboto Condensed Bold',\n path: RobotoCondensedBold,\n style: 'normal',\n weight: '700'\n },\n {\n name: 'CourierPrime-Regular',\n label: 'Courier Prime',\n path: CourierPrimeRegular,\n style: 'normal',\n weight: '400'\n },\n {\n name: 'CourierPrime-Bold',\n label: 'Courier Prime Bold',\n path: CourierPrimeBold,\n style: 'normal',\n weight: '700'\n },\n {\n name: 'OpenSans-Regular',\n label: 'Open Sans',\n path: OpenSansRegular,\n style: 'normal',\n weight: '400'\n },\n {\n name: 'OpenSans-Bold',\n label: 'Open Sans Bold',\n path: OpenSansBold,\n style: 'normal',\n weight: '400'\n }\n];\n\nexport const loadCustomFont = async (name, path, options = {}) => {\n try {\n const font = new FontFace(name, `url(${path})`, { ...options });\n await font.load();\n document.fonts.add(font);\n } catch (err) {\n console.error(err);\n }\n};\n","module.exports = new __parcel__URL__(\"Pressuru.684952ea.ttf\").toString();","module.exports = new __parcel__URL__(\"Oswald-Regular.89ec7d89.ttf\").toString();","module.exports = new __parcel__URL__(\"Oswald-Bold.0f6a7ca6.ttf\").toString();","module.exports = new __parcel__URL__(\"Roboto-Regular.ca197847.ttf\").toString();","module.exports = new __parcel__URL__(\"Roboto-Bold.fdb9b54a.ttf\").toString();","module.exports = new __parcel__URL__(\"RobotoCondensed-Regular.d585f5c7.ttf\").toString();","module.exports = new __parcel__URL__(\"RobotoCondensed-Bold.e1f96d4b.ttf\").toString();","module.exports = new __parcel__URL__(\"CourierPrime-Regular.3a25a501.ttf\").toString();","module.exports = new __parcel__URL__(\"CourierPrime-Bold.3d6bf689.ttf\").toString();","module.exports = new __parcel__URL__(\"OpenSans-Regular.edf9e01b.ttf\").toString();","module.exports = new __parcel__URL__(\"OpenSans-Bold.8fceb72b.ttf\").toString();","const errorsContainer = document.getElementById('errorsContainer');\n\nconst hideError = evt => {\n const target = evt.currentTarget;\n target.removeEventListener('click', hideError);\n errorsContainer.removeChild(target.parentNode);\n};\n\nexport const toastAlert = (message = '', type = 'info') => {\n const types = ['info', 'warning', 'danger'];\n\n if (!types.includes(type)) {\n type = 'info';\n }\n\n const template = /* html */ `\n ${message}\n \n `;\n\n const div = document.createElement('div');\n div.className = `alert alert-${type} alert-dismissible text-break mb-2 fade`;\n div.innerHTML = template;\n div.querySelector('button').addEventListener('click', hideError);\n errorsContainer.appendChild(div);\n setTimeout(() => div.classList.add('show'), 100);\n};\n","import { uid } from './utils/uid.js';\nimport { customFonts } from './custom-fonts.js';\nimport { MAX_SHADOW_BLUR_SIZE, MAX_STROKE_WIDTH, MAX_ROTATE } from './constants.js';\n\nconst defaultTextboxData = {\n id: '',\n text: '',\n fillColor: '#ffffff',\n strokeColor: '#000000',\n font: 'Pressuru',\n fontSize: 40,\n fontWeight: 'normal',\n textAlign: 'center',\n shadowBlur: 0,\n strokeWidth: 1.5,\n offsetY: 0,\n offsetX: 0,\n rotate: 0,\n allCaps: true\n};\n\nconst textboxes = new Map();\n\nclass Textbox {\n constructor(data) {\n const id = uid('textbox', Date.now().toString(36));\n\n this.data = data ? { ...data, id } : { ...defaultTextboxData, id };\n\n textboxes.set(id, this);\n\n document.dispatchEvent(\n new CustomEvent(`textbox-create`, {\n bubbles: true,\n composed: true,\n detail: { textbox: this }\n })\n );\n }\n\n getData() {\n return this.data;\n }\n\n static create(data) {\n return new Textbox(data);\n }\n\n static getAll() {\n return textboxes;\n }\n\n static getById(id) {\n return textboxes.get(id);\n }\n\n static remove(id) {\n textboxes.delete(id);\n\n document.dispatchEvent(\n new CustomEvent(`textbox-remove`, {\n bubbles: true,\n composed: true,\n detail: { id }\n })\n );\n }\n\n static createElement(textbox, autoFocus = true) {\n if (!(textbox instanceof Textbox)) {\n return;\n }\n\n const data = textbox.getData();\n const {\n id,\n text,\n fillColor,\n strokeColor,\n fontSize,\n shadowBlur,\n strokeWidth,\n offsetX,\n offsetY,\n rotate\n } = data;\n\n const template = /* html */ `\n
\n \n \n\n \n\n
\n \n \n\n \n \n\n \n
\n
\n\n \n `;\n\n const fragment = document.createDocumentFragment();\n const div = document.createElement('div');\n\n div.setAttribute('id', id);\n div.setAttribute('data-section', 'textbox');\n div.className = 'bg-light border shadow-sm mb-3 rounded';\n div.innerHTML = template;\n div.querySelectorAll('select').forEach(el => (el.value = data[el.dataset.input]));\n div\n .querySelectorAll('input[type=\"checkbox\"]')\n .forEach(el => (el.checked = data[el.dataset.input]));\n\n const textboxEl = fragment.appendChild(div);\n\n if (autoFocus) {\n setTimeout(() => textboxEl.querySelector('[data-input=\"text\"]').focus(), 0);\n }\n\n return textboxEl;\n }\n}\n\nexport { Textbox };\n","import { isSolidColorSelected } from './utils/is-solid-color-selected.js';\nimport { MAX_SHADOW_BLUR_SIZE, MAX_STROKE_WIDTH, MAX_ROTATE } from './constants.js';\n\nexport class Canvas {\n #canvas = null;\n #ctx = null;\n\n constructor(canvasEl) {\n this.#canvas = canvasEl;\n this.#ctx = this.#canvas.getContext('2d');\n }\n\n get width() {\n return this.#canvas.width;\n }\n\n set width(value) {\n this.#canvas.width = value;\n }\n\n get height() {\n return this.#canvas.height;\n }\n\n set height(value) {\n this.#canvas.height = value;\n }\n\n getDimensions() {\n return {\n width: this.width,\n height: this.height\n };\n }\n\n setDimensions({ width, height }) {\n this.width = width;\n this.height = height;\n return this;\n }\n\n toDataURL() {\n return this.#canvas.toDataURL();\n }\n\n draw(image, textboxes = new Map()) {\n if (image == null) {\n return;\n }\n\n const canvas = this.#canvas;\n const ctx = this.#ctx;\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n if (isSolidColorSelected(image)) {\n ctx.fillStyle = image;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n } else {\n ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n }\n\n let multiplier = 0;\n\n textboxes.forEach(textbox => {\n const { data } = textbox;\n\n multiplier += 1;\n\n ctx.save();\n\n ctx.font = `${data.fontWeight} ${(data.fontSize * canvas.width) / 1000}px ${data.font}`;\n ctx.fillStyle = data.fillColor;\n ctx.textAlign = data.textAlign;\n ctx.strokeStyle = data.strokeColor;\n\n const lineHeight = ctx.measureText('M').width + data.fontSize / 2;\n const xPos = canvas.width / 2;\n const shadowBlur = data.shadowBlur;\n const text = data.allCaps === true ? data.text.toUpperCase() : data.text;\n const textLines = text.split('\\n');\n\n if (shadowBlur !== 0) {\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n ctx.shadowBlur = Math.min(shadowBlur, MAX_SHADOW_BLUR_SIZE);\n ctx.shadowColor = data.strokeColor;\n }\n\n ctx.translate(xPos + data.offsetX, lineHeight * multiplier + data.offsetY);\n ctx.rotate((Math.min(data.rotate, MAX_ROTATE) * Math.PI) / 180);\n\n // First draw each line with shadow.\n textLines.forEach((text, index) => ctx.fillText(text, 0, index * lineHeight));\n\n // Since shadows of multiline text may be drawn over letters of neighbour lines\n // (when shadow blur is big enough), re-draw text without shadows.\n if (shadowBlur !== 0) {\n ctx.shadowBlur = 0;\n textLines.forEach((text, index) => ctx.fillText(text, 0, index * lineHeight));\n }\n\n if (data.strokeWidth > 0) {\n ctx.lineWidth = Math.min(data.strokeWidth, MAX_STROKE_WIDTH);\n textLines.forEach((text, index) => ctx.strokeText(text, 0, index * lineHeight));\n }\n\n ctx.restore();\n });\n\n return this;\n }\n\n clear() {\n this.#ctx.clearRect(0, 0, this.#canvas.width, this.#canvas.height);\n return this;\n }\n\n show() {\n this.#canvas.hidden = false;\n return this;\n }\n\n hide() {\n this.#canvas.hidden = true;\n return this;\n }\n\n static createInstance(canvasEl) {\n return new Canvas(canvasEl);\n }\n}\n"],"names":["$9e9d3488b14d9168$var$promise","$9e9d3488b14d9168$var$baselineEmojiWidth","$parcel$interopDefault","a","__esModule","default","$736431a7b9521865$var$assertNonEmptyString","str","Error","$736431a7b9521865$var$assertNumber","number","$736431a7b9521865$var$STORE_EMOJI","$736431a7b9521865$var$STORE_KEYVALUE","$736431a7b9521865$var$STORE_FAVORITES","$736431a7b9521865$var$INDEX_TOKENS","$736431a7b9521865$var$INDEX_COUNT","$736431a7b9521865$var$INDEX_GROUP_AND_ORDER","$736431a7b9521865$var$KEY_ETAG","$736431a7b9521865$var$KEY_PREFERRED_SKINTONE","$736431a7b9521865$var$MODE_READONLY","$736431a7b9521865$var$MODE_READWRITE","$736431a7b9521865$var$INDEX_SKIN_UNICODE","$736431a7b9521865$var$uniqEmoji","emojis","$736431a7b9521865$var$uniqBy","arr","func","set","Set","res","item","key","has","add","push","_","unicode","$736431a7b9521865$var$openIndexedDBRequests","$736431a7b9521865$var$databaseCache","$736431a7b9521865$var$onCloseListeners","$736431a7b9521865$var$handleOpenOrDeleteReq","resolve","reject","req","onerror","error","onblocked","onsuccess","result","$736431a7b9521865$var$createDatabase","dbName","db","Promise","indexedDB","open","onupgradeneeded","e","oldVersion","$736431a7b9521865$var$initialMigration","createObjectStore","name","keyPath","indexes","store","indexName","multiEntry","Object","entries","createIndex","undefined","onclose","$736431a7b9521865$var$closeDatabase","$736431a7b9521865$var$dbPromise","storeName","readOnlyOrReadWrite","cb","txn","transaction","durability","objectStore","map","oncomplete","close","listeners","listener","$736431a7b9521865$var$irregularEmoticons","$736431a7b9521865$var$extractTokens","split","word","match","toLowerCase","replace","filter","Boolean","$736431a7b9521865$var$normalizeTokens","length","$736431a7b9521865$var$callStore","method","target","$736431a7b9521865$var$getIDB","$736431a7b9521865$var$getAllIDB","$736431a7b9521865$var$commit","commit","$736431a7b9521865$var$findCommonMembers","arrays","uniqByFunc","shortestArray","$736431a7b9521865$var$minBy","array","minItem","i","results","some","findIndex","$736431a7b9521865$var$isEmpty","$736431a7b9521865$var$get","$736431a7b9521865$var$hasData","url","eTag","oldETag","oldUrl","all","$736431a7b9521865$var$doFullDatabaseScanForSingleResult","predicate","emojiStore","lastKey","processNextBatch","getAll","IDBKeyRange","lowerBound","$736431a7b9521865$var$loadData","emojiData","transformedData","annotation","emoticon","group","order","shortcodes","skins","tags","emoji","version","tokens","flat","sort","tone","skinTones","skinUnicodes","skinVersions","metaStore","todo","checkFetched","onFetched","data","clear","put","$736431a7b9521865$var$getEmojiByGroup","range","bound","index","$736431a7b9521865$var$getEmojiBySearchQuery","query","intermediateResults","checkDone","onDone","b","token","only","$736431a7b9521865$var$getEmojiByShortcode","shortcode","lowerShortcodes","includes","$736431a7b9521865$var$getEmojiByUnicode","$736431a7b9521865$var$requiredKeys$1","$736431a7b9521865$var$customEmojiIndex","customEmojis","$736431a7b9521865$var$assertCustomEmojis","isArray","Array","firstItemIsFaulty","sortByName","searchTrie","$736431a7b9521865$var$trie","itemToTokens","Map","currentMap","char","charAt","nextMap","get","valuesAtCoda","exact","queue","value","shift","searchByExactMatch","searchByPrefix","shortcodeToEmoji","nameToEmoji","customEmoji","search","byShortcode","byName","$736431a7b9521865$var$isFirefoxContentScript","wrappedJSObject","$736431a7b9521865$var$cleanEmoji","structuredClone","len","$736431a7b9521865$var$warnETag","console","warn","$736431a7b9521865$var$requiredKeys","$736431a7b9521865$var$assertStatus","response","dataSource","Math","floor","status","$736431a7b9521865$var$getETag","fetch","headers","$736431a7b9521865$var$getETagAndData","json","$736431a7b9521865$var$assertEmojiData","$736431a7b9521865$var$jsonChecksum","object","inBuffer","$736431a7b9521865$var$binaryStringToArrayBuffer","binary","buf","ArrayBuffer","Uint8Array","charCodeAt","JSON","stringify","btoa","$736431a7b9521865$var$arrayBufferToBinaryString","buffer","bytes","byteLength","String","fromCharCode","crypto","subtle","digest","$736431a7b9521865$var$checkForUpdates","eTagAndData","$736431a7b9521865$var$loadDataForFirstTime","$736431a7b9521865$export$2e2bcd8739ae039","constructor","locale","_dbName","_db","_lazyUpdate","_custom","_clear","bind","_ready","_init","ready","checkReady","getEmojiByGroup","getEmojiBySearchQuery","getEmojiByShortcode","getEmojiByUnicodeOrName","unicodeOrName","getPreferredSkinTone","setPreferredSkinTone","skinTone","incrementFavoriteEmojiCount","getTopFavoriteEmoji","limit","customEmojiIndex","favoritesStore","openCursor","cursor","addResult","continue","primaryKey","custom","_shutdown","err","delete","deleteDatabase","$9e9d3488b14d9168$var$allGroups","id","$9e9d3488b14d9168$var$groups","slice","$9e9d3488b14d9168$var$rIC","requestIdleCallback","setTimeout","$9e9d3488b14d9168$var$hasZwj","$9e9d3488b14d9168$var$versionsAndTestEmoji","$9e9d3488b14d9168$var$MOST_COMMONLY_USED_EMOJI","$9e9d3488b14d9168$var$FONT_FAMILY","$9e9d3488b14d9168$var$DEFAULT_CATEGORY_SORTING","$9e9d3488b14d9168$var$getTextFeature","text","color","canvas","document","createElement","width","height","ctx","getContext","textBaseline","font","fillStyle","scale","fillText","getImageData","$9e9d3488b14d9168$var$compareFeatures","feature1","feature2","feature1Str","join","startsWith","$9e9d3488b14d9168$var$detectEmojiSupportLevel","$9e9d3488b14d9168$var$determineEmojiSupportLevel","$9e9d3488b14d9168$var$testColorEmojiSupported","$9e9d3488b14d9168$var$supportedZwjEmojis","$9e9d3488b14d9168$var$halt","event","preventDefault","stopPropagation","$9e9d3488b14d9168$var$incrementOrDecrement","decrement","val","$9e9d3488b14d9168$var$uniqBy","$9e9d3488b14d9168$var$rAF","requestAnimationFrame","$9e9d3488b14d9168$var$resizeObserverSupported","ResizeObserver","$9e9d3488b14d9168$var$calculateTextWidth","node","createRange","selectNode","firstChild","getBoundingClientRect","$9e9d3488b14d9168$var$getFromMap","cache","cached","$9e9d3488b14d9168$var$parseCache","WeakMap","$9e9d3488b14d9168$var$domInstancesCache","$9e9d3488b14d9168$var$unkeyedSymbol","Symbol","$9e9d3488b14d9168$var$hasReplaceChildren","Element","prototype","$9e9d3488b14d9168$var$qM","queueMicrotask","callback","then","$9e9d3488b14d9168$var$arraysAreEqualByFunction","left","right","areEqualFunc","$9e9d3488b14d9168$var$EMPTY_ARRAY","assign","$9e9d3488b14d9168$var$assign","$bf4f0cf05f6fd378$var$browserSupportsTextareaTextNodes","$9e9d3488b14d9168$var$enI18n","categoriesLabel","emojiUnsupportedMessage","favoritesLabel","loadingMessage","networkErrorMessage","regionLabel","searchDescription","searchLabel","searchResultsLabel","skinToneDescription","skinToneLabel","skinTonesLabel","categories","activities","objects","symbols","flags","$9e9d3488b14d9168$var$PROPS","$9e9d3488b14d9168$var$EXTRA_STYLES","$9e9d3488b14d9168$export$2e2bcd8739ae039","HTMLElement","props","attachShadow","mode","style","prop","textContent","$9e9d3488b14d9168$var$baseStyles","shadowRoot","appendChild","_ctx","skinToneEmoji","customCategorySorting","i18n","emojiVersion","hasOwnProperty","call","_dbFlush","connectedCallback","_cmp","$9e9d3488b14d9168$var$createRoot","refs","abortController","AbortController","abortSignal","signal","state","createEffect","$9e9d3488b14d9168$var$createState","currentObserver","queued","destroyed","propsToObservers","dirtyObservers","flush","observersToRun","observer","size","Proxy","observers","newValue","addEventListener","runnable","oldObserver","database","initialLoad","currentEmojis","currentEmojisWithCategories","rawSearchText","searchText","searchMode","activeSearchItem","message","skinTonePickerExpanded","skinTonePickerExpandedAfterAnimation","currentSkinTone","activeSkinTone","skinToneButtonText","pickerStyle","skinToneButtonLabel","currentFavorites","defaultFavoriteEmojis","numColumns","isRtl","scrollbarWidth","currentGroupIndex","groups","databaseLoaded","activeSearchItemId","currentGroup","focus","getElementById","emojiToDomNode","fireEvent","detail","rootElement","dispatchEvent","CustomEvent","bubbles","composed","compareEmojiArrays","compareCurrentEmojisWithCategories","category","aCategory","aEmojis","bCategory","bEmojis","updateCurrentEmojis","newEmojis","updateSearchMode","newSearchMode","updateCurrentEmojisWithCategories","newEmojisWithCategories","unicodeWithSkin","helpers","labelWithSkin","$9e9d3488b14d9168$var$uniq","titleForEmoji","events","onClickSkinToneButton","onEmojiClick","onNavClick","closestTarget","closest","groupId","parseInt","dataset","searchElement","onNavKeydown","doFocus","el","previousElementSibling","nextElementSibling","parentElement","firstElementChild","lastElementChild","onSearchKeydown","goToNextOrPrevious","previous","clickEmoji","onSkinToneOptionsClick","changeSkinTone","onSkinToneOptionsFocusOut","onSkinToneOptionsKeydown","changeActiveSkinTone","nextSkinTone","onSkinToneOptionsKeyup","onSearchInput","actions","calculateEmojiGridStyle","onUpdate","resizeObserver","getComputedStyle","newNumColumns","getPropertyValue","newIsRtl","parentWidth","contentRect","observe","disconnect","firstRender","updateCustomEmoji","isZwjSupported","filterEmojisByVersion","emojiSupportLevel","summarizeEmojis","$9e9d3488b14d9168$var$summarizeEmojisForUI","toSimpleSkinsMap","skin","getEmojisByGroup","getEmojisBySearchQuery","emojiSummary","find","skinTonedUnicode","classList","contains","substring","relatedTarget","$9e9d3488b14d9168$var$render","container","html","$9e9d3488b14d9168$var$createFramework","domInstances","domInstanceCacheKey","keyFunction","originalCacheKey","expressions","domInstancesForTokens","updateDomInstance","$9e9d3488b14d9168$var$parseHtml","template","elementsToBindings","$9e9d3488b14d9168$var$parse","htmlString","withinTag","withinAttribute","elementIndexCounter","elementIndexes","attributeName","attributeValuePre","attributeValuePost","j","nextChar","pop","bindings","exec","binding","expressionIndex","$9e9d3488b14d9168$var$parseTemplate","innerHTML","dom","cloneNode","content","instanceBindings","$9e9d3488b14d9168$var$traverseAndSetupBindings","treeWalker","createTreeWalker","NodeFilter","SHOW_ELEMENT","element","elementIndex","targetNode","instanceBinding","targetParentNode","currentExpression","nextNode","$9e9d3488b14d9168$var$patch","expression","setAttribute","newNode","$9e9d3488b14d9168$var$patchChildren","newChildren","needsRerender","$9e9d3488b14d9168$var$doChildrenNeedRerender","parentNode","oldChild","oldChildrenCount","newChild","nextSibling","$9e9d3488b14d9168$var$replaceChildren","replaceChildren","append","replaceWith","nodeValue","emojiList","prefix","rootDom","emojiWithCategory","forElementWithAttribute","querySelectorAll","getAttribute","eventName","listenerName","ref","action","removeChild","level","handleDatabaseLoading","showingLoadingMessage","timeoutHandle","clearTimeout","updatePreferredSkinTone","fill","$9e9d3488b14d9168$var$applySkinTone","zwjIndex","indexOf","fromCodePoint","$9e9d3488b14d9168$var$LIGHT_SKIN_TONE","endsWith","$9e9d3488b14d9168$var$LIGHT_SKIN_TONE_MODIFIER","updateDefaultFavoriteEmojis","favs","updateFavorites","dbFavorites","favorites","updateEmojis","currentGroupId","zwjEmojisToCheck","$9e9d3488b14d9168$var$checkZwjSupport","baselineEmoji","emojiWidth","supported","tabpanelElement","scrollTop","calculateCurrentEmojisWithCategories","categoriesToEmoji","trim","skinToneDropdown","once","$set","newState","$destroy","abort","disconnectedCallback","isConnected","catch","observedAttributes","attributeChangedCallback","attrName","oldValue","_set","up","toUpperCase","parseFloat","_dbCreate","$9e9d3488b14d9168$var$definitions","$bf4f0cf05f6fd378$var$canManipulateViaTextNodes","input","nodeName","textarea","defineProperties","customElements","define","$bf4f0cf05f6fd378$export$2e2bcd8739ae039","selection","ieRange","collapse","select","execCommand","start","selectionStart","end","selectionEnd","setRangeText","textNode","createTextNode","offset","startNode","endNode","nodeLength","setStart","setEnd","deleteContents","commonAncestorContainer","insertNode","setSelectionRange","createEvent","initEvent","$7a2aca835bb05064$export$c37129e465f64ef0","navigator","canShare","defineProperty","$cd62c5572235e737$export$30b344bef3e55b67","enumerable","configurable","$cd62c5572235e737$var$t","$cd62c5572235e737$var$e","t","s","delegatesFocus","querySelector","toggleAttribute","disabled","toString","part","toggle","r","n","removeEventListener","hasAttribute","shareUrl","shareTitle","shareText","shareFiles","share","title","files","shareData","assignedElements","flatten","defineCustomElement","window","$dced0d224c6d876e$export$cc30a98fe3890794","$dced0d224c6d876e$var$t","Number","isNaN","min","max","$dced0d224c6d876e$var$e","$dced0d224c6d876e$var$i","$dced0d224c6d876e$var$o","o","l","getSupportedConstraints","getTrackCapabilities","getTrackSettings","u","facingMode","stopVideoStream","startVideoStream","cameraResolution","pan","h","tilt","zoom","d","c","m","p","g","f","v","isSupported","autoPlay","noImage","loading","calculateFileSize","capture","play","video","finally","removeAttribute","from","childNodes","forEach","remove","getVideoTracks","applyConstraints","advanced","ideal","audio","mediaDevices","getUserMedia","srcObject","hidden","stop","videoWidth","videoHeight","drawImage","toDataURL","Image","src","dataURI","blob","getCapabilities","getSettings","$d9c5053bade2d3f8$export$32589115725b904b","$d9c5053bade2d3f8$var$e","$d9c5053bade2d3f8$var$t","showModal","body","preserveOverflow","overflow","noHeader","noAnimations","noCloseButton","staticBackdrop","fullscreen","placement","closeLabel","defaultPrevented","currentTarget","hide","assignedNodes","cancelable","reason","show","$9351176e8d763a78$export$6ccd1735166caad9","$9351176e8d763a78$var$e","$9351176e8d763a78$var$t","$9351176e8d763a78$var$o","lastIndexOf","type","writable","$9351176e8d763a78$var$i","path","webkitRelativePath","$9351176e8d763a78$var$r","readEntries","$9351176e8d763a78$var$a","$9351176e8d763a78$var$n","file","fullPath","$9351176e8d763a78$var$s","kind","getAsEntry","webkitGetAsEntry","isFile","isDirectory","createReader","$9351176e8d763a78$var$d","$9351176e8d763a78$var$l","dataTransfer","items","$9351176e8d763a78$var$p","$9351176e8d763a78$var$c","$9351176e8d763a78$var$h","$9351176e8d763a78$var$u","accept","multiple","autoFocus","maxFiles","abs","maxSize","minSize","noStyle","Event","dropEffect","click","errors","code","test","acceptedFiles","rejectedFiles","defaultValue","openFileDialog","$65136e012e05e2d7$export$63e7bed68b07a85c","$17004b28c97c1306$export$e2a22331486dcca0","suffix","randomString","random","$2669cb7c28251d2a$export$6539e087749cf9d3","options","mimeType","File","filename","$9e093dbdf49c6d51$var$DEFAULT_STORAGE_PROVIDER","localStorage","$9e093dbdf49c6d51$export$ddcffe0146c8f882","keyPrefix","provider","sessionStorage","setItem","getItem","parse","$c38b15b964e67d8b$export$de75f46579dcf24","selectedImage","$e42bddb24cbeb64a$exports","URL","$73cffea1ce7b4c65$exports","$7ffd9e1ede1ff6e8$exports","$4c6967df0d437c45$exports","$3b8ba92249dba9f8$exports","$6ae2d9e238daf807$exports","$16764e62b86810da$exports","$d78526ca6254cbd7$exports","$2ba9f93d92a312e8$exports","$94512d98527e27c0$exports","$0ef27a7a117f4923$exports","$56b863c8b6be7003$export$6874249d87f2602a","label","weight","$56b863c8b6be7003$export$59eceaef0c7797b2","FontFace","load","fonts","$3969451ff60cb8d5$var$errorsContainer","$3969451ff60cb8d5$var$hideError","evt","$3969451ff60cb8d5$export$af04143326425dbd","types","div","className","$a5e4a78f80aa8693$var$defaultTextboxData","fillColor","strokeColor","fontSize","fontWeight","textAlign","shadowBlur","strokeWidth","offsetY","offsetX","rotate","allCaps","$a5e4a78f80aa8693$var$textboxes","$a5e4a78f80aa8693$export$8e3dca5fa4d5f04b","Date","now","textbox","getData","create","getById","fragment","createDocumentFragment","checked","textboxEl","$9b58d7721ff4a93e$export$8d01c972ee8b14a9","canvasEl","getDimensions","setDimensions","draw","image","textboxes","clearRect","fillRect","multiplier","save","strokeStyle","lineHeight","measureText","xPos","textLines","shadowOffsetX","shadowOffsetY","shadowColor","translate","PI","lineWidth","strokeText","restore","createInstance","$85a5f86b715fe7db$var$canvas","$85a5f86b715fe7db$var$videoModal","$85a5f86b715fe7db$var$downloadModal","$85a5f86b715fe7db$var$dropzoneEl","$85a5f86b715fe7db$var$instructionsEl","$85a5f86b715fe7db$var$imageUploadMethodSelect","$85a5f86b715fe7db$var$fileSelectBtn","$85a5f86b715fe7db$var$imageUrlForm","$85a5f86b715fe7db$var$addTextboxBtn","$85a5f86b715fe7db$var$textboxesContainer","$85a5f86b715fe7db$var$generateMemeBtn","$85a5f86b715fe7db$var$openVideoModalBtn","$85a5f86b715fe7db$var$downloadMemeBtn","$85a5f86b715fe7db$var$downloadMemePreview","$85a5f86b715fe7db$var$webShareComponent","$85a5f86b715fe7db$var$galleryEl","$85a5f86b715fe7db$var$gallerySearchEl","$85a5f86b715fe7db$var$galleryNoResultsEl","$85a5f86b715fe7db$var$solidColorForm","$85a5f86b715fe7db$var$uploadMethodEls","$85a5f86b715fe7db$var$removeConfirmationModal","$85a5f86b715fe7db$var$removeTextForm","$85a5f86b715fe7db$var$maxImageDimensionsForm","$85a5f86b715fe7db$var$maxImageDimensionsSelect","$85a5f86b715fe7db$var$clearCanvasBtn","$85a5f86b715fe7db$var$maxImageDimensionsFromStorage","$85a5f86b715fe7db$var$shouldFocusOnTextboxCreate","$85a5f86b715fe7db$var$selectedImage","$85a5f86b715fe7db$var$reqAnimFrame","$85a5f86b715fe7db$var$generateMeme","dataUrl","downloadLink","download","href","$85a5f86b715fe7db$var$setImageMaxDimensions","maxWidthValue","maxHeightValue","maxImageDimensionsSelect","MAX_WIDTH","MAX_HEIGHT","$85a5f86b715fe7db$var$afterImageSelect","$85a5f86b715fe7db$var$handleImageLoad","$85a5f86b715fe7db$var$handleFileSelect","reader","FileReader","readAsDataURL","$85a5f86b715fe7db$var$handleTextPropChange","textboxId","textboxData","$85a5f86b715fe7db$var$handleImageUploadFromURL","form","submitButton","imageUrl","$85a5f86b715fe7db$var$moveTextUsingArrowbuttons","direction","offsetYInput","offsetXInput","$85a5f86b715fe7db$var$handleGalleryClick","button","img","alt","matches","textboxSettingsEl","currentTextboxEl","currentTextboxData","textboxToDelete","textboxIdInput","cancelAnimationFrame","galleryItems","errorMessage","capturePhotoComponent","reset","idx","$85a5f86b715fe7db$var$renderAcceptedImageFormats","acceptedMimeTypes","rootEl","extensions","small","browserSupportsTextareaTextNodes","canManipulateViaTextNodes","isSuccess","$442be162a818aed4$export$c37129e465f64ef0","isWebShareSupported","$e179325634270afd$export$30b344bef3e55b67","$e179325634270afd$var$styles","$e179325634270afd$var$template","buttonSlot","buttonEl","getButton","upgradeProperty","handleSlotChange","handleClick","instance","elementName","WebShare","$c290816263f90981$export$cc30a98fe3890794","$02ad8beec419df62$export$7d15b64cf5a3a4c4","lower","upper","$c290816263f90981$var$COMPONENT_NAME","$c290816263f90981$var$styles","$c290816263f90981$var$template","supportedConstraints","stream","canvasElement","outputElement","videoElement","captureButtonSlot","captureButton","facingModeButtonSlot","facingModeButton","trackCapabilities","trackSettings","emptyOutputElement","isValidFacingMode","x","widthInAllowedRange","heightInAllowedRange","panInAllowedRange","applyPTZ","tiltInAllowedRange","zoomInAllowedRange","getCaptureButton","getFacingModeButton","onVideoLoadedMetaData","onCaptureButtonSlotChange","onCapturePhotoButtonClick","onFacingModeButtonSlotChange","onFacingModeButtonClick","constraintName","constraintValue","track","constraints","eventDetail","CapturePhoto","$180b6dcf923bafc7$export$32589115725b904b","$180b6dcf923bafc7$var$template","$180b6dcf923bafc7$var$styles","dialogEl","footerSlotEl","closeSlotEl","pulseAnimationTimeout","headerEl","closeBtnEl","updateCloseLabel","handleDialogClick","handleDialogClose","handleDialogCancel","handleCloseButtonClick","handleFooterSlotChange","handleCloseSlotChange","closeButtonEl","hasTextContent","applyPulseEffectOnDialog","requestCloseEvent","createRequestCloseEvent","footerEl","footerSlotNodes","hasFooterSlotNodes","ModalElement","$862aa3736b0514bc$export$6ccd1735166caad9","$f31161edf38949e9$var$COMMON_MIME_TYPES","$f31161edf38949e9$var$FILES_TO_IGNORE","$f31161edf38949e9$var$toFileWithMimeType","hasExtension","extension","$f31161edf38949e9$var$toFileWithPath","fileWithMimeType","$f31161edf38949e9$var$readEntriesPromise","directoryReader","$f31161edf38949e9$var$readAllDirectoryEntries","$f31161edf38949e9$var$getFileFromFileEntry","fileEntry","$f31161edf38949e9$var$getFilesFromDataTransferItemList","dataTransferItemList","entry","$f31161edf38949e9$var$getFilesFromFileList","fileList","$f31161edf38949e9$export$6d52664cd15c442","$862aa3736b0514bc$var$COMPONENT_NAME","$862aa3736b0514bc$var$TOO_MANY_FILES","$862aa3736b0514bc$var$template","$862aa3736b0514bc$var$styles","fileInput","dropzoneEl","handleFileInputChange","handleDragEnter","handleDragOver","handleDragLeave","handleDrop","handleKeyUp","num","Infinity","handleFilesSelect","filesLength","fileHasValidType","acceptedTypeSpecifiers","acceptedMimeTypesList","fileMimeType","baseMimeType","validType","fileExceedsMaxSize","fileIsSmallerThanMinSize","FilesDropzone"],"version":3,"file":"index.09064714.js.map"} \ No newline at end of file diff --git a/index.4434df8a.js b/index.4434df8a.js new file mode 100644 index 0000000..4e915f1 --- /dev/null +++ b/index.4434df8a.js @@ -0,0 +1,530 @@ +let e,t;function o(e){return e&&e.__esModule?e.default:e}function i(e){if("string"!=typeof e||!e)throw Error("expected a non-empty string, got: "+e)}function n(e){if("number"!=typeof e)throw Error("expected a number, got: "+e)}const a="emoji",r="keyvalue",s="favorites",l="tokens",d="count",c="group-order",u="eTag",h="skinTone",m="readonly",p="readwrite",g="skinUnicodes";function b(e){return function(e,t){let o=new Set,i=[];for(let n of e){let e=t(n);o.has(e)||(o.add(e),i.push(n))}return i}(e,e=>e.unicode)}const f={},v={},y={};function w(e,t,o){o.onerror=()=>t(o.error),o.onblocked=()=>t(Error("IDB blocked")),o.onsuccess=()=>e(o.result)}async function k(e){let t=await new Promise((t,o)=>{let i=indexedDB.open(e,1);f[e]=i,i.onupgradeneeded=e=>{e.oldVersion<1&&function(e){function t(t,o,i){let n=o?e.createObjectStore(t,{keyPath:o}):e.createObjectStore(t);if(i)for(let[e,[t,o]]of Object.entries(i))n.createIndex(e,t,{multiEntry:o});return n}t(r),t(a,"unicode",{[l]:["tokens",!0],[c]:[["group","order"]],[g]:["skinUnicodes",!0]}),t(s,void 0,{[d]:[""]})}(i.result)},w(t,o,i)});return t.onclose=()=>x(e),t}function E(e,t,o,i){return new Promise((n,a)=>{let r;let s=e.transaction(t,o,{durability:"relaxed"});i("string"==typeof t?s.objectStore(t):t.map(e=>s.objectStore(e)),s,e=>{r=e}),s.oncomplete=()=>n(r),s.onerror=()=>a(s.error)})}function x(e){let t=f[e],o=t&&t.result;if(o){o.close();let t=y[e];if(t)for(let e of t)e()}delete f[e],delete v[e],delete y[e]}const S=new Set([":D","XD",":'D","O:)",":X",":P",";P","XP",":L",":Z",":j","8D","XO","8)",":B",":O",":S",":'o","Dx","X(","D:",":C",">0)",":3","!e.match(/\w/)||S.has(e)?e.toLowerCase():e.replace(/[)(:,]/g,"").replace(/’/g,"'").toLowerCase()).filter(Boolean)}function j(e){return e.filter(Boolean).map(e=>e.toLowerCase()).filter(e=>e.length>=2)}function A(e,t,o,i){e[t](o).onsuccess=e=>i&&i(e.target.result)}function T(e,t,o){A(e,"get",t,o)}function z(e,t,o){A(e,"getAll",t,o)}function L(e){e.commit&&e.commit()}function D(e,t){let o=function(e,t){let o=e[0];for(let i=1;it(n)&&(o=n)}return o}(e,e=>e.length),i=[];for(let n of o)e.some(e=>-1===e.findIndex(e=>t(e)===t(n)))||i.push(n);return i}async function $(e){return!await O(e,r,"url")}async function _(e,t,o){let[i,n]=await Promise.all([u,"url"].map(t=>O(e,r,t)));return i===o&&n===t}async function I(e,t){return E(e,a,m,(e,o,i)=>{let n;let a=()=>{e.getAll(n&&IDBKeyRange.lowerBound(n,!0),50).onsuccess=e=>{let o=e.target.result;for(let e of o)if(n=e.unicode,t(e))return i(e);if(o.length<50)return i();a()}};a()})}async function B(e,t,o,i){{let n=t.map(({annotation:e,emoticon:t,group:o,order:i,shortcodes:n,skins:a,tags:r,emoji:s,version:l})=>{let d=[...new Set(j([...(n||[]).map(C).flat(),...(r||[]).map(C).flat(),...C(e),t]))].sort(),c={annotation:e,group:o,order:i,tags:r,tokens:d,unicode:s,version:l};if(t&&(c.emoticon=t),n&&(c.shortcodes=n),a)for(let{tone:e,emoji:t,version:o}of(c.skinTones=[],c.skinUnicodes=[],c.skinVersions=[],a))c.skinTones.push(e),c.skinUnicodes.push(t),c.skinVersions.push(o);return c});await E(e,[a,r],p,([e,t],a)=>{let r,s;let l=0;function d(){2==++l&&function(){if(r!==i||s!==o){for(let t of(e.clear(),n))e.put(t);t.put(i,u),t.put(o,"url"),L(a)}}()}T(t,u,e=>{r=e,d()}),T(t,"url",e=>{s=e,d()})})}}async function R(e,t){return E(e,a,m,(e,o,i)=>{let n=IDBKeyRange.bound([t,0],[t+1,0],!1,!0);z(e.index(c),n,i)})}async function M(e,t){let o=j(C(t));return o.length?E(e,a,m,(e,t,i)=>{let n=[],a=()=>{n.length===o.length&&r()},r=()=>{i(D(n,e=>e.unicode).sort((e,t)=>e.order{n.push(e),a()})}}):[]}async function F(e,t){let o=await M(e,t);return o.length?o.filter(e=>(e.shortcodes||[]).map(e=>e.toLowerCase()).includes(t.toLowerCase()))[0]||null:await I(e,e=>(e.shortcodes||[]).includes(t.toLowerCase()))||null}async function N(e,t){return E(e,a,m,(e,o,i)=>T(e,t,o=>{if(o)return i(o);T(e.index(g),t,e=>i(e||null))}))}function O(e,t,o){return E(e,t,m,(e,t,i)=>T(e,o,i))}const P=["name","url"];function U(e){!function(e){let t=e&&Array.isArray(e),o=t&&e.length&&(!e[0]||P.some(t=>!(t in e[0])));if(!t||o)throw Error("Custom emojis are in the wrong format")}(e);let t=(e,t)=>e.name.toLowerCase(){let i=o;for(let t=0;te[0]{let t=new Set;if(e.shortcodes)for(let o of e.shortcodes)for(let e of C(o))t.add(e);return t}),n=e=>i(e,!0),a=e=>i(e,!1),r=new Map,s=new Map;for(let t of e)for(let e of(s.set(t.name.toLowerCase(),t),t.shortcodes||[]))r.set(e.toLowerCase(),t);return{all:o,search:e=>{let o=C(e);return D(o.map((e,t)=>(te.name).sort(t)},byShortcode:e=>r.get(e.toLowerCase()),byName:e=>s.get(e.toLowerCase())}}const q="undefined"!=typeof wrappedJSObject;function H(e){if(!e)return e;if(q&&(e=structuredClone(e)),delete e.tokens,e.skinTones){let t=e.skinTones.length;e.skins=Array(t);for(let o=0;o!(t in e[0])))throw Error("Emoji data is in the wrong format")}(i),[o,i]}async function K(e){let t=function(e){for(var t=e.length,o=new ArrayBuffer(t),i=new Uint8Array(o),n=-1;++n(this._ready||(this._ready=this._init()),this._ready);await e(),this._db||await e()}async getEmojiByGroup(e){return n(e),await this.ready(),b(await R(this._db,e)).map(H)}async getEmojiBySearchQuery(e){return i(e),await this.ready(),[...this._custom.search(e),...b(await M(this._db,e)).map(H)]}async getEmojiByShortcode(e){return i(e),await this.ready(),this._custom.byShortcode(e)||H(await F(this._db,e))}async getEmojiByUnicodeOrName(e){return i(e),await this.ready(),this._custom.byName(e)||H(await N(this._db,e))}async getPreferredSkinTone(){return await this.ready(),await O(this._db,r,h)||0}async setPreferredSkinTone(e){return n(e),await this.ready(),E(this._db,r,p,(t,o)=>{t.put(e,h),L(o)})}async incrementFavoriteEmojiCount(e){return i(e),await this.ready(),E(this._db,s,p,(t,o)=>T(t,e,i=>{t.put((i||0)+1,e),L(o)}))}async getTopFavoriteEmoji(e){var t,o;return n(e),await this.ready(),(await (t=this._db,o=this._custom,0===e?[]:E(t,[s,a],m,([t,i],n,a)=>{let r=[];t.index(d).openCursor(void 0,"prev").onsuccess=t=>{let n=t.target.result;if(!n)return a(r);function s(t){if(r.push(t),r.length===e)return a(r);n.continue()}let l=n.primaryKey,d=o.byName(l);if(d)return s(d);T(i,l,e=>{if(e)return s(e);n.continue()})}}))).map(H)}set customEmoji(e){this._custom=U(e)}get customEmoji(){return this._custom.all}async _shutdown(){await this.ready();try{await this._lazyUpdate}catch(e){}}_clear(){this._db=this._ready=this._lazyUpdate=void 0}async close(){await this._shutdown(),await x(this._dbName)}async delete(){var e;await this._shutdown(),await (e=this._dbName,new Promise((t,o)=>{x(e),w(t,o,indexedDB.deleteDatabase(e))}))}}const ee=[[-1,"✨","custom"],[0,"\uD83D\uDE00","smileys-emotion"],[1,"\uD83D\uDC4B","people-body"],[3,"\uD83D\uDC31","animals-nature"],[4,"\uD83C\uDF4E","food-drink"],[5,"\uD83C\uDFE0️","travel-places"],[6,"⚽","activities"],[7,"\uD83D\uDCDD","objects"],[8,"⛔️","symbols"],[9,"\uD83C\uDFC1","flags"]].map(([e,t,o])=>({id:e,emoji:t,name:o})),et=ee.slice(1),eo="function"==typeof requestIdleCallback?requestIdleCallback:setTimeout;function ei(e){return e.unicode.includes("‍")}const en={"\uD83E\uDEE8":15.1,"\uD83E\uDEE0":14,"\uD83E\uDD72":13.1,"\uD83E\uDD7B":12.1,"\uD83E\uDD70":11,"\uD83E\uDD29":5,"\uD83D\uDC71‍♀️":4,"\uD83E\uDD23":3,"\uD83D\uDC41️‍\uD83D\uDDE8️":2,"\uD83D\uDE00":1,"\uD83D\uDE10️":.7,"\uD83D\uDE03":.6},ea=["\uD83D\uDE0A","\uD83D\uDE12","❤️","\uD83D\uDC4D️","\uD83D\uDE0D","\uD83D\uDE02","\uD83D\uDE2D","☺️","\uD83D\uDE14","\uD83D\uDE29","\uD83D\uDE0F","\uD83D\uDC95","\uD83D\uDE4C","\uD83D\uDE18"],er='"Twemoji Mozilla","Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji","EmojiOne Color","Android Emoji",sans-serif',es=(e,t)=>et?1:0,el=(e,t)=>{let o=document.createElement("canvas");o.width=o.height=1;let i=o.getContext("2d",{willReadFrequently:!0});return i.textBaseline="top",i.font=`100px ${er}`,i.fillStyle=t,i.scale(.01,.01),i.fillText(e,0,0),i.getImageData(0,0,1,1).data},ed=(e,t)=>{let o=[...e].join(",");return o===[...t].join(",")&&!o.startsWith("0,0,0,")},ec=()=>(e||(e=new Promise(e=>eo(()=>e(function(){let e=Object.entries(en);try{for(let[t,o]of e)if(function(e){let t=el(e,"#000"),o=el(e,"#fff");return t&&o&&ed(t,o)}(t))return o}catch(e){}finally{}return e[0][1]}())))),e),eu=new Map;function eh(e){e.preventDefault(),e.stopPropagation()}function em(e,t,o){return(t+=e?-1:1)<0?t=o.length-1:t>=o.length&&(t=0),t}function ep(e,t){let o=new Set,i=[];for(let n of e){let e=t(n);o.has(e)||(o.add(e),i.push(n))}return i}const eg=requestAnimationFrame;let eb="function"==typeof ResizeObserver;function ef(e){{let t=document.createRange();return t.selectNode(e.firstChild),t.getBoundingClientRect().width}}function ev(e,t,o){let i=e.get(t);return i||(i=o(),e.set(t,i)),i}const ey=new WeakMap,ew=new WeakMap,ek=Symbol("un-keyed"),eE="replaceChildren"in Element.prototype;function ex(e,t,o){for(let i=0;iPromise.resolve().then(e);function eC(e,t,o){if(e.length!==t.length)return!1;for(let i=0;i{if(i)return;let e=[...a];a.clear();try{for(let t of e)t()}finally{o=!1,a.size&&(o=!0,eS(r))}},s=new Proxy({},{get(e,o){if(t){let e=n.get(o);e||(e=new Set,n.set(o,e)),e.add(t)}return e[o]},set(e,t,i){if(e[t]!==i){e[t]=i;let s=n.get(t);if(s){for(let e of s)a.add(e);o||(o=!0,eS(r))}}return!0}});return e.addEventListener("abort",()=>{i=!0}),{state:s,createEffect:e=>{let o=()=>{let i=t;t=o;try{return e()}finally{t=i}};return o()}}}(a),l=new Map;eT(r,{skinToneEmoji:void 0,i18n:void 0,database:void 0,customEmoji:void 0,customCategorySorting:void 0,emojiVersion:void 0}),eT(r,o),eT(r,{initialLoad:!0,currentEmojis:[],currentEmojisWithCategories:[],rawSearchText:"",searchText:"",searchMode:!1,activeSearchItem:-1,message:void 0,skinTonePickerExpanded:!1,skinTonePickerExpandedAfterAnimation:!1,currentSkinTone:0,activeSkinTone:0,skinToneButtonText:void 0,pickerStyle:void 0,skinToneButtonLabel:"",skinTones:[],currentFavorites:[],defaultFavoriteEmojis:void 0,numColumns:8,isRtl:!1,currentGroupIndex:0,groups:et,databaseLoaded:!1,activeSearchItemId:void 0}),s(()=>{r.currentGroup!==r.groups[r.currentGroupIndex]&&(r.currentGroup=r.groups[r.currentGroupIndex])});let d=t=>{e.getElementById(t).focus()},c=t=>e.getElementById(`emo-${t.id}`),u=(e,t)=>{i.rootElement.dispatchEvent(new CustomEvent(e,{detail:t,bubbles:!0,composed:!0}))},h=(e,t)=>e.id===t.id,m=(e,t)=>{let{category:o,emojis:i}=e,{category:n,emojis:a}=t;return o===n&&eC(i,a,h)},p=e=>{eC(r.currentEmojis,e,h)||(r.currentEmojis=e)},g=e=>{r.searchMode!==e&&(r.searchMode=e)},b=e=>{eC(r.currentEmojisWithCategories,e,m)||(r.currentEmojisWithCategories=e)},f=(e,t)=>t&&e.skins&&e.skins[t]||e.unicode,v={labelWithSkin:(e,t)=>ep([e.name||f(e,t),e.annotation,...e.shortcodes||eA].filter(Boolean),e=>e).join(", "),titleForEmoji:e=>e.annotation||(e.shortcodes||eA).join(", "),unicodeWithSkin:f},y={onClickSkinToneButton:function(e){r.skinTonePickerExpanded=!r.skinTonePickerExpanded,r.activeSkinTone=r.currentSkinTone,r.skinTonePickerExpanded&&(eh(e),eg(()=>d("skintone-list")))},onEmojiClick:L,onNavClick:function(e){let{target:t}=e,o=t.closest(".nav-button");if(!o)return;let n=parseInt(o.dataset.groupId,10);i.searchElement.value="",r.rawSearchText="",r.searchText="",r.activeSearchItem=-1,r.currentGroupIndex=r.groups.findIndex(e=>e.id===n)},onNavKeydown:function(e){let{target:t,key:o}=e,i=t=>{t&&(eh(e),t.focus())};switch(o){case"ArrowLeft":return i(t.previousElementSibling);case"ArrowRight":return i(t.nextElementSibling);case"Home":return i(t.parentElement.firstElementChild);case"End":return i(t.parentElement.lastElementChild)}},onSearchKeydown:function(e){if(!r.searchMode||!r.currentEmojis.length)return;let t=t=>{eh(e),r.activeSearchItem=em(t,r.activeSearchItem,r.currentEmojis)};switch(e.key){case"ArrowDown":return t(!1);case"ArrowUp":return t(!0);case"Enter":if(-1!==r.activeSearchItem)return eh(e),z(r.currentEmojis[r.activeSearchItem].id);r.activeSearchItem=0}},onSkinToneOptionsClick:function(e){let{target:{id:t}}=e,o=t&&t.match(/^skintone-(\d)/);o&&(eh(e),D(parseInt(o[1],10)))},onSkinToneOptionsFocusOut:$,onSkinToneOptionsKeydown:function(e){if(!r.skinTonePickerExpanded)return;let t=async t=>{eh(e),r.activeSkinTone=t};switch(e.key){case"ArrowUp":return t(em(!0,r.activeSkinTone,r.skinTones));case"ArrowDown":return t(em(!1,r.activeSkinTone,r.skinTones));case"Home":return t(0);case"End":return t(r.skinTones.length-1);case"Enter":return eh(e),D(r.activeSkinTone);case"Escape":return eh(e),r.skinTonePickerExpanded=!1,d("skintone-button")}},onSkinToneOptionsKeyup:function(e){if(r.skinTonePickerExpanded&&" "===e.key)return eh(e),D(r.activeSkinTone)},onSearchInput:function(e){r.rawSearchText=e.target.value}},w={calculateEmojiGridStyle:function(e){var t;let o;t=()=>{{let e=getComputedStyle(i.rootElement),t=parseInt(e.getPropertyValue("--num-columns"),10),o="rtl"===e.getPropertyValue("direction");r.numColumns=t,r.isRtl=o}},eb?(o=new ResizeObserver(t)).observe(e):eg(t),a.addEventListener("abort",()=>{o&&o.disconnect()})},updateOnIntersection:function(e){!function(e,t,o){{let i=e.closest(".tabpanel"),n=ej.get(i);n||(n=new IntersectionObserver(o,{root:i,rootMargin:"50% 0px 50% 0px",threshold:0}),ej.set(i,n),t.addEventListener("abort",()=>{n.disconnect()})),n.observe(e)}}(e,a,e=>{for(let{target:t,isIntersecting:o}of e)t.classList.toggle("onscreen",o)})}},k=!0;function E(){let{customEmoji:e,database:t}=r,o=e||eA;t.customEmoji!==o&&(t.customEmoji=o)}s(()=>{(function(e,t,o,i,n,a,r,s,l){let{labelWithSkin:d,titleForEmoji:c,unicodeWithSkin:u}=o,{html:h,map:m}=function(e){let t=ev(ew,e,()=>new Map),o=ek;return{map:function(e,t,i){return e.map((e,n)=>{let a=o;o=i(e);try{return t(e,n)}finally{o=a}})},html:function(e,...i){let n=ev(t,e,()=>new Map);return ev(n,o,()=>(function(e){let{template:t,elementsToBindings:o}=ev(ey,e,()=>(function(e){let t="",o=!1,i=!1,n=-1,a=new Map,r=[];for(let s=0,l=e.length;s":o=!1,i=!1;break;case"=":i=!0}let m=ev(a,r[r.length-1],()=>[]);if(i){let t=/(\S+)="?([^"=]*)$/.exec(h);d=t[1],c=t[2],u=/^[^">]*/.exec(e[s+1])[0]}let p={attributeName:d,attributeValuePre:c,attributeValuePost:u,expressionIndex:s};m.push(p),o||i||(t+=" ")}return{template:function(e){let t=document.createElement("template");return t.innerHTML=e,t}(t),elementsToBindings:a}})(e)),i=t.cloneNode(!0).content.firstElementChild,n=function(e,t){let o;let i=[];if(1===t.size&&(o=t.get(0)))ex(o,e,i);else{let o=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),n=e,a=-1;do{let e=t.get(++a);e&&ex(e,n,i)}while(n=o.nextNode())}return i}(i,o);return function(e){return function(e,t){for(let o of t){let{targetNode:t,currentExpression:i,binding:{expressionIndex:n,attributeName:a,attributeValuePre:r,attributeValuePost:s}}=o,l=e[n];if(i!==l){if(o.currentExpression=l,a)t.setAttribute(a,r+""+l+s);else{let e;Array.isArray(l)?function(e,t){let{targetNode:o}=t,{targetParentNode:i}=t,n=!1;if(i?n=function(e,t){let o=e.firstChild,i=0;for(;o;){if(t[i]!==o)return!0;o=o.nextSibling,i++}return i!==t.length}(i,e):(n=!0,t.targetNode=void 0,t.targetParentNode=i=o.parentNode),n){var a;a=i,eE?a.replaceChildren(...e):(a.innerHTML="",a.append(...e))}}(l,o):l instanceof Element?(e=l,t.replaceWith(e)):t.nodeValue=""+l,e&&(o.targetNode=e)}}}}(e,n),i}})(e))(i)}}}(t);function p(e,o,i){return m(e,(e,n)=>h``,e=>`${i}-${e.id}`)}let g=h`
${t.i18n.searchDescription}
${t.i18n.skinToneDescription}
${m(t.skinTones,(e,o)=>h`
${e}
`,e=>e)}
${m(t.currentEmojisWithCategories,(e,o)=>h`
${p(e.emojis,t.searchMode,"emo")}
`,e=>e.category)}
`,b=(t,o)=>{for(let i of e.querySelectorAll(`[${t}]`))o(i,i.getAttribute(t))};if(l){for(let t of(e.appendChild(g),["click","focusout","input","keydown","keyup"]))b(`data-on-${t}`,(e,o)=>{e.addEventListener(t,i[o])});b("data-ref",(e,t)=>{a[t]=e}),r.addEventListener("abort",()=>{e.removeChild(g)})}b("data-action",(e,t)=>{let o=s.get(t);o||s.set(t,o=new WeakSet),o.has(e)||(o.add(e),n[t](e))})})(e,r,v,y,w,i,a,l,k),k=!1}),r.emojiVersion||ec().then(e=>{e||(r.message=r.i18n.emojiUnsupportedMessage)}),s(()=>{async function e(){let e=!1,t=setTimeout(()=>{e=!0,r.message=r.i18n.loadingMessage},1e3);try{await r.database.ready(),r.databaseLoaded=!0}catch(e){console.error(e),r.message=r.i18n.networkErrorMessage}finally{clearTimeout(t),e&&(e=!1,r.message="")}}r.database&&e()}),s(()=>{r.pickerStyle=` + --num-groups: ${r.groups.length}; + --indicator-opacity: ${r.searchMode?0:1}; + --num-skintones: 6;`}),s(()=>{r.customEmoji&&r.database&&E()}),s(()=>{r.customEmoji&&r.customEmoji.length?r.groups!==ee&&(r.groups=ee):r.groups!==et&&(r.currentGroupIndex&&r.currentGroupIndex--,r.groups=et)}),s(()=>{(async function(){r.databaseLoaded&&(r.currentSkinTone=await r.database.getPreferredSkinTone())})()}),s(()=>{r.skinTones=Array(6).fill().map((e,t)=>(function(e,t){if(0===t)return e;let o=e.indexOf("‍");return -1!==o?e.substring(0,o)+String.fromCodePoint(127995+t-1)+e.substring(o):(e.endsWith("️")&&(e=e.substring(0,e.length-1)),e+"\ud83c"+String.fromCodePoint(57339+t-1))})(r.skinToneEmoji,t))}),s(()=>{r.skinToneButtonText=r.skinTones[r.currentSkinTone]}),s(()=>{r.skinToneButtonLabel=r.i18n.skinToneLabel.replace("{skinTone}",r.i18n.skinTones[r.currentSkinTone])}),s(()=>{async function e(){let{database:e}=r,t=(await Promise.all(ea.map(t=>e.getEmojiByUnicodeOrName(t)))).filter(Boolean);r.defaultFavoriteEmojis=t}r.databaseLoaded&&e()}),s(()=>{async function e(){E();let{database:e,defaultFavoriteEmojis:t,numColumns:o}=r,i=await e.getTopFavoriteEmoji(o),n=await j(ep([...i,...t],e=>e.unicode||e.name).slice(0,o));r.currentFavorites=n}r.databaseLoaded&&r.defaultFavoriteEmojis&&e()}),s(()=>{!async function(){let{searchText:e,currentGroup:t,databaseLoaded:o,customEmoji:i}=r;if(o){if(e.length>=2){let t=await T(e);r.searchText===e&&(p(t),g(!0))}else{let{id:e}=t;if(-1!==e||i&&i.length){let t=await A(e);r.currentGroup.id===e&&(p(t),g(!1))}}}else r.currentEmojis=[],r.searchMode=!1}()});let x=()=>{eg(()=>{var e;(e=i.tabpanelElement)&&(e.scrollTop=0)})};function S(e){return!e.unicode||!ei(e)||eu.get(e.unicode)}async function C(e){let t=r.emojiVersion||await ec();return e.filter(({version:e})=>!e||e<=t)}async function j(e){return function(e,t){let o=e=>{let o={};for(let i of e)"number"==typeof i.tone&&i.version<=t&&(o[i.tone]=i.unicode);return o};return e.map(({unicode:e,skins:t,shortcodes:i,url:n,name:a,category:r,annotation:s})=>({unicode:e,name:a,shortcodes:i,url:n,category:r,annotation:s,id:e||a,skins:t&&o(t)}))}(e,r.emojiVersion||await ec())}async function A(e){let t=-1===e?r.customEmoji:await r.database.getEmojiByGroup(e);return j(await C(t))}async function T(e){return j(await C(await r.database.getEmojiBySearchQuery(e)))}async function z(e){let t=await r.database.getEmojiByUnicodeOrName(e),o=[...r.currentEmojis,...r.currentFavorites].find(t=>t.id===e),i=o.unicode&&f(o,r.currentSkinTone);await r.database.incrementFavoriteEmojiCount(e),u("emoji-click",{emoji:t,skinTone:r.currentSkinTone,...i&&{unicode:i},...o.name&&{name:o.name}})}async function L(e){let{target:t}=e;t.classList.contains("emoji")&&(eh(e),z(t.id.substring(4)))}function D(e){r.currentSkinTone=e,r.skinTonePickerExpanded=!1,d("skintone-button"),u("skin-tone-change",{skinTone:e}),r.database.setPreferredSkinTone(e)}async function $(e){let{relatedTarget:t}=e;t&&"skintone-list"===t.id||(r.skinTonePickerExpanded=!1)}return s(()=>{let{currentEmojis:e,emojiVersion:o}=r,n=e.filter(e=>e.unicode).filter(e=>ei(e)&&!eu.has(e.unicode));!o&&n.length?(p(e),eg(()=>{(function(e,o,i){let n=!0;for(let a of e){let e=ef(i(a));void 0===t&&(t=ef(o));let r=e/1.8{}),s(()=>{b(function(){let{searchMode:e,currentEmojis:t}=r;if(e)return[{category:"",emojis:t}];let o=new Map;for(let e of t){let t=e.category||"",i=o.get(t);i||(i=[],o.set(t,i)),i.push(e)}return[...o.entries()].map(([e,t])=>({category:e,emojis:t})).sort((e,t)=>r.customCategorySorting(e.category,t.category))}())}),s(()=>{r.activeSearchItemId=-1!==r.activeSearchItem&&r.currentEmojis[r.activeSearchItem].id}),s(()=>{let{rawSearchText:e}=r;eo(()=>{r.searchText=(e||"").trim(),r.activeSearchItem=-1})}),s(()=>{r.skinTonePickerExpanded?i.skinToneDropdown.addEventListener("transitionend",()=>{r.skinTonePickerExpandedAfterAnimation=!0},{once:!0}):r.skinTonePickerExpandedAfterAnimation=!1}),{$set(e){eT(r,e)},$destroy(){n.abort()}}}(this.shadowRoot,this._ctx))}disconnectedCallback(){eS(()=>{if(!this.isConnected&&this._cmp){this._cmp.$destroy(),this._cmp=void 0;let{database:e}=this._ctx;e.close().catch(e=>console.error(e))}})}static get observedAttributes(){return["locale","data-source","skin-tone-emoji","emoji-version"]}attributeChangedCallback(e,t,o){this._set(e.replace(/-([a-z])/g,(e,t)=>t.toUpperCase()),"emoji-version"===e?parseFloat(o):o)}_set(e,t){this._ctx[e]=t,this._cmp&&this._cmp.$set({[e]:t}),["locale","dataSource"].includes(e)&&this._dbFlush()}_dbCreate(){let{locale:e,dataSource:t,database:o}=this._ctx;o&&o.locale===e&&o.dataSource===t||this._set("database",new Z({locale:e,dataSource:t}))}_dbFlush(){eS(()=>this._dbCreate())}}const eI={};for(const e of eD)eI[e]={get(){return"database"===e&&this._dbCreate(),this._ctx[e]},set(t){if("database"===e)throw Error("database is read-only");this._set(e,t)}};function eB(e){if("TEXTAREA"!==e.nodeName)return!1;if(void 0===ez){var t=document.createElement("textarea");t.value=1,ez=!!t.firstChild}return ez}Object.defineProperties(e_.prototype,eI),customElements.get("emoji-picker")||customElements.define("emoji-picker",e_);var eR=function(e,t){if(e.focus(),document.selection){var o=document.selection.createRange();o.text=t,o.collapse(!1),o.select();return}if(!document.execCommand("insertText",!1,t)){var i=e.selectionStart,n=e.selectionEnd;if("function"==typeof e.setRangeText)e.setRangeText(t);else{var a=document.createRange(),r=document.createTextNode(t);if(eB(e)){var s=e.firstChild;if(s){for(var l=0,d=null,c=null;s&&(null===d||null===c);){var u=s.nodeValue.length;i>=l&&i<=l+u&&a.setStart(d=s,i-l),n>=l&&n<=l+u&&a.setEnd(c=s,n-l),l+=u,s=s.nextSibling}i!==n&&a.deleteContents()}else e.appendChild(r)}if(eB(e)&&"#text"===a.commonAncestorContainer.nodeName)a.insertNode(r);else{var h=e.value;e.value=h.slice(0,i)+t+h.slice(n)}}e.setSelectionRange(i+t.length,i+t.length);var m=document.createEvent("UIEvent");m.initEvent("input",!0,!1),e.dispatchEvent(m)}},eM=(e,t,o)=>(Number.isNaN(t)&&(t=0),Number.isNaN(o)&&(o=0),Math.min(Math.max(e,Math.min(t,o)),Math.max(t,o))),eF="capture-photo",eN=` + :host { display: block; box-sizing: border-box; } + :host *, :host *::before, :host *::after { box-sizing: inherit;} + :host([hidden]), [hidden], ::slotted([hidden]) { display: none; } + video { display: block; } + #output:empty { display: none; } +`,eO=document.createElement("template");eO.innerHTML=` + + + +
+ + + + +
+ +
+`;var eP=class e extends HTMLElement{#e={};#t=null;#o=null;#i=null;#n=null;#a=null;#r=null;constructor(){super(),this.#e=this.getSupportedConstraints(),this.shadowRoot||this.attachShadow({mode:"open"}).appendChild(eO.content.cloneNode(!0))}static get observedAttributes(){return["no-image","pan","tilt","zoom","torch"]}attributeChangedCallback(e,t,o){if(!this.isConnected)return;let i=this.getTrackCapabilities();if("no-image"===e&&t!==o&&this.#s(),"pan"===e&&t!==o&&"pan"in this.#e){let e=!!("pan"in i&&i.pan?.min&&i.pan?.max)&&this.pan>=i.pan.min&&this.pan<=i.pan.max;"number"==typeof this.pan&&e&&this.#l("pan",this.pan)}if("tilt"===e&&t!==o&&"tilt"in this.#e){let e=!!("tilt"in i&&i.tilt?.min&&i.tilt?.max)&&this.tilt>=i.tilt.min&&this.tilt<=i.tilt.max;"number"==typeof this.tilt&&e&&this.#l("tilt",this.tilt)}if("zoom"===e&&t!==o&&"zoom"in this.#e){let e=!!("zoom"in i&&i.zoom?.min&&i.zoom?.max)&&this.zoom>=i.zoom.min&&this.zoom<=i.zoom.max;"number"==typeof this.zoom&&e&&this.#l("zoom",this.zoom)}"torch"===e&&t!==o&&"torch"in this.#e&&this.#l("torch",this.torch)}async connectedCallback(){if(this.#d("autoPlay"),this.#d("noImage"),this.#d("facingMode"),this.#d("cameraResolution"),this.#d("pan"),this.#d("tilt"),this.#d("zoom"),this.#d("torch"),this.#d("calculateFileSize"),this.#o=this.shadowRoot?.querySelector("canvas")||null,this.#i=this.shadowRoot?.getElementById("output")||null,this.#n=this.shadowRoot?.querySelector("video")||null,this.#a=this.shadowRoot?.querySelector('slot[name="capture-button"]')||null,this.#r=this.#c(),this.#n?.addEventListener("loadedmetadata",this.#u),this.#a?.addEventListener("slotchange",this.#h),this.#r?.addEventListener("click",this.#m),!e.isSupported())return this.dispatchEvent(new CustomEvent(`${eF}:error`,{bubbles:!0,composed:!0,detail:{error:{name:"NotSupportedError",message:"Not supported"}}}));this.autoPlay&&this.startVideoStream()}disconnectedCallback(){this.stopVideoStream(),this.#r?.removeEventListener("click",this.#m),this.#n?.removeEventListener("loadedmetadata",this.#u),this.#a?.removeEventListener("slotchange",this.#h)}get autoPlay(){return this.hasAttribute("auto-play")}set autoPlay(e){this.toggleAttribute("auto-play",!!e)}get noImage(){return this.hasAttribute("no-image")}set noImage(e){this.toggleAttribute("no-image",!!e)}get facingMode(){let e=this.getAttribute("facing-mode");return"user"!==e?"environment":e}set facingMode(e){this.setAttribute("facing-mode",e)}get cameraResolution(){return this.getAttribute("camera-resolution")||""}set cameraResolution(e){this.setAttribute("camera-resolution",e)}get pan(){return Number(this.getAttribute("pan"))||0}set pan(e){this.setAttribute("pan",null!=e?e.toString():e)}get tilt(){return Number(this.getAttribute("tilt"))||0}set tilt(e){this.setAttribute("tilt",null!=e?e.toString():e)}get zoom(){return Number(this.getAttribute("zoom"))||1}set zoom(e){this.setAttribute("zoom",null!=e?e.toString():e)}get torch(){return this.hasAttribute("torch")}set torch(e){this.toggleAttribute("torch",!!e)}get calculateFileSize(){return this.hasAttribute("calculate-file-size")}set calculateFileSize(e){this.toggleAttribute("calculate-file-size",!!e)}get loading(){return this.hasAttribute("loading")}#m=e=>{e.preventDefault(),this.capture()};#u=e=>{let t=e.target;t.play().then(()=>{this.dispatchEvent(new CustomEvent(`${eF}:video-play`,{bubbles:!0,composed:!0,detail:{video:t}}))}).catch(e=>{this.dispatchEvent(new CustomEvent(`${eF}:error`,{bubbles:!0,composed:!0,detail:{error:e}}))}).finally(()=>{this.removeAttribute("loading")})};#s(){this.#i&&this.#i.replaceChildren()}#l(e,t){if(!this.#t)return;let[o]=this.#t.getVideoTracks(),i=this.getTrackCapabilities(),n=this.getTrackSettings(),a="pan"===e||"tilt"===e||"zoom"===e?eM(Number(t),i[e]?.min||1,i[e]?.max||1):t;e in n&&o.applyConstraints({advanced:[{[e]:a}]}).catch(()=>{})}#h=e=>{e.target?.name==="capture-button"&&(this.#r?.removeEventListener("click",this.#m),this.#r=this.#c(),this.#r&&(this.#r.addEventListener("click",this.#m),"BUTTON"===this.#r.nodeName||this.#r.hasAttribute("role")||this.#r.setAttribute("role","button")))};#c(){return this.#a&&this.#a.assignedElements({flatten:!0}).find(e=>"BUTTON"===e.nodeName||"capture-button"===e.getAttribute("slot"))||null}#d(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}async startVideoStream(t){if(!e.isSupported()||this.#t)return;this.setAttribute("loading","");let o={video:{facingMode:{ideal:this.facingMode},pan:!0,tilt:!0,zoom:!0,torch:this.torch},audio:!1};if("string"==typeof t&&t.trim().length>0&&(o.video.deviceId={exact:t}),"string"==typeof this.cameraResolution&&this.cameraResolution.trim().length>0){let[e=0,t=0]=this.cameraResolution.split("x").map(e=>Number(e));e>0&&t>0&&(o.video.width=e,o.video.height=t)}try{this.#t=await navigator.mediaDevices.getUserMedia(o),this.#n&&(this.#n.srcObject=this.#t),this.#l("pan",this.pan),this.#l("tilt",this.tilt),this.#l("zoom",this.zoom)}catch(e){this.dispatchEvent(new CustomEvent(`${eF}:error`,{bubbles:!0,composed:!0,detail:{error:e}}))}finally{this.removeAttribute("loading")}}restartVideoStream(e){this.#t&&this.#n&&this.stopVideoStream(),this.startVideoStream(e)}stopVideoStream(){if(!this.#n||!this.#t)return;let[e]=this.#t.getVideoTracks();e?.stop(),this.#n.srcObject=null,this.#t=null}async capture(){if(!(this.loading||!this.#o||!this.#n))try{let e=this.#o.getContext("2d"),t=this.#n.videoWidth,o=this.#n.videoHeight;this.#o.width=t,this.#o.height=o,e?.drawImage(this.#n,0,0,t,o);let i=this.#o.toDataURL("image/png");if("string"==typeof i&&i.includes("data:image")){if(!this.noImage){let e=new Image;e.src=i,e.width=t,e.height=o,e.alt="Captured photo",e.setAttribute("part","output-image"),this.#s(),this.#i?.appendChild(e)}let e={dataURI:i,width:t,height:o};if(this.calculateFileSize)try{let t=(await (await fetch(i)).blob()).size;t&&(e.size=t)}catch{}this.dispatchEvent(new CustomEvent(`${eF}:success`,{bubbles:!0,composed:!0,detail:e}))}}catch(e){this.dispatchEvent(new CustomEvent(`${eF}:error`,{bubbles:!0,composed:!0,detail:{error:e}}))}}getSupportedConstraints(){return e.isSupported()&&navigator.mediaDevices.getSupportedConstraints()||{}}getTrackCapabilities(){if(!this.#t)return{};let[e]=this.#t.getVideoTracks();return e&&"function"==typeof e.getCapabilities&&e.getCapabilities()||{}}getTrackSettings(){if(!this.#t)return{};let[e]=this.#t.getVideoTracks();return e&&"function"==typeof e.getSettings&&e.getSettings()||{}}static async getVideoInputDevices(){return navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices?(await navigator.mediaDevices.enumerateDevices()||[]).filter(e=>"videoinput"===e.kind&&!!e.deviceId):[]}static isSupported(){return!!navigator.mediaDevices?.getUserMedia}static defineCustomElement(t=eF){"u">typeof window&&!window.customElements.get(t)&&window.customElements.define(t,e)}};/*! + * @georapbox/web-share-element + * A custom element that implements the Web Share API to share user-defined data. + * + * @version 3.1.1 + * @homepage https://github.com/georapbox/web-share-element#readme + * @author George Raptis + * @license MIT + */function eU(e){return null!==e&&"object"==typeof e?"share"in navigator&&"canShare"in navigator&&navigator.canShare(e):"share"in navigator}eP.defineCustomElement();/*! + * @georapbox/web-share-element + * A custom element that implements the Web Share API to share user-defined data. + * + * @version 3.1.1 + * @homepage https://github.com/georapbox/web-share-element#readme + * @author George Raptis + * @license MIT + */var eq=` + :host { + display: inline-block; + } +`,eH=document.createElement("template");eH.innerHTML=` + + +`,(class e extends HTMLElement{#n;#t;#a=[];constructor(){super(),this.shadowRoot||this.attachShadow({mode:"open",delegatesFocus:!0}).appendChild(eH.content.cloneNode(!0)),this.#n=this.shadowRoot?.querySelector('slot[name="button"]')||null,this.#t=this.#i()}static get observedAttributes(){return["disabled"]}attributeChangedCallback(e,t,o){"disabled"===e&&t!==o&&this.#t&&(this.#t.toggleAttribute("disabled",this.disabled),this.#t.setAttribute("aria-disabled",this.disabled.toString()),this.#t.part&&this.#t.part.contains("button")&&this.#t.part.toggle("button--disabled",this.disabled))}connectedCallback(){this.#d("shareUrl"),this.#d("shareTitle"),this.#d("shareText"),this.#d("shareFiles"),this.#d("disabled"),this.#n?.addEventListener("slotchange",this.#e),this.#t?.addEventListener("click",this.#r)}disconnectedCallback(){this.#n?.removeEventListener("slotchange",this.#e),this.#t?.removeEventListener("click",this.#r)}get disabled(){return this.hasAttribute("disabled")}set disabled(e){this.toggleAttribute("disabled",!!e)}get shareUrl(){return this.getAttribute("share-url")||""}set shareUrl(e){this.setAttribute("share-url",e)}get shareTitle(){return this.getAttribute("share-title")||""}set shareTitle(e){this.setAttribute("share-title",e)}get shareText(){return this.getAttribute("share-text")||""}set shareText(e){this.setAttribute("share-text",e)}get shareFiles(){return this.#a}set shareFiles(e){Array.isArray(e)&&e.length>0&&(this.#a=e)}async share(){if(!this.disabled)try{let e={};this.shareUrl&&(e.url=this.shareUrl),this.shareTitle&&(e.title=this.shareTitle),this.shareText&&(e.text=this.shareText),Array.isArray(this.shareFiles)&&this.shareFiles.length>0&&navigator.canShare&&navigator.canShare({files:this.shareFiles})&&(e.files=this.shareFiles),await navigator.share(e),this.dispatchEvent(new CustomEvent("web-share:success",{bubbles:!0,composed:!0,detail:{shareData:e}}))}catch(e){if(e instanceof Error&&"AbortError"===e.name){this.dispatchEvent(new CustomEvent("web-share:abort",{bubbles:!0,composed:!0,detail:{error:e}}));return}this.dispatchEvent(new CustomEvent("web-share:error",{bubbles:!0,composed:!0,detail:{error:e}}))}}#r=e=>{e.preventDefault(),this.disabled||this.share()};#e=e=>{e.target&&"button"===e.target.name&&(this.#t?.removeEventListener("click",this.#r),this.#t=this.#i(),this.#t&&(this.#t.addEventListener("click",this.#r),"BUTTON"===this.#t.nodeName||this.#t.hasAttribute("role")||this.#t.setAttribute("role","button")))};#i(){return this.#n&&this.#n.assignedElements({flatten:!0}).find(e=>"BUTTON"===e.nodeName||"button"===e.getAttribute("slot"))||null}#d(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}static defineCustomElement(t="web-share"){"u">typeof window&&!window.customElements.get(t)&&window.customElements.define(t,e)}}).defineCustomElement();/*! + * @georapbox/modal-element + * A custom element to create a modal, using the native dialog element under the hood. + * + * @version 1.8.0 + * @homepage https://github.com/georapbox/modal-element#readme + * @author George Raptis + * @license MIT + */var eV=document.createElement("template"),eW=` + :host { + --me-width: 32rem; + --me-height: fit-content; + --me-border-color: initial; + --me-border-style: solid; + --me-border-width: initial; + --me-border-radius: 0; + --me-box-shadow: none; + --me-background-color: canvas; + --me-color: canvastext; + + --me-header-spacing: 1rem; + --me-footer-spacing: 1rem; + --me-header-background-color: transparent; + --me-header-color: initial; + + --me-body-spacing: 1rem; + --me-body-background-color: transparent; + --me-body-color: initial; + --me-footer-background-color: transparent; + --me-footer-color: initial; + + --me-close-padding: 0.4375rem; + --me-close-border: none; + --me-close-border-radius: 0; + --me-close-background-color: transparent; + --me-close-color: inherit; + --me-close-font-size: 1rem; + + --me-backdrop-background: rgba(0, 0, 0, 0.5); + --me-backdrop-filter: none; + + display: contents; + box-sizing: border-box; + } + + :host *, + :host *:after, + :host *:before { + box-sizing: inherit; + } + + :host([hidden]), + [hidden] { + display: none !important; + } + + /* Dialog */ + .dialog { + --dialog-placement-margin: calc((2em + 6px) / 2); + + width: var(--me-width); + height: var(--me-height); + padding: 0; + border-color: var(--me-border-color); + border-style: var(--me-border-style); + border-width: var(--me-border-width); + border-radius: var(--me-border-radius); + box-shadow: var(--me-box-shadow); + background-color: var(--me-background-color); + color: var(--me-color); + } + + .dialog[open] { + display: flex; + } + + :host([fullscreen]) .dialog { + max-width: 100%; + max-height: 100%; + width: 100%; + height: 100%; + } + + .dialog::backdrop { + background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5)); + backdrop-filter: var(--me-backdrop-filter, none); + opacity: 0; + } + + .dialog[open]::backdrop { + opacity: 1; + } + + /* Dialog placement */ + :host(:not([fullscreen])[placement="top-start"]) .dialog { + margin-block-start: var(--dialog-placement-margin); + margin-inline-start: var(--dialog-placement-margin); + } + + :host(:not([fullscreen])[placement="top-center"]) .dialog { + margin-block-start: var(--dialog-placement-margin); + } + + :host(:not([fullscreen])[placement="top-end"]) .dialog { + margin-block-start: var(--dialog-placement-margin); + margin-inline-end: var(--dialog-placement-margin); + } + + :host(:not([fullscreen])[placement="center-start"]) .dialog { + margin-inline-start: var(--dialog-placement-margin); + } + + :host(:not([fullscreen])[placement="center"]) .dialog { + margin: auto; + } + + :host(:not([fullscreen])[placement="center-end"]) .dialog { + margin-inline-end: var(--dialog-placement-margin); + } + + :host(:not([fullscreen])[placement="bottom-start"]) .dialog { + margin-block-end: var(--dialog-placement-margin); + margin-inline-start: var(--dialog-placement-margin); + } + + :host(:not([fullscreen])[placement="bottom-center"]) .dialog { + margin-block-end: var(--dialog-placement-margin); + } + + :host(:not([fullscreen])[placement="bottom-end"]) .dialog { + margin-block-end: var(--dialog-placement-margin); + margin-inline-end: var(--dialog-placement-margin); + } + + /* Dialog animations */ + @media (prefers-reduced-motion: no-preference) { + .dialog:not(.dialog--no-animations), + .dialog:not(.dialog--no-animations)::backdrop { + transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete; + } + + /* 1. IS-OPEN STATE */ + .dialog[open] { + transform: scale(1); + opacity: 1; + } + + /* 2. EXIT STATE */ + .dialog { + transform: scale(0.95); + opacity: 0; + } + + /* 0. BEFORE-OPEN STATE */ + @starting-style { + .dialog[open] { + transform: scale(0.95); + opacity: 0; + } + + .dialog[open]::backdrop { + opacity: 0; + } + } + + .dialog--pulse:not(.dialog--no-animations) { + animation-name: pulse; + animation-duration: 300ms; + animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9); + } + + @keyframes pulse { + 0% { transform: scale(1); } + 50% { transform: scale(1.02); } + 100% { transform: scale(1); } + } + } + + /* Dialog panel, header, body, footer */ + .dialog__panel { + display: flex; + flex-direction: column; + flex: 1 1 auto; + width: 100%; + } + + .dialog__header { + display: flex; + align-items: center; + padding: var(--me-header-spacing); + column-gap: 0.5rem; + background-color: var(--me-header-background-color); + color: var(--me-header-color); + } + + :host([no-close-button]) .dialog__header { + column-gap: 0; + } + + .dialog__title { + display: block; + flex: 1 1 auto; + padding: 0; + margin: 0; + } + + .dialog__body { + display: block; + flex: 1 1 auto; + padding: var(--me-body-spacing); + overflow: auto; + background-color: var(--me-body-background-color); + color: var(--me-body-color); + overscroll-behavior: contain; + } + + .dialog__footer { + flex: 0 0 auto; + text-align: end; + padding: var(--me-footer-spacing); + background-color: var(--me-footer-background-color); + color: var(--me-footer-color); + } + + .dialog__close { + display: inline-flex; + align-items: center; + justify-content: center; + padding: var(--me-close-padding); + border: var(--me-close-border); + border-radius: var(--me-close-border-radius); + background-color: var(--me-close-background-color); + color: var(--me-close-color); + font-size: var(--me-close-font-size); + } + + .dialog__close:not(:disabled) { + cursor: pointer; + } + + .dialog__close:disabled { + cursor: not-allowed; + } +`;eV.innerHTML=` + + + +
+
+ + +
+ +
+
+ + + +
+ +
+
+
+`,(class e extends HTMLElement{#n=null;#r=null;#e=null;#l=void 0;constructor(){super(),this.shadowRoot||this.attachShadow({mode:"open"}).appendChild(eV.content.cloneNode(!0)),this.shadowRoot&&(this.#n=this.shadowRoot.querySelector("dialog"),this.#r=this.shadowRoot.querySelector('slot[name="footer"]'),this.#e=this.shadowRoot.querySelector('slot[name="close"]'))}static get observedAttributes(){return["open","no-header","no-animations","no-close-button","close-label"]}attributeChangedCallback(e,t,o){if(null!==this.#n){if("open"===e&&t!==o&&(this.open?(this.#n.showModal(),this.dispatchEvent(new CustomEvent("me-open",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow="hidden")):this.#n.close()),"no-header"===e&&t!==o){let e=this.#n.querySelector(".dialog__header");null!==e&&(e.hidden=this.noHeader)}if("no-animations"===e&&t!==o&&this.#n.classList.toggle("dialog--no-animations",this.noAnimations),"no-close-button"===e&&t!==o){let e=this.#n.querySelector(".dialog__close");null!==e&&(e.hidden=this.noCloseButton)}"close-label"===e&&t!==o&&this.#a()}}connectedCallback(){this.#t("open"),this.#t("staticBackdrop"),this.#t("noHeader"),this.#t("noAnimations"),this.#t("noCloseButton"),this.#t("fullscreen"),this.#t("preserveOverflow"),this.#t("placement"),this.#t("closeLabel"),this.#n?.addEventListener("click",this.#i),this.#n?.addEventListener("close",this.#m),this.#n?.addEventListener("cancel",this.#h),this.#n?.querySelector('form[method="dialog"]')?.addEventListener("submit",this.#u),this.#r?.addEventListener("slotchange",this.#c),this.#e?.addEventListener("slotchange",this.#p)}disconnectedCallback(){this.#l&&clearTimeout(this.#l),this.#n?.addEventListener("click",this.#i),this.#n?.removeEventListener("close",this.#m),this.#n?.removeEventListener("cancel",this.#h),this.#n?.querySelector('form[method="dialog"]')?.removeEventListener("submit",this.#u),this.#r?.removeEventListener("slotchange",this.#c),this.#e?.removeEventListener("slotchange",this.#p)}get open(){return this.hasAttribute("open")}set open(e){this.toggleAttribute("open",!!e)}get staticBackdrop(){return this.hasAttribute("static-backdrop")}set staticBackdrop(e){this.toggleAttribute("static-backdrop",!!e)}get noHeader(){return this.hasAttribute("no-header")}set noHeader(e){this.toggleAttribute("no-header",!!e)}get noAnimations(){return this.hasAttribute("no-animations")}set noAnimations(e){this.toggleAttribute("no-animations",!!e)}get noCloseButton(){return this.hasAttribute("no-close-button")}set noCloseButton(e){this.toggleAttribute("no-close-button",!!e)}get fullscreen(){return this.hasAttribute("fullscreen")}set fullscreen(e){this.toggleAttribute("fullscreen",!!e)}get preserveOverflow(){return this.hasAttribute("preserve-overflow")}set preserveOverflow(e){this.toggleAttribute("preserve-overflow",!!e)}get placement(){return this.getAttribute("placement")||"center"}set placement(e){this.setAttribute("placement",null!=e?e.toString():e)}get closeLabel(){return this.getAttribute("close-label")||"Close"}set closeLabel(e){this.setAttribute("close-label",null!=e?e.toString():e)}#a(){if(null===this.#n)return;let e=this.#n.querySelector(".dialog__close");null!==e&&((this.#e?.assignedElements()||[])?.some(e=>e.textContent?.replace(/\s/g,"")!=="")?e.removeAttribute("aria-label"):e.setAttribute("aria-label",this.closeLabel))}#o(){this.#l||(this.#n?.classList.add("dialog--pulse"),this.#l=setTimeout(()=>{this.#n?.classList.remove("dialog--pulse"),clearTimeout(this.#l),this.#l=void 0},300))}#m=()=>{this.open=!1,this.dispatchEvent(new CustomEvent("me-close",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow="")};#h=e=>{let t=this.#d("escape-key");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#o())};#u=e=>{let t=this.#d("close-button");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#o())};#i=e=>{let t=e.target;if(t===e.currentTarget){let e=this.#d("backdrop-click");this.dispatchEvent(e),e.defaultPrevented||this.staticBackdrop?this.noAnimations||this.#o():this.hide()}if(t instanceof HTMLElement&&null!==t.closest("[data-me-close]")){let e=this.#d("external-invoker");this.dispatchEvent(e),e.defaultPrevented?this.noAnimations||this.#o():this.hide()}};#c=()=>{if(null===this.#n)return;let e=this.#n.querySelector(".dialog__footer");if(null===e)return;let t=this.#r?.assignedNodes(),o=!!t&&t.length>0;e.hidden=!o};#p=()=>{this.#a()};#d(e){return new CustomEvent("me-request-close",{bubbles:!0,composed:!0,cancelable:!0,detail:{reason:e,element:this}})}#t(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}show(){this.open||(this.open=!0)}hide(){this.open&&(this.open=!1)}static defineCustomElement(t="modal-element"){"u">typeof window&&!window.customElements.get(t)&&window.customElements.define(t,e)}}).defineCustomElement();var eG=new Map([["aac","audio/aac"],["abw","application/x-abiword"],["arc","application/x-freearc"],["avif","image/avif"],["avi","video/x-msvideo"],["azw","application/vnd.amazon.ebook"],["bin","application/octet-stream"],["bmp","image/bmp"],["bz","application/x-bzip"],["bz2","application/x-bzip2"],["cda","application/x-cdf"],["csh","application/x-csh"],["css","text/css"],["csv","text/csv"],["doc","application/msword"],["docx","application/vnd.openxmlformats-officedocument.wordprocessingml.document"],["eot","application/vnd.ms-fontobject"],["epub","application/epub+zip"],["gz","application/gzip"],["gif","image/gif"],["heic","image/heic"],["heif","image/heif"],["htm","text/html"],["html","text/html"],["ico","image/vnd.microsoft.icon"],["ics","text/calendar"],["jar","application/java-archive"],["jpeg","image/jpeg"],["jpg","image/jpeg"],["jxl","image/jxl"],["js","text/javascript"],["json","application/json"],["jsonld","application/ld+json"],["markdown","text/markdown"],["md","text/markdown"],["mid","audio/midi"],["midi","audio/midi"],["mjs","text/javascript"],["mp3","audio/mpeg"],["mp4","video/mp4"],["mpeg","video/mpeg"],["mpkg","application/vnd.apple.installer+xml"],["odp","application/vnd.oasis.opendocument.presentation"],["ods","application/vnd.oasis.opendocument.spreadsheet"],["odt","application/vnd.oasis.opendocument.text"],["oga","audio/ogg"],["ogv","video/ogg"],["ogx","application/ogg"],["opus","audio/opus"],["otf","font/otf"],["png","image/png"],["pdf","application/pdf"],["php","application/x-httpd-php"],["ppt","application/vnd.ms-powerpoint"],["pptx","application/vnd.openxmlformats-officedocument.presentationml.presentation"],["rar","application/vnd.rar"],["rtf","application/rtf"],["sh","application/x-sh"],["svg","image/svg+xml"],["swf","application/x-shockwave-flash"],["tar","application/x-tar"],["tif","image/tiff"],["tiff","image/tiff"],["ts","video/mp2t"],["ttf","font/ttf"],["txt","text/plain"],["vsd","application/vnd.visio"],["wav","audio/wav"],["weba","audio/webm"],["webm","video/webm"],["webp","image/webp"],["woff","font/woff"],["woff2","font/woff2"],["xhtml","application/xhtml+xml"],["xls","application/vnd.ms-excel"],["xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],["xml","application/xml"],["xul","application/vnd.mozilla.xul+xml"],["zip","application/zip"],["7z","application/x-7z-compressed"],["mkv","video/x-matroska"],["mov","video/quicktime"],["msg","application/vnd.ms-outlook"]]),eX=[".DS_Store","Thumbs.db"],eY=e=>{let{name:t}=e;if(t&&-1!==t.lastIndexOf(".")&&!e.type){let o=(t.split(".").pop()||"").toLowerCase(),i=eG.get(o);i&&Object.defineProperty(e,"type",{value:i,writable:!1,configurable:!1,enumerable:!0})}return e},eK=(e,t)=>{let o=eY(e);if("string"!=typeof o.path){let{webkitRelativePath:i}=e;Object.defineProperty(o,"path",{value:"string"==typeof t?t:i||e.name,writable:!1,configurable:!1,enumerable:!0})}return o},eJ=async e=>await new Promise((t,o)=>{e.readEntries(t,o)}),eQ=async e=>{let t=[],o=await eJ(e);for(;o.length>0;)t.push(...o),o=await eJ(e);return t},eZ=e=>new Promise((t,o)=>{e.file(o=>t(eK(o,e.fullPath)),o)}),e0=async e=>{let t=[],o=[];for(let t of e){if("file"!==t.kind)continue;let e=t.getAsEntry?t.getAsEntry():t.webkitGetAsEntry();o.push(e)}for(;o.length>0;){let e=o.shift();if(e){if(e.isFile){let o=await eZ(e);-1===eX.indexOf(o.name)&&t.push(o)}else e.isDirectory&&o.push(...await eQ(e.createReader()))}}return t},e1=async e=>{let t=[];for(let o of e)-1===eX.indexOf(o.name)&&t.push(eK(o));return t},e8=async e=>e.dataTransfer?e.dataTransfer.items?await e0(e.dataTransfer.items):await e1(e.dataTransfer.files):await e1(e.target.files),e3="files-dropzone",e2="TOO_MANY_FILES",e5=document.createElement("template"),e4=` + *, + *::before, + *::after { + box-sizing: border-box; + } + + :host([hidden]), + [hidden] { + display: none !important; + } + + :host { + --dropzone-border-width: 2px; + --dropzone-border-style: dashed; + --dropzone-border-radius: 0.25rem; + --dropzone-border-color: #6c757d; + --dropzone-border-color-dragover: #0d6efd; + --dropzone-border-color-hover: var(--dropzone-border-color-dragover); + --dropzone-background-color: #ffffff; + --dropzone-background-color-dragover: #f4f4f5; + --dropzone-background-color-hover: var(--dropzone-background-color-dragover); + --dropzone-body-color: #3f3f46; + --dropzone-body-color-dragover: var(--dropzone-body-color); + --dropzone-body-color-hover: var(--dropzone-body-color-dragover); + --dropzone-focus-shadow-rgb: 49,132,253; + --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5); + --transition-duration: 0.2s; /* for backwards compatibility */ + --dropzone-transition-duration: var(--transition-duration); + + display: block; + } + + :host(:not([no-style])) .dropzone { + border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color); + border-radius: var(--dropzone-border-radius); + padding: 3rem 1rem; + overflow: hidden; + background-color: var(--dropzone-background-color); + color: var(--dropzone-body-color); + text-align: center; + cursor: pointer; + transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out; + } + + :host(:not([no-style])[disabled]) .dropzone { + opacity: 0.8; + cursor: not-allowed; + user-select: none; + } + + :host(:not([no-style]):not([disabled])) .dropzone--dragover { + border-color: var(--dropzone-border-color-dragover); + background-color: var(--dropzone-background-color-dragover); + color: var(--dropzone-body-color-dragover); + } + + :host(:not([no-style]):not([disabled])) .dropzone:focus-visible { + outline: none; + box-shadow: var(--dropzone-focus-box-shadow); + } + + @media (hover: hover) { + :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover { + border-color: var(--dropzone-border-color-hover); + background-color: var(--dropzone-background-color-hover); + color: var(--dropzone-body-color-hover); + } + } +`;e5.innerHTML=` + + + + +
+ Drag 'n' drop files here, or click to select files +
+`,(class e extends HTMLElement{#t=null;#n=null;constructor(){super(),this.shadowRoot||this.attachShadow({mode:"open",delegatesFocus:!0}).appendChild(e5.content.cloneNode(!0)),this.shadowRoot&&(this.#t=this.shadowRoot.getElementById("file-input"),this.#n=this.shadowRoot.getElementById("dropzone"))}static get observedAttributes(){return["accept","disabled","multiple"]}attributeChangedCallback(e,t,o){"accept"===e&&t!==o&&this.#t&&(this.#t.accept=this.accept),"disabled"===e&&t!==o&&this.#t&&(this.#t.disabled=this.disabled,this.disabled?(this.#n?.removeAttribute("tabindex"),this.#n?.setAttribute("aria-disabled","true")):(this.#n?.setAttribute("tabindex","0"),this.#n?.setAttribute("aria-disabled","false"))),"multiple"===e&&t!==o&&this.#t&&(this.#t.multiple=this.multiple)}connectedCallback(){this.#l("accept"),this.#l("disabled"),this.#l("maxFiles"),this.#l("maxSize"),this.#l("minSize"),this.#l("multiple"),this.#l("autoFocus"),this.#l("noStyle"),this.#t?.addEventListener("change",this.#r),this.#n?.addEventListener("dragenter",this.#a),this.#n?.addEventListener("dragover",this.#d),this.#n?.addEventListener("dragleave",this.#o),this.#n?.addEventListener("drop",this.#e),this.#n?.addEventListener("click",this.#h),this.#n?.addEventListener("keyup",this.#m),this.autoFocus&&this.#n?.focus()}disconnectedCallback(){this.#t?.removeEventListener("change",this.#r),this.#n?.removeEventListener("dragenter",this.#a),this.#n?.removeEventListener("dragover",this.#d),this.#n?.removeEventListener("dragleave",this.#o),this.#n?.removeEventListener("drop",this.#e),this.#n?.removeEventListener("click",this.#h),this.#n?.removeEventListener("keyup",this.#m)}get accept(){return this.getAttribute("accept")||""}set accept(e){this.setAttribute("accept",null!=e?e.toString():e)}get disabled(){return this.hasAttribute("disabled")}set disabled(e){this.toggleAttribute("disabled",!!e)}get maxFiles(){let e=Number(this.getAttribute("max-files"))||0;return e<=0?1/0:Math.floor(Math.abs(e))}set maxFiles(e){this.setAttribute("max-files",null!=e?e.toString():e)}get maxSize(){let e=this.getAttribute("max-size");if(null===e)return 1/0;let t=Number(e);return Number.isNaN(t)?1/0:t}set maxSize(e){this.setAttribute("max-size",null!=e?e.toString():e)}get minSize(){let e=this.getAttribute("min-size");if(null===e)return 0;let t=Number(e);return Number.isNaN(t)?0:t}set minSize(e){this.setAttribute("min-size",null!=e?e.toString():e)}get multiple(){return this.hasAttribute("multiple")}set multiple(e){this.toggleAttribute("multiple",!!e)}get autoFocus(){return this.hasAttribute("auto-focus")}set autoFocus(e){this.toggleAttribute("auto-focus",!!e)}get noStyle(){return this.hasAttribute("no-style")}set noStyle(e){this.toggleAttribute("no-style",!!e)}#r=async e=>{try{this.#u(await e8(e))}catch(e){this.dispatchEvent(new CustomEvent(`${e3}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}};#a=()=>{this.disabled||this.dispatchEvent(new Event(`${e3}-dragenter`,{bubbles:!0,composed:!0}))};#d=e=>{if(e.preventDefault(),this.disabled){e.dataTransfer.dropEffect="none";return}e.dataTransfer.dropEffect="copy",this.#n&&(this.#n.classList.add("dropzone--dragover"),this.#n.part.add("dropzone--dragover")),this.dispatchEvent(new Event(`${e3}-dragover`,{bubbles:!0,composed:!0}))};#o=()=>{this.disabled||(this.#n&&(this.#n.classList.remove("dropzone--dragover"),this.#n.part.remove("dropzone--dragover")),this.dispatchEvent(new Event(`${e3}-dragleave`,{bubbles:!0,composed:!0})))};#e=async e=>{if(!this.disabled){e.preventDefault(),this.#n&&(this.#n.classList.remove("dropzone--dragover"),this.#n.part.remove("dropzone--dragover"));try{this.#u(await e8(e))}catch(e){this.dispatchEvent(new CustomEvent(`${e3}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}}};#h=()=>{this.disabled||this.#t?.click()};#m=e=>{this.disabled||(" "===e.key||"Enter"===e.key)&&this.#t?.click()};#u(e){if(!Array.isArray(e)||!e.length)return;let t=[],o=[],i=e.length;if(!this.multiple&&i>1)for(let t of e)o.push({file:t,errors:[{code:e2,message:"Too many files selected. Only 1 file is allowed."}]});else if(this.multiple&&i>this.maxFiles)for(let t of e)o.push({file:t,errors:[{code:e2,message:`Too many files selected. Only ${this.maxFiles} ${this.maxFiles>1?"files are":"file is"} allowed.`}]});else for(let i of e){let e=/*! + * @georapbox/files-dropzone-element + * A custom element that creates a drag and drop zone for files + * + * @version 2.0.1 + * @homepage https://github.com/georapbox/files-dropzone-element#readme + * @author George Raptis + * @license MIT + */function(e,t=""){if(!t)return!0;let o=[...new Set(t.split(",").map(e=>e.trim()).filter(Boolean))],i=e.type,n=i.replace(/\/.*$/,"");for(let t of o)if("."===t.charAt(0)){if(-1!==e.name.toLowerCase().indexOf(t.toLowerCase(),e.name.length-t.length))return!0}else if(/\/\*$/.test(t)){if(n===t.replace(/\/.*$/,""))return!0}else if(i===t)return!0;return!1}(i,this.accept),n=i.size>this.maxSize,a=i.size0&&this.dispatchEvent(new CustomEvent(`${e3}-drop-accepted`,{bubbles:!0,composed:!0,detail:{acceptedFiles:t}})),o.length>0&&this.dispatchEvent(new CustomEvent(`${e3}-drop-rejected`,{bubbles:!0,composed:!0,detail:{rejectedFiles:o}})),this.#t&&(this.#t.value=this.#t.defaultValue)}openFileDialog(){this.disabled||this.#t?.click()}#l(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}static defineCustomElement(t=e3){"u">typeof window&&!window.customElements.get(t)&&window.customElements.define(t,e)}}).defineCustomElement();const e7=["image/jpg","image/jpeg","image/png","image/apng","image/gif","image/webp","image/avif"],e6=(e="",t="")=>{let o=Math.random().toString(36).substring(2,8);return`${"string"==typeof e&&""!==e?e+"-":""}${o}${"string"==typeof t&&""!==t?"-"+t:""}`},e9=async(e={})=>{let t=await fetch(e.url),o=await t.blob(),i=e.mimeType||o.type||"";if(!e7.includes(i))throw Error(`This is not an accepted image format. Accepted MIME types are: ${e7.join(", ")}`);return new File([o],e.filename||"",o)},te=localStorage,tt=new class{#g=null;#b=null;constructor(e,t=localStorage){if(!e)throw Error("Storage prefix is required");if(t!==localStorage&&t!==sessionStorage)throw Error("Storage provider is not supported");this.#g=e,this.#b=t}set(e,t){try{this.#b.setItem(`${this.#g}${e}`,JSON.stringify(t))}catch(e){console.error("Error saving to storage",e)}}get(e){try{let t=this.#b.getItem(`${this.#g}${e}`);return t?JSON.parse(t):null}catch(e){return console.error("Error getting from storage",e),null}}}("meme-generator/",te),to=e=>"string"==typeof e;var ti={};ti=new URL("Pressuru.684952ea.ttf",import.meta.url).toString();var tn={};tn=new URL("Oswald-Regular.89ec7d89.ttf",import.meta.url).toString();var ta={};ta=new URL("Oswald-Bold.0f6a7ca6.ttf",import.meta.url).toString();var tr={};tr=new URL("Roboto-Regular.ca197847.ttf",import.meta.url).toString();var ts={};ts=new URL("Roboto-Bold.fdb9b54a.ttf",import.meta.url).toString();var tl={};tl=new URL("RobotoCondensed-Regular.d585f5c7.ttf",import.meta.url).toString();var td={};td=new URL("RobotoCondensed-Bold.e1f96d4b.ttf",import.meta.url).toString();var tc={};tc=new URL("CourierPrime-Regular.3a25a501.ttf",import.meta.url).toString();var tu={};tu=new URL("CourierPrime-Bold.3d6bf689.ttf",import.meta.url).toString();var th={};th=new URL("OpenSans-Regular.edf9e01b.ttf",import.meta.url).toString();var tm={};tm=new URL("OpenSans-Bold.8fceb72b.ttf",import.meta.url).toString();const tp=[{name:"Pressuru",label:"Pressuru",path:o(ti),style:"normal",weight:"400"},{name:"Oswald-Regular",label:"Oswald",path:o(tn),style:"normal",weight:"400"},{name:"Oswald-Bold",label:"Oswald Bold",path:o(ta),style:"normal",weight:"700"},{name:"Roboto-Regular",label:"Roboto",path:o(tr),style:"normal",weight:"400"},{name:"Roboto-Bold",label:"Roboto Bold",path:o(ts),style:"normal",weight:"700"},{name:"RobotoCondensed-Regular",label:"Roboto Condensed",path:o(tl),style:"normal",weight:"400"},{name:"RobotoCondensed-Bold",label:"Roboto Condensed Bold",path:o(td),style:"normal",weight:"700"},{name:"CourierPrime-Regular",label:"Courier Prime",path:o(tc),style:"normal",weight:"400"},{name:"CourierPrime-Bold",label:"Courier Prime Bold",path:o(tu),style:"normal",weight:"700"},{name:"OpenSans-Regular",label:"Open Sans",path:o(th),style:"normal",weight:"400"},{name:"OpenSans-Bold",label:"Open Sans Bold",path:o(tm),style:"normal",weight:"400"}],tg=async(e,t,o={})=>{try{let i=new FontFace(e,`url(${t})`,{...o});await i.load(),document.fonts.add(i)}catch(e){console.error(e)}},tb=document.getElementById("errorsContainer"),tf=e=>{let t=e.currentTarget;t.removeEventListener("click",tf),tb.removeChild(t.parentNode)},tv=(e="",t="info")=>{["info","warning","danger"].includes(t)||(t="info");let o=` + ${e} + + `,i=document.createElement("div");i.className=`alert alert-${t} alert-dismissible text-break mb-2 fade`,i.innerHTML=o,i.querySelector("button").addEventListener("click",tf),tb.appendChild(i),setTimeout(()=>i.classList.add("show"),100)},ty={id:"",text:"",fillColor:"#ffffff",strokeColor:"#000000",font:"Pressuru",fontSize:40,fontWeight:"normal",textAlign:"center",shadowBlur:0,strokeWidth:1.5,offsetY:0,offsetX:0,rotate:0,allCaps:!0},tw=new Map;class tk{constructor(e){let t=e6("textbox",Date.now().toString(36));this.data=e?{...e,id:t}:{...ty,id:t},tw.set(t,this),document.dispatchEvent(new CustomEvent("textbox-create",{bubbles:!0,composed:!0,detail:{textbox:this}}))}getData(){return this.data}static create(e){return new tk(e)}static getAll(){return tw}static getById(e){return tw.get(e)}static remove(e){tw.delete(e),document.dispatchEvent(new CustomEvent("textbox-remove",{bubbles:!0,composed:!0,detail:{id:e}}))}static createElement(e,t=!0){if(!(e instanceof tk))return;let o=e.getData(),{id:i,text:n,fillColor:a,strokeColor:r,fontSize:s,shadowBlur:l,strokeWidth:d,offsetX:c,offsetY:u,rotate:h}=o,m=` +
+ + + + + +
+ + + + + + + +
+
+ + + `,p=document.createDocumentFragment(),g=document.createElement("div");g.setAttribute("id",i),g.setAttribute("data-section","textbox"),g.className="bg-light border shadow-sm mb-3 rounded",g.innerHTML=m,g.querySelectorAll("select").forEach(e=>e.value=o[e.dataset.input]),g.querySelectorAll('input[type="checkbox"]').forEach(e=>e.checked=o[e.dataset.input]);let b=p.appendChild(g);return t&&setTimeout(()=>b.querySelector('[data-input="text"]').focus(),0),b}}class tE{#f=null;#v=null;constructor(e){this.#f=e,this.#v=this.#f.getContext("2d")}get width(){return this.#f.width}set width(e){this.#f.width=e}get height(){return this.#f.height}set height(e){this.#f.height=e}getDimensions(){return{width:this.width,height:this.height}}setDimensions({width:e,height:t}){return this.width=e,this.height=t,this}toDataURL(){return this.#f.toDataURL()}draw(e,t=new Map){if(null==e)return;let o=this.#f,i=this.#v;i.clearRect(0,0,o.width,o.height),to(e)?(i.fillStyle=e,i.fillRect(0,0,o.width,o.height)):i.drawImage(e,0,0,o.width,o.height);let n=0;return t.forEach(e=>{let{data:t}=e;n+=1,i.save(),i.font=`${t.fontWeight} ${t.fontSize*o.width/1e3}px ${t.font}`,i.fillStyle=t.fillColor,i.textAlign=t.textAlign,i.strokeStyle=t.strokeColor;let a=i.measureText("M").width+t.fontSize/2,r=o.width/2,s=t.shadowBlur,l=(!0===t.allCaps?t.text.toUpperCase():t.text).split("\n");0!==s&&(i.shadowOffsetX=0,i.shadowOffsetY=0,i.shadowBlur=Math.min(s,20),i.shadowColor=t.strokeColor),i.translate(r+t.offsetX,a*n+t.offsetY),i.rotate(Math.min(t.rotate,360)*Math.PI/180),l.forEach((e,t)=>i.fillText(e,0,t*a)),0!==s&&(i.shadowBlur=0,l.forEach((e,t)=>i.fillText(e,0,t*a))),t.strokeWidth>0&&(i.lineWidth=Math.min(t.strokeWidth,20),l.forEach((e,t)=>i.strokeText(e,0,t*a))),i.restore()}),this}clear(){return this.#v.clearRect(0,0,this.#f.width,this.#f.height),this}show(){return this.#f.hidden=!1,this}hide(){return this.#f.hidden=!0,this}static createInstance(e){return new tE(e)}}const tx=tE.createInstance(document.getElementById("canvas")),tS=document.getElementById("videoModal"),tC=document.getElementById("downloadModal"),tj=document.querySelector("capture-photo"),tA=document.getElementById("cameraSelect"),tT=document.getElementById("capturePhotoButton"),tz=document.getElementById("torchButton"),tL=document.querySelector("files-dropzone"),tD=document.getElementById("instructions"),t$=document.getElementById("imageUploadMethodSelect"),t_=document.getElementById("fileSelectBtn"),tI=document.getElementById("imageUrlForm"),tB=document.getElementById("addTextboxBtn"),tR=document.getElementById("textboxesContainer"),tM=document.getElementById("generateMemeBtn"),tF=document.getElementById("openVideoModalBtn"),tN=document.getElementById("downloadMemeBtn"),tO=document.getElementById("downloadMemePreview"),tP=document.querySelector("web-share"),tU=document.getElementById("gallery"),tq=document.getElementById("gallerySearch"),tH=tU.querySelector(".gallery__no-results"),tV=document.getElementById("solidColorForm"),tW=document.querySelectorAll(".upload-method"),tG=document.getElementById("removeConfirmationModal"),tX=document.getElementById("removeTextForm"),tY=document.getElementById("maxImageDimensionsForm"),tK=tY.maxImageDimensions,tJ=document.getElementById("clearCanvasBtn"),tQ=tt.get("maxImageDimensions");let tZ=!1,t0=null,t1=null;const t8=async()=>{let e=tx.toDataURL("image/png"),t=`${e6("meme")}.png`,o=e.replace("image/png","image/octet-stream");if(tN.download=t,tN.href=o,tO.width=tx.getDimensions().width,tO.height=tx.getDimensions().height,tO.src=o,eU())try{let o=await e9({url:e,filename:t,mimeType:"image/png"}).catch(e=>tv(e.message,"danger"));o&&eU({files:[o]})&&(tP.shareFiles=[o],tP.hidden=!1)}catch(e){console.error(e)}window.requestAnimationFrame(()=>{tC.open=!0})},t3=e=>{let[t,o]=tY.maxImageDimensions.value.split("x"),i=Number(t)||800,n=Number(o)||600,a=e.width,r=e.height;a>r?a>i&&(r*=i/a,a=i):r>n&&(a*=n/r,r=n),tx.setDimensions({width:a,height:r})},t2=()=>{tx.draw(t0,tk.getAll()).show(),tL.classList.add("dropzone--accepted"),tL.disabled=!0,tM.disabled=!1,tD.hidden=!0,tJ.hidden=!1},t5=e=>{t3(t0=e.target),t2()},t4=e=>{if(!e)return;let t=new Image,o=new FileReader;o.addEventListener("load",function(e){let o=e.target.result;t.addEventListener("load",t5),t.src=o}),o.readAsDataURL(e)},t7=(e,t,o)=>{let i=tk.getById(t).getData();switch(e.type){case"checkbox":i[o]=e.checked;break;case"number":i[o]=Number(e.value);break;default:i[o]=e.value}tx.draw(t0,tk.getAll())},t6=async e=>{e.preventDefault();let t=e.target,o=t.querySelector('button[type="submit"]'),i=t.imageUrl.value;if(i.trim()){o.disabled=!0,o.querySelector(".spinner").hidden=!1,o.querySelector(".label").hidden=!0;try{let e=await e9({url:i}).catch(e=>tv(e.message,"danger"));e&&t4(e)}catch{tv(`Failed to load image from "${i}".`,"danger")}finally{o.disabled=!1,o.querySelector(".spinner").hidden=!0,o.querySelector(".label").hidden=!1}}},t9=(e,t)=>()=>{let o=document.getElementById(e),i=o.querySelector('[data-input="offsetY"]'),n=o.querySelector('[data-input="offsetX"]'),a=tk.getById(e);if(!a)return;let r=a.getData();switch(t=t.toLowerCase()){case"up":r.offsetY-=1,i.value=r.offsetY;break;case"down":r.offsetY+=1,i.value=r.offsetY;break;case"left":r.offsetX-=1,n.value=r.offsetX;break;case"right":r.offsetX+=1,n.value=r.offsetX}tx.draw(t0,tk.getAll()),t1=requestAnimationFrame(t9(e,t))},oe=async e=>{let t=e.target.closest("button");if(!t)return;let o=t.querySelector("img");try{let e=await e9({url:o.src}).catch(e=>tv(e.message,"danger"));e&&t4(e)}catch{tv(`Failed to load image: "${o.alt}".`,"danger")}},ot=(e={})=>{let{el:t,isTorchOn:o}={el:document.getElementById("torchButton"),isTorchOn:!1,...e},i=t.querySelectorAll("svg path");2===i.length&&(i[0].style.display=o?"none":"block",i[1].style.display=o?"block":"none",t.setAttribute("aria-label",`Turn ${o?"off":"on"} flash`))},oo=async e=>{let t=e.target.getTrackCapabilities();t?.torch&&(tz?.removeAttribute("hidden"),tj?.hasAttribute("torch")&&ot({el:tz,isTorchOn:!0}));let o=await eP.getVideoInputDevices();o.forEach((e,t)=>{let o=document.createElement("option");o.value=e.deviceId,o.textContent=e.label||`Camera ${t+1}`,tA.appendChild(o)}),o.length>1&&tA?.removeAttribute("hidden")};document.addEventListener("web-share:error",()=>{tC.open=!1,tv("There was an error while trying to share your meme.","danger")}),document.addEventListener("capture-photo:video-play",oo,{once:!0}),document.addEventListener("capture-photo:error",e=>{let t=e.detail.error,o="An error occurred while trying to capture photo.";t instanceof Error&&("NotAllowedError"===t.name||"NotFoundError"===t.name)&&(o+=" Make sure you have a camera connected and you have granted the appropriate permissions."),tv(o,"danger"),tS.open=!1,console.error(t)}),document.addEventListener("capture-photo:success",e=>{tS.open=!1;let t=new Image;t.addEventListener("load",t5),t.src=e.detail.dataURI}),document.addEventListener("me-open",e=>{"videoModal"===e.target.id&&tj&&"function"==typeof tj.startVideoStream&&tj.startVideoStream()}),document.addEventListener("me-close",e=>{"videoModal"===e.target.id&&tj&&"function"==typeof tj.stopVideoStream&&tj.stopVideoStream(),"removeConfirmationModal"===e.target.id&&tX.reset()}),document.addEventListener("emoji-click",e=>{let t=e.target.closest('[data-section="textbox"]');if(t){let o=t.querySelector('[data-input="text"]'),i=e.detail.unicode;o&&eR(o,i)}}),document.addEventListener("textbox-create",e=>{let t=e.detail.textbox,o=tk.createElement(t,tZ);tZ=!0,tR.appendChild(o),t.getData().text&&tx.draw(t0,tk.getAll())}),document.addEventListener("textbox-remove",e=>{let t=document.getElementById(e.detail.id);t&&t.remove(),tR.querySelectorAll('[data-section="textbox"]').forEach((e,t)=>{e.querySelector('[data-input="text"]').setAttribute("placeholder",`Text #${t+1}`)}),tx.draw(t0,tk.getAll())}),t_.addEventListener("click",()=>{"function"==typeof tL.openFileDialog&&tL.openFileDialog()}),tF.addEventListener("click",()=>{tS.open=!0}),tB.addEventListener("click",()=>tk.create()),tM.addEventListener("click",t8),tN.addEventListener("click",()=>tC.open=!1),tI.addEventListener("submit",t6),tL.addEventListener("files-dropzone-drop-accepted",e=>{let[t]=e.detail.acceptedFiles;t&&t4(t)}),tR.addEventListener("input",e=>{let t;let o=e.target,i=o.closest('[data-section="textbox"]').id;o.matches('[data-input="text"]')?t="text":o.matches('[data-input="fillColor"]')?t="fillColor":o.matches('[data-input="strokeColor"]')?t="strokeColor":o.matches('[data-input="font"]')?t="font":o.matches('[data-input="fontSize"]')?t="fontSize":o.matches('[data-input="fontWeight"]')?t="fontWeight":o.matches('[data-input="textAlign"]')?t="textAlign":o.matches('[data-input="shadowBlur"]')?t="shadowBlur":o.matches('[data-input="offsetY"]')?t="offsetY":o.matches('[data-input="offsetX"]')?t="offsetX":o.matches('[data-input="rotate"]')?t="rotate":o.matches('[data-input="strokeWidth"]')&&(t="strokeWidth"),t&&t7(o,i,t)}),tR.addEventListener("change",e=>{let t;let o=e.target,i=o.closest('[data-section="textbox"]').id;o.matches('[data-input="allCaps"]')&&(t="allCaps"),t&&t7(o,i,t)}),tR.addEventListener("click",e=>{let t=e.target;if(t.matches('[data-button="settings"]')){let e=t.closest('[data-section="textbox"]'),o=e?.querySelector('[data-section="settings"]');o&&(o.hidden=!o.hidden)}if(t.matches('[data-button="duplicate-text-box"')){let e=t.closest('[data-section="textbox"]'),o=tk.getById(e.id);tk.create({...o.data})}if(t.matches('[data-button="delete-text-box"]')){let e=t.closest('[data-section="textbox"]').id,o=tk.getById(e);if(o&&o.data.text.trim()){let t=tX["textbox-id"];t&&(t.value=e,tG.open=!0)}else tk.remove(e)}}),tR.addEventListener("pointerdown",e=>{let t=e.target,o=t.closest('[data-section="textbox"]');o&&t.matches('[data-action="move-text"]')&&(t1=requestAnimationFrame(t9(o.id,t.getAttribute("aria-label"))))}),tR.addEventListener("pointerup",e=>{e.target.matches('[data-action="move-text"]')&&(cancelAnimationFrame&&cancelAnimationFrame(t1),t1=null)}),tR.addEventListener("pointerout",e=>{e.target.matches('[data-action="move-text"]')&&(cancelAnimationFrame&&cancelAnimationFrame(t1),t1=null)}),tR.addEventListener("keydown",e=>{let t=e.target,o=t.closest('[data-section="textbox"]');t.matches('[data-action="move-text"]')&&(" "===e.key||"Enter"===e.key)&&(t1&&cancelAnimationFrame(t1),t1=requestAnimationFrame(t9(o.id,t.getAttribute("aria-label"))))}),tR.addEventListener("keyup",e=>{e.target.matches('[data-action="move-text"]')&&(" "===e.key||"Enter"===e.key)&&(t1&&cancelAnimationFrame(t1),t1=null)}),t$.addEventListener("change",e=>{tW.forEach(t=>t.hidden=t.id!==e.target.value),tY.hidden="solidColorForm"===e.target.value}),tU.addEventListener("click",oe),tq.addEventListener("input",e=>{let t=e.target.value.toLowerCase().trim();tU.querySelectorAll("button").forEach(e=>{let o=(e.querySelector("img").getAttribute("alt")||"").toLowerCase();e.hidden=!o.includes(t)}),tH.hidden=!!tU.querySelector("button:not([hidden])")}),tV.addEventListener("input",e=>{e.target===tV.canvasColor&&(t0=e.target.value),to(t0)&&(tx.setDimensions({width:Number(tV.canvasWidth.value)||800,height:Number(tV.canvasHeight.value)||600}),t2())}),tX.addEventListener("submit",e=>{e.preventDefault();let t=e.target["textbox-id"].value;t&&(tk.remove(t),tG.open=!1)}),tY.addEventListener("change",e=>{e.target.matches('[name="maxImageDimensions"]')&&tt.set("maxImageDimensions",e.target.value),!t0||to(t0)||(t3(t0),tx.draw(t0,tk.getAll()))}),tJ.addEventListener("click",e=>{t0&&(e.stopPropagation(),t0=null,tL.classList.remove("dropzone--accepted"),tM.disabled=!0,tD.hidden=!1,tJ.hidden=!0,tL.disabled=!1,tx.clear().hide())}),tA.addEventListener("change",e=>{if(null===tj||"function"!=typeof tj.restartVideoStream||tj.hasAttribute("loading"))return;let t=e.target.value||void 0;tj.restartVideoStream(t)}),tT.addEventListener("click",()=>{null===tj||"function"!=typeof tj.capture||tj.hasAttribute("loading")||tj.capture()}),tz.addEventListener("click",e=>{null!==tj&&(tj.torch=!tj.torch,ot({el:e.currentTarget,isTorchOn:tj.hasAttribute("torch")}))}),tU.querySelectorAll("button > img")?.forEach(e=>{e.setAttribute("title",e.getAttribute("alt"))}),tk.create(),tL.accept=e7,((e,t)=>{if(!t)return;let o=e.map(e=>e.split("/")[1]),i=`Supported image formats: ${o.join(", ")}`,n=document.createElement("div"),a=document.createElement("small");a.textContent=i,n.appendChild(a),t.appendChild(a)})(e7,tD),tp.forEach(({name:e,path:t,style:o,weight:i})=>{tg(e,t,{style:o,weight:i})}),tQ&&(tK.value=tQ),tK.disabled=!1; +//# sourceMappingURL=index.4434df8a.js.map diff --git a/index.4434df8a.js.map b/index.4434df8a.js.map new file mode 100644 index 0000000..205a0be --- /dev/null +++ b/index.4434df8a.js.map @@ -0,0 +1 @@ +{"mappings":"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","sources":["","src/js/index.js","node_modules/emoji-picker-element/index.js","node_modules/emoji-picker-element/picker.js","node_modules/emoji-picker-element/database.js","node_modules/insert-text-at-cursor/dist/index.esm.js","node_modules/insert-text-at-cursor/index.js","node_modules/@georapbox/capture-photo-element/dist/capture-photo-defined.js","node_modules/@georapbox/capture-photo-element/src/utils/clamp.js","node_modules/@georapbox/capture-photo-element/src/capture-photo.js","node_modules/@georapbox/capture-photo-element/src/capture-photo-defined.js","node_modules/@georapbox/web-share-element/dist/is-web-share-supported.js","node_modules/@georapbox/web-share-element/src/is-web-share-supported.js","node_modules/@georapbox/web-share-element/dist/web-share-defined.js","node_modules/@georapbox/web-share-element/src/web-share.js","node_modules/@georapbox/web-share-element/src/web-share-defined.js","node_modules/@georapbox/modal-element/dist/modal-element-defined.js","node_modules/@georapbox/modal-element/src/modal-element.js","node_modules/@georapbox/modal-element/src/modal-element-defined.js","node_modules/@georapbox/files-dropzone-element/dist/files-dropzone-defined.js","node_modules/@georapbox/files-dropzone-element/src/utils/is-valid-file.js","node_modules/@georapbox/files-dropzone-element/src/utils/files-selector.js","node_modules/@georapbox/files-dropzone-element/src/files-dropzone.js","node_modules/@georapbox/files-dropzone-element/src/files-dropzone-defined.js","src/js/constants.js","src/js/utils/uid.js","src/js/utils/file-from-url.js","src/js/utils/storage.js","src/js/utils/is-solid-color-selected.js","src/js/custom-fonts.js","node_modules/@parcel/runtime-js/lib/runtime-b3ed033b67fa1807.js","node_modules/@parcel/runtime-js/lib/runtime-1d2531ee422c6f6d.js","node_modules/@parcel/runtime-js/lib/runtime-371408043a3b5910.js","node_modules/@parcel/runtime-js/lib/runtime-43269cb69083298e.js","node_modules/@parcel/runtime-js/lib/runtime-462b3570f4df41f9.js","node_modules/@parcel/runtime-js/lib/runtime-3b33b0d4ba540b9c.js","node_modules/@parcel/runtime-js/lib/runtime-4c4c76c87cd13631.js","node_modules/@parcel/runtime-js/lib/runtime-c183c1a7d5597306.js","node_modules/@parcel/runtime-js/lib/runtime-cad0444e16370079.js","node_modules/@parcel/runtime-js/lib/runtime-ea95caeac56af137.js","node_modules/@parcel/runtime-js/lib/runtime-71967538b9c77f3f.js","src/js/toast-alert.js","src/js/textbox.js","src/js/canvas.js"],"sourcesContent":["\nfunction $parcel$interopDefault(a) {\n return a && a.__esModule ? a.default : a;\n}\nfunction $736431a7b9521865$var$assertNonEmptyString(str) {\n if (typeof str !== \"string\" || !str) throw new Error(\"expected a non-empty string, got: \" + str);\n}\nfunction $736431a7b9521865$var$assertNumber(number) {\n if (typeof number !== \"number\") throw new Error(\"expected a number, got: \" + number);\n}\nconst $736431a7b9521865$var$DB_VERSION_CURRENT = 1;\nconst $736431a7b9521865$var$DB_VERSION_INITIAL = 1;\nconst $736431a7b9521865$var$STORE_EMOJI = \"emoji\";\nconst $736431a7b9521865$var$STORE_KEYVALUE = \"keyvalue\";\nconst $736431a7b9521865$var$STORE_FAVORITES = \"favorites\";\nconst $736431a7b9521865$var$FIELD_TOKENS = \"tokens\";\nconst $736431a7b9521865$var$INDEX_TOKENS = \"tokens\";\nconst $736431a7b9521865$var$FIELD_UNICODE = \"unicode\";\nconst $736431a7b9521865$var$INDEX_COUNT = \"count\";\nconst $736431a7b9521865$var$FIELD_GROUP = \"group\";\nconst $736431a7b9521865$var$FIELD_ORDER = \"order\";\nconst $736431a7b9521865$var$INDEX_GROUP_AND_ORDER = \"group-order\";\nconst $736431a7b9521865$var$KEY_ETAG = \"eTag\";\nconst $736431a7b9521865$var$KEY_URL = \"url\";\nconst $736431a7b9521865$var$KEY_PREFERRED_SKINTONE = \"skinTone\";\nconst $736431a7b9521865$var$MODE_READONLY = \"readonly\";\nconst $736431a7b9521865$var$MODE_READWRITE = \"readwrite\";\nconst $736431a7b9521865$var$INDEX_SKIN_UNICODE = \"skinUnicodes\";\nconst $736431a7b9521865$var$FIELD_SKIN_UNICODE = \"skinUnicodes\";\nconst $736431a7b9521865$var$DEFAULT_DATA_SOURCE = \"https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json\";\nconst $736431a7b9521865$var$DEFAULT_LOCALE = \"en\";\n// like lodash's uniqBy but much smaller\nfunction $736431a7b9521865$var$uniqBy(arr, func) {\n const set = new Set();\n const res = [];\n for (const item of arr){\n const key = func(item);\n if (!set.has(key)) {\n set.add(key);\n res.push(item);\n }\n }\n return res;\n}\nfunction $736431a7b9521865$var$uniqEmoji(emojis) {\n return $736431a7b9521865$var$uniqBy(emojis, (_)=>_.unicode);\n}\nfunction $736431a7b9521865$var$initialMigration(db) {\n function createObjectStore(name, keyPath, indexes) {\n const store = keyPath ? db.createObjectStore(name, {\n keyPath: keyPath\n }) : db.createObjectStore(name);\n if (indexes) for (const [indexName, [keyPath, multiEntry]] of Object.entries(indexes))store.createIndex(indexName, keyPath, {\n multiEntry: multiEntry\n });\n return store;\n }\n createObjectStore($736431a7b9521865$var$STORE_KEYVALUE);\n createObjectStore($736431a7b9521865$var$STORE_EMOJI, /* keyPath */ $736431a7b9521865$var$FIELD_UNICODE, {\n [$736431a7b9521865$var$INDEX_TOKENS]: [\n $736431a7b9521865$var$FIELD_TOKENS,\n /* multiEntry */ true\n ],\n [$736431a7b9521865$var$INDEX_GROUP_AND_ORDER]: [\n [\n $736431a7b9521865$var$FIELD_GROUP,\n $736431a7b9521865$var$FIELD_ORDER\n ]\n ],\n [$736431a7b9521865$var$INDEX_SKIN_UNICODE]: [\n $736431a7b9521865$var$FIELD_SKIN_UNICODE,\n /* multiEntry */ true\n ]\n });\n createObjectStore($736431a7b9521865$var$STORE_FAVORITES, undefined, {\n [$736431a7b9521865$var$INDEX_COUNT]: [\n \"\"\n ]\n });\n}\nconst $736431a7b9521865$var$openIndexedDBRequests = {};\nconst $736431a7b9521865$var$databaseCache = {};\nconst $736431a7b9521865$var$onCloseListeners = {};\nfunction $736431a7b9521865$var$handleOpenOrDeleteReq(resolve, reject, req) {\n // These things are almost impossible to test with fakeIndexedDB sadly\n /* istanbul ignore next */ req.onerror = ()=>reject(req.error);\n /* istanbul ignore next */ req.onblocked = ()=>reject(new Error(\"IDB blocked\"));\n req.onsuccess = ()=>resolve(req.result);\n}\nasync function $736431a7b9521865$var$createDatabase(dbName) {\n const db = await new Promise((resolve, reject)=>{\n const req = indexedDB.open(dbName, $736431a7b9521865$var$DB_VERSION_CURRENT);\n $736431a7b9521865$var$openIndexedDBRequests[dbName] = req;\n req.onupgradeneeded = (e)=>{\n // Technically there is only one version, so we don't need this `if` check\n // But if an old version of the JS is in another browser tab\n // and it gets upgraded in the future and we have a new DB version, well...\n // better safe than sorry.\n /* istanbul ignore else */ if (e.oldVersion < $736431a7b9521865$var$DB_VERSION_INITIAL) $736431a7b9521865$var$initialMigration(req.result);\n };\n $736431a7b9521865$var$handleOpenOrDeleteReq(resolve, reject, req);\n });\n // Handle abnormal closes, e.g. \"delete database\" in chrome dev tools.\n // No need for removeEventListener, because once the DB can no longer\n // fire \"close\" events, it will auto-GC.\n // Unfortunately cannot test in fakeIndexedDB: https://github.com/dumbmatter/fakeIndexedDB/issues/50\n /* istanbul ignore next */ db.onclose = ()=>$736431a7b9521865$var$closeDatabase(dbName);\n return db;\n}\nfunction $736431a7b9521865$var$openDatabase(dbName) {\n if (!$736431a7b9521865$var$databaseCache[dbName]) $736431a7b9521865$var$databaseCache[dbName] = $736431a7b9521865$var$createDatabase(dbName);\n return $736431a7b9521865$var$databaseCache[dbName];\n}\nfunction $736431a7b9521865$var$dbPromise(db, storeName, readOnlyOrReadWrite, cb) {\n return new Promise((resolve, reject)=>{\n // Use relaxed durability because neither the emoji data nor the favorites/preferred skin tone\n // are really irreplaceable data. IndexedDB is just a cache in this case.\n const txn = db.transaction(storeName, readOnlyOrReadWrite, {\n durability: \"relaxed\"\n });\n const store = typeof storeName === \"string\" ? txn.objectStore(storeName) : storeName.map((name)=>txn.objectStore(name));\n let res;\n cb(store, txn, (result)=>{\n res = result;\n });\n txn.oncomplete = ()=>resolve(res);\n /* istanbul ignore next */ txn.onerror = ()=>reject(txn.error);\n });\n}\nfunction $736431a7b9521865$var$closeDatabase(dbName) {\n // close any open requests\n const req = $736431a7b9521865$var$openIndexedDBRequests[dbName];\n const db = req && req.result;\n if (db) {\n db.close();\n const listeners = $736431a7b9521865$var$onCloseListeners[dbName];\n /* istanbul ignore else */ if (listeners) for (const listener of listeners)listener();\n }\n delete $736431a7b9521865$var$openIndexedDBRequests[dbName];\n delete $736431a7b9521865$var$databaseCache[dbName];\n delete $736431a7b9521865$var$onCloseListeners[dbName];\n}\nfunction $736431a7b9521865$var$deleteDatabase(dbName) {\n return new Promise((resolve, reject)=>{\n // close any open requests\n $736431a7b9521865$var$closeDatabase(dbName);\n const req = indexedDB.deleteDatabase(dbName);\n $736431a7b9521865$var$handleOpenOrDeleteReq(resolve, reject, req);\n });\n}\n// The \"close\" event occurs during an abnormal shutdown, e.g. a user clearing their browser data.\n// However, it doesn't occur with the normal \"close\" event, so we handle that separately.\n// https://www.w3.org/TR/IndexedDB/#close-a-database-connection\nfunction $736431a7b9521865$var$addOnCloseListener(dbName, listener) {\n let listeners = $736431a7b9521865$var$onCloseListeners[dbName];\n if (!listeners) listeners = $736431a7b9521865$var$onCloseListeners[dbName] = [];\n listeners.push(listener);\n}\n// list of emoticons that don't match a simple \\W+ regex\n// extracted using:\n// require('emoji-picker-element-data/en/emojibase/data.json').map(_ => _.emoticon).filter(Boolean).filter(_ => !/^\\W+$/.test(_))\nconst $736431a7b9521865$var$irregularEmoticons = new Set([\n \":D\",\n \"XD\",\n \":'D\",\n \"O:)\",\n \":X\",\n \":P\",\n \";P\",\n \"XP\",\n \":L\",\n \":Z\",\n \":j\",\n \"8D\",\n \"XO\",\n \"8)\",\n \":B\",\n \":O\",\n \":S\",\n \":'o\",\n \"Dx\",\n \"X(\",\n \"D:\",\n \":C\",\n \">0)\",\n \":3\",\n \"{\n if (!word.match(/\\w/) || $736431a7b9521865$var$irregularEmoticons.has(word)) // for pure emoticons like :) or :-), just leave them as-is\n return word.toLowerCase();\n return word.replace(/[)(:,]/g, \"\").replace(/’/g, \"'\").toLowerCase();\n }).filter(Boolean);\n}\nconst $736431a7b9521865$var$MIN_SEARCH_TEXT_LENGTH = 2;\n// This is an extra step in addition to extractTokens(). The difference here is that we expect\n// the input to have already been run through extractTokens(). This is useful for cases like\n// emoticons, where we don't want to do any tokenization (because it makes no sense to split up\n// \">:)\" by the colon) but we do want to lowercase it to have consistent search results, so that\n// the user can type ':P' or ':p' and still get the same result.\nfunction $736431a7b9521865$var$normalizeTokens(str) {\n return str.filter(Boolean).map((_)=>_.toLowerCase()).filter((_)=>_.length >= $736431a7b9521865$var$MIN_SEARCH_TEXT_LENGTH);\n}\n// Transform emoji data for storage in IDB\nfunction $736431a7b9521865$var$transformEmojiData(emojiData) {\n const res = emojiData.map(({ annotation: annotation, emoticon: emoticon, group: group, order: order, shortcodes: shortcodes, skins: skins, tags: tags, emoji: emoji, version: version })=>{\n const tokens = [\n ...new Set($736431a7b9521865$var$normalizeTokens([\n ...(shortcodes || []).map($736431a7b9521865$var$extractTokens).flat(),\n ...(tags || []).map($736431a7b9521865$var$extractTokens).flat(),\n ...$736431a7b9521865$var$extractTokens(annotation),\n emoticon\n ]))\n ].sort();\n const res = {\n annotation: annotation,\n group: group,\n order: order,\n tags: tags,\n tokens: tokens,\n unicode: emoji,\n version: version\n };\n if (emoticon) res.emoticon = emoticon;\n if (shortcodes) res.shortcodes = shortcodes;\n if (skins) {\n res.skinTones = [];\n res.skinUnicodes = [];\n res.skinVersions = [];\n for (const { tone: tone, emoji: emoji, version: version } of skins){\n res.skinTones.push(tone);\n res.skinUnicodes.push(emoji);\n res.skinVersions.push(version);\n }\n }\n return res;\n });\n return res;\n}\n// helper functions that help compress the code better\nfunction $736431a7b9521865$var$callStore(store, method, key, cb) {\n store[method](key).onsuccess = (e)=>cb && cb(e.target.result);\n}\nfunction $736431a7b9521865$var$getIDB(store, key, cb) {\n $736431a7b9521865$var$callStore(store, \"get\", key, cb);\n}\nfunction $736431a7b9521865$var$getAllIDB(store, key, cb) {\n $736431a7b9521865$var$callStore(store, \"getAll\", key, cb);\n}\nfunction $736431a7b9521865$var$commit(txn) {\n /* istanbul ignore else */ if (txn.commit) txn.commit();\n}\n// like lodash's minBy\nfunction $736431a7b9521865$var$minBy(array, func) {\n let minItem = array[0];\n for(let i = 1; i < array.length; i++){\n const item = array[i];\n if (func(minItem) > func(item)) minItem = item;\n }\n return minItem;\n}\n// return an array of results representing all items that are found in each one of the arrays\n//\nfunction $736431a7b9521865$var$findCommonMembers(arrays, uniqByFunc) {\n const shortestArray = $736431a7b9521865$var$minBy(arrays, (_)=>_.length);\n const results = [];\n for (const item of shortestArray)// if this item is included in every array in the intermediate results, add it to the final results\n if (!arrays.some((array)=>array.findIndex((_)=>uniqByFunc(_) === uniqByFunc(item)) === -1)) results.push(item);\n return results;\n}\nasync function $736431a7b9521865$var$isEmpty(db) {\n return !await $736431a7b9521865$var$get(db, $736431a7b9521865$var$STORE_KEYVALUE, $736431a7b9521865$var$KEY_URL);\n}\nasync function $736431a7b9521865$var$hasData(db, url, eTag) {\n const [oldETag, oldUrl] = await Promise.all([\n $736431a7b9521865$var$KEY_ETAG,\n $736431a7b9521865$var$KEY_URL\n ].map((key)=>$736431a7b9521865$var$get(db, $736431a7b9521865$var$STORE_KEYVALUE, key)));\n return oldETag === eTag && oldUrl === url;\n}\nasync function $736431a7b9521865$var$doFullDatabaseScanForSingleResult(db, predicate) {\n // This batching algorithm is just a perf improvement over a basic\n // cursor. The BATCH_SIZE is an estimate of what would give the best\n // perf for doing a full DB scan (worst case).\n //\n // Mini-benchmark for determining the best batch size:\n //\n // PERF=1 pnpm build:rollup && pnpm test:adhoc\n //\n // (async () => {\n // performance.mark('start')\n // await $('emoji-picker').database.getEmojiByShortcode('doesnotexist')\n // performance.measure('total', 'start')\n // console.log(performance.getEntriesByName('total').slice(-1)[0].duration)\n // })()\n const BATCH_SIZE = 50; // Typically around 150ms for 6x slowdown in Chrome for above benchmark\n return $736431a7b9521865$var$dbPromise(db, $736431a7b9521865$var$STORE_EMOJI, $736431a7b9521865$var$MODE_READONLY, (emojiStore, txn, cb)=>{\n let lastKey;\n const processNextBatch = ()=>{\n emojiStore.getAll(lastKey && IDBKeyRange.lowerBound(lastKey, true), BATCH_SIZE).onsuccess = (e)=>{\n const results = e.target.result;\n for (const result of results){\n lastKey = result.unicode;\n if (predicate(result)) return cb(result);\n }\n if (results.length < BATCH_SIZE) return cb();\n processNextBatch();\n };\n };\n processNextBatch();\n });\n}\nasync function $736431a7b9521865$var$loadData(db, emojiData, url, eTag) {\n {\n const transformedData = $736431a7b9521865$var$transformEmojiData(emojiData);\n await $736431a7b9521865$var$dbPromise(db, [\n $736431a7b9521865$var$STORE_EMOJI,\n $736431a7b9521865$var$STORE_KEYVALUE\n ], $736431a7b9521865$var$MODE_READWRITE, ([emojiStore, metaStore], txn)=>{\n let oldETag;\n let oldUrl;\n let todo = 0;\n function checkFetched() {\n if (++todo === 2) onFetched();\n }\n function onFetched() {\n if (oldETag === eTag && oldUrl === url) // check again within the transaction to guard against concurrency, e.g. multiple browser tabs\n return;\n // delete old data\n emojiStore.clear();\n // insert new data\n for (const data of transformedData)emojiStore.put(data);\n metaStore.put(eTag, $736431a7b9521865$var$KEY_ETAG);\n metaStore.put(url, $736431a7b9521865$var$KEY_URL);\n $736431a7b9521865$var$commit(txn);\n }\n $736431a7b9521865$var$getIDB(metaStore, $736431a7b9521865$var$KEY_ETAG, (result)=>{\n oldETag = result;\n checkFetched();\n });\n $736431a7b9521865$var$getIDB(metaStore, $736431a7b9521865$var$KEY_URL, (result)=>{\n oldUrl = result;\n checkFetched();\n });\n });\n }\n}\nasync function $736431a7b9521865$var$getEmojiByGroup(db, group) {\n return $736431a7b9521865$var$dbPromise(db, $736431a7b9521865$var$STORE_EMOJI, $736431a7b9521865$var$MODE_READONLY, (emojiStore, txn, cb)=>{\n const range = IDBKeyRange.bound([\n group,\n 0\n ], [\n group + 1,\n 0\n ], false, true);\n $736431a7b9521865$var$getAllIDB(emojiStore.index($736431a7b9521865$var$INDEX_GROUP_AND_ORDER), range, cb);\n });\n}\nasync function $736431a7b9521865$var$getEmojiBySearchQuery(db, query) {\n const tokens = $736431a7b9521865$var$normalizeTokens($736431a7b9521865$var$extractTokens(query));\n if (!tokens.length) return [];\n return $736431a7b9521865$var$dbPromise(db, $736431a7b9521865$var$STORE_EMOJI, $736431a7b9521865$var$MODE_READONLY, (emojiStore, txn, cb)=>{\n // get all results that contain all tokens (i.e. an AND query)\n const intermediateResults = [];\n const checkDone = ()=>{\n if (intermediateResults.length === tokens.length) onDone();\n };\n const onDone = ()=>{\n const results = $736431a7b9521865$var$findCommonMembers(intermediateResults, (_)=>_.unicode);\n cb(results.sort((a, b)=>a.order < b.order ? -1 : 1));\n };\n for(let i = 0; i < tokens.length; i++){\n const token = tokens[i];\n const range = i === tokens.length - 1 ? IDBKeyRange.bound(token, token + \"\\uFFFF\", false, true) // treat last token as a prefix search\n : IDBKeyRange.only(token); // treat all other tokens as an exact match\n $736431a7b9521865$var$getAllIDB(emojiStore.index($736431a7b9521865$var$INDEX_TOKENS), range, (result)=>{\n intermediateResults.push(result);\n checkDone();\n });\n }\n });\n}\n// This could have been implemented as an IDB index on shortcodes, but it seemed wasteful to do that\n// when we can already query by tokens and this will give us what we're looking for 99.9% of the time\nasync function $736431a7b9521865$var$getEmojiByShortcode(db, shortcode) {\n const emojis = await $736431a7b9521865$var$getEmojiBySearchQuery(db, shortcode);\n // In very rare cases (e.g. the shortcode \"v\" as in \"v for victory\"), we cannot search because\n // there are no usable tokens (too short in this case). In that case, we have to do an inefficient\n // full-database scan, which I believe is an acceptable tradeoff for not having to have an extra\n // index on shortcodes.\n if (!emojis.length) {\n const predicate = (_)=>(_.shortcodes || []).includes(shortcode.toLowerCase());\n return await $736431a7b9521865$var$doFullDatabaseScanForSingleResult(db, predicate) || null;\n }\n return emojis.filter((_)=>{\n const lowerShortcodes = (_.shortcodes || []).map((_)=>_.toLowerCase());\n return lowerShortcodes.includes(shortcode.toLowerCase());\n })[0] || null;\n}\nasync function $736431a7b9521865$var$getEmojiByUnicode(db, unicode) {\n return $736431a7b9521865$var$dbPromise(db, $736431a7b9521865$var$STORE_EMOJI, $736431a7b9521865$var$MODE_READONLY, (emojiStore, txn, cb)=>$736431a7b9521865$var$getIDB(emojiStore, unicode, (result)=>{\n if (result) return cb(result);\n $736431a7b9521865$var$getIDB(emojiStore.index($736431a7b9521865$var$INDEX_SKIN_UNICODE), unicode, (result)=>cb(result || null));\n }));\n}\nfunction $736431a7b9521865$var$get(db, storeName, key) {\n return $736431a7b9521865$var$dbPromise(db, storeName, $736431a7b9521865$var$MODE_READONLY, (store, txn, cb)=>$736431a7b9521865$var$getIDB(store, key, cb));\n}\nfunction $736431a7b9521865$var$set(db, storeName, key, value) {\n return $736431a7b9521865$var$dbPromise(db, storeName, $736431a7b9521865$var$MODE_READWRITE, (store, txn)=>{\n store.put(value, key);\n $736431a7b9521865$var$commit(txn);\n });\n}\nfunction $736431a7b9521865$var$incrementFavoriteEmojiCount(db, unicode) {\n return $736431a7b9521865$var$dbPromise(db, $736431a7b9521865$var$STORE_FAVORITES, $736431a7b9521865$var$MODE_READWRITE, (store, txn)=>$736431a7b9521865$var$getIDB(store, unicode, (result)=>{\n store.put((result || 0) + 1, unicode);\n $736431a7b9521865$var$commit(txn);\n }));\n}\nfunction $736431a7b9521865$var$getTopFavoriteEmoji(db, customEmojiIndex, limit) {\n if (limit === 0) return [];\n return $736431a7b9521865$var$dbPromise(db, [\n $736431a7b9521865$var$STORE_FAVORITES,\n $736431a7b9521865$var$STORE_EMOJI\n ], $736431a7b9521865$var$MODE_READONLY, ([favoritesStore, emojiStore], txn, cb)=>{\n const results = [];\n favoritesStore.index($736431a7b9521865$var$INDEX_COUNT).openCursor(undefined, \"prev\").onsuccess = (e)=>{\n const cursor = e.target.result;\n if (!cursor) return cb(results);\n function addResult(result) {\n results.push(result);\n if (results.length === limit) return cb(results) // done, reached the limit\n ;\n cursor.continue();\n }\n const unicodeOrName = cursor.primaryKey;\n const custom = customEmojiIndex.byName(unicodeOrName);\n if (custom) return addResult(custom);\n // This could be done in parallel (i.e. make the cursor and the get()s parallelized),\n // but my testing suggests it's not actually faster.\n $736431a7b9521865$var$getIDB(emojiStore, unicodeOrName, (emoji)=>{\n if (emoji) return addResult(emoji);\n // emoji not found somehow, ignore (may happen if custom emoji change)\n cursor.continue();\n });\n };\n });\n}\n// trie data structure for prefix searches\n// loosely based on https://github.com/nolanlawson/substring-trie\nconst $736431a7b9521865$var$CODA_MARKER = \"\"; // marks the end of the string\nfunction $736431a7b9521865$var$trie(arr, itemToTokens) {\n const map = new Map();\n for (const item of arr){\n const tokens = itemToTokens(item);\n for (const token of tokens){\n let currentMap = map;\n for(let i = 0; i < token.length; i++){\n const char = token.charAt(i);\n let nextMap = currentMap.get(char);\n if (!nextMap) {\n nextMap = new Map();\n currentMap.set(char, nextMap);\n }\n currentMap = nextMap;\n }\n let valuesAtCoda = currentMap.get($736431a7b9521865$var$CODA_MARKER);\n if (!valuesAtCoda) {\n valuesAtCoda = [];\n currentMap.set($736431a7b9521865$var$CODA_MARKER, valuesAtCoda);\n }\n valuesAtCoda.push(item);\n }\n }\n const search = (query, exact)=>{\n let currentMap = map;\n for(let i = 0; i < query.length; i++){\n const char = query.charAt(i);\n const nextMap = currentMap.get(char);\n if (nextMap) currentMap = nextMap;\n else return [];\n }\n if (exact) {\n const results = currentMap.get($736431a7b9521865$var$CODA_MARKER);\n return results || [];\n }\n const results = [];\n // traverse\n const queue = [\n currentMap\n ];\n while(queue.length){\n const currentMap = queue.shift();\n const entriesSortedByKey = [\n ...currentMap.entries()\n ].sort((a, b)=>a[0] < b[0] ? -1 : 1);\n for (const [key, value] of entriesSortedByKey)if (key === $736431a7b9521865$var$CODA_MARKER) results.push(...value);\n else queue.push(value);\n }\n return results;\n };\n return search;\n}\nconst $736431a7b9521865$var$requiredKeys$1 = [\n \"name\",\n \"url\"\n];\nfunction $736431a7b9521865$var$assertCustomEmojis(customEmojis) {\n const isArray = customEmojis && Array.isArray(customEmojis);\n const firstItemIsFaulty = isArray && customEmojis.length && (!customEmojis[0] || $736431a7b9521865$var$requiredKeys$1.some((key)=>!(key in customEmojis[0])));\n if (!isArray || firstItemIsFaulty) throw new Error(\"Custom emojis are in the wrong format\");\n}\nfunction $736431a7b9521865$var$customEmojiIndex(customEmojis) {\n $736431a7b9521865$var$assertCustomEmojis(customEmojis);\n const sortByName = (a, b)=>a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1;\n //\n // all()\n //\n const all = customEmojis.sort(sortByName);\n //\n // search()\n //\n const emojiToTokens = (emoji)=>{\n const set = new Set();\n if (emoji.shortcodes) {\n for (const shortcode of emoji.shortcodes)for (const token of $736431a7b9521865$var$extractTokens(shortcode))set.add(token);\n }\n return set;\n };\n const searchTrie = $736431a7b9521865$var$trie(customEmojis, emojiToTokens);\n const searchByExactMatch = (_)=>searchTrie(_, true);\n const searchByPrefix = (_)=>searchTrie(_, false);\n // Search by query for custom emoji. Similar to how we do this in IDB, the last token\n // is treated as a prefix search, but every other one is treated as an exact match.\n // Then we AND the results together\n const search = (query)=>{\n const tokens = $736431a7b9521865$var$extractTokens(query);\n const intermediateResults = tokens.map((token, i)=>(i < tokens.length - 1 ? searchByExactMatch : searchByPrefix)(token));\n return $736431a7b9521865$var$findCommonMembers(intermediateResults, (_)=>_.name).sort(sortByName);\n };\n //\n // byShortcode, byName\n //\n const shortcodeToEmoji = new Map();\n const nameToEmoji = new Map();\n for (const customEmoji of customEmojis){\n nameToEmoji.set(customEmoji.name.toLowerCase(), customEmoji);\n for (const shortcode of customEmoji.shortcodes || [])shortcodeToEmoji.set(shortcode.toLowerCase(), customEmoji);\n }\n const byShortcode = (shortcode)=>shortcodeToEmoji.get(shortcode.toLowerCase());\n const byName = (name)=>nameToEmoji.get(name.toLowerCase());\n return {\n all: all,\n search: search,\n byShortcode: byShortcode,\n byName: byName\n };\n}\nconst $736431a7b9521865$var$isFirefoxContentScript = typeof wrappedJSObject !== \"undefined\";\n// remove some internal implementation details, i.e. the \"tokens\" array on the emoji object\n// essentially, convert the emoji from the version stored in IDB to the version used in-memory\nfunction $736431a7b9521865$var$cleanEmoji(emoji) {\n if (!emoji) return emoji;\n // if inside a Firefox content script, need to clone the emoji object to prevent Firefox from complaining about\n // cross-origin object. See: https://github.com/nolanlawson/emoji-picker-element/issues/356\n /* istanbul ignore if */ if ($736431a7b9521865$var$isFirefoxContentScript) emoji = structuredClone(emoji);\n delete emoji.tokens;\n if (emoji.skinTones) {\n const len = emoji.skinTones.length;\n emoji.skins = Array(len);\n for(let i = 0; i < len; i++)emoji.skins[i] = {\n tone: emoji.skinTones[i],\n unicode: emoji.skinUnicodes[i],\n version: emoji.skinVersions[i]\n };\n delete emoji.skinTones;\n delete emoji.skinUnicodes;\n delete emoji.skinVersions;\n }\n return emoji;\n}\nfunction $736431a7b9521865$var$warnETag(eTag) {\n if (!eTag) console.warn(\"emoji-picker-element is more efficient if the dataSource server exposes an ETag header.\");\n}\nconst $736431a7b9521865$var$requiredKeys = [\n \"annotation\",\n \"emoji\",\n \"group\",\n \"order\",\n \"version\"\n];\nfunction $736431a7b9521865$var$assertEmojiData(emojiData) {\n if (!emojiData || !Array.isArray(emojiData) || !emojiData[0] || typeof emojiData[0] !== \"object\" || $736431a7b9521865$var$requiredKeys.some((key)=>!(key in emojiData[0]))) throw new Error(\"Emoji data is in the wrong format\");\n}\nfunction $736431a7b9521865$var$assertStatus(response, dataSource) {\n if (Math.floor(response.status / 100) !== 2) throw new Error(\"Failed to fetch: \" + dataSource + \": \" + response.status);\n}\nasync function $736431a7b9521865$var$getETag(dataSource) {\n const response = await fetch(dataSource, {\n method: \"HEAD\"\n });\n $736431a7b9521865$var$assertStatus(response, dataSource);\n const eTag = response.headers.get(\"etag\");\n $736431a7b9521865$var$warnETag(eTag);\n return eTag;\n}\nasync function $736431a7b9521865$var$getETagAndData(dataSource) {\n const response = await fetch(dataSource);\n $736431a7b9521865$var$assertStatus(response, dataSource);\n const eTag = response.headers.get(\"etag\");\n $736431a7b9521865$var$warnETag(eTag);\n const emojiData = await response.json();\n $736431a7b9521865$var$assertEmojiData(emojiData);\n return [\n eTag,\n emojiData\n ];\n}\n// TODO: including these in blob-util.ts causes typedoc to generate docs for them,\n// even with --excludePrivate ¯\\_(ツ)_/¯\n/** @private */ /**\n * Convert an `ArrayBuffer` to a binary string.\n *\n * Example:\n *\n * ```js\n * var myString = blobUtil.arrayBufferToBinaryString(arrayBuff)\n * ```\n *\n * @param buffer - array buffer\n * @returns binary string\n */ function $736431a7b9521865$var$arrayBufferToBinaryString(buffer) {\n var binary = \"\";\n var bytes = new Uint8Array(buffer);\n var length = bytes.byteLength;\n var i = -1;\n while(++i < length)binary += String.fromCharCode(bytes[i]);\n return binary;\n}\n/**\n * Convert a binary string to an `ArrayBuffer`.\n *\n * ```js\n * var myBuffer = blobUtil.binaryStringToArrayBuffer(binaryString)\n * ```\n *\n * @param binary - binary string\n * @returns array buffer\n */ function $736431a7b9521865$var$binaryStringToArrayBuffer(binary) {\n var length = binary.length;\n var buf = new ArrayBuffer(length);\n var arr = new Uint8Array(buf);\n var i = -1;\n while(++i < length)arr[i] = binary.charCodeAt(i);\n return buf;\n}\n// generate a checksum based on the stringified JSON\nasync function $736431a7b9521865$var$jsonChecksum(object) {\n const inString = JSON.stringify(object);\n let inBuffer = $736431a7b9521865$var$binaryStringToArrayBuffer(inString);\n // this does not need to be cryptographically secure, SHA-1 is fine\n const outBuffer = await crypto.subtle.digest(\"SHA-1\", inBuffer);\n const outBinString = $736431a7b9521865$var$arrayBufferToBinaryString(outBuffer);\n const res = btoa(outBinString);\n return res;\n}\nasync function $736431a7b9521865$var$checkForUpdates(db, dataSource) {\n // just do a simple HEAD request first to see if the eTags match\n let emojiData;\n let eTag = await $736431a7b9521865$var$getETag(dataSource);\n if (!eTag) {\n const eTagAndData = await $736431a7b9521865$var$getETagAndData(dataSource);\n eTag = eTagAndData[0];\n emojiData = eTagAndData[1];\n if (!eTag) eTag = await $736431a7b9521865$var$jsonChecksum(emojiData);\n }\n if (await $736431a7b9521865$var$hasData(db, dataSource, eTag)) ;\n else {\n if (!emojiData) {\n const eTagAndData = await $736431a7b9521865$var$getETagAndData(dataSource);\n emojiData = eTagAndData[1];\n }\n await $736431a7b9521865$var$loadData(db, emojiData, dataSource, eTag);\n }\n}\nasync function $736431a7b9521865$var$loadDataForFirstTime(db, dataSource) {\n let [eTag, emojiData] = await $736431a7b9521865$var$getETagAndData(dataSource);\n if (!eTag) // Handle lack of support for ETag or Access-Control-Expose-Headers\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers#Browser_compatibility\n eTag = await $736431a7b9521865$var$jsonChecksum(emojiData);\n await $736431a7b9521865$var$loadData(db, emojiData, dataSource, eTag);\n}\nclass $736431a7b9521865$export$2e2bcd8739ae039 {\n constructor({ dataSource: dataSource = $736431a7b9521865$var$DEFAULT_DATA_SOURCE, locale: locale = $736431a7b9521865$var$DEFAULT_LOCALE, customEmoji: customEmoji = [] } = {}){\n this.dataSource = dataSource;\n this.locale = locale;\n this._dbName = `emoji-picker-element-${this.locale}`;\n this._db = undefined;\n this._lazyUpdate = undefined;\n this._custom = $736431a7b9521865$var$customEmojiIndex(customEmoji);\n this._clear = this._clear.bind(this);\n this._ready = this._init();\n }\n async _init() {\n const db = this._db = await $736431a7b9521865$var$openDatabase(this._dbName);\n $736431a7b9521865$var$addOnCloseListener(this._dbName, this._clear);\n const dataSource = this.dataSource;\n const empty = await $736431a7b9521865$var$isEmpty(db);\n if (empty) await $736431a7b9521865$var$loadDataForFirstTime(db, dataSource);\n else this._lazyUpdate = $736431a7b9521865$var$checkForUpdates(db, dataSource);\n }\n async ready() {\n const checkReady = async ()=>{\n if (!this._ready) this._ready = this._init();\n return this._ready;\n };\n await checkReady();\n // There's a possibility of a race condition where the element gets added, removed, and then added again\n // with a particular timing, which would set the _db to undefined.\n // We *could* do a while loop here, but that seems excessive and could lead to an infinite loop.\n if (!this._db) await checkReady();\n }\n async getEmojiByGroup(group) {\n $736431a7b9521865$var$assertNumber(group);\n await this.ready();\n return $736431a7b9521865$var$uniqEmoji(await $736431a7b9521865$var$getEmojiByGroup(this._db, group)).map($736431a7b9521865$var$cleanEmoji);\n }\n async getEmojiBySearchQuery(query) {\n $736431a7b9521865$var$assertNonEmptyString(query);\n await this.ready();\n const customs = this._custom.search(query);\n const natives = $736431a7b9521865$var$uniqEmoji(await $736431a7b9521865$var$getEmojiBySearchQuery(this._db, query)).map($736431a7b9521865$var$cleanEmoji);\n return [\n ...customs,\n ...natives\n ];\n }\n async getEmojiByShortcode(shortcode) {\n $736431a7b9521865$var$assertNonEmptyString(shortcode);\n await this.ready();\n const custom = this._custom.byShortcode(shortcode);\n if (custom) return custom;\n return $736431a7b9521865$var$cleanEmoji(await $736431a7b9521865$var$getEmojiByShortcode(this._db, shortcode));\n }\n async getEmojiByUnicodeOrName(unicodeOrName) {\n $736431a7b9521865$var$assertNonEmptyString(unicodeOrName);\n await this.ready();\n const custom = this._custom.byName(unicodeOrName);\n if (custom) return custom;\n return $736431a7b9521865$var$cleanEmoji(await $736431a7b9521865$var$getEmojiByUnicode(this._db, unicodeOrName));\n }\n async getPreferredSkinTone() {\n await this.ready();\n return await $736431a7b9521865$var$get(this._db, $736431a7b9521865$var$STORE_KEYVALUE, $736431a7b9521865$var$KEY_PREFERRED_SKINTONE) || 0;\n }\n async setPreferredSkinTone(skinTone) {\n $736431a7b9521865$var$assertNumber(skinTone);\n await this.ready();\n return $736431a7b9521865$var$set(this._db, $736431a7b9521865$var$STORE_KEYVALUE, $736431a7b9521865$var$KEY_PREFERRED_SKINTONE, skinTone);\n }\n async incrementFavoriteEmojiCount(unicodeOrName) {\n $736431a7b9521865$var$assertNonEmptyString(unicodeOrName);\n await this.ready();\n return $736431a7b9521865$var$incrementFavoriteEmojiCount(this._db, unicodeOrName);\n }\n async getTopFavoriteEmoji(limit) {\n $736431a7b9521865$var$assertNumber(limit);\n await this.ready();\n return (await $736431a7b9521865$var$getTopFavoriteEmoji(this._db, this._custom, limit)).map($736431a7b9521865$var$cleanEmoji);\n }\n set customEmoji(customEmojis) {\n this._custom = $736431a7b9521865$var$customEmojiIndex(customEmojis);\n }\n get customEmoji() {\n return this._custom.all;\n }\n async _shutdown() {\n await this.ready(); // reopen if we've already been closed/deleted\n try {\n await this._lazyUpdate; // allow any lazy updates to process before closing/deleting\n } catch (err) {}\n }\n // clear references to IDB, e.g. during a close event\n _clear() {\n // We don't need to call removeEventListener or remove the manual \"close\" listeners.\n // The memory leak tests prove this is unnecessary. It's because:\n // 1) IDBDatabases that can no longer fire \"close\" automatically have listeners GCed\n // 2) we clear the manual close listeners in databaseLifecycle.js.\n this._db = this._ready = this._lazyUpdate = undefined;\n }\n async close() {\n await this._shutdown();\n await $736431a7b9521865$var$closeDatabase(this._dbName);\n }\n async delete() {\n await this._shutdown();\n await $736431a7b9521865$var$deleteDatabase(this._dbName);\n }\n}\n\n\n// via https://unpkg.com/browse/emojibase-data@6.0.0/meta/groups.json\nconst $9e9d3488b14d9168$var$allGroups = [\n [\n -1,\n \"\\u2728\",\n \"custom\"\n ],\n [\n 0,\n \"\\uD83D\\uDE00\",\n \"smileys-emotion\"\n ],\n [\n 1,\n \"\\uD83D\\uDC4B\",\n \"people-body\"\n ],\n [\n 3,\n \"\\uD83D\\uDC31\",\n \"animals-nature\"\n ],\n [\n 4,\n \"\\uD83C\\uDF4E\",\n \"food-drink\"\n ],\n [\n 5,\n \"\\uD83C\\uDFE0\\uFE0F\",\n \"travel-places\"\n ],\n [\n 6,\n \"\\u26BD\",\n \"activities\"\n ],\n [\n 7,\n \"\\uD83D\\uDCDD\",\n \"objects\"\n ],\n [\n 8,\n \"\\u26D4\\uFE0F\",\n \"symbols\"\n ],\n [\n 9,\n \"\\uD83C\\uDFC1\",\n \"flags\"\n ]\n].map(([id, emoji, name])=>({\n id: id,\n emoji: emoji,\n name: name\n }));\nconst $9e9d3488b14d9168$var$groups = $9e9d3488b14d9168$var$allGroups.slice(1);\nconst $9e9d3488b14d9168$var$MIN_SEARCH_TEXT_LENGTH = 2;\nconst $9e9d3488b14d9168$var$NUM_SKIN_TONES = 6;\n/* istanbul ignore next */ const $9e9d3488b14d9168$var$rIC = typeof requestIdleCallback === \"function\" ? requestIdleCallback : setTimeout;\n// check for ZWJ (zero width joiner) character\nfunction $9e9d3488b14d9168$var$hasZwj(emoji) {\n return emoji.unicode.includes(\"\\u200D\");\n}\n// Find one good representative emoji from each version to test by checking its color.\n// Ideally it should have color in the center. For some inspiration, see:\n// https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/\n//\n// Note that for certain versions (12.1, 13.1), there is no point in testing them explicitly, because\n// all the emoji from this version are compound-emoji from previous versions. So they would pass a color\n// test, even in browsers that display them as double emoji. (E.g. \"face in clouds\" might render as\n// \"face without mouth\" plus \"fog\".) These emoji can only be filtered using the width test,\n// which happens in checkZwjSupport.js.\nconst $9e9d3488b14d9168$var$versionsAndTestEmoji = {\n \"\\uD83E\\uDEE8\": 15.1,\n \"\\uD83E\\uDEE0\": 14,\n \"\\uD83E\\uDD72\": 13.1,\n \"\\uD83E\\uDD7B\": 12.1,\n \"\\uD83E\\uDD70\": 11,\n \"\\uD83E\\uDD29\": 5,\n \"\\uD83D\\uDC71\\u200D\\u2640\\uFE0F\": 4,\n \"\\uD83E\\uDD23\": 3,\n \"\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8\\uFE0F\": 2,\n \"\\uD83D\\uDE00\": 1,\n \"\\uD83D\\uDE10\\uFE0F\": 0.7,\n \"\\uD83D\\uDE03\": 0.6\n};\nconst $9e9d3488b14d9168$var$TIMEOUT_BEFORE_LOADING_MESSAGE = 1000; // 1 second\nconst $9e9d3488b14d9168$var$DEFAULT_SKIN_TONE_EMOJI = \"\\uD83D\\uDD90\\uFE0F\";\nconst $9e9d3488b14d9168$var$DEFAULT_NUM_COLUMNS = 8;\n// Based on https://fivethirtyeight.com/features/the-100-most-used-emojis/ and\n// https://blog.emojipedia.org/facebook-reveals-most-and-least-used-emojis/ with\n// a bit of my own curation. (E.g. avoid the \"OK\" gesture because of connotations:\n// https://emojipedia.org/ok-hand/)\nconst $9e9d3488b14d9168$var$MOST_COMMONLY_USED_EMOJI = [\n \"\\uD83D\\uDE0A\",\n \"\\uD83D\\uDE12\",\n \"\\u2764\\uFE0F\",\n \"\\uD83D\\uDC4D\\uFE0F\",\n \"\\uD83D\\uDE0D\",\n \"\\uD83D\\uDE02\",\n \"\\uD83D\\uDE2D\",\n \"\\u263A\\uFE0F\",\n \"\\uD83D\\uDE14\",\n \"\\uD83D\\uDE29\",\n \"\\uD83D\\uDE0F\",\n \"\\uD83D\\uDC95\",\n \"\\uD83D\\uDE4C\",\n \"\\uD83D\\uDE18\"\n];\n// It's important to list Twemoji Mozilla before everything else, because Mozilla bundles their\n// own font on some platforms (notably Windows and Linux as of this writing). Typically, Mozilla\n// updates faster than the underlying OS, and we don't want to render older emoji in one font and\n// newer emoji in another font:\n// https://github.com/nolanlawson/emoji-picker-element/pull/268#issuecomment-1073347283\nconst $9e9d3488b14d9168$var$FONT_FAMILY = '\"Twemoji Mozilla\",\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\",\"EmojiOne Color\",\"Android Emoji\",sans-serif';\n/* istanbul ignore next */ const $9e9d3488b14d9168$var$DEFAULT_CATEGORY_SORTING = (a, b)=>a < b ? -1 : a > b ? 1 : 0;\n// Test if an emoji is supported by rendering it to canvas and checking that the color is not black\n// See https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/\n// and https://www.npmjs.com/package/if-emoji for inspiration\n// This implementation is largely borrowed from if-emoji, adding the font-family\nconst $9e9d3488b14d9168$var$getTextFeature = (text, color)=>{\n const canvas = document.createElement(\"canvas\");\n canvas.width = canvas.height = 1;\n const ctx = canvas.getContext(\"2d\", {\n // Improves the performance of `getImageData()`\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/getContextAttributes#willreadfrequently\n willReadFrequently: true\n });\n ctx.textBaseline = \"top\";\n ctx.font = `100px ${$9e9d3488b14d9168$var$FONT_FAMILY}`;\n ctx.fillStyle = color;\n ctx.scale(0.01, 0.01);\n ctx.fillText(text, 0, 0);\n return ctx.getImageData(0, 0, 1, 1).data;\n};\nconst $9e9d3488b14d9168$var$compareFeatures = (feature1, feature2)=>{\n const feature1Str = [\n ...feature1\n ].join(\",\");\n const feature2Str = [\n ...feature2\n ].join(\",\");\n // This is RGBA, so for 0,0,0, we are checking that the first RGB is not all zeroes.\n // Most of the time when unsupported this is 0,0,0,0, but on Chrome on Mac it is\n // 0,0,0,61 - there is a transparency here.\n return feature1Str === feature2Str && !feature1Str.startsWith(\"0,0,0,\");\n};\nfunction $9e9d3488b14d9168$var$testColorEmojiSupported(text) {\n // Render white and black and then compare them to each other and ensure they're the same\n // color, and neither one is black. This shows that the emoji was rendered in color.\n const feature1 = $9e9d3488b14d9168$var$getTextFeature(text, \"#000\");\n const feature2 = $9e9d3488b14d9168$var$getTextFeature(text, \"#fff\");\n return feature1 && feature2 && $9e9d3488b14d9168$var$compareFeatures(feature1, feature2);\n}\n// rather than check every emoji ever, which would be expensive, just check some representatives from the\n// different emoji releases to determine what the font supports\nfunction $9e9d3488b14d9168$var$determineEmojiSupportLevel() {\n const entries = Object.entries($9e9d3488b14d9168$var$versionsAndTestEmoji);\n try {\n // start with latest emoji and work backwards\n for (const [emoji, version] of entries){\n if ($9e9d3488b14d9168$var$testColorEmojiSupported(emoji)) return version;\n }\n } catch (e) {} finally{}\n // In case of an error, be generous and just assume all emoji are supported (e.g. for canvas errors\n // due to anti-fingerprinting add-ons). Better to show some gray boxes than nothing at all.\n return entries[0][1] // first one in the list is the most recent version\n ;\n}\n// Check which emojis we know for sure aren't supported, based on Unicode version level\nlet $9e9d3488b14d9168$var$promise;\nconst $9e9d3488b14d9168$var$detectEmojiSupportLevel = ()=>{\n if (!$9e9d3488b14d9168$var$promise) // Delay so it can run while the IDB database is being created by the browser (on another thread).\n // This helps especially with first load – we want to start pre-populating the database on the main thread,\n // and then wait for IDB to commit everything, and while waiting we run this check.\n $9e9d3488b14d9168$var$promise = new Promise((resolve)=>$9e9d3488b14d9168$var$rIC(()=>resolve($9e9d3488b14d9168$var$determineEmojiSupportLevel()) // delay so ideally this can run while IDB is first populating\n ));\n return $9e9d3488b14d9168$var$promise;\n};\n// determine which emojis containing ZWJ (zero width joiner) characters\n// are supported (rendered as one glyph) rather than unsupported (rendered as two or more glyphs)\nconst $9e9d3488b14d9168$var$supportedZwjEmojis = new Map();\nconst $9e9d3488b14d9168$var$VARIATION_SELECTOR = \"\\uFE0F\";\nconst $9e9d3488b14d9168$var$SKINTONE_MODIFIER = \"\\ud83c\";\nconst $9e9d3488b14d9168$var$ZWJ = \"\\u200D\";\nconst $9e9d3488b14d9168$var$LIGHT_SKIN_TONE = 0x1F3FB;\nconst $9e9d3488b14d9168$var$LIGHT_SKIN_TONE_MODIFIER = 0xdffb;\n// TODO: this is a naive implementation, we can improve it later\n// It's only used for the skintone picker, so as long as people don't customize with\n// really exotic emoji then it should work fine\nfunction $9e9d3488b14d9168$var$applySkinTone(str, skinTone) {\n if (skinTone === 0) return str;\n const zwjIndex = str.indexOf($9e9d3488b14d9168$var$ZWJ);\n if (zwjIndex !== -1) return str.substring(0, zwjIndex) + String.fromCodePoint($9e9d3488b14d9168$var$LIGHT_SKIN_TONE + skinTone - 1) + str.substring(zwjIndex);\n if (str.endsWith($9e9d3488b14d9168$var$VARIATION_SELECTOR)) str = str.substring(0, str.length - 1);\n return str + $9e9d3488b14d9168$var$SKINTONE_MODIFIER + String.fromCodePoint($9e9d3488b14d9168$var$LIGHT_SKIN_TONE_MODIFIER + skinTone - 1);\n}\nfunction $9e9d3488b14d9168$var$halt(event) {\n event.preventDefault();\n event.stopPropagation();\n}\n// Implementation left/right or up/down navigation, circling back when you\n// reach the start/end of the list\nfunction $9e9d3488b14d9168$var$incrementOrDecrement(decrement, val, arr) {\n val += decrement ? -1 : 1;\n if (val < 0) val = arr.length - 1;\n else if (val >= arr.length) val = 0;\n return val;\n}\n// like lodash's uniqBy but much smaller\nfunction $9e9d3488b14d9168$var$uniqBy(arr, func) {\n const set = new Set();\n const res = [];\n for (const item of arr){\n const key = func(item);\n if (!set.has(key)) {\n set.add(key);\n res.push(item);\n }\n }\n return res;\n}\n// We don't need all the data on every emoji, and there are specific things we need\n// for the UI, so build a \"view model\" from the emoji object we got from the database\nfunction $9e9d3488b14d9168$var$summarizeEmojisForUI(emojis, emojiSupportLevel) {\n const toSimpleSkinsMap = (skins)=>{\n const res = {};\n for (const skin of skins)// ignore arrays like [1, 2] with multiple skin tones\n // also ignore variants that are in an unsupported emoji version\n // (these do exist - variants from a different version than their base emoji)\n if (typeof skin.tone === \"number\" && skin.version <= emojiSupportLevel) res[skin.tone] = skin.unicode;\n return res;\n };\n return emojis.map(({ unicode: unicode, skins: skins, shortcodes: shortcodes, url: url, name: name, category: category, annotation: annotation })=>({\n unicode: unicode,\n name: name,\n shortcodes: shortcodes,\n url: url,\n category: category,\n annotation: annotation,\n id: unicode || name,\n skins: skins && toSimpleSkinsMap(skins)\n }));\n}\n// import rAF from one place so that the bundle size is a bit smaller\nconst $9e9d3488b14d9168$var$rAF = requestAnimationFrame;\n// \"Svelte action\"-like utility to detect layout changes via ResizeObserver.\n// If ResizeObserver is unsupported, we just use rAF once and don't bother to update.\nlet $9e9d3488b14d9168$var$resizeObserverSupported = typeof ResizeObserver === \"function\";\nfunction $9e9d3488b14d9168$var$resizeObserverAction(node, abortSignal, onUpdate) {\n let resizeObserver;\n if ($9e9d3488b14d9168$var$resizeObserverSupported) {\n resizeObserver = new ResizeObserver(onUpdate);\n resizeObserver.observe(node);\n } else $9e9d3488b14d9168$var$rAF(onUpdate);\n // cleanup function (called on destroy)\n abortSignal.addEventListener(\"abort\", ()=>{\n if (resizeObserver) resizeObserver.disconnect();\n });\n}\n// get the width of the text inside of a DOM node, via https://stackoverflow.com/a/59525891/680742\nfunction $9e9d3488b14d9168$var$calculateTextWidth(node) {\n // skip running this in jest/vitest because we don't need to check for emoji support in that environment\n /* istanbul ignore else */ {\n const range = document.createRange();\n range.selectNode(node.firstChild);\n return range.getBoundingClientRect().width;\n }\n}\nlet $9e9d3488b14d9168$var$baselineEmojiWidth;\n/**\n * Check if the given emojis containing ZWJ characters are supported by the current browser (don't render\n * as double characters) and return true if all are supported.\n * @param zwjEmojisToCheck\n * @param baselineEmoji\n * @param emojiToDomNode\n */ function $9e9d3488b14d9168$var$checkZwjSupport(zwjEmojisToCheck, baselineEmoji, emojiToDomNode) {\n let allSupported = true;\n for (const emoji of zwjEmojisToCheck){\n const domNode = emojiToDomNode(emoji);\n const emojiWidth = $9e9d3488b14d9168$var$calculateTextWidth(domNode);\n if (typeof $9e9d3488b14d9168$var$baselineEmojiWidth === \"undefined\") $9e9d3488b14d9168$var$baselineEmojiWidth = $9e9d3488b14d9168$var$calculateTextWidth(baselineEmoji);\n // On Windows, some supported emoji are ~50% bigger than the baseline emoji, but what we really want to guard\n // against are the ones that are 2x the size, because those are truly broken (person with red hair = person with\n // floating red wig, black cat = cat with black square, polar bear = bear with snowflake, etc.)\n // So here we set the threshold at 1.8 times the size of the baseline emoji.\n const supported = emojiWidth / 1.8 < $9e9d3488b14d9168$var$baselineEmojiWidth;\n $9e9d3488b14d9168$var$supportedZwjEmojis.set(emoji.unicode, supported);\n if (!supported) allSupported = false;\n }\n return allSupported;\n}\n// like lodash's uniq\nfunction $9e9d3488b14d9168$var$uniq(arr) {\n return $9e9d3488b14d9168$var$uniqBy(arr, (_)=>_);\n}\n// Note we put this in its own function outside Picker.js to avoid Svelte doing an invalidation on the \"setter\" here.\n// At best the invalidation is useless, at worst it can cause infinite loops:\n// https://github.com/nolanlawson/emoji-picker-element/pull/180\n// https://github.com/sveltejs/svelte/issues/6521\n// Also note tabpanelElement can be null if the element is disconnected immediately after connected\nfunction $9e9d3488b14d9168$var$resetScrollTopIfPossible(element) {\n /* istanbul ignore else */ if (element) element.scrollTop = 0;\n}\nfunction $9e9d3488b14d9168$var$getFromMap(cache, key, func) {\n let cached = cache.get(key);\n if (!cached) {\n cached = func();\n cache.set(key, cached);\n }\n return cached;\n}\nfunction $9e9d3488b14d9168$var$toString(value) {\n return \"\" + value;\n}\nfunction $9e9d3488b14d9168$var$parseTemplate(htmlString) {\n const template = document.createElement(\"template\");\n template.innerHTML = htmlString;\n return template;\n}\nconst $9e9d3488b14d9168$var$parseCache = new WeakMap();\nconst $9e9d3488b14d9168$var$domInstancesCache = new WeakMap();\n// This needs to be a symbol because it needs to be different from any possible output of a key function\nconst $9e9d3488b14d9168$var$unkeyedSymbol = Symbol(\"un-keyed\");\n// Not supported in Safari <=13\nconst $9e9d3488b14d9168$var$hasReplaceChildren = \"replaceChildren\" in Element.prototype;\nfunction $9e9d3488b14d9168$var$replaceChildren(parentNode, newChildren) {\n /* istanbul ignore else */ if ($9e9d3488b14d9168$var$hasReplaceChildren) parentNode.replaceChildren(...newChildren);\n else {\n parentNode.innerHTML = \"\";\n parentNode.append(...newChildren);\n }\n}\nfunction $9e9d3488b14d9168$var$doChildrenNeedRerender(parentNode, newChildren) {\n let oldChild = parentNode.firstChild;\n let oldChildrenCount = 0;\n // iterate using firstChild/nextSibling because browsers use a linked list under the hood\n while(oldChild){\n const newChild = newChildren[oldChildrenCount];\n // check if the old child and new child are the same\n if (newChild !== oldChild) return true;\n oldChild = oldChild.nextSibling;\n oldChildrenCount++;\n }\n // if new children length is different from old, we must re-render\n return oldChildrenCount !== newChildren.length;\n}\nfunction $9e9d3488b14d9168$var$patchChildren(newChildren, instanceBinding) {\n const { targetNode: targetNode } = instanceBinding;\n let { targetParentNode: targetParentNode } = instanceBinding;\n let needsRerender = false;\n if (targetParentNode) needsRerender = $9e9d3488b14d9168$var$doChildrenNeedRerender(targetParentNode, newChildren);\n else {\n needsRerender = true;\n instanceBinding.targetNode = undefined; // placeholder node not needed anymore, free memory\n instanceBinding.targetParentNode = targetParentNode = targetNode.parentNode;\n }\n // avoid re-rendering list if the dom nodes are exactly the same before and after\n if (needsRerender) $9e9d3488b14d9168$var$replaceChildren(targetParentNode, newChildren);\n}\nfunction $9e9d3488b14d9168$var$patch(expressions, instanceBindings) {\n for (const instanceBinding of instanceBindings){\n const { targetNode: targetNode, currentExpression: currentExpression, binding: { expressionIndex: expressionIndex, attributeName: attributeName, attributeValuePre: attributeValuePre, attributeValuePost: attributeValuePost } } = instanceBinding;\n const expression = expressions[expressionIndex];\n if (currentExpression === expression) continue;\n instanceBinding.currentExpression = expression;\n if (attributeName) targetNode.setAttribute(attributeName, attributeValuePre + $9e9d3488b14d9168$var$toString(expression) + attributeValuePost);\n else {\n let newNode;\n if (Array.isArray(expression)) $9e9d3488b14d9168$var$patchChildren(expression, instanceBinding);\n else if (expression instanceof Element) {\n newNode = expression;\n targetNode.replaceWith(newNode);\n } else // nodeValue is faster than textContent supposedly https://www.youtube.com/watch?v=LY6y3HbDVmg\n // note we may be replacing the value in a placeholder text node\n targetNode.nodeValue = $9e9d3488b14d9168$var$toString(expression);\n if (newNode) instanceBinding.targetNode = newNode;\n }\n }\n}\nfunction $9e9d3488b14d9168$var$parse(tokens) {\n let htmlString = \"\";\n let withinTag = false;\n let withinAttribute = false;\n let elementIndexCounter = -1; // depth-first traversal order\n const elementsToBindings = new Map();\n const elementIndexes = [];\n for(let i = 0, len = tokens.length; i < len; i++){\n const token = tokens[i];\n htmlString += token;\n if (i === len - 1) break; // no need to process characters - no more expressions to be found\n for(let j = 0; j < token.length; j++){\n const char = token.charAt(j);\n switch(char){\n case \"<\":\n {\n const nextChar = token.charAt(j + 1);\n if (nextChar === \"/\") // leaving an element\n elementIndexes.pop();\n else {\n withinTag = true;\n elementIndexes.push(++elementIndexCounter);\n }\n break;\n }\n case \">\":\n withinTag = false;\n withinAttribute = false;\n break;\n case \"=\":\n withinAttribute = true;\n break;\n }\n }\n const elementIndex = elementIndexes[elementIndexes.length - 1];\n const bindings = $9e9d3488b14d9168$var$getFromMap(elementsToBindings, elementIndex, ()=>[]);\n let attributeName;\n let attributeValuePre;\n let attributeValuePost;\n if (withinAttribute) {\n // I never use single-quotes for attribute values in HTML, so just support double-quotes or no-quotes\n const match = /(\\S+)=\"?([^\"=]*)$/.exec(token);\n attributeName = match[1];\n attributeValuePre = match[2];\n attributeValuePost = /^[^\">]*/.exec(tokens[i + 1])[0];\n }\n const binding = {\n attributeName: attributeName,\n attributeValuePre: attributeValuePre,\n attributeValuePost: attributeValuePost,\n expressionIndex: i\n };\n bindings.push(binding);\n if (!withinTag && !withinAttribute) // Add a placeholder text node, so we can find it later. Note we only support one dynamic child text node\n htmlString += \" \";\n }\n const template = $9e9d3488b14d9168$var$parseTemplate(htmlString);\n return {\n template: template,\n elementsToBindings: elementsToBindings\n };\n}\nfunction $9e9d3488b14d9168$var$applyBindings(bindings, element, instanceBindings) {\n for(let i = 0; i < bindings.length; i++){\n const binding = bindings[i];\n const targetNode = binding.attributeName ? element // attribute binding, just use the element itself\n : element.firstChild; // not an attribute binding, so has a placeholder text node\n const instanceBinding = {\n binding: binding,\n targetNode: targetNode,\n targetParentNode: undefined,\n currentExpression: undefined\n };\n instanceBindings.push(instanceBinding);\n }\n}\nfunction $9e9d3488b14d9168$var$traverseAndSetupBindings(rootElement, elementsToBindings) {\n const instanceBindings = [];\n let topLevelBindings;\n if (elementsToBindings.size === 1 && (topLevelBindings = elementsToBindings.get(0))) // Optimization for the common case where there's only one element and one binding\n // Skip creating a TreeWalker entirely and just handle the root DOM element\n $9e9d3488b14d9168$var$applyBindings(topLevelBindings, rootElement, instanceBindings);\n else {\n // traverse dom\n const treeWalker = document.createTreeWalker(rootElement, NodeFilter.SHOW_ELEMENT);\n let element = rootElement;\n let elementIndex = -1;\n do {\n const bindings = elementsToBindings.get(++elementIndex);\n if (bindings) $9e9d3488b14d9168$var$applyBindings(bindings, element, instanceBindings);\n }while (element = treeWalker.nextNode());\n }\n return instanceBindings;\n}\nfunction $9e9d3488b14d9168$var$parseHtml(tokens) {\n // All templates and bound expressions are unique per tokens array\n const { template: template, elementsToBindings: elementsToBindings } = $9e9d3488b14d9168$var$getFromMap($9e9d3488b14d9168$var$parseCache, tokens, ()=>$9e9d3488b14d9168$var$parse(tokens));\n // When we parseHtml, we always return a fresh DOM instance ready to be updated\n const dom = template.cloneNode(true).content.firstElementChild;\n const instanceBindings = $9e9d3488b14d9168$var$traverseAndSetupBindings(dom, elementsToBindings);\n return function updateDomInstance(expressions) {\n $9e9d3488b14d9168$var$patch(expressions, instanceBindings);\n return dom;\n };\n}\nfunction $9e9d3488b14d9168$var$createFramework(state) {\n const domInstances = $9e9d3488b14d9168$var$getFromMap($9e9d3488b14d9168$var$domInstancesCache, state, ()=>new Map());\n let domInstanceCacheKey = $9e9d3488b14d9168$var$unkeyedSymbol;\n function html(tokens, ...expressions) {\n // Each unique lexical usage of map() is considered unique due to the html`` tagged template call it makes,\n // which has lexically unique tokens. The unkeyed symbol is just used for html`` usage outside of a map().\n const domInstancesForTokens = $9e9d3488b14d9168$var$getFromMap(domInstances, tokens, ()=>new Map());\n const updateDomInstance = $9e9d3488b14d9168$var$getFromMap(domInstancesForTokens, domInstanceCacheKey, ()=>$9e9d3488b14d9168$var$parseHtml(tokens));\n return updateDomInstance(expressions) // update with expressions\n ;\n }\n function map(array, callback, keyFunction) {\n return array.map((item, index)=>{\n const originalCacheKey = domInstanceCacheKey;\n domInstanceCacheKey = keyFunction(item);\n try {\n return callback(item, index);\n } finally{\n domInstanceCacheKey = originalCacheKey;\n }\n });\n }\n return {\n map: map,\n html: html\n };\n}\nfunction $9e9d3488b14d9168$var$render(container, state, helpers, events, actions, refs, abortSignal, actionContext, firstRender) {\n const { labelWithSkin: labelWithSkin, titleForEmoji: titleForEmoji, unicodeWithSkin: unicodeWithSkin } = helpers;\n const { html: html, map: map } = $9e9d3488b14d9168$var$createFramework(state);\n function emojiList(emojis, searchMode, prefix) {\n return map(emojis, (emoji, i)=>{\n return html``;\n // It's important for the cache key to be unique based on the prefix, because the framework caches based on the\n // unique tokens + cache key, and the same emoji may be used in the tab as well as in the fav bar\n }, (emoji)=>`${prefix}-${emoji.id}`);\n }\n const section = ()=>{\n return html`
${state.i18n.searchDescription}
${state.i18n.skinToneDescription}
${map(state.skinTones, (skinTone, i)=>{\n return html`
${skinTone}
`;\n }, (skinTone)=>skinTone)}
${map(state.groups, (group)=>{\n return html``;\n }, (group)=>group.id)}
${state.message || \"\"}
${map(state.currentEmojisWithCategories, (emojiWithCategory, i)=>{\n return html`
${state.searchMode ? state.i18n.searchResultsLabel : emojiWithCategory.category ? emojiWithCategory.category : state.currentEmojisWithCategories.length > 1 ? state.i18n.categories.custom : state.i18n.categories[state.currentGroup.name]}
${emojiList(emojiWithCategory.emojis, state.searchMode, /* prefix */ \"emo\")}
`;\n }, (emojiWithCategory)=>emojiWithCategory.category)}
${emojiList(state.currentFavorites, /* searchMode */ false, /* prefix */ \"fav\")}
`;\n };\n const rootDom = section();\n // helper for traversing the dom, finding elements by an attribute, and getting the attribute value\n const forElementWithAttribute = (attributeName, callback)=>{\n for (const element of container.querySelectorAll(`[${attributeName}]`))callback(element, element.getAttribute(attributeName));\n };\n if (firstRender) {\n container.appendChild(rootDom);\n // we only bind events/refs once - there is no need to find them again given this component structure\n // bind events\n for (const eventName of [\n \"click\",\n \"focusout\",\n \"input\",\n \"keydown\",\n \"keyup\"\n ])forElementWithAttribute(`data-on-${eventName}`, (element, listenerName)=>{\n element.addEventListener(eventName, events[listenerName]);\n });\n // find refs\n forElementWithAttribute(\"data-ref\", (element, ref)=>{\n refs[ref] = element;\n });\n // destroy/abort logic\n abortSignal.addEventListener(\"abort\", ()=>{\n container.removeChild(rootDom);\n });\n }\n // set up actions - these are re-bound on every render\n forElementWithAttribute(\"data-action\", (element, action)=>{\n let boundActions = actionContext.get(action);\n if (!boundActions) actionContext.set(action, boundActions = new WeakSet());\n // avoid applying the same action to the same element multiple times\n if (!boundActions.has(element)) {\n boundActions.add(element);\n actions[action](element);\n }\n });\n}\n/* istanbul ignore next */ const $9e9d3488b14d9168$var$qM = typeof queueMicrotask === \"function\" ? queueMicrotask : (callback)=>Promise.resolve().then(callback);\nfunction $9e9d3488b14d9168$var$createState(abortSignal) {\n let destroyed = false;\n let currentObserver;\n const propsToObservers = new Map();\n const dirtyObservers = new Set();\n let queued;\n const flush = ()=>{\n if (destroyed) return;\n const observersToRun = [\n ...dirtyObservers\n ];\n dirtyObservers.clear(); // clear before running to force any new updates to run in another tick of the loop\n try {\n for (const observer of observersToRun)observer();\n } finally{\n queued = false;\n if (dirtyObservers.size) {\n queued = true;\n $9e9d3488b14d9168$var$qM(flush);\n }\n }\n };\n const state = new Proxy({}, {\n get (target, prop) {\n if (currentObserver) {\n let observers = propsToObservers.get(prop);\n if (!observers) {\n observers = new Set();\n propsToObservers.set(prop, observers);\n }\n observers.add(currentObserver);\n }\n return target[prop];\n },\n set (target, prop, newValue) {\n if (target[prop] !== newValue) {\n target[prop] = newValue;\n const observers = propsToObservers.get(prop);\n if (observers) {\n for (const observer of observers)dirtyObservers.add(observer);\n if (!queued) {\n queued = true;\n $9e9d3488b14d9168$var$qM(flush);\n }\n }\n }\n return true;\n }\n });\n const createEffect = (callback)=>{\n const runnable = ()=>{\n const oldObserver = currentObserver;\n currentObserver = runnable;\n try {\n return callback();\n } finally{\n currentObserver = oldObserver;\n }\n };\n return runnable();\n };\n // destroy logic\n abortSignal.addEventListener(\"abort\", ()=>{\n destroyed = true;\n });\n return {\n state: state,\n createEffect: createEffect\n };\n}\n// Compare two arrays, with a function called on each item in the two arrays that returns true if the items are equal\nfunction $9e9d3488b14d9168$var$arraysAreEqualByFunction(left, right, areEqualFunc) {\n if (left.length !== right.length) return false;\n for(let i = 0; i < left.length; i++){\n if (!areEqualFunc(left[i], right[i])) return false;\n }\n return true;\n}\nconst $9e9d3488b14d9168$var$intersectionObserverCache = new WeakMap();\nfunction $9e9d3488b14d9168$var$intersectionObserverAction(node, abortSignal, listener) {\n /* istanbul ignore else */ {\n // The scroll root is always `.tabpanel`\n const root = node.closest(\".tabpanel\");\n let observer = $9e9d3488b14d9168$var$intersectionObserverCache.get(root);\n if (!observer) {\n // TODO: replace this with the contentvisibilityautostatechange event when all supported browsers support it.\n // For now we use IntersectionObserver because it has better cross-browser support, and it would be bad for\n // old Safari versions if they eagerly downloaded all custom emoji all at once.\n observer = new IntersectionObserver(listener, {\n root: root,\n // trigger if we are 1/2 scroll container height away so that the images load a bit quicker while scrolling\n rootMargin: \"50% 0px 50% 0px\",\n // trigger if any part of the emoji grid is intersecting\n threshold: 0\n });\n // avoid creating a new IntersectionObserver for every category; just use one for the whole root\n $9e9d3488b14d9168$var$intersectionObserverCache.set(root, observer);\n // assume that the abortSignal is always the same for this root node; just add one event listener\n abortSignal.addEventListener(\"abort\", ()=>{\n observer.disconnect();\n });\n }\n observer.observe(node);\n }\n}\n/* eslint-disable prefer-const,no-labels,no-inner-declarations */ // constants\nconst $9e9d3488b14d9168$var$EMPTY_ARRAY = [];\nconst { assign: $9e9d3488b14d9168$var$assign } = Object;\nfunction $9e9d3488b14d9168$var$createRoot(shadowRoot, props) {\n const refs = {};\n const abortController = new AbortController();\n const abortSignal = abortController.signal;\n const { state: state, createEffect: createEffect } = $9e9d3488b14d9168$var$createState(abortSignal);\n const actionContext = new Map();\n // initial state\n $9e9d3488b14d9168$var$assign(state, {\n skinToneEmoji: undefined,\n i18n: undefined,\n database: undefined,\n customEmoji: undefined,\n customCategorySorting: undefined,\n emojiVersion: undefined\n });\n // public props\n $9e9d3488b14d9168$var$assign(state, props);\n // private props\n $9e9d3488b14d9168$var$assign(state, {\n initialLoad: true,\n currentEmojis: [],\n currentEmojisWithCategories: [],\n rawSearchText: \"\",\n searchText: \"\",\n searchMode: false,\n activeSearchItem: -1,\n message: undefined,\n skinTonePickerExpanded: false,\n skinTonePickerExpandedAfterAnimation: false,\n currentSkinTone: 0,\n activeSkinTone: 0,\n skinToneButtonText: undefined,\n pickerStyle: undefined,\n skinToneButtonLabel: \"\",\n skinTones: [],\n currentFavorites: [],\n defaultFavoriteEmojis: undefined,\n numColumns: $9e9d3488b14d9168$var$DEFAULT_NUM_COLUMNS,\n isRtl: false,\n currentGroupIndex: 0,\n groups: $9e9d3488b14d9168$var$groups,\n databaseLoaded: false,\n activeSearchItemId: undefined\n });\n //\n // Update the current group based on the currentGroupIndex\n //\n createEffect(()=>{\n if (state.currentGroup !== state.groups[state.currentGroupIndex]) state.currentGroup = state.groups[state.currentGroupIndex];\n });\n //\n // Utils/helpers\n //\n const focus = (id)=>{\n shadowRoot.getElementById(id).focus();\n };\n const emojiToDomNode = (emoji)=>shadowRoot.getElementById(`emo-${emoji.id}`);\n // fire a custom event that crosses the shadow boundary\n const fireEvent = (name, detail)=>{\n refs.rootElement.dispatchEvent(new CustomEvent(name, {\n detail: detail,\n bubbles: true,\n composed: true\n }));\n };\n //\n // Comparison utils\n //\n const compareEmojiArrays = (a, b)=>a.id === b.id;\n const compareCurrentEmojisWithCategories = (a, b)=>{\n const { category: aCategory, emojis: aEmojis } = a;\n const { category: bCategory, emojis: bEmojis } = b;\n if (aCategory !== bCategory) return false;\n return $9e9d3488b14d9168$var$arraysAreEqualByFunction(aEmojis, bEmojis, compareEmojiArrays);\n };\n //\n // Update utils to avoid excessive re-renders\n //\n // avoid excessive re-renders by checking the value before setting\n const updateCurrentEmojis = (newEmojis)=>{\n if (!$9e9d3488b14d9168$var$arraysAreEqualByFunction(state.currentEmojis, newEmojis, compareEmojiArrays)) state.currentEmojis = newEmojis;\n };\n // avoid excessive re-renders\n const updateSearchMode = (newSearchMode)=>{\n if (state.searchMode !== newSearchMode) state.searchMode = newSearchMode;\n };\n // avoid excessive re-renders\n const updateCurrentEmojisWithCategories = (newEmojisWithCategories)=>{\n if (!$9e9d3488b14d9168$var$arraysAreEqualByFunction(state.currentEmojisWithCategories, newEmojisWithCategories, compareCurrentEmojisWithCategories)) state.currentEmojisWithCategories = newEmojisWithCategories;\n };\n // Helpers used by PickerTemplate\n const unicodeWithSkin = (emoji, currentSkinTone)=>currentSkinTone && emoji.skins && emoji.skins[currentSkinTone] || emoji.unicode;\n const labelWithSkin = (emoji, currentSkinTone)=>$9e9d3488b14d9168$var$uniq([\n emoji.name || unicodeWithSkin(emoji, currentSkinTone),\n emoji.annotation,\n ...emoji.shortcodes || $9e9d3488b14d9168$var$EMPTY_ARRAY\n ].filter(Boolean)).join(\", \");\n const titleForEmoji = (emoji)=>emoji.annotation || (emoji.shortcodes || $9e9d3488b14d9168$var$EMPTY_ARRAY).join(\", \");\n const helpers = {\n labelWithSkin: labelWithSkin,\n titleForEmoji: titleForEmoji,\n unicodeWithSkin: unicodeWithSkin\n };\n const events = {\n onClickSkinToneButton: onClickSkinToneButton,\n onEmojiClick: onEmojiClick,\n onNavClick: onNavClick,\n onNavKeydown: onNavKeydown,\n onSearchKeydown: onSearchKeydown,\n onSkinToneOptionsClick: onSkinToneOptionsClick,\n onSkinToneOptionsFocusOut: onSkinToneOptionsFocusOut,\n onSkinToneOptionsKeydown: onSkinToneOptionsKeydown,\n onSkinToneOptionsKeyup: onSkinToneOptionsKeyup,\n onSearchInput: onSearchInput\n };\n const actions = {\n calculateEmojiGridStyle: calculateEmojiGridStyle,\n updateOnIntersection: updateOnIntersection\n };\n let firstRender = true;\n createEffect(()=>{\n $9e9d3488b14d9168$var$render(shadowRoot, state, helpers, events, actions, refs, abortSignal, actionContext, firstRender);\n firstRender = false;\n });\n //\n // Determine the emoji support level (in requestIdleCallback)\n //\n // mount logic\n if (!state.emojiVersion) $9e9d3488b14d9168$var$detectEmojiSupportLevel().then((level)=>{\n // Can't actually test emoji support in Jest/Vitest/JSDom, emoji never render in color in Cairo\n /* istanbul ignore next */ if (!level) state.message = state.i18n.emojiUnsupportedMessage;\n });\n //\n // Set or update the database object\n //\n createEffect(()=>{\n // show a Loading message if it takes a long time, or show an error if there's a network/IDB error\n async function handleDatabaseLoading() {\n let showingLoadingMessage = false;\n const timeoutHandle = setTimeout(()=>{\n showingLoadingMessage = true;\n state.message = state.i18n.loadingMessage;\n }, $9e9d3488b14d9168$var$TIMEOUT_BEFORE_LOADING_MESSAGE);\n try {\n await state.database.ready();\n state.databaseLoaded = true; // eslint-disable-line no-unused-vars\n } catch (err) {\n console.error(err);\n state.message = state.i18n.networkErrorMessage;\n } finally{\n clearTimeout(timeoutHandle);\n if (showingLoadingMessage) {\n showingLoadingMessage = false;\n state.message = \"\"; // eslint-disable-line no-unused-vars\n }\n }\n }\n if (state.database) /* no await */ handleDatabaseLoading();\n });\n //\n // Global styles for the entire picker\n //\n createEffect(()=>{\n state.pickerStyle = `\n --num-groups: ${state.groups.length}; \n --indicator-opacity: ${state.searchMode ? 0 : 1}; \n --num-skintones: ${$9e9d3488b14d9168$var$NUM_SKIN_TONES};`;\n });\n //\n // Set or update the customEmoji\n //\n createEffect(()=>{\n if (state.customEmoji && state.database) updateCustomEmoji(); // re-run whenever customEmoji change\n });\n createEffect(()=>{\n if (state.customEmoji && state.customEmoji.length) {\n if (state.groups !== $9e9d3488b14d9168$var$allGroups) state.groups = $9e9d3488b14d9168$var$allGroups;\n } else if (state.groups !== $9e9d3488b14d9168$var$groups) {\n if (state.currentGroupIndex) // If the current group is anything other than \"custom\" (which is first), decrement.\n // This fixes the odd case where you set customEmoji, then pick a category, then unset customEmoji\n state.currentGroupIndex--;\n state.groups = $9e9d3488b14d9168$var$groups;\n }\n });\n //\n // Set or update the preferred skin tone\n //\n createEffect(()=>{\n async function updatePreferredSkinTone() {\n if (state.databaseLoaded) state.currentSkinTone = await state.database.getPreferredSkinTone();\n }\n /* no await */ updatePreferredSkinTone();\n });\n createEffect(()=>{\n state.skinTones = Array($9e9d3488b14d9168$var$NUM_SKIN_TONES).fill().map((_, i)=>$9e9d3488b14d9168$var$applySkinTone(state.skinToneEmoji, i));\n });\n createEffect(()=>{\n state.skinToneButtonText = state.skinTones[state.currentSkinTone];\n });\n createEffect(()=>{\n state.skinToneButtonLabel = state.i18n.skinToneLabel.replace(\"{skinTone}\", state.i18n.skinTones[state.currentSkinTone]);\n });\n //\n // Set or update the favorites emojis\n //\n createEffect(()=>{\n async function updateDefaultFavoriteEmojis() {\n const { database: database } = state;\n const favs = (await Promise.all($9e9d3488b14d9168$var$MOST_COMMONLY_USED_EMOJI.map((unicode)=>database.getEmojiByUnicodeOrName(unicode)))).filter(Boolean); // filter because in Jest/Vitest tests we don't have all the emoji in the DB\n state.defaultFavoriteEmojis = favs;\n }\n if (state.databaseLoaded) /* no await */ updateDefaultFavoriteEmojis();\n });\n function updateCustomEmoji() {\n // Certain effects have an implicit dependency on customEmoji since it affects the database\n // Getting it here on the state ensures this effect re-runs when customEmoji change.\n const { customEmoji: customEmoji, database: database } = state;\n const databaseCustomEmoji = customEmoji || $9e9d3488b14d9168$var$EMPTY_ARRAY;\n if (database.customEmoji !== databaseCustomEmoji) // Avoid setting this if the customEmoji have _not_ changed, because the setter triggers a re-computation of the\n // `customEmojiIndex`. Note we don't bother with deep object changes.\n database.customEmoji = databaseCustomEmoji;\n }\n createEffect(()=>{\n async function updateFavorites() {\n updateCustomEmoji(); // re-run whenever customEmoji change\n const { database: database, defaultFavoriteEmojis: defaultFavoriteEmojis, numColumns: numColumns } = state;\n const dbFavorites = await database.getTopFavoriteEmoji(numColumns);\n const favorites = await summarizeEmojis($9e9d3488b14d9168$var$uniqBy([\n ...dbFavorites,\n ...defaultFavoriteEmojis\n ], (_)=>_.unicode || _.name).slice(0, numColumns));\n state.currentFavorites = favorites;\n }\n if (state.databaseLoaded && state.defaultFavoriteEmojis) /* no await */ updateFavorites();\n });\n //\n // Re-run whenever the emoji grid changes size, and re-calc style/layout-related state variables:\n // 1) Re-calculate the --num-columns var because it may have changed\n // 2) Re-calculate whether we're in RTL mode or not.\n //\n // The benefit of doing this in one place is to align with rAF/ResizeObserver\n // and do all the calculations in one go. RTL vs LTR is not strictly layout-related,\n // but since we're already reading the style here, and since it's already aligned with\n // the rAF loop, this is the most appropriate place to do it perf-wise.\n //\n function calculateEmojiGridStyle(node) {\n $9e9d3488b14d9168$var$resizeObserverAction(node, abortSignal, ()=>{\n /* istanbul ignore next */ {\n // read all the style/layout calculations we need to make\n const style = getComputedStyle(refs.rootElement);\n const newNumColumns = parseInt(style.getPropertyValue(\"--num-columns\"), 10);\n const newIsRtl = style.getPropertyValue(\"direction\") === \"rtl\";\n // write to state variables\n state.numColumns = newNumColumns;\n state.isRtl = newIsRtl;\n }\n });\n }\n // Re-run whenever the custom emoji in a category are shown/hidden. This is an optimization that simulates\n // what we'd get from `` but without rendering an ``.\n function updateOnIntersection(node) {\n $9e9d3488b14d9168$var$intersectionObserverAction(node, abortSignal, (entries)=>{\n for (const { target: target, isIntersecting: isIntersecting } of entries)target.classList.toggle(\"onscreen\", isIntersecting);\n });\n }\n //\n // Set or update the currentEmojis. Check for invalid ZWJ renderings\n // (i.e. double emoji).\n //\n createEffect(()=>{\n async function updateEmojis() {\n const { searchText: searchText, currentGroup: currentGroup, databaseLoaded: databaseLoaded, customEmoji: customEmoji } = state;\n if (!databaseLoaded) {\n state.currentEmojis = [];\n state.searchMode = false;\n } else if (searchText.length >= $9e9d3488b14d9168$var$MIN_SEARCH_TEXT_LENGTH) {\n const newEmojis = await getEmojisBySearchQuery(searchText);\n if (state.searchText === searchText) {\n updateCurrentEmojis(newEmojis);\n updateSearchMode(true);\n }\n } else {\n const { id: currentGroupId } = currentGroup;\n // avoid race condition where currentGroupId is -1 and customEmoji is undefined/empty\n if (currentGroupId !== -1 || customEmoji && customEmoji.length) {\n const newEmojis = await getEmojisByGroup(currentGroupId);\n if (state.currentGroup.id === currentGroupId) {\n updateCurrentEmojis(newEmojis);\n updateSearchMode(false);\n }\n }\n }\n }\n /* no await */ updateEmojis();\n });\n const resetScrollTopInRaf = ()=>{\n $9e9d3488b14d9168$var$rAF(()=>$9e9d3488b14d9168$var$resetScrollTopIfPossible(refs.tabpanelElement));\n };\n // Some emojis have their ligatures rendered as two or more consecutive emojis\n // We want to treat these the same as unsupported emojis, so we compare their\n // widths against the baseline widths and remove them as necessary\n createEffect(()=>{\n const { currentEmojis: currentEmojis, emojiVersion: emojiVersion } = state;\n const zwjEmojisToCheck = currentEmojis.filter((emoji)=>emoji.unicode) // filter custom emoji\n .filter((emoji)=>$9e9d3488b14d9168$var$hasZwj(emoji) && !$9e9d3488b14d9168$var$supportedZwjEmojis.has(emoji.unicode));\n if (!emojiVersion && zwjEmojisToCheck.length) {\n // render now, check their length later\n updateCurrentEmojis(currentEmojis);\n $9e9d3488b14d9168$var$rAF(()=>checkZwjSupportAndUpdate(zwjEmojisToCheck));\n } else {\n const newEmojis = emojiVersion ? currentEmojis : currentEmojis.filter(isZwjSupported);\n updateCurrentEmojis(newEmojis);\n // Reset scroll top to 0 when emojis change\n resetScrollTopInRaf();\n }\n });\n function checkZwjSupportAndUpdate(zwjEmojisToCheck) {\n const allSupported = $9e9d3488b14d9168$var$checkZwjSupport(zwjEmojisToCheck, refs.baselineEmoji, emojiToDomNode);\n if (allSupported) // Even if all emoji are supported, we still need to reset the scroll top to 0 when emojis change\n resetScrollTopInRaf();\n else // Force update. We only do this if there are any unsupported ZWJ characters since otherwise,\n // for browsers that support all emoji, it would be an unnecessary extra re-render.\n state.currentEmojis = [\n ...state.currentEmojis\n ];\n }\n function isZwjSupported(emoji) {\n return !emoji.unicode || !$9e9d3488b14d9168$var$hasZwj(emoji) || $9e9d3488b14d9168$var$supportedZwjEmojis.get(emoji.unicode);\n }\n async function filterEmojisByVersion(emojis) {\n const emojiSupportLevel = state.emojiVersion || await $9e9d3488b14d9168$var$detectEmojiSupportLevel();\n // !version corresponds to custom emoji\n return emojis.filter(({ version: version })=>!version || version <= emojiSupportLevel);\n }\n async function summarizeEmojis(emojis) {\n return $9e9d3488b14d9168$var$summarizeEmojisForUI(emojis, state.emojiVersion || await $9e9d3488b14d9168$var$detectEmojiSupportLevel());\n }\n async function getEmojisByGroup(group) {\n // -1 is custom emoji\n const emoji = group === -1 ? state.customEmoji : await state.database.getEmojiByGroup(group);\n return summarizeEmojis(await filterEmojisByVersion(emoji));\n }\n async function getEmojisBySearchQuery(query) {\n return summarizeEmojis(await filterEmojisByVersion(await state.database.getEmojiBySearchQuery(query)));\n }\n createEffect(()=>{});\n //\n // Derive currentEmojisWithCategories from currentEmojis. This is always done even if there\n // are no categories, because it's just easier to code the HTML this way.\n //\n createEffect(()=>{\n function calculateCurrentEmojisWithCategories() {\n const { searchMode: searchMode, currentEmojis: currentEmojis } = state;\n if (searchMode) return [\n {\n category: \"\",\n emojis: currentEmojis\n }\n ];\n const categoriesToEmoji = new Map();\n for (const emoji of currentEmojis){\n const category = emoji.category || \"\";\n let emojis = categoriesToEmoji.get(category);\n if (!emojis) {\n emojis = [];\n categoriesToEmoji.set(category, emojis);\n }\n emojis.push(emoji);\n }\n return [\n ...categoriesToEmoji.entries()\n ].map(([category, emojis])=>({\n category: category,\n emojis: emojis\n })).sort((a, b)=>state.customCategorySorting(a.category, b.category));\n }\n const newEmojisWithCategories = calculateCurrentEmojisWithCategories();\n updateCurrentEmojisWithCategories(newEmojisWithCategories);\n });\n //\n // Handle active search item (i.e. pressing up or down while searching)\n //\n createEffect(()=>{\n state.activeSearchItemId = state.activeSearchItem !== -1 && state.currentEmojis[state.activeSearchItem].id;\n });\n //\n // Handle user input on the search input\n //\n createEffect(()=>{\n const { rawSearchText: rawSearchText } = state;\n $9e9d3488b14d9168$var$rIC(()=>{\n state.searchText = (rawSearchText || \"\").trim(); // defer to avoid input delays, plus we can trim here\n state.activeSearchItem = -1;\n });\n });\n function onSearchKeydown(event) {\n if (!state.searchMode || !state.currentEmojis.length) return;\n const goToNextOrPrevious = (previous)=>{\n $9e9d3488b14d9168$var$halt(event);\n state.activeSearchItem = $9e9d3488b14d9168$var$incrementOrDecrement(previous, state.activeSearchItem, state.currentEmojis);\n };\n switch(event.key){\n case \"ArrowDown\":\n return goToNextOrPrevious(false);\n case \"ArrowUp\":\n return goToNextOrPrevious(true);\n case \"Enter\":\n if (state.activeSearchItem === -1) // focus the first option in the list since the list must be non-empty at this point (it's verified above)\n state.activeSearchItem = 0;\n else {\n $9e9d3488b14d9168$var$halt(event);\n return clickEmoji(state.currentEmojis[state.activeSearchItem].id);\n }\n }\n }\n //\n // Handle user input on nav\n //\n function onNavClick(event) {\n const { target: target } = event;\n const closestTarget = target.closest(\".nav-button\");\n /* istanbul ignore if */ if (!closestTarget) return; // This should never happen, but makes me nervous not to have it\n const groupId = parseInt(closestTarget.dataset.groupId, 10);\n refs.searchElement.value = \"\"; // clear search box input\n state.rawSearchText = \"\";\n state.searchText = \"\";\n state.activeSearchItem = -1;\n state.currentGroupIndex = state.groups.findIndex((_)=>_.id === groupId);\n }\n function onNavKeydown(event) {\n const { target: target, key: key } = event;\n const doFocus = (el)=>{\n if (el) {\n $9e9d3488b14d9168$var$halt(event);\n el.focus();\n }\n };\n switch(key){\n case \"ArrowLeft\":\n return doFocus(target.previousElementSibling);\n case \"ArrowRight\":\n return doFocus(target.nextElementSibling);\n case \"Home\":\n return doFocus(target.parentElement.firstElementChild);\n case \"End\":\n return doFocus(target.parentElement.lastElementChild);\n }\n }\n //\n // Handle user input on an emoji\n //\n async function clickEmoji(unicodeOrName) {\n const emoji = await state.database.getEmojiByUnicodeOrName(unicodeOrName);\n const emojiSummary = [\n ...state.currentEmojis,\n ...state.currentFavorites\n ].find((_)=>_.id === unicodeOrName);\n const skinTonedUnicode = emojiSummary.unicode && unicodeWithSkin(emojiSummary, state.currentSkinTone);\n await state.database.incrementFavoriteEmojiCount(unicodeOrName);\n fireEvent(\"emoji-click\", {\n emoji: emoji,\n skinTone: state.currentSkinTone,\n ...skinTonedUnicode && {\n unicode: skinTonedUnicode\n },\n ...emojiSummary.name && {\n name: emojiSummary.name\n }\n });\n }\n async function onEmojiClick(event) {\n const { target: target } = event;\n /* istanbul ignore if */ if (!target.classList.contains(\"emoji\")) // This should never happen, but makes me nervous not to have it\n return;\n $9e9d3488b14d9168$var$halt(event);\n const id = target.id.substring(4); // replace 'emo-' or 'fav-' prefix\n /* no await */ clickEmoji(id);\n }\n //\n // Handle user input on the skintone picker\n //\n function changeSkinTone(skinTone) {\n state.currentSkinTone = skinTone;\n state.skinTonePickerExpanded = false;\n focus(\"skintone-button\");\n fireEvent(\"skin-tone-change\", {\n skinTone: skinTone\n });\n /* no await */ state.database.setPreferredSkinTone(skinTone);\n }\n function onSkinToneOptionsClick(event) {\n const { target: { id: id } } = event;\n const match = id && id.match(/^skintone-(\\d)/); // skintone option format\n /* istanbul ignore if */ if (!match) return; // This should never happen, but makes me nervous not to have it\n $9e9d3488b14d9168$var$halt(event);\n const skinTone = parseInt(match[1], 10); // remove 'skintone-' prefix\n changeSkinTone(skinTone);\n }\n function onClickSkinToneButton(event) {\n state.skinTonePickerExpanded = !state.skinTonePickerExpanded;\n state.activeSkinTone = state.currentSkinTone;\n // this should always be true, since the button is obscured by the listbox, so this `if` is just to be sure\n if (state.skinTonePickerExpanded) {\n $9e9d3488b14d9168$var$halt(event);\n $9e9d3488b14d9168$var$rAF(()=>focus(\"skintone-list\"));\n }\n }\n // To make the animation nicer, change the z-index of the skintone picker button\n // *after* the animation has played. This makes it appear that the picker box\n // is expanding \"below\" the button\n createEffect(()=>{\n if (state.skinTonePickerExpanded) refs.skinToneDropdown.addEventListener(\"transitionend\", ()=>{\n state.skinTonePickerExpandedAfterAnimation = true; // eslint-disable-line no-unused-vars\n }, {\n once: true\n });\n else state.skinTonePickerExpandedAfterAnimation = false; // eslint-disable-line no-unused-vars\n });\n function onSkinToneOptionsKeydown(event) {\n // this should never happen, but makes me nervous not to have it\n /* istanbul ignore if */ if (!state.skinTonePickerExpanded) return;\n const changeActiveSkinTone = async (nextSkinTone)=>{\n $9e9d3488b14d9168$var$halt(event);\n state.activeSkinTone = nextSkinTone;\n };\n switch(event.key){\n case \"ArrowUp\":\n return changeActiveSkinTone($9e9d3488b14d9168$var$incrementOrDecrement(true, state.activeSkinTone, state.skinTones));\n case \"ArrowDown\":\n return changeActiveSkinTone($9e9d3488b14d9168$var$incrementOrDecrement(false, state.activeSkinTone, state.skinTones));\n case \"Home\":\n return changeActiveSkinTone(0);\n case \"End\":\n return changeActiveSkinTone(state.skinTones.length - 1);\n case \"Enter\":\n // enter on keydown, space on keyup. this is just how browsers work for buttons\n // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html\n $9e9d3488b14d9168$var$halt(event);\n return changeSkinTone(state.activeSkinTone);\n case \"Escape\":\n $9e9d3488b14d9168$var$halt(event);\n state.skinTonePickerExpanded = false;\n return focus(\"skintone-button\");\n }\n }\n function onSkinToneOptionsKeyup(event) {\n // this should never happen, but makes me nervous not to have it\n /* istanbul ignore if */ if (!state.skinTonePickerExpanded) return;\n switch(event.key){\n case \" \":\n // enter on keydown, space on keyup. this is just how browsers work for buttons\n // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html\n $9e9d3488b14d9168$var$halt(event);\n return changeSkinTone(state.activeSkinTone);\n }\n }\n async function onSkinToneOptionsFocusOut(event) {\n // On blur outside of the skintone listbox, collapse the skintone picker.\n const { relatedTarget: relatedTarget } = event;\n // The `else` should never happen, but makes me nervous not to have it\n /* istanbul ignore else */ if (!relatedTarget || relatedTarget.id !== \"skintone-list\") state.skinTonePickerExpanded = false;\n }\n function onSearchInput(event) {\n state.rawSearchText = event.target.value;\n }\n return {\n $set (newState) {\n $9e9d3488b14d9168$var$assign(state, newState);\n },\n $destroy () {\n abortController.abort();\n }\n };\n}\nconst $9e9d3488b14d9168$var$DEFAULT_DATA_SOURCE = \"https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json\";\nconst $9e9d3488b14d9168$var$DEFAULT_LOCALE = \"en\";\nvar $9e9d3488b14d9168$var$enI18n = {\n categoriesLabel: \"Categories\",\n emojiUnsupportedMessage: \"Your browser does not support color emoji.\",\n favoritesLabel: \"Favorites\",\n loadingMessage: \"Loading\\u2026\",\n networkErrorMessage: \"Could not load emoji.\",\n regionLabel: \"Emoji picker\",\n searchDescription: \"When search results are available, press up or down to select and enter to choose.\",\n searchLabel: \"Search\",\n searchResultsLabel: \"Search results\",\n skinToneDescription: \"When expanded, press up or down to select and enter to choose.\",\n skinToneLabel: \"Choose a skin tone (currently {skinTone})\",\n skinTonesLabel: \"Skin tones\",\n skinTones: [\n \"Default\",\n \"Light\",\n \"Medium-Light\",\n \"Medium\",\n \"Medium-Dark\",\n \"Dark\"\n ],\n categories: {\n custom: \"Custom\",\n \"smileys-emotion\": \"Smileys and emoticons\",\n \"people-body\": \"People and body\",\n \"animals-nature\": \"Animals and nature\",\n \"food-drink\": \"Food and drink\",\n \"travel-places\": \"Travel and places\",\n activities: \"Activities\",\n objects: \"Objects\",\n symbols: \"Symbols\",\n flags: \"Flags\"\n }\n};\nvar $9e9d3488b14d9168$var$baseStyles = ':host{--emoji-size:1.375rem;--emoji-padding:0.5rem;--category-emoji-size:var(--emoji-size);--category-emoji-padding:var(--emoji-padding);--indicator-height:3px;--input-border-radius:0.5rem;--input-border-size:1px;--input-font-size:1rem;--input-line-height:1.5;--input-padding:0.25rem;--num-columns:8;--outline-size:2px;--border-size:1px;--border-radius:0;--skintone-border-radius:1rem;--category-font-size:1rem;display:flex;width:min-content;height:400px}:host,:host(.light){color-scheme:light;--background:#fff;--border-color:#e0e0e0;--indicator-color:#385ac1;--input-border-color:#999;--input-font-color:#111;--input-placeholder-color:#999;--outline-color:#999;--category-font-color:#111;--button-active-background:#e6e6e6;--button-hover-background:#d9d9d9}:host(.dark){color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}@media (prefers-color-scheme:dark){:host{color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}}:host([hidden]){display:none}button{margin:0;padding:0;border:0;background:0 0;box-shadow:none;-webkit-tap-highlight-color:transparent}button::-moz-focus-inner{border:0}input{padding:0;margin:0;line-height:1.15;font-family:inherit}input[type=search]{-webkit-appearance:none}:focus{outline:var(--outline-color) solid var(--outline-size);outline-offset:calc(-1*var(--outline-size))}:host([data-js-focus-visible]) :focus:not([data-focus-visible-added]){outline:0}:focus:not(:focus-visible){outline:0}.hide-focus{outline:0}*{box-sizing:border-box}.picker{contain:content;display:flex;flex-direction:column;background:var(--background);border:var(--border-size) solid var(--border-color);border-radius:var(--border-radius);width:100%;height:100%;overflow:hidden;--total-emoji-size:calc(var(--emoji-size) + (2 * var(--emoji-padding)));--total-category-emoji-size:calc(var(--category-emoji-size) + (2 * var(--category-emoji-padding)))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.hidden{opacity:0;pointer-events:none}.abs-pos{position:absolute;left:0;top:0}.gone{display:none!important}.skintone-button-wrapper,.skintone-list{background:var(--background);z-index:3}.skintone-button-wrapper.expanded{z-index:1}.skintone-list{position:absolute;inset-inline-end:0;top:0;z-index:2;overflow:visible;border-bottom:var(--border-size) solid var(--border-color);border-radius:0 0 var(--skintone-border-radius) var(--skintone-border-radius);will-change:transform;transition:transform .2s ease-in-out;transform-origin:center 0}@media (prefers-reduced-motion:reduce){.skintone-list{transition-duration:.001s}}@supports not (inset-inline-end:0){.skintone-list{right:0}}.skintone-list.no-animate{transition:none}.tabpanel{overflow-y:auto;scrollbar-gutter:stable;-webkit-overflow-scrolling:touch;will-change:transform;min-height:0;flex:1;contain:content}.emoji-menu{display:grid;grid-template-columns:repeat(var(--num-columns),var(--total-emoji-size));justify-content:space-around;align-items:flex-start;width:100%}.emoji-menu.visibility-auto{content-visibility:auto;contain-intrinsic-size:calc(var(--num-columns)*var(--total-emoji-size)) calc(var(--num-rows)*var(--total-emoji-size))}.category{padding:var(--emoji-padding);font-size:var(--category-font-size);color:var(--category-font-color)}.emoji,button.emoji{font-size:var(--emoji-size);display:flex;align-items:center;justify-content:center;border-radius:100%;height:var(--total-emoji-size);width:var(--total-emoji-size);line-height:1;overflow:hidden;font-family:var(--emoji-font-family);cursor:pointer}@media (hover:hover) and (pointer:fine){.emoji:hover,button.emoji:hover{background:var(--button-hover-background)}}.emoji.active,.emoji:active,button.emoji.active,button.emoji:active{background:var(--button-active-background)}.onscreen .custom-emoji::after{content:\"\";width:var(--emoji-size);height:var(--emoji-size);background-repeat:no-repeat;background-position:center center;background-size:contain;background-image:var(--custom-emoji-background)}.nav,.nav-button{align-items:center}.nav{display:grid;justify-content:space-between;contain:content}.nav-button{display:flex;justify-content:center}.nav-emoji{font-size:var(--category-emoji-size);width:var(--total-category-emoji-size);height:var(--total-category-emoji-size)}.indicator-wrapper{display:flex;border-bottom:1px solid var(--border-color)}.indicator{width:calc(100%/var(--num-groups));height:var(--indicator-height);opacity:var(--indicator-opacity);background-color:var(--indicator-color);will-change:transform,opacity;transition:opacity .1s linear,transform .25s ease-in-out}@media (prefers-reduced-motion:reduce){.indicator{will-change:opacity;transition:opacity .1s linear}}.pad-top,input.search{background:var(--background);width:100%}.pad-top{height:var(--emoji-padding);z-index:3}.search-row{display:flex;align-items:center;position:relative;padding-inline-start:var(--emoji-padding);padding-bottom:var(--emoji-padding)}.search-wrapper{flex:1;min-width:0}input.search{padding:var(--input-padding);border-radius:var(--input-border-radius);border:var(--input-border-size) solid var(--input-border-color);color:var(--input-font-color);font-size:var(--input-font-size);line-height:var(--input-line-height)}input.search::placeholder{color:var(--input-placeholder-color)}.favorites{overflow-y:auto;scrollbar-gutter:stable;display:flex;flex-direction:row;border-top:var(--border-size) solid var(--border-color);contain:content}.message{padding:var(--emoji-padding)}';\nconst $9e9d3488b14d9168$var$PROPS = [\n \"customEmoji\",\n \"customCategorySorting\",\n \"database\",\n \"dataSource\",\n \"i18n\",\n \"locale\",\n \"skinToneEmoji\",\n \"emojiVersion\"\n];\n// Styles injected ourselves, so we can declare the FONT_FAMILY variable in one place\nconst $9e9d3488b14d9168$var$EXTRA_STYLES = `:host{--emoji-font-family:${$9e9d3488b14d9168$var$FONT_FAMILY}}`;\nclass $9e9d3488b14d9168$export$2e2bcd8739ae039 extends HTMLElement {\n constructor(props){\n super();\n this.attachShadow({\n mode: \"open\"\n });\n const style = document.createElement(\"style\");\n style.textContent = $9e9d3488b14d9168$var$baseStyles + $9e9d3488b14d9168$var$EXTRA_STYLES;\n this.shadowRoot.appendChild(style);\n this._ctx = {\n // Set defaults\n locale: $9e9d3488b14d9168$var$DEFAULT_LOCALE,\n dataSource: $9e9d3488b14d9168$var$DEFAULT_DATA_SOURCE,\n skinToneEmoji: $9e9d3488b14d9168$var$DEFAULT_SKIN_TONE_EMOJI,\n customCategorySorting: $9e9d3488b14d9168$var$DEFAULT_CATEGORY_SORTING,\n customEmoji: null,\n i18n: $9e9d3488b14d9168$var$enI18n,\n emojiVersion: null,\n ...props\n };\n // Handle properties set before the element was upgraded\n for (const prop of $9e9d3488b14d9168$var$PROPS)if (prop !== \"database\" && Object.prototype.hasOwnProperty.call(this, prop)) {\n this._ctx[prop] = this[prop];\n delete this[prop];\n }\n this._dbFlush(); // wait for a flush before creating the db, in case the user calls e.g. a setter or setAttribute\n }\n connectedCallback() {\n // The _cmp may be defined if the component was immediately disconnected and then reconnected. In that case,\n // do nothing (preserve the state)\n if (!this._cmp) this._cmp = $9e9d3488b14d9168$var$createRoot(this.shadowRoot, this._ctx);\n }\n disconnectedCallback() {\n // Check in a microtask if the element is still connected. If so, treat this as a \"move\" rather than a disconnect\n // Inspired by Vue: https://vuejs.org/guide/extras/web-components.html#building-custom-elements-with-vue\n $9e9d3488b14d9168$var$qM(()=>{\n // this._cmp may be defined if connect-disconnect-connect-disconnect occurs synchronously\n if (!this.isConnected && this._cmp) {\n this._cmp.$destroy();\n this._cmp = undefined;\n const { database: database } = this._ctx;\n database.close()// only happens if the database failed to load in the first place, so we don't care\n .catch((err)=>console.error(err));\n }\n });\n }\n static get observedAttributes() {\n return [\n \"locale\",\n \"data-source\",\n \"skin-tone-emoji\",\n \"emoji-version\"\n ] // complex objects aren't supported, also use kebab-case\n ;\n }\n attributeChangedCallback(attrName, oldValue, newValue) {\n this._set(// convert from kebab-case to camelcase\n // see https://github.com/sveltejs/svelte/issues/3852#issuecomment-665037015\n attrName.replace(/-([a-z])/g, (_, up)=>up.toUpperCase()), // convert string attribute to float if necessary\n attrName === \"emoji-version\" ? parseFloat(newValue) : newValue);\n }\n _set(prop, newValue) {\n this._ctx[prop] = newValue;\n if (this._cmp) this._cmp.$set({\n [prop]: newValue\n });\n if ([\n \"locale\",\n \"dataSource\"\n ].includes(prop)) this._dbFlush();\n }\n _dbCreate() {\n const { locale: locale, dataSource: dataSource, database: database } = this._ctx;\n // only create a new database if we really need to\n if (!database || database.locale !== locale || database.dataSource !== dataSource) this._set(\"database\", new (0, $736431a7b9521865$export$2e2bcd8739ae039)({\n locale: locale,\n dataSource: dataSource\n }));\n }\n // Update the Database in one microtask if the locale/dataSource change. We do one microtask\n // so we don't create two Databases if e.g. both the locale and the dataSource change\n _dbFlush() {\n $9e9d3488b14d9168$var$qM(()=>this._dbCreate());\n }\n}\nconst $9e9d3488b14d9168$var$definitions = {};\nfor (const prop of $9e9d3488b14d9168$var$PROPS)$9e9d3488b14d9168$var$definitions[prop] = {\n get () {\n if (prop === \"database\") // in rare cases, the microtask may not be flushed yet, so we need to instantiate the DB\n // now if the user is asking for it\n this._dbCreate();\n return this._ctx[prop];\n },\n set (val) {\n if (prop === \"database\") throw new Error(\"database is read-only\");\n this._set(prop, val);\n }\n};\nObject.defineProperties($9e9d3488b14d9168$export$2e2bcd8739ae039.prototype, $9e9d3488b14d9168$var$definitions);\n/* istanbul ignore else */ if (!customElements.get(\"emoji-picker\")) customElements.define(\"emoji-picker\", $9e9d3488b14d9168$export$2e2bcd8739ae039);\n\n\n\n\n\nvar $bf4f0cf05f6fd378$var$browserSupportsTextareaTextNodes;\n/**\n * @param {HTMLElement} input\n * @return {boolean}\n */ function $bf4f0cf05f6fd378$var$canManipulateViaTextNodes(input) {\n if (input.nodeName !== \"TEXTAREA\") return false;\n if (typeof $bf4f0cf05f6fd378$var$browserSupportsTextareaTextNodes === \"undefined\") {\n var textarea = document.createElement(\"textarea\");\n textarea.value = 1;\n $bf4f0cf05f6fd378$var$browserSupportsTextareaTextNodes = !!textarea.firstChild;\n }\n return $bf4f0cf05f6fd378$var$browserSupportsTextareaTextNodes;\n}\n/**\n * @param {HTMLTextAreaElement|HTMLInputElement} input\n * @param {string} text\n * @returns {void}\n */ function $bf4f0cf05f6fd378$var$index(input, text) {\n // Most of the used APIs only work with the field selected\n input.focus(); // IE 8-10\n if (document.selection) {\n var ieRange = document.selection.createRange();\n ieRange.text = text; // Move cursor after the inserted text\n ieRange.collapse(false);\n ieRange.select();\n return;\n } // Webkit + Edge\n var isSuccess = document.execCommand(\"insertText\", false, text);\n if (!isSuccess) {\n var start = input.selectionStart;\n var end = input.selectionEnd; // Firefox (non-standard method)\n if (typeof input.setRangeText === \"function\") input.setRangeText(text);\n else {\n // To make a change we just need a Range, not a Selection\n var range = document.createRange();\n var textNode = document.createTextNode(text);\n if ($bf4f0cf05f6fd378$var$canManipulateViaTextNodes(input)) {\n var node = input.firstChild; // If textarea is empty, just insert the text\n if (!node) input.appendChild(textNode);\n else {\n // Otherwise we need to find a nodes for start and end\n var offset = 0;\n var startNode = null;\n var endNode = null;\n while(node && (startNode === null || endNode === null)){\n var nodeLength = node.nodeValue.length; // if start of the selection falls into current node\n if (start >= offset && start <= offset + nodeLength) range.setStart(startNode = node, start - offset);\n // if end of the selection falls into current node\n if (end >= offset && end <= offset + nodeLength) range.setEnd(endNode = node, end - offset);\n offset += nodeLength;\n node = node.nextSibling;\n } // If there is some text selected, remove it as we should replace it\n if (start !== end) range.deleteContents();\n }\n } // If the node is a textarea and the range doesn't span outside the element\n //\n // Get the commonAncestorContainer of the selected range and test its type\n // If the node is of type `#text` it means that we're still working with text nodes within our textarea element\n // otherwise, if it's of type `#document` for example it means our selection spans outside the textarea.\n if ($bf4f0cf05f6fd378$var$canManipulateViaTextNodes(input) && range.commonAncestorContainer.nodeName === \"#text\") // Finally insert a new node. The browser will automatically split start and end nodes into two if necessary\n range.insertNode(textNode);\n else {\n // If the node is not a textarea or the range spans outside a textarea the only way is to replace the whole value\n var value = input.value;\n input.value = value.slice(0, start) + text + value.slice(end);\n }\n } // Correct the cursor position to be at the end of the insertion\n input.setSelectionRange(start + text.length, start + text.length); // Notify any possible listeners of the change\n var e = document.createEvent(\"UIEvent\");\n e.initEvent(\"input\", true, false);\n input.dispatchEvent(e);\n }\n}\nvar $bf4f0cf05f6fd378$export$2e2bcd8739ae039 = $bf4f0cf05f6fd378$var$index;\n\n\n/*!\n * @georapbox/capture-photo-element\n * A custom element that implements the MediaDevices.getUserMedia() method of the MediaDevices interface to capture a photo in the browser.\n *\n * @version 5.0.0\n * @homepage https://github.com/georapbox/capture-photo-element#readme\n * @author George Raptis \n * @license MIT\n */ var $dced0d224c6d876e$var$c = (r, t, e)=>(Number.isNaN(t) && (t = 0), Number.isNaN(e) && (e = 0), Math.min(Math.max(r, Math.min(t, e)), Math.max(t, e)));\nvar $dced0d224c6d876e$var$a = \"capture-photo\", $dced0d224c6d876e$var$d = `\n :host { display: block; box-sizing: border-box; }\n :host *, :host *::before, :host *::after { box-sizing: inherit;}\n :host([hidden]), [hidden], ::slotted([hidden]) { display: none; }\n video { display: block; }\n #output:empty { display: none; }\n`, $dced0d224c6d876e$var$u = document.createElement(\"template\");\n$dced0d224c6d876e$var$u.innerHTML = `\n \n \n \n
\n \n \n \n \n
\n \n
\n`;\nvar $dced0d224c6d876e$export$cc30a98fe3890794 = class r extends HTMLElement {\n #a = {};\n #t = null;\n #n = null;\n #h = null;\n #e = null;\n #r = null;\n #i = null;\n constructor(){\n super(), this.#a = this.getSupportedConstraints(), this.shadowRoot || this.attachShadow({\n mode: \"open\"\n }).appendChild($dced0d224c6d876e$var$u.content.cloneNode(!0));\n }\n static get observedAttributes() {\n return [\n \"no-image\",\n \"pan\",\n \"tilt\",\n \"zoom\",\n \"torch\"\n ];\n }\n attributeChangedCallback(t, e, s) {\n if (!this.isConnected) return;\n let i = this.getTrackCapabilities();\n if (t === \"no-image\" && e !== s && this.#u(), t === \"pan\" && e !== s && \"pan\" in this.#a) {\n let o = \"pan\" in i && i.pan?.min && i.pan?.max ? this.pan >= i.pan.min && this.pan <= i.pan.max : !1;\n typeof this.pan == \"number\" && o && this.#o(\"pan\", this.pan);\n }\n if (t === \"tilt\" && e !== s && \"tilt\" in this.#a) {\n let o = \"tilt\" in i && i.tilt?.min && i.tilt?.max ? this.tilt >= i.tilt.min && this.tilt <= i.tilt.max : !1;\n typeof this.tilt == \"number\" && o && this.#o(\"tilt\", this.tilt);\n }\n if (t === \"zoom\" && e !== s && \"zoom\" in this.#a) {\n let o = \"zoom\" in i && i.zoom?.min && i.zoom?.max ? this.zoom >= i.zoom.min && this.zoom <= i.zoom.max : !1;\n typeof this.zoom == \"number\" && o && this.#o(\"zoom\", this.zoom);\n }\n t === \"torch\" && e !== s && \"torch\" in this.#a && this.#o(\"torch\", this.torch);\n }\n async connectedCallback() {\n if (this.#s(\"autoPlay\"), this.#s(\"noImage\"), this.#s(\"facingMode\"), this.#s(\"cameraResolution\"), this.#s(\"pan\"), this.#s(\"tilt\"), this.#s(\"zoom\"), this.#s(\"torch\"), this.#s(\"calculateFileSize\"), this.#n = this.shadowRoot?.querySelector(\"canvas\") || null, this.#h = this.shadowRoot?.getElementById(\"output\") || null, this.#e = this.shadowRoot?.querySelector(\"video\") || null, this.#r = this.shadowRoot?.querySelector('slot[name=\"capture-button\"]') || null, this.#i = this.#m(), this.#e?.addEventListener(\"loadedmetadata\", this.#c), this.#r?.addEventListener(\"slotchange\", this.#d), this.#i?.addEventListener(\"click\", this.#l), !r.isSupported()) return this.dispatchEvent(new CustomEvent(`${$dced0d224c6d876e$var$a}:error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: {\n name: \"NotSupportedError\",\n message: \"Not supported\"\n }\n }\n }));\n this.autoPlay && this.startVideoStream();\n }\n disconnectedCallback() {\n this.stopVideoStream(), this.#i?.removeEventListener(\"click\", this.#l), this.#e?.removeEventListener(\"loadedmetadata\", this.#c), this.#r?.removeEventListener(\"slotchange\", this.#d);\n }\n get autoPlay() {\n return this.hasAttribute(\"auto-play\");\n }\n set autoPlay(t) {\n this.toggleAttribute(\"auto-play\", !!t);\n }\n get noImage() {\n return this.hasAttribute(\"no-image\");\n }\n set noImage(t) {\n this.toggleAttribute(\"no-image\", !!t);\n }\n get facingMode() {\n let t = this.getAttribute(\"facing-mode\");\n return t !== \"user\" ? \"environment\" : t;\n }\n set facingMode(t) {\n this.setAttribute(\"facing-mode\", t);\n }\n get cameraResolution() {\n return this.getAttribute(\"camera-resolution\") || \"\";\n }\n set cameraResolution(t) {\n this.setAttribute(\"camera-resolution\", t);\n }\n get pan() {\n return Number(this.getAttribute(\"pan\")) || 0;\n }\n set pan(t) {\n this.setAttribute(\"pan\", t != null ? t.toString() : t);\n }\n get tilt() {\n return Number(this.getAttribute(\"tilt\")) || 0;\n }\n set tilt(t) {\n this.setAttribute(\"tilt\", t != null ? t.toString() : t);\n }\n get zoom() {\n return Number(this.getAttribute(\"zoom\")) || 1;\n }\n set zoom(t) {\n this.setAttribute(\"zoom\", t != null ? t.toString() : t);\n }\n get torch() {\n return this.hasAttribute(\"torch\");\n }\n set torch(t) {\n this.toggleAttribute(\"torch\", !!t);\n }\n get calculateFileSize() {\n return this.hasAttribute(\"calculate-file-size\");\n }\n set calculateFileSize(t) {\n this.toggleAttribute(\"calculate-file-size\", !!t);\n }\n get loading() {\n return this.hasAttribute(\"loading\");\n }\n #l = (t)=>{\n t.preventDefault(), this.capture();\n };\n #c = (t)=>{\n let e = t.target;\n e.play().then(()=>{\n this.dispatchEvent(new CustomEvent(`${$dced0d224c6d876e$var$a}:video-play`, {\n bubbles: !0,\n composed: !0,\n detail: {\n video: e\n }\n }));\n }).catch((s)=>{\n this.dispatchEvent(new CustomEvent(`${$dced0d224c6d876e$var$a}:error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: s\n }\n }));\n }).finally(()=>{\n this.removeAttribute(\"loading\");\n });\n };\n #u() {\n this.#h && this.#h.replaceChildren();\n }\n #o(t, e) {\n if (!this.#t) return;\n let [s] = this.#t.getVideoTracks(), i = this.getTrackCapabilities(), o = this.getTrackSettings(), n = t === \"pan\" || t === \"tilt\" || t === \"zoom\" ? $dced0d224c6d876e$var$c(Number(e), i[t]?.min || 1, i[t]?.max || 1) : e;\n t in o && s.applyConstraints({\n advanced: [\n {\n [t]: n\n }\n ]\n }).catch(()=>{});\n }\n #d = (t)=>{\n t.target?.name === \"capture-button\" && (this.#i?.removeEventListener(\"click\", this.#l), this.#i = this.#m(), this.#i && (this.#i.addEventListener(\"click\", this.#l), this.#i.nodeName !== \"BUTTON\" && !this.#i.hasAttribute(\"role\") && this.#i.setAttribute(\"role\", \"button\")));\n };\n #m() {\n return this.#r && this.#r.assignedElements({\n flatten: !0\n }).find((t)=>t.nodeName === \"BUTTON\" || t.getAttribute(\"slot\") === \"capture-button\") || null;\n }\n #s(t) {\n let e = this;\n if (Object.prototype.hasOwnProperty.call(e, t)) {\n let s = e[t];\n delete e[t], e[t] = s;\n }\n }\n async startVideoStream(t) {\n if (!r.isSupported() || this.#t) return;\n this.setAttribute(\"loading\", \"\");\n let e = {\n video: {\n facingMode: {\n ideal: this.facingMode\n },\n pan: !0,\n tilt: !0,\n zoom: !0,\n torch: this.torch\n },\n audio: !1\n };\n if (typeof t == \"string\" && t.trim().length > 0 && (e.video.deviceId = {\n exact: t\n }), typeof this.cameraResolution == \"string\" && this.cameraResolution.trim().length > 0) {\n let [s = 0, i = 0] = this.cameraResolution.split(\"x\").map((o)=>Number(o));\n s > 0 && i > 0 && (e.video.width = s, e.video.height = i);\n }\n try {\n this.#t = await navigator.mediaDevices.getUserMedia(e), this.#e && (this.#e.srcObject = this.#t), this.#o(\"pan\", this.pan), this.#o(\"tilt\", this.tilt), this.#o(\"zoom\", this.zoom);\n } catch (s) {\n this.dispatchEvent(new CustomEvent(`${$dced0d224c6d876e$var$a}:error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: s\n }\n }));\n } finally{\n this.removeAttribute(\"loading\");\n }\n }\n restartVideoStream(t) {\n this.#t && this.#e && this.stopVideoStream(), this.startVideoStream(t);\n }\n stopVideoStream() {\n if (!this.#e || !this.#t) return;\n let [t] = this.#t.getVideoTracks();\n t?.stop(), this.#e.srcObject = null, this.#t = null;\n }\n async capture() {\n if (!(this.loading || !this.#n || !this.#e)) try {\n let t = this.#n.getContext(\"2d\"), e = this.#e.videoWidth, s = this.#e.videoHeight;\n this.#n.width = e, this.#n.height = s, t?.drawImage(this.#e, 0, 0, e, s);\n let i = this.#n.toDataURL(\"image/png\");\n if (typeof i == \"string\" && i.includes(\"data:image\")) {\n if (!this.noImage) {\n let n = new Image;\n n.src = i, n.width = e, n.height = s, n.alt = \"Captured photo\", n.setAttribute(\"part\", \"output-image\"), this.#u(), this.#h?.appendChild(n);\n }\n let o = {\n dataURI: i,\n width: e,\n height: s\n };\n if (this.calculateFileSize) try {\n let l = (await (await fetch(i)).blob()).size;\n l && (o.size = l);\n } catch {}\n this.dispatchEvent(new CustomEvent(`${$dced0d224c6d876e$var$a}:success`, {\n bubbles: !0,\n composed: !0,\n detail: o\n }));\n }\n } catch (t) {\n this.dispatchEvent(new CustomEvent(`${$dced0d224c6d876e$var$a}:error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n }\n }\n getSupportedConstraints() {\n return r.isSupported() ? navigator.mediaDevices.getSupportedConstraints() || {} : {};\n }\n getTrackCapabilities() {\n if (!this.#t) return {};\n let [t] = this.#t.getVideoTracks();\n return t && typeof t.getCapabilities == \"function\" ? t.getCapabilities() || {} : {};\n }\n getTrackSettings() {\n if (!this.#t) return {};\n let [t] = this.#t.getVideoTracks();\n return t && typeof t.getSettings == \"function\" ? t.getSettings() || {} : {};\n }\n static async getVideoInputDevices() {\n return !navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices ? [] : (await navigator.mediaDevices.enumerateDevices() || []).filter((e)=>e.kind === \"videoinput\" && !!e.deviceId);\n }\n static isSupported() {\n return !!navigator.mediaDevices?.getUserMedia;\n }\n static defineCustomElement(t = $dced0d224c6d876e$var$a) {\n typeof window < \"u\" && !window.customElements.get(t) && window.customElements.define(t, r);\n }\n};\n$dced0d224c6d876e$export$cc30a98fe3890794.defineCustomElement();\n\n\n/*!\n * @georapbox/web-share-element\n * A custom element that implements the Web Share API to share user-defined data.\n *\n * @version 3.1.1\n * @homepage https://github.com/georapbox/web-share-element#readme\n * @author George Raptis \n * @license MIT\n */ function $7a2aca835bb05064$export$c37129e465f64ef0(a) {\n return a !== null && typeof a == \"object\" ? \"share\" in navigator && \"canShare\" in navigator && navigator.canShare(a) : \"share\" in navigator;\n}\n\n\n/*!\n * @georapbox/web-share-element\n * A custom element that implements the Web Share API to share user-defined data.\n *\n * @version 3.1.1\n * @homepage https://github.com/georapbox/web-share-element#readme\n * @author George Raptis \n * @license MIT\n */ var $cd62c5572235e737$var$h = `\n :host {\n display: inline-block;\n }\n`, $cd62c5572235e737$var$r = document.createElement(\"template\");\n$cd62c5572235e737$var$r.innerHTML = `\n \n \n`;\nvar $cd62c5572235e737$export$30b344bef3e55b67 = class a extends HTMLElement {\n #e;\n #t;\n #r = [];\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\",\n delegatesFocus: !0\n }).appendChild($cd62c5572235e737$var$r.content.cloneNode(!0)), this.#e = this.shadowRoot?.querySelector('slot[name=\"button\"]') || null, this.#t = this.#h();\n }\n static get observedAttributes() {\n return [\n \"disabled\"\n ];\n }\n attributeChangedCallback(t, e, i) {\n t === \"disabled\" && e !== i && this.#t && (this.#t.toggleAttribute(\"disabled\", this.disabled), this.#t.setAttribute(\"aria-disabled\", this.disabled.toString()), this.#t.part && this.#t.part.contains(\"button\") && this.#t.part.toggle(\"button--disabled\", this.disabled));\n }\n connectedCallback() {\n this.#s(\"shareUrl\"), this.#s(\"shareTitle\"), this.#s(\"shareText\"), this.#s(\"shareFiles\"), this.#s(\"disabled\"), this.#e?.addEventListener(\"slotchange\", this.#a), this.#t?.addEventListener(\"click\", this.#i);\n }\n disconnectedCallback() {\n this.#e?.removeEventListener(\"slotchange\", this.#a), this.#t?.removeEventListener(\"click\", this.#i);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(t) {\n this.toggleAttribute(\"disabled\", !!t);\n }\n get shareUrl() {\n return this.getAttribute(\"share-url\") || \"\";\n }\n set shareUrl(t) {\n this.setAttribute(\"share-url\", t);\n }\n get shareTitle() {\n return this.getAttribute(\"share-title\") || \"\";\n }\n set shareTitle(t) {\n this.setAttribute(\"share-title\", t);\n }\n get shareText() {\n return this.getAttribute(\"share-text\") || \"\";\n }\n set shareText(t) {\n this.setAttribute(\"share-text\", t);\n }\n get shareFiles() {\n return this.#r;\n }\n set shareFiles(t) {\n Array.isArray(t) && t.length > 0 && (this.#r = t);\n }\n async share() {\n if (!this.disabled) try {\n let t = {};\n this.shareUrl && (t.url = this.shareUrl), this.shareTitle && (t.title = this.shareTitle), this.shareText && (t.text = this.shareText), Array.isArray(this.shareFiles) && this.shareFiles.length > 0 && navigator.canShare && navigator.canShare({\n files: this.shareFiles\n }) && (t.files = this.shareFiles), await navigator.share(t), this.dispatchEvent(new CustomEvent(\"web-share:success\", {\n bubbles: !0,\n composed: !0,\n detail: {\n shareData: t\n }\n }));\n } catch (t) {\n if (t instanceof Error && t.name === \"AbortError\") {\n this.dispatchEvent(new CustomEvent(\"web-share:abort\", {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n return;\n }\n this.dispatchEvent(new CustomEvent(\"web-share:error\", {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n }\n }\n #i = (t)=>{\n t.preventDefault(), !this.disabled && this.share();\n };\n #a = (t)=>{\n t.target && t.target.name === \"button\" && (this.#t?.removeEventListener(\"click\", this.#i), this.#t = this.#h(), this.#t && (this.#t.addEventListener(\"click\", this.#i), this.#t.nodeName !== \"BUTTON\" && !this.#t.hasAttribute(\"role\") && this.#t.setAttribute(\"role\", \"button\")));\n };\n #h() {\n return this.#e && this.#e.assignedElements({\n flatten: !0\n }).find((t)=>t.nodeName === \"BUTTON\" || t.getAttribute(\"slot\") === \"button\") || null;\n }\n #s(t) {\n let e = this;\n if (Object.prototype.hasOwnProperty.call(e, t)) {\n let i = e[t];\n delete e[t], e[t] = i;\n }\n }\n static defineCustomElement(t = \"web-share\") {\n typeof window < \"u\" && !window.customElements.get(t) && window.customElements.define(t, a);\n }\n};\n$cd62c5572235e737$export$30b344bef3e55b67.defineCustomElement();\n\n\n/*!\n * @georapbox/modal-element\n * A custom element to create a modal, using the native dialog element under the hood.\n *\n * @version 1.8.0\n * @homepage https://github.com/georapbox/modal-element#readme\n * @author George Raptis \n * @license MIT\n */ var $d9c5053bade2d3f8$var$n = document.createElement(\"template\"), $d9c5053bade2d3f8$var$r = `\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-color: canvastext;\n\n --me-header-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-header-color: initial;\n\n --me-body-spacing: 1rem;\n --me-body-background-color: transparent;\n --me-body-color: initial;\n --me-footer-background-color: transparent;\n --me-footer-color: initial;\n\n --me-close-padding: 0.4375rem;\n --me-close-border: none;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-close-color: inherit;\n --me-close-font-size: 1rem;\n\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n --dialog-placement-margin: calc((2em + 6px) / 2);\n\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n color: var(--me-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n /* Dialog placement */\n :host(:not([fullscreen])[placement=\"top-start\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-center\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-end\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center-start\"]) .dialog {\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center\"]) .dialog {\n margin: auto;\n }\n\n :host(:not([fullscreen])[placement=\"center-end\"]) .dialog {\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-start\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-center\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-end\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n /* Dialog animations */\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: 300ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n color: var(--me-header-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n color: var(--me-body-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: end;\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n color: var(--me-footer-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: var(--me-close-padding);\n border: var(--me-close-border);\n border-radius: var(--me-close-border-radius);\n background-color: var(--me-close-background-color);\n color: var(--me-close-color);\n font-size: var(--me-close-font-size);\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n$d9c5053bade2d3f8$var$n.innerHTML = `\n \n\n \n
\n
\n \n\n
\n \n
\n
\n\n \n\n
\n \n
\n
\n
\n`;\nvar $d9c5053bade2d3f8$export$32589115725b904b = class s extends HTMLElement {\n #e = null;\n #i = null;\n #a = null;\n #o = void 0;\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\"\n }).appendChild($d9c5053bade2d3f8$var$n.content.cloneNode(!0)), this.shadowRoot && (this.#e = this.shadowRoot.querySelector(\"dialog\"), this.#i = this.shadowRoot.querySelector('slot[name=\"footer\"]'), this.#a = this.shadowRoot.querySelector('slot[name=\"close\"]'));\n }\n static get observedAttributes() {\n return [\n \"open\",\n \"no-header\",\n \"no-animations\",\n \"no-close-button\",\n \"close-label\"\n ];\n }\n attributeChangedCallback(e, t, i) {\n if (this.#e !== null) {\n if (e === \"open\" && t !== i && (this.open ? (this.#e.showModal(), this.dispatchEvent(new CustomEvent(\"me-open\", {\n bubbles: !0,\n composed: !0,\n detail: {\n element: this\n }\n })), document.body && !this.preserveOverflow && (document.body.style.overflow = \"hidden\")) : this.#e.close()), e === \"no-header\" && t !== i) {\n let o = this.#e.querySelector(\".dialog__header\");\n o !== null && (o.hidden = this.noHeader);\n }\n if (e === \"no-animations\" && t !== i && this.#e.classList.toggle(\"dialog--no-animations\", this.noAnimations), e === \"no-close-button\" && t !== i) {\n let o = this.#e.querySelector(\".dialog__close\");\n o !== null && (o.hidden = this.noCloseButton);\n }\n e === \"close-label\" && t !== i && this.#r();\n }\n }\n connectedCallback() {\n this.#t(\"open\"), this.#t(\"staticBackdrop\"), this.#t(\"noHeader\"), this.#t(\"noAnimations\"), this.#t(\"noCloseButton\"), this.#t(\"fullscreen\"), this.#t(\"preserveOverflow\"), this.#t(\"placement\"), this.#t(\"closeLabel\"), this.#e?.addEventListener(\"click\", this.#h), this.#e?.addEventListener(\"close\", this.#l), this.#e?.addEventListener(\"cancel\", this.#d), this.#e?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\", this.#c), this.#i?.addEventListener(\"slotchange\", this.#m), this.#a?.addEventListener(\"slotchange\", this.#g);\n }\n disconnectedCallback() {\n this.#o && clearTimeout(this.#o), this.#e?.addEventListener(\"click\", this.#h), this.#e?.removeEventListener(\"close\", this.#l), this.#e?.removeEventListener(\"cancel\", this.#d), this.#e?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\", this.#c), this.#i?.removeEventListener(\"slotchange\", this.#m), this.#a?.removeEventListener(\"slotchange\", this.#g);\n }\n get open() {\n return this.hasAttribute(\"open\");\n }\n set open(e) {\n this.toggleAttribute(\"open\", !!e);\n }\n get staticBackdrop() {\n return this.hasAttribute(\"static-backdrop\");\n }\n set staticBackdrop(e) {\n this.toggleAttribute(\"static-backdrop\", !!e);\n }\n get noHeader() {\n return this.hasAttribute(\"no-header\");\n }\n set noHeader(e) {\n this.toggleAttribute(\"no-header\", !!e);\n }\n get noAnimations() {\n return this.hasAttribute(\"no-animations\");\n }\n set noAnimations(e) {\n this.toggleAttribute(\"no-animations\", !!e);\n }\n get noCloseButton() {\n return this.hasAttribute(\"no-close-button\");\n }\n set noCloseButton(e) {\n this.toggleAttribute(\"no-close-button\", !!e);\n }\n get fullscreen() {\n return this.hasAttribute(\"fullscreen\");\n }\n set fullscreen(e) {\n this.toggleAttribute(\"fullscreen\", !!e);\n }\n get preserveOverflow() {\n return this.hasAttribute(\"preserve-overflow\");\n }\n set preserveOverflow(e) {\n this.toggleAttribute(\"preserve-overflow\", !!e);\n }\n get placement() {\n return this.getAttribute(\"placement\") || \"center\";\n }\n set placement(e) {\n this.setAttribute(\"placement\", e != null ? e.toString() : e);\n }\n get closeLabel() {\n return this.getAttribute(\"close-label\") || \"Close\";\n }\n set closeLabel(e) {\n this.setAttribute(\"close-label\", e != null ? e.toString() : e);\n }\n #r() {\n if (this.#e === null) return;\n let e = this.#e.querySelector(\".dialog__close\");\n if (e === null) return;\n (this.#a?.assignedElements() || [])?.some((o)=>o.textContent?.replace(/\\s/g, \"\") !== \"\") ? e.removeAttribute(\"aria-label\") : e.setAttribute(\"aria-label\", this.closeLabel);\n }\n #n() {\n this.#o || (this.#e?.classList.add(\"dialog--pulse\"), this.#o = setTimeout(()=>{\n this.#e?.classList.remove(\"dialog--pulse\"), clearTimeout(this.#o), this.#o = void 0;\n }, 300));\n }\n #l = ()=>{\n this.open = !1, this.dispatchEvent(new CustomEvent(\"me-close\", {\n bubbles: !0,\n composed: !0,\n detail: {\n element: this\n }\n })), document.body && !this.preserveOverflow && (document.body.style.overflow = \"\");\n };\n #d = (e)=>{\n let t = this.#s(\"escape-key\");\n this.dispatchEvent(t), t.defaultPrevented && (e.preventDefault(), !this.noAnimations && this.#n());\n };\n #c = (e)=>{\n let t = this.#s(\"close-button\");\n this.dispatchEvent(t), t.defaultPrevented && (e.preventDefault(), !this.noAnimations && this.#n());\n };\n #h = (e)=>{\n let t = e.target, i = e.currentTarget;\n if (t === i) {\n let o = this.#s(\"backdrop-click\");\n this.dispatchEvent(o), o.defaultPrevented || this.staticBackdrop ? !this.noAnimations && this.#n() : this.hide();\n }\n if (t instanceof HTMLElement && t.closest(\"[data-me-close]\") !== null) {\n let o = this.#s(\"external-invoker\");\n this.dispatchEvent(o), o.defaultPrevented ? !this.noAnimations && this.#n() : this.hide();\n }\n };\n #m = ()=>{\n if (this.#e === null) return;\n let e = this.#e.querySelector(\".dialog__footer\");\n if (e === null) return;\n let t = this.#i?.assignedNodes(), i = t ? t.length > 0 : !1;\n e.hidden = !i;\n };\n #g = ()=>{\n this.#r();\n };\n #s(e) {\n return new CustomEvent(\"me-request-close\", {\n bubbles: !0,\n composed: !0,\n cancelable: !0,\n detail: {\n reason: e,\n element: this\n }\n });\n }\n #t(e) {\n let t = this;\n if (Object.prototype.hasOwnProperty.call(t, e)) {\n let i = t[e];\n delete t[e], t[e] = i;\n }\n }\n show() {\n this.open || (this.open = !0);\n }\n hide() {\n this.open && (this.open = !1);\n }\n static defineCustomElement(e = \"modal-element\") {\n typeof window < \"u\" && !window.customElements.get(e) && window.customElements.define(e, s);\n }\n};\n$d9c5053bade2d3f8$export$32589115725b904b.defineCustomElement();\n\n\n/*!\n * @georapbox/files-dropzone-element\n * A custom element that creates a drag and drop zone for files\n *\n * @version 2.0.1\n * @homepage https://github.com/georapbox/files-dropzone-element#readme\n * @author George Raptis \n * @license MIT\n */ function $9351176e8d763a78$var$u(o, e = \"\") {\n if (!e) return !0;\n let t = [\n ...new Set(e.split(\",\").map((r)=>r.trim()).filter(Boolean))\n ], i = o.type, s = i.replace(/\\/.*$/, \"\");\n for (let r of t)if (r.charAt(0) === \".\") {\n if (o.name.toLowerCase().indexOf(r.toLowerCase(), o.name.length - r.length) !== -1) return !0;\n } else if (/\\/\\*$/.test(r)) {\n if (s === r.replace(/\\/.*$/, \"\")) return !0;\n } else if (i === r) return !0;\n return !1;\n}\nvar $9351176e8d763a78$var$x = new Map([\n [\n \"aac\",\n \"audio/aac\"\n ],\n [\n \"abw\",\n \"application/x-abiword\"\n ],\n [\n \"arc\",\n \"application/x-freearc\"\n ],\n [\n \"avif\",\n \"image/avif\"\n ],\n [\n \"avi\",\n \"video/x-msvideo\"\n ],\n [\n \"azw\",\n \"application/vnd.amazon.ebook\"\n ],\n [\n \"bin\",\n \"application/octet-stream\"\n ],\n [\n \"bmp\",\n \"image/bmp\"\n ],\n [\n \"bz\",\n \"application/x-bzip\"\n ],\n [\n \"bz2\",\n \"application/x-bzip2\"\n ],\n [\n \"cda\",\n \"application/x-cdf\"\n ],\n [\n \"csh\",\n \"application/x-csh\"\n ],\n [\n \"css\",\n \"text/css\"\n ],\n [\n \"csv\",\n \"text/csv\"\n ],\n [\n \"doc\",\n \"application/msword\"\n ],\n [\n \"docx\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n ],\n [\n \"eot\",\n \"application/vnd.ms-fontobject\"\n ],\n [\n \"epub\",\n \"application/epub+zip\"\n ],\n [\n \"gz\",\n \"application/gzip\"\n ],\n [\n \"gif\",\n \"image/gif\"\n ],\n [\n \"heic\",\n \"image/heic\"\n ],\n [\n \"heif\",\n \"image/heif\"\n ],\n [\n \"htm\",\n \"text/html\"\n ],\n [\n \"html\",\n \"text/html\"\n ],\n [\n \"ico\",\n \"image/vnd.microsoft.icon\"\n ],\n [\n \"ics\",\n \"text/calendar\"\n ],\n [\n \"jar\",\n \"application/java-archive\"\n ],\n [\n \"jpeg\",\n \"image/jpeg\"\n ],\n [\n \"jpg\",\n \"image/jpeg\"\n ],\n [\n \"jxl\",\n \"image/jxl\"\n ],\n [\n \"js\",\n \"text/javascript\"\n ],\n [\n \"json\",\n \"application/json\"\n ],\n [\n \"jsonld\",\n \"application/ld+json\"\n ],\n [\n \"markdown\",\n \"text/markdown\"\n ],\n [\n \"md\",\n \"text/markdown\"\n ],\n [\n \"mid\",\n \"audio/midi\"\n ],\n [\n \"midi\",\n \"audio/midi\"\n ],\n [\n \"mjs\",\n \"text/javascript\"\n ],\n [\n \"mp3\",\n \"audio/mpeg\"\n ],\n [\n \"mp4\",\n \"video/mp4\"\n ],\n [\n \"mpeg\",\n \"video/mpeg\"\n ],\n [\n \"mpkg\",\n \"application/vnd.apple.installer+xml\"\n ],\n [\n \"odp\",\n \"application/vnd.oasis.opendocument.presentation\"\n ],\n [\n \"ods\",\n \"application/vnd.oasis.opendocument.spreadsheet\"\n ],\n [\n \"odt\",\n \"application/vnd.oasis.opendocument.text\"\n ],\n [\n \"oga\",\n \"audio/ogg\"\n ],\n [\n \"ogv\",\n \"video/ogg\"\n ],\n [\n \"ogx\",\n \"application/ogg\"\n ],\n [\n \"opus\",\n \"audio/opus\"\n ],\n [\n \"otf\",\n \"font/otf\"\n ],\n [\n \"png\",\n \"image/png\"\n ],\n [\n \"pdf\",\n \"application/pdf\"\n ],\n [\n \"php\",\n \"application/x-httpd-php\"\n ],\n [\n \"ppt\",\n \"application/vnd.ms-powerpoint\"\n ],\n [\n \"pptx\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n ],\n [\n \"rar\",\n \"application/vnd.rar\"\n ],\n [\n \"rtf\",\n \"application/rtf\"\n ],\n [\n \"sh\",\n \"application/x-sh\"\n ],\n [\n \"svg\",\n \"image/svg+xml\"\n ],\n [\n \"swf\",\n \"application/x-shockwave-flash\"\n ],\n [\n \"tar\",\n \"application/x-tar\"\n ],\n [\n \"tif\",\n \"image/tiff\"\n ],\n [\n \"tiff\",\n \"image/tiff\"\n ],\n [\n \"ts\",\n \"video/mp2t\"\n ],\n [\n \"ttf\",\n \"font/ttf\"\n ],\n [\n \"txt\",\n \"text/plain\"\n ],\n [\n \"vsd\",\n \"application/vnd.visio\"\n ],\n [\n \"wav\",\n \"audio/wav\"\n ],\n [\n \"weba\",\n \"audio/webm\"\n ],\n [\n \"webm\",\n \"video/webm\"\n ],\n [\n \"webp\",\n \"image/webp\"\n ],\n [\n \"woff\",\n \"font/woff\"\n ],\n [\n \"woff2\",\n \"font/woff2\"\n ],\n [\n \"xhtml\",\n \"application/xhtml+xml\"\n ],\n [\n \"xls\",\n \"application/vnd.ms-excel\"\n ],\n [\n \"xlsx\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n ],\n [\n \"xml\",\n \"application/xml\"\n ],\n [\n \"xul\",\n \"application/vnd.mozilla.xul+xml\"\n ],\n [\n \"zip\",\n \"application/zip\"\n ],\n [\n \"7z\",\n \"application/x-7z-compressed\"\n ],\n [\n \"mkv\",\n \"video/x-matroska\"\n ],\n [\n \"mov\",\n \"video/quicktime\"\n ],\n [\n \"msg\",\n \"application/vnd.ms-outlook\"\n ]\n]), $9351176e8d763a78$var$b = [\n \".DS_Store\",\n \"Thumbs.db\"\n], $9351176e8d763a78$var$y = (o)=>{\n let { name: e } = o;\n if (e && e.lastIndexOf(\".\") !== -1 && !o.type) {\n let i = (e.split(\".\").pop() || \"\").toLowerCase(), s = $9351176e8d763a78$var$x.get(i);\n s && Object.defineProperty(o, \"type\", {\n value: s,\n writable: !1,\n configurable: !1,\n enumerable: !0\n });\n }\n return o;\n}, $9351176e8d763a78$var$g = (o, e)=>{\n let t = $9351176e8d763a78$var$y(o);\n if (typeof t.path != \"string\") {\n let { webkitRelativePath: i } = o;\n Object.defineProperty(t, \"path\", {\n value: typeof e == \"string\" ? e : i || o.name,\n writable: !1,\n configurable: !1,\n enumerable: !0\n });\n }\n return t;\n}, $9351176e8d763a78$var$m = async (o)=>await new Promise((e, t)=>{\n o.readEntries(e, t);\n }), $9351176e8d763a78$var$w = async (o)=>{\n let e = [], t = await $9351176e8d763a78$var$m(o);\n for(; t.length > 0;)e.push(...t), t = await $9351176e8d763a78$var$m(o);\n return e;\n}, $9351176e8d763a78$var$E = (o)=>new Promise((e, t)=>{\n o.file((i)=>e($9351176e8d763a78$var$g(i, o.fullPath)), t);\n }), $9351176e8d763a78$var$F = async (o)=>{\n let e = [], t = [];\n for (let i of o){\n if (i.kind !== \"file\") continue;\n let s = i.getAsEntry ? i.getAsEntry() : i.webkitGetAsEntry();\n t.push(s);\n }\n for(; t.length > 0;){\n let i = t.shift();\n if (i) {\n if (i.isFile) {\n let s = await $9351176e8d763a78$var$E(i);\n $9351176e8d763a78$var$b.indexOf(s.name) === -1 && e.push(s);\n } else i.isDirectory && t.push(...await $9351176e8d763a78$var$w(i.createReader()));\n } else continue;\n }\n return e;\n}, $9351176e8d763a78$var$f = async (o)=>{\n let e = [];\n for (let t of o)$9351176e8d763a78$var$b.indexOf(t.name) === -1 && e.push($9351176e8d763a78$var$g(t));\n return e;\n}, $9351176e8d763a78$var$l = async (o)=>o.dataTransfer ? o.dataTransfer.items ? await $9351176e8d763a78$var$F(o.dataTransfer.items) : await $9351176e8d763a78$var$f(o.dataTransfer.files) : await $9351176e8d763a78$var$f(o.target.files);\nvar $9351176e8d763a78$var$n = \"files-dropzone\", $9351176e8d763a78$var$v = \"TOO_MANY_FILES\", $9351176e8d763a78$var$L = \"FILE_TOO_LARGE\", $9351176e8d763a78$var$k = \"FILE_TOO_SMALL\", $9351176e8d763a78$var$A = \"INVALID_MIME_TYPE\", $9351176e8d763a78$var$z = document.createElement(\"template\"), $9351176e8d763a78$var$S = `\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n$9351176e8d763a78$var$z.innerHTML = `\n \n\n \n\n
\n Drag 'n' drop files here, or click to select files\n
\n`;\nvar $9351176e8d763a78$export$6ccd1735166caad9 = class o extends HTMLElement {\n #t = null;\n #e = null;\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\",\n delegatesFocus: !0\n }).appendChild($9351176e8d763a78$var$z.content.cloneNode(!0)), this.shadowRoot && (this.#t = this.shadowRoot.getElementById(\"file-input\"), this.#e = this.shadowRoot.getElementById(\"dropzone\"));\n }\n static get observedAttributes() {\n return [\n \"accept\",\n \"disabled\",\n \"multiple\"\n ];\n }\n attributeChangedCallback(e, t, i) {\n e === \"accept\" && t !== i && this.#t && (this.#t.accept = this.accept), e === \"disabled\" && t !== i && this.#t && (this.#t.disabled = this.disabled, this.disabled ? (this.#e?.removeAttribute(\"tabindex\"), this.#e?.setAttribute(\"aria-disabled\", \"true\")) : (this.#e?.setAttribute(\"tabindex\", \"0\"), this.#e?.setAttribute(\"aria-disabled\", \"false\"))), e === \"multiple\" && t !== i && this.#t && (this.#t.multiple = this.multiple);\n }\n connectedCallback() {\n this.#o(\"accept\"), this.#o(\"disabled\"), this.#o(\"maxFiles\"), this.#o(\"maxSize\"), this.#o(\"minSize\"), this.#o(\"multiple\"), this.#o(\"autoFocus\"), this.#o(\"noStyle\"), this.#t?.addEventListener(\"change\", this.#i), this.#e?.addEventListener(\"dragenter\", this.#r), this.#e?.addEventListener(\"dragover\", this.#s), this.#e?.addEventListener(\"dragleave\", this.#n), this.#e?.addEventListener(\"drop\", this.#a), this.#e?.addEventListener(\"click\", this.#d), this.#e?.addEventListener(\"keyup\", this.#l), this.autoFocus && this.#e?.focus();\n }\n disconnectedCallback() {\n this.#t?.removeEventListener(\"change\", this.#i), this.#e?.removeEventListener(\"dragenter\", this.#r), this.#e?.removeEventListener(\"dragover\", this.#s), this.#e?.removeEventListener(\"dragleave\", this.#n), this.#e?.removeEventListener(\"drop\", this.#a), this.#e?.removeEventListener(\"click\", this.#d), this.#e?.removeEventListener(\"keyup\", this.#l);\n }\n get accept() {\n return this.getAttribute(\"accept\") || \"\";\n }\n set accept(e) {\n this.setAttribute(\"accept\", e != null ? e.toString() : e);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(e) {\n this.toggleAttribute(\"disabled\", !!e);\n }\n get maxFiles() {\n let e = Number(this.getAttribute(\"max-files\")) || 0;\n return e <= 0 ? 1 / 0 : Math.floor(Math.abs(e));\n }\n set maxFiles(e) {\n this.setAttribute(\"max-files\", e != null ? e.toString() : e);\n }\n get maxSize() {\n let e = this.getAttribute(\"max-size\");\n if (e === null) return 1 / 0;\n let t = Number(e);\n return Number.isNaN(t) ? 1 / 0 : t;\n }\n set maxSize(e) {\n this.setAttribute(\"max-size\", e != null ? e.toString() : e);\n }\n get minSize() {\n let e = this.getAttribute(\"min-size\");\n if (e === null) return 0;\n let t = Number(e);\n return Number.isNaN(t) ? 0 : t;\n }\n set minSize(e) {\n this.setAttribute(\"min-size\", e != null ? e.toString() : e);\n }\n get multiple() {\n return this.hasAttribute(\"multiple\");\n }\n set multiple(e) {\n this.toggleAttribute(\"multiple\", !!e);\n }\n get autoFocus() {\n return this.hasAttribute(\"auto-focus\");\n }\n set autoFocus(e) {\n this.toggleAttribute(\"auto-focus\", !!e);\n }\n get noStyle() {\n return this.hasAttribute(\"no-style\");\n }\n set noStyle(e) {\n this.toggleAttribute(\"no-style\", !!e);\n }\n #i = async (e)=>{\n try {\n this.#c(await $9351176e8d763a78$var$l(e));\n } catch (t) {\n this.dispatchEvent(new CustomEvent(`${$9351176e8d763a78$var$n}-error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n }\n };\n #r = ()=>{\n this.disabled || this.dispatchEvent(new Event(`${$9351176e8d763a78$var$n}-dragenter`, {\n bubbles: !0,\n composed: !0\n }));\n };\n #s = (e)=>{\n if (e.preventDefault(), this.disabled) {\n e.dataTransfer.dropEffect = \"none\";\n return;\n }\n e.dataTransfer.dropEffect = \"copy\", this.#e && (this.#e.classList.add(\"dropzone--dragover\"), this.#e.part.add(\"dropzone--dragover\")), this.dispatchEvent(new Event(`${$9351176e8d763a78$var$n}-dragover`, {\n bubbles: !0,\n composed: !0\n }));\n };\n #n = ()=>{\n this.disabled || (this.#e && (this.#e.classList.remove(\"dropzone--dragover\"), this.#e.part.remove(\"dropzone--dragover\")), this.dispatchEvent(new Event(`${$9351176e8d763a78$var$n}-dragleave`, {\n bubbles: !0,\n composed: !0\n })));\n };\n #a = async (e)=>{\n if (!this.disabled) {\n e.preventDefault(), this.#e && (this.#e.classList.remove(\"dropzone--dragover\"), this.#e.part.remove(\"dropzone--dragover\"));\n try {\n this.#c(await $9351176e8d763a78$var$l(e));\n } catch (t) {\n this.dispatchEvent(new CustomEvent(`${$9351176e8d763a78$var$n}-error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n }\n }\n };\n #d = ()=>{\n this.disabled || this.#t?.click();\n };\n #l = (e)=>{\n this.disabled || (e.key === \" \" || e.key === \"Enter\") && this.#t?.click();\n };\n #c(e) {\n if (!Array.isArray(e) || !e.length) return;\n let t = [], i = [], s = e.length;\n if (!this.multiple && s > 1) for (let r of e)i.push({\n file: r,\n errors: [\n {\n code: $9351176e8d763a78$var$v,\n message: \"Too many files selected. Only 1 file is allowed.\"\n }\n ]\n });\n else if (this.multiple && s > this.maxFiles) for (let r of e)i.push({\n file: r,\n errors: [\n {\n code: $9351176e8d763a78$var$v,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? \"files are\" : \"file is\"} allowed.`\n }\n ]\n });\n else for (let r of e){\n let c = $9351176e8d763a78$var$u(r, this.accept), p = r.size > this.maxSize, h = r.size < this.minSize;\n if (c && !p && !h) t.push(r);\n else {\n let a = [];\n c || a.push({\n code: $9351176e8d763a78$var$A,\n message: `File type \"${r.type}\" is not accepted.`\n }), p && a.push({\n code: $9351176e8d763a78$var$L,\n message: `File size ${r.size} exceeds the maximum size of ${this.maxSize}.`\n }), h && a.push({\n code: $9351176e8d763a78$var$k,\n message: `File size ${r.size} is smaller than the minimum size of ${this.minSize}.`\n }), i.push({\n file: r,\n errors: a\n });\n }\n }\n this.dispatchEvent(new CustomEvent(`${$9351176e8d763a78$var$n}-drop`, {\n bubbles: !0,\n composed: !0,\n detail: {\n acceptedFiles: t,\n rejectedFiles: i\n }\n })), t.length > 0 && this.dispatchEvent(new CustomEvent(`${$9351176e8d763a78$var$n}-drop-accepted`, {\n bubbles: !0,\n composed: !0,\n detail: {\n acceptedFiles: t\n }\n })), i.length > 0 && this.dispatchEvent(new CustomEvent(`${$9351176e8d763a78$var$n}-drop-rejected`, {\n bubbles: !0,\n composed: !0,\n detail: {\n rejectedFiles: i\n }\n })), this.#t && (this.#t.value = this.#t.defaultValue);\n }\n openFileDialog() {\n this.disabled || this.#t?.click();\n }\n #o(e) {\n let t = this;\n if (Object.prototype.hasOwnProperty.call(t, e)) {\n let i = t[e];\n delete t[e], t[e] = i;\n }\n }\n static defineCustomElement(e = $9351176e8d763a78$var$n) {\n typeof window < \"u\" && !window.customElements.get(e) && window.customElements.define(e, o);\n }\n};\n$9351176e8d763a78$export$6ccd1735166caad9.defineCustomElement();\n\n\n\n\nconst $65136e012e05e2d7$export$63e7bed68b07a85c = [\n \"image/jpg\",\n \"image/jpeg\",\n \"image/png\",\n \"image/apng\",\n \"image/gif\",\n \"image/webp\",\n \"image/avif\"\n];\nconst $65136e012e05e2d7$export$62045be72fe457b4 = 20;\nconst $65136e012e05e2d7$export$8f089f0a062560ff = 20;\nconst $65136e012e05e2d7$export$d3f4819a57998cf7 = 360;\n\n\n/**\n * Generates a unique id of the form `${prefix}-${randomString}-${suffix}`.\n *\n * @param {string} [prefix=''] - The prefix to use for the id.\n * @param {string} [suffix=''] - The suffix to use for the id.\n * @returns {string} - The unique id.\n */ const $17004b28c97c1306$export$e2a22331486dcca0 = (prefix = \"\", suffix = \"\")=>{\n const prefixString = typeof prefix === \"string\" && prefix !== \"\" ? prefix + \"-\" : \"\";\n const suffixString = typeof suffix === \"string\" && suffix !== \"\" ? \"-\" + suffix : \"\";\n const randomString = Math.random().toString(36).substring(2, 8); // Pseudo-random string of six alphanumeric characters.\n return `${prefixString}${randomString}${suffixString}`;\n};\n\n\n\nconst $2669cb7c28251d2a$export$6539e087749cf9d3 = async (options = {})=>{\n const res = await fetch(options.url);\n const blob = await res.blob();\n const mimeType = options.mimeType || blob.type || \"\";\n if (!(0, $65136e012e05e2d7$export$63e7bed68b07a85c).includes(mimeType)) throw new Error(`This is not an accepted image format. Accepted MIME types are: ${(0, $65136e012e05e2d7$export$63e7bed68b07a85c).join(\", \")}`);\n return new File([\n blob\n ], options.filename || \"\", blob);\n};\n\n\n/**\n * A class representing a storage utility for managing data in `localStorage` or `sessionStorage`.\n */ class $9e093dbdf49c6d51$export$bf2a15d34f3c441c {\n /**\n * The prefix to be added to all keys.\n *\n * @type {string}\n * @private\n */ #keyPrefix = null;\n /**\n * The storage provider (`localStorage` or `sessionStorage`).\n *\n * @type {Storage}\n * @private\n */ #provider = null;\n /**\n * Creates an instance of Storage.\n *\n * @param {string} prefix - The prefix to be added to all keys when storing/retrieving data.\n * @param {Storage} [provider=localStorage] - The storage provider (`localStorage` or `sessionStorage`).\n * @throws {Error} If prefix is not provided or if the provider is not supported.\n */ constructor(prefix, provider = localStorage){\n if (!prefix) throw new Error(\"Storage prefix is required\");\n if (provider !== localStorage && provider !== sessionStorage) throw new Error(\"Storage provider is not supported\");\n this.#keyPrefix = prefix;\n this.#provider = provider;\n }\n /**\n * Sets a key-value pair in the storage.\n *\n * @param {string} key - The key for the data.\n * @param {*} value - The value to be stored (will be converted to JSON string).\n */ set(key, value) {\n try {\n this.#provider.setItem(`${this.#keyPrefix}${key}`, JSON.stringify(value));\n } catch (err) {\n console.error(\"Error saving to storage\", err);\n }\n }\n /**\n * Retrieves the value associated with the given key from the storage.\n *\n * @param {string} key - The key to retrieve the value for.\n * @returns {*} The value associated with the key, or `null` if key is not found or an error occurs.\n */ get(key) {\n try {\n const value = this.#provider.getItem(`${this.#keyPrefix}${key}`);\n return value ? JSON.parse(value) : null;\n } catch (err) {\n console.error(\"Error getting from storage\", err);\n return null;\n }\n }\n}\nconst $9e093dbdf49c6d51$var$DEFAULT_STORAGE_PREFIX = \"meme-generator/\";\nconst $9e093dbdf49c6d51$var$DEFAULT_STORAGE_PROVIDER = localStorage;\nconst $9e093dbdf49c6d51$export$ddcffe0146c8f882 = new $9e093dbdf49c6d51$export$bf2a15d34f3c441c($9e093dbdf49c6d51$var$DEFAULT_STORAGE_PREFIX, $9e093dbdf49c6d51$var$DEFAULT_STORAGE_PROVIDER);\n\n\nconst $c38b15b964e67d8b$export$de75f46579dcf24 = (selectedImage)=>{\n return typeof selectedImage === \"string\";\n};\n\n\nvar $e42bddb24cbeb64a$exports = {};\n$e42bddb24cbeb64a$exports = new URL(\"Pressuru.684952ea.ttf\", import.meta.url).toString();\n\n\nvar $73cffea1ce7b4c65$exports = {};\n$73cffea1ce7b4c65$exports = new URL(\"Oswald-Regular.89ec7d89.ttf\", import.meta.url).toString();\n\n\nvar $7ffd9e1ede1ff6e8$exports = {};\n$7ffd9e1ede1ff6e8$exports = new URL(\"Oswald-Bold.0f6a7ca6.ttf\", import.meta.url).toString();\n\n\nvar $4c6967df0d437c45$exports = {};\n$4c6967df0d437c45$exports = new URL(\"Roboto-Regular.ca197847.ttf\", import.meta.url).toString();\n\n\nvar $3b8ba92249dba9f8$exports = {};\n$3b8ba92249dba9f8$exports = new URL(\"Roboto-Bold.fdb9b54a.ttf\", import.meta.url).toString();\n\n\nvar $6ae2d9e238daf807$exports = {};\n$6ae2d9e238daf807$exports = new URL(\"RobotoCondensed-Regular.d585f5c7.ttf\", import.meta.url).toString();\n\n\nvar $16764e62b86810da$exports = {};\n$16764e62b86810da$exports = new URL(\"RobotoCondensed-Bold.e1f96d4b.ttf\", import.meta.url).toString();\n\n\nvar $d78526ca6254cbd7$exports = {};\n$d78526ca6254cbd7$exports = new URL(\"CourierPrime-Regular.3a25a501.ttf\", import.meta.url).toString();\n\n\nvar $2ba9f93d92a312e8$exports = {};\n$2ba9f93d92a312e8$exports = new URL(\"CourierPrime-Bold.3d6bf689.ttf\", import.meta.url).toString();\n\n\nvar $94512d98527e27c0$exports = {};\n$94512d98527e27c0$exports = new URL(\"OpenSans-Regular.edf9e01b.ttf\", import.meta.url).toString();\n\n\nvar $0ef27a7a117f4923$exports = {};\n$0ef27a7a117f4923$exports = new URL(\"OpenSans-Bold.8fceb72b.ttf\", import.meta.url).toString();\n\n\nconst $56b863c8b6be7003$export$6874249d87f2602a = [\n {\n name: \"Pressuru\",\n label: \"Pressuru\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($e42bddb24cbeb64a$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"Oswald-Regular\",\n label: \"Oswald\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($73cffea1ce7b4c65$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"Oswald-Bold\",\n label: \"Oswald Bold\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($7ffd9e1ede1ff6e8$exports))),\n style: \"normal\",\n weight: \"700\"\n },\n {\n name: \"Roboto-Regular\",\n label: \"Roboto\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($4c6967df0d437c45$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"Roboto-Bold\",\n label: \"Roboto Bold\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($3b8ba92249dba9f8$exports))),\n style: \"normal\",\n weight: \"700\"\n },\n {\n name: \"RobotoCondensed-Regular\",\n label: \"Roboto Condensed\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($6ae2d9e238daf807$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"RobotoCondensed-Bold\",\n label: \"Roboto Condensed Bold\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($16764e62b86810da$exports))),\n style: \"normal\",\n weight: \"700\"\n },\n {\n name: \"CourierPrime-Regular\",\n label: \"Courier Prime\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($d78526ca6254cbd7$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"CourierPrime-Bold\",\n label: \"Courier Prime Bold\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($2ba9f93d92a312e8$exports))),\n style: \"normal\",\n weight: \"700\"\n },\n {\n name: \"OpenSans-Regular\",\n label: \"Open Sans\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($94512d98527e27c0$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"OpenSans-Bold\",\n label: \"Open Sans Bold\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($0ef27a7a117f4923$exports))),\n style: \"normal\",\n weight: \"400\"\n }\n];\nconst $56b863c8b6be7003$export$59eceaef0c7797b2 = async (name, path, options = {})=>{\n try {\n const font = new FontFace(name, `url(${path})`, {\n ...options\n });\n await font.load();\n document.fonts.add(font);\n } catch (err) {\n console.error(err);\n }\n};\n\n\nconst $3969451ff60cb8d5$var$errorsContainer = document.getElementById(\"errorsContainer\");\nconst $3969451ff60cb8d5$var$hideError = (evt)=>{\n const target = evt.currentTarget;\n target.removeEventListener(\"click\", $3969451ff60cb8d5$var$hideError);\n $3969451ff60cb8d5$var$errorsContainer.removeChild(target.parentNode);\n};\nconst $3969451ff60cb8d5$export$af04143326425dbd = (message = \"\", type = \"info\")=>{\n const types = [\n \"info\",\n \"warning\",\n \"danger\"\n ];\n if (!types.includes(type)) type = \"info\";\n const template = /* html */ `\n ${message}\n \n `;\n const div = document.createElement(\"div\");\n div.className = `alert alert-${type} alert-dismissible text-break mb-2 fade`;\n div.innerHTML = template;\n div.querySelector(\"button\").addEventListener(\"click\", $3969451ff60cb8d5$var$hideError);\n $3969451ff60cb8d5$var$errorsContainer.appendChild(div);\n setTimeout(()=>div.classList.add(\"show\"), 100);\n};\n\n\n\n\n\nconst $a5e4a78f80aa8693$var$defaultTextboxData = {\n id: \"\",\n text: \"\",\n fillColor: \"#ffffff\",\n strokeColor: \"#000000\",\n font: \"Pressuru\",\n fontSize: 40,\n fontWeight: \"normal\",\n textAlign: \"center\",\n shadowBlur: 0,\n strokeWidth: 1.5,\n offsetY: 0,\n offsetX: 0,\n rotate: 0,\n allCaps: true\n};\nconst $a5e4a78f80aa8693$var$textboxes = new Map();\nclass $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b {\n constructor(data){\n const id = (0, $17004b28c97c1306$export$e2a22331486dcca0)(\"textbox\", Date.now().toString(36));\n this.data = data ? {\n ...data,\n id: id\n } : {\n ...$a5e4a78f80aa8693$var$defaultTextboxData,\n id: id\n };\n $a5e4a78f80aa8693$var$textboxes.set(id, this);\n document.dispatchEvent(new CustomEvent(`textbox-create`, {\n bubbles: true,\n composed: true,\n detail: {\n textbox: this\n }\n }));\n }\n getData() {\n return this.data;\n }\n static create(data) {\n return new $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b(data);\n }\n static getAll() {\n return $a5e4a78f80aa8693$var$textboxes;\n }\n static getById(id) {\n return $a5e4a78f80aa8693$var$textboxes.get(id);\n }\n static remove(id) {\n $a5e4a78f80aa8693$var$textboxes.delete(id);\n document.dispatchEvent(new CustomEvent(`textbox-remove`, {\n bubbles: true,\n composed: true,\n detail: {\n id: id\n }\n }));\n }\n static createElement(textbox, autoFocus = true) {\n if (!(textbox instanceof $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b)) return;\n const data = textbox.getData();\n const { id: id, text: text, fillColor: fillColor, strokeColor: strokeColor, fontSize: fontSize, shadowBlur: shadowBlur, strokeWidth: strokeWidth, offsetX: offsetX, offsetY: offsetY, rotate: rotate } = data;\n const template = /* html */ `\n
\n \n \n\n \n\n
\n \n \n\n \n \n\n \n
\n
\n\n \n `;\n const fragment = document.createDocumentFragment();\n const div = document.createElement(\"div\");\n div.setAttribute(\"id\", id);\n div.setAttribute(\"data-section\", \"textbox\");\n div.className = \"bg-light border shadow-sm mb-3 rounded\";\n div.innerHTML = template;\n div.querySelectorAll(\"select\").forEach((el)=>el.value = data[el.dataset.input]);\n div.querySelectorAll('input[type=\"checkbox\"]').forEach((el)=>el.checked = data[el.dataset.input]);\n const textboxEl = fragment.appendChild(div);\n if (autoFocus) setTimeout(()=>textboxEl.querySelector('[data-input=\"text\"]').focus(), 0);\n return textboxEl;\n }\n}\n\n\n\n\nclass $9b58d7721ff4a93e$export$8d01c972ee8b14a9 {\n #canvas = null;\n #ctx = null;\n constructor(canvasEl){\n this.#canvas = canvasEl;\n this.#ctx = this.#canvas.getContext(\"2d\");\n }\n get width() {\n return this.#canvas.width;\n }\n set width(value) {\n this.#canvas.width = value;\n }\n get height() {\n return this.#canvas.height;\n }\n set height(value) {\n this.#canvas.height = value;\n }\n getDimensions() {\n return {\n width: this.width,\n height: this.height\n };\n }\n setDimensions({ width: width, height: height }) {\n this.width = width;\n this.height = height;\n return this;\n }\n toDataURL() {\n return this.#canvas.toDataURL();\n }\n draw(image, textboxes = new Map()) {\n if (image == null) return;\n const canvas = this.#canvas;\n const ctx = this.#ctx;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n if ((0, $c38b15b964e67d8b$export$de75f46579dcf24)(image)) {\n ctx.fillStyle = image;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n } else ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n let multiplier = 0;\n textboxes.forEach((textbox)=>{\n const { data: data } = textbox;\n multiplier += 1;\n ctx.save();\n ctx.font = `${data.fontWeight} ${data.fontSize * canvas.width / 1000}px ${data.font}`;\n ctx.fillStyle = data.fillColor;\n ctx.textAlign = data.textAlign;\n ctx.strokeStyle = data.strokeColor;\n const lineHeight = ctx.measureText(\"M\").width + data.fontSize / 2;\n const xPos = canvas.width / 2;\n const shadowBlur = data.shadowBlur;\n const text = data.allCaps === true ? data.text.toUpperCase() : data.text;\n const textLines = text.split(\"\\n\");\n if (shadowBlur !== 0) {\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n ctx.shadowBlur = Math.min(shadowBlur, (0, $65136e012e05e2d7$export$62045be72fe457b4));\n ctx.shadowColor = data.strokeColor;\n }\n ctx.translate(xPos + data.offsetX, lineHeight * multiplier + data.offsetY);\n ctx.rotate(Math.min(data.rotate, (0, $65136e012e05e2d7$export$d3f4819a57998cf7)) * Math.PI / 180);\n // First draw each line with shadow.\n textLines.forEach((text, index)=>ctx.fillText(text, 0, index * lineHeight));\n // Since shadows of multiline text may be drawn over letters of neighbour lines\n // (when shadow blur is big enough), re-draw text without shadows.\n if (shadowBlur !== 0) {\n ctx.shadowBlur = 0;\n textLines.forEach((text, index)=>ctx.fillText(text, 0, index * lineHeight));\n }\n if (data.strokeWidth > 0) {\n ctx.lineWidth = Math.min(data.strokeWidth, (0, $65136e012e05e2d7$export$8f089f0a062560ff));\n textLines.forEach((text, index)=>ctx.strokeText(text, 0, index * lineHeight));\n }\n ctx.restore();\n });\n return this;\n }\n clear() {\n this.#ctx.clearRect(0, 0, this.#canvas.width, this.#canvas.height);\n return this;\n }\n show() {\n this.#canvas.hidden = false;\n return this;\n }\n hide() {\n this.#canvas.hidden = true;\n return this;\n }\n static createInstance(canvasEl) {\n return new $9b58d7721ff4a93e$export$8d01c972ee8b14a9(canvasEl);\n }\n}\n\n\nconst $85a5f86b715fe7db$var$canvas = (0, $9b58d7721ff4a93e$export$8d01c972ee8b14a9).createInstance(document.getElementById(\"canvas\"));\nconst $85a5f86b715fe7db$var$videoModal = document.getElementById(\"videoModal\");\nconst $85a5f86b715fe7db$var$downloadModal = document.getElementById(\"downloadModal\");\nconst $85a5f86b715fe7db$var$capturePhotoEl = document.querySelector(\"capture-photo\");\nconst $85a5f86b715fe7db$var$cameraSelect = document.getElementById(\"cameraSelect\");\nconst $85a5f86b715fe7db$var$capturePhotoButton = document.getElementById(\"capturePhotoButton\");\nconst $85a5f86b715fe7db$var$torchButton = document.getElementById(\"torchButton\");\nconst $85a5f86b715fe7db$var$dropzoneEl = document.querySelector(\"files-dropzone\");\nconst $85a5f86b715fe7db$var$instructionsEl = document.getElementById(\"instructions\");\nconst $85a5f86b715fe7db$var$imageUploadMethodSelect = document.getElementById(\"imageUploadMethodSelect\");\nconst $85a5f86b715fe7db$var$fileSelectBtn = document.getElementById(\"fileSelectBtn\");\nconst $85a5f86b715fe7db$var$imageUrlForm = document.getElementById(\"imageUrlForm\");\nconst $85a5f86b715fe7db$var$addTextboxBtn = document.getElementById(\"addTextboxBtn\");\nconst $85a5f86b715fe7db$var$textboxesContainer = document.getElementById(\"textboxesContainer\");\nconst $85a5f86b715fe7db$var$generateMemeBtn = document.getElementById(\"generateMemeBtn\");\nconst $85a5f86b715fe7db$var$openVideoModalBtn = document.getElementById(\"openVideoModalBtn\");\nconst $85a5f86b715fe7db$var$downloadMemeBtn = document.getElementById(\"downloadMemeBtn\");\nconst $85a5f86b715fe7db$var$downloadMemePreview = document.getElementById(\"downloadMemePreview\");\nconst $85a5f86b715fe7db$var$webShareComponent = document.querySelector(\"web-share\");\nconst $85a5f86b715fe7db$var$galleryEl = document.getElementById(\"gallery\");\nconst $85a5f86b715fe7db$var$gallerySearchEl = document.getElementById(\"gallerySearch\");\nconst $85a5f86b715fe7db$var$galleryNoResultsEl = $85a5f86b715fe7db$var$galleryEl.querySelector(\".gallery__no-results\");\nconst $85a5f86b715fe7db$var$solidColorForm = document.getElementById(\"solidColorForm\");\nconst $85a5f86b715fe7db$var$uploadMethodEls = document.querySelectorAll(\".upload-method\");\nconst $85a5f86b715fe7db$var$removeConfirmationModal = document.getElementById(\"removeConfirmationModal\");\nconst $85a5f86b715fe7db$var$removeTextForm = document.getElementById(\"removeTextForm\");\nconst $85a5f86b715fe7db$var$maxImageDimensionsForm = document.getElementById(\"maxImageDimensionsForm\");\nconst $85a5f86b715fe7db$var$maxImageDimensionsSelect = $85a5f86b715fe7db$var$maxImageDimensionsForm[\"maxImageDimensions\"];\nconst $85a5f86b715fe7db$var$clearCanvasBtn = document.getElementById(\"clearCanvasBtn\");\nconst $85a5f86b715fe7db$var$maxImageDimensionsFromStorage = (0, $9e093dbdf49c6d51$export$ddcffe0146c8f882).get(\"maxImageDimensions\");\nlet $85a5f86b715fe7db$var$shouldFocusOnTextboxCreate = false;\nlet $85a5f86b715fe7db$var$selectedImage = null;\nlet $85a5f86b715fe7db$var$reqAnimFrame = null;\nconst $85a5f86b715fe7db$var$renderAcceptedImageFormats = (acceptedMimeTypes, rootEl)=>{\n if (!rootEl) return;\n const extensions = acceptedMimeTypes.map((mimeType)=>mimeType.split(\"/\")[1]);\n const str = `Supported image formats: ${extensions.join(\", \")}`;\n const div = document.createElement(\"div\");\n const small = document.createElement(\"small\");\n small.textContent = str;\n div.appendChild(small);\n rootEl.appendChild(small);\n};\nconst $85a5f86b715fe7db$var$generateMeme = async ()=>{\n const dataUrl = $85a5f86b715fe7db$var$canvas.toDataURL(\"image/png\");\n const filename = `${(0, $17004b28c97c1306$export$e2a22331486dcca0)(\"meme\")}.png`;\n // Prepare download link\n const downloadLink = dataUrl.replace(\"image/png\", \"image/octet-stream\");\n $85a5f86b715fe7db$var$downloadMemeBtn.download = filename;\n $85a5f86b715fe7db$var$downloadMemeBtn.href = downloadLink;\n $85a5f86b715fe7db$var$downloadMemePreview.width = $85a5f86b715fe7db$var$canvas.getDimensions().width;\n $85a5f86b715fe7db$var$downloadMemePreview.height = $85a5f86b715fe7db$var$canvas.getDimensions().height;\n $85a5f86b715fe7db$var$downloadMemePreview.src = downloadLink;\n // Prepare for sharing file\n if ((0, $7a2aca835bb05064$export$c37129e465f64ef0)()) try {\n const file = await (0, $2669cb7c28251d2a$export$6539e087749cf9d3)({\n url: dataUrl,\n filename: filename,\n mimeType: \"image/png\"\n }).catch((err)=>(0, $3969451ff60cb8d5$export$af04143326425dbd)(err.message, \"danger\"));\n if (file && (0, $7a2aca835bb05064$export$c37129e465f64ef0)({\n files: [\n file\n ]\n })) {\n $85a5f86b715fe7db$var$webShareComponent.shareFiles = [\n file\n ];\n $85a5f86b715fe7db$var$webShareComponent.hidden = false;\n }\n } catch (error) {\n console.error(error);\n }\n window.requestAnimationFrame(()=>{\n $85a5f86b715fe7db$var$downloadModal.open = true;\n });\n};\nconst $85a5f86b715fe7db$var$setImageMaxDimensions = (image)=>{\n const maxImageDimensionsSelect = $85a5f86b715fe7db$var$maxImageDimensionsForm[\"maxImageDimensions\"];\n const [maxWidthValue, maxHeightValue] = maxImageDimensionsSelect.value.split(\"x\");\n const MAX_WIDTH = Number(maxWidthValue) || 800;\n const MAX_HEIGHT = Number(maxHeightValue) || 600;\n let width = image.width;\n let height = image.height;\n if (width > height) {\n if (width > MAX_WIDTH) {\n height *= MAX_WIDTH / width;\n width = MAX_WIDTH;\n }\n } else if (height > MAX_HEIGHT) {\n width *= MAX_HEIGHT / height;\n height = MAX_HEIGHT;\n }\n $85a5f86b715fe7db$var$canvas.setDimensions({\n width: width,\n height: height\n });\n};\nconst $85a5f86b715fe7db$var$afterImageSelect = ()=>{\n $85a5f86b715fe7db$var$canvas.draw($85a5f86b715fe7db$var$selectedImage, (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).getAll()).show();\n $85a5f86b715fe7db$var$dropzoneEl.classList.add(\"dropzone--accepted\");\n $85a5f86b715fe7db$var$dropzoneEl.disabled = true;\n $85a5f86b715fe7db$var$generateMemeBtn.disabled = false;\n $85a5f86b715fe7db$var$instructionsEl.hidden = true;\n $85a5f86b715fe7db$var$clearCanvasBtn.hidden = false;\n};\nconst $85a5f86b715fe7db$var$handleImageLoad = (evt)=>{\n $85a5f86b715fe7db$var$selectedImage = evt.target;\n $85a5f86b715fe7db$var$setImageMaxDimensions($85a5f86b715fe7db$var$selectedImage);\n $85a5f86b715fe7db$var$afterImageSelect();\n};\nconst $85a5f86b715fe7db$var$handleSolidColorFormInput = (evt)=>{\n const DEFAULT_WIDTH = 800;\n const DEFAULT_HEIGHT = 600;\n if (evt.target === $85a5f86b715fe7db$var$solidColorForm[\"canvasColor\"]) $85a5f86b715fe7db$var$selectedImage = evt.target.value;\n if ((0, $c38b15b964e67d8b$export$de75f46579dcf24)($85a5f86b715fe7db$var$selectedImage)) {\n $85a5f86b715fe7db$var$canvas.setDimensions({\n width: Number($85a5f86b715fe7db$var$solidColorForm[\"canvasWidth\"].value) || DEFAULT_WIDTH,\n height: Number($85a5f86b715fe7db$var$solidColorForm[\"canvasHeight\"].value) || DEFAULT_HEIGHT\n });\n $85a5f86b715fe7db$var$afterImageSelect();\n }\n};\nconst $85a5f86b715fe7db$var$handleFileSelect = (file)=>{\n if (!file) return;\n const image = new Image();\n const reader = new FileReader();\n reader.addEventListener(\"load\", function(evt) {\n const data = evt.target.result;\n image.addEventListener(\"load\", $85a5f86b715fe7db$var$handleImageLoad);\n image.src = data;\n });\n reader.readAsDataURL(file);\n};\nconst $85a5f86b715fe7db$var$handleOpenVideoModalButtonClick = ()=>{\n $85a5f86b715fe7db$var$videoModal.open = true;\n};\nconst $85a5f86b715fe7db$var$handleTextPropChange = (element, textboxId, prop)=>{\n const textboxData = (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).getById(textboxId).getData();\n switch(element.type){\n case \"checkbox\":\n textboxData[prop] = element.checked;\n break;\n case \"number\":\n textboxData[prop] = Number(element.value);\n break;\n default:\n textboxData[prop] = element.value;\n }\n $85a5f86b715fe7db$var$canvas.draw($85a5f86b715fe7db$var$selectedImage, (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).getAll());\n};\nconst $85a5f86b715fe7db$var$handleAddTextboxBtnClick = ()=>(0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).create();\nconst $85a5f86b715fe7db$var$handleImageUploadFromURL = async (evt)=>{\n evt.preventDefault();\n const form = evt.target;\n const submitButton = form.querySelector('button[type=\"submit\"]');\n const imageUrl = form[\"imageUrl\"].value;\n if (!imageUrl.trim()) return;\n submitButton.disabled = true;\n submitButton.querySelector(\".spinner\").hidden = false;\n submitButton.querySelector(\".label\").hidden = true;\n try {\n const file = await (0, $2669cb7c28251d2a$export$6539e087749cf9d3)({\n url: imageUrl\n }).catch((err)=>(0, $3969451ff60cb8d5$export$af04143326425dbd)(err.message, \"danger\"));\n if (file) $85a5f86b715fe7db$var$handleFileSelect(file);\n } catch {\n (0, $3969451ff60cb8d5$export$af04143326425dbd)(`Failed to load image from \"${imageUrl}\".`, \"danger\");\n } finally{\n submitButton.disabled = false;\n submitButton.querySelector(\".spinner\").hidden = true;\n submitButton.querySelector(\".label\").hidden = false;\n }\n};\nconst $85a5f86b715fe7db$var$moveTextUsingArrowbuttons = (textboxId, direction)=>()=>{\n const textboxEl = document.getElementById(textboxId);\n const offsetYInput = textboxEl.querySelector('[data-input=\"offsetY\"]');\n const offsetXInput = textboxEl.querySelector('[data-input=\"offsetX\"]');\n const textbox = (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).getById(textboxId);\n if (!textbox) return;\n const textboxData = textbox.getData();\n direction = direction.toLowerCase();\n switch(direction){\n case \"up\":\n textboxData.offsetY -= 1;\n offsetYInput.value = textboxData.offsetY;\n break;\n case \"down\":\n textboxData.offsetY += 1;\n offsetYInput.value = textboxData.offsetY;\n break;\n case \"left\":\n textboxData.offsetX -= 1;\n offsetXInput.value = textboxData.offsetX;\n break;\n case \"right\":\n textboxData.offsetX += 1;\n offsetXInput.value = textboxData.offsetX;\n break;\n }\n $85a5f86b715fe7db$var$canvas.draw($85a5f86b715fe7db$var$selectedImage, (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).getAll());\n $85a5f86b715fe7db$var$reqAnimFrame = requestAnimationFrame($85a5f86b715fe7db$var$moveTextUsingArrowbuttons(textboxId, direction));\n };\nconst $85a5f86b715fe7db$var$handleUploadMethodChange = (evt)=>{\n $85a5f86b715fe7db$var$uploadMethodEls.forEach((el)=>el.hidden = el.id !== evt.target.value);\n $85a5f86b715fe7db$var$maxImageDimensionsForm.hidden = evt.target.value === \"solidColorForm\";\n};\nconst $85a5f86b715fe7db$var$handleFileSelectClick = ()=>{\n if (typeof $85a5f86b715fe7db$var$dropzoneEl.openFileDialog === \"function\") $85a5f86b715fe7db$var$dropzoneEl.openFileDialog();\n};\nconst $85a5f86b715fe7db$var$handleDropFilesAccepted = (evt)=>{\n const [file] = evt.detail.acceptedFiles;\n if (file) $85a5f86b715fe7db$var$handleFileSelect(file);\n};\nconst $85a5f86b715fe7db$var$handleTextboxesContainerInput = (evt)=>{\n const element = evt.target;\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n let prop;\n if (element.matches('[data-input=\"text\"]')) prop = \"text\";\n else if (element.matches('[data-input=\"fillColor\"]')) prop = \"fillColor\";\n else if (element.matches('[data-input=\"strokeColor\"]')) prop = \"strokeColor\";\n else if (element.matches('[data-input=\"font\"]')) prop = \"font\";\n else if (element.matches('[data-input=\"fontSize\"]')) prop = \"fontSize\";\n else if (element.matches('[data-input=\"fontWeight\"]')) prop = \"fontWeight\";\n else if (element.matches('[data-input=\"textAlign\"]')) prop = \"textAlign\";\n else if (element.matches('[data-input=\"shadowBlur\"]')) prop = \"shadowBlur\";\n else if (element.matches('[data-input=\"offsetY\"]')) prop = \"offsetY\";\n else if (element.matches('[data-input=\"offsetX\"]')) prop = \"offsetX\";\n else if (element.matches('[data-input=\"rotate\"]')) prop = \"rotate\";\n else if (element.matches('[data-input=\"strokeWidth\"]')) prop = \"strokeWidth\";\n if (prop) $85a5f86b715fe7db$var$handleTextPropChange(element, textboxId, prop);\n};\nconst $85a5f86b715fe7db$var$handleTextboxesContainerChange = (evt)=>{\n const element = evt.target;\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n let prop;\n if (element.matches('[data-input=\"allCaps\"]')) prop = \"allCaps\";\n if (prop) $85a5f86b715fe7db$var$handleTextPropChange(element, textboxId, prop);\n};\nconst $85a5f86b715fe7db$var$handleTextboxesContainerClick = (evt)=>{\n const element = evt.target;\n if (element.matches('[data-button=\"settings\"]')) {\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n const textboxSettingsEl = textboxEl?.querySelector('[data-section=\"settings\"]');\n if (textboxSettingsEl) textboxSettingsEl.hidden = !textboxSettingsEl.hidden;\n }\n if (element.matches('[data-button=\"duplicate-text-box\"')) {\n const currentTextboxEl = element.closest('[data-section=\"textbox\"]');\n const currentTextboxData = (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).getById(currentTextboxEl.id);\n (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).create({\n ...currentTextboxData.data\n });\n }\n if (element.matches('[data-button=\"delete-text-box\"]')) {\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n const textboxToDelete = (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).getById(textboxId);\n if (textboxToDelete && textboxToDelete.data.text.trim()) {\n const textboxIdInput = $85a5f86b715fe7db$var$removeTextForm[\"textbox-id\"];\n if (textboxIdInput) {\n textboxIdInput.value = textboxId;\n $85a5f86b715fe7db$var$removeConfirmationModal.open = true;\n }\n } else (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).remove(textboxId);\n }\n};\nconst $85a5f86b715fe7db$var$handleTextRemoveFormSubmit = (evt)=>{\n evt.preventDefault();\n const textboxId = evt.target[\"textbox-id\"].value;\n if (textboxId) {\n (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).remove(textboxId);\n $85a5f86b715fe7db$var$removeConfirmationModal.open = false;\n }\n};\nconst $85a5f86b715fe7db$var$handleTextboxesContainerPointerdown = (evt)=>{\n const element = evt.target;\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n if (!textboxEl) return;\n if (element.matches('[data-action=\"move-text\"]')) $85a5f86b715fe7db$var$reqAnimFrame = requestAnimationFrame($85a5f86b715fe7db$var$moveTextUsingArrowbuttons(textboxEl.id, element.getAttribute(\"aria-label\")));\n};\nconst $85a5f86b715fe7db$var$handleTextboxesContainerPointerup = (evt)=>{\n const element = evt.target;\n if (element.matches('[data-action=\"move-text\"]')) {\n cancelAnimationFrame && cancelAnimationFrame($85a5f86b715fe7db$var$reqAnimFrame);\n $85a5f86b715fe7db$var$reqAnimFrame = null;\n }\n};\nconst $85a5f86b715fe7db$var$handleTextboxesContainerPointerout = (evt)=>{\n const element = evt.target;\n if (element.matches('[data-action=\"move-text\"]')) {\n cancelAnimationFrame && cancelAnimationFrame($85a5f86b715fe7db$var$reqAnimFrame);\n $85a5f86b715fe7db$var$reqAnimFrame = null;\n }\n};\nconst $85a5f86b715fe7db$var$handleTextboxesContainerKeyDown = (evt)=>{\n const element = evt.target;\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n if (element.matches('[data-action=\"move-text\"]')) {\n if (evt.key === \" \" || evt.key === \"Enter\") {\n $85a5f86b715fe7db$var$reqAnimFrame && cancelAnimationFrame($85a5f86b715fe7db$var$reqAnimFrame);\n $85a5f86b715fe7db$var$reqAnimFrame = requestAnimationFrame($85a5f86b715fe7db$var$moveTextUsingArrowbuttons(textboxEl.id, element.getAttribute(\"aria-label\")));\n }\n }\n};\nconst $85a5f86b715fe7db$var$handleTextboxesContainerKeyUp = (evt)=>{\n const element = evt.target;\n if (element.matches('[data-action=\"move-text\"]')) {\n if (evt.key === \" \" || evt.key === \"Enter\") {\n $85a5f86b715fe7db$var$reqAnimFrame && cancelAnimationFrame($85a5f86b715fe7db$var$reqAnimFrame);\n $85a5f86b715fe7db$var$reqAnimFrame = null;\n }\n }\n};\nconst $85a5f86b715fe7db$var$handleGalleryClick = async (evt)=>{\n const button = evt.target.closest(\"button\");\n if (!button) return;\n const img = button.querySelector(\"img\");\n try {\n const file = await (0, $2669cb7c28251d2a$export$6539e087749cf9d3)({\n url: img.src\n }).catch((err)=>(0, $3969451ff60cb8d5$export$af04143326425dbd)(err.message, \"danger\"));\n if (file) $85a5f86b715fe7db$var$handleFileSelect(file);\n } catch {\n (0, $3969451ff60cb8d5$export$af04143326425dbd)(`Failed to load image: \"${img.alt}\".`, \"danger\");\n }\n};\nconst $85a5f86b715fe7db$var$handleGallerySearchInput = (evt)=>{\n const query = evt.target.value.toLowerCase().trim();\n const galleryItems = $85a5f86b715fe7db$var$galleryEl.querySelectorAll(\"button\");\n galleryItems.forEach((item)=>{\n const alt = (item.querySelector(\"img\").getAttribute(\"alt\") || \"\").toLowerCase();\n item.hidden = !alt.includes(query);\n });\n $85a5f86b715fe7db$var$galleryNoResultsEl.hidden = !!$85a5f86b715fe7db$var$galleryEl.querySelector(\"button:not([hidden])\");\n};\nconst $85a5f86b715fe7db$var$handleWebShareError = ()=>{\n $85a5f86b715fe7db$var$downloadModal.open = false;\n (0, $3969451ff60cb8d5$export$af04143326425dbd)(\"There was an error while trying to share your meme.\", \"danger\");\n};\nconst $85a5f86b715fe7db$var$handleCapturePhotoError = (evt)=>{\n const error = evt.detail.error;\n let errorMessage = \"An error occurred while trying to capture photo.\";\n if (error instanceof Error && (error.name === \"NotAllowedError\" || error.name === \"NotFoundError\")) errorMessage += \" Make sure you have a camera connected and you have granted the appropriate permissions.\";\n (0, $3969451ff60cb8d5$export$af04143326425dbd)(errorMessage, \"danger\");\n $85a5f86b715fe7db$var$videoModal.open = false;\n console.error(error);\n};\nconst $85a5f86b715fe7db$var$handleCapturePhotoSuccess = (evt)=>{\n $85a5f86b715fe7db$var$videoModal.open = false;\n const image = new Image();\n image.addEventListener(\"load\", $85a5f86b715fe7db$var$handleImageLoad);\n image.src = evt.detail.dataURI;\n};\nconst $85a5f86b715fe7db$var$handleModalOpen = (evt)=>{\n if (evt.target.id === \"videoModal\") {\n if ($85a5f86b715fe7db$var$capturePhotoEl && typeof $85a5f86b715fe7db$var$capturePhotoEl.startVideoStream === \"function\") $85a5f86b715fe7db$var$capturePhotoEl.startVideoStream();\n }\n};\nconst $85a5f86b715fe7db$var$handleModalClose = (evt)=>{\n if (evt.target.id === \"videoModal\") {\n if ($85a5f86b715fe7db$var$capturePhotoEl && typeof $85a5f86b715fe7db$var$capturePhotoEl.stopVideoStream === \"function\") $85a5f86b715fe7db$var$capturePhotoEl.stopVideoStream();\n }\n if (evt.target.id === \"removeConfirmationModal\") $85a5f86b715fe7db$var$removeTextForm.reset();\n};\nconst $85a5f86b715fe7db$var$handleEmojiPickerSelection = (evt)=>{\n const textboxEl = evt.target.closest('[data-section=\"textbox\"]');\n if (textboxEl) {\n const input = textboxEl.querySelector('[data-input=\"text\"]');\n const emoji = evt.detail.unicode;\n if (input) (0, $bf4f0cf05f6fd378$export$2e2bcd8739ae039)(input, emoji);\n }\n};\nconst $85a5f86b715fe7db$var$handleMaxImageDimensionsFormChange = (evt)=>{\n if (evt.target.matches('[name=\"maxImageDimensions\"]')) (0, $9e093dbdf49c6d51$export$ddcffe0146c8f882).set(\"maxImageDimensions\", evt.target.value);\n if (!$85a5f86b715fe7db$var$selectedImage || (0, $c38b15b964e67d8b$export$de75f46579dcf24)($85a5f86b715fe7db$var$selectedImage)) return;\n $85a5f86b715fe7db$var$setImageMaxDimensions($85a5f86b715fe7db$var$selectedImage);\n $85a5f86b715fe7db$var$canvas.draw($85a5f86b715fe7db$var$selectedImage, (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).getAll());\n};\nconst $85a5f86b715fe7db$var$handleTextboxCreate = (evt)=>{\n const textbox = evt.detail.textbox;\n const textboxEl = (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).createElement(textbox, $85a5f86b715fe7db$var$shouldFocusOnTextboxCreate);\n $85a5f86b715fe7db$var$shouldFocusOnTextboxCreate = true;\n $85a5f86b715fe7db$var$textboxesContainer.appendChild(textboxEl);\n if (textbox.getData().text) $85a5f86b715fe7db$var$canvas.draw($85a5f86b715fe7db$var$selectedImage, (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).getAll());\n};\nconst $85a5f86b715fe7db$var$handleTextboxDelete = (evt)=>{\n const textboxEl = document.getElementById(evt.detail.id);\n textboxEl && textboxEl.remove();\n $85a5f86b715fe7db$var$textboxesContainer.querySelectorAll('[data-section=\"textbox\"]').forEach((el, idx)=>{\n el.querySelector('[data-input=\"text\"]').setAttribute(\"placeholder\", `Text #${idx + 1}`);\n });\n $85a5f86b715fe7db$var$canvas.draw($85a5f86b715fe7db$var$selectedImage, (0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).getAll());\n};\nconst $85a5f86b715fe7db$var$handleClearCanvas = (evt)=>{\n if (!$85a5f86b715fe7db$var$selectedImage) return;\n evt.stopPropagation();\n $85a5f86b715fe7db$var$selectedImage = null;\n $85a5f86b715fe7db$var$dropzoneEl.classList.remove(\"dropzone--accepted\");\n $85a5f86b715fe7db$var$generateMemeBtn.disabled = true;\n $85a5f86b715fe7db$var$instructionsEl.hidden = false;\n $85a5f86b715fe7db$var$clearCanvasBtn.hidden = true;\n $85a5f86b715fe7db$var$dropzoneEl.disabled = false;\n $85a5f86b715fe7db$var$canvas.clear().hide();\n};\nconst $85a5f86b715fe7db$var$toggleTorchButtonStatus = (options = {})=>{\n const defaults = {\n el: document.getElementById(\"torchButton\"),\n isTorchOn: false\n };\n const { el: el, isTorchOn: isTorchOn } = {\n ...defaults,\n ...options\n };\n const iconPaths = el.querySelectorAll(\"svg path\");\n if (iconPaths.length !== 2) return;\n iconPaths[0].style.display = isTorchOn ? \"none\" : \"block\";\n iconPaths[1].style.display = isTorchOn ? \"block\" : \"none\";\n el.setAttribute(\"aria-label\", `Turn ${isTorchOn ? \"off\" : \"on\"} flash`);\n};\nconst $85a5f86b715fe7db$var$handleTorchButtonClick = (evt)=>{\n if ($85a5f86b715fe7db$var$capturePhotoEl === null) return;\n $85a5f86b715fe7db$var$capturePhotoEl.torch = !$85a5f86b715fe7db$var$capturePhotoEl.torch;\n $85a5f86b715fe7db$var$toggleTorchButtonStatus({\n el: evt.currentTarget,\n isTorchOn: $85a5f86b715fe7db$var$capturePhotoEl.hasAttribute(\"torch\")\n });\n};\nconst $85a5f86b715fe7db$var$handleCapturePhotoVideoPlay = async (evt)=>{\n const trackCapabilities = evt.target.getTrackCapabilities();\n if (trackCapabilities?.torch) {\n $85a5f86b715fe7db$var$torchButton?.removeAttribute(\"hidden\");\n if ($85a5f86b715fe7db$var$capturePhotoEl?.hasAttribute(\"torch\")) $85a5f86b715fe7db$var$toggleTorchButtonStatus({\n el: $85a5f86b715fe7db$var$torchButton,\n isTorchOn: true\n });\n }\n const videoInputDevices = await (0, $dced0d224c6d876e$export$cc30a98fe3890794).getVideoInputDevices();\n videoInputDevices.forEach((device, index)=>{\n const option = document.createElement(\"option\");\n option.value = device.deviceId;\n option.textContent = device.label || `Camera ${index + 1}`;\n $85a5f86b715fe7db$var$cameraSelect.appendChild(option);\n });\n if (videoInputDevices.length > 1) $85a5f86b715fe7db$var$cameraSelect?.removeAttribute(\"hidden\");\n};\nconst $85a5f86b715fe7db$var$handleCameraSelectChange = (evt)=>{\n if ($85a5f86b715fe7db$var$capturePhotoEl === null || typeof $85a5f86b715fe7db$var$capturePhotoEl.restartVideoStream !== \"function\" || $85a5f86b715fe7db$var$capturePhotoEl.hasAttribute(\"loading\")) return;\n const videoDeviceId = evt.target.value || undefined;\n $85a5f86b715fe7db$var$capturePhotoEl.restartVideoStream(videoDeviceId);\n};\nconst $85a5f86b715fe7db$var$handleCapturePhotoButtonClick = ()=>{\n if ($85a5f86b715fe7db$var$capturePhotoEl === null || typeof $85a5f86b715fe7db$var$capturePhotoEl.capture !== \"function\" || $85a5f86b715fe7db$var$capturePhotoEl.hasAttribute(\"loading\")) return;\n $85a5f86b715fe7db$var$capturePhotoEl.capture();\n};\ndocument.addEventListener(\"web-share:error\", $85a5f86b715fe7db$var$handleWebShareError);\ndocument.addEventListener(\"capture-photo:video-play\", $85a5f86b715fe7db$var$handleCapturePhotoVideoPlay, {\n once: true\n});\ndocument.addEventListener(\"capture-photo:error\", $85a5f86b715fe7db$var$handleCapturePhotoError);\ndocument.addEventListener(\"capture-photo:success\", $85a5f86b715fe7db$var$handleCapturePhotoSuccess);\ndocument.addEventListener(\"me-open\", $85a5f86b715fe7db$var$handleModalOpen);\ndocument.addEventListener(\"me-close\", $85a5f86b715fe7db$var$handleModalClose);\ndocument.addEventListener(\"emoji-click\", $85a5f86b715fe7db$var$handleEmojiPickerSelection);\ndocument.addEventListener(\"textbox-create\", $85a5f86b715fe7db$var$handleTextboxCreate);\ndocument.addEventListener(\"textbox-remove\", $85a5f86b715fe7db$var$handleTextboxDelete);\n$85a5f86b715fe7db$var$fileSelectBtn.addEventListener(\"click\", $85a5f86b715fe7db$var$handleFileSelectClick);\n$85a5f86b715fe7db$var$openVideoModalBtn.addEventListener(\"click\", $85a5f86b715fe7db$var$handleOpenVideoModalButtonClick);\n$85a5f86b715fe7db$var$addTextboxBtn.addEventListener(\"click\", $85a5f86b715fe7db$var$handleAddTextboxBtnClick);\n$85a5f86b715fe7db$var$generateMemeBtn.addEventListener(\"click\", $85a5f86b715fe7db$var$generateMeme);\n$85a5f86b715fe7db$var$downloadMemeBtn.addEventListener(\"click\", ()=>$85a5f86b715fe7db$var$downloadModal.open = false);\n$85a5f86b715fe7db$var$imageUrlForm.addEventListener(\"submit\", $85a5f86b715fe7db$var$handleImageUploadFromURL);\n$85a5f86b715fe7db$var$dropzoneEl.addEventListener(\"files-dropzone-drop-accepted\", $85a5f86b715fe7db$var$handleDropFilesAccepted);\n$85a5f86b715fe7db$var$textboxesContainer.addEventListener(\"input\", $85a5f86b715fe7db$var$handleTextboxesContainerInput);\n$85a5f86b715fe7db$var$textboxesContainer.addEventListener(\"change\", $85a5f86b715fe7db$var$handleTextboxesContainerChange);\n$85a5f86b715fe7db$var$textboxesContainer.addEventListener(\"click\", $85a5f86b715fe7db$var$handleTextboxesContainerClick);\n$85a5f86b715fe7db$var$textboxesContainer.addEventListener(\"pointerdown\", $85a5f86b715fe7db$var$handleTextboxesContainerPointerdown);\n$85a5f86b715fe7db$var$textboxesContainer.addEventListener(\"pointerup\", $85a5f86b715fe7db$var$handleTextboxesContainerPointerup);\n$85a5f86b715fe7db$var$textboxesContainer.addEventListener(\"pointerout\", $85a5f86b715fe7db$var$handleTextboxesContainerPointerout);\n$85a5f86b715fe7db$var$textboxesContainer.addEventListener(\"keydown\", $85a5f86b715fe7db$var$handleTextboxesContainerKeyDown);\n$85a5f86b715fe7db$var$textboxesContainer.addEventListener(\"keyup\", $85a5f86b715fe7db$var$handleTextboxesContainerKeyUp);\n$85a5f86b715fe7db$var$imageUploadMethodSelect.addEventListener(\"change\", $85a5f86b715fe7db$var$handleUploadMethodChange);\n$85a5f86b715fe7db$var$galleryEl.addEventListener(\"click\", $85a5f86b715fe7db$var$handleGalleryClick);\n$85a5f86b715fe7db$var$gallerySearchEl.addEventListener(\"input\", $85a5f86b715fe7db$var$handleGallerySearchInput);\n$85a5f86b715fe7db$var$solidColorForm.addEventListener(\"input\", $85a5f86b715fe7db$var$handleSolidColorFormInput);\n$85a5f86b715fe7db$var$removeTextForm.addEventListener(\"submit\", $85a5f86b715fe7db$var$handleTextRemoveFormSubmit);\n$85a5f86b715fe7db$var$maxImageDimensionsForm.addEventListener(\"change\", $85a5f86b715fe7db$var$handleMaxImageDimensionsFormChange);\n$85a5f86b715fe7db$var$clearCanvasBtn.addEventListener(\"click\", $85a5f86b715fe7db$var$handleClearCanvas);\n$85a5f86b715fe7db$var$cameraSelect.addEventListener(\"change\", $85a5f86b715fe7db$var$handleCameraSelectChange);\n$85a5f86b715fe7db$var$capturePhotoButton.addEventListener(\"click\", $85a5f86b715fe7db$var$handleCapturePhotoButtonClick);\n$85a5f86b715fe7db$var$torchButton.addEventListener(\"click\", $85a5f86b715fe7db$var$handleTorchButtonClick);\n$85a5f86b715fe7db$var$galleryEl.querySelectorAll(\"button > img\")?.forEach((image)=>{\n image.setAttribute(\"title\", image.getAttribute(\"alt\"));\n});\n(0, $a5e4a78f80aa8693$export$8e3dca5fa4d5f04b).create();\n$85a5f86b715fe7db$var$dropzoneEl.accept = (0, $65136e012e05e2d7$export$63e7bed68b07a85c);\n$85a5f86b715fe7db$var$renderAcceptedImageFormats((0, $65136e012e05e2d7$export$63e7bed68b07a85c), $85a5f86b715fe7db$var$instructionsEl);\n(0, $56b863c8b6be7003$export$6874249d87f2602a).forEach(({ name: name, path: path, style: style, weight: weight })=>{\n (0, $56b863c8b6be7003$export$59eceaef0c7797b2)(name, path, {\n style: style,\n weight: weight\n });\n});\nif ($85a5f86b715fe7db$var$maxImageDimensionsFromStorage) $85a5f86b715fe7db$var$maxImageDimensionsSelect.value = $85a5f86b715fe7db$var$maxImageDimensionsFromStorage;\n$85a5f86b715fe7db$var$maxImageDimensionsSelect.disabled = false;\n\n\n//# sourceMappingURL=index.4434df8a.js.map\n","import 'emoji-picker-element';\nimport insertTextAtCursor from 'insert-text-at-cursor';\nimport { CapturePhoto } from '@georapbox/capture-photo-element/dist/capture-photo-defined.js';\nimport { isWebShareSupported } from '@georapbox/web-share-element/dist/is-web-share-supported.js';\nimport '@georapbox/web-share-element/dist/web-share-defined.js';\nimport '@georapbox/modal-element/dist/modal-element-defined.js';\nimport '@georapbox/files-dropzone-element/dist/files-dropzone-defined.js';\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport '../css/main.css';\nimport { ACCEPTED_MIME_TYPES } from './constants.js';\nimport { uid } from './utils/uid.js';\nimport { fileFromUrl } from './utils/file-from-url.js';\nimport { storage } from './utils/storage.js';\nimport { isSolidColorSelected } from './utils/is-solid-color-selected.js';\nimport { customFonts, loadCustomFont } from './custom-fonts.js';\nimport { toastAlert } from './toast-alert.js';\nimport { Textbox } from './textbox.js';\nimport { Canvas } from './canvas.js';\n\nconst canvas = Canvas.createInstance(document.getElementById('canvas'));\nconst videoModal = document.getElementById('videoModal');\nconst downloadModal = document.getElementById('downloadModal');\nconst capturePhotoEl = document.querySelector('capture-photo');\nconst cameraSelect = document.getElementById('cameraSelect');\nconst capturePhotoButton = document.getElementById('capturePhotoButton');\nconst torchButton = document.getElementById('torchButton');\nconst dropzoneEl = document.querySelector('files-dropzone');\nconst instructionsEl = document.getElementById('instructions');\nconst imageUploadMethodSelect = document.getElementById('imageUploadMethodSelect');\nconst fileSelectBtn = document.getElementById('fileSelectBtn');\nconst imageUrlForm = document.getElementById('imageUrlForm');\nconst addTextboxBtn = document.getElementById('addTextboxBtn');\nconst textboxesContainer = document.getElementById('textboxesContainer');\nconst generateMemeBtn = document.getElementById('generateMemeBtn');\nconst openVideoModalBtn = document.getElementById('openVideoModalBtn');\nconst downloadMemeBtn = document.getElementById('downloadMemeBtn');\nconst downloadMemePreview = document.getElementById('downloadMemePreview');\nconst webShareComponent = document.querySelector('web-share');\nconst galleryEl = document.getElementById('gallery');\nconst gallerySearchEl = document.getElementById('gallerySearch');\nconst galleryNoResultsEl = galleryEl.querySelector('.gallery__no-results');\nconst solidColorForm = document.getElementById('solidColorForm');\nconst uploadMethodEls = document.querySelectorAll('.upload-method');\nconst removeConfirmationModal = document.getElementById('removeConfirmationModal');\nconst removeTextForm = document.getElementById('removeTextForm');\nconst maxImageDimensionsForm = document.getElementById('maxImageDimensionsForm');\nconst maxImageDimensionsSelect = maxImageDimensionsForm['maxImageDimensions'];\nconst clearCanvasBtn = document.getElementById('clearCanvasBtn');\nconst maxImageDimensionsFromStorage = storage.get('maxImageDimensions');\nlet shouldFocusOnTextboxCreate = false;\nlet selectedImage = null;\nlet reqAnimFrame = null;\n\nconst renderAcceptedImageFormats = (acceptedMimeTypes, rootEl) => {\n if (!rootEl) {\n return;\n }\n\n const extensions = acceptedMimeTypes.map(mimeType => mimeType.split('/')[1]);\n const str = `Supported image formats: ${extensions.join(', ')}`;\n const div = document.createElement('div');\n const small = document.createElement('small');\n\n small.textContent = str;\n div.appendChild(small);\n rootEl.appendChild(small);\n};\n\nconst generateMeme = async () => {\n const dataUrl = canvas.toDataURL('image/png');\n const filename = `${uid('meme')}.png`;\n\n // Prepare download link\n const downloadLink = dataUrl.replace('image/png', 'image/octet-stream');\n downloadMemeBtn.download = filename;\n downloadMemeBtn.href = downloadLink;\n downloadMemePreview.width = canvas.getDimensions().width;\n downloadMemePreview.height = canvas.getDimensions().height;\n downloadMemePreview.src = downloadLink;\n\n // Prepare for sharing file\n if (isWebShareSupported()) {\n try {\n const file = await fileFromUrl({\n url: dataUrl,\n filename,\n mimeType: 'image/png'\n }).catch(err => toastAlert(err.message, 'danger'));\n\n if (file && isWebShareSupported({ files: [file] })) {\n webShareComponent.shareFiles = [file];\n webShareComponent.hidden = false;\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n window.requestAnimationFrame(() => {\n downloadModal.open = true;\n });\n};\n\nconst setImageMaxDimensions = image => {\n const maxImageDimensionsSelect = maxImageDimensionsForm['maxImageDimensions'];\n const [maxWidthValue, maxHeightValue] = maxImageDimensionsSelect.value.split('x');\n const MAX_WIDTH = Number(maxWidthValue) || 800;\n const MAX_HEIGHT = Number(maxHeightValue) || 600;\n let width = image.width;\n let height = image.height;\n\n if (width > height) {\n if (width > MAX_WIDTH) {\n height *= MAX_WIDTH / width;\n width = MAX_WIDTH;\n }\n } else {\n if (height > MAX_HEIGHT) {\n width *= MAX_HEIGHT / height;\n height = MAX_HEIGHT;\n }\n }\n\n canvas.setDimensions({ width, height });\n};\n\nconst afterImageSelect = () => {\n canvas.draw(selectedImage, Textbox.getAll()).show();\n dropzoneEl.classList.add('dropzone--accepted');\n dropzoneEl.disabled = true;\n generateMemeBtn.disabled = false;\n instructionsEl.hidden = true;\n clearCanvasBtn.hidden = false;\n};\n\nconst handleImageLoad = evt => {\n selectedImage = evt.target;\n setImageMaxDimensions(selectedImage);\n afterImageSelect();\n};\n\nconst handleSolidColorFormInput = evt => {\n const DEFAULT_WIDTH = 800;\n const DEFAULT_HEIGHT = 600;\n\n if (evt.target === solidColorForm['canvasColor']) {\n selectedImage = evt.target.value;\n }\n\n if (isSolidColorSelected(selectedImage)) {\n canvas.setDimensions({\n width: Number(solidColorForm['canvasWidth'].value) || DEFAULT_WIDTH,\n height: Number(solidColorForm['canvasHeight'].value) || DEFAULT_HEIGHT\n });\n\n afterImageSelect();\n }\n};\n\nconst handleFileSelect = file => {\n if (!file) {\n return;\n }\n\n const image = new Image();\n const reader = new FileReader();\n\n reader.addEventListener('load', function (evt) {\n const data = evt.target.result;\n image.addEventListener('load', handleImageLoad);\n image.src = data;\n });\n\n reader.readAsDataURL(file);\n};\n\nconst handleOpenVideoModalButtonClick = () => {\n videoModal.open = true;\n};\n\nconst handleTextPropChange = (element, textboxId, prop) => {\n const textboxData = Textbox.getById(textboxId).getData();\n\n switch (element.type) {\n case 'checkbox':\n textboxData[prop] = element.checked;\n break;\n case 'number':\n textboxData[prop] = Number(element.value);\n break;\n default:\n textboxData[prop] = element.value;\n }\n\n canvas.draw(selectedImage, Textbox.getAll());\n};\n\nconst handleAddTextboxBtnClick = () => Textbox.create();\n\nconst handleImageUploadFromURL = async evt => {\n evt.preventDefault();\n\n const form = evt.target;\n const submitButton = form.querySelector('button[type=\"submit\"]');\n const imageUrl = form['imageUrl'].value;\n\n if (!imageUrl.trim()) {\n return;\n }\n\n submitButton.disabled = true;\n submitButton.querySelector('.spinner').hidden = false;\n submitButton.querySelector('.label').hidden = true;\n\n try {\n const file = await fileFromUrl({\n url: imageUrl\n }).catch(err => toastAlert(err.message, 'danger'));\n\n if (file) {\n handleFileSelect(file);\n }\n } catch {\n toastAlert(`Failed to load image from \"${imageUrl}\".`, 'danger');\n } finally {\n submitButton.disabled = false;\n submitButton.querySelector('.spinner').hidden = true;\n submitButton.querySelector('.label').hidden = false;\n }\n};\n\nconst moveTextUsingArrowbuttons = (textboxId, direction) => () => {\n const textboxEl = document.getElementById(textboxId);\n const offsetYInput = textboxEl.querySelector('[data-input=\"offsetY\"]');\n const offsetXInput = textboxEl.querySelector('[data-input=\"offsetX\"]');\n const textbox = Textbox.getById(textboxId);\n\n if (!textbox) {\n return;\n }\n\n const textboxData = textbox.getData();\n\n direction = direction.toLowerCase();\n\n switch (direction) {\n case 'up':\n textboxData.offsetY -= 1;\n offsetYInput.value = textboxData.offsetY;\n break;\n case 'down':\n textboxData.offsetY += 1;\n offsetYInput.value = textboxData.offsetY;\n break;\n case 'left':\n textboxData.offsetX -= 1;\n offsetXInput.value = textboxData.offsetX;\n break;\n case 'right':\n textboxData.offsetX += 1;\n offsetXInput.value = textboxData.offsetX;\n break;\n }\n\n canvas.draw(selectedImage, Textbox.getAll());\n\n reqAnimFrame = requestAnimationFrame(moveTextUsingArrowbuttons(textboxId, direction));\n};\n\nconst handleUploadMethodChange = evt => {\n uploadMethodEls.forEach(el => (el.hidden = el.id !== evt.target.value));\n maxImageDimensionsForm.hidden = evt.target.value === 'solidColorForm';\n};\n\nconst handleFileSelectClick = () => {\n if (typeof dropzoneEl.openFileDialog === 'function') {\n dropzoneEl.openFileDialog();\n }\n};\n\nconst handleDropFilesAccepted = evt => {\n const [file] = evt.detail.acceptedFiles;\n\n if (file) {\n handleFileSelect(file);\n }\n};\n\nconst handleTextboxesContainerInput = evt => {\n const element = evt.target;\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n let prop;\n\n if (element.matches('[data-input=\"text\"]')) {\n prop = 'text';\n } else if (element.matches('[data-input=\"fillColor\"]')) {\n prop = 'fillColor';\n } else if (element.matches('[data-input=\"strokeColor\"]')) {\n prop = 'strokeColor';\n } else if (element.matches('[data-input=\"font\"]')) {\n prop = 'font';\n } else if (element.matches('[data-input=\"fontSize\"]')) {\n prop = 'fontSize';\n } else if (element.matches('[data-input=\"fontWeight\"]')) {\n prop = 'fontWeight';\n } else if (element.matches('[data-input=\"textAlign\"]')) {\n prop = 'textAlign';\n } else if (element.matches('[data-input=\"shadowBlur\"]')) {\n prop = 'shadowBlur';\n } else if (element.matches('[data-input=\"offsetY\"]')) {\n prop = 'offsetY';\n } else if (element.matches('[data-input=\"offsetX\"]')) {\n prop = 'offsetX';\n } else if (element.matches('[data-input=\"rotate\"]')) {\n prop = 'rotate';\n } else if (element.matches('[data-input=\"strokeWidth\"]')) {\n prop = 'strokeWidth';\n }\n\n if (prop) {\n handleTextPropChange(element, textboxId, prop);\n }\n};\n\nconst handleTextboxesContainerChange = evt => {\n const element = evt.target;\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n let prop;\n\n if (element.matches('[data-input=\"allCaps\"]')) {\n prop = 'allCaps';\n }\n\n if (prop) {\n handleTextPropChange(element, textboxId, prop);\n }\n};\n\nconst handleTextboxesContainerClick = evt => {\n const element = evt.target;\n\n if (element.matches('[data-button=\"settings\"]')) {\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n const textboxSettingsEl = textboxEl?.querySelector('[data-section=\"settings\"]');\n\n if (textboxSettingsEl) {\n textboxSettingsEl.hidden = !textboxSettingsEl.hidden;\n }\n }\n\n if (element.matches('[data-button=\"duplicate-text-box\"')) {\n const currentTextboxEl = element.closest('[data-section=\"textbox\"]');\n const currentTextboxData = Textbox.getById(currentTextboxEl.id);\n Textbox.create({ ...currentTextboxData.data });\n }\n\n if (element.matches('[data-button=\"delete-text-box\"]')) {\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n const textboxToDelete = Textbox.getById(textboxId);\n\n if (textboxToDelete && textboxToDelete.data.text.trim()) {\n const textboxIdInput = removeTextForm['textbox-id'];\n\n if (textboxIdInput) {\n textboxIdInput.value = textboxId;\n removeConfirmationModal.open = true;\n }\n } else {\n Textbox.remove(textboxId);\n }\n }\n};\n\nconst handleTextRemoveFormSubmit = evt => {\n evt.preventDefault();\n const textboxId = evt.target['textbox-id'].value;\n\n if (textboxId) {\n Textbox.remove(textboxId);\n removeConfirmationModal.open = false;\n }\n};\n\nconst handleTextboxesContainerPointerdown = evt => {\n const element = evt.target;\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n\n if (!textboxEl) {\n return;\n }\n\n if (element.matches('[data-action=\"move-text\"]')) {\n reqAnimFrame = requestAnimationFrame(\n moveTextUsingArrowbuttons(textboxEl.id, element.getAttribute('aria-label'))\n );\n }\n};\n\nconst handleTextboxesContainerPointerup = evt => {\n const element = evt.target;\n\n if (element.matches('[data-action=\"move-text\"]')) {\n cancelAnimationFrame && cancelAnimationFrame(reqAnimFrame);\n reqAnimFrame = null;\n }\n};\n\nconst handleTextboxesContainerPointerout = evt => {\n const element = evt.target;\n\n if (element.matches('[data-action=\"move-text\"]')) {\n cancelAnimationFrame && cancelAnimationFrame(reqAnimFrame);\n reqAnimFrame = null;\n }\n};\n\nconst handleTextboxesContainerKeyDown = evt => {\n const element = evt.target;\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n\n if (element.matches('[data-action=\"move-text\"]')) {\n if (evt.key === ' ' || evt.key === 'Enter') {\n reqAnimFrame && cancelAnimationFrame(reqAnimFrame);\n reqAnimFrame = requestAnimationFrame(\n moveTextUsingArrowbuttons(textboxEl.id, element.getAttribute('aria-label'))\n );\n }\n }\n};\n\nconst handleTextboxesContainerKeyUp = evt => {\n const element = evt.target;\n\n if (element.matches('[data-action=\"move-text\"]')) {\n if (evt.key === ' ' || evt.key === 'Enter') {\n reqAnimFrame && cancelAnimationFrame(reqAnimFrame);\n reqAnimFrame = null;\n }\n }\n};\n\nconst handleGalleryClick = async evt => {\n const button = evt.target.closest('button');\n\n if (!button) {\n return;\n }\n\n const img = button.querySelector('img');\n\n try {\n const file = await fileFromUrl({\n url: img.src\n }).catch(err => toastAlert(err.message, 'danger'));\n\n if (file) {\n handleFileSelect(file);\n }\n } catch {\n toastAlert(`Failed to load image: \"${img.alt}\".`, 'danger');\n }\n};\n\nconst handleGallerySearchInput = evt => {\n const query = evt.target.value.toLowerCase().trim();\n const galleryItems = galleryEl.querySelectorAll('button');\n\n galleryItems.forEach(item => {\n const alt = (item.querySelector('img').getAttribute('alt') || '').toLowerCase();\n item.hidden = !alt.includes(query);\n });\n\n galleryNoResultsEl.hidden = !!galleryEl.querySelector('button:not([hidden])');\n};\n\nconst handleWebShareError = () => {\n downloadModal.open = false;\n toastAlert('There was an error while trying to share your meme.', 'danger');\n};\n\nconst handleCapturePhotoError = evt => {\n const error = evt.detail.error;\n let errorMessage = 'An error occurred while trying to capture photo.';\n\n if (\n error instanceof Error &&\n (error.name === 'NotAllowedError' || error.name === 'NotFoundError')\n ) {\n errorMessage +=\n ' Make sure you have a camera connected and you have granted the appropriate permissions.';\n }\n\n toastAlert(errorMessage, 'danger');\n videoModal.open = false;\n console.error(error);\n};\n\nconst handleCapturePhotoSuccess = evt => {\n videoModal.open = false;\n const image = new Image();\n image.addEventListener('load', handleImageLoad);\n image.src = evt.detail.dataURI;\n};\n\nconst handleModalOpen = evt => {\n if (evt.target.id === 'videoModal') {\n if (capturePhotoEl && typeof capturePhotoEl.startVideoStream === 'function') {\n capturePhotoEl.startVideoStream();\n }\n }\n};\n\nconst handleModalClose = evt => {\n if (evt.target.id === 'videoModal') {\n if (capturePhotoEl && typeof capturePhotoEl.stopVideoStream === 'function') {\n capturePhotoEl.stopVideoStream();\n }\n }\n\n if (evt.target.id === 'removeConfirmationModal') {\n removeTextForm.reset();\n }\n};\n\nconst handleEmojiPickerSelection = evt => {\n const textboxEl = evt.target.closest('[data-section=\"textbox\"]');\n\n if (textboxEl) {\n const input = textboxEl.querySelector('[data-input=\"text\"]');\n const emoji = evt.detail.unicode;\n\n if (input) {\n insertTextAtCursor(input, emoji);\n }\n }\n};\n\nconst handleMaxImageDimensionsFormChange = evt => {\n if (evt.target.matches('[name=\"maxImageDimensions\"]')) {\n storage.set('maxImageDimensions', evt.target.value);\n }\n\n if (!selectedImage || isSolidColorSelected(selectedImage)) {\n return;\n }\n\n setImageMaxDimensions(selectedImage);\n canvas.draw(selectedImage, Textbox.getAll());\n};\n\nconst handleTextboxCreate = evt => {\n const textbox = evt.detail.textbox;\n const textboxEl = Textbox.createElement(textbox, shouldFocusOnTextboxCreate);\n\n shouldFocusOnTextboxCreate = true;\n textboxesContainer.appendChild(textboxEl);\n\n if (textbox.getData().text) {\n canvas.draw(selectedImage, Textbox.getAll());\n }\n};\n\nconst handleTextboxDelete = evt => {\n const textboxEl = document.getElementById(evt.detail.id);\n textboxEl && textboxEl.remove();\n\n textboxesContainer.querySelectorAll('[data-section=\"textbox\"]').forEach((el, idx) => {\n el.querySelector('[data-input=\"text\"]').setAttribute('placeholder', `Text #${idx + 1}`);\n });\n\n canvas.draw(selectedImage, Textbox.getAll());\n};\n\nconst handleClearCanvas = evt => {\n if (!selectedImage) {\n return;\n }\n\n evt.stopPropagation();\n selectedImage = null;\n dropzoneEl.classList.remove('dropzone--accepted');\n generateMemeBtn.disabled = true;\n instructionsEl.hidden = false;\n clearCanvasBtn.hidden = true;\n dropzoneEl.disabled = false;\n canvas.clear().hide();\n};\n\nconst toggleTorchButtonStatus = (options = {}) => {\n const defaults = {\n el: document.getElementById('torchButton'),\n isTorchOn: false\n };\n const { el, isTorchOn } = { ...defaults, ...options };\n const iconPaths = el.querySelectorAll('svg path');\n\n if (iconPaths.length !== 2) {\n return;\n }\n\n iconPaths[0].style.display = isTorchOn ? 'none' : 'block';\n iconPaths[1].style.display = isTorchOn ? 'block' : 'none';\n el.setAttribute('aria-label', `Turn ${isTorchOn ? 'off' : 'on'} flash`);\n};\n\nconst handleTorchButtonClick = evt => {\n if (capturePhotoEl === null) {\n return;\n }\n\n capturePhotoEl.torch = !capturePhotoEl.torch;\n\n toggleTorchButtonStatus({\n el: evt.currentTarget,\n isTorchOn: capturePhotoEl.hasAttribute('torch')\n });\n};\n\nconst handleCapturePhotoVideoPlay = async evt => {\n const trackCapabilities = evt.target.getTrackCapabilities();\n\n if (trackCapabilities?.torch) {\n torchButton?.removeAttribute('hidden');\n\n if (capturePhotoEl?.hasAttribute('torch')) {\n toggleTorchButtonStatus({ el: torchButton, isTorchOn: true });\n }\n }\n\n const videoInputDevices = await CapturePhoto.getVideoInputDevices();\n\n videoInputDevices.forEach((device, index) => {\n const option = document.createElement('option');\n option.value = device.deviceId;\n option.textContent = device.label || `Camera ${index + 1}`;\n cameraSelect.appendChild(option);\n });\n\n if (videoInputDevices.length > 1) {\n cameraSelect?.removeAttribute('hidden');\n }\n};\n\nconst handleCameraSelectChange = evt => {\n if (\n capturePhotoEl === null ||\n typeof capturePhotoEl.restartVideoStream !== 'function' ||\n capturePhotoEl.hasAttribute('loading')\n ) {\n return;\n }\n\n const videoDeviceId = evt.target.value || undefined;\n capturePhotoEl.restartVideoStream(videoDeviceId);\n};\n\nconst handleCapturePhotoButtonClick = () => {\n if (\n capturePhotoEl === null ||\n typeof capturePhotoEl.capture !== 'function' ||\n capturePhotoEl.hasAttribute('loading')\n ) {\n return;\n }\n\n capturePhotoEl.capture();\n};\n\ndocument.addEventListener('web-share:error', handleWebShareError);\ndocument.addEventListener('capture-photo:video-play', handleCapturePhotoVideoPlay, { once: true });\ndocument.addEventListener('capture-photo:error', handleCapturePhotoError);\ndocument.addEventListener('capture-photo:success', handleCapturePhotoSuccess);\ndocument.addEventListener('me-open', handleModalOpen);\ndocument.addEventListener('me-close', handleModalClose);\ndocument.addEventListener('emoji-click', handleEmojiPickerSelection);\ndocument.addEventListener('textbox-create', handleTextboxCreate);\ndocument.addEventListener('textbox-remove', handleTextboxDelete);\nfileSelectBtn.addEventListener('click', handleFileSelectClick);\nopenVideoModalBtn.addEventListener('click', handleOpenVideoModalButtonClick);\naddTextboxBtn.addEventListener('click', handleAddTextboxBtnClick);\ngenerateMemeBtn.addEventListener('click', generateMeme);\ndownloadMemeBtn.addEventListener('click', () => (downloadModal.open = false));\nimageUrlForm.addEventListener('submit', handleImageUploadFromURL);\ndropzoneEl.addEventListener('files-dropzone-drop-accepted', handleDropFilesAccepted);\ntextboxesContainer.addEventListener('input', handleTextboxesContainerInput);\ntextboxesContainer.addEventListener('change', handleTextboxesContainerChange);\ntextboxesContainer.addEventListener('click', handleTextboxesContainerClick);\ntextboxesContainer.addEventListener('pointerdown', handleTextboxesContainerPointerdown);\ntextboxesContainer.addEventListener('pointerup', handleTextboxesContainerPointerup);\ntextboxesContainer.addEventListener('pointerout', handleTextboxesContainerPointerout);\ntextboxesContainer.addEventListener('keydown', handleTextboxesContainerKeyDown);\ntextboxesContainer.addEventListener('keyup', handleTextboxesContainerKeyUp);\nimageUploadMethodSelect.addEventListener('change', handleUploadMethodChange);\ngalleryEl.addEventListener('click', handleGalleryClick);\ngallerySearchEl.addEventListener('input', handleGallerySearchInput);\nsolidColorForm.addEventListener('input', handleSolidColorFormInput);\nremoveTextForm.addEventListener('submit', handleTextRemoveFormSubmit);\nmaxImageDimensionsForm.addEventListener('change', handleMaxImageDimensionsFormChange);\nclearCanvasBtn.addEventListener('click', handleClearCanvas);\ncameraSelect.addEventListener('change', handleCameraSelectChange);\ncapturePhotoButton.addEventListener('click', handleCapturePhotoButtonClick);\ntorchButton.addEventListener('click', handleTorchButtonClick);\n\ngalleryEl.querySelectorAll('button > img')?.forEach(image => {\n image.setAttribute('title', image.getAttribute('alt'));\n});\n\nTextbox.create();\n\ndropzoneEl.accept = ACCEPTED_MIME_TYPES;\n\nrenderAcceptedImageFormats(ACCEPTED_MIME_TYPES, instructionsEl);\n\ncustomFonts.forEach(({ name, path, style, weight }) => {\n loadCustomFont(name, path, { style, weight });\n});\n\nif (maxImageDimensionsFromStorage) {\n maxImageDimensionsSelect.value = maxImageDimensionsFromStorage;\n}\n\nmaxImageDimensionsSelect.disabled = false;\n","import Picker from './picker.js'\nimport Database from './database.js'\nexport { Picker, Database }\n","import Database from './database.js';\n\n// via https://unpkg.com/browse/emojibase-data@6.0.0/meta/groups.json\nconst allGroups = [\n [-1, '✨', 'custom'],\n [0, '😀', 'smileys-emotion'],\n [1, '👋', 'people-body'],\n [3, '🐱', 'animals-nature'],\n [4, '🍎', 'food-drink'],\n [5, '🏠️', 'travel-places'],\n [6, '⚽', 'activities'],\n [7, '📝', 'objects'],\n [8, '⛔️', 'symbols'],\n [9, '🏁', 'flags']\n].map(([id, emoji, name]) => ({ id, emoji, name }));\n\nconst groups = allGroups.slice(1);\n\nconst MIN_SEARCH_TEXT_LENGTH = 2;\nconst NUM_SKIN_TONES = 6;\n\n/* istanbul ignore next */\nconst rIC = typeof requestIdleCallback === 'function' ? requestIdleCallback : setTimeout;\n\n// check for ZWJ (zero width joiner) character\nfunction hasZwj (emoji) {\n return emoji.unicode.includes('\\u200d')\n}\n\n// Find one good representative emoji from each version to test by checking its color.\n// Ideally it should have color in the center. For some inspiration, see:\n// https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/\n//\n// Note that for certain versions (12.1, 13.1), there is no point in testing them explicitly, because\n// all the emoji from this version are compound-emoji from previous versions. So they would pass a color\n// test, even in browsers that display them as double emoji. (E.g. \"face in clouds\" might render as\n// \"face without mouth\" plus \"fog\".) These emoji can only be filtered using the width test,\n// which happens in checkZwjSupport.js.\nconst versionsAndTestEmoji = {\n '🫨': 15.1, // shaking head, technically from v15 but see note above\n '🫠': 14,\n '🥲': 13.1, // smiling face with tear, technically from v13 but see note above\n '🥻': 12.1, // sari, technically from v12 but see note above\n '🥰': 11,\n '🤩': 5,\n '👱‍♀️': 4,\n '🤣': 3,\n '👁️‍🗨️': 2,\n '😀': 1,\n '😐️': 0.7,\n '😃': 0.6\n};\n\nconst TIMEOUT_BEFORE_LOADING_MESSAGE = 1000; // 1 second\nconst DEFAULT_SKIN_TONE_EMOJI = '🖐️';\nconst DEFAULT_NUM_COLUMNS = 8;\n\n// Based on https://fivethirtyeight.com/features/the-100-most-used-emojis/ and\n// https://blog.emojipedia.org/facebook-reveals-most-and-least-used-emojis/ with\n// a bit of my own curation. (E.g. avoid the \"OK\" gesture because of connotations:\n// https://emojipedia.org/ok-hand/)\nconst MOST_COMMONLY_USED_EMOJI = [\n '😊',\n '😒',\n '❤️',\n '👍️',\n '😍',\n '😂',\n '😭',\n '☺️',\n '😔',\n '😩',\n '😏',\n '💕',\n '🙌',\n '😘'\n];\n\n// It's important to list Twemoji Mozilla before everything else, because Mozilla bundles their\n// own font on some platforms (notably Windows and Linux as of this writing). Typically, Mozilla\n// updates faster than the underlying OS, and we don't want to render older emoji in one font and\n// newer emoji in another font:\n// https://github.com/nolanlawson/emoji-picker-element/pull/268#issuecomment-1073347283\nconst FONT_FAMILY = '\"Twemoji Mozilla\",\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",' +\n '\"Noto Color Emoji\",\"EmojiOne Color\",\"Android Emoji\",sans-serif';\n\n/* istanbul ignore next */\nconst DEFAULT_CATEGORY_SORTING = (a, b) => a < b ? -1 : a > b ? 1 : 0;\n\n// Test if an emoji is supported by rendering it to canvas and checking that the color is not black\n// See https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/\n// and https://www.npmjs.com/package/if-emoji for inspiration\n// This implementation is largely borrowed from if-emoji, adding the font-family\n\n\nconst getTextFeature = (text, color) => {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = 1;\n\n const ctx = canvas.getContext('2d', {\n // Improves the performance of `getImageData()`\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/getContextAttributes#willreadfrequently\n willReadFrequently: true\n });\n ctx.textBaseline = 'top';\n ctx.font = `100px ${FONT_FAMILY}`;\n ctx.fillStyle = color;\n ctx.scale(0.01, 0.01);\n ctx.fillText(text, 0, 0);\n\n return ctx.getImageData(0, 0, 1, 1).data\n};\n\nconst compareFeatures = (feature1, feature2) => {\n const feature1Str = [...feature1].join(',');\n const feature2Str = [...feature2].join(',');\n // This is RGBA, so for 0,0,0, we are checking that the first RGB is not all zeroes.\n // Most of the time when unsupported this is 0,0,0,0, but on Chrome on Mac it is\n // 0,0,0,61 - there is a transparency here.\n return feature1Str === feature2Str && !feature1Str.startsWith('0,0,0,')\n};\n\nfunction testColorEmojiSupported (text) {\n // Render white and black and then compare them to each other and ensure they're the same\n // color, and neither one is black. This shows that the emoji was rendered in color.\n const feature1 = getTextFeature(text, '#000');\n const feature2 = getTextFeature(text, '#fff');\n return feature1 && feature2 && compareFeatures(feature1, feature2)\n}\n\n// rather than check every emoji ever, which would be expensive, just check some representatives from the\n// different emoji releases to determine what the font supports\n\nfunction determineEmojiSupportLevel () {\n const entries = Object.entries(versionsAndTestEmoji);\n try {\n // start with latest emoji and work backwards\n for (const [emoji, version] of entries) {\n if (testColorEmojiSupported(emoji)) {\n return version\n }\n }\n } catch (e) { // canvas error\n } finally {\n }\n // In case of an error, be generous and just assume all emoji are supported (e.g. for canvas errors\n // due to anti-fingerprinting add-ons). Better to show some gray boxes than nothing at all.\n return entries[0][1] // first one in the list is the most recent version\n}\n\n// Check which emojis we know for sure aren't supported, based on Unicode version level\nlet promise;\nconst detectEmojiSupportLevel = () => {\n if (!promise) {\n // Delay so it can run while the IDB database is being created by the browser (on another thread).\n // This helps especially with first load – we want to start pre-populating the database on the main thread,\n // and then wait for IDB to commit everything, and while waiting we run this check.\n promise = new Promise(resolve => (\n rIC(() => (\n resolve(determineEmojiSupportLevel()) // delay so ideally this can run while IDB is first populating\n ))\n ));\n }\n return promise\n};\n// determine which emojis containing ZWJ (zero width joiner) characters\n// are supported (rendered as one glyph) rather than unsupported (rendered as two or more glyphs)\nconst supportedZwjEmojis = new Map();\n\nconst VARIATION_SELECTOR = '\\ufe0f';\nconst SKINTONE_MODIFIER = '\\ud83c';\nconst ZWJ = '\\u200d';\nconst LIGHT_SKIN_TONE = 0x1F3FB;\nconst LIGHT_SKIN_TONE_MODIFIER = 0xdffb;\n\n// TODO: this is a naive implementation, we can improve it later\n// It's only used for the skintone picker, so as long as people don't customize with\n// really exotic emoji then it should work fine\nfunction applySkinTone (str, skinTone) {\n if (skinTone === 0) {\n return str\n }\n const zwjIndex = str.indexOf(ZWJ);\n if (zwjIndex !== -1) {\n return str.substring(0, zwjIndex) +\n String.fromCodePoint(LIGHT_SKIN_TONE + skinTone - 1) +\n str.substring(zwjIndex)\n }\n if (str.endsWith(VARIATION_SELECTOR)) {\n str = str.substring(0, str.length - 1);\n }\n return str + SKINTONE_MODIFIER + String.fromCodePoint(LIGHT_SKIN_TONE_MODIFIER + skinTone - 1)\n}\n\nfunction halt (event) {\n event.preventDefault();\n event.stopPropagation();\n}\n\n// Implementation left/right or up/down navigation, circling back when you\n// reach the start/end of the list\nfunction incrementOrDecrement (decrement, val, arr) {\n val += (decrement ? -1 : 1);\n if (val < 0) {\n val = arr.length - 1;\n } else if (val >= arr.length) {\n val = 0;\n }\n return val\n}\n\n// like lodash's uniqBy but much smaller\nfunction uniqBy (arr, func) {\n const set = new Set();\n const res = [];\n for (const item of arr) {\n const key = func(item);\n if (!set.has(key)) {\n set.add(key);\n res.push(item);\n }\n }\n return res\n}\n\n// We don't need all the data on every emoji, and there are specific things we need\n// for the UI, so build a \"view model\" from the emoji object we got from the database\n\nfunction summarizeEmojisForUI (emojis, emojiSupportLevel) {\n const toSimpleSkinsMap = skins => {\n const res = {};\n for (const skin of skins) {\n // ignore arrays like [1, 2] with multiple skin tones\n // also ignore variants that are in an unsupported emoji version\n // (these do exist - variants from a different version than their base emoji)\n if (typeof skin.tone === 'number' && skin.version <= emojiSupportLevel) {\n res[skin.tone] = skin.unicode;\n }\n }\n return res\n };\n\n return emojis.map(({ unicode, skins, shortcodes, url, name, category, annotation }) => ({\n unicode,\n name,\n shortcodes,\n url,\n category,\n annotation,\n id: unicode || name,\n skins: skins && toSimpleSkinsMap(skins)\n }))\n}\n\n// import rAF from one place so that the bundle size is a bit smaller\nconst rAF = requestAnimationFrame;\n\n// \"Svelte action\"-like utility to detect layout changes via ResizeObserver.\n// If ResizeObserver is unsupported, we just use rAF once and don't bother to update.\n\n\nlet resizeObserverSupported = typeof ResizeObserver === 'function';\n\nfunction resizeObserverAction (node, abortSignal, onUpdate) {\n let resizeObserver;\n if (resizeObserverSupported) {\n resizeObserver = new ResizeObserver(onUpdate);\n resizeObserver.observe(node);\n } else { // just run once, don't bother trying to track it\n rAF(onUpdate);\n }\n\n // cleanup function (called on destroy)\n abortSignal.addEventListener('abort', () => {\n if (resizeObserver) {\n resizeObserver.disconnect();\n }\n });\n}\n\n// get the width of the text inside of a DOM node, via https://stackoverflow.com/a/59525891/680742\nfunction calculateTextWidth (node) {\n // skip running this in jest/vitest because we don't need to check for emoji support in that environment\n /* istanbul ignore else */\n {\n const range = document.createRange();\n range.selectNode(node.firstChild);\n return range.getBoundingClientRect().width\n }\n}\n\nlet baselineEmojiWidth;\n\n/**\n * Check if the given emojis containing ZWJ characters are supported by the current browser (don't render\n * as double characters) and return true if all are supported.\n * @param zwjEmojisToCheck\n * @param baselineEmoji\n * @param emojiToDomNode\n */\nfunction checkZwjSupport (zwjEmojisToCheck, baselineEmoji, emojiToDomNode) {\n let allSupported = true;\n for (const emoji of zwjEmojisToCheck) {\n const domNode = emojiToDomNode(emoji);\n const emojiWidth = calculateTextWidth(domNode);\n if (typeof baselineEmojiWidth === 'undefined') { // calculate the baseline emoji width only once\n baselineEmojiWidth = calculateTextWidth(baselineEmoji);\n }\n // On Windows, some supported emoji are ~50% bigger than the baseline emoji, but what we really want to guard\n // against are the ones that are 2x the size, because those are truly broken (person with red hair = person with\n // floating red wig, black cat = cat with black square, polar bear = bear with snowflake, etc.)\n // So here we set the threshold at 1.8 times the size of the baseline emoji.\n const supported = emojiWidth / 1.8 < baselineEmojiWidth;\n supportedZwjEmojis.set(emoji.unicode, supported);\n\n if (!supported) {\n allSupported = false;\n }\n }\n return allSupported\n}\n\n// like lodash's uniq\n\nfunction uniq (arr) {\n return uniqBy(arr, _ => _)\n}\n\n// Note we put this in its own function outside Picker.js to avoid Svelte doing an invalidation on the \"setter\" here.\n// At best the invalidation is useless, at worst it can cause infinite loops:\n// https://github.com/nolanlawson/emoji-picker-element/pull/180\n// https://github.com/sveltejs/svelte/issues/6521\n// Also note tabpanelElement can be null if the element is disconnected immediately after connected\nfunction resetScrollTopIfPossible (element) {\n /* istanbul ignore else */\n if (element) { // Makes me nervous not to have this `if` guard\n element.scrollTop = 0;\n }\n}\n\nfunction getFromMap (cache, key, func) {\n let cached = cache.get(key);\n if (!cached) {\n cached = func();\n cache.set(key, cached);\n }\n return cached\n}\n\nfunction toString (value) {\n return '' + value\n}\n\nfunction parseTemplate (htmlString) {\n const template = document.createElement('template');\n template.innerHTML = htmlString;\n return template\n}\n\nconst parseCache = new WeakMap();\nconst domInstancesCache = new WeakMap();\n// This needs to be a symbol because it needs to be different from any possible output of a key function\nconst unkeyedSymbol = Symbol('un-keyed');\n\n// Not supported in Safari <=13\nconst hasReplaceChildren = 'replaceChildren' in Element.prototype;\nfunction replaceChildren (parentNode, newChildren) {\n /* istanbul ignore else */\n if (hasReplaceChildren) {\n parentNode.replaceChildren(...newChildren);\n } else { // minimal polyfill for Element.prototype.replaceChildren\n parentNode.innerHTML = '';\n parentNode.append(...newChildren);\n }\n}\n\nfunction doChildrenNeedRerender (parentNode, newChildren) {\n let oldChild = parentNode.firstChild;\n let oldChildrenCount = 0;\n // iterate using firstChild/nextSibling because browsers use a linked list under the hood\n while (oldChild) {\n const newChild = newChildren[oldChildrenCount];\n // check if the old child and new child are the same\n if (newChild !== oldChild) {\n return true\n }\n oldChild = oldChild.nextSibling;\n oldChildrenCount++;\n }\n // if new children length is different from old, we must re-render\n return oldChildrenCount !== newChildren.length\n}\n\nfunction patchChildren (newChildren, instanceBinding) {\n const { targetNode } = instanceBinding;\n let { targetParentNode } = instanceBinding;\n\n let needsRerender = false;\n\n if (targetParentNode) { // already rendered once\n needsRerender = doChildrenNeedRerender(targetParentNode, newChildren);\n } else { // first render of list\n needsRerender = true;\n instanceBinding.targetNode = undefined; // placeholder node not needed anymore, free memory\n instanceBinding.targetParentNode = targetParentNode = targetNode.parentNode;\n }\n // avoid re-rendering list if the dom nodes are exactly the same before and after\n if (needsRerender) {\n replaceChildren(targetParentNode, newChildren);\n }\n}\n\nfunction patch (expressions, instanceBindings) {\n for (const instanceBinding of instanceBindings) {\n const {\n targetNode,\n currentExpression,\n binding: {\n expressionIndex,\n attributeName,\n attributeValuePre,\n attributeValuePost\n }\n } = instanceBinding;\n\n const expression = expressions[expressionIndex];\n\n if (currentExpression === expression) {\n // no need to update, same as before\n continue\n }\n\n instanceBinding.currentExpression = expression;\n\n if (attributeName) { // attribute replacement\n targetNode.setAttribute(attributeName, attributeValuePre + toString(expression) + attributeValuePost);\n } else { // text node / child element / children replacement\n let newNode;\n if (Array.isArray(expression)) { // array of DOM elements produced by tag template literals\n patchChildren(expression, instanceBinding);\n } else if (expression instanceof Element) { // html tag template returning a DOM element\n newNode = expression;\n targetNode.replaceWith(newNode);\n } else { // primitive - string, number, etc\n // nodeValue is faster than textContent supposedly https://www.youtube.com/watch?v=LY6y3HbDVmg\n // note we may be replacing the value in a placeholder text node\n targetNode.nodeValue = toString(expression);\n }\n if (newNode) {\n instanceBinding.targetNode = newNode;\n }\n }\n }\n}\n\nfunction parse (tokens) {\n let htmlString = '';\n\n let withinTag = false;\n let withinAttribute = false;\n let elementIndexCounter = -1; // depth-first traversal order\n\n const elementsToBindings = new Map();\n const elementIndexes = [];\n\n for (let i = 0, len = tokens.length; i < len; i++) {\n const token = tokens[i];\n htmlString += token;\n\n if (i === len - 1) {\n break // no need to process characters - no more expressions to be found\n }\n\n for (let j = 0; j < token.length; j++) {\n const char = token.charAt(j);\n switch (char) {\n case '<': {\n const nextChar = token.charAt(j + 1);\n if (nextChar === '/') { // closing tag\n // leaving an element\n elementIndexes.pop();\n } else { // not a closing tag\n withinTag = true;\n elementIndexes.push(++elementIndexCounter);\n }\n break\n }\n case '>': {\n withinTag = false;\n withinAttribute = false;\n break\n }\n case '=': {\n withinAttribute = true;\n break\n }\n }\n }\n\n const elementIndex = elementIndexes[elementIndexes.length - 1];\n const bindings = getFromMap(elementsToBindings, elementIndex, () => []);\n\n let attributeName;\n let attributeValuePre;\n let attributeValuePost;\n if (withinAttribute) {\n // I never use single-quotes for attribute values in HTML, so just support double-quotes or no-quotes\n const match = /(\\S+)=\"?([^\"=]*)$/.exec(token);\n attributeName = match[1];\n attributeValuePre = match[2];\n attributeValuePost = /^[^\">]*/.exec(tokens[i + 1])[0];\n }\n\n const binding = {\n attributeName,\n attributeValuePre,\n attributeValuePost,\n expressionIndex: i\n };\n\n bindings.push(binding);\n\n if (!withinTag && !withinAttribute) {\n // Add a placeholder text node, so we can find it later. Note we only support one dynamic child text node\n htmlString += ' ';\n }\n }\n\n const template = parseTemplate(htmlString);\n\n return {\n template,\n elementsToBindings\n }\n}\n\nfunction applyBindings (bindings, element, instanceBindings) {\n for (let i = 0; i < bindings.length; i++) {\n const binding = bindings[i];\n\n const targetNode = binding.attributeName\n ? element // attribute binding, just use the element itself\n : element.firstChild; // not an attribute binding, so has a placeholder text node\n\n const instanceBinding = {\n binding,\n targetNode,\n targetParentNode: undefined,\n currentExpression: undefined\n };\n\n instanceBindings.push(instanceBinding);\n }\n}\n\nfunction traverseAndSetupBindings (rootElement, elementsToBindings) {\n const instanceBindings = [];\n\n let topLevelBindings;\n if (elementsToBindings.size === 1 && (topLevelBindings = elementsToBindings.get(0))) {\n // Optimization for the common case where there's only one element and one binding\n // Skip creating a TreeWalker entirely and just handle the root DOM element\n applyBindings(topLevelBindings, rootElement, instanceBindings);\n } else {\n // traverse dom\n const treeWalker = document.createTreeWalker(rootElement, NodeFilter.SHOW_ELEMENT);\n\n let element = rootElement;\n let elementIndex = -1;\n do {\n const bindings = elementsToBindings.get(++elementIndex);\n if (bindings) {\n applyBindings(bindings, element, instanceBindings);\n }\n } while ((element = treeWalker.nextNode()))\n }\n\n return instanceBindings\n}\n\nfunction parseHtml (tokens) {\n // All templates and bound expressions are unique per tokens array\n const { template, elementsToBindings } = getFromMap(parseCache, tokens, () => parse(tokens));\n\n // When we parseHtml, we always return a fresh DOM instance ready to be updated\n const dom = template.cloneNode(true).content.firstElementChild;\n const instanceBindings = traverseAndSetupBindings(dom, elementsToBindings);\n\n return function updateDomInstance (expressions) {\n patch(expressions, instanceBindings);\n return dom\n }\n}\n\nfunction createFramework (state) {\n const domInstances = getFromMap(domInstancesCache, state, () => new Map());\n let domInstanceCacheKey = unkeyedSymbol;\n\n function html (tokens, ...expressions) {\n // Each unique lexical usage of map() is considered unique due to the html`` tagged template call it makes,\n // which has lexically unique tokens. The unkeyed symbol is just used for html`` usage outside of a map().\n const domInstancesForTokens = getFromMap(domInstances, tokens, () => new Map());\n const updateDomInstance = getFromMap(domInstancesForTokens, domInstanceCacheKey, () => parseHtml(tokens));\n\n return updateDomInstance(expressions) // update with expressions\n }\n\n function map (array, callback, keyFunction) {\n return array.map((item, index) => {\n const originalCacheKey = domInstanceCacheKey;\n domInstanceCacheKey = keyFunction(item);\n try {\n return callback(item, index)\n } finally {\n domInstanceCacheKey = originalCacheKey;\n }\n })\n }\n\n return { map, html }\n}\n\nfunction render (container, state, helpers, events, actions, refs, abortSignal, actionContext, firstRender) {\n const { labelWithSkin, titleForEmoji, unicodeWithSkin } = helpers;\n const { html, map } = createFramework(state);\n\n function emojiList (emojis, searchMode, prefix) {\n return map(emojis, (emoji, i) => {\n return html``\n // It's important for the cache key to be unique based on the prefix, because the framework caches based on the\n // unique tokens + cache key, and the same emoji may be used in the tab as well as in the fav bar\n }, emoji => `${prefix}-${emoji.id}`)\n }\n\n const section = () => {\n return html`
${state.i18n.searchDescription}
${state.i18n.skinToneDescription}
${\n map(state.skinTones, (skinTone, i) => {\n return html`
${skinTone}
`\n }, skinTone => skinTone)\n }
${\n map(state.groups, (group) => {\n return html``\n }, group => group.id)\n }
${state.message || ''}
${\n map(state.currentEmojisWithCategories, (emojiWithCategory, i) => {\n return html`
${\n state.searchMode\n ? state.i18n.searchResultsLabel\n : (\n emojiWithCategory.category\n ? emojiWithCategory.category\n : (\n state.currentEmojisWithCategories.length > 1\n ? state.i18n.categories.custom\n : state.i18n.categories[state.currentGroup.name]\n )\n )\n }
${\n emojiList(emojiWithCategory.emojis, state.searchMode, /* prefix */ 'emo')\n }
`\n }, emojiWithCategory => emojiWithCategory.category)\n }
${\n emojiList(state.currentFavorites, /* searchMode */ false, /* prefix */ 'fav')\n }
`\n };\n\n const rootDom = section();\n\n // helper for traversing the dom, finding elements by an attribute, and getting the attribute value\n const forElementWithAttribute = (attributeName, callback) => {\n for (const element of container.querySelectorAll(`[${attributeName}]`)) {\n callback(element, element.getAttribute(attributeName));\n }\n };\n\n if (firstRender) { // not a re-render\n container.appendChild(rootDom);\n\n // we only bind events/refs once - there is no need to find them again given this component structure\n\n // bind events\n for (const eventName of ['click', 'focusout', 'input', 'keydown', 'keyup']) {\n forElementWithAttribute(`data-on-${eventName}`, (element, listenerName) => {\n element.addEventListener(eventName, events[listenerName]);\n });\n }\n\n // find refs\n forElementWithAttribute('data-ref', (element, ref) => {\n refs[ref] = element;\n });\n\n // destroy/abort logic\n abortSignal.addEventListener('abort', () => {\n container.removeChild(rootDom);\n });\n }\n\n // set up actions - these are re-bound on every render\n forElementWithAttribute('data-action', (element, action) => {\n let boundActions = actionContext.get(action);\n if (!boundActions) {\n actionContext.set(action, (boundActions = new WeakSet()));\n }\n\n // avoid applying the same action to the same element multiple times\n if (!boundActions.has(element)) {\n boundActions.add(element);\n actions[action](element);\n }\n });\n}\n\n/* istanbul ignore next */\nconst qM = typeof queueMicrotask === 'function' ? queueMicrotask : callback => Promise.resolve().then(callback);\n\nfunction createState (abortSignal) {\n let destroyed = false;\n let currentObserver;\n\n const propsToObservers = new Map();\n const dirtyObservers = new Set();\n\n let queued;\n\n const flush = () => {\n if (destroyed) {\n return\n }\n const observersToRun = [...dirtyObservers];\n dirtyObservers.clear(); // clear before running to force any new updates to run in another tick of the loop\n try {\n for (const observer of observersToRun) {\n observer();\n }\n } finally {\n queued = false;\n if (dirtyObservers.size) { // new updates, queue another one\n queued = true;\n qM(flush);\n }\n }\n };\n\n const state = new Proxy({}, {\n get (target, prop) {\n if (currentObserver) {\n let observers = propsToObservers.get(prop);\n if (!observers) {\n observers = new Set();\n propsToObservers.set(prop, observers);\n }\n observers.add(currentObserver);\n }\n return target[prop]\n },\n set (target, prop, newValue) {\n if (target[prop] !== newValue) {\n target[prop] = newValue;\n const observers = propsToObservers.get(prop);\n if (observers) {\n for (const observer of observers) {\n dirtyObservers.add(observer);\n }\n if (!queued) {\n queued = true;\n qM(flush);\n }\n }\n }\n return true\n }\n });\n\n const createEffect = (callback) => {\n const runnable = () => {\n const oldObserver = currentObserver;\n currentObserver = runnable;\n try {\n return callback()\n } finally {\n currentObserver = oldObserver;\n }\n };\n return runnable()\n };\n\n // destroy logic\n abortSignal.addEventListener('abort', () => {\n destroyed = true;\n });\n\n return {\n state,\n createEffect\n }\n}\n\n// Compare two arrays, with a function called on each item in the two arrays that returns true if the items are equal\nfunction arraysAreEqualByFunction (left, right, areEqualFunc) {\n if (left.length !== right.length) {\n return false\n }\n for (let i = 0; i < left.length; i++) {\n if (!areEqualFunc(left[i], right[i])) {\n return false\n }\n }\n return true\n}\n\nconst intersectionObserverCache = new WeakMap();\n\nfunction intersectionObserverAction (node, abortSignal, listener) {\n /* istanbul ignore else */\n {\n // The scroll root is always `.tabpanel`\n const root = node.closest('.tabpanel');\n\n let observer = intersectionObserverCache.get(root);\n if (!observer) {\n // TODO: replace this with the contentvisibilityautostatechange event when all supported browsers support it.\n // For now we use IntersectionObserver because it has better cross-browser support, and it would be bad for\n // old Safari versions if they eagerly downloaded all custom emoji all at once.\n observer = new IntersectionObserver(listener, {\n root,\n // trigger if we are 1/2 scroll container height away so that the images load a bit quicker while scrolling\n rootMargin: '50% 0px 50% 0px',\n // trigger if any part of the emoji grid is intersecting\n threshold: 0\n });\n\n // avoid creating a new IntersectionObserver for every category; just use one for the whole root\n intersectionObserverCache.set(root, observer);\n\n // assume that the abortSignal is always the same for this root node; just add one event listener\n abortSignal.addEventListener('abort', () => {\n observer.disconnect();\n });\n }\n\n observer.observe(node);\n }\n}\n\n/* eslint-disable prefer-const,no-labels,no-inner-declarations */\n\n// constants\nconst EMPTY_ARRAY = [];\n\nconst { assign } = Object;\n\nfunction createRoot (shadowRoot, props) {\n const refs = {};\n const abortController = new AbortController();\n const abortSignal = abortController.signal;\n const { state, createEffect } = createState(abortSignal);\n const actionContext = new Map();\n\n // initial state\n assign(state, {\n skinToneEmoji: undefined,\n i18n: undefined,\n database: undefined,\n customEmoji: undefined,\n customCategorySorting: undefined,\n emojiVersion: undefined\n });\n\n // public props\n assign(state, props);\n\n // private props\n assign(state, {\n initialLoad: true,\n currentEmojis: [],\n currentEmojisWithCategories: [],\n rawSearchText: '',\n searchText: '',\n searchMode: false,\n activeSearchItem: -1,\n message: undefined,\n skinTonePickerExpanded: false,\n skinTonePickerExpandedAfterAnimation: false,\n currentSkinTone: 0,\n activeSkinTone: 0,\n skinToneButtonText: undefined,\n pickerStyle: undefined,\n skinToneButtonLabel: '',\n skinTones: [],\n currentFavorites: [],\n defaultFavoriteEmojis: undefined,\n numColumns: DEFAULT_NUM_COLUMNS,\n isRtl: false,\n currentGroupIndex: 0,\n groups: groups,\n databaseLoaded: false,\n activeSearchItemId: undefined\n });\n\n //\n // Update the current group based on the currentGroupIndex\n //\n createEffect(() => {\n if (state.currentGroup !== state.groups[state.currentGroupIndex]) {\n state.currentGroup = state.groups[state.currentGroupIndex];\n }\n });\n\n //\n // Utils/helpers\n //\n\n const focus = id => {\n shadowRoot.getElementById(id).focus();\n };\n\n const emojiToDomNode = emoji => shadowRoot.getElementById(`emo-${emoji.id}`);\n\n // fire a custom event that crosses the shadow boundary\n const fireEvent = (name, detail) => {\n refs.rootElement.dispatchEvent(new CustomEvent(name, {\n detail,\n bubbles: true,\n composed: true\n }));\n };\n\n //\n // Comparison utils\n //\n\n const compareEmojiArrays = (a, b) => a.id === b.id;\n\n const compareCurrentEmojisWithCategories = (a, b) => {\n const { category: aCategory, emojis: aEmojis } = a;\n const { category: bCategory, emojis: bEmojis } = b;\n\n if (aCategory !== bCategory) {\n return false\n }\n\n return arraysAreEqualByFunction(aEmojis, bEmojis, compareEmojiArrays)\n };\n\n //\n // Update utils to avoid excessive re-renders\n //\n\n // avoid excessive re-renders by checking the value before setting\n const updateCurrentEmojis = (newEmojis) => {\n if (!arraysAreEqualByFunction(state.currentEmojis, newEmojis, compareEmojiArrays)) {\n state.currentEmojis = newEmojis;\n }\n };\n\n // avoid excessive re-renders\n const updateSearchMode = (newSearchMode) => {\n if (state.searchMode !== newSearchMode) {\n state.searchMode = newSearchMode;\n }\n };\n\n // avoid excessive re-renders\n const updateCurrentEmojisWithCategories = (newEmojisWithCategories) => {\n if (!arraysAreEqualByFunction(state.currentEmojisWithCategories, newEmojisWithCategories, compareCurrentEmojisWithCategories)) {\n state.currentEmojisWithCategories = newEmojisWithCategories;\n }\n };\n\n // Helpers used by PickerTemplate\n\n const unicodeWithSkin = (emoji, currentSkinTone) => (\n (currentSkinTone && emoji.skins && emoji.skins[currentSkinTone]) || emoji.unicode\n );\n\n const labelWithSkin = (emoji, currentSkinTone) => (\n uniq([\n (emoji.name || unicodeWithSkin(emoji, currentSkinTone)),\n emoji.annotation,\n ...(emoji.shortcodes || EMPTY_ARRAY)\n ].filter(Boolean)).join(', ')\n );\n\n const titleForEmoji = (emoji) => (\n emoji.annotation || (emoji.shortcodes || EMPTY_ARRAY).join(', ')\n );\n\n const helpers = {\n labelWithSkin, titleForEmoji, unicodeWithSkin\n };\n const events = {\n onClickSkinToneButton,\n onEmojiClick,\n onNavClick,\n onNavKeydown,\n onSearchKeydown,\n onSkinToneOptionsClick,\n onSkinToneOptionsFocusOut,\n onSkinToneOptionsKeydown,\n onSkinToneOptionsKeyup,\n onSearchInput\n };\n const actions = {\n calculateEmojiGridStyle,\n updateOnIntersection\n };\n\n let firstRender = true;\n createEffect(() => {\n render(shadowRoot, state, helpers, events, actions, refs, abortSignal, actionContext, firstRender);\n firstRender = false;\n });\n\n //\n // Determine the emoji support level (in requestIdleCallback)\n //\n\n // mount logic\n if (!state.emojiVersion) {\n detectEmojiSupportLevel().then(level => {\n // Can't actually test emoji support in Jest/Vitest/JSDom, emoji never render in color in Cairo\n /* istanbul ignore next */\n if (!level) {\n state.message = state.i18n.emojiUnsupportedMessage;\n }\n });\n }\n\n //\n // Set or update the database object\n //\n\n createEffect(() => {\n // show a Loading message if it takes a long time, or show an error if there's a network/IDB error\n async function handleDatabaseLoading () {\n let showingLoadingMessage = false;\n const timeoutHandle = setTimeout(() => {\n showingLoadingMessage = true;\n state.message = state.i18n.loadingMessage;\n }, TIMEOUT_BEFORE_LOADING_MESSAGE);\n try {\n await state.database.ready();\n state.databaseLoaded = true; // eslint-disable-line no-unused-vars\n } catch (err) {\n console.error(err);\n state.message = state.i18n.networkErrorMessage;\n } finally {\n clearTimeout(timeoutHandle);\n if (showingLoadingMessage) { // Seems safer than checking the i18n string, which may change\n showingLoadingMessage = false;\n state.message = ''; // eslint-disable-line no-unused-vars\n }\n }\n }\n\n if (state.database) {\n /* no await */\n handleDatabaseLoading();\n }\n });\n\n //\n // Global styles for the entire picker\n //\n\n createEffect(() => {\n state.pickerStyle = `\n --num-groups: ${state.groups.length}; \n --indicator-opacity: ${state.searchMode ? 0 : 1}; \n --num-skintones: ${NUM_SKIN_TONES};`;\n });\n\n //\n // Set or update the customEmoji\n //\n\n createEffect(() => {\n if (state.customEmoji && state.database) {\n updateCustomEmoji(); // re-run whenever customEmoji change\n }\n });\n\n createEffect(() => {\n if (state.customEmoji && state.customEmoji.length) {\n if (state.groups !== allGroups) { // don't update unnecessarily\n state.groups = allGroups;\n }\n } else if (state.groups !== groups) {\n if (state.currentGroupIndex) {\n // If the current group is anything other than \"custom\" (which is first), decrement.\n // This fixes the odd case where you set customEmoji, then pick a category, then unset customEmoji\n state.currentGroupIndex--;\n }\n state.groups = groups;\n }\n });\n\n //\n // Set or update the preferred skin tone\n //\n\n createEffect(() => {\n async function updatePreferredSkinTone () {\n if (state.databaseLoaded) {\n state.currentSkinTone = await state.database.getPreferredSkinTone();\n }\n }\n\n /* no await */ updatePreferredSkinTone();\n });\n\n createEffect(() => {\n state.skinTones = Array(NUM_SKIN_TONES).fill().map((_, i) => applySkinTone(state.skinToneEmoji, i));\n });\n\n createEffect(() => {\n state.skinToneButtonText = state.skinTones[state.currentSkinTone];\n });\n\n createEffect(() => {\n state.skinToneButtonLabel = state.i18n.skinToneLabel.replace('{skinTone}', state.i18n.skinTones[state.currentSkinTone]);\n });\n\n //\n // Set or update the favorites emojis\n //\n\n createEffect(() => {\n async function updateDefaultFavoriteEmojis () {\n const { database } = state;\n const favs = (await Promise.all(MOST_COMMONLY_USED_EMOJI.map(unicode => (\n database.getEmojiByUnicodeOrName(unicode)\n )))).filter(Boolean); // filter because in Jest/Vitest tests we don't have all the emoji in the DB\n state.defaultFavoriteEmojis = favs;\n }\n\n if (state.databaseLoaded) {\n /* no await */ updateDefaultFavoriteEmojis();\n }\n });\n\n function updateCustomEmoji () {\n // Certain effects have an implicit dependency on customEmoji since it affects the database\n // Getting it here on the state ensures this effect re-runs when customEmoji change.\n const { customEmoji, database } = state;\n const databaseCustomEmoji = customEmoji || EMPTY_ARRAY;\n if (database.customEmoji !== databaseCustomEmoji) {\n // Avoid setting this if the customEmoji have _not_ changed, because the setter triggers a re-computation of the\n // `customEmojiIndex`. Note we don't bother with deep object changes.\n database.customEmoji = databaseCustomEmoji;\n }\n }\n\n createEffect(() => {\n async function updateFavorites () {\n updateCustomEmoji(); // re-run whenever customEmoji change\n const { database, defaultFavoriteEmojis, numColumns } = state;\n const dbFavorites = await database.getTopFavoriteEmoji(numColumns);\n const favorites = await summarizeEmojis(uniqBy([\n ...dbFavorites,\n ...defaultFavoriteEmojis\n ], _ => (_.unicode || _.name)).slice(0, numColumns));\n state.currentFavorites = favorites;\n }\n\n if (state.databaseLoaded && state.defaultFavoriteEmojis) {\n /* no await */ updateFavorites();\n }\n });\n\n //\n // Re-run whenever the emoji grid changes size, and re-calc style/layout-related state variables:\n // 1) Re-calculate the --num-columns var because it may have changed\n // 2) Re-calculate whether we're in RTL mode or not.\n //\n // The benefit of doing this in one place is to align with rAF/ResizeObserver\n // and do all the calculations in one go. RTL vs LTR is not strictly layout-related,\n // but since we're already reading the style here, and since it's already aligned with\n // the rAF loop, this is the most appropriate place to do it perf-wise.\n //\n\n function calculateEmojiGridStyle (node) {\n resizeObserverAction(node, abortSignal, () => {\n /* istanbul ignore next */\n { // jsdom throws errors for this kind of fancy stuff\n // read all the style/layout calculations we need to make\n const style = getComputedStyle(refs.rootElement);\n const newNumColumns = parseInt(style.getPropertyValue('--num-columns'), 10);\n const newIsRtl = style.getPropertyValue('direction') === 'rtl';\n\n // write to state variables\n state.numColumns = newNumColumns;\n state.isRtl = newIsRtl;\n }\n });\n }\n\n // Re-run whenever the custom emoji in a category are shown/hidden. This is an optimization that simulates\n // what we'd get from `` but without rendering an ``.\n function updateOnIntersection (node) {\n intersectionObserverAction(node, abortSignal, (entries) => {\n for (const { target, isIntersecting } of entries) {\n target.classList.toggle('onscreen', isIntersecting);\n }\n });\n }\n\n //\n // Set or update the currentEmojis. Check for invalid ZWJ renderings\n // (i.e. double emoji).\n //\n\n createEffect(() => {\n async function updateEmojis () {\n const { searchText, currentGroup, databaseLoaded, customEmoji } = state;\n if (!databaseLoaded) {\n state.currentEmojis = [];\n state.searchMode = false;\n } else if (searchText.length >= MIN_SEARCH_TEXT_LENGTH) {\n const newEmojis = await getEmojisBySearchQuery(searchText);\n if (state.searchText === searchText) { // if the situation changes asynchronously, do not update\n updateCurrentEmojis(newEmojis);\n updateSearchMode(true);\n }\n } else { // database is loaded and we're not in search mode, so we're in normal category mode\n const { id: currentGroupId } = currentGroup;\n // avoid race condition where currentGroupId is -1 and customEmoji is undefined/empty\n if (currentGroupId !== -1 || (customEmoji && customEmoji.length)) {\n const newEmojis = await getEmojisByGroup(currentGroupId);\n if (state.currentGroup.id === currentGroupId) { // if the situation changes asynchronously, do not update\n updateCurrentEmojis(newEmojis);\n updateSearchMode(false);\n }\n }\n }\n }\n\n /* no await */ updateEmojis();\n });\n\n const resetScrollTopInRaf = () => {\n rAF(() => resetScrollTopIfPossible(refs.tabpanelElement));\n };\n\n // Some emojis have their ligatures rendered as two or more consecutive emojis\n // We want to treat these the same as unsupported emojis, so we compare their\n // widths against the baseline widths and remove them as necessary\n createEffect(() => {\n const { currentEmojis, emojiVersion } = state;\n const zwjEmojisToCheck = currentEmojis\n .filter(emoji => emoji.unicode) // filter custom emoji\n .filter(emoji => hasZwj(emoji) && !supportedZwjEmojis.has(emoji.unicode));\n if (!emojiVersion && zwjEmojisToCheck.length) {\n // render now, check their length later\n updateCurrentEmojis(currentEmojis);\n rAF(() => checkZwjSupportAndUpdate(zwjEmojisToCheck));\n } else {\n const newEmojis = emojiVersion ? currentEmojis : currentEmojis.filter(isZwjSupported);\n updateCurrentEmojis(newEmojis);\n // Reset scroll top to 0 when emojis change\n resetScrollTopInRaf();\n }\n });\n\n function checkZwjSupportAndUpdate (zwjEmojisToCheck) {\n const allSupported = checkZwjSupport(zwjEmojisToCheck, refs.baselineEmoji, emojiToDomNode);\n if (allSupported) {\n // Even if all emoji are supported, we still need to reset the scroll top to 0 when emojis change\n resetScrollTopInRaf();\n } else {\n // Force update. We only do this if there are any unsupported ZWJ characters since otherwise,\n // for browsers that support all emoji, it would be an unnecessary extra re-render.\n state.currentEmojis = [...state.currentEmojis];\n }\n }\n\n function isZwjSupported (emoji) {\n return !emoji.unicode || !hasZwj(emoji) || supportedZwjEmojis.get(emoji.unicode)\n }\n\n async function filterEmojisByVersion (emojis) {\n const emojiSupportLevel = state.emojiVersion || await detectEmojiSupportLevel();\n // !version corresponds to custom emoji\n return emojis.filter(({ version }) => !version || version <= emojiSupportLevel)\n }\n\n async function summarizeEmojis (emojis) {\n return summarizeEmojisForUI(emojis, state.emojiVersion || await detectEmojiSupportLevel())\n }\n\n async function getEmojisByGroup (group) {\n // -1 is custom emoji\n const emoji = group === -1 ? state.customEmoji : await state.database.getEmojiByGroup(group);\n return summarizeEmojis(await filterEmojisByVersion(emoji))\n }\n\n async function getEmojisBySearchQuery (query) {\n return summarizeEmojis(await filterEmojisByVersion(await state.database.getEmojiBySearchQuery(query)))\n }\n\n createEffect(() => {\n });\n\n //\n // Derive currentEmojisWithCategories from currentEmojis. This is always done even if there\n // are no categories, because it's just easier to code the HTML this way.\n //\n\n createEffect(() => {\n function calculateCurrentEmojisWithCategories () {\n const { searchMode, currentEmojis } = state;\n if (searchMode) {\n return [\n {\n category: '',\n emojis: currentEmojis\n }\n ]\n }\n const categoriesToEmoji = new Map();\n for (const emoji of currentEmojis) {\n const category = emoji.category || '';\n let emojis = categoriesToEmoji.get(category);\n if (!emojis) {\n emojis = [];\n categoriesToEmoji.set(category, emojis);\n }\n emojis.push(emoji);\n }\n return [...categoriesToEmoji.entries()]\n .map(([category, emojis]) => ({ category, emojis }))\n .sort((a, b) => state.customCategorySorting(a.category, b.category))\n }\n\n const newEmojisWithCategories = calculateCurrentEmojisWithCategories();\n updateCurrentEmojisWithCategories(newEmojisWithCategories);\n });\n\n //\n // Handle active search item (i.e. pressing up or down while searching)\n //\n\n createEffect(() => {\n state.activeSearchItemId = state.activeSearchItem !== -1 && state.currentEmojis[state.activeSearchItem].id;\n });\n\n //\n // Handle user input on the search input\n //\n\n createEffect(() => {\n const { rawSearchText } = state;\n rIC(() => {\n state.searchText = (rawSearchText || '').trim(); // defer to avoid input delays, plus we can trim here\n state.activeSearchItem = -1;\n });\n });\n\n function onSearchKeydown (event) {\n if (!state.searchMode || !state.currentEmojis.length) {\n return\n }\n\n const goToNextOrPrevious = (previous) => {\n halt(event);\n state.activeSearchItem = incrementOrDecrement(previous, state.activeSearchItem, state.currentEmojis);\n };\n\n switch (event.key) {\n case 'ArrowDown':\n return goToNextOrPrevious(false)\n case 'ArrowUp':\n return goToNextOrPrevious(true)\n case 'Enter':\n if (state.activeSearchItem === -1) {\n // focus the first option in the list since the list must be non-empty at this point (it's verified above)\n state.activeSearchItem = 0;\n } else { // there is already an active search item\n halt(event);\n return clickEmoji(state.currentEmojis[state.activeSearchItem].id)\n }\n }\n }\n\n //\n // Handle user input on nav\n //\n\n function onNavClick (event) {\n const { target } = event;\n const closestTarget = target.closest('.nav-button');\n /* istanbul ignore if */\n if (!closestTarget) {\n return // This should never happen, but makes me nervous not to have it\n }\n const groupId = parseInt(closestTarget.dataset.groupId, 10);\n refs.searchElement.value = ''; // clear search box input\n state.rawSearchText = '';\n state.searchText = '';\n state.activeSearchItem = -1;\n state.currentGroupIndex = state.groups.findIndex(_ => _.id === groupId);\n }\n\n function onNavKeydown (event) {\n const { target, key } = event;\n\n const doFocus = el => {\n if (el) {\n halt(event);\n el.focus();\n }\n };\n\n switch (key) {\n case 'ArrowLeft':\n return doFocus(target.previousElementSibling)\n case 'ArrowRight':\n return doFocus(target.nextElementSibling)\n case 'Home':\n return doFocus(target.parentElement.firstElementChild)\n case 'End':\n return doFocus(target.parentElement.lastElementChild)\n }\n }\n\n //\n // Handle user input on an emoji\n //\n\n async function clickEmoji (unicodeOrName) {\n const emoji = await state.database.getEmojiByUnicodeOrName(unicodeOrName);\n const emojiSummary = [...state.currentEmojis, ...state.currentFavorites]\n .find(_ => (_.id === unicodeOrName));\n const skinTonedUnicode = emojiSummary.unicode && unicodeWithSkin(emojiSummary, state.currentSkinTone);\n await state.database.incrementFavoriteEmojiCount(unicodeOrName);\n fireEvent('emoji-click', {\n emoji,\n skinTone: state.currentSkinTone,\n ...(skinTonedUnicode && { unicode: skinTonedUnicode }),\n ...(emojiSummary.name && { name: emojiSummary.name })\n });\n }\n\n async function onEmojiClick (event) {\n const { target } = event;\n /* istanbul ignore if */\n if (!target.classList.contains('emoji')) {\n // This should never happen, but makes me nervous not to have it\n return\n }\n halt(event);\n const id = target.id.substring(4); // replace 'emo-' or 'fav-' prefix\n\n /* no await */ clickEmoji(id);\n }\n\n //\n // Handle user input on the skintone picker\n //\n\n function changeSkinTone (skinTone) {\n state.currentSkinTone = skinTone;\n state.skinTonePickerExpanded = false;\n focus('skintone-button');\n fireEvent('skin-tone-change', { skinTone });\n /* no await */ state.database.setPreferredSkinTone(skinTone);\n }\n\n function onSkinToneOptionsClick (event) {\n const { target: { id } } = event;\n const match = id && id.match(/^skintone-(\\d)/); // skintone option format\n /* istanbul ignore if */\n if (!match) { // not a skintone option\n return // This should never happen, but makes me nervous not to have it\n }\n halt(event);\n const skinTone = parseInt(match[1], 10); // remove 'skintone-' prefix\n changeSkinTone(skinTone);\n }\n\n function onClickSkinToneButton (event) {\n state.skinTonePickerExpanded = !state.skinTonePickerExpanded;\n state.activeSkinTone = state.currentSkinTone;\n // this should always be true, since the button is obscured by the listbox, so this `if` is just to be sure\n if (state.skinTonePickerExpanded) {\n halt(event);\n rAF(() => focus('skintone-list'));\n }\n }\n\n // To make the animation nicer, change the z-index of the skintone picker button\n // *after* the animation has played. This makes it appear that the picker box\n // is expanding \"below\" the button\n createEffect(() => {\n if (state.skinTonePickerExpanded) {\n refs.skinToneDropdown.addEventListener('transitionend', () => {\n state.skinTonePickerExpandedAfterAnimation = true; // eslint-disable-line no-unused-vars\n }, { once: true });\n } else {\n state.skinTonePickerExpandedAfterAnimation = false; // eslint-disable-line no-unused-vars\n }\n });\n\n function onSkinToneOptionsKeydown (event) {\n // this should never happen, but makes me nervous not to have it\n /* istanbul ignore if */\n if (!state.skinTonePickerExpanded) {\n return\n }\n const changeActiveSkinTone = async nextSkinTone => {\n halt(event);\n state.activeSkinTone = nextSkinTone;\n };\n\n switch (event.key) {\n case 'ArrowUp':\n return changeActiveSkinTone(incrementOrDecrement(true, state.activeSkinTone, state.skinTones))\n case 'ArrowDown':\n return changeActiveSkinTone(incrementOrDecrement(false, state.activeSkinTone, state.skinTones))\n case 'Home':\n return changeActiveSkinTone(0)\n case 'End':\n return changeActiveSkinTone(state.skinTones.length - 1)\n case 'Enter':\n // enter on keydown, space on keyup. this is just how browsers work for buttons\n // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html\n halt(event);\n return changeSkinTone(state.activeSkinTone)\n case 'Escape':\n halt(event);\n state.skinTonePickerExpanded = false;\n return focus('skintone-button')\n }\n }\n\n function onSkinToneOptionsKeyup (event) {\n // this should never happen, but makes me nervous not to have it\n /* istanbul ignore if */\n if (!state.skinTonePickerExpanded) {\n return\n }\n switch (event.key) {\n case ' ':\n // enter on keydown, space on keyup. this is just how browsers work for buttons\n // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html\n halt(event);\n return changeSkinTone(state.activeSkinTone)\n }\n }\n\n async function onSkinToneOptionsFocusOut (event) {\n // On blur outside of the skintone listbox, collapse the skintone picker.\n const { relatedTarget } = event;\n // The `else` should never happen, but makes me nervous not to have it\n /* istanbul ignore else */\n if (!relatedTarget || relatedTarget.id !== 'skintone-list') {\n state.skinTonePickerExpanded = false;\n }\n }\n\n function onSearchInput (event) {\n state.rawSearchText = event.target.value;\n }\n\n return {\n $set (newState) {\n assign(state, newState);\n },\n $destroy () {\n abortController.abort();\n }\n }\n}\n\nconst DEFAULT_DATA_SOURCE = 'https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json';\nconst DEFAULT_LOCALE = 'en';\n\nvar enI18n = {\n categoriesLabel: 'Categories',\n emojiUnsupportedMessage: 'Your browser does not support color emoji.',\n favoritesLabel: 'Favorites',\n loadingMessage: 'Loading…',\n networkErrorMessage: 'Could not load emoji.',\n regionLabel: 'Emoji picker',\n searchDescription: 'When search results are available, press up or down to select and enter to choose.',\n searchLabel: 'Search',\n searchResultsLabel: 'Search results',\n skinToneDescription: 'When expanded, press up or down to select and enter to choose.',\n skinToneLabel: 'Choose a skin tone (currently {skinTone})',\n skinTonesLabel: 'Skin tones',\n skinTones: [\n 'Default',\n 'Light',\n 'Medium-Light',\n 'Medium',\n 'Medium-Dark',\n 'Dark'\n ],\n categories: {\n custom: 'Custom',\n 'smileys-emotion': 'Smileys and emoticons',\n 'people-body': 'People and body',\n 'animals-nature': 'Animals and nature',\n 'food-drink': 'Food and drink',\n 'travel-places': 'Travel and places',\n activities: 'Activities',\n objects: 'Objects',\n symbols: 'Symbols',\n flags: 'Flags'\n }\n};\n\nvar baseStyles = \":host{--emoji-size:1.375rem;--emoji-padding:0.5rem;--category-emoji-size:var(--emoji-size);--category-emoji-padding:var(--emoji-padding);--indicator-height:3px;--input-border-radius:0.5rem;--input-border-size:1px;--input-font-size:1rem;--input-line-height:1.5;--input-padding:0.25rem;--num-columns:8;--outline-size:2px;--border-size:1px;--border-radius:0;--skintone-border-radius:1rem;--category-font-size:1rem;display:flex;width:min-content;height:400px}:host,:host(.light){color-scheme:light;--background:#fff;--border-color:#e0e0e0;--indicator-color:#385ac1;--input-border-color:#999;--input-font-color:#111;--input-placeholder-color:#999;--outline-color:#999;--category-font-color:#111;--button-active-background:#e6e6e6;--button-hover-background:#d9d9d9}:host(.dark){color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}@media (prefers-color-scheme:dark){:host{color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}}:host([hidden]){display:none}button{margin:0;padding:0;border:0;background:0 0;box-shadow:none;-webkit-tap-highlight-color:transparent}button::-moz-focus-inner{border:0}input{padding:0;margin:0;line-height:1.15;font-family:inherit}input[type=search]{-webkit-appearance:none}:focus{outline:var(--outline-color) solid var(--outline-size);outline-offset:calc(-1*var(--outline-size))}:host([data-js-focus-visible]) :focus:not([data-focus-visible-added]){outline:0}:focus:not(:focus-visible){outline:0}.hide-focus{outline:0}*{box-sizing:border-box}.picker{contain:content;display:flex;flex-direction:column;background:var(--background);border:var(--border-size) solid var(--border-color);border-radius:var(--border-radius);width:100%;height:100%;overflow:hidden;--total-emoji-size:calc(var(--emoji-size) + (2 * var(--emoji-padding)));--total-category-emoji-size:calc(var(--category-emoji-size) + (2 * var(--category-emoji-padding)))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.hidden{opacity:0;pointer-events:none}.abs-pos{position:absolute;left:0;top:0}.gone{display:none!important}.skintone-button-wrapper,.skintone-list{background:var(--background);z-index:3}.skintone-button-wrapper.expanded{z-index:1}.skintone-list{position:absolute;inset-inline-end:0;top:0;z-index:2;overflow:visible;border-bottom:var(--border-size) solid var(--border-color);border-radius:0 0 var(--skintone-border-radius) var(--skintone-border-radius);will-change:transform;transition:transform .2s ease-in-out;transform-origin:center 0}@media (prefers-reduced-motion:reduce){.skintone-list{transition-duration:.001s}}@supports not (inset-inline-end:0){.skintone-list{right:0}}.skintone-list.no-animate{transition:none}.tabpanel{overflow-y:auto;scrollbar-gutter:stable;-webkit-overflow-scrolling:touch;will-change:transform;min-height:0;flex:1;contain:content}.emoji-menu{display:grid;grid-template-columns:repeat(var(--num-columns),var(--total-emoji-size));justify-content:space-around;align-items:flex-start;width:100%}.emoji-menu.visibility-auto{content-visibility:auto;contain-intrinsic-size:calc(var(--num-columns)*var(--total-emoji-size)) calc(var(--num-rows)*var(--total-emoji-size))}.category{padding:var(--emoji-padding);font-size:var(--category-font-size);color:var(--category-font-color)}.emoji,button.emoji{font-size:var(--emoji-size);display:flex;align-items:center;justify-content:center;border-radius:100%;height:var(--total-emoji-size);width:var(--total-emoji-size);line-height:1;overflow:hidden;font-family:var(--emoji-font-family);cursor:pointer}@media (hover:hover) and (pointer:fine){.emoji:hover,button.emoji:hover{background:var(--button-hover-background)}}.emoji.active,.emoji:active,button.emoji.active,button.emoji:active{background:var(--button-active-background)}.onscreen .custom-emoji::after{content:\\\"\\\";width:var(--emoji-size);height:var(--emoji-size);background-repeat:no-repeat;background-position:center center;background-size:contain;background-image:var(--custom-emoji-background)}.nav,.nav-button{align-items:center}.nav{display:grid;justify-content:space-between;contain:content}.nav-button{display:flex;justify-content:center}.nav-emoji{font-size:var(--category-emoji-size);width:var(--total-category-emoji-size);height:var(--total-category-emoji-size)}.indicator-wrapper{display:flex;border-bottom:1px solid var(--border-color)}.indicator{width:calc(100%/var(--num-groups));height:var(--indicator-height);opacity:var(--indicator-opacity);background-color:var(--indicator-color);will-change:transform,opacity;transition:opacity .1s linear,transform .25s ease-in-out}@media (prefers-reduced-motion:reduce){.indicator{will-change:opacity;transition:opacity .1s linear}}.pad-top,input.search{background:var(--background);width:100%}.pad-top{height:var(--emoji-padding);z-index:3}.search-row{display:flex;align-items:center;position:relative;padding-inline-start:var(--emoji-padding);padding-bottom:var(--emoji-padding)}.search-wrapper{flex:1;min-width:0}input.search{padding:var(--input-padding);border-radius:var(--input-border-radius);border:var(--input-border-size) solid var(--input-border-color);color:var(--input-font-color);font-size:var(--input-font-size);line-height:var(--input-line-height)}input.search::placeholder{color:var(--input-placeholder-color)}.favorites{overflow-y:auto;scrollbar-gutter:stable;display:flex;flex-direction:row;border-top:var(--border-size) solid var(--border-color);contain:content}.message{padding:var(--emoji-padding)}\";\n\nconst PROPS = [\n 'customEmoji',\n 'customCategorySorting',\n 'database',\n 'dataSource',\n 'i18n',\n 'locale',\n 'skinToneEmoji',\n 'emojiVersion'\n];\n\n// Styles injected ourselves, so we can declare the FONT_FAMILY variable in one place\nconst EXTRA_STYLES = `:host{--emoji-font-family:${FONT_FAMILY}}`;\n\nclass PickerElement extends HTMLElement {\n constructor (props) {\n super();\n this.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = baseStyles + EXTRA_STYLES;\n this.shadowRoot.appendChild(style);\n this._ctx = {\n // Set defaults\n locale: DEFAULT_LOCALE,\n dataSource: DEFAULT_DATA_SOURCE,\n skinToneEmoji: DEFAULT_SKIN_TONE_EMOJI,\n customCategorySorting: DEFAULT_CATEGORY_SORTING,\n customEmoji: null,\n i18n: enI18n,\n emojiVersion: null,\n ...props\n };\n // Handle properties set before the element was upgraded\n for (const prop of PROPS) {\n if (prop !== 'database' && Object.prototype.hasOwnProperty.call(this, prop)) {\n this._ctx[prop] = this[prop];\n delete this[prop];\n }\n }\n this._dbFlush(); // wait for a flush before creating the db, in case the user calls e.g. a setter or setAttribute\n }\n\n connectedCallback () {\n // The _cmp may be defined if the component was immediately disconnected and then reconnected. In that case,\n // do nothing (preserve the state)\n if (!this._cmp) {\n this._cmp = createRoot(this.shadowRoot, this._ctx);\n }\n }\n\n disconnectedCallback () {\n // Check in a microtask if the element is still connected. If so, treat this as a \"move\" rather than a disconnect\n // Inspired by Vue: https://vuejs.org/guide/extras/web-components.html#building-custom-elements-with-vue\n qM(() => {\n // this._cmp may be defined if connect-disconnect-connect-disconnect occurs synchronously\n if (!this.isConnected && this._cmp) {\n this._cmp.$destroy();\n this._cmp = undefined;\n\n const { database } = this._ctx;\n database.close()\n // only happens if the database failed to load in the first place, so we don't care\n .catch(err => console.error(err));\n }\n });\n }\n\n static get observedAttributes () {\n return ['locale', 'data-source', 'skin-tone-emoji', 'emoji-version'] // complex objects aren't supported, also use kebab-case\n }\n\n attributeChangedCallback (attrName, oldValue, newValue) {\n this._set(\n // convert from kebab-case to camelcase\n // see https://github.com/sveltejs/svelte/issues/3852#issuecomment-665037015\n attrName.replace(/-([a-z])/g, (_, up) => up.toUpperCase()),\n // convert string attribute to float if necessary\n attrName === 'emoji-version' ? parseFloat(newValue) : newValue\n );\n }\n\n _set (prop, newValue) {\n this._ctx[prop] = newValue;\n if (this._cmp) {\n this._cmp.$set({ [prop]: newValue });\n }\n if (['locale', 'dataSource'].includes(prop)) {\n this._dbFlush();\n }\n }\n\n _dbCreate () {\n const { locale, dataSource, database } = this._ctx;\n // only create a new database if we really need to\n if (!database || database.locale !== locale || database.dataSource !== dataSource) {\n this._set('database', new Database({ locale, dataSource }));\n }\n }\n\n // Update the Database in one microtask if the locale/dataSource change. We do one microtask\n // so we don't create two Databases if e.g. both the locale and the dataSource change\n _dbFlush () {\n qM(() => (\n this._dbCreate()\n ));\n }\n}\n\nconst definitions = {};\n\nfor (const prop of PROPS) {\n definitions[prop] = {\n get () {\n if (prop === 'database') {\n // in rare cases, the microtask may not be flushed yet, so we need to instantiate the DB\n // now if the user is asking for it\n this._dbCreate();\n }\n return this._ctx[prop]\n },\n set (val) {\n if (prop === 'database') {\n throw new Error('database is read-only')\n }\n this._set(prop, val);\n }\n };\n}\n\nObject.defineProperties(PickerElement.prototype, definitions);\n\n/* istanbul ignore else */\nif (!customElements.get('emoji-picker')) { // if already defined, do nothing (e.g. same script imported twice)\n customElements.define('emoji-picker', PickerElement);\n}\n\nexport { PickerElement as default };\n","function assertNonEmptyString (str) {\n if (typeof str !== 'string' || !str) {\n throw new Error('expected a non-empty string, got: ' + str)\n }\n}\n\nfunction assertNumber (number) {\n if (typeof number !== 'number') {\n throw new Error('expected a number, got: ' + number)\n }\n}\n\nconst DB_VERSION_CURRENT = 1;\nconst DB_VERSION_INITIAL = 1;\nconst STORE_EMOJI = 'emoji';\nconst STORE_KEYVALUE = 'keyvalue';\nconst STORE_FAVORITES = 'favorites';\nconst FIELD_TOKENS = 'tokens';\nconst INDEX_TOKENS = 'tokens';\nconst FIELD_UNICODE = 'unicode';\nconst INDEX_COUNT = 'count';\nconst FIELD_GROUP = 'group';\nconst FIELD_ORDER = 'order';\nconst INDEX_GROUP_AND_ORDER = 'group-order';\nconst KEY_ETAG = 'eTag';\nconst KEY_URL = 'url';\nconst KEY_PREFERRED_SKINTONE = 'skinTone';\nconst MODE_READONLY = 'readonly';\nconst MODE_READWRITE = 'readwrite';\nconst INDEX_SKIN_UNICODE = 'skinUnicodes';\nconst FIELD_SKIN_UNICODE = 'skinUnicodes';\n\nconst DEFAULT_DATA_SOURCE = 'https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json';\nconst DEFAULT_LOCALE = 'en';\n\n// like lodash's uniqBy but much smaller\nfunction uniqBy (arr, func) {\n const set = new Set();\n const res = [];\n for (const item of arr) {\n const key = func(item);\n if (!set.has(key)) {\n set.add(key);\n res.push(item);\n }\n }\n return res\n}\n\nfunction uniqEmoji (emojis) {\n return uniqBy(emojis, _ => _.unicode)\n}\n\nfunction initialMigration (db) {\n function createObjectStore (name, keyPath, indexes) {\n const store = keyPath\n ? db.createObjectStore(name, { keyPath })\n : db.createObjectStore(name);\n if (indexes) {\n for (const [indexName, [keyPath, multiEntry]] of Object.entries(indexes)) {\n store.createIndex(indexName, keyPath, { multiEntry });\n }\n }\n return store\n }\n\n createObjectStore(STORE_KEYVALUE);\n createObjectStore(STORE_EMOJI, /* keyPath */ FIELD_UNICODE, {\n [INDEX_TOKENS]: [FIELD_TOKENS, /* multiEntry */ true],\n [INDEX_GROUP_AND_ORDER]: [[FIELD_GROUP, FIELD_ORDER]],\n [INDEX_SKIN_UNICODE]: [FIELD_SKIN_UNICODE, /* multiEntry */ true]\n });\n createObjectStore(STORE_FAVORITES, undefined, {\n [INDEX_COUNT]: ['']\n });\n}\n\nconst openIndexedDBRequests = {};\nconst databaseCache = {};\nconst onCloseListeners = {};\n\nfunction handleOpenOrDeleteReq (resolve, reject, req) {\n // These things are almost impossible to test with fakeIndexedDB sadly\n /* istanbul ignore next */\n req.onerror = () => reject(req.error);\n /* istanbul ignore next */\n req.onblocked = () => reject(new Error('IDB blocked'));\n req.onsuccess = () => resolve(req.result);\n}\n\nasync function createDatabase (dbName) {\n const db = await new Promise((resolve, reject) => {\n const req = indexedDB.open(dbName, DB_VERSION_CURRENT);\n openIndexedDBRequests[dbName] = req;\n req.onupgradeneeded = e => {\n // Technically there is only one version, so we don't need this `if` check\n // But if an old version of the JS is in another browser tab\n // and it gets upgraded in the future and we have a new DB version, well...\n // better safe than sorry.\n /* istanbul ignore else */\n if (e.oldVersion < DB_VERSION_INITIAL) {\n initialMigration(req.result);\n }\n };\n handleOpenOrDeleteReq(resolve, reject, req);\n });\n // Handle abnormal closes, e.g. \"delete database\" in chrome dev tools.\n // No need for removeEventListener, because once the DB can no longer\n // fire \"close\" events, it will auto-GC.\n // Unfortunately cannot test in fakeIndexedDB: https://github.com/dumbmatter/fakeIndexedDB/issues/50\n /* istanbul ignore next */\n db.onclose = () => closeDatabase(dbName);\n return db\n}\n\nfunction openDatabase (dbName) {\n if (!databaseCache[dbName]) {\n databaseCache[dbName] = createDatabase(dbName);\n }\n return databaseCache[dbName]\n}\n\nfunction dbPromise (db, storeName, readOnlyOrReadWrite, cb) {\n return new Promise((resolve, reject) => {\n // Use relaxed durability because neither the emoji data nor the favorites/preferred skin tone\n // are really irreplaceable data. IndexedDB is just a cache in this case.\n const txn = db.transaction(storeName, readOnlyOrReadWrite, { durability: 'relaxed' });\n const store = typeof storeName === 'string'\n ? txn.objectStore(storeName)\n : storeName.map(name => txn.objectStore(name));\n let res;\n cb(store, txn, (result) => {\n res = result;\n });\n\n txn.oncomplete = () => resolve(res);\n /* istanbul ignore next */\n txn.onerror = () => reject(txn.error);\n })\n}\n\nfunction closeDatabase (dbName) {\n // close any open requests\n const req = openIndexedDBRequests[dbName];\n const db = req && req.result;\n if (db) {\n db.close();\n const listeners = onCloseListeners[dbName];\n /* istanbul ignore else */\n if (listeners) {\n for (const listener of listeners) {\n listener();\n }\n }\n }\n delete openIndexedDBRequests[dbName];\n delete databaseCache[dbName];\n delete onCloseListeners[dbName];\n}\n\nfunction deleteDatabase (dbName) {\n return new Promise((resolve, reject) => {\n // close any open requests\n closeDatabase(dbName);\n const req = indexedDB.deleteDatabase(dbName);\n handleOpenOrDeleteReq(resolve, reject, req);\n })\n}\n\n// The \"close\" event occurs during an abnormal shutdown, e.g. a user clearing their browser data.\n// However, it doesn't occur with the normal \"close\" event, so we handle that separately.\n// https://www.w3.org/TR/IndexedDB/#close-a-database-connection\nfunction addOnCloseListener (dbName, listener) {\n let listeners = onCloseListeners[dbName];\n if (!listeners) {\n listeners = onCloseListeners[dbName] = [];\n }\n listeners.push(listener);\n}\n\n// list of emoticons that don't match a simple \\W+ regex\n// extracted using:\n// require('emoji-picker-element-data/en/emojibase/data.json').map(_ => _.emoticon).filter(Boolean).filter(_ => !/^\\W+$/.test(_))\nconst irregularEmoticons = new Set([\n ':D', 'XD', \":'D\", 'O:)',\n ':X', ':P', ';P', 'XP',\n ':L', ':Z', ':j', '8D',\n 'XO', '8)', ':B', ':O',\n ':S', \":'o\", 'Dx', 'X(',\n 'D:', ':C', '>0)', ':3',\n ' {\n if (!word.match(/\\w/) || irregularEmoticons.has(word)) {\n // for pure emoticons like :) or :-), just leave them as-is\n return word.toLowerCase()\n }\n\n return word\n .replace(/[)(:,]/g, '')\n .replace(/’/g, \"'\")\n .toLowerCase()\n }).filter(Boolean)\n}\n\nconst MIN_SEARCH_TEXT_LENGTH = 2;\n\n// This is an extra step in addition to extractTokens(). The difference here is that we expect\n// the input to have already been run through extractTokens(). This is useful for cases like\n// emoticons, where we don't want to do any tokenization (because it makes no sense to split up\n// \">:)\" by the colon) but we do want to lowercase it to have consistent search results, so that\n// the user can type ':P' or ':p' and still get the same result.\nfunction normalizeTokens (str) {\n return str\n .filter(Boolean)\n .map(_ => _.toLowerCase())\n .filter(_ => _.length >= MIN_SEARCH_TEXT_LENGTH)\n}\n\n// Transform emoji data for storage in IDB\nfunction transformEmojiData (emojiData) {\n const res = emojiData.map(({ annotation, emoticon, group, order, shortcodes, skins, tags, emoji, version }) => {\n const tokens = [...new Set(\n normalizeTokens([\n ...(shortcodes || []).map(extractTokens).flat(),\n ...(tags || []).map(extractTokens).flat(),\n ...extractTokens(annotation),\n emoticon\n ])\n )].sort();\n const res = {\n annotation,\n group,\n order,\n tags,\n tokens,\n unicode: emoji,\n version\n };\n if (emoticon) {\n res.emoticon = emoticon;\n }\n if (shortcodes) {\n res.shortcodes = shortcodes;\n }\n if (skins) {\n res.skinTones = [];\n res.skinUnicodes = [];\n res.skinVersions = [];\n for (const { tone, emoji, version } of skins) {\n res.skinTones.push(tone);\n res.skinUnicodes.push(emoji);\n res.skinVersions.push(version);\n }\n }\n return res\n });\n return res\n}\n\n// helper functions that help compress the code better\n\nfunction callStore (store, method, key, cb) {\n store[method](key).onsuccess = e => (cb && cb(e.target.result));\n}\n\nfunction getIDB (store, key, cb) {\n callStore(store, 'get', key, cb);\n}\n\nfunction getAllIDB (store, key, cb) {\n callStore(store, 'getAll', key, cb);\n}\n\nfunction commit (txn) {\n /* istanbul ignore else */\n if (txn.commit) {\n txn.commit();\n }\n}\n\n// like lodash's minBy\nfunction minBy (array, func) {\n let minItem = array[0];\n for (let i = 1; i < array.length; i++) {\n const item = array[i];\n if (func(minItem) > func(item)) {\n minItem = item;\n }\n }\n return minItem\n}\n\n// return an array of results representing all items that are found in each one of the arrays\n//\n\nfunction findCommonMembers (arrays, uniqByFunc) {\n const shortestArray = minBy(arrays, _ => _.length);\n const results = [];\n for (const item of shortestArray) {\n // if this item is included in every array in the intermediate results, add it to the final results\n if (!arrays.some(array => array.findIndex(_ => uniqByFunc(_) === uniqByFunc(item)) === -1)) {\n results.push(item);\n }\n }\n return results\n}\n\nasync function isEmpty (db) {\n return !(await get(db, STORE_KEYVALUE, KEY_URL))\n}\n\nasync function hasData (db, url, eTag) {\n const [oldETag, oldUrl] = await Promise.all([KEY_ETAG, KEY_URL]\n .map(key => get(db, STORE_KEYVALUE, key)));\n return (oldETag === eTag && oldUrl === url)\n}\n\nasync function doFullDatabaseScanForSingleResult (db, predicate) {\n // This batching algorithm is just a perf improvement over a basic\n // cursor. The BATCH_SIZE is an estimate of what would give the best\n // perf for doing a full DB scan (worst case).\n //\n // Mini-benchmark for determining the best batch size:\n //\n // PERF=1 pnpm build:rollup && pnpm test:adhoc\n //\n // (async () => {\n // performance.mark('start')\n // await $('emoji-picker').database.getEmojiByShortcode('doesnotexist')\n // performance.measure('total', 'start')\n // console.log(performance.getEntriesByName('total').slice(-1)[0].duration)\n // })()\n const BATCH_SIZE = 50; // Typically around 150ms for 6x slowdown in Chrome for above benchmark\n return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => {\n let lastKey;\n\n const processNextBatch = () => {\n emojiStore.getAll(lastKey && IDBKeyRange.lowerBound(lastKey, true), BATCH_SIZE).onsuccess = e => {\n const results = e.target.result;\n for (const result of results) {\n lastKey = result.unicode;\n if (predicate(result)) {\n return cb(result)\n }\n }\n if (results.length < BATCH_SIZE) {\n return cb()\n }\n processNextBatch();\n };\n };\n processNextBatch();\n })\n}\n\nasync function loadData (db, emojiData, url, eTag) {\n try {\n const transformedData = transformEmojiData(emojiData);\n await dbPromise(db, [STORE_EMOJI, STORE_KEYVALUE], MODE_READWRITE, ([emojiStore, metaStore], txn) => {\n let oldETag;\n let oldUrl;\n let todo = 0;\n\n function checkFetched () {\n if (++todo === 2) { // 2 requests made\n onFetched();\n }\n }\n\n function onFetched () {\n if (oldETag === eTag && oldUrl === url) {\n // check again within the transaction to guard against concurrency, e.g. multiple browser tabs\n return\n }\n // delete old data\n emojiStore.clear();\n // insert new data\n for (const data of transformedData) {\n emojiStore.put(data);\n }\n metaStore.put(eTag, KEY_ETAG);\n metaStore.put(url, KEY_URL);\n commit(txn);\n }\n\n getIDB(metaStore, KEY_ETAG, result => {\n oldETag = result;\n checkFetched();\n });\n\n getIDB(metaStore, KEY_URL, result => {\n oldUrl = result;\n checkFetched();\n });\n });\n } finally {\n }\n}\n\nasync function getEmojiByGroup (db, group) {\n return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => {\n const range = IDBKeyRange.bound([group, 0], [group + 1, 0], false, true);\n getAllIDB(emojiStore.index(INDEX_GROUP_AND_ORDER), range, cb);\n })\n}\n\nasync function getEmojiBySearchQuery (db, query) {\n const tokens = normalizeTokens(extractTokens(query));\n\n if (!tokens.length) {\n return []\n }\n\n return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => {\n // get all results that contain all tokens (i.e. an AND query)\n const intermediateResults = [];\n\n const checkDone = () => {\n if (intermediateResults.length === tokens.length) {\n onDone();\n }\n };\n\n const onDone = () => {\n const results = findCommonMembers(intermediateResults, _ => _.unicode);\n cb(results.sort((a, b) => a.order < b.order ? -1 : 1));\n };\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n const range = i === tokens.length - 1\n ? IDBKeyRange.bound(token, token + '\\uffff', false, true) // treat last token as a prefix search\n : IDBKeyRange.only(token); // treat all other tokens as an exact match\n getAllIDB(emojiStore.index(INDEX_TOKENS), range, result => {\n intermediateResults.push(result);\n checkDone();\n });\n }\n })\n}\n\n// This could have been implemented as an IDB index on shortcodes, but it seemed wasteful to do that\n// when we can already query by tokens and this will give us what we're looking for 99.9% of the time\nasync function getEmojiByShortcode (db, shortcode) {\n const emojis = await getEmojiBySearchQuery(db, shortcode);\n\n // In very rare cases (e.g. the shortcode \"v\" as in \"v for victory\"), we cannot search because\n // there are no usable tokens (too short in this case). In that case, we have to do an inefficient\n // full-database scan, which I believe is an acceptable tradeoff for not having to have an extra\n // index on shortcodes.\n\n if (!emojis.length) {\n const predicate = _ => ((_.shortcodes || []).includes(shortcode.toLowerCase()));\n return (await doFullDatabaseScanForSingleResult(db, predicate)) || null\n }\n\n return emojis.filter(_ => {\n const lowerShortcodes = (_.shortcodes || []).map(_ => _.toLowerCase());\n return lowerShortcodes.includes(shortcode.toLowerCase())\n })[0] || null\n}\n\nasync function getEmojiByUnicode (db, unicode) {\n return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => (\n getIDB(emojiStore, unicode, result => {\n if (result) {\n return cb(result)\n }\n getIDB(emojiStore.index(INDEX_SKIN_UNICODE), unicode, result => cb(result || null));\n })\n ))\n}\n\nfunction get (db, storeName, key) {\n return dbPromise(db, storeName, MODE_READONLY, (store, txn, cb) => (\n getIDB(store, key, cb)\n ))\n}\n\nfunction set (db, storeName, key, value) {\n return dbPromise(db, storeName, MODE_READWRITE, (store, txn) => {\n store.put(value, key);\n commit(txn);\n })\n}\n\nfunction incrementFavoriteEmojiCount (db, unicode) {\n return dbPromise(db, STORE_FAVORITES, MODE_READWRITE, (store, txn) => (\n getIDB(store, unicode, result => {\n store.put((result || 0) + 1, unicode);\n commit(txn);\n })\n ))\n}\n\nfunction getTopFavoriteEmoji (db, customEmojiIndex, limit) {\n if (limit === 0) {\n return []\n }\n return dbPromise(db, [STORE_FAVORITES, STORE_EMOJI], MODE_READONLY, ([favoritesStore, emojiStore], txn, cb) => {\n const results = [];\n favoritesStore.index(INDEX_COUNT).openCursor(undefined, 'prev').onsuccess = e => {\n const cursor = e.target.result;\n if (!cursor) { // no more results\n return cb(results)\n }\n\n function addResult (result) {\n results.push(result);\n if (results.length === limit) {\n return cb(results) // done, reached the limit\n }\n cursor.continue();\n }\n\n const unicodeOrName = cursor.primaryKey;\n const custom = customEmojiIndex.byName(unicodeOrName);\n if (custom) {\n return addResult(custom)\n }\n // This could be done in parallel (i.e. make the cursor and the get()s parallelized),\n // but my testing suggests it's not actually faster.\n getIDB(emojiStore, unicodeOrName, emoji => {\n if (emoji) {\n return addResult(emoji)\n }\n // emoji not found somehow, ignore (may happen if custom emoji change)\n cursor.continue();\n });\n };\n })\n}\n\n// trie data structure for prefix searches\n// loosely based on https://github.com/nolanlawson/substring-trie\n\nconst CODA_MARKER = ''; // marks the end of the string\n\nfunction trie (arr, itemToTokens) {\n const map = new Map();\n for (const item of arr) {\n const tokens = itemToTokens(item);\n for (const token of tokens) {\n let currentMap = map;\n for (let i = 0; i < token.length; i++) {\n const char = token.charAt(i);\n let nextMap = currentMap.get(char);\n if (!nextMap) {\n nextMap = new Map();\n currentMap.set(char, nextMap);\n }\n currentMap = nextMap;\n }\n let valuesAtCoda = currentMap.get(CODA_MARKER);\n if (!valuesAtCoda) {\n valuesAtCoda = [];\n currentMap.set(CODA_MARKER, valuesAtCoda);\n }\n valuesAtCoda.push(item);\n }\n }\n\n const search = (query, exact) => {\n let currentMap = map;\n for (let i = 0; i < query.length; i++) {\n const char = query.charAt(i);\n const nextMap = currentMap.get(char);\n if (nextMap) {\n currentMap = nextMap;\n } else {\n return []\n }\n }\n\n if (exact) {\n const results = currentMap.get(CODA_MARKER);\n return results || []\n }\n\n const results = [];\n // traverse\n const queue = [currentMap];\n while (queue.length) {\n const currentMap = queue.shift();\n const entriesSortedByKey = [...currentMap.entries()].sort((a, b) => a[0] < b[0] ? -1 : 1);\n for (const [key, value] of entriesSortedByKey) {\n if (key === CODA_MARKER) { // CODA_MARKER always comes first; it's the empty string\n results.push(...value);\n } else {\n queue.push(value);\n }\n }\n }\n return results\n };\n\n return search\n}\n\nconst requiredKeys$1 = [\n 'name',\n 'url'\n];\n\nfunction assertCustomEmojis (customEmojis) {\n const isArray = customEmojis && Array.isArray(customEmojis);\n const firstItemIsFaulty = isArray &&\n customEmojis.length &&\n (!customEmojis[0] || requiredKeys$1.some(key => !(key in customEmojis[0])));\n if (!isArray || firstItemIsFaulty) {\n throw new Error('Custom emojis are in the wrong format')\n }\n}\n\nfunction customEmojiIndex (customEmojis) {\n assertCustomEmojis(customEmojis);\n\n const sortByName = (a, b) => a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1;\n\n //\n // all()\n //\n const all = customEmojis.sort(sortByName);\n\n //\n // search()\n //\n const emojiToTokens = emoji => {\n const set = new Set();\n if (emoji.shortcodes) {\n for (const shortcode of emoji.shortcodes) {\n for (const token of extractTokens(shortcode)) {\n set.add(token);\n }\n }\n }\n return set\n };\n const searchTrie = trie(customEmojis, emojiToTokens);\n const searchByExactMatch = _ => searchTrie(_, true);\n const searchByPrefix = _ => searchTrie(_, false);\n\n // Search by query for custom emoji. Similar to how we do this in IDB, the last token\n // is treated as a prefix search, but every other one is treated as an exact match.\n // Then we AND the results together\n const search = query => {\n const tokens = extractTokens(query);\n const intermediateResults = tokens.map((token, i) => (\n (i < tokens.length - 1 ? searchByExactMatch : searchByPrefix)(token)\n ));\n return findCommonMembers(intermediateResults, _ => _.name).sort(sortByName)\n };\n\n //\n // byShortcode, byName\n //\n const shortcodeToEmoji = new Map();\n const nameToEmoji = new Map();\n for (const customEmoji of customEmojis) {\n nameToEmoji.set(customEmoji.name.toLowerCase(), customEmoji);\n for (const shortcode of (customEmoji.shortcodes || [])) {\n shortcodeToEmoji.set(shortcode.toLowerCase(), customEmoji);\n }\n }\n\n const byShortcode = shortcode => shortcodeToEmoji.get(shortcode.toLowerCase());\n const byName = name => nameToEmoji.get(name.toLowerCase());\n\n return {\n all,\n search,\n byShortcode,\n byName\n }\n}\n\nconst isFirefoxContentScript = typeof wrappedJSObject !== 'undefined';\n\n// remove some internal implementation details, i.e. the \"tokens\" array on the emoji object\n// essentially, convert the emoji from the version stored in IDB to the version used in-memory\nfunction cleanEmoji (emoji) {\n if (!emoji) {\n return emoji\n }\n // if inside a Firefox content script, need to clone the emoji object to prevent Firefox from complaining about\n // cross-origin object. See: https://github.com/nolanlawson/emoji-picker-element/issues/356\n /* istanbul ignore if */\n if (isFirefoxContentScript) {\n emoji = structuredClone(emoji);\n }\n delete emoji.tokens;\n if (emoji.skinTones) {\n const len = emoji.skinTones.length;\n emoji.skins = Array(len);\n for (let i = 0; i < len; i++) {\n emoji.skins[i] = {\n tone: emoji.skinTones[i],\n unicode: emoji.skinUnicodes[i],\n version: emoji.skinVersions[i]\n };\n }\n delete emoji.skinTones;\n delete emoji.skinUnicodes;\n delete emoji.skinVersions;\n }\n return emoji\n}\n\nfunction warnETag (eTag) {\n if (!eTag) {\n console.warn('emoji-picker-element is more efficient if the dataSource server exposes an ETag header.');\n }\n}\n\nconst requiredKeys = [\n 'annotation',\n 'emoji',\n 'group',\n 'order',\n 'version'\n];\n\nfunction assertEmojiData (emojiData) {\n if (!emojiData ||\n !Array.isArray(emojiData) ||\n !emojiData[0] ||\n (typeof emojiData[0] !== 'object') ||\n requiredKeys.some(key => (!(key in emojiData[0])))) {\n throw new Error('Emoji data is in the wrong format')\n }\n}\n\nfunction assertStatus (response, dataSource) {\n if (Math.floor(response.status / 100) !== 2) {\n throw new Error('Failed to fetch: ' + dataSource + ': ' + response.status)\n }\n}\n\nasync function getETag (dataSource) {\n const response = await fetch(dataSource, { method: 'HEAD' });\n assertStatus(response, dataSource);\n const eTag = response.headers.get('etag');\n warnETag(eTag);\n return eTag\n}\n\nasync function getETagAndData (dataSource) {\n const response = await fetch(dataSource);\n assertStatus(response, dataSource);\n const eTag = response.headers.get('etag');\n warnETag(eTag);\n const emojiData = await response.json();\n assertEmojiData(emojiData);\n return [eTag, emojiData]\n}\n\n// TODO: including these in blob-util.ts causes typedoc to generate docs for them,\n// even with --excludePrivate ¯\\_(ツ)_/¯\n/** @private */\n/**\n * Convert an `ArrayBuffer` to a binary string.\n *\n * Example:\n *\n * ```js\n * var myString = blobUtil.arrayBufferToBinaryString(arrayBuff)\n * ```\n *\n * @param buffer - array buffer\n * @returns binary string\n */\nfunction arrayBufferToBinaryString(buffer) {\n var binary = '';\n var bytes = new Uint8Array(buffer);\n var length = bytes.byteLength;\n var i = -1;\n while (++i < length) {\n binary += String.fromCharCode(bytes[i]);\n }\n return binary;\n}\n/**\n * Convert a binary string to an `ArrayBuffer`.\n *\n * ```js\n * var myBuffer = blobUtil.binaryStringToArrayBuffer(binaryString)\n * ```\n *\n * @param binary - binary string\n * @returns array buffer\n */\nfunction binaryStringToArrayBuffer(binary) {\n var length = binary.length;\n var buf = new ArrayBuffer(length);\n var arr = new Uint8Array(buf);\n var i = -1;\n while (++i < length) {\n arr[i] = binary.charCodeAt(i);\n }\n return buf;\n}\n\n// generate a checksum based on the stringified JSON\nasync function jsonChecksum (object) {\n const inString = JSON.stringify(object);\n let inBuffer = binaryStringToArrayBuffer(inString);\n\n // this does not need to be cryptographically secure, SHA-1 is fine\n const outBuffer = await crypto.subtle.digest('SHA-1', inBuffer);\n const outBinString = arrayBufferToBinaryString(outBuffer);\n const res = btoa(outBinString);\n return res\n}\n\nasync function checkForUpdates (db, dataSource) {\n // just do a simple HEAD request first to see if the eTags match\n let emojiData;\n let eTag = await getETag(dataSource);\n if (!eTag) { // work around lack of ETag/Access-Control-Expose-Headers\n const eTagAndData = await getETagAndData(dataSource);\n eTag = eTagAndData[0];\n emojiData = eTagAndData[1];\n if (!eTag) {\n eTag = await jsonChecksum(emojiData);\n }\n }\n if (await hasData(db, dataSource, eTag)) ; else {\n if (!emojiData) {\n const eTagAndData = await getETagAndData(dataSource);\n emojiData = eTagAndData[1];\n }\n await loadData(db, emojiData, dataSource, eTag);\n }\n}\n\nasync function loadDataForFirstTime (db, dataSource) {\n let [eTag, emojiData] = await getETagAndData(dataSource);\n if (!eTag) {\n // Handle lack of support for ETag or Access-Control-Expose-Headers\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers#Browser_compatibility\n eTag = await jsonChecksum(emojiData);\n }\n\n await loadData(db, emojiData, dataSource, eTag);\n}\n\nclass Database {\n constructor ({ dataSource = DEFAULT_DATA_SOURCE, locale = DEFAULT_LOCALE, customEmoji = [] } = {}) {\n this.dataSource = dataSource;\n this.locale = locale;\n this._dbName = `emoji-picker-element-${this.locale}`;\n this._db = undefined;\n this._lazyUpdate = undefined;\n this._custom = customEmojiIndex(customEmoji);\n\n this._clear = this._clear.bind(this);\n this._ready = this._init();\n }\n\n async _init () {\n const db = this._db = await openDatabase(this._dbName);\n\n addOnCloseListener(this._dbName, this._clear);\n const dataSource = this.dataSource;\n const empty = await isEmpty(db);\n\n if (empty) {\n await loadDataForFirstTime(db, dataSource);\n } else { // offline-first - do an update asynchronously\n this._lazyUpdate = checkForUpdates(db, dataSource);\n }\n }\n\n async ready () {\n const checkReady = async () => {\n if (!this._ready) {\n this._ready = this._init();\n }\n return this._ready\n };\n await checkReady();\n // There's a possibility of a race condition where the element gets added, removed, and then added again\n // with a particular timing, which would set the _db to undefined.\n // We *could* do a while loop here, but that seems excessive and could lead to an infinite loop.\n if (!this._db) {\n await checkReady();\n }\n }\n\n async getEmojiByGroup (group) {\n assertNumber(group);\n await this.ready();\n return uniqEmoji(await getEmojiByGroup(this._db, group)).map(cleanEmoji)\n }\n\n async getEmojiBySearchQuery (query) {\n assertNonEmptyString(query);\n await this.ready();\n const customs = this._custom.search(query);\n const natives = uniqEmoji(await getEmojiBySearchQuery(this._db, query)).map(cleanEmoji);\n return [\n ...customs,\n ...natives\n ]\n }\n\n async getEmojiByShortcode (shortcode) {\n assertNonEmptyString(shortcode);\n await this.ready();\n const custom = this._custom.byShortcode(shortcode);\n if (custom) {\n return custom\n }\n return cleanEmoji(await getEmojiByShortcode(this._db, shortcode))\n }\n\n async getEmojiByUnicodeOrName (unicodeOrName) {\n assertNonEmptyString(unicodeOrName);\n await this.ready();\n const custom = this._custom.byName(unicodeOrName);\n if (custom) {\n return custom\n }\n return cleanEmoji(await getEmojiByUnicode(this._db, unicodeOrName))\n }\n\n async getPreferredSkinTone () {\n await this.ready();\n return (await get(this._db, STORE_KEYVALUE, KEY_PREFERRED_SKINTONE)) || 0\n }\n\n async setPreferredSkinTone (skinTone) {\n assertNumber(skinTone);\n await this.ready();\n return set(this._db, STORE_KEYVALUE, KEY_PREFERRED_SKINTONE, skinTone)\n }\n\n async incrementFavoriteEmojiCount (unicodeOrName) {\n assertNonEmptyString(unicodeOrName);\n await this.ready();\n return incrementFavoriteEmojiCount(this._db, unicodeOrName)\n }\n\n async getTopFavoriteEmoji (limit) {\n assertNumber(limit);\n await this.ready();\n return (await getTopFavoriteEmoji(this._db, this._custom, limit)).map(cleanEmoji)\n }\n\n set customEmoji (customEmojis) {\n this._custom = customEmojiIndex(customEmojis);\n }\n\n get customEmoji () {\n return this._custom.all\n }\n\n async _shutdown () {\n await this.ready(); // reopen if we've already been closed/deleted\n try {\n await this._lazyUpdate; // allow any lazy updates to process before closing/deleting\n } catch (err) { /* ignore network errors (offline-first) */ }\n }\n\n // clear references to IDB, e.g. during a close event\n _clear () {\n // We don't need to call removeEventListener or remove the manual \"close\" listeners.\n // The memory leak tests prove this is unnecessary. It's because:\n // 1) IDBDatabases that can no longer fire \"close\" automatically have listeners GCed\n // 2) we clear the manual close listeners in databaseLifecycle.js.\n this._db = this._ready = this._lazyUpdate = undefined;\n }\n\n async close () {\n await this._shutdown();\n await closeDatabase(this._dbName);\n }\n\n async delete () {\n await this._shutdown();\n await deleteDatabase(this._dbName);\n }\n}\n\nexport { Database as default };\n","var browserSupportsTextareaTextNodes;\n/**\n * @param {HTMLElement} input\n * @return {boolean}\n */\n\nfunction canManipulateViaTextNodes(input) {\n if (input.nodeName !== \"TEXTAREA\") {\n return false;\n }\n\n if (typeof browserSupportsTextareaTextNodes === \"undefined\") {\n var textarea = document.createElement(\"textarea\");\n textarea.value = 1;\n browserSupportsTextareaTextNodes = !!textarea.firstChild;\n }\n\n return browserSupportsTextareaTextNodes;\n}\n/**\n * @param {HTMLTextAreaElement|HTMLInputElement} input\n * @param {string} text\n * @returns {void}\n */\n\n\nfunction index (input, text) {\n // Most of the used APIs only work with the field selected\n input.focus(); // IE 8-10\n\n if (document.selection) {\n var ieRange = document.selection.createRange();\n ieRange.text = text; // Move cursor after the inserted text\n\n ieRange.collapse(false\n /* to the end */\n );\n ieRange.select();\n return;\n } // Webkit + Edge\n\n\n var isSuccess = document.execCommand(\"insertText\", false, text);\n\n if (!isSuccess) {\n var start = input.selectionStart;\n var end = input.selectionEnd; // Firefox (non-standard method)\n\n if (typeof input.setRangeText === \"function\") {\n input.setRangeText(text);\n } else {\n // To make a change we just need a Range, not a Selection\n var range = document.createRange();\n var textNode = document.createTextNode(text);\n\n if (canManipulateViaTextNodes(input)) {\n var node = input.firstChild; // If textarea is empty, just insert the text\n\n if (!node) {\n input.appendChild(textNode);\n } else {\n // Otherwise we need to find a nodes for start and end\n var offset = 0;\n var startNode = null;\n var endNode = null;\n\n while (node && (startNode === null || endNode === null)) {\n var nodeLength = node.nodeValue.length; // if start of the selection falls into current node\n\n if (start >= offset && start <= offset + nodeLength) {\n range.setStart(startNode = node, start - offset);\n } // if end of the selection falls into current node\n\n\n if (end >= offset && end <= offset + nodeLength) {\n range.setEnd(endNode = node, end - offset);\n }\n\n offset += nodeLength;\n node = node.nextSibling;\n } // If there is some text selected, remove it as we should replace it\n\n\n if (start !== end) {\n range.deleteContents();\n }\n }\n } // If the node is a textarea and the range doesn't span outside the element\n //\n // Get the commonAncestorContainer of the selected range and test its type\n // If the node is of type `#text` it means that we're still working with text nodes within our textarea element\n // otherwise, if it's of type `#document` for example it means our selection spans outside the textarea.\n\n\n if (canManipulateViaTextNodes(input) && range.commonAncestorContainer.nodeName === \"#text\") {\n // Finally insert a new node. The browser will automatically split start and end nodes into two if necessary\n range.insertNode(textNode);\n } else {\n // If the node is not a textarea or the range spans outside a textarea the only way is to replace the whole value\n var value = input.value;\n input.value = value.slice(0, start) + text + value.slice(end);\n }\n } // Correct the cursor position to be at the end of the insertion\n\n\n input.setSelectionRange(start + text.length, start + text.length); // Notify any possible listeners of the change\n\n var e = document.createEvent(\"UIEvent\");\n e.initEvent(\"input\", true, false);\n input.dispatchEvent(e);\n }\n}\n\nexport default index;\n//# sourceMappingURL=index.esm.js.map\n","let browserSupportsTextareaTextNodes;\n\n/**\n * @param {HTMLElement} input\n * @return {boolean}\n */\nfunction canManipulateViaTextNodes(input) {\n if (input.nodeName !== \"TEXTAREA\") {\n return false;\n }\n if (typeof browserSupportsTextareaTextNodes === \"undefined\") {\n const textarea = document.createElement(\"textarea\");\n textarea.value = 1;\n browserSupportsTextareaTextNodes = !!textarea.firstChild;\n }\n return browserSupportsTextareaTextNodes;\n}\n\n/**\n * @param {HTMLTextAreaElement|HTMLInputElement} input\n * @param {string} text\n * @returns {void}\n */\nexport default function(input, text) {\n // Most of the used APIs only work with the field selected\n input.focus();\n\n // IE 8-10\n if (document.selection) {\n const ieRange = document.selection.createRange();\n ieRange.text = text;\n\n // Move cursor after the inserted text\n ieRange.collapse(false /* to the end */);\n ieRange.select();\n\n return;\n }\n\n // Webkit + Edge\n const isSuccess = document.execCommand(\"insertText\", false, text);\n if (!isSuccess) {\n const start = input.selectionStart;\n const end = input.selectionEnd;\n // Firefox (non-standard method)\n if (typeof input.setRangeText === \"function\") {\n input.setRangeText(text);\n } else {\n // To make a change we just need a Range, not a Selection\n const range = document.createRange();\n const textNode = document.createTextNode(text);\n\n if (canManipulateViaTextNodes(input)) {\n let node = input.firstChild;\n\n // If textarea is empty, just insert the text\n if (!node) {\n input.appendChild(textNode);\n } else {\n // Otherwise we need to find a nodes for start and end\n let offset = 0;\n let startNode = null;\n let endNode = null;\n\n while (node && (startNode === null || endNode === null)) {\n const nodeLength = node.nodeValue.length;\n\n // if start of the selection falls into current node\n if (start >= offset && start <= offset + nodeLength) {\n range.setStart((startNode = node), start - offset);\n }\n\n // if end of the selection falls into current node\n if (end >= offset && end <= offset + nodeLength) {\n range.setEnd((endNode = node), end - offset);\n }\n\n offset += nodeLength;\n node = node.nextSibling;\n }\n\n // If there is some text selected, remove it as we should replace it\n if (start !== end) {\n range.deleteContents();\n }\n }\n }\n\n // If the node is a textarea and the range doesn't span outside the element\n //\n // Get the commonAncestorContainer of the selected range and test its type\n // If the node is of type `#text` it means that we're still working with text nodes within our textarea element\n // otherwise, if it's of type `#document` for example it means our selection spans outside the textarea.\n if (\n canManipulateViaTextNodes(input) &&\n range.commonAncestorContainer.nodeName === \"#text\"\n ) {\n // Finally insert a new node. The browser will automatically split start and end nodes into two if necessary\n range.insertNode(textNode);\n } else {\n // If the node is not a textarea or the range spans outside a textarea the only way is to replace the whole value\n const value = input.value;\n input.value = value.slice(0, start) + text + value.slice(end);\n }\n }\n\n // Correct the cursor position to be at the end of the insertion\n input.setSelectionRange(start + text.length, start + text.length);\n\n // Notify any possible listeners of the change\n const e = document.createEvent(\"UIEvent\");\n e.initEvent(\"input\", true, false);\n input.dispatchEvent(e);\n }\n}\n","/*!\n * @georapbox/capture-photo-element\n * A custom element that implements the MediaDevices.getUserMedia() method of the MediaDevices interface to capture a photo in the browser.\n *\n * @version 5.0.0\n * @homepage https://github.com/georapbox/capture-photo-element#readme\n * @author George Raptis \n * @license MIT\n */\nvar c=(r,t,e)=>(Number.isNaN(t)&&(t=0),Number.isNaN(e)&&(e=0),Math.min(Math.max(r,Math.min(t,e)),Math.max(t,e)));var a=\"capture-photo\",d=`\n :host { display: block; box-sizing: border-box; }\n :host *, :host *::before, :host *::after { box-sizing: inherit;}\n :host([hidden]), [hidden], ::slotted([hidden]) { display: none; }\n video { display: block; }\n #output:empty { display: none; }\n`,u=document.createElement(\"template\");u.innerHTML=`\n \n \n \n
\n \n \n \n \n
\n \n
\n`;var h=class r extends HTMLElement{#a={};#t=null;#n=null;#h=null;#e=null;#r=null;#i=null;constructor(){super(),this.#a=this.getSupportedConstraints(),this.shadowRoot||this.attachShadow({mode:\"open\"}).appendChild(u.content.cloneNode(!0))}static get observedAttributes(){return[\"no-image\",\"pan\",\"tilt\",\"zoom\",\"torch\"]}attributeChangedCallback(t,e,s){if(!this.isConnected)return;let i=this.getTrackCapabilities();if(t===\"no-image\"&&e!==s&&this.#u(),t===\"pan\"&&e!==s&&\"pan\"in this.#a){let o=\"pan\"in i&&i.pan?.min&&i.pan?.max?this.pan>=i.pan.min&&this.pan<=i.pan.max:!1;typeof this.pan==\"number\"&&o&&this.#o(\"pan\",this.pan)}if(t===\"tilt\"&&e!==s&&\"tilt\"in this.#a){let o=\"tilt\"in i&&i.tilt?.min&&i.tilt?.max?this.tilt>=i.tilt.min&&this.tilt<=i.tilt.max:!1;typeof this.tilt==\"number\"&&o&&this.#o(\"tilt\",this.tilt)}if(t===\"zoom\"&&e!==s&&\"zoom\"in this.#a){let o=\"zoom\"in i&&i.zoom?.min&&i.zoom?.max?this.zoom>=i.zoom.min&&this.zoom<=i.zoom.max:!1;typeof this.zoom==\"number\"&&o&&this.#o(\"zoom\",this.zoom)}t===\"torch\"&&e!==s&&\"torch\"in this.#a&&this.#o(\"torch\",this.torch)}async connectedCallback(){if(this.#s(\"autoPlay\"),this.#s(\"noImage\"),this.#s(\"facingMode\"),this.#s(\"cameraResolution\"),this.#s(\"pan\"),this.#s(\"tilt\"),this.#s(\"zoom\"),this.#s(\"torch\"),this.#s(\"calculateFileSize\"),this.#n=this.shadowRoot?.querySelector(\"canvas\")||null,this.#h=this.shadowRoot?.getElementById(\"output\")||null,this.#e=this.shadowRoot?.querySelector(\"video\")||null,this.#r=this.shadowRoot?.querySelector('slot[name=\"capture-button\"]')||null,this.#i=this.#m(),this.#e?.addEventListener(\"loadedmetadata\",this.#c),this.#r?.addEventListener(\"slotchange\",this.#d),this.#i?.addEventListener(\"click\",this.#l),!r.isSupported())return this.dispatchEvent(new CustomEvent(`${a}:error`,{bubbles:!0,composed:!0,detail:{error:{name:\"NotSupportedError\",message:\"Not supported\"}}}));this.autoPlay&&this.startVideoStream()}disconnectedCallback(){this.stopVideoStream(),this.#i?.removeEventListener(\"click\",this.#l),this.#e?.removeEventListener(\"loadedmetadata\",this.#c),this.#r?.removeEventListener(\"slotchange\",this.#d)}get autoPlay(){return this.hasAttribute(\"auto-play\")}set autoPlay(t){this.toggleAttribute(\"auto-play\",!!t)}get noImage(){return this.hasAttribute(\"no-image\")}set noImage(t){this.toggleAttribute(\"no-image\",!!t)}get facingMode(){let t=this.getAttribute(\"facing-mode\");return t!==\"user\"?\"environment\":t}set facingMode(t){this.setAttribute(\"facing-mode\",t)}get cameraResolution(){return this.getAttribute(\"camera-resolution\")||\"\"}set cameraResolution(t){this.setAttribute(\"camera-resolution\",t)}get pan(){return Number(this.getAttribute(\"pan\"))||0}set pan(t){this.setAttribute(\"pan\",t!=null?t.toString():t)}get tilt(){return Number(this.getAttribute(\"tilt\"))||0}set tilt(t){this.setAttribute(\"tilt\",t!=null?t.toString():t)}get zoom(){return Number(this.getAttribute(\"zoom\"))||1}set zoom(t){this.setAttribute(\"zoom\",t!=null?t.toString():t)}get torch(){return this.hasAttribute(\"torch\")}set torch(t){this.toggleAttribute(\"torch\",!!t)}get calculateFileSize(){return this.hasAttribute(\"calculate-file-size\")}set calculateFileSize(t){this.toggleAttribute(\"calculate-file-size\",!!t)}get loading(){return this.hasAttribute(\"loading\")}#l=t=>{t.preventDefault(),this.capture()};#c=t=>{let e=t.target;e.play().then(()=>{this.dispatchEvent(new CustomEvent(`${a}:video-play`,{bubbles:!0,composed:!0,detail:{video:e}}))}).catch(s=>{this.dispatchEvent(new CustomEvent(`${a}:error`,{bubbles:!0,composed:!0,detail:{error:s}}))}).finally(()=>{this.removeAttribute(\"loading\")})};#u(){this.#h&&this.#h.replaceChildren()}#o(t,e){if(!this.#t)return;let[s]=this.#t.getVideoTracks(),i=this.getTrackCapabilities(),o=this.getTrackSettings(),n=t===\"pan\"||t===\"tilt\"||t===\"zoom\"?c(Number(e),i[t]?.min||1,i[t]?.max||1):e;t in o&&s.applyConstraints({advanced:[{[t]:n}]}).catch(()=>{})}#d=t=>{t.target?.name===\"capture-button\"&&(this.#i?.removeEventListener(\"click\",this.#l),this.#i=this.#m(),this.#i&&(this.#i.addEventListener(\"click\",this.#l),this.#i.nodeName!==\"BUTTON\"&&!this.#i.hasAttribute(\"role\")&&this.#i.setAttribute(\"role\",\"button\")))};#m(){return this.#r&&this.#r.assignedElements({flatten:!0}).find(t=>t.nodeName===\"BUTTON\"||t.getAttribute(\"slot\")===\"capture-button\")||null}#s(t){let e=this;if(Object.prototype.hasOwnProperty.call(e,t)){let s=e[t];delete e[t],e[t]=s}}async startVideoStream(t){if(!r.isSupported()||this.#t)return;this.setAttribute(\"loading\",\"\");let e={video:{facingMode:{ideal:this.facingMode},pan:!0,tilt:!0,zoom:!0,torch:this.torch},audio:!1};if(typeof t==\"string\"&&t.trim().length>0&&(e.video.deviceId={exact:t}),typeof this.cameraResolution==\"string\"&&this.cameraResolution.trim().length>0){let[s=0,i=0]=this.cameraResolution.split(\"x\").map(o=>Number(o));s>0&&i>0&&(e.video.width=s,e.video.height=i)}try{this.#t=await navigator.mediaDevices.getUserMedia(e),this.#e&&(this.#e.srcObject=this.#t),this.#o(\"pan\",this.pan),this.#o(\"tilt\",this.tilt),this.#o(\"zoom\",this.zoom)}catch(s){this.dispatchEvent(new CustomEvent(`${a}:error`,{bubbles:!0,composed:!0,detail:{error:s}}))}finally{this.removeAttribute(\"loading\")}}restartVideoStream(t){this.#t&&this.#e&&this.stopVideoStream(),this.startVideoStream(t)}stopVideoStream(){if(!this.#e||!this.#t)return;let[t]=this.#t.getVideoTracks();t?.stop(),this.#e.srcObject=null,this.#t=null}async capture(){if(!(this.loading||!this.#n||!this.#e))try{let t=this.#n.getContext(\"2d\"),e=this.#e.videoWidth,s=this.#e.videoHeight;this.#n.width=e,this.#n.height=s,t?.drawImage(this.#e,0,0,e,s);let i=this.#n.toDataURL(\"image/png\");if(typeof i==\"string\"&&i.includes(\"data:image\")){if(!this.noImage){let n=new Image;n.src=i,n.width=e,n.height=s,n.alt=\"Captured photo\",n.setAttribute(\"part\",\"output-image\"),this.#u(),this.#h?.appendChild(n)}let o={dataURI:i,width:e,height:s};if(this.calculateFileSize)try{let l=(await(await fetch(i)).blob()).size;l&&(o.size=l)}catch{}this.dispatchEvent(new CustomEvent(`${a}:success`,{bubbles:!0,composed:!0,detail:o}))}}catch(t){this.dispatchEvent(new CustomEvent(`${a}:error`,{bubbles:!0,composed:!0,detail:{error:t}}))}}getSupportedConstraints(){return r.isSupported()?navigator.mediaDevices.getSupportedConstraints()||{}:{}}getTrackCapabilities(){if(!this.#t)return{};let[t]=this.#t.getVideoTracks();return t&&typeof t.getCapabilities==\"function\"?t.getCapabilities()||{}:{}}getTrackSettings(){if(!this.#t)return{};let[t]=this.#t.getVideoTracks();return t&&typeof t.getSettings==\"function\"?t.getSettings()||{}:{}}static async getVideoInputDevices(){return!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(await navigator.mediaDevices.enumerateDevices()||[]).filter(e=>e.kind===\"videoinput\"&&!!e.deviceId)}static isSupported(){return!!navigator.mediaDevices?.getUserMedia}static defineCustomElement(t=a){typeof window<\"u\"&&!window.customElements.get(t)&&window.customElements.define(t,r)}};h.defineCustomElement();export{h as CapturePhoto};\n//# sourceMappingURL=capture-photo-defined.js.map\n","// @ts-check\n\n/**\n * Clamps number within the inclusive `min` and `max` bounds,\n * making sure it does not go beyond them on either side.\n * If `min` is greater than `max` the parameters are swapped to support inverted ranges.\n *\n * @param {number} value - The number to clamp.\n * @param {number} lower - The lower bound.\n * @param {number} upper - The upper bound.\n * @throws {TypeError} - If one or more of the arguments passed is not a number.\n * @returns {number} - The clamped number.\n * @example\n *\n * clamp(10, -5, 5);\n * // => 5\n *\n * clamp(-10, -5, 5);\n * // => -5\n *\n * clamp(-15, 0, 100);\n * // => 0\n *\n * clamp(120, 0, 100);\n * // => 100\n *\n * clamp(-5, NaN, 5); // If any of lower or upper bound are `NaN`, they will be converted to `0`.\n * // => 0\n *\n * clamp(120, 100, 0); // The order of lower and upper bounds is reversed (100 > 0)\n * // => 100\n */\nexport const clamp = (value, lower, upper) => {\n if (Number.isNaN(lower)) {\n lower = 0;\n }\n\n if (Number.isNaN(upper)) {\n upper = 0;\n }\n\n return Math.min(Math.max(value, Math.min(lower, upper)), Math.max(lower, upper));\n};\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\n/**\n * @typedef {Object} ExtendedMediaTrackCapabilities\n * @property {ULongRange} [width] - The width of the video track.\n * @property {ULongRange} [height] - The height of the video track.\n * @property {ULongRange} [pan] - The pan level of the camera.\n * @property {ULongRange} [tilt] - The tilt level of the camera.\n * @property {ULongRange} [zoom] - The zoom level of the camera.\n * @property {MediaTrackCapabilities} [nativeMediaTrackCapabilities] - The native track capabilities.\n */\n\n/**\n * @typedef {Object} ExtendedMediaTrackConstraints\n * @property {MediaTrackConstraints & {pan: boolean, tilt: boolean, zoom: boolean, torch: boolean}} video - The video constraints.\n * @property {MediaTrackConstraints | boolean} audio - The audio constraints.\n */\n\nimport { clamp } from './utils/clamp.js';\n\nconst COMPONENT_NAME = 'capture-photo';\n\nconst styles = /* css */ `\n :host { display: block; box-sizing: border-box; }\n :host *, :host *::before, :host *::after { box-sizing: inherit;}\n :host([hidden]), [hidden], ::slotted([hidden]) { display: none; }\n video { display: block; }\n #output:empty { display: none; }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */ `\n \n \n \n
\n \n \n \n \n
\n \n
\n`;\n\n/**\n * @summary A custom element that implements the MediaDevices.getUserMedia() method of the MediaDevices interface to capture a photo in the browser.\n * @documentation https://github.com/georapbox/capture-photo-element\n *\n * @tagname capture-photo This is the default tag name, unless overridden by the `defineCustomElement` method.\n * @extends HTMLElement\n *\n * @property {boolean} autoPlay - Whether or not to start the video stream automatically.\n * @property {boolean} noImage - Whether or not to show the captured image.\n * @property {string} facingMode - The facing mode of the camera.\n * @property {string} cameraResolution - The resolution of the camera.\n * @property {number} pan - The pan value of the camera.\n * @property {number} tilt - The tilt value of the camera.\n * @property {number} zoom - The zoom value of the camera.\n * @property {boolean} torch - Whether or not the fill light is connected.\n * @property {boolean} calculateFileSize - Whether or not to calculate the file size of the captured image.\n * @property {boolean} loading - Whether or not the video stream is loading.\n *\n * @atttribute {boolean} auto-play - Reflects the autoPlay property.\n * @atttribute {boolean} no-image - Reflects the noImage property.\n * @atttribute {string} facing-mode - Reflects the facingMode property.\n * @atttribute {string} camera-resolution - Reflects the cameraResolution property.\n * @atttribute {number} pan - Reflects the pan property.\n * @atttribute {number} tilt - Reflects the tilt property.\n * @atttribute {number} zoom - Reflects the zoom property.\n * @atttribute {boolean} torch - Reflects the torch property.\n * @atttribute {boolean} calculate-file-size - Reflects the calculateFileSize property.\n * @atttribute {boolean} loading - Reflects the loading property.\n *\n * @slot capture-button - The capture button.\n * @slot capture-button-content - The capture button content.\n * @slot actions - The actions container.\n * @slot - A default un-named slot to add content inside the component.\n *\n * @csspart video - The video element.\n * @csspart actions-container - The actions container.\n * @csspart capture-button - The capture button.\n * @csspart output-container - The output container.\n * @csspart output-image - The output image.\n *\n * @event capture-photo:video-play - Fires when the video stream is successfully playing.\n * @event capture-photo:success - Fires when the photo is successfully captured.\n * @event capture-photo:error - Fires when an error occurs.\n *\n * @method defineCustomElement - Static method. Defines the custom element with the given name.\n * @method isSupported - Static method. Checks if the MediaDevices.getUserMedia() method is supported.\n * @method getVideoInputDevices - Static method. Gets the available video devices.\n * @method startVideoStream - Instance method. Starts the video stream.\n * @method restartVideoStream - Instance method. Restarts the video stream.\n * @method stopVideoStream - Instance method. Stops the video stream.\n * @method capture - Instance method. Captures a photo.\n * @method getSupportedConstraints - Instance method. Gets the supported constraints.\n * @method getTrackCapabilities - Instance method. Gets the track capabilities.\n * @method getTrackSettings - Instance method. Gets the track settings.\n */\nclass CapturePhoto extends HTMLElement {\n /** @type {MediaTrackSupportedConstraints | {}}*/\n #supportedConstraints = {};\n\n /** @type {Nullable} */\n #stream = null;\n\n /** @type {Nullable} */\n #canvasElement = null;\n\n /** @type {Nullable} */\n #outputElement = null;\n\n /** @type {Nullable} */\n #videoElement = null;\n\n /** @type {Nullable} */\n #captureButtonSlot = null;\n\n /** @type {Nullable} */\n #captureButton = null;\n\n constructor() {\n super();\n\n this.#supportedConstraints = this.getSupportedConstraints();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n }\n\n static get observedAttributes() {\n return ['no-image', 'pan', 'tilt', 'zoom', 'torch'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (!this.isConnected) {\n return;\n }\n\n /** @type {ExtendedMediaTrackCapabilities} */\n const trackCapabilities = this.getTrackCapabilities();\n\n if (name === 'no-image' && oldValue !== newValue) {\n this.#emptyOutputElement();\n }\n\n if (name === 'pan' && oldValue !== newValue && 'pan' in this.#supportedConstraints) {\n const panInAllowedRange =\n 'pan' in trackCapabilities && trackCapabilities.pan?.min && trackCapabilities.pan?.max\n ? this.pan >= trackCapabilities.pan.min && this.pan <= trackCapabilities.pan.max\n : false;\n\n if (typeof this.pan === 'number' && panInAllowedRange) {\n this.#applyConstraint('pan', this.pan);\n }\n }\n\n if (name === 'tilt' && oldValue !== newValue && 'tilt' in this.#supportedConstraints) {\n const tiltInAllowedRange =\n 'tilt' in trackCapabilities && trackCapabilities.tilt?.min && trackCapabilities.tilt?.max\n ? this.tilt >= trackCapabilities.tilt.min && this.tilt <= trackCapabilities.tilt.max\n : false;\n\n if (typeof this.tilt === 'number' && tiltInAllowedRange) {\n this.#applyConstraint('tilt', this.tilt);\n }\n }\n\n if (name === 'zoom' && oldValue !== newValue && 'zoom' in this.#supportedConstraints) {\n const zoomInAllowedRange =\n 'zoom' in trackCapabilities && trackCapabilities.zoom?.min && trackCapabilities.zoom?.max\n ? this.zoom >= trackCapabilities.zoom.min && this.zoom <= trackCapabilities.zoom.max\n : false;\n\n if (typeof this.zoom === 'number' && zoomInAllowedRange) {\n this.#applyConstraint('zoom', this.zoom);\n }\n }\n\n if (name === 'torch' && oldValue !== newValue && 'torch' in this.#supportedConstraints) {\n this.#applyConstraint('torch', this.torch);\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n async connectedCallback() {\n this.#upgradeProperty('autoPlay');\n this.#upgradeProperty('noImage');\n this.#upgradeProperty('facingMode');\n this.#upgradeProperty('cameraResolution');\n this.#upgradeProperty('pan');\n this.#upgradeProperty('tilt');\n this.#upgradeProperty('zoom');\n this.#upgradeProperty('torch');\n this.#upgradeProperty('calculateFileSize');\n\n this.#canvasElement = this.shadowRoot?.querySelector('canvas') || null;\n this.#outputElement = this.shadowRoot?.getElementById('output') || null;\n this.#videoElement = this.shadowRoot?.querySelector('video') || null;\n this.#captureButtonSlot = this.shadowRoot?.querySelector('slot[name=\"capture-button\"]') || null;\n this.#captureButton = this.#getCaptureButton();\n\n this.#videoElement?.addEventListener('loadedmetadata', this.#onVideoLoadedMetaData);\n this.#captureButtonSlot?.addEventListener('slotchange', this.#onCaptureButtonSlotChange);\n this.#captureButton?.addEventListener('click', this.#onCapturePhotoButtonClick);\n\n if (!CapturePhoto.isSupported()) {\n return this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: {\n name: 'NotSupportedError',\n message: 'Not supported'\n }\n }\n })\n );\n }\n\n if (this.autoPlay) {\n this.startVideoStream();\n }\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.stopVideoStream();\n this.#captureButton?.removeEventListener('click', this.#onCapturePhotoButtonClick);\n this.#videoElement?.removeEventListener('loadedmetadata', this.#onVideoLoadedMetaData);\n this.#captureButtonSlot?.removeEventListener('slotchange', this.#onCaptureButtonSlotChange);\n }\n\n /**\n * @type {boolean} autoPlay - Whether or not to start the video stream automatically.\n * @attribute auto-play - Reflects the autoPlay property.\n */\n get autoPlay() {\n return this.hasAttribute('auto-play');\n }\n\n set autoPlay(value) {\n this.toggleAttribute('auto-play', !!value);\n }\n\n /**\n * @type {boolean} noImage - Whether or not to show the captured image.\n * @attribute no-image - Reflects the noImage property.\n */\n get noImage() {\n return this.hasAttribute('no-image');\n }\n\n set noImage(value) {\n this.toggleAttribute('no-image', !!value);\n }\n\n /**\n * @type {string} facingMode - The facing mode of the camera.\n * @attribute facing-mode - Reflects the facingMode property.\n */\n get facingMode() {\n const value = this.getAttribute('facing-mode');\n\n if (value !== 'user') {\n return 'environment';\n }\n\n return value;\n }\n\n set facingMode(value) {\n this.setAttribute('facing-mode', value);\n }\n\n /**\n * @type {string} cameraResolution - The resolution of the camera.\n * @attribute camera-resolution - Reflects the cameraResolution property.\n */\n get cameraResolution() {\n return this.getAttribute('camera-resolution') || '';\n }\n\n set cameraResolution(value) {\n this.setAttribute('camera-resolution', value);\n }\n\n /**\n * @type {number} pan - The pan value of the camera.\n * @attribute pan - Reflects the pan property.\n */\n get pan() {\n return Number(this.getAttribute('pan')) || 0;\n }\n\n set pan(value) {\n this.setAttribute('pan', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} tilt - The tilt value of the camera.\n * @attribute tilt - Reflects the tilt property.\n */\n get tilt() {\n return Number(this.getAttribute('tilt')) || 0;\n }\n\n set tilt(value) {\n this.setAttribute('tilt', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} zoom - The zoom value of the camera.\n * @attribute zoom - Reflects the zoom property.\n */\n get zoom() {\n return Number(this.getAttribute('zoom')) || 1;\n }\n\n set zoom(value) {\n this.setAttribute('zoom', value != null ? value.toString() : value);\n }\n\n /**\n * @type {boolean} torch - Whether or not the fill light is connected.\n * @attribute torch - Reflects the torch property.\n */\n get torch() {\n return this.hasAttribute('torch');\n }\n\n set torch(value) {\n this.toggleAttribute('torch', !!value);\n }\n\n /**\n * @type {boolean} calculateFileSize - Whether or not to calculate the file size of the captured image.\n * @attribute calculate-file-size - Reflects the calculateFileSize property.\n */\n get calculateFileSize() {\n return this.hasAttribute('calculate-file-size');\n }\n\n set calculateFileSize(value) {\n this.toggleAttribute('calculate-file-size', !!value);\n }\n\n /**\n * @type {boolean} loading - Whether or not the video stream is loading.\n * @attribute loading - Reflects the loading property.\n */\n get loading() {\n return this.hasAttribute('loading');\n }\n\n /**\n * Handles the click event of the capture button.\n *\n * @param {*} evt - The click event.\n */\n #onCapturePhotoButtonClick = evt => {\n evt.preventDefault();\n this.capture();\n };\n\n /**\n * Handles the loadedmetadata event of the video element.\n *\n * @param {*} evt - The loadedmetadata event.\n */\n #onVideoLoadedMetaData = evt => {\n const video = evt.target;\n\n video\n .play()\n .then(() => {\n this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}:video-play`, {\n bubbles: true,\n composed: true,\n detail: { video }\n })\n );\n })\n .catch(\n /** @param {Error} error */ error => {\n this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n })\n );\n }\n )\n .finally(() => {\n this.removeAttribute('loading');\n });\n };\n\n /**\n * Removes all child nodes from the output element.\n */\n #emptyOutputElement() {\n if (!this.#outputElement) {\n return;\n }\n\n this.#outputElement.replaceChildren();\n }\n\n /**\n * Applies a constraint to the video track.\n *\n * @param {string} constraint - The name of the constraint.\n * @param {any} value - The value of the constraint.\n */\n #applyConstraint(constraint, value) {\n if (!this.#stream) {\n return;\n }\n\n const [track] = this.#stream.getVideoTracks();\n /** @type {ExtendedMediaTrackCapabilities} */\n const trackCapabilities = this.getTrackCapabilities();\n const trackSettings = this.getTrackSettings();\n\n const constraintValue =\n constraint === 'pan' || constraint === 'tilt' || constraint === 'zoom'\n ? clamp(Number(value), trackCapabilities[constraint]?.min || 1, trackCapabilities[constraint]?.max || 1)\n : value;\n\n if (constraint in trackSettings) {\n track\n .applyConstraints({\n advanced: [{ [constraint]: constraintValue }]\n })\n .catch(() => {\n // Fail silently...\n });\n }\n }\n\n /**\n * Handles the slotchange event of the capture button slot.\n *\n * @param {*} evt - The slotchange event.\n */\n #onCaptureButtonSlotChange = evt => {\n if (evt.target?.name === 'capture-button') {\n this.#captureButton?.removeEventListener('click', this.#onCapturePhotoButtonClick);\n this.#captureButton = this.#getCaptureButton();\n\n if (this.#captureButton) {\n this.#captureButton.addEventListener('click', this.#onCapturePhotoButtonClick);\n\n if (this.#captureButton.nodeName !== 'BUTTON' && !this.#captureButton.hasAttribute('role')) {\n this.#captureButton.setAttribute('role', 'button');\n }\n }\n }\n };\n\n /**\n * Returns the capture button.\n *\n * @returns {Nullable}\n */\n #getCaptureButton() {\n if (!this.#captureButtonSlot) {\n return null;\n }\n\n return (\n this.#captureButtonSlot.assignedElements({ flatten: true }).find(el => {\n return el.nodeName === 'BUTTON' || el.getAttribute('slot') === 'capture-button';\n }) || null\n );\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and\n * set a value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would\n * miss that property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'autoPlay' | 'noImage' | 'facingMode' | 'cameraResolution' | 'pan' | 'tilt' | 'zoom' | 'calculateFileSize' | 'torch'} prop\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Starts the video stream.\n *\n * @param {string} [videoInputId] - The video input device ID.\n * @returns Promise\n */\n async startVideoStream(videoInputId) {\n if (!CapturePhoto.isSupported() || this.#stream) {\n return;\n }\n\n this.setAttribute('loading', '');\n\n /** @type {ExtendedMediaTrackConstraints} */\n const constraints = {\n video: {\n facingMode: {\n ideal: this.facingMode\n },\n pan: true,\n tilt: true,\n zoom: true,\n torch: this.torch\n },\n audio: false\n };\n\n if (typeof videoInputId === 'string' && videoInputId.trim().length > 0) {\n constraints.video.deviceId = { exact: videoInputId };\n }\n\n if (typeof this.cameraResolution === 'string' && this.cameraResolution.trim().length > 0) {\n const [width = 0, height = 0] = this.cameraResolution.split('x').map(x => Number(x));\n\n if (width > 0 && height > 0) {\n constraints.video.width = width;\n constraints.video.height = height;\n }\n }\n\n try {\n this.#stream = await navigator.mediaDevices.getUserMedia(constraints);\n\n if (this.#videoElement) {\n this.#videoElement.srcObject = this.#stream;\n }\n\n this.#applyConstraint('pan', this.pan);\n this.#applyConstraint('tilt', this.tilt);\n this.#applyConstraint('zoom', this.zoom);\n } catch (error) {\n this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n })\n );\n } finally {\n this.removeAttribute('loading');\n }\n }\n\n /**\n * Restarts the video stream.\n *\n * @param {string} [videoInputId] - The video input device ID.\n */\n restartVideoStream(videoInputId) {\n if (this.#stream && this.#videoElement) {\n this.stopVideoStream();\n }\n\n this.startVideoStream(videoInputId);\n }\n\n /**\n * Stops the video stream.\n */\n stopVideoStream() {\n if (!this.#videoElement || !this.#stream) {\n return;\n }\n\n const [track] = this.#stream.getVideoTracks();\n\n track?.stop();\n this.#videoElement.srcObject = null;\n this.#stream = null;\n }\n\n /**\n * Captures a photo using the element's properties.\n *\n * @returns Promise\n */\n async capture() {\n if (this.loading || !this.#canvasElement || !this.#videoElement) {\n return;\n }\n\n try {\n const ctx = this.#canvasElement.getContext('2d');\n const width = this.#videoElement.videoWidth;\n const height = this.#videoElement.videoHeight;\n this.#canvasElement.width = width;\n this.#canvasElement.height = height;\n ctx?.drawImage(this.#videoElement, 0, 0, width, height);\n const dataURI = this.#canvasElement.toDataURL('image/png');\n\n if (typeof dataURI === 'string' && dataURI.includes('data:image')) {\n if (!this.noImage) {\n const image = new Image();\n image.src = dataURI;\n image.width = width;\n image.height = height;\n image.alt = 'Captured photo';\n image.setAttribute('part', 'output-image');\n this.#emptyOutputElement();\n this.#outputElement?.appendChild(image);\n }\n\n /** @type {{ dataURI: string, width: number, height: number, size?: number }} */\n const eventDetail = { dataURI, width, height };\n\n if (this.calculateFileSize) {\n try {\n const file = await fetch(dataURI);\n const blob = await file.blob();\n const size = blob.size;\n\n if (size) {\n eventDetail.size = size;\n }\n } catch {\n // Fail silently...\n }\n }\n\n this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}:success`, {\n bubbles: true,\n composed: true,\n detail: eventDetail\n })\n );\n }\n } catch (error) {\n this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n })\n );\n }\n }\n\n /**\n * Returns an object based on the `MediaTrackSupportedConstraints` dictionary,\n * whose member fields each specify one ofthe constrainable properties the user agent understands.\n *\n * @see https://developer.mozilla.org/docs/Web/API/MediaDevices/getSupportedConstraints\n * @returns {MediaTrackSupportedConstraints | {}}\n */\n getSupportedConstraints() {\n if (!CapturePhoto.isSupported()) {\n return {};\n }\n\n return navigator.mediaDevices.getSupportedConstraints() || {};\n }\n\n /**\n * Returns a `MediaTrackCapabilities` object which specifies the values or range of values\n * which each constrainable property, based upon the platform and user agent.\n *\n * @see https://developer.mozilla.org/docs/Web/API/MediaStreamTrack/getCapabilities\n * @returns {MediaTrackCapabilities | {}}\n */\n getTrackCapabilities() {\n if (!this.#stream) {\n return {};\n }\n\n const [track] = this.#stream.getVideoTracks();\n\n if (track && typeof track.getCapabilities === 'function') {\n return track.getCapabilities() || {};\n }\n\n return {};\n }\n\n /**\n * Returns a `MediaTrackSettings` object containing the current values of each of\n * the constrainable properties for the current MediaStreamTrack.\n *\n * @see https://developer.mozilla.org/docs/Web/API/MediaStreamTrack/getSettings\n * @returns {MediaTrackSettings | {}}\n */\n getTrackSettings() {\n if (!this.#stream) {\n return {};\n }\n\n const [track] = this.#stream.getVideoTracks();\n\n if (track && typeof track.getSettings === 'function') {\n return track.getSettings() || {};\n }\n\n return {};\n }\n\n /**\n * Returns the available video input devices.\n *\n * @returns {Promise}\n */\n static async getVideoInputDevices() {\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n return [];\n }\n\n const devices = (await navigator.mediaDevices.enumerateDevices()) || [];\n return devices.filter(device => device.kind === 'videoinput' && !!device.deviceId);\n }\n\n /**\n * Checks if the `MediaDevices.getUserMedia()` method is supported.\n *\n * @returns {boolean}\n */\n static isSupported() {\n return Boolean(navigator.mediaDevices?.getUserMedia);\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='capture-photo'] - The name of the custom element.\n * @example\n *\n * CapturePhoto.defineCustomElement('my-capture-photo');\n */\n static defineCustomElement(elementName = COMPONENT_NAME) {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, CapturePhoto);\n }\n }\n}\n\nexport { CapturePhoto };\n","import { CapturePhoto } from './capture-photo.js';\n\nCapturePhoto.defineCustomElement();\n\nexport { CapturePhoto };\n","/*!\n * @georapbox/web-share-element\n * A custom element that implements the Web Share API to share user-defined data.\n *\n * @version 3.1.1\n * @homepage https://github.com/georapbox/web-share-element#readme\n * @author George Raptis \n * @license MIT\n */\nfunction r(a){return a!==null&&typeof a==\"object\"?\"share\"in navigator&&\"canShare\"in navigator&&navigator.canShare(a):\"share\"in navigator}export{r as isWebShareSupported};\n//# sourceMappingURL=is-web-share-supported.js.map\n","// @ts-check\n\n/**\n * Check if Web Share API is supported by the platform.\n *\n * @param {import('./web-share').ShareData} [options]\n * @returns {boolean} Returns `true` if Web Share API is supported; otherwise `false`.\n */\nfunction isWebShareSupported(options) {\n if (options !== null && typeof options === 'object') {\n return 'share' in navigator && 'canShare' in navigator && navigator.canShare(options);\n }\n\n return 'share' in navigator;\n}\n\nexport { isWebShareSupported };\n","/*!\n * @georapbox/web-share-element\n * A custom element that implements the Web Share API to share user-defined data.\n *\n * @version 3.1.1\n * @homepage https://github.com/georapbox/web-share-element#readme\n * @author George Raptis \n * @license MIT\n */\nvar h=`\n :host {\n display: inline-block;\n }\n`,r=document.createElement(\"template\");r.innerHTML=`\n \n \n`;var s=class a extends HTMLElement{#e;#t;#r=[];constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\",delegatesFocus:!0}).appendChild(r.content.cloneNode(!0)),this.#e=this.shadowRoot?.querySelector('slot[name=\"button\"]')||null,this.#t=this.#h()}static get observedAttributes(){return[\"disabled\"]}attributeChangedCallback(t,e,i){t===\"disabled\"&&e!==i&&this.#t&&(this.#t.toggleAttribute(\"disabled\",this.disabled),this.#t.setAttribute(\"aria-disabled\",this.disabled.toString()),this.#t.part&&this.#t.part.contains(\"button\")&&this.#t.part.toggle(\"button--disabled\",this.disabled))}connectedCallback(){this.#s(\"shareUrl\"),this.#s(\"shareTitle\"),this.#s(\"shareText\"),this.#s(\"shareFiles\"),this.#s(\"disabled\"),this.#e?.addEventListener(\"slotchange\",this.#a),this.#t?.addEventListener(\"click\",this.#i)}disconnectedCallback(){this.#e?.removeEventListener(\"slotchange\",this.#a),this.#t?.removeEventListener(\"click\",this.#i)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){this.toggleAttribute(\"disabled\",!!t)}get shareUrl(){return this.getAttribute(\"share-url\")||\"\"}set shareUrl(t){this.setAttribute(\"share-url\",t)}get shareTitle(){return this.getAttribute(\"share-title\")||\"\"}set shareTitle(t){this.setAttribute(\"share-title\",t)}get shareText(){return this.getAttribute(\"share-text\")||\"\"}set shareText(t){this.setAttribute(\"share-text\",t)}get shareFiles(){return this.#r}set shareFiles(t){Array.isArray(t)&&t.length>0&&(this.#r=t)}async share(){if(!this.disabled)try{let t={};this.shareUrl&&(t.url=this.shareUrl),this.shareTitle&&(t.title=this.shareTitle),this.shareText&&(t.text=this.shareText),Array.isArray(this.shareFiles)&&this.shareFiles.length>0&&navigator.canShare&&navigator.canShare({files:this.shareFiles})&&(t.files=this.shareFiles),await navigator.share(t),this.dispatchEvent(new CustomEvent(\"web-share:success\",{bubbles:!0,composed:!0,detail:{shareData:t}}))}catch(t){if(t instanceof Error&&t.name===\"AbortError\"){this.dispatchEvent(new CustomEvent(\"web-share:abort\",{bubbles:!0,composed:!0,detail:{error:t}}));return}this.dispatchEvent(new CustomEvent(\"web-share:error\",{bubbles:!0,composed:!0,detail:{error:t}}))}}#i=t=>{t.preventDefault(),!this.disabled&&this.share()};#a=t=>{t.target&&t.target.name===\"button\"&&(this.#t?.removeEventListener(\"click\",this.#i),this.#t=this.#h(),this.#t&&(this.#t.addEventListener(\"click\",this.#i),this.#t.nodeName!==\"BUTTON\"&&!this.#t.hasAttribute(\"role\")&&this.#t.setAttribute(\"role\",\"button\")))};#h(){return this.#e&&this.#e.assignedElements({flatten:!0}).find(t=>t.nodeName===\"BUTTON\"||t.getAttribute(\"slot\")===\"button\")||null}#s(t){let e=this;if(Object.prototype.hasOwnProperty.call(e,t)){let i=e[t];delete e[t],e[t]=i}}static defineCustomElement(t=\"web-share\"){typeof window<\"u\"&&!window.customElements.get(t)&&window.customElements.define(t,a)}};s.defineCustomElement();export{s as WebShare};\n//# sourceMappingURL=web-share-defined.js.map\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\n/**\n * Represents the data to share.\n *\n * @typedef {Object} ShareData\n * @property {string} [url] - The URL to share.\n * @property {string} [title] - The title to share.\n * @property {string} [text] - The text to share.\n * @property {File[]} [files] - The files to share.\n */\n\nconst styles = /* css */ `\n :host {\n display: inline-block;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */ `\n \n \n`;\n\n/**\n * @summary A custom element that provides a button to share content.\n * @documentation https://github.com/georapbox/web-share-element#readme\n *\n * @tagname web-share - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {boolean} disabled - Indicates whether the button is disabled.\n * @property {string} shareUrl - The URL to share.\n * @property {string} shareTitle - The title to share.\n * @property {string} shareText - The text to share.\n * @property {File[]} shareFiles - The files to share.\n *\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {string} share-url - Reflects the shareUrl property.\n * @attribute {string} share-title - Reflects the shareTitle property.\n * @attribute {string} share-text - Reflects the shareText property.\n *\n * @slot button - The button to share content.\n * @slot button-content - The content of the button to share content.\n *\n * @csspart button - The button to share content.\n * @csspart button--disabled - The button to share content when disabled.\n *\n * @event web-share:success - Fired when the share operation is successful.\n * @event web-share:abort - Fired when the share operation is aborted.\n * @event web-share:error - Fired when the share operation fails.\n *\n * @method defineCustomElement - Static method. Defines the custom element with the given name.\n * @method share - Instance method. Shares the shareable data taken from the element's properties.\n */\nclass WebShare extends HTMLElement {\n /** @type {Nullable} */\n #buttonSlot;\n\n /** @type {Nullable} */\n #buttonEl;\n\n /** @type {File[]} */\n #files = [];\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#buttonSlot = this.shadowRoot?.querySelector('slot[name=\"button\"]') || null;\n this.#buttonEl = this.#getButton();\n }\n\n static get observedAttributes() {\n return ['disabled'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'disabled' && oldValue !== newValue && this.#buttonEl) {\n this.#buttonEl.toggleAttribute('disabled', this.disabled);\n this.#buttonEl.setAttribute('aria-disabled', this.disabled.toString());\n\n if (this.#buttonEl.part && this.#buttonEl.part.contains('button')) {\n this.#buttonEl.part.toggle('button--disabled', this.disabled);\n }\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('shareUrl');\n this.#upgradeProperty('shareTitle');\n this.#upgradeProperty('shareText');\n this.#upgradeProperty('shareFiles');\n this.#upgradeProperty('disabled');\n\n this.#buttonSlot?.addEventListener('slotchange', this.#handleSlotChange);\n this.#buttonEl?.addEventListener('click', this.#handleClick);\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#buttonSlot?.removeEventListener('slotchange', this.#handleSlotChange);\n this.#buttonEl?.removeEventListener('click', this.#handleClick);\n }\n\n /**\n * @type {boolean} - Indicates whether the button is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value) {\n this.toggleAttribute('disabled', !!value);\n }\n\n /**\n * @type {string} - The URL to share.\n * @attribute share-url - Reflects the shareUrl property.\n */\n get shareUrl() {\n return this.getAttribute('share-url') || '';\n }\n\n set shareUrl(value) {\n this.setAttribute('share-url', value);\n }\n\n /**\n * @type {string} - The title to share.\n * @attribute share-title - Reflects the shareTitle property.\n */\n get shareTitle() {\n return this.getAttribute('share-title') || '';\n }\n\n set shareTitle(value) {\n this.setAttribute('share-title', value);\n }\n\n /**\n * @type {string} - The text to share.\n * @attribute share-text - Reflects the shareText property.\n */\n get shareText() {\n return this.getAttribute('share-text') || '';\n }\n\n set shareText(value) {\n this.setAttribute('share-text', value);\n }\n\n /**\n * @type {File[]} - The files to share.\n */\n get shareFiles() {\n return this.#files;\n }\n\n set shareFiles(value) {\n if (Array.isArray(value) && value.length > 0) {\n this.#files = value;\n }\n }\n\n /**\n * Shares the shareable data taken from the element's properties.\n *\n * @returns {Promise} - A promise that resolves when the share operation is complete.\n */\n async share() {\n if (this.disabled) {\n return;\n }\n\n try {\n /** @type {ShareData} */\n const shareData = {};\n\n if (this.shareUrl) {\n shareData.url = this.shareUrl;\n }\n\n if (this.shareTitle) {\n shareData.title = this.shareTitle;\n }\n\n if (this.shareText) {\n shareData.text = this.shareText;\n }\n\n if (\n Array.isArray(this.shareFiles) &&\n this.shareFiles.length > 0 &&\n navigator.canShare &&\n navigator.canShare({ files: this.shareFiles })\n ) {\n shareData.files = this.shareFiles;\n }\n\n await navigator.share(shareData);\n\n this.dispatchEvent(\n new CustomEvent('web-share:success', {\n bubbles: true,\n composed: true,\n detail: { shareData }\n })\n );\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n this.dispatchEvent(\n new CustomEvent('web-share:abort', {\n bubbles: true,\n composed: true,\n detail: { error }\n })\n );\n\n return;\n }\n\n this.dispatchEvent(\n new CustomEvent('web-share:error', {\n bubbles: true,\n composed: true,\n detail: { error }\n })\n );\n }\n }\n\n /**\n * Handles the click event on the button.\n *\n * @param {any} evt - The event object.\n */\n #handleClick = evt => {\n evt.preventDefault();\n\n if (this.disabled) {\n return;\n }\n\n this.share();\n };\n\n /**\n * Handles the slotchange event on the button slot.\n *\n * @param {any} evt - The event object.\n */\n #handleSlotChange = evt => {\n if (evt.target && evt.target.name === 'button') {\n this.#buttonEl?.removeEventListener('click', this.#handleClick);\n this.#buttonEl = this.#getButton();\n\n if (this.#buttonEl) {\n this.#buttonEl.addEventListener('click', this.#handleClick);\n\n if (this.#buttonEl.nodeName !== 'BUTTON' && !this.#buttonEl.hasAttribute('role')) {\n this.#buttonEl.setAttribute('role', 'button');\n }\n }\n }\n };\n\n /**\n * Returns the button element from the button slot.\n *\n * @returns {Nullable} - The button element.\n */\n #getButton() {\n if (!this.#buttonSlot) {\n return null;\n }\n\n return (\n this.#buttonSlot.assignedElements({ flatten: true }).find(el => {\n return el.nodeName === 'BUTTON' || el.getAttribute('slot') === 'button';\n }) || null\n );\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'shareUrl' | 'shareTitle' | 'shareText' | 'shareFiles' | 'disabled'} prop - The property name to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='web-share'] - The name of the custom element.\n * @example\n *\n * ClipboardCopy.defineCustomElement('my-web-share');\n */\n static defineCustomElement(elementName = 'web-share') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, WebShare);\n }\n }\n}\n\nexport { WebShare };\n","import { WebShare } from './web-share.js';\n\nWebShare.defineCustomElement();\n\nexport { WebShare };\n","/*!\n * @georapbox/modal-element\n * A custom element to create a modal, using the native dialog element under the hood.\n *\n * @version 1.8.0\n * @homepage https://github.com/georapbox/modal-element#readme\n * @author George Raptis \n * @license MIT\n */\nvar n=document.createElement(\"template\"),r=`\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-color: canvastext;\n\n --me-header-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-header-color: initial;\n\n --me-body-spacing: 1rem;\n --me-body-background-color: transparent;\n --me-body-color: initial;\n --me-footer-background-color: transparent;\n --me-footer-color: initial;\n\n --me-close-padding: 0.4375rem;\n --me-close-border: none;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-close-color: inherit;\n --me-close-font-size: 1rem;\n\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n --dialog-placement-margin: calc((2em + 6px) / 2);\n\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n color: var(--me-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n /* Dialog placement */\n :host(:not([fullscreen])[placement=\"top-start\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-center\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-end\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center-start\"]) .dialog {\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center\"]) .dialog {\n margin: auto;\n }\n\n :host(:not([fullscreen])[placement=\"center-end\"]) .dialog {\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-start\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-center\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-end\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n /* Dialog animations */\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: 300ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n color: var(--me-header-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n color: var(--me-body-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: end;\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n color: var(--me-footer-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: var(--me-close-padding);\n border: var(--me-close-border);\n border-radius: var(--me-close-border-radius);\n background-color: var(--me-close-background-color);\n color: var(--me-close-color);\n font-size: var(--me-close-font-size);\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;n.innerHTML=`\n \n\n \n
\n
\n \n\n
\n \n
\n
\n\n \n\n
\n \n
\n
\n
\n`;var a=class s extends HTMLElement{#e=null;#i=null;#a=null;#o=void 0;constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\"}).appendChild(n.content.cloneNode(!0)),this.shadowRoot&&(this.#e=this.shadowRoot.querySelector(\"dialog\"),this.#i=this.shadowRoot.querySelector('slot[name=\"footer\"]'),this.#a=this.shadowRoot.querySelector('slot[name=\"close\"]'))}static get observedAttributes(){return[\"open\",\"no-header\",\"no-animations\",\"no-close-button\",\"close-label\"]}attributeChangedCallback(e,t,i){if(this.#e!==null){if(e===\"open\"&&t!==i&&(this.open?(this.#e.showModal(),this.dispatchEvent(new CustomEvent(\"me-open\",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow=\"hidden\")):this.#e.close()),e===\"no-header\"&&t!==i){let o=this.#e.querySelector(\".dialog__header\");o!==null&&(o.hidden=this.noHeader)}if(e===\"no-animations\"&&t!==i&&this.#e.classList.toggle(\"dialog--no-animations\",this.noAnimations),e===\"no-close-button\"&&t!==i){let o=this.#e.querySelector(\".dialog__close\");o!==null&&(o.hidden=this.noCloseButton)}e===\"close-label\"&&t!==i&&this.#r()}}connectedCallback(){this.#t(\"open\"),this.#t(\"staticBackdrop\"),this.#t(\"noHeader\"),this.#t(\"noAnimations\"),this.#t(\"noCloseButton\"),this.#t(\"fullscreen\"),this.#t(\"preserveOverflow\"),this.#t(\"placement\"),this.#t(\"closeLabel\"),this.#e?.addEventListener(\"click\",this.#h),this.#e?.addEventListener(\"close\",this.#l),this.#e?.addEventListener(\"cancel\",this.#d),this.#e?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\",this.#c),this.#i?.addEventListener(\"slotchange\",this.#m),this.#a?.addEventListener(\"slotchange\",this.#g)}disconnectedCallback(){this.#o&&clearTimeout(this.#o),this.#e?.addEventListener(\"click\",this.#h),this.#e?.removeEventListener(\"close\",this.#l),this.#e?.removeEventListener(\"cancel\",this.#d),this.#e?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\",this.#c),this.#i?.removeEventListener(\"slotchange\",this.#m),this.#a?.removeEventListener(\"slotchange\",this.#g)}get open(){return this.hasAttribute(\"open\")}set open(e){this.toggleAttribute(\"open\",!!e)}get staticBackdrop(){return this.hasAttribute(\"static-backdrop\")}set staticBackdrop(e){this.toggleAttribute(\"static-backdrop\",!!e)}get noHeader(){return this.hasAttribute(\"no-header\")}set noHeader(e){this.toggleAttribute(\"no-header\",!!e)}get noAnimations(){return this.hasAttribute(\"no-animations\")}set noAnimations(e){this.toggleAttribute(\"no-animations\",!!e)}get noCloseButton(){return this.hasAttribute(\"no-close-button\")}set noCloseButton(e){this.toggleAttribute(\"no-close-button\",!!e)}get fullscreen(){return this.hasAttribute(\"fullscreen\")}set fullscreen(e){this.toggleAttribute(\"fullscreen\",!!e)}get preserveOverflow(){return this.hasAttribute(\"preserve-overflow\")}set preserveOverflow(e){this.toggleAttribute(\"preserve-overflow\",!!e)}get placement(){return this.getAttribute(\"placement\")||\"center\"}set placement(e){this.setAttribute(\"placement\",e!=null?e.toString():e)}get closeLabel(){return this.getAttribute(\"close-label\")||\"Close\"}set closeLabel(e){this.setAttribute(\"close-label\",e!=null?e.toString():e)}#r(){if(this.#e===null)return;let e=this.#e.querySelector(\".dialog__close\");if(e===null)return;(this.#a?.assignedElements()||[])?.some(o=>o.textContent?.replace(/\\s/g,\"\")!==\"\")?e.removeAttribute(\"aria-label\"):e.setAttribute(\"aria-label\",this.closeLabel)}#n(){this.#o||(this.#e?.classList.add(\"dialog--pulse\"),this.#o=setTimeout(()=>{this.#e?.classList.remove(\"dialog--pulse\"),clearTimeout(this.#o),this.#o=void 0},300))}#l=()=>{this.open=!1,this.dispatchEvent(new CustomEvent(\"me-close\",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow=\"\")};#d=e=>{let t=this.#s(\"escape-key\");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),!this.noAnimations&&this.#n())};#c=e=>{let t=this.#s(\"close-button\");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),!this.noAnimations&&this.#n())};#h=e=>{let t=e.target,i=e.currentTarget;if(t===i){let o=this.#s(\"backdrop-click\");this.dispatchEvent(o),o.defaultPrevented||this.staticBackdrop?!this.noAnimations&&this.#n():this.hide()}if(t instanceof HTMLElement&&t.closest(\"[data-me-close]\")!==null){let o=this.#s(\"external-invoker\");this.dispatchEvent(o),o.defaultPrevented?!this.noAnimations&&this.#n():this.hide()}};#m=()=>{if(this.#e===null)return;let e=this.#e.querySelector(\".dialog__footer\");if(e===null)return;let t=this.#i?.assignedNodes(),i=t?t.length>0:!1;e.hidden=!i};#g=()=>{this.#r()};#s(e){return new CustomEvent(\"me-request-close\",{bubbles:!0,composed:!0,cancelable:!0,detail:{reason:e,element:this}})}#t(e){let t=this;if(Object.prototype.hasOwnProperty.call(t,e)){let i=t[e];delete t[e],t[e]=i}}show(){this.open||(this.open=!0)}hide(){this.open&&(this.open=!1)}static defineCustomElement(e=\"modal-element\"){typeof window<\"u\"&&!window.customElements.get(e)&&window.customElements.define(e,s)}};a.defineCustomElement();export{a as ModalElement};\n//# sourceMappingURL=modal-element-defined.js.map\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\n/**\n * Available values for the request close reason.\n *\n * @typedef {'close-button' | 'escape-key' | 'backdrop-click' | 'external-invoker'} CloseRequestReason\n */\n\nconst PULSE_ANIMATION_DURATION = 300; // milliseconds\nconst template = document.createElement('template');\n\nconst styles = /* css */ `\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-color: canvastext;\n\n --me-header-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-header-color: initial;\n\n --me-body-spacing: 1rem;\n --me-body-background-color: transparent;\n --me-body-color: initial;\n --me-footer-background-color: transparent;\n --me-footer-color: initial;\n\n --me-close-padding: 0.4375rem;\n --me-close-border: none;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-close-color: inherit;\n --me-close-font-size: 1rem;\n\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n --dialog-placement-margin: calc((2em + 6px) / 2);\n\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n color: var(--me-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n /* Dialog placement */\n :host(:not([fullscreen])[placement=\"top-start\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-center\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-end\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center-start\"]) .dialog {\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center\"]) .dialog {\n margin: auto;\n }\n\n :host(:not([fullscreen])[placement=\"center-end\"]) .dialog {\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-start\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-center\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-end\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n /* Dialog animations */\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: ${PULSE_ANIMATION_DURATION}ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n color: var(--me-header-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n color: var(--me-body-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: end;\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n color: var(--me-footer-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: var(--me-close-padding);\n border: var(--me-close-border);\n border-radius: var(--me-close-border-radius);\n background-color: var(--me-close-background-color);\n color: var(--me-close-color);\n font-size: var(--me-close-font-size);\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n\ntemplate.innerHTML = /* html */ `\n \n\n \n
\n
\n \n\n
\n \n
\n
\n\n \n\n
\n \n
\n
\n
\n`;\n\n/**\n * @summary A custom element that renders a modal dialog.\n * @documentation https://github.com/georapbox/modal-element\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines whether the modal is open or not.\n * @property {boolean} staticBackdrop - Determines whether the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines whether the modal should have a header or not.\n * @property {boolean} noAnimations - Determines whether the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines whether the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines whether the modal should be fullscreen or not.\n * @property {boolean} preserveOverflow - Determines whether the overflow of the body should be preserved when the modal is open.\n * @property {string} placement - Determines the placement of the modal.\n * @property {string} closeLabel - The label of the default close button, used as the aria-label attribute of the close button.\n *\n * @attribute {boolean} open - Reflects the open property.\n * @attribute {boolean} static-backdrop - Reflects the staticBackdrop property.\n * @attribute {boolean} no-header - Reflects the noHeader property.\n * @attribute {boolean} no-animations - Reflects the noAnimations property.\n * @attribute {boolean} no-close-button - Reflects the noCloseButton property.\n * @attribute {boolean} fullscreen - Reflects the fullscreen property.\n * @attribute {boolean} preserve-overflow - Reflects the preserveOverflow property.\n * @attribute {string} placement - Reflects the placement property.\n * @attribute {string} close-label - Reflects the closeLabel property.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal.\n * @cssproperty --me-height - The height of the modal.\n * @cssproperty --me-border-color - The border color of the modal.\n * @cssproperty --me-border-style - The border style of the modal.\n * @cssproperty --me-border-width - The border width of the modal.\n * @cssproperty --me-border-radius - The border radius of the modal.\n * @cssproperty --me-box-shadow - The box shadow of the modal.\n * @cssproperty --me-background-color - The background color of the modal.\n * @cssproperty --me-color - The foreground color of the modal.\n * @cssproperty --me-header-spacing - The spacing of the header.\n * @cssproperty --me-header-background-color - The background color of the header.\n * @cssproperty --me-header-color - The foreground color of the header.\n * @cssproperty --me-body-spacing - The spacing of the body.\n * @cssproperty --me-body-background-color - The background color of the body.\n * @cssproperty --me-body-color - The foreground color of the body.\n * @cssproperty --me-footer-spacing - The spacing of the footer.\n * @cssproperty --me-footer-background-color - The background color of the footer.\n * @cssproperty --me-footer-color - The foreground color of the footer.\n * @cssproperty --me-close-padding - The padding of the close button.\n * @cssproperty --me-close-border - The border shorthand property of the close button.\n * @cssproperty --me-close-border-radius - The border radius shorthand property of the close button.\n * @cssproperty --me-close-background-color - The background color of the close button.\n * @cssproperty --me-close-color - The foreground color of the close button.\n * @cssproperty --me-close-font-size - The font size of the close button.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop.\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart close - The default close button rendered in the modal's header.\n * @csspart close-icon - The close icon of the default close button.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n */\nclass ModalElement extends HTMLElement {\n /** @type {Nullable} */\n #dialogEl = null;\n\n /** @type {Nullable} */\n #footerSlotEl = null;\n\n /** @type {Nullable} */\n #closeSlotEl = null;\n\n /** @type {ReturnType | undefined} */\n #pulseAnimationTimeout = void 0;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n if (this.shadowRoot) {\n this.#dialogEl = this.shadowRoot.querySelector('dialog');\n this.#footerSlotEl = this.shadowRoot.querySelector('slot[name=\"footer\"]');\n this.#closeSlotEl = this.shadowRoot.querySelector('slot[name=\"close\"]');\n }\n }\n\n static get observedAttributes() {\n return ['open', 'no-header', 'no-animations', 'no-close-button', 'close-label'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (this.#dialogEl === null) {\n return;\n }\n\n if (name === 'open' && oldValue !== newValue) {\n if (this.open) {\n this.#dialogEl.showModal();\n\n this.dispatchEvent(\n new CustomEvent('me-open', {\n bubbles: true,\n composed: true,\n detail: { element: this }\n })\n );\n\n if (document.body && !this.preserveOverflow) {\n document.body.style.overflow = 'hidden';\n }\n } else {\n this.#dialogEl.close();\n }\n }\n\n if (name === 'no-header' && oldValue !== newValue) {\n /** @type {Nullable} */\n const headerEl = this.#dialogEl.querySelector('.dialog__header');\n\n if (headerEl !== null) {\n headerEl.hidden = this.noHeader;\n }\n }\n\n if (name === 'no-animations' && oldValue !== newValue) {\n this.#dialogEl.classList.toggle('dialog--no-animations', this.noAnimations);\n }\n\n if (name === 'no-close-button' && oldValue !== newValue) {\n /** @type {Nullable} */\n const closeBtnEl = this.#dialogEl.querySelector('.dialog__close');\n\n if (closeBtnEl !== null) {\n closeBtnEl.hidden = this.noCloseButton;\n }\n }\n\n if (name === 'close-label' && oldValue !== newValue) {\n this.#updateCloseLabel();\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('open');\n this.#upgradeProperty('staticBackdrop');\n this.#upgradeProperty('noHeader');\n this.#upgradeProperty('noAnimations');\n this.#upgradeProperty('noCloseButton');\n this.#upgradeProperty('fullscreen');\n this.#upgradeProperty('preserveOverflow');\n this.#upgradeProperty('placement');\n this.#upgradeProperty('closeLabel');\n\n this.#dialogEl?.addEventListener('click', this.#handleDialogClick);\n this.#dialogEl?.addEventListener('close', this.#handleDialogClose);\n this.#dialogEl?.addEventListener('cancel', this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.addEventListener('submit', this.#handleCloseButtonClick);\n this.#footerSlotEl?.addEventListener('slotchange', this.#handleFooterSlotChange);\n this.#closeSlotEl?.addEventListener('slotchange', this.#handleCloseSlotChange);\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#pulseAnimationTimeout && clearTimeout(this.#pulseAnimationTimeout);\n this.#dialogEl?.addEventListener('click', this.#handleDialogClick);\n this.#dialogEl?.removeEventListener('close', this.#handleDialogClose);\n this.#dialogEl?.removeEventListener('cancel', this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.removeEventListener('submit', this.#handleCloseButtonClick);\n this.#footerSlotEl?.removeEventListener('slotchange', this.#handleFooterSlotChange);\n this.#closeSlotEl?.removeEventListener('slotchange', this.#handleCloseSlotChange);\n }\n\n /**\n * Deternimes if the modal is open or not.\n *\n * @type {boolean} - True if the modal is open, otherwise false.\n * @default false\n * @attribute open - Reflects the open property.\n */\n get open() {\n return this.hasAttribute('open');\n }\n\n set open(value) {\n this.toggleAttribute('open', !!value);\n }\n\n /**\n * Determines whether the modal should close when the backdrop is clicked.\n *\n * @type {boolean} - True if the modal should close when the backdrop is clicked, otherwise false.\n * @default false\n * @attribute static-backdrop - Reflects the staticBackdrop property.\n */\n get staticBackdrop() {\n return this.hasAttribute('static-backdrop');\n }\n\n set staticBackdrop(value) {\n this.toggleAttribute('static-backdrop', !!value);\n }\n\n /**\n * Determines whether the modal should have a header or not.\n *\n * @type {boolean} - True if the modal should have a header, otherwise false.\n * @default false\n * @attribute no-header - Reflects the noHeader property.\n */\n get noHeader() {\n return this.hasAttribute('no-header');\n }\n\n set noHeader(value) {\n this.toggleAttribute('no-header', !!value);\n }\n\n /**\n * Determines whether the modal should have animations or not when opening and closing.\n *\n * @type {boolean} - True if the modal should have animations, otherwise false.\n * @default false\n * @attribute no-animations - Reflects the noAnimations property.\n */\n get noAnimations() {\n return this.hasAttribute('no-animations');\n }\n\n set noAnimations(value) {\n this.toggleAttribute('no-animations', !!value);\n }\n\n /**\n * Determines whether the modal should have a default close button or not.\n *\n * @type {boolean} - True if the modal should have a close button, otherwise false.\n * @default false\n * @attribute no-close-button - Reflects the noCloseButton property.\n */\n get noCloseButton() {\n return this.hasAttribute('no-close-button');\n }\n\n set noCloseButton(value) {\n this.toggleAttribute('no-close-button', !!value);\n }\n\n /**\n * Determines whether the modal should be fullscreen or not.\n *\n * @type {boolean} - True if the modal should be fullscreen, otherwise false.\n * @default false\n * @attribute fullscreen - Reflects the fullscreen property.\n */\n get fullscreen() {\n return this.hasAttribute('fullscreen');\n }\n\n set fullscreen(value) {\n this.toggleAttribute('fullscreen', !!value);\n }\n\n /**\n * Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @type {boolean} - True if the overflow of the body should be preserved, otherwise false.\n * @default false\n * @attribute preserve-overflow - Reflects the preserveOverflow property.\n */\n get preserveOverflow() {\n return this.hasAttribute('preserve-overflow');\n }\n\n set preserveOverflow(value) {\n this.toggleAttribute('preserve-overflow', !!value);\n }\n\n /**\n * Determines the placement of the modal.\n * Possible values are 'top-start', 'top-center', 'top-end', 'center-start', 'center', 'center-end', 'bottom-start', 'bottom-center', 'bottom-end'.\n *\n * @type {string}\n * @default 'center'\n * @attribute placement - Reflects the placement property.\n */\n get placement() {\n return this.getAttribute('placement') || 'center';\n }\n\n set placement(value) {\n this.setAttribute('placement', value != null ? value.toString() : value);\n }\n\n /**\n * The label of the default close button, used as the aria-label attribute of the close button.\n * If user provides text content for the close button using the `close` slot, this property is ignored and the aria-label attribute is removed.\n *\n * @type {string}\n * @default 'Close'\n * @attribute close-label - Reflects the closeLabel property.\n */\n get closeLabel() {\n return this.getAttribute('close-label') || 'Close';\n }\n\n set closeLabel(value) {\n this.setAttribute('close-label', value != null ? value.toString() : value);\n }\n\n /**\n * Updates the aria-label attribute of the close button.\n * If the slot for the close button has text content, the aria-label attribute is removed to allow the text content to be used as the label.\n * Otherwise, the aria-label attribute is set to the `closeLabel` property.\n *\n * @returns\n */\n #updateCloseLabel() {\n if (this.#dialogEl === null) {\n return;\n }\n\n const closeButtonEl = this.#dialogEl.querySelector('.dialog__close');\n\n if (closeButtonEl === null) {\n return;\n }\n\n const assignedElements = this.#closeSlotEl?.assignedElements() || [];\n const hasTextContent = assignedElements?.some(el => el.textContent?.replace(/\\s/g, '') !== '');\n\n hasTextContent\n ? closeButtonEl.removeAttribute('aria-label')\n : closeButtonEl.setAttribute('aria-label', this.closeLabel);\n }\n\n /**\n * Applies a pulse effect on the dialog.\n */\n #applyPulseEffectOnDialog() {\n if (this.#pulseAnimationTimeout) {\n return;\n }\n\n this.#dialogEl?.classList.add('dialog--pulse');\n\n this.#pulseAnimationTimeout = setTimeout(() => {\n this.#dialogEl?.classList.remove('dialog--pulse');\n clearTimeout(this.#pulseAnimationTimeout);\n this.#pulseAnimationTimeout = void 0;\n }, PULSE_ANIMATION_DURATION);\n }\n\n /**\n * Handles the close event of the dialog.\n */\n #handleDialogClose = () => {\n // This is required because the dialog element does not reset\n // the open property when the dialog is closed by the user.\n this.open = false;\n\n this.dispatchEvent(\n new CustomEvent('me-close', {\n bubbles: true,\n composed: true,\n detail: { element: this }\n })\n );\n\n if (document.body && !this.preserveOverflow) {\n document.body.style.overflow = '';\n }\n };\n\n /**\n * Handles the cancel event of the dialog.\n * This event is fired when the user presses the escape key.\n *\n * @param {Event} evt - The cancel event.\n */\n #handleDialogCancel = evt => {\n const requestCloseEvent = this.#createRequestCloseEvent('escape-key');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n\n /**\n * Handles the click event of the close button.\n *\n * @param {Event} evt - The click event.\n */\n #handleCloseButtonClick = evt => {\n const requestCloseEvent = this.#createRequestCloseEvent('close-button');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n\n /**\n * Handles the click event of the dialog.\n *\n * @param {MouseEvent} evt - The click event.\n */\n #handleDialogClick = evt => {\n const target = evt.target;\n const currentTarget = evt.currentTarget;\n\n // Close the dialog when the backdrop is clicked.\n if (target === currentTarget) {\n const requestCloseEvent = this.#createRequestCloseEvent('backdrop-click');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented || this.staticBackdrop) {\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n } else {\n this.hide();\n }\n }\n\n // Close the dialog when external invoker is clicked.\n if (target instanceof HTMLElement && target.closest('[data-me-close]') !== null) {\n const requestCloseEvent = this.#createRequestCloseEvent('external-invoker');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented) {\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n } else {\n this.hide();\n }\n }\n };\n\n /**\n * Handles the slotchange event of the footer slot.\n */\n #handleFooterSlotChange = () => {\n if (this.#dialogEl === null) {\n return;\n }\n\n /** @type {Nullable} */\n const footerEl = this.#dialogEl.querySelector('.dialog__footer');\n\n if (footerEl === null) {\n return;\n }\n\n const footerSlotNodes = this.#footerSlotEl?.assignedNodes();\n const hasFooterSlotNodes = footerSlotNodes ? footerSlotNodes.length > 0 : false;\n\n footerEl.hidden = !hasFooterSlotNodes;\n };\n\n /**\n * Handles the slotchange event of the close slot.\n */\n #handleCloseSlotChange = () => {\n this.#updateCloseLabel();\n };\n\n /**\n * Creates a request close event.\n *\n * @param {CloseRequestReason} reason - The reason that the modal is about to close.\n */\n #createRequestCloseEvent(reason) {\n return new CustomEvent('me-request-close', {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: {\n reason,\n element: this\n }\n });\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'open' | 'staticBackdrop' | 'noHeader' | 'noAnimations' | 'noCloseButton' | 'fullscreen' | 'preserveOverflow' | 'placement' | 'closeLabel'} prop - The property to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Opens the modal if it is closed, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.show();\n */\n show() {\n if (this.open) {\n return;\n }\n\n this.open = true;\n }\n\n /**\n * Closes the modal if it is open, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.hide();\n */\n hide() {\n if (!this.open) {\n return;\n }\n\n this.open = false;\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='modal-element']\n * @example\n * ModalElement.defineCustomElement('my-modal');\n */\n static defineCustomElement(elementName = 'modal-element') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, ModalElement);\n }\n }\n}\n\nexport { ModalElement };\n","import { ModalElement } from './modal-element.js';\n\nModalElement.defineCustomElement();\n\nexport { ModalElement };\n","/*!\n * @georapbox/files-dropzone-element\n * A custom element that creates a drag and drop zone for files\n *\n * @version 2.0.1\n * @homepage https://github.com/georapbox/files-dropzone-element#readme\n * @author George Raptis \n * @license MIT\n */\nfunction u(o,e=\"\"){if(!e)return!0;let t=[...new Set(e.split(\",\").map(r=>r.trim()).filter(Boolean))],i=o.type,s=i.replace(/\\/.*$/,\"\");for(let r of t)if(r.charAt(0)===\".\"){if(o.name.toLowerCase().indexOf(r.toLowerCase(),o.name.length-r.length)!==-1)return!0}else if(/\\/\\*$/.test(r)){if(s===r.replace(/\\/.*$/,\"\"))return!0}else if(i===r)return!0;return!1}var x=new Map([[\"aac\",\"audio/aac\"],[\"abw\",\"application/x-abiword\"],[\"arc\",\"application/x-freearc\"],[\"avif\",\"image/avif\"],[\"avi\",\"video/x-msvideo\"],[\"azw\",\"application/vnd.amazon.ebook\"],[\"bin\",\"application/octet-stream\"],[\"bmp\",\"image/bmp\"],[\"bz\",\"application/x-bzip\"],[\"bz2\",\"application/x-bzip2\"],[\"cda\",\"application/x-cdf\"],[\"csh\",\"application/x-csh\"],[\"css\",\"text/css\"],[\"csv\",\"text/csv\"],[\"doc\",\"application/msword\"],[\"docx\",\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"],[\"eot\",\"application/vnd.ms-fontobject\"],[\"epub\",\"application/epub+zip\"],[\"gz\",\"application/gzip\"],[\"gif\",\"image/gif\"],[\"heic\",\"image/heic\"],[\"heif\",\"image/heif\"],[\"htm\",\"text/html\"],[\"html\",\"text/html\"],[\"ico\",\"image/vnd.microsoft.icon\"],[\"ics\",\"text/calendar\"],[\"jar\",\"application/java-archive\"],[\"jpeg\",\"image/jpeg\"],[\"jpg\",\"image/jpeg\"],[\"jxl\",\"image/jxl\"],[\"js\",\"text/javascript\"],[\"json\",\"application/json\"],[\"jsonld\",\"application/ld+json\"],[\"markdown\",\"text/markdown\"],[\"md\",\"text/markdown\"],[\"mid\",\"audio/midi\"],[\"midi\",\"audio/midi\"],[\"mjs\",\"text/javascript\"],[\"mp3\",\"audio/mpeg\"],[\"mp4\",\"video/mp4\"],[\"mpeg\",\"video/mpeg\"],[\"mpkg\",\"application/vnd.apple.installer+xml\"],[\"odp\",\"application/vnd.oasis.opendocument.presentation\"],[\"ods\",\"application/vnd.oasis.opendocument.spreadsheet\"],[\"odt\",\"application/vnd.oasis.opendocument.text\"],[\"oga\",\"audio/ogg\"],[\"ogv\",\"video/ogg\"],[\"ogx\",\"application/ogg\"],[\"opus\",\"audio/opus\"],[\"otf\",\"font/otf\"],[\"png\",\"image/png\"],[\"pdf\",\"application/pdf\"],[\"php\",\"application/x-httpd-php\"],[\"ppt\",\"application/vnd.ms-powerpoint\"],[\"pptx\",\"application/vnd.openxmlformats-officedocument.presentationml.presentation\"],[\"rar\",\"application/vnd.rar\"],[\"rtf\",\"application/rtf\"],[\"sh\",\"application/x-sh\"],[\"svg\",\"image/svg+xml\"],[\"swf\",\"application/x-shockwave-flash\"],[\"tar\",\"application/x-tar\"],[\"tif\",\"image/tiff\"],[\"tiff\",\"image/tiff\"],[\"ts\",\"video/mp2t\"],[\"ttf\",\"font/ttf\"],[\"txt\",\"text/plain\"],[\"vsd\",\"application/vnd.visio\"],[\"wav\",\"audio/wav\"],[\"weba\",\"audio/webm\"],[\"webm\",\"video/webm\"],[\"webp\",\"image/webp\"],[\"woff\",\"font/woff\"],[\"woff2\",\"font/woff2\"],[\"xhtml\",\"application/xhtml+xml\"],[\"xls\",\"application/vnd.ms-excel\"],[\"xlsx\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"],[\"xml\",\"application/xml\"],[\"xul\",\"application/vnd.mozilla.xul+xml\"],[\"zip\",\"application/zip\"],[\"7z\",\"application/x-7z-compressed\"],[\"mkv\",\"video/x-matroska\"],[\"mov\",\"video/quicktime\"],[\"msg\",\"application/vnd.ms-outlook\"]]),b=[\".DS_Store\",\"Thumbs.db\"],y=o=>{let{name:e}=o;if(e&&e.lastIndexOf(\".\")!==-1&&!o.type){let i=(e.split(\".\").pop()||\"\").toLowerCase(),s=x.get(i);s&&Object.defineProperty(o,\"type\",{value:s,writable:!1,configurable:!1,enumerable:!0})}return o},g=(o,e)=>{let t=y(o);if(typeof t.path!=\"string\"){let{webkitRelativePath:i}=o;Object.defineProperty(t,\"path\",{value:typeof e==\"string\"?e:i||o.name,writable:!1,configurable:!1,enumerable:!0})}return t},m=async o=>await new Promise((e,t)=>{o.readEntries(e,t)}),w=async o=>{let e=[],t=await m(o);for(;t.length>0;)e.push(...t),t=await m(o);return e},E=o=>new Promise((e,t)=>{o.file(i=>e(g(i,o.fullPath)),t)}),F=async o=>{let e=[],t=[];for(let i of o){if(i.kind!==\"file\")continue;let s=i.getAsEntry?i.getAsEntry():i.webkitGetAsEntry();t.push(s)}for(;t.length>0;){let i=t.shift();if(i)if(i.isFile){let s=await E(i);b.indexOf(s.name)===-1&&e.push(s)}else i.isDirectory&&t.push(...await w(i.createReader()));else continue}return e},f=async o=>{let e=[];for(let t of o)b.indexOf(t.name)===-1&&e.push(g(t));return e},l=async o=>o.dataTransfer?o.dataTransfer.items?await F(o.dataTransfer.items):await f(o.dataTransfer.files):await f(o.target.files);var n=\"files-dropzone\",v=\"TOO_MANY_FILES\",L=\"FILE_TOO_LARGE\",k=\"FILE_TOO_SMALL\",A=\"INVALID_MIME_TYPE\",z=document.createElement(\"template\"),S=`\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;z.innerHTML=`\n \n\n \n\n
\n Drag 'n' drop files here, or click to select files\n
\n`;var d=class o extends HTMLElement{#t=null;#e=null;constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\",delegatesFocus:!0}).appendChild(z.content.cloneNode(!0)),this.shadowRoot&&(this.#t=this.shadowRoot.getElementById(\"file-input\"),this.#e=this.shadowRoot.getElementById(\"dropzone\"))}static get observedAttributes(){return[\"accept\",\"disabled\",\"multiple\"]}attributeChangedCallback(e,t,i){e===\"accept\"&&t!==i&&this.#t&&(this.#t.accept=this.accept),e===\"disabled\"&&t!==i&&this.#t&&(this.#t.disabled=this.disabled,this.disabled?(this.#e?.removeAttribute(\"tabindex\"),this.#e?.setAttribute(\"aria-disabled\",\"true\")):(this.#e?.setAttribute(\"tabindex\",\"0\"),this.#e?.setAttribute(\"aria-disabled\",\"false\"))),e===\"multiple\"&&t!==i&&this.#t&&(this.#t.multiple=this.multiple)}connectedCallback(){this.#o(\"accept\"),this.#o(\"disabled\"),this.#o(\"maxFiles\"),this.#o(\"maxSize\"),this.#o(\"minSize\"),this.#o(\"multiple\"),this.#o(\"autoFocus\"),this.#o(\"noStyle\"),this.#t?.addEventListener(\"change\",this.#i),this.#e?.addEventListener(\"dragenter\",this.#r),this.#e?.addEventListener(\"dragover\",this.#s),this.#e?.addEventListener(\"dragleave\",this.#n),this.#e?.addEventListener(\"drop\",this.#a),this.#e?.addEventListener(\"click\",this.#d),this.#e?.addEventListener(\"keyup\",this.#l),this.autoFocus&&this.#e?.focus()}disconnectedCallback(){this.#t?.removeEventListener(\"change\",this.#i),this.#e?.removeEventListener(\"dragenter\",this.#r),this.#e?.removeEventListener(\"dragover\",this.#s),this.#e?.removeEventListener(\"dragleave\",this.#n),this.#e?.removeEventListener(\"drop\",this.#a),this.#e?.removeEventListener(\"click\",this.#d),this.#e?.removeEventListener(\"keyup\",this.#l)}get accept(){return this.getAttribute(\"accept\")||\"\"}set accept(e){this.setAttribute(\"accept\",e!=null?e.toString():e)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(e){this.toggleAttribute(\"disabled\",!!e)}get maxFiles(){let e=Number(this.getAttribute(\"max-files\"))||0;return e<=0?1/0:Math.floor(Math.abs(e))}set maxFiles(e){this.setAttribute(\"max-files\",e!=null?e.toString():e)}get maxSize(){let e=this.getAttribute(\"max-size\");if(e===null)return 1/0;let t=Number(e);return Number.isNaN(t)?1/0:t}set maxSize(e){this.setAttribute(\"max-size\",e!=null?e.toString():e)}get minSize(){let e=this.getAttribute(\"min-size\");if(e===null)return 0;let t=Number(e);return Number.isNaN(t)?0:t}set minSize(e){this.setAttribute(\"min-size\",e!=null?e.toString():e)}get multiple(){return this.hasAttribute(\"multiple\")}set multiple(e){this.toggleAttribute(\"multiple\",!!e)}get autoFocus(){return this.hasAttribute(\"auto-focus\")}set autoFocus(e){this.toggleAttribute(\"auto-focus\",!!e)}get noStyle(){return this.hasAttribute(\"no-style\")}set noStyle(e){this.toggleAttribute(\"no-style\",!!e)}#i=async e=>{try{this.#c(await l(e))}catch(t){this.dispatchEvent(new CustomEvent(`${n}-error`,{bubbles:!0,composed:!0,detail:{error:t}}))}};#r=()=>{this.disabled||this.dispatchEvent(new Event(`${n}-dragenter`,{bubbles:!0,composed:!0}))};#s=e=>{if(e.preventDefault(),this.disabled){e.dataTransfer.dropEffect=\"none\";return}e.dataTransfer.dropEffect=\"copy\",this.#e&&(this.#e.classList.add(\"dropzone--dragover\"),this.#e.part.add(\"dropzone--dragover\")),this.dispatchEvent(new Event(`${n}-dragover`,{bubbles:!0,composed:!0}))};#n=()=>{this.disabled||(this.#e&&(this.#e.classList.remove(\"dropzone--dragover\"),this.#e.part.remove(\"dropzone--dragover\")),this.dispatchEvent(new Event(`${n}-dragleave`,{bubbles:!0,composed:!0})))};#a=async e=>{if(!this.disabled){e.preventDefault(),this.#e&&(this.#e.classList.remove(\"dropzone--dragover\"),this.#e.part.remove(\"dropzone--dragover\"));try{this.#c(await l(e))}catch(t){this.dispatchEvent(new CustomEvent(`${n}-error`,{bubbles:!0,composed:!0,detail:{error:t}}))}}};#d=()=>{this.disabled||this.#t?.click()};#l=e=>{this.disabled||(e.key===\" \"||e.key===\"Enter\")&&this.#t?.click()};#c(e){if(!Array.isArray(e)||!e.length)return;let t=[],i=[],s=e.length;if(!this.multiple&&s>1)for(let r of e)i.push({file:r,errors:[{code:v,message:\"Too many files selected. Only 1 file is allowed.\"}]});else if(this.multiple&&s>this.maxFiles)for(let r of e)i.push({file:r,errors:[{code:v,message:`Too many files selected. Only ${this.maxFiles} ${this.maxFiles>1?\"files are\":\"file is\"} allowed.`}]});else for(let r of e){let c=u(r,this.accept),p=r.size>this.maxSize,h=r.size0&&this.dispatchEvent(new CustomEvent(`${n}-drop-accepted`,{bubbles:!0,composed:!0,detail:{acceptedFiles:t}})),i.length>0&&this.dispatchEvent(new CustomEvent(`${n}-drop-rejected`,{bubbles:!0,composed:!0,detail:{rejectedFiles:i}})),this.#t&&(this.#t.value=this.#t.defaultValue)}openFileDialog(){this.disabled||this.#t?.click()}#o(e){let t=this;if(Object.prototype.hasOwnProperty.call(t,e)){let i=t[e];delete t[e],t[e]=i}}static defineCustomElement(e=n){typeof window<\"u\"&&!window.customElements.get(e)&&window.customElements.define(e,o)}};d.defineCustomElement();export{d as FilesDropzone};\n//# sourceMappingURL=files-dropzone-defined.js.map\n","// @ts-check\n\n/**\n * Checks if a file is valid based on the accepted file type specifiers.\n *\n * @param {File} file - The File object to validate.\n * @param {string} [acceptedTypeSpecifiers=''] - The accepted file type specifiers.\n * @returns {boolean} - True if the file is valid, false otherwise.\n */\nexport function isValidFile(file, acceptedTypeSpecifiers = '') {\n if (!acceptedTypeSpecifiers) {\n return true;\n }\n\n const acceptedMimeTypesList = [\n ...new Set(\n acceptedTypeSpecifiers\n .split(',')\n .map(v => v.trim())\n .filter(Boolean)\n )\n ];\n\n const fileMimeType = file.type;\n const baseMimeType = fileMimeType.replace(/\\/.*$/, '');\n\n for (const validType of acceptedMimeTypesList) {\n if (validType.charAt(0) === '.') {\n if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) {\n return true;\n }\n } else if (/\\/\\*$/.test(validType)) {\n // Check for mime type that looks like \"image/*\" or similar.\n if (baseMimeType === validType.replace(/\\/.*$/, '')) {\n return true;\n }\n } else {\n if (fileMimeType === validType) {\n return true;\n }\n }\n }\n\n return false;\n}\n","// @ts-check\n\n/**\n * A map of common file extensions and their associated MIME types.\n */\nconst COMMON_MIME_TYPES = new Map([\n // https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types\n ['aac', 'audio/aac'],\n ['abw', 'application/x-abiword'],\n ['arc', 'application/x-freearc'],\n ['avif', 'image/avif'],\n ['avi', 'video/x-msvideo'],\n ['azw', 'application/vnd.amazon.ebook'],\n ['bin', 'application/octet-stream'],\n ['bmp', 'image/bmp'],\n ['bz', 'application/x-bzip'],\n ['bz2', 'application/x-bzip2'],\n ['cda', 'application/x-cdf'],\n ['csh', 'application/x-csh'],\n ['css', 'text/css'],\n ['csv', 'text/csv'],\n ['doc', 'application/msword'],\n ['docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n ['eot', 'application/vnd.ms-fontobject'],\n ['epub', 'application/epub+zip'],\n ['gz', 'application/gzip'],\n ['gif', 'image/gif'],\n ['heic', 'image/heic'],\n ['heif', 'image/heif'],\n ['htm', 'text/html'],\n ['html', 'text/html'],\n ['ico', 'image/vnd.microsoft.icon'],\n ['ics', 'text/calendar'],\n ['jar', 'application/java-archive'],\n ['jpeg', 'image/jpeg'],\n ['jpg', 'image/jpeg'],\n ['jxl', 'image/jxl'],\n ['js', 'text/javascript'],\n ['json', 'application/json'],\n ['jsonld', 'application/ld+json'],\n ['markdown', 'text/markdown'],\n ['md', 'text/markdown'],\n ['mid', 'audio/midi'],\n ['midi', 'audio/midi'],\n ['mjs', 'text/javascript'],\n ['mp3', 'audio/mpeg'],\n ['mp4', 'video/mp4'],\n ['mpeg', 'video/mpeg'],\n ['mpkg', 'application/vnd.apple.installer+xml'],\n ['odp', 'application/vnd.oasis.opendocument.presentation'],\n ['ods', 'application/vnd.oasis.opendocument.spreadsheet'],\n ['odt', 'application/vnd.oasis.opendocument.text'],\n ['oga', 'audio/ogg'],\n ['ogv', 'video/ogg'],\n ['ogx', 'application/ogg'],\n ['opus', 'audio/opus'],\n ['otf', 'font/otf'],\n ['png', 'image/png'],\n ['pdf', 'application/pdf'],\n ['php', 'application/x-httpd-php'],\n ['ppt', 'application/vnd.ms-powerpoint'],\n ['pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],\n ['rar', 'application/vnd.rar'],\n ['rtf', 'application/rtf'],\n ['sh', 'application/x-sh'],\n ['svg', 'image/svg+xml'],\n ['swf', 'application/x-shockwave-flash'],\n ['tar', 'application/x-tar'],\n ['tif', 'image/tiff'],\n ['tiff', 'image/tiff'],\n ['ts', 'video/mp2t'],\n ['ttf', 'font/ttf'],\n ['txt', 'text/plain'],\n ['vsd', 'application/vnd.visio'],\n ['wav', 'audio/wav'],\n ['weba', 'audio/webm'],\n ['webm', 'video/webm'],\n ['webp', 'image/webp'],\n ['woff', 'font/woff'],\n ['woff2', 'font/woff2'],\n ['xhtml', 'application/xhtml+xml'],\n ['xls', 'application/vnd.ms-excel'],\n ['xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],\n ['xml', 'application/xml'],\n ['xul', 'application/vnd.mozilla.xul+xml'],\n ['zip', 'application/zip'],\n ['7z', 'application/x-7z-compressed'],\n\n // Others\n ['mkv', 'video/x-matroska'],\n ['mov', 'video/quicktime'],\n ['msg', 'application/vnd.ms-outlook']\n]);\n\nconst FILES_TO_IGNORE = [\n // Thumbnail cache files for macOS and Windows\n '.DS_Store', // macOs\n 'Thumbs.db' // Windows\n];\n\n/**\n * Adds a `type` property to the file object if it doesn't have one and the file has an extension.\n * This is needed because Firefox doesn't add a type property to files dragged from the desktop.\n * @bug https://bugzilla.mozilla.org/show_bug.cgi?id=1424689\n *\n * @param {File} file - The file object to add the type property to.\n * @returns {File} - The file object with the type property added.\n */\nconst toFileWithMimeType = file => {\n const { name } = file;\n const hasExtension = name && name.lastIndexOf('.') !== -1;\n\n if (hasExtension && !file.type) {\n const extension = (name.split('.').pop() || '').toLowerCase();\n const type = COMMON_MIME_TYPES.get(extension);\n\n if (type) {\n Object.defineProperty(file, 'type', {\n value: type,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n }\n\n return file;\n};\n\n/**\n * Adds a `path` property to the file object if it doesn't have one.\n * If `path` is not provided, the `webkitRelativePath` property of the file will be used\n * or the file's name if `webkitRelativePath` is not available.\n *\n * @param {File} file - The file object to add the path property to.\n * @param {string} [path] - The path to set on the file object.\n * @returns {File} - The file object with the path property added.\n */\nconst toFileWithPath = (file, path) => {\n const fileWithMimeType = toFileWithMimeType(file);\n\n // @ts-ignore\n if (typeof fileWithMimeType.path !== 'string') {\n const { webkitRelativePath } = file;\n\n Object.defineProperty(fileWithMimeType, 'path', {\n value: typeof path === 'string' ? path : webkitRelativePath || file.name,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n\n return fileWithMimeType;\n};\n\n/**\n * Wrap `FileSystemDirectoryReader.readEntries` in a promise to make working with read entries easier.\n * https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryReader/readEntries\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */\nconst readEntriesPromise = async directoryReader => {\n return await new Promise((resolve, reject) => {\n directoryReader.readEntries(resolve, reject);\n });\n};\n\n/**\n * Read all entries in a directory or sub-directory\n * by calling `readEntries` until it returns an empty array.\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */\nconst readAllDirectoryEntries = async directoryReader => {\n const entries = [];\n let readEntries = await readEntriesPromise(directoryReader);\n\n while (readEntries.length > 0) {\n entries.push(...readEntries);\n readEntries = await readEntriesPromise(directoryReader);\n }\n\n return entries;\n};\n\n/**\n * Get a `File` object from a `FileSystemFileEntry` object.\n *\n * @param {FileSystemFileEntry} fileEntry - The file entry to get a `File` object from.\n * @returns {Promise} - A promise that resolves with a `File` object.\n */\nconst getFileFromFileEntry = fileEntry => {\n return new Promise((resolve, reject) => {\n fileEntry.file(file => resolve(toFileWithPath(file, fileEntry.fullPath)), reject);\n });\n};\n\n/**\n * Get an array of `File` objects from a `DataTransferItemList` object.\n *\n * @param {DataTransferItemList} dataTransferItemList - The item list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nconst getFilesFromDataTransferItemList = async dataTransferItemList => {\n const files = [];\n\n // Chromium browsers read only 100 files at a time as per the spec, so we need to use\n // BFS (Breadth-first search) to traverse the entire directory/file structure.\n // https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/webkitGetAsEntry#javascript_content\n const queue = [];\n\n for (const item of dataTransferItemList) {\n if (item.kind !== 'file') {\n // Ignore non-file items, such as links.\n continue;\n }\n\n // https://developer.mozilla.org/docs/Web/API/DataTransferItem/webkitGetAsEntry\n // This function is implemented as `webkitGetAsEntry()` in non-WebKit browsers\n // including Firefox at this time but it may be renamed to `getAsEntry()` in the future.\n // @ts-ignore\n const entry = item.getAsEntry ? item.getAsEntry() : item.webkitGetAsEntry();\n\n queue.push(entry);\n }\n\n while (queue.length > 0) {\n const entry = queue.shift();\n\n if (!entry) {\n continue;\n } else if (entry.isFile) {\n const file = await getFileFromFileEntry(entry);\n\n if (FILES_TO_IGNORE.indexOf(file.name) === -1) {\n files.push(file);\n }\n } else if (entry.isDirectory) {\n queue.push(...(await readAllDirectoryEntries(entry.createReader())));\n }\n }\n\n return files;\n};\n\n/**\n * Get an array of `File` objects from a `FileList` object.\n *\n * @param {FileList} fileList - The file list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nconst getFilesFromFileList = async fileList => {\n const files = [];\n\n for (const file of fileList) {\n if (FILES_TO_IGNORE.indexOf(file.name) === -1) {\n files.push(toFileWithPath(file));\n }\n }\n\n return files;\n};\n\n/**\n * Get an array of `File` objects from an event.\n * This function supports both `drop` and `change` events.\n *\n * @param {*} evt - The event to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nexport const getFilesFromEvent = async evt => {\n if (evt.dataTransfer) {\n return evt.dataTransfer.items\n ? await getFilesFromDataTransferItemList(evt.dataTransfer.items)\n : await getFilesFromFileList(evt.dataTransfer.files);\n }\n\n return await getFilesFromFileList(evt.target.files);\n};\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\nimport { isValidFile } from './utils/is-valid-file.js';\nimport { getFilesFromEvent } from './utils/files-selector.js';\n\nconst COMPONENT_NAME = 'files-dropzone';\nconst TOO_MANY_FILES = 'TOO_MANY_FILES';\nconst FILE_TOO_LARGE = 'FILE_TOO_LARGE';\nconst FILE_TOO_SMALL = 'FILE_TOO_SMALL';\nconst INVALID_MIME_TYPE = 'INVALID_MIME_TYPE';\nconst template = document.createElement('template');\n\nconst styles = /* css */ `\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n\ntemplate.innerHTML = /* html */ `\n \n\n \n\n
\n Drag 'n' drop files here, or click to select files\n
\n`;\n\n/**\n * @summary A custom element that allows users to drag and drop files into it.\n * @documentation https://github.com/georapbox/files-dropzone-element\n *\n * @tagname files-dropzone - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {string} accept - A comma-separated list of unique file type specifiers describing file types to allow.\n * @property {boolean} disabled - Determines whether the dropzone is disabled.\n * @property {number} maxFiles - The maximum number of files allowed to be dropped.\n * @property {number} maxSize - The maximum file size allowed in bytes.\n * @property {number} minSize - The minimum file size allowed in bytes.\n * @property {boolean} multiple - Allows multiple files to be dropped.\n * @property {boolean} autoFocus - Automatically focuses the dropzone when it's connected to the DOM.\n * @property {boolean} noStyle - Prevents the dropzone from applying any styling.\n *\n * @attribute {string} accept - Reflects the accept property.\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {number} max-files - Reflects the maxFiles property.\n * @attribute {number} max-size - Reflects the maxSize property.\n * @attribute {number} min-size - Reflects the minSize property.\n * @attribute {boolean} multiple - Reflects the multiple property.\n * @attribute {boolean} auto-focus - Reflects the autoFocus property.\n * @attribute {boolean} no-style - Reflects the noStyle property.\n *\n * @slot - The default slot content of the dropzone.\n *\n * @csspart dropzone - The dropzone element.\n * @csspart dropzone--dragover - The state of the dropzone when dragging over it.\n *\n * @cssproperty --dropzone-border-width - The border width of the dropzone.\n * @cssproperty --dropzone-border-style - The border style of the dropzone.\n * @cssproperty --dropzone-border-radius - The border radius of the dropzone.\n * @cssproperty --dropzone-border-color - The border color of the dropzone.\n * @cssproperty --dropzone-border-color-dragover - The border color of the dropzone when dragging over it.\n * @cssproperty --dropzone-border-color-hover - The border color of the dropzone when hovering over it.\n * @cssproperty --dropzone-background-color - The background color of the dropzone.\n * @cssproperty --dropzone-background-color-dragover - The background color of the dropzone when dragging over it.\n * @cssproperty --dropzone-background-color-hover - The background color of the dropzone when hovering over it.\n * @cssproperty --dropzone-body-color - The text color of the dropzone.\n * @cssproperty --dropzone-body-color-dragover - The text color of the dropzone when dragging over it.\n * @cssproperty --dropzone-body-color-hover - The text color of the dropzone when hovering over it.\n * @cssproperty --dropzone-focus-shadow-rgb - The RGB value of the dropzone's focus shadow.\n * @cssproperty --dropzone-focus-box-shadow - The box shadow of the dropzone when focused.\n * @cssproperty --dropzone-transition-duration - The transition's duration for the dropzone area.\n *\n * @event files-dropzone-drop - Fired when files are dropped.\n * @event files-dropzone-drop-accepted - Fired when files dropped files are accepted.\n * @event files-dropzone-drop-rejected - Fired when files dropped files are rejected.\n * @event files-dropzone-dragenter - Fired when files are dragged into the dropzone.\n * @event files-dropzone-dragover - Fired when files are dragged over the dropzone.\n * @event files-dropzone-dragleave - Fired when files are dragged out of the dropzone.\n * @event files-dropzone-error - Fired when there is any error in the process of reading dropped files or directories.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method openFileDialog - Instance method. Opens the file dialog programmatically.\n */\nclass FilesDropzone extends HTMLElement {\n /** @type {Nullable} */\n #fileInput = null;\n\n /** @type {Nullable} */\n #dropzoneEl = null;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n if (this.shadowRoot) {\n this.#fileInput = /** @type {Nullable} */ (this.shadowRoot.getElementById('file-input'));\n this.#dropzoneEl = this.shadowRoot.getElementById('dropzone');\n }\n }\n\n static get observedAttributes() {\n return ['accept', 'disabled', 'multiple'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'accept' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.accept = this.accept;\n }\n\n if (name === 'disabled' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.disabled = this.disabled;\n\n if (this.disabled) {\n this.#dropzoneEl?.removeAttribute('tabindex');\n this.#dropzoneEl?.setAttribute('aria-disabled', 'true');\n } else {\n this.#dropzoneEl?.setAttribute('tabindex', '0');\n this.#dropzoneEl?.setAttribute('aria-disabled', 'false');\n }\n }\n\n if (name === 'multiple' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.multiple = this.multiple;\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('accept');\n this.#upgradeProperty('disabled');\n this.#upgradeProperty('maxFiles');\n this.#upgradeProperty('maxSize');\n this.#upgradeProperty('minSize');\n this.#upgradeProperty('multiple');\n this.#upgradeProperty('autoFocus');\n this.#upgradeProperty('noStyle');\n\n this.#fileInput?.addEventListener('change', this.#handleFileInputChange);\n this.#dropzoneEl?.addEventListener('dragenter', this.#handleDragEnter);\n this.#dropzoneEl?.addEventListener('dragover', this.#handleDragOver);\n this.#dropzoneEl?.addEventListener('dragleave', this.#handleDragLeave);\n this.#dropzoneEl?.addEventListener('drop', this.#handleDrop);\n this.#dropzoneEl?.addEventListener('click', this.#handleClick);\n this.#dropzoneEl?.addEventListener('keyup', this.#handleKeyUp);\n\n this.autoFocus && this.#dropzoneEl?.focus();\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#fileInput?.removeEventListener('change', this.#handleFileInputChange);\n this.#dropzoneEl?.removeEventListener('dragenter', this.#handleDragEnter);\n this.#dropzoneEl?.removeEventListener('dragover', this.#handleDragOver);\n this.#dropzoneEl?.removeEventListener('dragleave', this.#handleDragLeave);\n this.#dropzoneEl?.removeEventListener('drop', this.#handleDrop);\n this.#dropzoneEl?.removeEventListener('click', this.#handleClick);\n this.#dropzoneEl?.removeEventListener('keyup', this.#handleKeyUp);\n }\n\n /**\n * @type {string} - A comma-separated list of unique file type specifiers describing file types to allow.\n * @attribute accept - Reflects the accept property.\n */\n get accept() {\n return this.getAttribute('accept') || '';\n }\n\n set accept(value) {\n this.setAttribute('accept', value != null ? value.toString() : value);\n }\n\n /**\n * @type {boolean} - Determines whether the dropzone is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value) {\n this.toggleAttribute('disabled', !!value);\n }\n\n /**\n * @type {number} - The maximum number of files allowed to be dropped.\n * @default Infinity\n * @attribute max-files - Reflects the maxFiles property.\n */\n get maxFiles() {\n const num = Number(this.getAttribute('max-files')) || 0;\n\n if (num <= 0) {\n return Infinity;\n }\n\n return Math.floor(Math.abs(num));\n }\n\n set maxFiles(value) {\n this.setAttribute('max-files', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} - The maximum file size allowed in bytes.\n * @default Infinity\n * @attribute max-size - Reflects the maxSize property.\n */\n get maxSize() {\n const value = this.getAttribute('max-size');\n\n if (value === null) {\n return Infinity;\n }\n\n const num = Number(value);\n\n return Number.isNaN(num) ? Infinity : num;\n }\n\n set maxSize(value) {\n this.setAttribute('max-size', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} - The minimum file size allowed in bytes.\n * @default 0\n * @attribute min-size - Reflects the minSize property.\n */\n get minSize() {\n const value = this.getAttribute('min-size');\n\n if (value === null) {\n return 0;\n }\n\n const num = Number(value);\n\n return Number.isNaN(num) ? 0 : num;\n }\n\n set minSize(value) {\n this.setAttribute('min-size', value != null ? value.toString() : value);\n }\n\n /**\n * @type {boolean} - Allows multiple files to be dropped.\n * @default false\n * @attribute multiple - Reflects the multiple property.\n */\n get multiple() {\n return this.hasAttribute('multiple');\n }\n\n set multiple(value) {\n this.toggleAttribute('multiple', !!value);\n }\n\n /**\n * @type {boolean} - Automatically focuses the dropzone when it's connected to the DOM.\n * @default false\n * @attribute auto-focus - Reflects the autoFocus property.\n */\n get autoFocus() {\n return this.hasAttribute('auto-focus');\n }\n\n set autoFocus(value) {\n this.toggleAttribute('auto-focus', !!value);\n }\n\n /**\n * @type {boolean} - Prevents the dropzone from applying any styling.\n * @default false\n * @attribute no-style - Reflects the noStyle property.\n */\n get noStyle() {\n return this.hasAttribute('no-style');\n }\n\n set noStyle(value) {\n this.toggleAttribute('no-style', !!value);\n }\n\n /**\n * Handles the change event of the file input.\n *\n * @param {*} evt - The event object.\n */\n #handleFileInputChange = async evt => {\n try {\n this.#handleFilesSelect(await getFilesFromEvent(evt));\n } catch (error) {\n this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n })\n );\n }\n };\n\n /**\n * Handles the dragenter event of the dropzone.\n */\n #handleDragEnter = () => {\n if (this.disabled) {\n return;\n }\n\n this.dispatchEvent(\n new Event(`${COMPONENT_NAME}-dragenter`, {\n bubbles: true,\n composed: true\n })\n );\n };\n\n /**\n * Handles the dragover event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleDragOver = evt => {\n evt.preventDefault();\n\n if (this.disabled) {\n evt.dataTransfer.dropEffect = 'none';\n return;\n }\n\n evt.dataTransfer.dropEffect = 'copy';\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.add('dropzone--dragover');\n this.#dropzoneEl.part.add('dropzone--dragover');\n }\n\n this.dispatchEvent(\n new Event(`${COMPONENT_NAME}-dragover`, {\n bubbles: true,\n composed: true\n })\n );\n };\n\n /**\n * Handles the dragleave event of the dropzone.\n */\n #handleDragLeave = () => {\n if (this.disabled) {\n return;\n }\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove('dropzone--dragover');\n this.#dropzoneEl.part.remove('dropzone--dragover');\n }\n\n this.dispatchEvent(\n new Event(`${COMPONENT_NAME}-dragleave`, {\n bubbles: true,\n composed: true\n })\n );\n };\n\n /**\n * Handles the drop event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleDrop = async evt => {\n if (this.disabled) {\n return;\n }\n\n evt.preventDefault();\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove('dropzone--dragover');\n this.#dropzoneEl.part.remove('dropzone--dragover');\n }\n\n try {\n this.#handleFilesSelect(await getFilesFromEvent(evt));\n } catch (error) {\n this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n })\n );\n }\n };\n\n /**\n * Handles the click event of the dropzone.\n */\n #handleClick = () => {\n if (this.disabled) {\n return;\n }\n\n this.#fileInput?.click();\n };\n\n /**\n * Handles the keyup event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleKeyUp = evt => {\n if (this.disabled) {\n return;\n }\n\n if (evt.key === ' ' || evt.key === 'Enter') {\n this.#fileInput?.click();\n }\n };\n\n /**\n * Handles the selection of files.\n *\n * @param {File[]} files - The files to handle.\n */\n #handleFilesSelect(files) {\n if (!Array.isArray(files) || !files.length) {\n return;\n }\n\n const acceptedFiles = [];\n const rejectedFiles = [];\n const filesLength = files.length;\n\n // If the component is not in multiple mode, reject all files.\n if (!this.multiple && filesLength > 1) {\n for (const file of files) {\n rejectedFiles.push({\n file,\n errors: [\n {\n code: TOO_MANY_FILES,\n message: `Too many files selected. Only 1 file is allowed.`\n }\n ]\n });\n }\n } else if (this.multiple && filesLength > this.maxFiles) {\n // If the component is in multiple mode, but the number of files exceeds\n // the maxFiles attribute, reject all files.\n for (const file of files) {\n rejectedFiles.push({\n file,\n errors: [\n {\n code: TOO_MANY_FILES,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? 'files are' : 'file is'} allowed.`\n }\n ]\n });\n }\n } else {\n // Validate each file. If it's valid, add it to the accepted files array,\n // otherwise add it to the rejected files array.\n for (const file of files) {\n const fileHasValidType = isValidFile(file, this.accept);\n const fileExceedsMaxSize = file.size > this.maxSize;\n const fileIsSmallerThanMinSize = file.size < this.minSize;\n\n if (fileHasValidType && !fileExceedsMaxSize && !fileIsSmallerThanMinSize) {\n acceptedFiles.push(file);\n } else {\n const errors = [];\n\n if (!fileHasValidType) {\n errors.push({\n code: INVALID_MIME_TYPE,\n message: `File type \"${file.type}\" is not accepted.`\n });\n }\n\n if (fileExceedsMaxSize) {\n errors.push({\n code: FILE_TOO_LARGE,\n message: `File size ${file.size} exceeds the maximum size of ${this.maxSize}.`\n });\n }\n\n if (fileIsSmallerThanMinSize) {\n errors.push({\n code: FILE_TOO_SMALL,\n message: `File size ${file.size} is smaller than the minimum size of ${this.minSize}.`\n });\n }\n\n rejectedFiles.push({ file, errors });\n }\n }\n }\n\n this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}-drop`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles,\n rejectedFiles\n }\n })\n );\n\n if (acceptedFiles.length > 0) {\n this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}-drop-accepted`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles\n }\n })\n );\n }\n\n if (rejectedFiles.length > 0) {\n this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}-drop-rejected`, {\n bubbles: true,\n composed: true,\n detail: {\n rejectedFiles\n }\n })\n );\n }\n\n if (this.#fileInput) {\n this.#fileInput.value = this.#fileInput.defaultValue;\n }\n }\n\n /**\n * Opens the file dialog programmatically.\n */\n openFileDialog() {\n if (this.disabled) {\n return;\n }\n\n this.#fileInput?.click();\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'accept' | 'disabled' | 'maxFiles' | 'maxSize' | 'minSize' | 'multiple' | 'autoFocus' | 'noStyle'} prop - The property name to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='files-dropzone'] - The name of the custom element.\n * @example\n *\n * FilesDropzone.defineCustomElement('my-dropzone');\n */\n static defineCustomElement(elementName = COMPONENT_NAME) {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, FilesDropzone);\n }\n }\n}\n\nexport { FilesDropzone };\n","import { FilesDropzone } from './files-dropzone.js';\n\nFilesDropzone.defineCustomElement();\n\nexport { FilesDropzone };\n","export const ACCEPTED_MIME_TYPES = [\n 'image/jpg',\n 'image/jpeg',\n 'image/png',\n 'image/apng',\n 'image/gif',\n 'image/webp',\n 'image/avif'\n];\nexport const MAX_SHADOW_BLUR_SIZE = 20;\nexport const MAX_STROKE_WIDTH = 20;\nexport const MAX_ROTATE = 360;\n","/**\n * Generates a unique id of the form `${prefix}-${randomString}-${suffix}`.\n *\n * @param {string} [prefix=''] - The prefix to use for the id.\n * @param {string} [suffix=''] - The suffix to use for the id.\n * @returns {string} - The unique id.\n */\nconst uid = (prefix = '', suffix = '') => {\n const prefixString = typeof prefix === 'string' && prefix !== '' ? prefix + '-' : '';\n const suffixString = typeof suffix === 'string' && suffix !== '' ? '-' + suffix : '';\n const randomString = Math.random().toString(36).substring(2, 8); // Pseudo-random string of six alphanumeric characters.\n\n return `${prefixString}${randomString}${suffixString}`;\n};\n\nexport { uid };\n","import { ACCEPTED_MIME_TYPES } from '../constants.js';\n\n/**\n * Creates a file from a given URL.\n *\n * @param {{ url: string, filename: string, mimeType: string }} options\n * @param {string} options.url - The URL of the file to fetch.\n * @param {string} options.filename - The name of the file to create.\n * @param {string} options.mimeType - The MIME type of the file to create.\n * @returns {Promise} - A promise that resolves to the file created from the given URL.\n */\nexport const fileFromUrl = async (options = {}) => {\n const res = await fetch(options.url);\n const blob = await res.blob();\n const mimeType = options.mimeType || blob.type || '';\n\n if (!ACCEPTED_MIME_TYPES.includes(mimeType)) {\n throw new Error(\n `This is not an accepted image format. Accepted MIME types are: ${ACCEPTED_MIME_TYPES.join(', ')}`\n );\n }\n\n return new File([blob], options.filename || '', blob);\n};\n","/**\n * A class representing a storage utility for managing data in `localStorage` or `sessionStorage`.\n */\nclass Storage {\n /**\n * The prefix to be added to all keys.\n *\n * @type {string}\n * @private\n */\n #keyPrefix = null;\n\n /**\n * The storage provider (`localStorage` or `sessionStorage`).\n *\n * @type {Storage}\n * @private\n */\n #provider = null;\n\n /**\n * Creates an instance of Storage.\n *\n * @param {string} prefix - The prefix to be added to all keys when storing/retrieving data.\n * @param {Storage} [provider=localStorage] - The storage provider (`localStorage` or `sessionStorage`).\n * @throws {Error} If prefix is not provided or if the provider is not supported.\n */\n constructor(prefix, provider = localStorage) {\n if (!prefix) {\n throw new Error('Storage prefix is required');\n }\n\n if (provider !== localStorage && provider !== sessionStorage) {\n throw new Error('Storage provider is not supported');\n }\n\n this.#keyPrefix = prefix;\n this.#provider = provider;\n }\n\n /**\n * Sets a key-value pair in the storage.\n *\n * @param {string} key - The key for the data.\n * @param {*} value - The value to be stored (will be converted to JSON string).\n */\n set(key, value) {\n try {\n this.#provider.setItem(`${this.#keyPrefix}${key}`, JSON.stringify(value));\n } catch (err) {\n console.error('Error saving to storage', err);\n }\n }\n\n /**\n * Retrieves the value associated with the given key from the storage.\n *\n * @param {string} key - The key to retrieve the value for.\n * @returns {*} The value associated with the key, or `null` if key is not found or an error occurs.\n */\n get(key) {\n try {\n const value = this.#provider.getItem(`${this.#keyPrefix}${key}`);\n return value ? JSON.parse(value) : null;\n } catch (err) {\n console.error('Error getting from storage', err);\n return null;\n }\n }\n}\n\nconst DEFAULT_STORAGE_PREFIX = 'meme-generator/';\nconst DEFAULT_STORAGE_PROVIDER = localStorage;\nconst storage = new Storage(DEFAULT_STORAGE_PREFIX, DEFAULT_STORAGE_PROVIDER);\n\nexport { Storage, storage };\n","export const isSolidColorSelected = selectedImage => {\n return typeof selectedImage === 'string';\n};\n","import Pressuru from 'url:../assets/fonts/Pressuru/Pressuru.ttf';\nimport OswaldRegular from 'url:../assets/fonts/Oswald/Oswald-Regular.ttf';\nimport OswaldBold from 'url:../assets/fonts/Oswald/Oswald-Bold.ttf';\nimport RobotoRegular from 'url:../assets/fonts/Roboto/Roboto-Regular.ttf';\nimport RobotoBold from 'url:../assets/fonts/Roboto/Roboto-Bold.ttf';\nimport RobotoCondensedRegular from 'url:../assets/fonts/RobotoCondensed/RobotoCondensed-Regular.ttf';\nimport RobotoCondensedBold from 'url:../assets/fonts/RobotoCondensed/RobotoCondensed-Bold.ttf';\nimport CourierPrimeRegular from 'url:../assets/fonts/CourierPrime/CourierPrime-Regular.ttf';\nimport CourierPrimeBold from 'url:../assets/fonts/CourierPrime/CourierPrime-Bold.ttf';\nimport OpenSansRegular from 'url:../assets/fonts/OpenSans/OpenSans-Regular.ttf';\nimport OpenSansBold from 'url:../assets/fonts/OpenSans/OpenSans-Bold.ttf';\n\nexport const customFonts = [\n { name: 'Pressuru', label: 'Pressuru', path: Pressuru, style: 'normal', weight: '400' },\n { name: 'Oswald-Regular', label: 'Oswald', path: OswaldRegular, style: 'normal', weight: '400' },\n { name: 'Oswald-Bold', label: 'Oswald Bold', path: OswaldBold, style: 'normal', weight: '700' },\n { name: 'Roboto-Regular', label: 'Roboto', path: RobotoRegular, style: 'normal', weight: '400' },\n { name: 'Roboto-Bold', label: 'Roboto Bold', path: RobotoBold, style: 'normal', weight: '700' },\n {\n name: 'RobotoCondensed-Regular',\n label: 'Roboto Condensed',\n path: RobotoCondensedRegular,\n style: 'normal',\n weight: '400'\n },\n {\n name: 'RobotoCondensed-Bold',\n label: 'Roboto Condensed Bold',\n path: RobotoCondensedBold,\n style: 'normal',\n weight: '700'\n },\n {\n name: 'CourierPrime-Regular',\n label: 'Courier Prime',\n path: CourierPrimeRegular,\n style: 'normal',\n weight: '400'\n },\n {\n name: 'CourierPrime-Bold',\n label: 'Courier Prime Bold',\n path: CourierPrimeBold,\n style: 'normal',\n weight: '700'\n },\n {\n name: 'OpenSans-Regular',\n label: 'Open Sans',\n path: OpenSansRegular,\n style: 'normal',\n weight: '400'\n },\n {\n name: 'OpenSans-Bold',\n label: 'Open Sans Bold',\n path: OpenSansBold,\n style: 'normal',\n weight: '400'\n }\n];\n\nexport const loadCustomFont = async (name, path, options = {}) => {\n try {\n const font = new FontFace(name, `url(${path})`, { ...options });\n await font.load();\n document.fonts.add(font);\n } catch (err) {\n console.error(err);\n }\n};\n","module.exports = new __parcel__URL__(\"Pressuru.684952ea.ttf\").toString();","module.exports = new __parcel__URL__(\"Oswald-Regular.89ec7d89.ttf\").toString();","module.exports = new __parcel__URL__(\"Oswald-Bold.0f6a7ca6.ttf\").toString();","module.exports = new __parcel__URL__(\"Roboto-Regular.ca197847.ttf\").toString();","module.exports = new __parcel__URL__(\"Roboto-Bold.fdb9b54a.ttf\").toString();","module.exports = new __parcel__URL__(\"RobotoCondensed-Regular.d585f5c7.ttf\").toString();","module.exports = new __parcel__URL__(\"RobotoCondensed-Bold.e1f96d4b.ttf\").toString();","module.exports = new __parcel__URL__(\"CourierPrime-Regular.3a25a501.ttf\").toString();","module.exports = new __parcel__URL__(\"CourierPrime-Bold.3d6bf689.ttf\").toString();","module.exports = new __parcel__URL__(\"OpenSans-Regular.edf9e01b.ttf\").toString();","module.exports = new __parcel__URL__(\"OpenSans-Bold.8fceb72b.ttf\").toString();","const errorsContainer = document.getElementById('errorsContainer');\n\nconst hideError = evt => {\n const target = evt.currentTarget;\n target.removeEventListener('click', hideError);\n errorsContainer.removeChild(target.parentNode);\n};\n\nexport const toastAlert = (message = '', type = 'info') => {\n const types = ['info', 'warning', 'danger'];\n\n if (!types.includes(type)) {\n type = 'info';\n }\n\n const template = /* html */ `\n ${message}\n \n `;\n\n const div = document.createElement('div');\n div.className = `alert alert-${type} alert-dismissible text-break mb-2 fade`;\n div.innerHTML = template;\n div.querySelector('button').addEventListener('click', hideError);\n errorsContainer.appendChild(div);\n setTimeout(() => div.classList.add('show'), 100);\n};\n","import { uid } from './utils/uid.js';\nimport { customFonts } from './custom-fonts.js';\nimport { MAX_SHADOW_BLUR_SIZE, MAX_STROKE_WIDTH, MAX_ROTATE } from './constants.js';\n\nconst defaultTextboxData = {\n id: '',\n text: '',\n fillColor: '#ffffff',\n strokeColor: '#000000',\n font: 'Pressuru',\n fontSize: 40,\n fontWeight: 'normal',\n textAlign: 'center',\n shadowBlur: 0,\n strokeWidth: 1.5,\n offsetY: 0,\n offsetX: 0,\n rotate: 0,\n allCaps: true\n};\n\nconst textboxes = new Map();\n\nclass Textbox {\n constructor(data) {\n const id = uid('textbox', Date.now().toString(36));\n\n this.data = data ? { ...data, id } : { ...defaultTextboxData, id };\n\n textboxes.set(id, this);\n\n document.dispatchEvent(\n new CustomEvent(`textbox-create`, {\n bubbles: true,\n composed: true,\n detail: { textbox: this }\n })\n );\n }\n\n getData() {\n return this.data;\n }\n\n static create(data) {\n return new Textbox(data);\n }\n\n static getAll() {\n return textboxes;\n }\n\n static getById(id) {\n return textboxes.get(id);\n }\n\n static remove(id) {\n textboxes.delete(id);\n\n document.dispatchEvent(\n new CustomEvent(`textbox-remove`, {\n bubbles: true,\n composed: true,\n detail: { id }\n })\n );\n }\n\n static createElement(textbox, autoFocus = true) {\n if (!(textbox instanceof Textbox)) {\n return;\n }\n\n const data = textbox.getData();\n const {\n id,\n text,\n fillColor,\n strokeColor,\n fontSize,\n shadowBlur,\n strokeWidth,\n offsetX,\n offsetY,\n rotate\n } = data;\n\n const template = /* html */ `\n
\n \n \n\n \n\n
\n \n \n\n \n \n\n \n
\n
\n\n \n `;\n\n const fragment = document.createDocumentFragment();\n const div = document.createElement('div');\n\n div.setAttribute('id', id);\n div.setAttribute('data-section', 'textbox');\n div.className = 'bg-light border shadow-sm mb-3 rounded';\n div.innerHTML = template;\n div.querySelectorAll('select').forEach(el => (el.value = data[el.dataset.input]));\n div\n .querySelectorAll('input[type=\"checkbox\"]')\n .forEach(el => (el.checked = data[el.dataset.input]));\n\n const textboxEl = fragment.appendChild(div);\n\n if (autoFocus) {\n setTimeout(() => textboxEl.querySelector('[data-input=\"text\"]').focus(), 0);\n }\n\n return textboxEl;\n }\n}\n\nexport { Textbox };\n","import { isSolidColorSelected } from './utils/is-solid-color-selected.js';\nimport { MAX_SHADOW_BLUR_SIZE, MAX_STROKE_WIDTH, MAX_ROTATE } from './constants.js';\n\nexport class Canvas {\n #canvas = null;\n #ctx = null;\n\n constructor(canvasEl) {\n this.#canvas = canvasEl;\n this.#ctx = this.#canvas.getContext('2d');\n }\n\n get width() {\n return this.#canvas.width;\n }\n\n set width(value) {\n this.#canvas.width = value;\n }\n\n get height() {\n return this.#canvas.height;\n }\n\n set height(value) {\n this.#canvas.height = value;\n }\n\n getDimensions() {\n return {\n width: this.width,\n height: this.height\n };\n }\n\n setDimensions({ width, height }) {\n this.width = width;\n this.height = height;\n return this;\n }\n\n toDataURL() {\n return this.#canvas.toDataURL();\n }\n\n draw(image, textboxes = new Map()) {\n if (image == null) {\n return;\n }\n\n const canvas = this.#canvas;\n const ctx = this.#ctx;\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n if (isSolidColorSelected(image)) {\n ctx.fillStyle = image;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n } else {\n ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n }\n\n let multiplier = 0;\n\n textboxes.forEach(textbox => {\n const { data } = textbox;\n\n multiplier += 1;\n\n ctx.save();\n\n ctx.font = `${data.fontWeight} ${(data.fontSize * canvas.width) / 1000}px ${data.font}`;\n ctx.fillStyle = data.fillColor;\n ctx.textAlign = data.textAlign;\n ctx.strokeStyle = data.strokeColor;\n\n const lineHeight = ctx.measureText('M').width + data.fontSize / 2;\n const xPos = canvas.width / 2;\n const shadowBlur = data.shadowBlur;\n const text = data.allCaps === true ? data.text.toUpperCase() : data.text;\n const textLines = text.split('\\n');\n\n if (shadowBlur !== 0) {\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n ctx.shadowBlur = Math.min(shadowBlur, MAX_SHADOW_BLUR_SIZE);\n ctx.shadowColor = data.strokeColor;\n }\n\n ctx.translate(xPos + data.offsetX, lineHeight * multiplier + data.offsetY);\n ctx.rotate((Math.min(data.rotate, MAX_ROTATE) * Math.PI) / 180);\n\n // First draw each line with shadow.\n textLines.forEach((text, index) => ctx.fillText(text, 0, index * lineHeight));\n\n // Since shadows of multiline text may be drawn over letters of neighbour lines\n // (when shadow blur is big enough), re-draw text without shadows.\n if (shadowBlur !== 0) {\n ctx.shadowBlur = 0;\n textLines.forEach((text, index) => ctx.fillText(text, 0, index * lineHeight));\n }\n\n if (data.strokeWidth > 0) {\n ctx.lineWidth = Math.min(data.strokeWidth, MAX_STROKE_WIDTH);\n textLines.forEach((text, index) => ctx.strokeText(text, 0, index * lineHeight));\n }\n\n ctx.restore();\n });\n\n return this;\n }\n\n clear() {\n this.#ctx.clearRect(0, 0, this.#canvas.width, this.#canvas.height);\n return this;\n }\n\n show() {\n this.#canvas.hidden = false;\n return this;\n }\n\n hide() {\n this.#canvas.hidden = true;\n return this;\n }\n\n static createInstance(canvasEl) {\n return new Canvas(canvasEl);\n }\n}\n"],"names":["$9e9d3488b14d9168$var$promise","$9e9d3488b14d9168$var$baselineEmojiWidth","$parcel$interopDefault","a","__esModule","default","$736431a7b9521865$var$assertNonEmptyString","str","Error","$736431a7b9521865$var$assertNumber","number","$736431a7b9521865$var$STORE_EMOJI","$736431a7b9521865$var$STORE_KEYVALUE","$736431a7b9521865$var$STORE_FAVORITES","$736431a7b9521865$var$INDEX_TOKENS","$736431a7b9521865$var$INDEX_COUNT","$736431a7b9521865$var$INDEX_GROUP_AND_ORDER","$736431a7b9521865$var$KEY_ETAG","$736431a7b9521865$var$KEY_PREFERRED_SKINTONE","$736431a7b9521865$var$MODE_READONLY","$736431a7b9521865$var$MODE_READWRITE","$736431a7b9521865$var$INDEX_SKIN_UNICODE","$736431a7b9521865$var$uniqEmoji","emojis","$736431a7b9521865$var$uniqBy","arr","func","set","Set","res","item","key","has","add","push","_","unicode","$736431a7b9521865$var$openIndexedDBRequests","$736431a7b9521865$var$databaseCache","$736431a7b9521865$var$onCloseListeners","$736431a7b9521865$var$handleOpenOrDeleteReq","resolve","reject","req","onerror","error","onblocked","onsuccess","result","$736431a7b9521865$var$createDatabase","dbName","db","Promise","indexedDB","open","onupgradeneeded","e","oldVersion","$736431a7b9521865$var$initialMigration","createObjectStore","name","keyPath","indexes","store","indexName","multiEntry","Object","entries","createIndex","undefined","onclose","$736431a7b9521865$var$closeDatabase","$736431a7b9521865$var$dbPromise","storeName","readOnlyOrReadWrite","cb","txn","transaction","durability","objectStore","map","oncomplete","close","listeners","listener","$736431a7b9521865$var$irregularEmoticons","$736431a7b9521865$var$extractTokens","split","word","match","toLowerCase","replace","filter","Boolean","$736431a7b9521865$var$normalizeTokens","length","$736431a7b9521865$var$callStore","method","target","$736431a7b9521865$var$getIDB","$736431a7b9521865$var$getAllIDB","$736431a7b9521865$var$commit","commit","$736431a7b9521865$var$findCommonMembers","arrays","uniqByFunc","shortestArray","$736431a7b9521865$var$minBy","array","minItem","i","results","some","findIndex","$736431a7b9521865$var$isEmpty","$736431a7b9521865$var$get","$736431a7b9521865$var$hasData","url","eTag","oldETag","oldUrl","all","$736431a7b9521865$var$doFullDatabaseScanForSingleResult","predicate","emojiStore","lastKey","processNextBatch","getAll","IDBKeyRange","lowerBound","$736431a7b9521865$var$loadData","emojiData","transformedData","annotation","emoticon","group","order","shortcodes","skins","tags","emoji","version","tokens","flat","sort","tone","skinTones","skinUnicodes","skinVersions","metaStore","todo","checkFetched","onFetched","data","clear","put","$736431a7b9521865$var$getEmojiByGroup","range","bound","index","$736431a7b9521865$var$getEmojiBySearchQuery","query","intermediateResults","checkDone","onDone","b","token","only","$736431a7b9521865$var$getEmojiByShortcode","shortcode","lowerShortcodes","includes","$736431a7b9521865$var$getEmojiByUnicode","$736431a7b9521865$var$requiredKeys$1","$736431a7b9521865$var$customEmojiIndex","customEmojis","$736431a7b9521865$var$assertCustomEmojis","isArray","Array","firstItemIsFaulty","sortByName","searchTrie","$736431a7b9521865$var$trie","itemToTokens","Map","currentMap","char","charAt","nextMap","get","valuesAtCoda","exact","queue","value","shift","searchByExactMatch","searchByPrefix","shortcodeToEmoji","nameToEmoji","customEmoji","search","byShortcode","byName","$736431a7b9521865$var$isFirefoxContentScript","wrappedJSObject","$736431a7b9521865$var$cleanEmoji","structuredClone","len","$736431a7b9521865$var$warnETag","console","warn","$736431a7b9521865$var$requiredKeys","$736431a7b9521865$var$assertStatus","response","dataSource","Math","floor","status","$736431a7b9521865$var$getETag","fetch","headers","$736431a7b9521865$var$getETagAndData","json","$736431a7b9521865$var$assertEmojiData","$736431a7b9521865$var$jsonChecksum","object","inBuffer","$736431a7b9521865$var$binaryStringToArrayBuffer","binary","buf","ArrayBuffer","Uint8Array","charCodeAt","JSON","stringify","btoa","$736431a7b9521865$var$arrayBufferToBinaryString","buffer","bytes","byteLength","String","fromCharCode","crypto","subtle","digest","$736431a7b9521865$var$checkForUpdates","eTagAndData","$736431a7b9521865$var$loadDataForFirstTime","$736431a7b9521865$export$2e2bcd8739ae039","constructor","locale","_dbName","_db","_lazyUpdate","_custom","_clear","bind","_ready","_init","ready","checkReady","getEmojiByGroup","getEmojiBySearchQuery","getEmojiByShortcode","getEmojiByUnicodeOrName","unicodeOrName","getPreferredSkinTone","setPreferredSkinTone","skinTone","incrementFavoriteEmojiCount","getTopFavoriteEmoji","limit","customEmojiIndex","favoritesStore","openCursor","cursor","addResult","continue","primaryKey","custom","_shutdown","err","delete","deleteDatabase","$9e9d3488b14d9168$var$allGroups","id","$9e9d3488b14d9168$var$groups","slice","$9e9d3488b14d9168$var$rIC","requestIdleCallback","setTimeout","$9e9d3488b14d9168$var$hasZwj","$9e9d3488b14d9168$var$versionsAndTestEmoji","$9e9d3488b14d9168$var$MOST_COMMONLY_USED_EMOJI","$9e9d3488b14d9168$var$FONT_FAMILY","$9e9d3488b14d9168$var$DEFAULT_CATEGORY_SORTING","$9e9d3488b14d9168$var$getTextFeature","text","color","canvas","document","createElement","width","height","ctx","getContext","willReadFrequently","textBaseline","font","fillStyle","scale","fillText","getImageData","$9e9d3488b14d9168$var$compareFeatures","feature1","feature2","feature1Str","join","startsWith","$9e9d3488b14d9168$var$detectEmojiSupportLevel","$9e9d3488b14d9168$var$determineEmojiSupportLevel","$9e9d3488b14d9168$var$testColorEmojiSupported","$9e9d3488b14d9168$var$supportedZwjEmojis","$9e9d3488b14d9168$var$halt","event","preventDefault","stopPropagation","$9e9d3488b14d9168$var$incrementOrDecrement","decrement","val","$9e9d3488b14d9168$var$uniqBy","$9e9d3488b14d9168$var$rAF","requestAnimationFrame","$9e9d3488b14d9168$var$resizeObserverSupported","ResizeObserver","$9e9d3488b14d9168$var$calculateTextWidth","node","createRange","selectNode","firstChild","getBoundingClientRect","$9e9d3488b14d9168$var$getFromMap","cache","cached","$9e9d3488b14d9168$var$parseCache","WeakMap","$9e9d3488b14d9168$var$domInstancesCache","$9e9d3488b14d9168$var$unkeyedSymbol","Symbol","$9e9d3488b14d9168$var$hasReplaceChildren","Element","prototype","$9e9d3488b14d9168$var$applyBindings","bindings","element","instanceBindings","binding","targetNode","attributeName","instanceBinding","targetParentNode","currentExpression","$9e9d3488b14d9168$var$qM","queueMicrotask","callback","then","$9e9d3488b14d9168$var$arraysAreEqualByFunction","left","right","areEqualFunc","$9e9d3488b14d9168$var$intersectionObserverCache","$9e9d3488b14d9168$var$EMPTY_ARRAY","assign","$9e9d3488b14d9168$var$assign","$bf4f0cf05f6fd378$var$browserSupportsTextareaTextNodes","$9e9d3488b14d9168$var$enI18n","categoriesLabel","emojiUnsupportedMessage","favoritesLabel","loadingMessage","networkErrorMessage","regionLabel","searchDescription","searchLabel","searchResultsLabel","skinToneDescription","skinToneLabel","skinTonesLabel","categories","activities","objects","symbols","flags","$9e9d3488b14d9168$var$PROPS","$9e9d3488b14d9168$var$EXTRA_STYLES","$9e9d3488b14d9168$export$2e2bcd8739ae039","HTMLElement","props","attachShadow","mode","style","prop","textContent","$9e9d3488b14d9168$var$baseStyles","shadowRoot","appendChild","_ctx","skinToneEmoji","customCategorySorting","i18n","emojiVersion","hasOwnProperty","call","_dbFlush","connectedCallback","_cmp","$9e9d3488b14d9168$var$createRoot","refs","abortController","AbortController","abortSignal","signal","state","createEffect","$9e9d3488b14d9168$var$createState","currentObserver","queued","destroyed","propsToObservers","dirtyObservers","flush","observersToRun","observer","size","Proxy","observers","newValue","addEventListener","runnable","oldObserver","actionContext","database","initialLoad","currentEmojis","currentEmojisWithCategories","rawSearchText","searchText","searchMode","activeSearchItem","message","skinTonePickerExpanded","skinTonePickerExpandedAfterAnimation","currentSkinTone","activeSkinTone","skinToneButtonText","pickerStyle","skinToneButtonLabel","currentFavorites","defaultFavoriteEmojis","numColumns","isRtl","currentGroupIndex","groups","databaseLoaded","activeSearchItemId","currentGroup","focus","getElementById","emojiToDomNode","fireEvent","detail","rootElement","dispatchEvent","CustomEvent","bubbles","composed","compareEmojiArrays","compareCurrentEmojisWithCategories","category","aCategory","aEmojis","bCategory","bEmojis","updateCurrentEmojis","newEmojis","updateSearchMode","newSearchMode","updateCurrentEmojisWithCategories","newEmojisWithCategories","unicodeWithSkin","helpers","labelWithSkin","$9e9d3488b14d9168$var$uniq","titleForEmoji","events","onClickSkinToneButton","onEmojiClick","onNavClick","closestTarget","closest","groupId","parseInt","dataset","searchElement","onNavKeydown","doFocus","el","previousElementSibling","nextElementSibling","parentElement","firstElementChild","lastElementChild","onSearchKeydown","goToNextOrPrevious","previous","clickEmoji","onSkinToneOptionsClick","changeSkinTone","onSkinToneOptionsFocusOut","onSkinToneOptionsKeydown","changeActiveSkinTone","nextSkinTone","onSkinToneOptionsKeyup","onSearchInput","actions","calculateEmojiGridStyle","onUpdate","resizeObserver","getComputedStyle","newNumColumns","getPropertyValue","newIsRtl","observe","disconnect","updateOnIntersection","$9e9d3488b14d9168$var$intersectionObserverAction","root","IntersectionObserver","rootMargin","threshold","isIntersecting","classList","toggle","firstRender","updateCustomEmoji","databaseCustomEmoji","$9e9d3488b14d9168$var$render","container","html","$9e9d3488b14d9168$var$createFramework","domInstances","domInstanceCacheKey","keyFunction","originalCacheKey","expressions","domInstancesForTokens","updateDomInstance","$9e9d3488b14d9168$var$parseHtml","template","elementsToBindings","$9e9d3488b14d9168$var$parse","htmlString","withinTag","withinAttribute","elementIndexCounter","elementIndexes","attributeValuePre","attributeValuePost","j","nextChar","pop","exec","expressionIndex","$9e9d3488b14d9168$var$parseTemplate","innerHTML","dom","cloneNode","content","$9e9d3488b14d9168$var$traverseAndSetupBindings","topLevelBindings","treeWalker","createTreeWalker","NodeFilter","SHOW_ELEMENT","elementIndex","nextNode","$9e9d3488b14d9168$var$patch","expression","setAttribute","newNode","$9e9d3488b14d9168$var$patchChildren","newChildren","needsRerender","$9e9d3488b14d9168$var$doChildrenNeedRerender","parentNode","oldChild","oldChildrenCount","newChild","nextSibling","$9e9d3488b14d9168$var$replaceChildren","replaceChildren","append","replaceWith","nodeValue","emojiList","prefix","rootDom","emojiWithCategory","ceil","forElementWithAttribute","querySelectorAll","getAttribute","eventName","listenerName","ref","removeChild","action","boundActions","WeakSet","level","handleDatabaseLoading","showingLoadingMessage","timeoutHandle","clearTimeout","updatePreferredSkinTone","fill","$9e9d3488b14d9168$var$applySkinTone","zwjIndex","indexOf","substring","fromCodePoint","$9e9d3488b14d9168$var$LIGHT_SKIN_TONE","endsWith","$9e9d3488b14d9168$var$LIGHT_SKIN_TONE_MODIFIER","updateDefaultFavoriteEmojis","favs","updateFavorites","dbFavorites","favorites","summarizeEmojis","updateEmojis","getEmojisBySearchQuery","currentGroupId","getEmojisByGroup","resetScrollTopInRaf","tabpanelElement","scrollTop","isZwjSupported","filterEmojisByVersion","emojiSupportLevel","$9e9d3488b14d9168$var$summarizeEmojisForUI","toSimpleSkinsMap","skin","emojiSummary","find","skinTonedUnicode","contains","relatedTarget","zwjEmojisToCheck","$9e9d3488b14d9168$var$checkZwjSupport","baselineEmoji","allSupported","emojiWidth","supported","calculateCurrentEmojisWithCategories","categoriesToEmoji","trim","skinToneDropdown","once","$set","newState","$destroy","abort","disconnectedCallback","isConnected","catch","observedAttributes","attributeChangedCallback","attrName","oldValue","_set","up","toUpperCase","parseFloat","_dbCreate","$9e9d3488b14d9168$var$definitions","$bf4f0cf05f6fd378$var$canManipulateViaTextNodes","input","nodeName","textarea","defineProperties","customElements","define","$bf4f0cf05f6fd378$export$2e2bcd8739ae039","selection","ieRange","collapse","select","execCommand","start","selectionStart","end","selectionEnd","setRangeText","textNode","createTextNode","offset","startNode","endNode","nodeLength","setStart","setEnd","deleteContents","commonAncestorContainer","insertNode","setSelectionRange","createEvent","initEvent","$dced0d224c6d876e$var$c","r","t","Number","isNaN","min","max","$dced0d224c6d876e$var$a","$dced0d224c6d876e$var$d","$dced0d224c6d876e$var$u","$dced0d224c6d876e$export$cc30a98fe3890794","n","h","getSupportedConstraints","s","getTrackCapabilities","u","o","pan","tilt","zoom","torch","querySelector","m","c","d","l","isSupported","autoPlay","startVideoStream","stopVideoStream","removeEventListener","hasAttribute","toggleAttribute","noImage","facingMode","cameraResolution","toString","calculateFileSize","loading","capture","play","video","finally","removeAttribute","getVideoTracks","getTrackSettings","applyConstraints","advanced","assignedElements","flatten","ideal","audio","deviceId","navigator","mediaDevices","getUserMedia","srcObject","restartVideoStream","stop","videoWidth","videoHeight","drawImage","toDataURL","Image","src","alt","dataURI","blob","getCapabilities","getSettings","getVideoInputDevices","enumerateDevices","kind","defineCustomElement","window","$7a2aca835bb05064$export$c37129e465f64ef0","canShare","$cd62c5572235e737$var$h","$cd62c5572235e737$var$r","$cd62c5572235e737$export$30b344bef3e55b67","delegatesFocus","disabled","part","shareUrl","shareTitle","shareText","shareFiles","share","title","files","shareData","$d9c5053bade2d3f8$var$n","$d9c5053bade2d3f8$var$r","$d9c5053bade2d3f8$export$32589115725b904b","showModal","body","preserveOverflow","overflow","hidden","noHeader","noAnimations","noCloseButton","g","staticBackdrop","fullscreen","placement","closeLabel","remove","defaultPrevented","currentTarget","hide","assignedNodes","cancelable","reason","show","$9351176e8d763a78$var$x","$9351176e8d763a78$var$b","$9351176e8d763a78$var$y","lastIndexOf","type","defineProperty","writable","configurable","enumerable","$9351176e8d763a78$var$g","path","webkitRelativePath","$9351176e8d763a78$var$m","readEntries","$9351176e8d763a78$var$w","$9351176e8d763a78$var$E","file","fullPath","$9351176e8d763a78$var$F","getAsEntry","webkitGetAsEntry","isFile","isDirectory","createReader","$9351176e8d763a78$var$f","$9351176e8d763a78$var$l","dataTransfer","items","$9351176e8d763a78$var$n","$9351176e8d763a78$var$v","$9351176e8d763a78$var$z","$9351176e8d763a78$var$S","$9351176e8d763a78$export$6ccd1735166caad9","accept","multiple","autoFocus","maxFiles","abs","maxSize","minSize","noStyle","Event","dropEffect","click","errors","code","$9351176e8d763a78$var$u","test","p","acceptedFiles","rejectedFiles","defaultValue","openFileDialog","$65136e012e05e2d7$export$63e7bed68b07a85c","$17004b28c97c1306$export$e2a22331486dcca0","suffix","randomString","random","$2669cb7c28251d2a$export$6539e087749cf9d3","options","mimeType","File","filename","$9e093dbdf49c6d51$var$DEFAULT_STORAGE_PROVIDER","localStorage","$9e093dbdf49c6d51$export$ddcffe0146c8f882","keyPrefix","provider","sessionStorage","setItem","getItem","parse","$c38b15b964e67d8b$export$de75f46579dcf24","selectedImage","$e42bddb24cbeb64a$exports","URL","$73cffea1ce7b4c65$exports","$7ffd9e1ede1ff6e8$exports","$4c6967df0d437c45$exports","$3b8ba92249dba9f8$exports","$6ae2d9e238daf807$exports","$16764e62b86810da$exports","$d78526ca6254cbd7$exports","$2ba9f93d92a312e8$exports","$94512d98527e27c0$exports","$0ef27a7a117f4923$exports","$56b863c8b6be7003$export$6874249d87f2602a","label","weight","$56b863c8b6be7003$export$59eceaef0c7797b2","FontFace","load","fonts","$3969451ff60cb8d5$var$errorsContainer","$3969451ff60cb8d5$var$hideError","evt","$3969451ff60cb8d5$export$af04143326425dbd","types","div","className","$a5e4a78f80aa8693$var$defaultTextboxData","fillColor","strokeColor","fontSize","fontWeight","textAlign","shadowBlur","strokeWidth","offsetY","offsetX","rotate","allCaps","$a5e4a78f80aa8693$var$textboxes","$a5e4a78f80aa8693$export$8e3dca5fa4d5f04b","Date","now","textbox","getData","create","getById","fragment","createDocumentFragment","forEach","checked","textboxEl","$9b58d7721ff4a93e$export$8d01c972ee8b14a9","canvasEl","getDimensions","setDimensions","draw","image","textboxes","clearRect","fillRect","multiplier","save","strokeStyle","lineHeight","measureText","xPos","textLines","shadowOffsetX","shadowOffsetY","shadowColor","translate","PI","lineWidth","strokeText","restore","createInstance","$85a5f86b715fe7db$var$canvas","$85a5f86b715fe7db$var$videoModal","$85a5f86b715fe7db$var$downloadModal","$85a5f86b715fe7db$var$capturePhotoEl","$85a5f86b715fe7db$var$cameraSelect","$85a5f86b715fe7db$var$capturePhotoButton","$85a5f86b715fe7db$var$torchButton","$85a5f86b715fe7db$var$dropzoneEl","$85a5f86b715fe7db$var$instructionsEl","$85a5f86b715fe7db$var$imageUploadMethodSelect","$85a5f86b715fe7db$var$fileSelectBtn","$85a5f86b715fe7db$var$imageUrlForm","$85a5f86b715fe7db$var$addTextboxBtn","$85a5f86b715fe7db$var$textboxesContainer","$85a5f86b715fe7db$var$generateMemeBtn","$85a5f86b715fe7db$var$openVideoModalBtn","$85a5f86b715fe7db$var$downloadMemeBtn","$85a5f86b715fe7db$var$downloadMemePreview","$85a5f86b715fe7db$var$webShareComponent","$85a5f86b715fe7db$var$galleryEl","$85a5f86b715fe7db$var$gallerySearchEl","$85a5f86b715fe7db$var$galleryNoResultsEl","$85a5f86b715fe7db$var$solidColorForm","$85a5f86b715fe7db$var$uploadMethodEls","$85a5f86b715fe7db$var$removeConfirmationModal","$85a5f86b715fe7db$var$removeTextForm","$85a5f86b715fe7db$var$maxImageDimensionsForm","$85a5f86b715fe7db$var$maxImageDimensionsSelect","$85a5f86b715fe7db$var$clearCanvasBtn","$85a5f86b715fe7db$var$maxImageDimensionsFromStorage","$85a5f86b715fe7db$var$shouldFocusOnTextboxCreate","$85a5f86b715fe7db$var$selectedImage","$85a5f86b715fe7db$var$reqAnimFrame","$85a5f86b715fe7db$var$generateMeme","dataUrl","downloadLink","download","href","$85a5f86b715fe7db$var$setImageMaxDimensions","maxWidthValue","maxHeightValue","maxImageDimensionsSelect","MAX_WIDTH","MAX_HEIGHT","$85a5f86b715fe7db$var$afterImageSelect","$85a5f86b715fe7db$var$handleImageLoad","$85a5f86b715fe7db$var$handleFileSelect","reader","FileReader","readAsDataURL","$85a5f86b715fe7db$var$handleTextPropChange","textboxId","textboxData","$85a5f86b715fe7db$var$handleImageUploadFromURL","form","submitButton","imageUrl","$85a5f86b715fe7db$var$moveTextUsingArrowbuttons","direction","offsetYInput","offsetXInput","$85a5f86b715fe7db$var$handleGalleryClick","button","img","$85a5f86b715fe7db$var$toggleTorchButtonStatus","isTorchOn","iconPaths","display","$85a5f86b715fe7db$var$handleCapturePhotoVideoPlay","trackCapabilities","videoInputDevices","device","option","errorMessage","reset","idx","matches","textboxSettingsEl","currentTextboxEl","currentTextboxData","textboxToDelete","textboxIdInput","cancelAnimationFrame","galleryItems","videoDeviceId","$85a5f86b715fe7db$var$renderAcceptedImageFormats","acceptedMimeTypes","rootEl","extensions","small","browserSupportsTextareaTextNodes","canManipulateViaTextNodes","isSuccess","clamp","lower","upper","COMPONENT_NAME","styles","CapturePhoto","_CapturePhoto","#supportedConstraints","#stream","#canvasElement","#outputElement","#videoElement","#captureButtonSlot","#captureButton","#emptyOutputElement","panInAllowedRange","#applyConstraint","tiltInAllowedRange","zoomInAllowedRange","#upgradeProperty","#getCaptureButton","#onVideoLoadedMetaData","#onCaptureButtonSlotChange","#onCapturePhotoButtonClick","constraint","track","trackSettings","constraintValue","instance","videoInputId","constraints","x","eventDetail","elementName","isWebShareSupported","WebShare","_WebShare","#buttonSlot","#buttonEl","#files","#getButton","#handleSlotChange","#handleClick","ModalElement","_ModalElement","#dialogEl","#footerSlotEl","#closeSlotEl","#pulseAnimationTimeout","headerEl","closeBtnEl","#updateCloseLabel","#handleDialogClick","#handleDialogClose","#handleDialogCancel","#handleCloseButtonClick","#handleFooterSlotChange","#handleCloseSlotChange","closeButtonEl","#applyPulseEffectOnDialog","requestCloseEvent","#createRequestCloseEvent","footerEl","footerSlotNodes","hasFooterSlotNodes","isValidFile","acceptedTypeSpecifiers","acceptedMimeTypesList","v","fileMimeType","baseMimeType","validType","COMMON_MIME_TYPES","FILES_TO_IGNORE","toFileWithMimeType","extension","toFileWithPath","fileWithMimeType","readEntriesPromise","directoryReader","readAllDirectoryEntries","getFileFromFileEntry","fileEntry","getFilesFromDataTransferItemList","dataTransferItemList","entry","getFilesFromFileList","fileList","getFilesFromEvent","TOO_MANY_FILES","FILE_TOO_LARGE","FILE_TOO_SMALL","INVALID_MIME_TYPE","FilesDropzone","_FilesDropzone","#fileInput","#dropzoneEl","#handleFileInputChange","#handleDragEnter","#handleDragOver","#handleDragLeave","#handleDrop","#handleKeyUp","num","#handleFilesSelect","filesLength","fileHasValidType","fileExceedsMaxSize","fileIsSmallerThanMinSize"],"version":3,"file":"index.4434df8a.js.map"} \ No newline at end of file diff --git a/index.6d86f4dd.js b/index.6d86f4dd.js deleted file mode 100644 index ccf99aa..0000000 --- a/index.6d86f4dd.js +++ /dev/null @@ -1,511 +0,0 @@ -!function(){let e,t;function o(e){return e&&e.__esModule?e.default:e}var i,n="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},a={},r={},s=n.parcelRequire5078;function l(e){if("string"!=typeof e||!e)throw Error("expected a non-empty string, got: "+e)}function d(e){if("number"!=typeof e)throw Error("expected a number, got: "+e)}null==s&&((s=function(e){if(e in a)return a[e].exports;if(e in r){var t=r[e];delete r[e];var o={id:e,exports:{}};return a[e]=o,t.call(o.exports,o,o.exports),o.exports}var i=Error("Cannot find module '"+e+"'");throw i.code="MODULE_NOT_FOUND",i}).register=function(e,t){r[e]=t},n.parcelRequire5078=s),s.register;let c="emoji",u="keyvalue",h="favorites",m="tokens",p="count",g="group-order",b="eTag",f="skinTone",v="readonly",y="readwrite",w="skinUnicodes";function k(e){return function(e,t){let o=new Set,i=[];for(let n of e){let e=t(n);o.has(e)||(o.add(e),i.push(n))}return i}(e,e=>e.unicode)}let E={},x={},S={};function C(e,t,o){o.onerror=()=>t(o.error),o.onblocked=()=>t(Error("IDB blocked")),o.onsuccess=()=>e(o.result)}async function j(e){let t=await new Promise((t,o)=>{let i=indexedDB.open(e,1);E[e]=i,i.onupgradeneeded=e=>{e.oldVersion<1&&function(e){function t(t,o,i){let n=o?e.createObjectStore(t,{keyPath:o}):e.createObjectStore(t);if(i)for(let[e,[t,o]]of Object.entries(i))n.createIndex(e,t,{multiEntry:o});return n}t(u),t(c,"unicode",{[m]:["tokens",!0],[g]:[["group","order"]],[w]:["skinUnicodes",!0]}),t(h,void 0,{[p]:[""]})}(i.result)},C(t,o,i)});return t.onclose=()=>A(e),t}function T(e,t,o,i){return new Promise((n,a)=>{let r;let s=e.transaction(t,o,{durability:"relaxed"});i("string"==typeof t?s.objectStore(t):t.map(e=>s.objectStore(e)),s,e=>{r=e}),s.oncomplete=()=>n(r),s.onerror=()=>a(s.error)})}function A(e){let t=E[e],o=t&&t.result;if(o){o.close();let t=S[e];if(t)for(let e of t)e()}delete E[e],delete x[e],delete S[e]}let L=new Set([":D","XD",":'D","O:)",":X",":P",";P","XP",":L",":Z",":j","8D","XO","8)",":B",":O",":S",":'o","Dx","X(","D:",":C",">0)",":3","!e.match(/\w/)||L.has(e)?e.toLowerCase():e.replace(/[)(:,]/g,"").replace(/’/g,"'").toLowerCase()).filter(Boolean)}function D(e){return e.filter(Boolean).map(e=>e.toLowerCase()).filter(e=>e.length>=2)}function _(e,t,o,i){e[t](o).onsuccess=e=>i&&i(e.target.result)}function $(e,t,o){_(e,"get",t,o)}function I(e,t,o){_(e,"getAll",t,o)}function B(e){e.commit&&e.commit()}function R(e,t){let o=function(e,t){let o=e[0];for(let i=1;it(n)&&(o=n)}return o}(e,e=>e.length),i=[];for(let n of o)e.some(e=>-1===e.findIndex(e=>t(e)===t(n)))||i.push(n);return i}async function M(e){return!await W(e,u,"url")}async function N(e,t,o){let[i,n]=await Promise.all([b,"url"].map(t=>W(e,u,t)));return i===o&&n===t}async function F(e,t){return T(e,c,v,(e,o,i)=>{let n;let a=()=>{e.getAll(n&&IDBKeyRange.lowerBound(n,!0),50).onsuccess=e=>{let o=e.target.result;for(let e of o)if(n=e.unicode,t(e))return i(e);if(o.length<50)return i();a()}};a()})}async function O(e,t,o,i){{let n=t.map(({annotation:e,emoticon:t,group:o,order:i,shortcodes:n,skins:a,tags:r,emoji:s,version:l})=>{let d=[...new Set(D([...(n||[]).map(z).flat(),...r.map(z).flat(),...z(e),t]))].sort(),c={annotation:e,group:o,order:i,tags:r,tokens:d,unicode:s,version:l};if(t&&(c.emoticon=t),n&&(c.shortcodes=n),a)for(let{tone:e,emoji:t,version:o}of(c.skinTones=[],c.skinUnicodes=[],c.skinVersions=[],a))c.skinTones.push(e),c.skinUnicodes.push(t),c.skinVersions.push(o);return c});await T(e,[c,u],y,([e,t],a)=>{let r,s;let l=0;function d(){2==++l&&function(){if(r!==i||s!==o){for(let t of(e.clear(),n))e.put(t);t.put(i,b),t.put(o,"url"),B(a)}}()}$(t,b,e=>{r=e,d()}),$(t,"url",e=>{s=e,d()})})}}async function P(e,t){return T(e,c,v,(e,o,i)=>{let n=IDBKeyRange.bound([t,0],[t+1,0],!1,!0);I(e.index(g),n,i)})}async function U(e,t){let o=D(z(t));return o.length?T(e,c,v,(e,t,i)=>{let n=[],a=()=>{n.length===o.length&&r()},r=()=>{i(R(n,e=>e.unicode).sort((e,t)=>e.order{n.push(e),a()})}}):[]}async function q(e,t){let o=await U(e,t);return o.length?o.filter(e=>(e.shortcodes||[]).map(e=>e.toLowerCase()).includes(t.toLowerCase()))[0]||null:await F(e,e=>(e.shortcodes||[]).includes(t.toLowerCase()))||null}async function H(e,t){return T(e,c,v,(e,o,i)=>$(e,t,o=>{if(o)return i(o);$(e.index(w),t,e=>i(e||null))}))}function W(e,t,o){return T(e,t,v,(e,t,i)=>$(e,o,i))}let V=["name","url"];function G(e){!function(e){let t=e&&Array.isArray(e),o=t&&e.length&&(!e[0]||V.some(t=>!(t in e[0])));if(!t||o)throw Error("Custom emojis are in the wrong format")}(e);let t=(e,t)=>e.name.toLowerCase(){let i=o;for(let t=0;te[0][...new Set((e.shortcodes||[]).map(e=>z(e)).flat())]),n=e=>i(e,!0),a=e=>i(e,!1),r=new Map,s=new Map;for(let t of e)for(let e of(s.set(t.name.toLowerCase(),t),t.shortcodes||[]))r.set(e.toLowerCase(),t);return{all:o,search:e=>{let o=z(e);return R(o.map((e,t)=>(te.name).sort(t)},byShortcode:e=>r.get(e.toLowerCase()),byName:e=>s.get(e.toLowerCase())}}let X="undefined"!=typeof wrappedJSObject;function Y(e){if(!e)return e;if(X&&(e=structuredClone(e)),delete e.tokens,e.skinTones){let t=e.skinTones.length;e.skins=Array(t);for(let o=0;o!(t in e[0])))throw Error("Emoji data is in the wrong format")}(i),[o,i]}async function et(e){let t=function(e){for(var t=e.length,o=new ArrayBuffer(t),i=new Uint8Array(o),n=-1;++n(this._ready||(this._ready=this._init()),this._ready);await e(),this._db||await e()}async getEmojiByGroup(e){return d(e),await this.ready(),k(await P(this._db,e)).map(Y)}async getEmojiBySearchQuery(e){return l(e),await this.ready(),[...this._custom.search(e),...k(await U(this._db,e)).map(Y)]}async getEmojiByShortcode(e){return l(e),await this.ready(),this._custom.byShortcode(e)||Y(await q(this._db,e))}async getEmojiByUnicodeOrName(e){return l(e),await this.ready(),this._custom.byName(e)||Y(await H(this._db,e))}async getPreferredSkinTone(){return await this.ready(),await W(this._db,u,f)||0}async setPreferredSkinTone(e){return d(e),await this.ready(),T(this._db,u,y,(t,o)=>{t.put(e,f),B(o)})}async incrementFavoriteEmojiCount(e){return l(e),await this.ready(),T(this._db,h,y,(t,o)=>$(t,e,i=>{t.put((i||0)+1,e),B(o)}))}async getTopFavoriteEmoji(e){var t,o;return d(e),await this.ready(),(await (t=this._db,o=this._custom,0===e?[]:T(t,[h,c],v,([t,i],n,a)=>{let r=[];t.index(p).openCursor(void 0,"prev").onsuccess=t=>{let n=t.target.result;if(!n)return a(r);function s(t){if(r.push(t),r.length===e)return a(r);n.continue()}let l=n.primaryKey,d=o.byName(l);if(d)return s(d);$(i,l,e=>{if(e)return s(e);n.continue()})}}))).map(Y)}set customEmoji(e){this._custom=G(e)}get customEmoji(){return this._custom.all}async _shutdown(){await this.ready();try{await this._lazyUpdate}catch(e){}}_clear(){this._db=this._ready=this._lazyUpdate=void 0}async close(){await this._shutdown(),await A(this._dbName)}async delete(){var e;await this._shutdown(),await (e=this._dbName,new Promise((t,o)=>{A(e),C(t,o,indexedDB.deleteDatabase(e))}))}}let ea=[[-1,"✨","custom"],[0,"\uD83D\uDE00","smileys-emotion"],[1,"\uD83D\uDC4B","people-body"],[3,"\uD83D\uDC31","animals-nature"],[4,"\uD83C\uDF4E","food-drink"],[5,"\uD83C\uDFE0️","travel-places"],[6,"⚽","activities"],[7,"\uD83D\uDCDD","objects"],[8,"⛔️","symbols"],[9,"\uD83C\uDFC1","flags"]].map(([e,t,o])=>({id:e,emoji:t,name:o})),er=ea.slice(1),es="function"==typeof requestIdleCallback?requestIdleCallback:setTimeout;function el(e){return e.unicode.includes("‍")}let ed={"\uD83E\uDEE8":15.1,"\uD83E\uDEE0":14,"\uD83E\uDD72":13.1,"\uD83E\uDD7B":12.1,"\uD83E\uDD70":11,"\uD83E\uDD29":5,"\uD83D\uDC71‍♀️":4,"\uD83E\uDD23":3,"\uD83D\uDC41️‍\uD83D\uDDE8️":2,"\uD83D\uDE00":1,"\uD83D\uDE10️":.7,"\uD83D\uDE03":.6},ec=["\uD83D\uDE0A","\uD83D\uDE12","❤️","\uD83D\uDC4D️","\uD83D\uDE0D","\uD83D\uDE02","\uD83D\uDE2D","☺️","\uD83D\uDE14","\uD83D\uDE29","\uD83D\uDE0F","\uD83D\uDC95","\uD83D\uDE4C","\uD83D\uDE18"],eu='"Twemoji Mozilla","Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji","EmojiOne Color","Android Emoji",sans-serif',eh=(e,t)=>et?1:0,em=(e,t)=>{let o=document.createElement("canvas");o.width=o.height=1;let i=o.getContext("2d");return i.textBaseline="top",i.font=`100px ${eu}`,i.fillStyle=t,i.scale(.01,.01),i.fillText(e,0,0),i.getImageData(0,0,1,1).data},ep=(e,t)=>{let o=[...e].join(",");return o===[...t].join(",")&&!o.startsWith("0,0,0,")},eg=()=>(e||(e=new Promise(e=>es(()=>e(function(){let e=Object.entries(ed);try{for(let[t,o]of e)if(function(e){let t=em(e,"#000"),o=em(e,"#fff");return t&&o&&ep(t,o)}(t))return o}catch(e){}finally{}return e[0][1]}())))),e),eb=new Map;function ef(e){e.preventDefault(),e.stopPropagation()}function ev(e,t,o){return(t+=e?-1:1)<0?t=o.length-1:t>=o.length&&(t=0),t}function ey(e,t){let o=new Set,i=[];for(let n of e){let e=t(n);o.has(e)||(o.add(e),i.push(n))}return i}let ew=requestAnimationFrame,ek="function"==typeof ResizeObserver;function eE(e){{let t=document.createRange();return t.selectNode(e.firstChild),t.getBoundingClientRect().width}}function ex(e,t,o){let i=e.get(t);return i||(i=o(),e.set(t,i)),i}let eS=new WeakMap,eC=new WeakMap,ej=Symbol("un-keyed"),eT="replaceChildren"in Element.prototype,eA="function"==typeof queueMicrotask?queueMicrotask:e=>Promise.resolve().then(e);function eL(e,t,o){if(e.length!==t.length)return!1;for(let i=0;i{if(i)return;let e=[...a];a.clear();try{for(let t of e)t()}finally{o=!1,a.size&&(o=!0,eA(r))}},s=new Proxy({},{get(e,o){if(t){let e=n.get(o);e||(e=new Set,n.set(o,e)),e.add(t)}return e[o]},set(e,t,i){e[t]=i;let s=n.get(t);if(s){for(let e of s)a.add(e);o||(o=!0,eA(r))}return!0}});return e.addEventListener("abort",()=>{i=!0}),{state:s,createEffect:e=>{let o=()=>{let i=t;t=o;try{return e()}finally{t=i}};return o()}}}(a);eD(r,{skinToneEmoji:void 0,i18n:void 0,database:void 0,customEmoji:void 0,customCategorySorting:void 0,emojiVersion:void 0}),eD(r,o),eD(r,{initialLoad:!0,currentEmojis:[],currentEmojisWithCategories:[],rawSearchText:"",searchText:"",searchMode:!1,activeSearchItem:-1,message:void 0,skinTonePickerExpanded:!1,skinTonePickerExpandedAfterAnimation:!1,currentSkinTone:0,activeSkinTone:0,skinToneButtonText:void 0,pickerStyle:void 0,skinToneButtonLabel:"",skinTones:[],currentFavorites:[],defaultFavoriteEmojis:void 0,numColumns:8,isRtl:!1,scrollbarWidth:0,currentGroupIndex:0,groups:er,databaseLoaded:!1,activeSearchItemId:void 0}),s(()=>{r.currentGroup!==r.groups[r.currentGroupIndex]&&(r.currentGroup=r.groups[r.currentGroupIndex])});let l=t=>{e.getElementById(t).focus()},d=t=>e.getElementById(`emo-${t.id}`),c=(e,t)=>{i.rootElement.dispatchEvent(new CustomEvent(e,{detail:t,bubbles:!0,composed:!0}))},u=(e,t)=>e.id===t.id,h=(e,t)=>{let{category:o,emojis:i}=e,{category:n,emojis:a}=t;return o===n&&eL(i,a,u)},m=e=>{eL(r.currentEmojis,e,u)||(r.currentEmojis=e)},p=e=>{r.searchMode!==e&&(r.searchMode=e)},g=e=>{eL(r.currentEmojisWithCategories,e,h)||(r.currentEmojisWithCategories=e)},b=(e,t)=>t&&e.skins&&e.skins[t]||e.unicode,f={labelWithSkin:(e,t)=>ey([e.name||b(e,t),e.annotation,...e.shortcodes||ez].filter(Boolean),e=>e).join(", "),titleForEmoji:e=>e.annotation||(e.shortcodes||ez).join(", "),unicodeWithSkin:b},v={onClickSkinToneButton:function(e){r.skinTonePickerExpanded=!r.skinTonePickerExpanded,r.activeSkinTone=r.currentSkinTone,r.skinTonePickerExpanded&&(ef(e),ew(()=>l("skintone-list")))},onEmojiClick:A,onNavClick:function(e){let{target:t}=e,o=t.closest(".nav-button");if(!o)return;let n=parseInt(o.dataset.groupId,10);i.searchElement.value="",r.rawSearchText="",r.searchText="",r.activeSearchItem=-1,r.currentGroupIndex=r.groups.findIndex(e=>e.id===n)},onNavKeydown:function(e){let{target:t,key:o}=e,i=t=>{t&&(ef(e),t.focus())};switch(o){case"ArrowLeft":return i(t.previousElementSibling);case"ArrowRight":return i(t.nextElementSibling);case"Home":return i(t.parentElement.firstElementChild);case"End":return i(t.parentElement.lastElementChild)}},onSearchKeydown:function(e){if(!r.searchMode||!r.currentEmojis.length)return;let t=t=>{ef(e),r.activeSearchItem=ev(t,r.activeSearchItem,r.currentEmojis)};switch(e.key){case"ArrowDown":return t(!1);case"ArrowUp":return t(!0);case"Enter":if(-1!==r.activeSearchItem)return ef(e),T(r.currentEmojis[r.activeSearchItem].id);r.activeSearchItem=0}},onSkinToneOptionsClick:function(e){let{target:{id:t}}=e,o=t&&t.match(/^skintone-(\d)/);o&&(ef(e),L(parseInt(o[1],10)))},onSkinToneOptionsFocusOut:z,onSkinToneOptionsKeydown:function(e){if(!r.skinTonePickerExpanded)return;let t=async t=>{ef(e),r.activeSkinTone=t};switch(e.key){case"ArrowUp":return t(ev(!0,r.activeSkinTone,r.skinTones));case"ArrowDown":return t(ev(!1,r.activeSkinTone,r.skinTones));case"Home":return t(0);case"End":return t(r.skinTones.length-1);case"Enter":return ef(e),L(r.activeSkinTone);case"Escape":return ef(e),r.skinTonePickerExpanded=!1,l("skintone-button")}},onSkinToneOptionsKeyup:function(e){if(r.skinTonePickerExpanded&&" "===e.key)return ef(e),L(r.activeSkinTone)},onSearchInput:function(e){r.rawSearchText=e.target.value}},y={calculateEmojiGridStyle:function(e){var t;let o;t=t=>{{let o=getComputedStyle(i.rootElement),n=parseInt(o.getPropertyValue("--num-columns"),10),a="rtl"===o.getPropertyValue("direction"),s=e.parentElement.getBoundingClientRect().width;r.numColumns=n,r.scrollbarWidth=s-t,r.isRtl=a}},ek?(o=new ResizeObserver(e=>t(e[0].contentRect.width))).observe(e):ew(()=>t(e.getBoundingClientRect().width)),a.addEventListener("abort",()=>{o&&o.disconnect()})}},w=!0;function k(){r.database.customEmoji=r.customEmoji||ez}function E(e){return!e.unicode||!el(e)||eb.get(e.unicode)}async function x(e){let t=r.emojiVersion||await eg();return e.filter(({version:e})=>!e||e<=t)}async function S(e){return function(e,t){let o=e=>{let o={};for(let i of e)"number"==typeof i.tone&&i.version<=t&&(o[i.tone]=i.unicode);return o};return e.map(({unicode:e,skins:t,shortcodes:i,url:n,name:a,category:r,annotation:s})=>({unicode:e,name:a,shortcodes:i,url:n,category:r,annotation:s,id:e||a,skins:t&&o(t)}))}(e,r.emojiVersion||await eg())}async function C(e){let t=-1===e?r.customEmoji:await r.database.getEmojiByGroup(e);return S(await x(t))}async function j(e){return S(await x(await r.database.getEmojiBySearchQuery(e)))}async function T(e){let t=await r.database.getEmojiByUnicodeOrName(e),o=[...r.currentEmojis,...r.currentFavorites].find(t=>t.id===e),i=o.unicode&&b(o,r.currentSkinTone);await r.database.incrementFavoriteEmojiCount(e),c("emoji-click",{emoji:t,skinTone:r.currentSkinTone,...i&&{unicode:i},...o.name&&{name:o.name}})}async function A(e){let{target:t}=e;t.classList.contains("emoji")&&(ef(e),T(t.id.substring(4)))}function L(e){r.currentSkinTone=e,r.skinTonePickerExpanded=!1,l("skintone-button"),c("skin-tone-change",{skinTone:e}),r.database.setPreferredSkinTone(e)}async function z(e){let{relatedTarget:t}=e;t&&"skintone-list"===t.id||(r.skinTonePickerExpanded=!1)}return s(()=>{(function(e,t,o,i,n,a,r,s){let{labelWithSkin:l,titleForEmoji:d,unicodeWithSkin:c}=o,{html:u,map:h}=function(e){let t=ex(eC,e,()=>new Map),o=ej;return{map:function(e,t,i){return e.map((e,n)=>{let a=o;o=i(e);try{return t(e,n)}finally{o=a}})},html:function(e,...i){let n=ex(t,e,()=>new Map);return ex(n,o,()=>(function(e){let{template:t,elementsToBindings:o}=ex(eS,e,()=>(function(e){let t="",o=!1,i=!1,n=-1,a=new Map,r=[];for(let s=0,l=e.length;s":o=!1,i=!1;break;case"=":i=!0}let m=ex(a,r[r.length-1],()=>[]);if(i){let t=/(\S+)="?([^"=]*)$/.exec(h);d=t[1],c=t[2],u=/^[^">]*/.exec(e[s+1])[0]}let p={attributeName:d,attributeValuePre:c,attributeValuePost:u,expressionIndex:s};m.push(p),o||i||(t+=" ")}return{template:function(e){let t=document.createElement("template");return t.innerHTML=e,t}(t),elementsToBindings:a}})(e)),i=t.cloneNode(!0).content.firstElementChild,n=function(e,t){let o=[],i=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),n=e,a=-1;do{let e=t.get(++a);if(e)for(let t=0;tu``,e=>`${i}-${e.id}`)}let p=u`
${t.i18n.searchDescription}
${t.i18n.skinToneDescription}
${h(t.skinTones,(e,o)=>u`
${e}
`,e=>e)}
${h(t.currentEmojisWithCategories,(e,o)=>u`
${m(e.emojis,t.searchMode,"emo")}
`,e=>e.category)}
`;if(s){e.appendChild(p);let t=(t,o)=>{for(let i of e.querySelectorAll(`[${t}]`))o(i,i.getAttribute(t))};for(let e of["click","focusout","input","keydown","keyup"])t(`data-on-${e}`,(t,o)=>{t.addEventListener(e,i[o])});t("data-ref",(e,t)=>{a[t]=e}),t("data-action",(e,t)=>{n[t](e)}),r.addEventListener("abort",()=>{e.removeChild(p)})}})(e,r,f,v,y,i,a,w),w=!1}),r.emojiVersion||eg().then(e=>{e||(r.message=r.i18n.emojiUnsupportedMessage)}),s(()=>{async function e(){let e=!1,t=setTimeout(()=>{e=!0,r.message=r.i18n.loadingMessage},1e3);try{await r.database.ready(),r.databaseLoaded=!0}catch(e){console.error(e),r.message=r.i18n.networkErrorMessage}finally{clearTimeout(t),e&&(e=!1,r.message="")}}r.database&&e()}),s(()=>{r.pickerStyle=` - --num-groups: ${r.groups.length}; - --indicator-opacity: ${r.searchMode?0:1}; - --num-skintones: 6;`}),s(()=>{r.customEmoji&&r.database&&k()}),s(()=>{r.customEmoji&&r.customEmoji.length?r.groups!==ea&&(r.groups=ea):r.groups!==er&&(r.currentGroupIndex&&r.currentGroupIndex--,r.groups=er)}),s(()=>{(async function(){r.databaseLoaded&&(r.currentSkinTone=await r.database.getPreferredSkinTone())})()}),s(()=>{r.skinTones=Array(6).fill().map((e,t)=>(function(e,t){if(0===t)return e;let o=e.indexOf("‍");return -1!==o?e.substring(0,o)+String.fromCodePoint(127995+t-1)+e.substring(o):(e.endsWith("️")&&(e=e.substring(0,e.length-1)),e+"\ud83c"+String.fromCodePoint(57339+t-1))})(r.skinToneEmoji,t))}),s(()=>{r.skinToneButtonText=r.skinTones[r.currentSkinTone]}),s(()=>{r.skinToneButtonLabel=r.i18n.skinToneLabel.replace("{skinTone}",r.i18n.skinTones[r.currentSkinTone])}),s(()=>{async function e(){let{database:e}=r,t=(await Promise.all(ec.map(t=>e.getEmojiByUnicodeOrName(t)))).filter(Boolean);r.defaultFavoriteEmojis=t}r.databaseLoaded&&e()}),s(()=>{async function e(){k();let{database:e,defaultFavoriteEmojis:t,numColumns:o}=r,i=await e.getTopFavoriteEmoji(o),n=await S(ey([...i,...t],e=>e.unicode||e.name).slice(0,o));r.currentFavorites=n}r.databaseLoaded&&r.defaultFavoriteEmojis&&e()}),s(()=>{(async function(){let{searchText:e,currentGroup:t,databaseLoaded:o,customEmoji:i}=r;if(o){if(e.length>=2){let t=await j(e);r.searchText===e&&(m(t),p(!0))}else{let{id:e}=t;if(-1!==e||i&&i.length){let t=await C(e);r.currentGroup.id===e&&(m(t),p(!1))}}}else r.currentEmojis=[],r.searchMode=!1})()}),s(()=>{let{currentEmojis:e,emojiVersion:o}=r,n=e.filter(e=>e.unicode).filter(e=>el(e)&&!eb.has(e.unicode));!o&&n.length?(m(e),ew(()=>{(function(e,o,i){for(let n of e){let e=eE(i(n));void 0===t&&(t=eE(o));let a=e/1.8{var e;(e=i.tabpanelElement)&&(e.scrollTop=0)}))}),s(()=>{}),s(()=>{g(function(){let{searchMode:e,currentEmojis:t}=r;if(e)return[{category:"",emojis:t}];let o=new Map;for(let e of t){let t=e.category||"",i=o.get(t);i||(i=[],o.set(t,i)),i.push(e)}return[...o.entries()].map(([e,t])=>({category:e,emojis:t})).sort((e,t)=>r.customCategorySorting(e.category,t.category))}())}),s(()=>{r.activeSearchItemId=-1!==r.activeSearchItem&&r.currentEmojis[r.activeSearchItem].id}),s(()=>{let{rawSearchText:e}=r;es(()=>{r.searchText=(e||"").trim(),r.activeSearchItem=-1})}),s(()=>{r.skinTonePickerExpanded?i.skinToneDropdown.addEventListener("transitionend",()=>{r.skinTonePickerExpandedAfterAnimation=!0},{once:!0}):r.skinTonePickerExpandedAfterAnimation=!1}),{$set(e){eD(r,e)},$destroy(){n.abort()}}}(this.shadowRoot,this._ctx))}disconnectedCallback(){eA(()=>{if(!this.isConnected&&this._cmp){this._cmp.$destroy(),this._cmp=void 0;let{database:e}=this._ctx;e.close().catch(e=>console.error(e))}})}static get observedAttributes(){return["locale","data-source","skin-tone-emoji","emoji-version"]}attributeChangedCallback(e,t,o){this._set(e.replace(/-([a-z])/g,(e,t)=>t.toUpperCase()),"emoji-version"===e?parseFloat(o):o)}_set(e,t){this._ctx[e]=t,this._cmp&&this._cmp.$set({[e]:t}),["locale","dataSource"].includes(e)&&this._dbFlush()}_dbCreate(){let{locale:e,dataSource:t,database:o}=this._ctx;o&&o.locale===e&&o.dataSource===t||this._set("database",new en({locale:e,dataSource:t}))}_dbFlush(){eA(()=>this._dbCreate())}}let eR={};for(let e of e$)eR[e]={get(){return"database"===e&&this._dbCreate(),this._ctx[e]},set(t){if("database"===e)throw Error("database is read-only");this._set(e,t)}};function eM(e){if("TEXTAREA"!==e.nodeName)return!1;if(void 0===i){var t=document.createElement("textarea");t.value=1,i=!!t.firstChild}return i}Object.defineProperties(eB.prototype,eR),customElements.get("emoji-picker")||customElements.define("emoji-picker",eB);var eN=function(e,t){if(e.focus(),document.selection){var o=document.selection.createRange();o.text=t,o.collapse(!1),o.select();return}if(!document.execCommand("insertText",!1,t)){var i=e.selectionStart,n=e.selectionEnd;if("function"==typeof e.setRangeText)e.setRangeText(t);else{var a=document.createRange(),r=document.createTextNode(t);if(eM(e)){var s=e.firstChild;if(s){for(var l=0,d=null,c=null;s&&(null===d||null===c);){var u=s.nodeValue.length;i>=l&&i<=l+u&&a.setStart(d=s,i-l),n>=l&&n<=l+u&&a.setEnd(c=s,n-l),l+=u,s=s.nextSibling}i!==n&&a.deleteContents()}else e.appendChild(r)}if(eM(e)&&"#text"===a.commonAncestorContainer.nodeName)a.insertNode(r);else{var h=e.value;e.value=h.slice(0,i)+t+h.slice(n)}}e.setSelectionRange(i+t.length,i+t.length);var m=document.createEvent("UIEvent");m.initEvent("input",!0,!1),e.dispatchEvent(m)}};function eF(e){return null!==e&&"object"==typeof e?"share"in navigator&&"canShare"in navigator&&navigator.canShare(e):"share"in navigator}Object.defineProperty({},"WebShare",{get:function(){return eU},set:void 0,enumerable:!0,configurable:!0});let eO=` - :host { - display: inline-block; - } -`,eP=document.createElement("template");eP.innerHTML=` - - -`;class eU extends HTMLElement{#e;#t;#o=[];constructor(){super(),this.shadowRoot||this.attachShadow({mode:"open",delegatesFocus:!0}).appendChild(eP.content.cloneNode(!0)),this.#e=this.shadowRoot?.querySelector('slot[name="button"]')||null,this.#t=this.#i()}static get observedAttributes(){return["disabled"]}attributeChangedCallback(e,t,o){"disabled"===e&&t!==o&&this.#t&&(this.#t.toggleAttribute("disabled",this.disabled),this.#t.setAttribute("aria-disabled",this.disabled.toString()),this.#t.part&&this.#t.part.contains("button")&&this.#t.part.toggle("button--disabled",this.disabled))}connectedCallback(){this.#n("shareUrl"),this.#n("shareTitle"),this.#n("shareText"),this.#n("shareFiles"),this.#n("disabled"),this.#e?.addEventListener("slotchange",this.#a),this.#t?.addEventListener("click",this.#r)}disconnectedCallback(){this.#e?.removeEventListener("slotchange",this.#a),this.#t?.removeEventListener("click",this.#r)}get disabled(){return this.hasAttribute("disabled")}set disabled(e){this.toggleAttribute("disabled",!!e)}get shareUrl(){return this.getAttribute("share-url")||""}set shareUrl(e){this.setAttribute("share-url",e)}get shareTitle(){return this.getAttribute("share-title")||""}set shareTitle(e){this.setAttribute("share-title",e)}get shareText(){return this.getAttribute("share-text")||""}set shareText(e){this.setAttribute("share-text",e)}get shareFiles(){return this.#o}set shareFiles(e){Array.isArray(e)&&e.length>0&&(this.#o=e)}async share(){if(!this.disabled)try{let e={};this.shareUrl&&(e.url=this.shareUrl),this.shareTitle&&(e.title=this.shareTitle),this.shareText&&(e.text=this.shareText),Array.isArray(this.shareFiles)&&this.shareFiles.length>0&&navigator.canShare&&navigator.canShare({files:this.shareFiles})&&(e.files=this.shareFiles),await navigator.share(e),this.dispatchEvent(new CustomEvent("web-share:success",{bubbles:!0,composed:!0,detail:{shareData:e}}))}catch(e){if(e instanceof Error&&"AbortError"===e.name){this.dispatchEvent(new CustomEvent("web-share:abort",{bubbles:!0,composed:!0,detail:{error:e}}));return}this.dispatchEvent(new CustomEvent("web-share:error",{bubbles:!0,composed:!0,detail:{error:e}}))}}#r=e=>{e.preventDefault(),this.disabled||this.share()};#a=e=>{e.target&&"button"===e.target.name&&(this.#t?.removeEventListener("click",this.#r),this.#t=this.#i(),this.#t&&(this.#t.addEventListener("click",this.#r),"BUTTON"===this.#t.nodeName||this.#t.hasAttribute("role")||this.#t.setAttribute("role","button")))};#i(){return this.#e&&this.#e.assignedElements({flatten:!0}).find(e=>"BUTTON"===e.nodeName||"button"===e.getAttribute("slot"))||null}#n(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}static defineCustomElement(e="web-share"){"undefined"==typeof window||window.customElements.get(e)||window.customElements.define(e,eU)}}eU.defineCustomElement(),Object.defineProperty({},"CapturePhoto",{get:function(){return eG},set:void 0,enumerable:!0,configurable:!0});let eq=(e,t,o)=>(Number.isNaN(t)&&(t=0),Number.isNaN(o)&&(o=0),Math.min(Math.max(e,Math.min(t,o)),Math.max(t,o))),eH="capture-photo",eW=` - :host { - display: block; - box-sizing: border-box; - } - - :host *, - :host *::before, - :host *::after { - box-sizing: inherit; - } - - :host([hidden]), - [hidden], - ::slotted([hidden]) { - display: none; - } - - video { - display: block; - } - - #output:empty { - display: none; - } -`,eV=document.createElement("template");eV.innerHTML=` - - - - - - -
- - - - - - - -
- - - -
-`;class eG extends HTMLElement{#e={};#t=null;#i=null;#s=null;#r=null;#a=null;#o=null;#n=null;#l=null;constructor(){super(),this.#e=this.getSupportedConstraints(),this.shadowRoot||this.attachShadow({mode:"open"}).appendChild(eV.content.cloneNode(!0))}static get observedAttributes(){return["no-image","facing-mode","camera-resolution","pan","tilt","zoom"]}attributeChangedCallback(e,t,o){if(!this.isConnected)return;let i=this.getTrackCapabilities(),n=this.getTrackSettings();if("no-image"===e&&t!==o&&this.#d(),"facing-mode"===e&&t!==o&&"facingMode"in this.#e){let e=["user","environment"].includes(this.facingMode||"");"facingMode"in n&&e&&(this.stopVideoStream(),this.startVideoStream())}if("camera-resolution"===e&&t!==o&&"string"==typeof this.cameraResolution&&this.cameraResolution.trim().length>0){let[e=0,t=0]=this.cameraResolution.split("x").map(e=>Number(e));if(e>0&&t>0&&"width"in i&&"height"in i){let o=!!(i.width?.min&&i.width?.max)&&e>=i?.width?.min&&e<=i?.width?.max,a=!!(i.height?.min&&i.height?.max)&&t>=i?.height?.min&&t<=i?.height?.max;"width"in n&&"height"in n&&o&&a&&(this.stopVideoStream(),this.startVideoStream())}}if("pan"===e&&t!==o&&"pan"in this.#e){let e=!!("pan"in i&&i.pan?.min&&i.pan?.max)&&this.pan>=i.pan.min&&this.pan<=i.pan.max;"pan"in n&&"number"==typeof this.pan&&e&&this.#c("pan",this.pan)}if("tilt"===e&&t!==o&&"tilt"in this.#e){let e=!!("tilt"in i&&i.tilt?.min&&i.tilt?.max)&&this.tilt>=i.tilt.min&&this.tilt<=i.tilt.max;"tilt"in n&&"number"==typeof this.tilt&&e&&this.#c("tilt",this.tilt)}if("zoom"===e&&t!==o&&"zoom"in this.#e){let e=!!("zoom"in i&&i.zoom?.min&&i.zoom?.max)&&this.zoom>=i.zoom.min&&this.zoom<=i.zoom.max;"zoom"in n&&"number"==typeof this.zoom&&e&&this.#c("zoom",this.zoom)}}connectedCallback(){if(this.#u("autpoPlay"),this.#u("noImage"),this.#u("facingMode"),this.#u("cameraResolution"),this.#u("pan"),this.#u("tilt"),this.#u("zoom"),this.#u("calculateFileSize"),this.#i=this.shadowRoot?.querySelector("canvas")||null,this.#s=this.shadowRoot?.getElementById("output")||null,this.#r=this.shadowRoot?.querySelector("video")||null,this.#a=this.shadowRoot?.querySelector('slot[name="capture-button"]')||null,this.#o=this.#h(),this.#n=this.shadowRoot?.querySelector('slot[name="facing-mode-button"]')||null,this.#l=this.#m(),this.#r?.addEventListener("loadedmetadata",this.#p),this.#a?.addEventListener("slotchange",this.#g),this.#o?.addEventListener("click",this.#b),this.#n?.addEventListener("slotchange",this.#f),this.#l?.addEventListener("click",this.#v),!eG.isSupported())return this.dispatchEvent(new CustomEvent(`${eH}:error`,{bubbles:!0,composed:!0,detail:{error:{name:"NotSupportedError",message:"Not supported"}}}));this.autoPlay&&this.startVideoStream()}disconnectedCallback(){this.stopVideoStream(),this.#l?.removeEventListener("click",this.#v),this.#o?.removeEventListener("click",this.#b),this.#r?.removeEventListener("canplay",this.#p),this.#a?.removeEventListener("slotchange",this.#g),this.#n?.removeEventListener("slotchange",this.#f)}get autoPlay(){return this.hasAttribute("auto-play")}set autoPlay(e){this.toggleAttribute("auto-play",!!e)}get noImage(){return this.hasAttribute("no-image")}set noImage(e){this.toggleAttribute("no-image",!!e)}get facingMode(){return this.getAttribute("facing-mode")||"user"}set facingMode(e){this.setAttribute("facing-mode",e)}get cameraResolution(){return this.getAttribute("camera-resolution")||""}set cameraResolution(e){this.setAttribute("camera-resolution",e)}get pan(){return Number(this.getAttribute("pan"))||0}set pan(e){this.setAttribute("pan",null!=e?e.toString():e)}get tilt(){return Number(this.getAttribute("tilt"))||0}set tilt(e){this.setAttribute("tilt",null!=e?e.toString():e)}get zoom(){return Number(this.getAttribute("zoom"))||1}set zoom(e){this.setAttribute("zoom",null!=e?e.toString():e)}get loading(){return this.hasAttribute("loading")}get calculateFileSize(){return this.hasAttribute("calculate-file-size")}set calculateFileSize(e){this.toggleAttribute("calculate-file-size",!!e)}#v=e=>{e.preventDefault(),this.loading||(this.facingMode="user"!==this.facingMode&&this.facingMode?"user":"environment")};#b=e=>{e.preventDefault(),this.capture()};#p=e=>{let t=e.target;t.play().then(()=>{this.dispatchEvent(new CustomEvent(`${eH}:video-play`,{bubbles:!0,composed:!0,detail:{video:t}}))}).catch(e=>{this.dispatchEvent(new CustomEvent(`${eH}:error`,{bubbles:!0,composed:!0,detail:{error:e}}))}).finally(()=>{this.removeAttribute("loading")})};#d(){this.#s&&Array.from(this.#s.childNodes).forEach(e=>e.remove())}#c(e,t){if(!this.#t||!e||!t)return;let[o]=this.#t.getVideoTracks(),i=this.getTrackCapabilities();e in this.getTrackSettings()&&o.applyConstraints({advanced:[{[e]:eq(Number(t),i[e]?.min||1,i[e]?.max||1)}]})}#g=e=>{e.target?.name==="capture-button"&&(this.#o?.removeEventListener("click",this.#b),this.#o=this.#h(),this.#o&&(this.#o.addEventListener("click",this.#b),"BUTTON"===this.#o.nodeName||this.#o.hasAttribute("role")||this.#o.setAttribute("role","button")))};#f=e=>{e.target?.name==="facing-mode-button"&&(this.#l?.removeEventListener("click",this.#v),this.#l=this.#m(),this.#l&&(this.#l.addEventListener("click",this.#v),"BUTTON"===this.#l.nodeName||this.#l.hasAttribute("role")||this.#l.setAttribute("role","button")))};#m(){return this.#n&&this.#n.assignedElements({flatten:!0}).find(e=>"BUTTON"===e.nodeName||"facing-mode-button"===e.getAttribute("slot"))||null}#h(){return this.#a&&this.#a.assignedElements({flatten:!0}).find(e=>"BUTTON"===e.nodeName||"capture-button"===e.getAttribute("slot"))||null}#u(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}async startVideoStream(){if(!eG.isSupported()||this.#t)return;this.setAttribute("loading","");let e={video:{facingMode:{ideal:this.facingMode||"user"},pan:!0,tilt:!0,zoom:!0},audio:!1};if("string"==typeof this.cameraResolution&&this.cameraResolution.trim().length>0){let[t=0,o=0]=this.cameraResolution.split("x").map(e=>Number(e));t>0&&o>0&&(e.video.width=t,e.video.height=o)}try{this.#t=await navigator.mediaDevices.getUserMedia(e),this.#r&&(this.#r.srcObject=this.#t),this.#c("pan",this.pan),this.#c("tilt",this.tilt),this.#c("zoom",this.zoom);let t=this.getTrackSettings();"facingMode"in t&&this.#n&&(this.#n.hidden=!1)}catch(e){this.dispatchEvent(new CustomEvent(`${eH}:error`,{bubbles:!0,composed:!0,detail:{error:e}}))}finally{this.removeAttribute("loading")}}stopVideoStream(){if(!this.#r||!this.#t)return;let[e]=this.#t.getVideoTracks();e?.stop(),this.#r.srcObject=null,this.#t=null}async capture(){if(!this.loading&&this.#i&&this.#r)try{let e=this.#i.getContext("2d"),t=this.#r.videoWidth,o=this.#r.videoHeight;this.#i.width=t,this.#i.height=o,e?.drawImage(this.#r,0,0,t,o);let i=this.#i.toDataURL("image/png");if("string"==typeof i&&i.includes("data:image")){if(!this.noImage){let e=new Image;e.src=i,e.width=t,e.height=o,e.setAttribute("part","output-image"),this.#d(),this.#s?.appendChild(e)}let e={dataURI:i,width:t,height:o};if(this.calculateFileSize)try{let t=await fetch(i),o=(await t.blob()).size;o&&(e.size=o)}catch(e){}this.dispatchEvent(new CustomEvent(`${eH}:success`,{bubbles:!0,composed:!0,detail:e}))}}catch(e){this.dispatchEvent(new CustomEvent(`${eH}:error`,{bubbles:!0,composed:!0,detail:{error:e}}))}}getSupportedConstraints(){return eG.isSupported()&&navigator.mediaDevices.getSupportedConstraints()||{}}getTrackCapabilities(){if(!this.#t)return{};let[e]=this.#t.getVideoTracks();return e&&"function"==typeof e.getCapabilities&&e.getCapabilities()||{}}getTrackSettings(){if(!this.#t)return{};let[e]=this.#t.getVideoTracks();return e&&"function"==typeof e.getSettings&&e.getSettings()||{}}static isSupported(){return!!navigator.mediaDevices?.getUserMedia}static defineCustomElement(e=eH){"undefined"==typeof window||window.customElements.get(e)||window.customElements.define(e,eG)}}eG.defineCustomElement(),Object.defineProperty({},"ModalElement",{get:function(){return eJ},set:void 0,enumerable:!0,configurable:!0});let eX=document.createElement("template"),eY=` - :host { - --me-width: 32rem; - --me-height: fit-content; - --me-border-color: initial; - --me-border-style: solid; - --me-border-width: initial; - --me-border-radius: 0; - --me-box-shadow: none; - --me-background-color: canvas; - --me-header-spacing: 1rem; - --me-body-spacing: 1rem; - --me-footer-spacing: 1rem; - --me-header-background-color: transparent; - --me-body-background-color: transparent; - --me-footer-background-color: transparent; - --me-close-border-radius: 0; - --me-close-background-color: transparent; - --me-backdrop-background: rgba(0, 0, 0, 0.5); - --me-backdrop-filter: none; - - display: contents; - box-sizing: border-box; - } - - :host *, - :host *:after, - :host *:before { - box-sizing: inherit; - } - - :host([hidden]), - [hidden] { - display: none !important; - } - - /* Dialog */ - .dialog { - --dialog-placement-margin: calc((2em + 6px) / 2); - - width: var(--me-width); - height: var(--me-height); - padding: 0; - border-color: var(--me-border-color); - border-style: var(--me-border-style); - border-width: var(--me-border-width); - border-radius: var(--me-border-radius); - box-shadow: var(--me-box-shadow); - background-color: var(--me-background-color); - } - - .dialog[open] { - display: flex; - } - - :host([fullscreen]) .dialog { - max-width: 100%; - max-height: 100%; - width: 100%; - height: 100%; - } - - .dialog::backdrop { - background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5)); - backdrop-filter: var(--me-backdrop-filter, none); - opacity: 0; - } - - .dialog[open]::backdrop { - opacity: 1; - } - - /* Dialog placement */ - :host(:not([fullscreen])[placement="top-start"]) .dialog { - margin-block-start: var(--dialog-placement-margin); - margin-inline-start: var(--dialog-placement-margin); - } - - :host(:not([fullscreen])[placement="top-center"]) .dialog { - margin-block-start: var(--dialog-placement-margin); - } - - :host(:not([fullscreen])[placement="top-end"]) .dialog { - margin-block-start: var(--dialog-placement-margin); - margin-inline-end: var(--dialog-placement-margin); - } - - :host(:not([fullscreen])[placement="center-start"]) .dialog { - margin-inline-start: var(--dialog-placement-margin); - } - - :host(:not([fullscreen])[placement="center"]) .dialog { - margin: auto; - } - - :host(:not([fullscreen])[placement="center-end"]) .dialog { - margin-inline-end: var(--dialog-placement-margin); - } - - :host(:not([fullscreen])[placement="bottom-start"]) .dialog { - margin-block-end: var(--dialog-placement-margin); - margin-inline-start: var(--dialog-placement-margin); - } - - :host(:not([fullscreen])[placement="bottom-center"]) .dialog { - margin-block-end: var(--dialog-placement-margin); - } - - :host(:not([fullscreen])[placement="bottom-end"]) .dialog { - margin-block-end: var(--dialog-placement-margin); - margin-inline-end: var(--dialog-placement-margin); - } - - /* Dialog animations */ - @media (prefers-reduced-motion: no-preference) { - .dialog:not(.dialog--no-animations), - .dialog:not(.dialog--no-animations)::backdrop { - transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete; - } - - /* 1. IS-OPEN STATE */ - .dialog[open] { - transform: scale(1); - opacity: 1; - } - - /* 2. EXIT STATE */ - .dialog { - transform: scale(0.95); - opacity: 0; - } - - /* 0. BEFORE-OPEN STATE */ - @starting-style { - .dialog[open] { - transform: scale(0.95); - opacity: 0; - } - - .dialog[open]::backdrop { - opacity: 0; - } - } - - .dialog--pulse:not(.dialog--no-animations) { - animation-name: pulse; - animation-duration: 300ms; - animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9); - } - - @keyframes pulse { - 0% { transform: scale(1); } - 50% { transform: scale(1.02); } - 100% { transform: scale(1); } - } - } - - /* Dialog panel, header, body, footer */ - .dialog__panel { - display: flex; - flex-direction: column; - flex: 1 1 auto; - width: 100%; - } - - .dialog__header { - display: flex; - align-items: center; - padding: var(--me-header-spacing); - column-gap: 0.5rem; - background-color: var(--me-header-background-color); - } - - :host([no-close-button]) .dialog__header { - column-gap: 0; - } - - .dialog__title { - display: block; - flex: 1 1 auto; - padding: 0; - margin: 0; - } - - .dialog__body { - display: block; - flex: 1 1 auto; - padding: var(--me-body-spacing); - overflow: auto; - background-color: var(--me-body-background-color); - overscroll-behavior: contain; - } - - .dialog__footer { - flex: 0 0 auto; - text-align: end; - - padding: var(--me-footer-spacing); - background-color: var(--me-footer-background-color); - } - - .dialog__close { - display: inline-flex; - align-items: center; - justify-content: center; - padding: 0.4375rem; - border: none; - background-color: transparent; - } - - .dialog__close:not(:disabled) { - cursor: pointer; - } - - .dialog__close:disabled { - cursor: not-allowed; - } -`;eX.innerHTML=` - - - -
-
- - -
- -
-
- - - -
- -
-
-
-`;class eJ extends HTMLElement{#t=null;#e=null;#s=null;#l=void 0;constructor(){super(),this.shadowRoot||this.attachShadow({mode:"open"}).appendChild(eX.content.cloneNode(!0)),this.shadowRoot&&(this.#t=this.shadowRoot.querySelector("dialog"),this.#e=this.shadowRoot.querySelector('slot[name="footer"]'),this.#s=this.shadowRoot.querySelector('slot[name="close"]'))}static get observedAttributes(){return["open","no-header","no-animations","no-close-button","close-label"]}attributeChangedCallback(e,t,o){if(null!==this.#t){if("open"===e&&t!==o&&(this.open?(this.#t.showModal(),this.dispatchEvent(new CustomEvent("me-open",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow="hidden")):this.#t.close()),"no-header"===e&&t!==o){let e=this.#t.querySelector(".dialog__header");null!==e&&(e.hidden=this.noHeader)}if("no-animations"===e&&t!==o&&this.#t.classList.toggle("dialog--no-animations",this.noAnimations),"no-close-button"===e&&t!==o){let e=this.#t.querySelector(".dialog__close");null!==e&&(e.hidden=this.noCloseButton)}"close-label"===e&&t!==o&&this.#a()}}connectedCallback(){this.#i("open"),this.#i("staticBackdrop"),this.#i("noHeader"),this.#i("noAnimations"),this.#i("noCloseButton"),this.#i("fullscreen"),this.#i("preserveOverflow"),this.#i("placement"),this.#i("closeLabel"),this.#t?.addEventListener("click",this.#r),this.#t?.addEventListener("close",this.#n),this.#t?.addEventListener("cancel",this.#o),this.#t?.querySelector('form[method="dialog"]')?.addEventListener("submit",this.#u),this.#e?.addEventListener("slotchange",this.#h),this.#s?.addEventListener("slotchange",this.#c)}disconnectedCallback(){this.#l&&clearTimeout(this.#l),this.#t?.addEventListener("click",this.#r),this.#t?.removeEventListener("close",this.#n),this.#t?.removeEventListener("cancel",this.#o),this.#t?.querySelector('form[method="dialog"]')?.removeEventListener("submit",this.#u),this.#e?.removeEventListener("slotchange",this.#h),this.#s?.removeEventListener("slotchange",this.#c)}get open(){return this.hasAttribute("open")}set open(e){this.toggleAttribute("open",!!e)}get staticBackdrop(){return this.hasAttribute("static-backdrop")}set staticBackdrop(e){this.toggleAttribute("static-backdrop",!!e)}get noHeader(){return this.hasAttribute("no-header")}set noHeader(e){this.toggleAttribute("no-header",!!e)}get noAnimations(){return this.hasAttribute("no-animations")}set noAnimations(e){this.toggleAttribute("no-animations",!!e)}get noCloseButton(){return this.hasAttribute("no-close-button")}set noCloseButton(e){this.toggleAttribute("no-close-button",!!e)}get fullscreen(){return this.hasAttribute("fullscreen")}set fullscreen(e){this.toggleAttribute("fullscreen",!!e)}get preserveOverflow(){return this.hasAttribute("preserve-overflow")}set preserveOverflow(e){this.toggleAttribute("preserve-overflow",!!e)}get placement(){return this.getAttribute("placement")||"center"}set placement(e){this.setAttribute("placement",null!=e?e.toString():e)}get closeLabel(){return this.getAttribute("close-label")||"Close"}set closeLabel(e){this.setAttribute("close-label",null!=e?e.toString():e)}#a(){if(null===this.#t)return;let e=this.#t.querySelector(".dialog__close");if(null===e)return;let t=this.#s?.assignedElements()||[];t?.some(e=>e.textContent?.replace(/\s/g,"")!=="")?e.removeAttribute("aria-label"):e.setAttribute("aria-label",this.closeLabel)}#g(){this.#l||(this.#t?.classList.add("dialog--pulse"),this.#l=setTimeout(()=>{this.#t?.classList.remove("dialog--pulse"),clearTimeout(this.#l),this.#l=void 0},300))}#n=()=>{this.open=!1,this.dispatchEvent(new CustomEvent("me-close",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow="")};#o=e=>{let t=this.#m("escape-key");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#g())};#u=e=>{let t=this.#m("close-button");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#g())};#r=e=>{let t=e.target;if(t===e.currentTarget){let e=this.#m("backdrop-click");this.dispatchEvent(e),e.defaultPrevented||this.staticBackdrop?this.noAnimations||this.#g():this.hide()}if(t instanceof HTMLElement&&null!==t.closest("[data-me-close]")){let e=this.#m("external-invoker");this.dispatchEvent(e),e.defaultPrevented?this.noAnimations||this.#g():this.hide()}};#h=()=>{if(null===this.#t)return;let e=this.#t.querySelector(".dialog__footer");if(null===e)return;let t=this.#e?.assignedNodes(),o=!!t&&t.length>0;e.hidden=!o};#c=()=>{this.#a()};#m(e){return new CustomEvent("me-request-close",{bubbles:!0,composed:!0,cancelable:!0,detail:{reason:e,element:this}})}#i(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}show(){this.open||(this.open=!0)}hide(){this.open&&(this.open=!1)}static defineCustomElement(e="modal-element"){"undefined"==typeof window||window.customElements.get(e)||window.customElements.define(e,eJ)}}eJ.defineCustomElement(),Object.defineProperty({},"FilesDropzone",{get:function(){return tt},set:void 0,enumerable:!0,configurable:!0});let eK=new Map([["aac","audio/aac"],["abw","application/x-abiword"],["arc","application/x-freearc"],["avif","image/avif"],["avi","video/x-msvideo"],["azw","application/vnd.amazon.ebook"],["bin","application/octet-stream"],["bmp","image/bmp"],["bz","application/x-bzip"],["bz2","application/x-bzip2"],["cda","application/x-cdf"],["csh","application/x-csh"],["css","text/css"],["csv","text/csv"],["doc","application/msword"],["docx","application/vnd.openxmlformats-officedocument.wordprocessingml.document"],["eot","application/vnd.ms-fontobject"],["epub","application/epub+zip"],["gz","application/gzip"],["gif","image/gif"],["heic","image/heic"],["heif","image/heif"],["htm","text/html"],["html","text/html"],["ico","image/vnd.microsoft.icon"],["ics","text/calendar"],["jar","application/java-archive"],["jpeg","image/jpeg"],["jpg","image/jpeg"],["jxl","image/jxl"],["js","text/javascript"],["json","application/json"],["jsonld","application/ld+json"],["markdown","text/markdown"],["md","text/markdown"],["mid","audio/midi"],["midi","audio/midi"],["mjs","text/javascript"],["mp3","audio/mpeg"],["mp4","video/mp4"],["mpeg","video/mpeg"],["mpkg","application/vnd.apple.installer+xml"],["odp","application/vnd.oasis.opendocument.presentation"],["ods","application/vnd.oasis.opendocument.spreadsheet"],["odt","application/vnd.oasis.opendocument.text"],["oga","audio/ogg"],["ogv","video/ogg"],["ogx","application/ogg"],["opus","audio/opus"],["otf","font/otf"],["png","image/png"],["pdf","application/pdf"],["php","application/x-httpd-php"],["ppt","application/vnd.ms-powerpoint"],["pptx","application/vnd.openxmlformats-officedocument.presentationml.presentation"],["rar","application/vnd.rar"],["rtf","application/rtf"],["sh","application/x-sh"],["svg","image/svg+xml"],["swf","application/x-shockwave-flash"],["tar","application/x-tar"],["tif","image/tiff"],["tiff","image/tiff"],["ts","video/mp2t"],["ttf","font/ttf"],["txt","text/plain"],["vsd","application/vnd.visio"],["wav","audio/wav"],["weba","audio/webm"],["webm","video/webm"],["webp","image/webp"],["woff","font/woff"],["woff2","font/woff2"],["xhtml","application/xhtml+xml"],["xls","application/vnd.ms-excel"],["xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],["xml","application/xml"],["xul","application/vnd.mozilla.xul+xml"],["zip","application/zip"],["7z","application/x-7z-compressed"],["mkv","video/x-matroska"],["mov","video/quicktime"],["msg","application/vnd.ms-outlook"]]),eQ=[".DS_Store","Thumbs.db"],eZ=e=>{let{name:t}=e;if(t&&-1!==t.lastIndexOf(".")&&!e.type){let o=(t.split(".").pop()||"").toLowerCase(),i=eK.get(o);i&&Object.defineProperty(e,"type",{value:i,writable:!1,configurable:!1,enumerable:!0})}return e},e0=(e,t)=>{let o=eZ(e);if("string"!=typeof o.path){let{webkitRelativePath:i}=e;Object.defineProperty(o,"path",{value:"string"==typeof t?t:i||e.name,writable:!1,configurable:!1,enumerable:!0})}return o},e1=async e=>await new Promise((t,o)=>{e.readEntries(t,o)}),e8=async e=>{let t=[],o=await e1(e);for(;o.length>0;)t.push(...o),o=await e1(e);return t},e3=e=>new Promise((t,o)=>{e.file(o=>t(e0(o,e.fullPath)),o)}),e2=async e=>{let t=[],o=[];for(let t of e){if("file"!==t.kind)continue;let e=t.getAsEntry?t.getAsEntry():t.webkitGetAsEntry();o.push(e)}for(;o.length>0;){let e=o.shift();if(e){if(e.isFile){let o=await e3(e);-1===eQ.indexOf(o.name)&&t.push(o)}else e.isDirectory&&o.push(...await e8(e.createReader()))}}return t},e5=async e=>{let t=[];for(let o of e)-1===eQ.indexOf(o.name)&&t.push(e0(o));return t},e4=async e=>e.dataTransfer?e.dataTransfer.items?await e2(e.dataTransfer.items):await e5(e.dataTransfer.files):await e5(e.target.files),e9="files-dropzone",e7="TOO_MANY_FILES",e6=document.createElement("template"),te=` - *, - *::before, - *::after { - box-sizing: border-box; - } - - :host([hidden]), - [hidden] { - display: none !important; - } - - :host { - --dropzone-border-width: 2px; - --dropzone-border-style: dashed; - --dropzone-border-radius: 0.25rem; - --dropzone-border-color: #6c757d; - --dropzone-border-color-dragover: #0d6efd; - --dropzone-border-color-hover: var(--dropzone-border-color-dragover); - --dropzone-background-color: #ffffff; - --dropzone-background-color-dragover: #f4f4f5; - --dropzone-background-color-hover: var(--dropzone-background-color-dragover); - --dropzone-body-color: #3f3f46; - --dropzone-body-color-dragover: var(--dropzone-body-color); - --dropzone-body-color-hover: var(--dropzone-body-color-dragover); - --dropzone-focus-shadow-rgb: 49,132,253; - --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5); - --transition-duration: 0.2s; /* for backwards compatibility */ - --dropzone-transition-duration: var(--transition-duration); - - display: block; - } - - :host(:not([no-style])) .dropzone { - border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color); - border-radius: var(--dropzone-border-radius); - padding: 3rem 1rem; - overflow: hidden; - background-color: var(--dropzone-background-color); - color: var(--dropzone-body-color); - text-align: center; - cursor: pointer; - transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out; - } - - :host(:not([no-style])[disabled]) .dropzone { - opacity: 0.8; - cursor: not-allowed; - user-select: none; - } - - :host(:not([no-style]):not([disabled])) .dropzone--dragover { - border-color: var(--dropzone-border-color-dragover); - background-color: var(--dropzone-background-color-dragover); - color: var(--dropzone-body-color-dragover); - } - - :host(:not([no-style]):not([disabled])) .dropzone:focus-visible { - outline: none; - box-shadow: var(--dropzone-focus-box-shadow); - } - - @media (hover: hover) { - :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover { - border-color: var(--dropzone-border-color-hover); - background-color: var(--dropzone-background-color-hover); - color: var(--dropzone-body-color-hover); - } - } -`;e6.innerHTML=` - - - - -
- Drag 'n' drop files here, or click to select files -
-`;class tt extends HTMLElement{#t=null;#e=null;constructor(){super(),this.shadowRoot||this.attachShadow({mode:"open",delegatesFocus:!0}).appendChild(e6.content.cloneNode(!0)),this.shadowRoot&&(this.#t=this.shadowRoot.getElementById("file-input"),this.#e=this.shadowRoot.getElementById("dropzone"))}static get observedAttributes(){return["accept","disabled","multiple"]}attributeChangedCallback(e,t,o){"accept"===e&&t!==o&&this.#t&&(this.#t.accept=this.accept),"disabled"===e&&t!==o&&this.#t&&(this.#t.disabled=this.disabled,this.disabled?(this.#e?.removeAttribute("tabindex"),this.#e?.setAttribute("aria-disabled","true")):(this.#e?.setAttribute("tabindex","0"),this.#e?.setAttribute("aria-disabled","false"))),"multiple"===e&&t!==o&&this.#t&&(this.#t.multiple=this.multiple)}connectedCallback(){this.#s("accept"),this.#s("disabled"),this.#s("maxFiles"),this.#s("maxSize"),this.#s("minSize"),this.#s("multiple"),this.#s("autoFocus"),this.#s("noStyle"),this.#t?.addEventListener("change",this.#i),this.#e?.addEventListener("dragenter",this.#n),this.#e?.addEventListener("dragover",this.#a),this.#e?.addEventListener("dragleave",this.#r),this.#e?.addEventListener("drop",this.#o),this.#e?.addEventListener("click",this.#u),this.#e?.addEventListener("keyup",this.#l),this.autoFocus&&this.#e?.focus()}disconnectedCallback(){this.#t?.removeEventListener("change",this.#i),this.#e?.removeEventListener("dragenter",this.#n),this.#e?.removeEventListener("dragover",this.#a),this.#e?.removeEventListener("dragleave",this.#r),this.#e?.removeEventListener("drop",this.#o),this.#e?.removeEventListener("click",this.#u),this.#e?.removeEventListener("keyup",this.#l)}get accept(){return this.getAttribute("accept")||""}set accept(e){this.setAttribute("accept",null!=e?e.toString():e)}get disabled(){return this.hasAttribute("disabled")}set disabled(e){this.toggleAttribute("disabled",!!e)}get maxFiles(){let e=Number(this.getAttribute("max-files"))||0;return e<=0?1/0:Math.floor(Math.abs(e))}set maxFiles(e){this.setAttribute("max-files",null!=e?e.toString():e)}get maxSize(){let e=this.getAttribute("max-size");if(null===e)return 1/0;let t=Number(e);return Number.isNaN(t)?1/0:t}set maxSize(e){this.setAttribute("max-size",null!=e?e.toString():e)}get minSize(){let e=this.getAttribute("min-size");if(null===e)return 0;let t=Number(e);return Number.isNaN(t)?0:t}set minSize(e){this.setAttribute("min-size",null!=e?e.toString():e)}get multiple(){return this.hasAttribute("multiple")}set multiple(e){this.toggleAttribute("multiple",!!e)}get autoFocus(){return this.hasAttribute("auto-focus")}set autoFocus(e){this.toggleAttribute("auto-focus",!!e)}get noStyle(){return this.hasAttribute("no-style")}set noStyle(e){this.toggleAttribute("no-style",!!e)}#i=async e=>{try{this.#p(await e4(e))}catch(e){this.dispatchEvent(new CustomEvent(`${e9}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}};#n=()=>{this.disabled||this.dispatchEvent(new Event(`${e9}-dragenter`,{bubbles:!0,composed:!0}))};#a=e=>{if(e.preventDefault(),this.disabled){e.dataTransfer.dropEffect="none";return}e.dataTransfer.dropEffect="copy",this.#e&&(this.#e.classList.add("dropzone--dragover"),this.#e.part.add("dropzone--dragover")),this.dispatchEvent(new Event(`${e9}-dragover`,{bubbles:!0,composed:!0}))};#r=()=>{this.disabled||(this.#e&&(this.#e.classList.remove("dropzone--dragover"),this.#e.part.remove("dropzone--dragover")),this.dispatchEvent(new Event(`${e9}-dragleave`,{bubbles:!0,composed:!0})))};#o=async e=>{if(!this.disabled){e.preventDefault(),this.#e&&(this.#e.classList.remove("dropzone--dragover"),this.#e.part.remove("dropzone--dragover"));try{this.#p(await e4(e))}catch(e){this.dispatchEvent(new CustomEvent(`${e9}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}}};#u=()=>{this.disabled||this.#t?.click()};#l=e=>{this.disabled||" "!==e.key&&"Enter"!==e.key||this.#t?.click()};#p(e){if(!Array.isArray(e)||!e.length)return;let t=[],o=[],i=e.length;if(!this.multiple&&i>1)for(let t of e)o.push({file:t,errors:[{code:e7,message:"Too many files selected. Only 1 file is allowed."}]});else if(this.multiple&&i>this.maxFiles)for(let t of e)o.push({file:t,errors:[{code:e7,message:`Too many files selected. Only ${this.maxFiles} ${this.maxFiles>1?"files are":"file is"} allowed.`}]});else for(let i of e){let e=function(e,t=""){if(!t)return!0;let o=[...new Set(t.split(",").map(e=>e.trim()).filter(Boolean))],i=e.type,n=i.replace(/\/.*$/,"");for(let t of o)if("."===t.charAt(0)){if(-1!==e.name.toLowerCase().indexOf(t.toLowerCase(),e.name.length-t.length))return!0}else if(/\/\*$/.test(t)){if(n===t.replace(/\/.*$/,""))return!0}else if(i===t)return!0;return!1}(i,this.accept),n=i.size>this.maxSize,a=i.size0&&this.dispatchEvent(new CustomEvent(`${e9}-drop-accepted`,{bubbles:!0,composed:!0,detail:{acceptedFiles:t}})),o.length>0&&this.dispatchEvent(new CustomEvent(`${e9}-drop-rejected`,{bubbles:!0,composed:!0,detail:{rejectedFiles:o}})),this.#t&&(this.#t.value=this.#t.defaultValue)}openFileDialog(){this.disabled||this.#t?.click()}#s(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}static defineCustomElement(e=e9){"undefined"==typeof window||window.customElements.get(e)||window.customElements.define(e,tt)}}tt.defineCustomElement();let to=["image/jpg","image/jpeg","image/png","image/apng","image/gif","image/webp","image/avif"],ti=(e="",t="")=>{let o=Math.random().toString(36).substring(2,8);return`${"string"==typeof e&&""!==e?e+"-":""}${o}${"string"==typeof t&&""!==t?"-"+t:""}`},tn=async(e={})=>{let t=await fetch(e.url),o=await t.blob(),i=e.mimeType||o.type||"";if(!to.includes(i))throw Error(`This is not an accepted image format. Accepted MIME types are: ${to.join(", ")}`);return new File([o],e.filename||"",o)},ta=localStorage,tr=new class{#y=null;#w=null;constructor(e,t=localStorage){if(!e)throw Error("Storage prefix is required");if(t!==localStorage&&t!==sessionStorage)throw Error("Storage provider is not supported");this.#y=e,this.#w=t}set(e,t){try{this.#w.setItem(`${this.#y}${e}`,JSON.stringify(t))}catch(e){console.error("Error saving to storage",e)}}get(e){try{let t=this.#w.getItem(`${this.#y}${e}`);return t?JSON.parse(t):null}catch(e){return console.error("Error getting from storage",e),null}}}("meme-generator/",ta),ts=e=>"string"==typeof e;var tl={};tl=s("aNJCr").getBundleURL("9p9yL")+"Pressuru.684952ea.ttf";var td={};td=s("aNJCr").getBundleURL("9p9yL")+"Oswald-Regular.89ec7d89.ttf";var tc={};tc=s("aNJCr").getBundleURL("9p9yL")+"Oswald-Bold.0f6a7ca6.ttf";var tu={};tu=s("aNJCr").getBundleURL("9p9yL")+"Roboto-Regular.ca197847.ttf";var th={};th=s("aNJCr").getBundleURL("9p9yL")+"Roboto-Bold.fdb9b54a.ttf";var tm={};tm=s("aNJCr").getBundleURL("9p9yL")+"RobotoCondensed-Regular.d585f5c7.ttf";var tp={};tp=s("aNJCr").getBundleURL("9p9yL")+"RobotoCondensed-Bold.e1f96d4b.ttf";var tg={};tg=s("aNJCr").getBundleURL("9p9yL")+"CourierPrime-Regular.3a25a501.ttf";var tb={};tb=s("aNJCr").getBundleURL("9p9yL")+"CourierPrime-Bold.3d6bf689.ttf";var tf={};tf=s("aNJCr").getBundleURL("9p9yL")+"OpenSans-Regular.edf9e01b.ttf";var tv={};tv=s("aNJCr").getBundleURL("9p9yL")+"OpenSans-Bold.8fceb72b.ttf";let ty=[{name:"Pressuru",label:"Pressuru",path:o(tl),style:"normal",weight:"400"},{name:"Oswald-Regular",label:"Oswald",path:o(td),style:"normal",weight:"400"},{name:"Oswald-Bold",label:"Oswald Bold",path:o(tc),style:"normal",weight:"700"},{name:"Roboto-Regular",label:"Roboto",path:o(tu),style:"normal",weight:"400"},{name:"Roboto-Bold",label:"Roboto Bold",path:o(th),style:"normal",weight:"700"},{name:"RobotoCondensed-Regular",label:"Roboto Condensed",path:o(tm),style:"normal",weight:"400"},{name:"RobotoCondensed-Bold",label:"Roboto Condensed Bold",path:o(tp),style:"normal",weight:"700"},{name:"CourierPrime-Regular",label:"Courier Prime",path:o(tg),style:"normal",weight:"400"},{name:"CourierPrime-Bold",label:"Courier Prime Bold",path:o(tb),style:"normal",weight:"700"},{name:"OpenSans-Regular",label:"Open Sans",path:o(tf),style:"normal",weight:"400"},{name:"OpenSans-Bold",label:"Open Sans Bold",path:o(tv),style:"normal",weight:"400"}],tw=async(e,t,o={})=>{try{let i=new FontFace(e,`url(${t})`,{...o});await i.load(),document.fonts.add(i)}catch(e){console.error(e)}},tk=document.getElementById("errorsContainer"),tE=e=>{let t=e.currentTarget;t.removeEventListener("click",tE),tk.removeChild(t.parentNode)},tx=(e="",t="info")=>{["info","warning","danger"].includes(t)||(t="info");let o=` - ${e} - - `,i=document.createElement("div");i.className=`alert alert-${t} alert-dismissible text-break mb-2 fade`,i.innerHTML=o,i.querySelector("button").addEventListener("click",tE),tk.appendChild(i),setTimeout(()=>i.classList.add("show"),100)},tS={id:"",text:"",fillColor:"#ffffff",strokeColor:"#000000",font:"Pressuru",fontSize:40,fontWeight:"normal",textAlign:"center",shadowBlur:0,strokeWidth:1.5,offsetY:0,offsetX:0,rotate:0,allCaps:!0},tC=new Map;class tj{constructor(e){let t=ti("textbox",Date.now().toString(36));this.data=e?{...e,id:t}:{...tS,id:t},tC.set(t,this),document.dispatchEvent(new CustomEvent("textbox-create",{bubbles:!0,composed:!0,detail:{textbox:this}}))}getData(){return this.data}static create(e){return new tj(e)}static getAll(){return tC}static getById(e){return tC.get(e)}static remove(e){tC.delete(e),document.dispatchEvent(new CustomEvent("textbox-remove",{bubbles:!0,composed:!0,detail:{id:e}}))}static createElement(e,t=!0){if(!(e instanceof tj))return;let o=e.getData(),{id:i,text:n,fillColor:a,strokeColor:r,fontSize:s,shadowBlur:l,strokeWidth:d,offsetX:c,offsetY:u,rotate:h}=o,m=` -
- - - - - -
- - - - - - - -
-
- - - `,p=document.createDocumentFragment(),g=document.createElement("div");g.setAttribute("id",i),g.setAttribute("data-section","textbox"),g.className="bg-light border shadow-sm mb-3 rounded",g.innerHTML=m,g.querySelectorAll("select").forEach(e=>e.value=o[e.dataset.input]),g.querySelectorAll('input[type="checkbox"]').forEach(e=>e.checked=o[e.dataset.input]);let b=p.appendChild(g);return t&&setTimeout(()=>b.querySelector('[data-input="text"]').focus(),0),b}}class tT{#k=null;#E=null;constructor(e){this.#k=e,this.#E=this.#k.getContext("2d")}get width(){return this.#k.width}set width(e){this.#k.width=e}get height(){return this.#k.height}set height(e){this.#k.height=e}getDimensions(){return{width:this.width,height:this.height}}setDimensions({width:e,height:t}){return this.width=e,this.height=t,this}toDataURL(){return this.#k.toDataURL()}draw(e,t=new Map){if(null==e)return;let o=this.#k,i=this.#E;i.clearRect(0,0,o.width,o.height),ts(e)?(i.fillStyle=e,i.fillRect(0,0,o.width,o.height)):i.drawImage(e,0,0,o.width,o.height);let n=0;return t.forEach(e=>{let{data:t}=e;n+=1,i.save(),i.font=`${t.fontWeight} ${t.fontSize*o.width/1e3}px ${t.font}`,i.fillStyle=t.fillColor,i.textAlign=t.textAlign,i.strokeStyle=t.strokeColor;let a=i.measureText("M").width+t.fontSize/2,r=o.width/2,s=t.shadowBlur,l=(!0===t.allCaps?t.text.toUpperCase():t.text).split("\n");0!==s&&(i.shadowOffsetX=0,i.shadowOffsetY=0,i.shadowBlur=Math.min(s,20),i.shadowColor=t.strokeColor),i.translate(r+t.offsetX,a*n+t.offsetY),i.rotate(Math.min(t.rotate,360)*Math.PI/180),l.forEach((e,t)=>i.fillText(e,0,t*a)),0!==s&&(i.shadowBlur=0,l.forEach((e,t)=>i.fillText(e,0,t*a))),t.strokeWidth>0&&(i.lineWidth=Math.min(t.strokeWidth,20),l.forEach((e,t)=>i.strokeText(e,0,t*a))),i.restore()}),this}clear(){return this.#E.clearRect(0,0,this.#k.width,this.#k.height),this}show(){return this.#k.hidden=!1,this}hide(){return this.#k.hidden=!0,this}static createInstance(e){return new tT(e)}}let tA=tT.createInstance(document.getElementById("canvas")),tL=document.getElementById("videoModal"),tz=document.getElementById("downloadModal"),tD=document.querySelector("files-dropzone"),t_=document.getElementById("instructions"),t$=document.getElementById("imageUploadMethodSelect"),tI=document.getElementById("fileSelectBtn"),tB=document.getElementById("imageUrlForm"),tR=document.getElementById("addTextboxBtn"),tM=document.getElementById("textboxesContainer"),tN=document.getElementById("generateMemeBtn"),tF=document.getElementById("openVideoModalBtn"),tO=document.getElementById("downloadMemeBtn"),tP=document.getElementById("downloadMemePreview"),tU=document.querySelector("web-share"),tq=document.getElementById("gallery"),tH=document.getElementById("gallerySearch"),tW=tq.querySelector(".gallery__no-results"),tV=document.getElementById("solidColorForm"),tG=document.querySelectorAll(".upload-method"),tX=document.getElementById("removeConfirmationModal"),tY=document.getElementById("removeTextForm"),tJ=document.getElementById("maxImageDimensionsForm"),tK=tJ.maxImageDimensions,tQ=document.getElementById("clearCanvasBtn"),tZ=tr.get("maxImageDimensions"),t0=!1,t1=null,t8=null,t3=async()=>{let e=tA.toDataURL("image/png"),t=`${ti("meme")}.png`,o=e.replace("image/png","image/octet-stream");if(tO.download=t,tO.href=o,tP.width=tA.getDimensions().width,tP.height=tA.getDimensions().height,tP.src=o,eF())try{let o=await tn({url:e,filename:t,mimeType:"image/png"}).catch(e=>tx(e.message,"danger"));o&&eF({files:[o]})&&(tU.shareFiles=[o],tU.hidden=!1)}catch(e){console.error(e)}window.requestAnimationFrame(()=>{tz.open=!0})},t2=e=>{let[t,o]=tJ.maxImageDimensions.value.split("x"),i=Number(t)||800,n=Number(o)||600,a=e.width,r=e.height;a>r?a>i&&(r*=i/a,a=i):r>n&&(a*=n/r,r=n),tA.setDimensions({width:a,height:r})},t5=()=>{tA.draw(t1,tj.getAll()).show(),tD.classList.add("dropzone--accepted"),tD.disabled=!0,tN.disabled=!1,t_.hidden=!0,tQ.hidden=!1},t4=e=>{t2(t1=e.target),t5()},t9=e=>{if(!e)return;let t=new Image,o=new FileReader;o.addEventListener("load",function(e){let o=e.target.result;t.addEventListener("load",t4),t.src=o}),o.readAsDataURL(e)},t7=(e,t,o)=>{let i=tj.getById(t).getData();switch(e.type){case"checkbox":i[o]=e.checked;break;case"number":i[o]=Number(e.value);break;default:i[o]=e.value}tA.draw(t1,tj.getAll())},t6=async e=>{e.preventDefault();let t=e.target,o=t.querySelector('button[type="submit"]'),i=t.imageUrl.value;if(i.trim()){o.disabled=!0,o.querySelector(".spinner").hidden=!1,o.querySelector(".label").hidden=!0;try{let e=await tn({url:i}).catch(e=>tx(e.message,"danger"));e&&t9(e)}catch{tx(`Failed to load image from "${i}".`,"danger")}finally{o.disabled=!1,o.querySelector(".spinner").hidden=!0,o.querySelector(".label").hidden=!1}}},oe=(e,t)=>()=>{let o=document.getElementById(e),i=o.querySelector('[data-input="offsetY"]'),n=o.querySelector('[data-input="offsetX"]'),a=tj.getById(e);if(!a)return;let r=a.getData();switch(t=t.toLowerCase()){case"up":r.offsetY-=1,i.value=r.offsetY;break;case"down":r.offsetY+=1,i.value=r.offsetY;break;case"left":r.offsetX-=1,n.value=r.offsetX;break;case"right":r.offsetX+=1,n.value=r.offsetX}tA.draw(t1,tj.getAll()),t8=requestAnimationFrame(oe(e,t))},ot=async e=>{let t=e.target.closest("button");if(!t)return;let o=t.querySelector("img");try{let e=await tn({url:o.src}).catch(e=>tx(e.message,"danger"));e&&t9(e)}catch{tx(`Failed to load image: "${o.alt}".`,"danger")}};tI.addEventListener("click",()=>{"function"==typeof tD.openFileDialog&&tD.openFileDialog()}),tF.addEventListener("click",()=>{tL.open=!0}),tR.addEventListener("click",()=>tj.create()),tN.addEventListener("click",t3),tO.addEventListener("click",()=>tz.open=!1),tB.addEventListener("submit",t6),tD.addEventListener("files-dropzone-drop-accepted",e=>{let[t]=e.detail.acceptedFiles;t&&t9(t)}),tM.addEventListener("input",e=>{let t;let o=e.target,i=o.closest('[data-section="textbox"]').id;o.matches('[data-input="text"]')?t="text":o.matches('[data-input="fillColor"]')?t="fillColor":o.matches('[data-input="strokeColor"]')?t="strokeColor":o.matches('[data-input="font"]')?t="font":o.matches('[data-input="fontSize"]')?t="fontSize":o.matches('[data-input="fontWeight"]')?t="fontWeight":o.matches('[data-input="textAlign"]')?t="textAlign":o.matches('[data-input="shadowBlur"]')?t="shadowBlur":o.matches('[data-input="offsetY"]')?t="offsetY":o.matches('[data-input="offsetX"]')?t="offsetX":o.matches('[data-input="rotate"]')?t="rotate":o.matches('[data-input="strokeWidth"]')&&(t="strokeWidth"),t&&t7(o,i,t)}),tM.addEventListener("change",e=>{let t;let o=e.target,i=o.closest('[data-section="textbox"]').id;o.matches('[data-input="allCaps"]')&&(t="allCaps"),t&&t7(o,i,t)}),tM.addEventListener("click",e=>{let t=e.target;if(t.matches('[data-button="settings"]')){let e=t.closest('[data-section="textbox"]'),o=e?.querySelector('[data-section="settings"]');o&&(o.hidden=!o.hidden)}if(t.matches('[data-button="duplicate-text-box"')){let e=t.closest('[data-section="textbox"]'),o=tj.getById(e.id);tj.create({...o.data})}if(t.matches('[data-button="delete-text-box"]')){let e=t.closest('[data-section="textbox"]').id,o=tj.getById(e);if(o&&o.data.text.trim()){let t=tY["textbox-id"];t&&(t.value=e,tX.open=!0)}else tj.remove(e)}}),tM.addEventListener("pointerdown",e=>{let t=e.target,o=t.closest('[data-section="textbox"]');o&&t.matches('[data-action="move-text"]')&&(t8=requestAnimationFrame(oe(o.id,t.getAttribute("aria-label"))))}),tM.addEventListener("pointerup",e=>{e.target.matches('[data-action="move-text"]')&&(cancelAnimationFrame&&cancelAnimationFrame(t8),t8=null)}),tM.addEventListener("pointerout",e=>{e.target.matches('[data-action="move-text"]')&&(cancelAnimationFrame&&cancelAnimationFrame(t8),t8=null)}),tM.addEventListener("keydown",e=>{let t=e.target,o=t.closest('[data-section="textbox"]');t.matches('[data-action="move-text"]')&&(" "===e.key||"Enter"===e.key)&&(t8&&cancelAnimationFrame(t8),t8=requestAnimationFrame(oe(o.id,t.getAttribute("aria-label"))))}),tM.addEventListener("keyup",e=>{e.target.matches('[data-action="move-text"]')&&(" "===e.key||"Enter"===e.key)&&(t8&&cancelAnimationFrame(t8),t8=null)}),t$.addEventListener("change",e=>{tG.forEach(t=>t.hidden=t.id!==e.target.value),tJ.hidden="solidColorForm"===e.target.value}),tq.addEventListener("click",ot),tH.addEventListener("input",e=>{let t=e.target.value.toLowerCase().trim();tq.querySelectorAll("button").forEach(e=>{let o=(e.querySelector("img").getAttribute("alt")||"").toLowerCase();e.hidden=!o.includes(t)}),tW.hidden=!!tq.querySelector("button:not([hidden])")}),tV.addEventListener("input",e=>{e.target===tV.canvasColor&&(t1=e.target.value),ts(t1)&&(tA.setDimensions({width:Number(tV.canvasWidth.value)||800,height:Number(tV.canvasHeight.value)||600}),t5())}),document.addEventListener("web-share:error",()=>{tz.open=!1,tx("There was an error while trying to share your meme.","danger")}),document.addEventListener("capture-photo:error",e=>{let t=e.detail.error,o="An error occurred while trying to capture photo.";t instanceof Error&&("NotAllowedError"===t.name||"NotFoundError"===t.name)&&(o+=" Make sure you have a camera connected and you have granted the appropriate permissions."),tx(o,"danger"),tL.open=!1,console.error(t)}),document.addEventListener("capture-photo:success",e=>{tL.open=!1;let t=new Image;t.addEventListener("load",t4),t.src=e.detail.dataURI}),document.addEventListener("me-open",e=>{if("videoModal"===e.target.id){let e=tL.querySelector("capture-photo");e&&"function"==typeof e.startVideoStream&&e.startVideoStream()}}),document.addEventListener("me-close",e=>{if("videoModal"===e.target.id){let e=tL.querySelector("capture-photo");e&&"function"==typeof e.stopVideoStream&&e.stopVideoStream()}"removeConfirmationModal"===e.target.id&&tY.reset()}),document.addEventListener("emoji-click",e=>{let t=e.target.closest('[data-section="textbox"]');if(t){let o=t.querySelector('[data-input="text"]'),i=e.detail.unicode;o&&eN(o,i)}}),document.addEventListener("textbox-create",e=>{let t=e.detail.textbox,o=tj.createElement(t,t0);t0=!0,tM.appendChild(o),t.getData().text&&tA.draw(t1,tj.getAll())}),document.addEventListener("textbox-remove",e=>{let t=document.getElementById(e.detail.id);t&&t.remove(),tM.querySelectorAll('[data-section="textbox"]').forEach((e,t)=>{e.querySelector('[data-input="text"]').setAttribute("placeholder",`Text #${t+1}`)}),tA.draw(t1,tj.getAll())}),tY.addEventListener("submit",e=>{e.preventDefault();let t=e.target["textbox-id"].value;t&&(tj.remove(t),tX.open=!1)}),tJ.addEventListener("change",e=>{e.target.matches('[name="maxImageDimensions"]')&&tr.set("maxImageDimensions",e.target.value),!t1||ts(t1)||(t2(t1),tA.draw(t1,tj.getAll()))}),tQ.addEventListener("click",e=>{t1&&(e.stopPropagation(),t1=null,tD.classList.remove("dropzone--accepted"),tN.disabled=!0,t_.hidden=!1,tQ.hidden=!0,tD.disabled=!1,tA.clear().hide())}),tq.querySelectorAll("button > img")?.forEach(e=>{e.setAttribute("title",e.getAttribute("alt"))}),tj.create(),tD.accept=to,((e,t)=>{if(!t)return;let o=e.map(e=>e.split("/")[1]),i=`Supported image formats: ${o.join(", ")}`,n=document.createElement("div"),a=document.createElement("small");a.textContent=i,n.appendChild(a),t.appendChild(a)})(to,t_),ty.forEach(({name:e,path:t,style:o,weight:i})=>{tw(e,t,{style:o,weight:i})}),tZ&&(tK.value=tZ),tK.disabled=!1}(); -//# sourceMappingURL=index.6d86f4dd.js.map diff --git a/index.6d86f4dd.js.map b/index.6d86f4dd.js.map deleted file mode 100644 index 8d4928b..0000000 --- a/index.6d86f4dd.js.map +++ /dev/null @@ -1 +0,0 @@ -{"mappings":"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","sources":["","src/js/index.js","node_modules/emoji-picker-element/index.js","node_modules/emoji-picker-element/picker.js","node_modules/emoji-picker-element/database.js","node_modules/insert-text-at-cursor/dist/index.esm.js","node_modules/insert-text-at-cursor/index.js","node_modules/@georapbox/web-share-element/dist/is-web-share-supported.js","node_modules/@georapbox/web-share-element/dist/","node_modules/@georapbox/web-share-element/dist/src/is-web-share-supported.js","node_modules/@georapbox/web-share-element/dist/web-share-defined.js","node_modules/@georapbox/web-share-element/dist/src/web-share-defined.js","node_modules/@georapbox/web-share-element/dist/src/web-share.js","node_modules/@georapbox/capture-photo-element/dist/capture-photo-defined.js","node_modules/@georapbox/capture-photo-element/dist/","node_modules/@georapbox/capture-photo-element/dist/src/capture-photo-defined.js","node_modules/@georapbox/capture-photo-element/dist/src/capture-photo.js","node_modules/@georapbox/capture-photo-element/dist/src/utils/clamp.js","node_modules/@georapbox/modal-element/dist/modal-element-defined.js","node_modules/@georapbox/modal-element/dist/","node_modules/@georapbox/modal-element/dist/src/modal-element-defined.js","node_modules/@georapbox/modal-element/dist/src/modal-element.js","node_modules/@georapbox/files-dropzone-element/dist/files-dropzone-defined.js","node_modules/@georapbox/files-dropzone-element/dist/","node_modules/@georapbox/files-dropzone-element/dist/src/files-dropzone-defined.js","node_modules/@georapbox/files-dropzone-element/dist/src/files-dropzone.js","node_modules/@georapbox/files-dropzone-element/dist/src/utils/is-valid-file.js","node_modules/@georapbox/files-dropzone-element/dist/src/utils/files-selector.js","src/js/constants.js","src/js/utils/uid.js","src/js/utils/file-from-url.js","src/js/utils/storage.js","src/js/utils/is-solid-color-selected.js","src/js/custom-fonts.js","node_modules/@parcel/runtime-js/lib/runtime-dc4c638fb3cf3900.js","node_modules/@parcel/runtime-js/lib/runtime-f0173e87d28c89f8.js","node_modules/@parcel/runtime-js/lib/runtime-73957b0a5a96c8f8.js","node_modules/@parcel/runtime-js/lib/runtime-2fab85f36645c8e5.js","node_modules/@parcel/runtime-js/lib/runtime-410721d5a743746d.js","node_modules/@parcel/runtime-js/lib/runtime-ef58ed596f597f4b.js","node_modules/@parcel/runtime-js/lib/runtime-06fb3edab3c48625.js","node_modules/@parcel/runtime-js/lib/runtime-caaef9dc1e506632.js","node_modules/@parcel/runtime-js/lib/runtime-3c82f1536232dcbc.js","node_modules/@parcel/runtime-js/lib/runtime-85d0488227eae081.js","node_modules/@parcel/runtime-js/lib/runtime-80e5177a38047bea.js","src/js/toast-alert.js","src/js/textbox.js","src/js/canvas.js"],"sourcesContent":["(function () {\n\nfunction $parcel$interopDefault(a) {\n return a && a.__esModule ? a.default : a;\n}\n\n var $parcel$global =\n typeof globalThis !== 'undefined'\n ? globalThis\n : typeof self !== 'undefined'\n ? self\n : typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : {};\n \nvar $parcel$modules = {};\nvar $parcel$inits = {};\n\nvar parcelRequire = $parcel$global[\"parcelRequire5078\"];\n\nif (parcelRequire == null) {\n parcelRequire = function(id) {\n if (id in $parcel$modules) {\n return $parcel$modules[id].exports;\n }\n if (id in $parcel$inits) {\n var init = $parcel$inits[id];\n delete $parcel$inits[id];\n var module = {id: id, exports: {}};\n $parcel$modules[id] = module;\n init.call(module.exports, module, module.exports);\n return module.exports;\n }\n var err = new Error(\"Cannot find module '\" + id + \"'\");\n err.code = 'MODULE_NOT_FOUND';\n throw err;\n };\n\n parcelRequire.register = function register(id, init) {\n $parcel$inits[id] = init;\n };\n\n $parcel$global[\"parcelRequire5078\"] = parcelRequire;\n}\n\nvar parcelRegister = parcelRequire.register;\nfunction $d1f26ac162b12b4a$var$assertNonEmptyString(str) {\n if (typeof str !== \"string\" || !str) throw new Error(\"expected a non-empty string, got: \" + str);\n}\nfunction $d1f26ac162b12b4a$var$assertNumber(number) {\n if (typeof number !== \"number\") throw new Error(\"expected a number, got: \" + number);\n}\nconst $d1f26ac162b12b4a$var$DB_VERSION_CURRENT = 1;\nconst $d1f26ac162b12b4a$var$DB_VERSION_INITIAL = 1;\nconst $d1f26ac162b12b4a$var$STORE_EMOJI = \"emoji\";\nconst $d1f26ac162b12b4a$var$STORE_KEYVALUE = \"keyvalue\";\nconst $d1f26ac162b12b4a$var$STORE_FAVORITES = \"favorites\";\nconst $d1f26ac162b12b4a$var$FIELD_TOKENS = \"tokens\";\nconst $d1f26ac162b12b4a$var$INDEX_TOKENS = \"tokens\";\nconst $d1f26ac162b12b4a$var$FIELD_UNICODE = \"unicode\";\nconst $d1f26ac162b12b4a$var$INDEX_COUNT = \"count\";\nconst $d1f26ac162b12b4a$var$FIELD_GROUP = \"group\";\nconst $d1f26ac162b12b4a$var$FIELD_ORDER = \"order\";\nconst $d1f26ac162b12b4a$var$INDEX_GROUP_AND_ORDER = \"group-order\";\nconst $d1f26ac162b12b4a$var$KEY_ETAG = \"eTag\";\nconst $d1f26ac162b12b4a$var$KEY_URL = \"url\";\nconst $d1f26ac162b12b4a$var$KEY_PREFERRED_SKINTONE = \"skinTone\";\nconst $d1f26ac162b12b4a$var$MODE_READONLY = \"readonly\";\nconst $d1f26ac162b12b4a$var$MODE_READWRITE = \"readwrite\";\nconst $d1f26ac162b12b4a$var$INDEX_SKIN_UNICODE = \"skinUnicodes\";\nconst $d1f26ac162b12b4a$var$FIELD_SKIN_UNICODE = \"skinUnicodes\";\nconst $d1f26ac162b12b4a$var$DEFAULT_DATA_SOURCE = \"https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json\";\nconst $d1f26ac162b12b4a$var$DEFAULT_LOCALE = \"en\";\n// like lodash's uniqBy but much smaller\nfunction $d1f26ac162b12b4a$var$uniqBy(arr, func) {\n const set = new Set();\n const res = [];\n for (const item of arr){\n const key = func(item);\n if (!set.has(key)) {\n set.add(key);\n res.push(item);\n }\n }\n return res;\n}\nfunction $d1f26ac162b12b4a$var$uniqEmoji(emojis) {\n return $d1f26ac162b12b4a$var$uniqBy(emojis, (_)=>_.unicode);\n}\nfunction $d1f26ac162b12b4a$var$initialMigration(db) {\n function createObjectStore(name, keyPath, indexes) {\n const store = keyPath ? db.createObjectStore(name, {\n keyPath: keyPath\n }) : db.createObjectStore(name);\n if (indexes) for (const [indexName, [keyPath, multiEntry]] of Object.entries(indexes))store.createIndex(indexName, keyPath, {\n multiEntry: multiEntry\n });\n return store;\n }\n createObjectStore($d1f26ac162b12b4a$var$STORE_KEYVALUE);\n createObjectStore($d1f26ac162b12b4a$var$STORE_EMOJI, /* keyPath */ $d1f26ac162b12b4a$var$FIELD_UNICODE, {\n [$d1f26ac162b12b4a$var$INDEX_TOKENS]: [\n $d1f26ac162b12b4a$var$FIELD_TOKENS,\n /* multiEntry */ true\n ],\n [$d1f26ac162b12b4a$var$INDEX_GROUP_AND_ORDER]: [\n [\n $d1f26ac162b12b4a$var$FIELD_GROUP,\n $d1f26ac162b12b4a$var$FIELD_ORDER\n ]\n ],\n [$d1f26ac162b12b4a$var$INDEX_SKIN_UNICODE]: [\n $d1f26ac162b12b4a$var$FIELD_SKIN_UNICODE,\n /* multiEntry */ true\n ]\n });\n createObjectStore($d1f26ac162b12b4a$var$STORE_FAVORITES, undefined, {\n [$d1f26ac162b12b4a$var$INDEX_COUNT]: [\n \"\"\n ]\n });\n}\nconst $d1f26ac162b12b4a$var$openIndexedDBRequests = {};\nconst $d1f26ac162b12b4a$var$databaseCache = {};\nconst $d1f26ac162b12b4a$var$onCloseListeners = {};\nfunction $d1f26ac162b12b4a$var$handleOpenOrDeleteReq(resolve, reject, req) {\n // These things are almost impossible to test with fakeIndexedDB sadly\n /* istanbul ignore next */ req.onerror = ()=>reject(req.error);\n /* istanbul ignore next */ req.onblocked = ()=>reject(new Error(\"IDB blocked\"));\n req.onsuccess = ()=>resolve(req.result);\n}\nasync function $d1f26ac162b12b4a$var$createDatabase(dbName) {\n const db = await new Promise((resolve, reject)=>{\n const req = indexedDB.open(dbName, $d1f26ac162b12b4a$var$DB_VERSION_CURRENT);\n $d1f26ac162b12b4a$var$openIndexedDBRequests[dbName] = req;\n req.onupgradeneeded = (e)=>{\n // Technically there is only one version, so we don't need this `if` check\n // But if an old version of the JS is in another browser tab\n // and it gets upgraded in the future and we have a new DB version, well...\n // better safe than sorry.\n /* istanbul ignore else */ if (e.oldVersion < $d1f26ac162b12b4a$var$DB_VERSION_INITIAL) $d1f26ac162b12b4a$var$initialMigration(req.result);\n };\n $d1f26ac162b12b4a$var$handleOpenOrDeleteReq(resolve, reject, req);\n });\n // Handle abnormal closes, e.g. \"delete database\" in chrome dev tools.\n // No need for removeEventListener, because once the DB can no longer\n // fire \"close\" events, it will auto-GC.\n // Unfortunately cannot test in fakeIndexedDB: https://github.com/dumbmatter/fakeIndexedDB/issues/50\n /* istanbul ignore next */ db.onclose = ()=>$d1f26ac162b12b4a$var$closeDatabase(dbName);\n return db;\n}\nfunction $d1f26ac162b12b4a$var$openDatabase(dbName) {\n if (!$d1f26ac162b12b4a$var$databaseCache[dbName]) $d1f26ac162b12b4a$var$databaseCache[dbName] = $d1f26ac162b12b4a$var$createDatabase(dbName);\n return $d1f26ac162b12b4a$var$databaseCache[dbName];\n}\nfunction $d1f26ac162b12b4a$var$dbPromise(db, storeName, readOnlyOrReadWrite, cb) {\n return new Promise((resolve, reject)=>{\n // Use relaxed durability because neither the emoji data nor the favorites/preferred skin tone\n // are really irreplaceable data. IndexedDB is just a cache in this case.\n const txn = db.transaction(storeName, readOnlyOrReadWrite, {\n durability: \"relaxed\"\n });\n const store = typeof storeName === \"string\" ? txn.objectStore(storeName) : storeName.map((name)=>txn.objectStore(name));\n let res;\n cb(store, txn, (result)=>{\n res = result;\n });\n txn.oncomplete = ()=>resolve(res);\n /* istanbul ignore next */ txn.onerror = ()=>reject(txn.error);\n });\n}\nfunction $d1f26ac162b12b4a$var$closeDatabase(dbName) {\n // close any open requests\n const req = $d1f26ac162b12b4a$var$openIndexedDBRequests[dbName];\n const db = req && req.result;\n if (db) {\n db.close();\n const listeners = $d1f26ac162b12b4a$var$onCloseListeners[dbName];\n /* istanbul ignore else */ if (listeners) for (const listener of listeners)listener();\n }\n delete $d1f26ac162b12b4a$var$openIndexedDBRequests[dbName];\n delete $d1f26ac162b12b4a$var$databaseCache[dbName];\n delete $d1f26ac162b12b4a$var$onCloseListeners[dbName];\n}\nfunction $d1f26ac162b12b4a$var$deleteDatabase(dbName) {\n return new Promise((resolve, reject)=>{\n // close any open requests\n $d1f26ac162b12b4a$var$closeDatabase(dbName);\n const req = indexedDB.deleteDatabase(dbName);\n $d1f26ac162b12b4a$var$handleOpenOrDeleteReq(resolve, reject, req);\n });\n}\n// The \"close\" event occurs during an abnormal shutdown, e.g. a user clearing their browser data.\n// However, it doesn't occur with the normal \"close\" event, so we handle that separately.\n// https://www.w3.org/TR/IndexedDB/#close-a-database-connection\nfunction $d1f26ac162b12b4a$var$addOnCloseListener(dbName, listener) {\n let listeners = $d1f26ac162b12b4a$var$onCloseListeners[dbName];\n if (!listeners) listeners = $d1f26ac162b12b4a$var$onCloseListeners[dbName] = [];\n listeners.push(listener);\n}\n// list of emoticons that don't match a simple \\W+ regex\n// extracted using:\n// require('emoji-picker-element-data/en/emojibase/data.json').map(_ => _.emoticon).filter(Boolean).filter(_ => !/^\\W+$/.test(_))\nconst $d1f26ac162b12b4a$var$irregularEmoticons = new Set([\n \":D\",\n \"XD\",\n \":'D\",\n \"O:)\",\n \":X\",\n \":P\",\n \";P\",\n \"XP\",\n \":L\",\n \":Z\",\n \":j\",\n \"8D\",\n \"XO\",\n \"8)\",\n \":B\",\n \":O\",\n \":S\",\n \":'o\",\n \"Dx\",\n \"X(\",\n \"D:\",\n \":C\",\n \">0)\",\n \":3\",\n \"{\n if (!word.match(/\\w/) || $d1f26ac162b12b4a$var$irregularEmoticons.has(word)) // for pure emoticons like :) or :-), just leave them as-is\n return word.toLowerCase();\n return word.replace(/[)(:,]/g, \"\").replace(/’/g, \"'\").toLowerCase();\n }).filter(Boolean);\n}\nconst $d1f26ac162b12b4a$var$MIN_SEARCH_TEXT_LENGTH = 2;\n// This is an extra step in addition to extractTokens(). The difference here is that we expect\n// the input to have already been run through extractTokens(). This is useful for cases like\n// emoticons, where we don't want to do any tokenization (because it makes no sense to split up\n// \">:)\" by the colon) but we do want to lowercase it to have consistent search results, so that\n// the user can type ':P' or ':p' and still get the same result.\nfunction $d1f26ac162b12b4a$var$normalizeTokens(str) {\n return str.filter(Boolean).map((_)=>_.toLowerCase()).filter((_)=>_.length >= $d1f26ac162b12b4a$var$MIN_SEARCH_TEXT_LENGTH);\n}\n// Transform emoji data for storage in IDB\nfunction $d1f26ac162b12b4a$var$transformEmojiData(emojiData) {\n const res = emojiData.map(({ annotation: annotation, emoticon: emoticon, group: group, order: order, shortcodes: shortcodes, skins: skins, tags: tags, emoji: emoji, version: version })=>{\n const tokens = [\n ...new Set($d1f26ac162b12b4a$var$normalizeTokens([\n ...(shortcodes || []).map($d1f26ac162b12b4a$var$extractTokens).flat(),\n ...tags.map($d1f26ac162b12b4a$var$extractTokens).flat(),\n ...$d1f26ac162b12b4a$var$extractTokens(annotation),\n emoticon\n ]))\n ].sort();\n const res = {\n annotation: annotation,\n group: group,\n order: order,\n tags: tags,\n tokens: tokens,\n unicode: emoji,\n version: version\n };\n if (emoticon) res.emoticon = emoticon;\n if (shortcodes) res.shortcodes = shortcodes;\n if (skins) {\n res.skinTones = [];\n res.skinUnicodes = [];\n res.skinVersions = [];\n for (const { tone: tone, emoji: emoji, version: version } of skins){\n res.skinTones.push(tone);\n res.skinUnicodes.push(emoji);\n res.skinVersions.push(version);\n }\n }\n return res;\n });\n return res;\n}\n// helper functions that help compress the code better\nfunction $d1f26ac162b12b4a$var$callStore(store, method, key, cb) {\n store[method](key).onsuccess = (e)=>cb && cb(e.target.result);\n}\nfunction $d1f26ac162b12b4a$var$getIDB(store, key, cb) {\n $d1f26ac162b12b4a$var$callStore(store, \"get\", key, cb);\n}\nfunction $d1f26ac162b12b4a$var$getAllIDB(store, key, cb) {\n $d1f26ac162b12b4a$var$callStore(store, \"getAll\", key, cb);\n}\nfunction $d1f26ac162b12b4a$var$commit(txn) {\n /* istanbul ignore else */ if (txn.commit) txn.commit();\n}\n// like lodash's minBy\nfunction $d1f26ac162b12b4a$var$minBy(array, func) {\n let minItem = array[0];\n for(let i = 1; i < array.length; i++){\n const item = array[i];\n if (func(minItem) > func(item)) minItem = item;\n }\n return minItem;\n}\n// return an array of results representing all items that are found in each one of the arrays\n//\nfunction $d1f26ac162b12b4a$var$findCommonMembers(arrays, uniqByFunc) {\n const shortestArray = $d1f26ac162b12b4a$var$minBy(arrays, (_)=>_.length);\n const results = [];\n for (const item of shortestArray)// if this item is included in every array in the intermediate results, add it to the final results\n if (!arrays.some((array)=>array.findIndex((_)=>uniqByFunc(_) === uniqByFunc(item)) === -1)) results.push(item);\n return results;\n}\nasync function $d1f26ac162b12b4a$var$isEmpty(db) {\n return !await $d1f26ac162b12b4a$var$get(db, $d1f26ac162b12b4a$var$STORE_KEYVALUE, $d1f26ac162b12b4a$var$KEY_URL);\n}\nasync function $d1f26ac162b12b4a$var$hasData(db, url, eTag) {\n const [oldETag, oldUrl] = await Promise.all([\n $d1f26ac162b12b4a$var$KEY_ETAG,\n $d1f26ac162b12b4a$var$KEY_URL\n ].map((key)=>$d1f26ac162b12b4a$var$get(db, $d1f26ac162b12b4a$var$STORE_KEYVALUE, key)));\n return oldETag === eTag && oldUrl === url;\n}\nasync function $d1f26ac162b12b4a$var$doFullDatabaseScanForSingleResult(db, predicate) {\n // This batching algorithm is just a perf improvement over a basic\n // cursor. The BATCH_SIZE is an estimate of what would give the best\n // perf for doing a full DB scan (worst case).\n //\n // Mini-benchmark for determining the best batch size:\n //\n // PERF=1 pnpm build:rollup && pnpm test:adhoc\n //\n // (async () => {\n // performance.mark('start')\n // await $('emoji-picker').database.getEmojiByShortcode('doesnotexist')\n // performance.measure('total', 'start')\n // console.log(performance.getEntriesByName('total').slice(-1)[0].duration)\n // })()\n const BATCH_SIZE = 50; // Typically around 150ms for 6x slowdown in Chrome for above benchmark\n return $d1f26ac162b12b4a$var$dbPromise(db, $d1f26ac162b12b4a$var$STORE_EMOJI, $d1f26ac162b12b4a$var$MODE_READONLY, (emojiStore, txn, cb)=>{\n let lastKey;\n const processNextBatch = ()=>{\n emojiStore.getAll(lastKey && IDBKeyRange.lowerBound(lastKey, true), BATCH_SIZE).onsuccess = (e)=>{\n const results = e.target.result;\n for (const result of results){\n lastKey = result.unicode;\n if (predicate(result)) return cb(result);\n }\n if (results.length < BATCH_SIZE) return cb();\n processNextBatch();\n };\n };\n processNextBatch();\n });\n}\nasync function $d1f26ac162b12b4a$var$loadData(db, emojiData, url, eTag) {\n {\n const transformedData = $d1f26ac162b12b4a$var$transformEmojiData(emojiData);\n await $d1f26ac162b12b4a$var$dbPromise(db, [\n $d1f26ac162b12b4a$var$STORE_EMOJI,\n $d1f26ac162b12b4a$var$STORE_KEYVALUE\n ], $d1f26ac162b12b4a$var$MODE_READWRITE, ([emojiStore, metaStore], txn)=>{\n let oldETag;\n let oldUrl;\n let todo = 0;\n function checkFetched() {\n if (++todo === 2) onFetched();\n }\n function onFetched() {\n if (oldETag === eTag && oldUrl === url) // check again within the transaction to guard against concurrency, e.g. multiple browser tabs\n return;\n // delete old data\n emojiStore.clear();\n // insert new data\n for (const data of transformedData)emojiStore.put(data);\n metaStore.put(eTag, $d1f26ac162b12b4a$var$KEY_ETAG);\n metaStore.put(url, $d1f26ac162b12b4a$var$KEY_URL);\n $d1f26ac162b12b4a$var$commit(txn);\n }\n $d1f26ac162b12b4a$var$getIDB(metaStore, $d1f26ac162b12b4a$var$KEY_ETAG, (result)=>{\n oldETag = result;\n checkFetched();\n });\n $d1f26ac162b12b4a$var$getIDB(metaStore, $d1f26ac162b12b4a$var$KEY_URL, (result)=>{\n oldUrl = result;\n checkFetched();\n });\n });\n }\n}\nasync function $d1f26ac162b12b4a$var$getEmojiByGroup(db, group) {\n return $d1f26ac162b12b4a$var$dbPromise(db, $d1f26ac162b12b4a$var$STORE_EMOJI, $d1f26ac162b12b4a$var$MODE_READONLY, (emojiStore, txn, cb)=>{\n const range = IDBKeyRange.bound([\n group,\n 0\n ], [\n group + 1,\n 0\n ], false, true);\n $d1f26ac162b12b4a$var$getAllIDB(emojiStore.index($d1f26ac162b12b4a$var$INDEX_GROUP_AND_ORDER), range, cb);\n });\n}\nasync function $d1f26ac162b12b4a$var$getEmojiBySearchQuery(db, query) {\n const tokens = $d1f26ac162b12b4a$var$normalizeTokens($d1f26ac162b12b4a$var$extractTokens(query));\n if (!tokens.length) return [];\n return $d1f26ac162b12b4a$var$dbPromise(db, $d1f26ac162b12b4a$var$STORE_EMOJI, $d1f26ac162b12b4a$var$MODE_READONLY, (emojiStore, txn, cb)=>{\n // get all results that contain all tokens (i.e. an AND query)\n const intermediateResults = [];\n const checkDone = ()=>{\n if (intermediateResults.length === tokens.length) onDone();\n };\n const onDone = ()=>{\n const results = $d1f26ac162b12b4a$var$findCommonMembers(intermediateResults, (_)=>_.unicode);\n cb(results.sort((a, b)=>a.order < b.order ? -1 : 1));\n };\n for(let i = 0; i < tokens.length; i++){\n const token = tokens[i];\n const range = i === tokens.length - 1 ? IDBKeyRange.bound(token, token + \"\\uFFFF\", false, true) // treat last token as a prefix search\n : IDBKeyRange.only(token); // treat all other tokens as an exact match\n $d1f26ac162b12b4a$var$getAllIDB(emojiStore.index($d1f26ac162b12b4a$var$INDEX_TOKENS), range, (result)=>{\n intermediateResults.push(result);\n checkDone();\n });\n }\n });\n}\n// This could have been implemented as an IDB index on shortcodes, but it seemed wasteful to do that\n// when we can already query by tokens and this will give us what we're looking for 99.9% of the time\nasync function $d1f26ac162b12b4a$var$getEmojiByShortcode(db, shortcode) {\n const emojis = await $d1f26ac162b12b4a$var$getEmojiBySearchQuery(db, shortcode);\n // In very rare cases (e.g. the shortcode \"v\" as in \"v for victory\"), we cannot search because\n // there are no usable tokens (too short in this case). In that case, we have to do an inefficient\n // full-database scan, which I believe is an acceptable tradeoff for not having to have an extra\n // index on shortcodes.\n if (!emojis.length) {\n const predicate = (_)=>(_.shortcodes || []).includes(shortcode.toLowerCase());\n return await $d1f26ac162b12b4a$var$doFullDatabaseScanForSingleResult(db, predicate) || null;\n }\n return emojis.filter((_)=>{\n const lowerShortcodes = (_.shortcodes || []).map((_)=>_.toLowerCase());\n return lowerShortcodes.includes(shortcode.toLowerCase());\n })[0] || null;\n}\nasync function $d1f26ac162b12b4a$var$getEmojiByUnicode(db, unicode) {\n return $d1f26ac162b12b4a$var$dbPromise(db, $d1f26ac162b12b4a$var$STORE_EMOJI, $d1f26ac162b12b4a$var$MODE_READONLY, (emojiStore, txn, cb)=>$d1f26ac162b12b4a$var$getIDB(emojiStore, unicode, (result)=>{\n if (result) return cb(result);\n $d1f26ac162b12b4a$var$getIDB(emojiStore.index($d1f26ac162b12b4a$var$INDEX_SKIN_UNICODE), unicode, (result)=>cb(result || null));\n }));\n}\nfunction $d1f26ac162b12b4a$var$get(db, storeName, key) {\n return $d1f26ac162b12b4a$var$dbPromise(db, storeName, $d1f26ac162b12b4a$var$MODE_READONLY, (store, txn, cb)=>$d1f26ac162b12b4a$var$getIDB(store, key, cb));\n}\nfunction $d1f26ac162b12b4a$var$set(db, storeName, key, value) {\n return $d1f26ac162b12b4a$var$dbPromise(db, storeName, $d1f26ac162b12b4a$var$MODE_READWRITE, (store, txn)=>{\n store.put(value, key);\n $d1f26ac162b12b4a$var$commit(txn);\n });\n}\nfunction $d1f26ac162b12b4a$var$incrementFavoriteEmojiCount(db, unicode) {\n return $d1f26ac162b12b4a$var$dbPromise(db, $d1f26ac162b12b4a$var$STORE_FAVORITES, $d1f26ac162b12b4a$var$MODE_READWRITE, (store, txn)=>$d1f26ac162b12b4a$var$getIDB(store, unicode, (result)=>{\n store.put((result || 0) + 1, unicode);\n $d1f26ac162b12b4a$var$commit(txn);\n }));\n}\nfunction $d1f26ac162b12b4a$var$getTopFavoriteEmoji(db, customEmojiIndex, limit) {\n if (limit === 0) return [];\n return $d1f26ac162b12b4a$var$dbPromise(db, [\n $d1f26ac162b12b4a$var$STORE_FAVORITES,\n $d1f26ac162b12b4a$var$STORE_EMOJI\n ], $d1f26ac162b12b4a$var$MODE_READONLY, ([favoritesStore, emojiStore], txn, cb)=>{\n const results = [];\n favoritesStore.index($d1f26ac162b12b4a$var$INDEX_COUNT).openCursor(undefined, \"prev\").onsuccess = (e)=>{\n const cursor = e.target.result;\n if (!cursor) return cb(results);\n function addResult(result) {\n results.push(result);\n if (results.length === limit) return cb(results) // done, reached the limit\n ;\n cursor.continue();\n }\n const unicodeOrName = cursor.primaryKey;\n const custom = customEmojiIndex.byName(unicodeOrName);\n if (custom) return addResult(custom);\n // This could be done in parallel (i.e. make the cursor and the get()s parallelized),\n // but my testing suggests it's not actually faster.\n $d1f26ac162b12b4a$var$getIDB(emojiStore, unicodeOrName, (emoji)=>{\n if (emoji) return addResult(emoji);\n // emoji not found somehow, ignore (may happen if custom emoji change)\n cursor.continue();\n });\n };\n });\n}\n// trie data structure for prefix searches\n// loosely based on https://github.com/nolanlawson/substring-trie\nconst $d1f26ac162b12b4a$var$CODA_MARKER = \"\"; // marks the end of the string\nfunction $d1f26ac162b12b4a$var$trie(arr, itemToTokens) {\n const map = new Map();\n for (const item of arr){\n const tokens = itemToTokens(item);\n for (const token of tokens){\n let currentMap = map;\n for(let i = 0; i < token.length; i++){\n const char = token.charAt(i);\n let nextMap = currentMap.get(char);\n if (!nextMap) {\n nextMap = new Map();\n currentMap.set(char, nextMap);\n }\n currentMap = nextMap;\n }\n let valuesAtCoda = currentMap.get($d1f26ac162b12b4a$var$CODA_MARKER);\n if (!valuesAtCoda) {\n valuesAtCoda = [];\n currentMap.set($d1f26ac162b12b4a$var$CODA_MARKER, valuesAtCoda);\n }\n valuesAtCoda.push(item);\n }\n }\n const search = (query, exact)=>{\n let currentMap = map;\n for(let i = 0; i < query.length; i++){\n const char = query.charAt(i);\n const nextMap = currentMap.get(char);\n if (nextMap) currentMap = nextMap;\n else return [];\n }\n if (exact) {\n const results = currentMap.get($d1f26ac162b12b4a$var$CODA_MARKER);\n return results || [];\n }\n const results = [];\n // traverse\n const queue = [\n currentMap\n ];\n while(queue.length){\n const currentMap = queue.shift();\n const entriesSortedByKey = [\n ...currentMap.entries()\n ].sort((a, b)=>a[0] < b[0] ? -1 : 1);\n for (const [key, value] of entriesSortedByKey)if (key === $d1f26ac162b12b4a$var$CODA_MARKER) results.push(...value);\n else queue.push(value);\n }\n return results;\n };\n return search;\n}\nconst $d1f26ac162b12b4a$var$requiredKeys$1 = [\n \"name\",\n \"url\"\n];\nfunction $d1f26ac162b12b4a$var$assertCustomEmojis(customEmojis) {\n const isArray = customEmojis && Array.isArray(customEmojis);\n const firstItemIsFaulty = isArray && customEmojis.length && (!customEmojis[0] || $d1f26ac162b12b4a$var$requiredKeys$1.some((key)=>!(key in customEmojis[0])));\n if (!isArray || firstItemIsFaulty) throw new Error(\"Custom emojis are in the wrong format\");\n}\nfunction $d1f26ac162b12b4a$var$customEmojiIndex(customEmojis) {\n $d1f26ac162b12b4a$var$assertCustomEmojis(customEmojis);\n const sortByName = (a, b)=>a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1;\n //\n // all()\n //\n const all = customEmojis.sort(sortByName);\n //\n // search()\n //\n const emojiToTokens = (emoji)=>[\n ...new Set((emoji.shortcodes || []).map((shortcode)=>$d1f26ac162b12b4a$var$extractTokens(shortcode)).flat())\n ];\n const searchTrie = $d1f26ac162b12b4a$var$trie(customEmojis, emojiToTokens);\n const searchByExactMatch = (_)=>searchTrie(_, true);\n const searchByPrefix = (_)=>searchTrie(_, false);\n // Search by query for custom emoji. Similar to how we do this in IDB, the last token\n // is treated as a prefix search, but every other one is treated as an exact match.\n // Then we AND the results together\n const search = (query)=>{\n const tokens = $d1f26ac162b12b4a$var$extractTokens(query);\n const intermediateResults = tokens.map((token, i)=>(i < tokens.length - 1 ? searchByExactMatch : searchByPrefix)(token));\n return $d1f26ac162b12b4a$var$findCommonMembers(intermediateResults, (_)=>_.name).sort(sortByName);\n };\n //\n // byShortcode, byName\n //\n const shortcodeToEmoji = new Map();\n const nameToEmoji = new Map();\n for (const customEmoji of customEmojis){\n nameToEmoji.set(customEmoji.name.toLowerCase(), customEmoji);\n for (const shortcode of customEmoji.shortcodes || [])shortcodeToEmoji.set(shortcode.toLowerCase(), customEmoji);\n }\n const byShortcode = (shortcode)=>shortcodeToEmoji.get(shortcode.toLowerCase());\n const byName = (name)=>nameToEmoji.get(name.toLowerCase());\n return {\n all: all,\n search: search,\n byShortcode: byShortcode,\n byName: byName\n };\n}\nconst $d1f26ac162b12b4a$var$isFirefoxContentScript = typeof wrappedJSObject !== \"undefined\";\n// remove some internal implementation details, i.e. the \"tokens\" array on the emoji object\n// essentially, convert the emoji from the version stored in IDB to the version used in-memory\nfunction $d1f26ac162b12b4a$var$cleanEmoji(emoji) {\n if (!emoji) return emoji;\n // if inside a Firefox content script, need to clone the emoji object to prevent Firefox from complaining about\n // cross-origin object. See: https://github.com/nolanlawson/emoji-picker-element/issues/356\n /* istanbul ignore if */ if ($d1f26ac162b12b4a$var$isFirefoxContentScript) emoji = structuredClone(emoji);\n delete emoji.tokens;\n if (emoji.skinTones) {\n const len = emoji.skinTones.length;\n emoji.skins = Array(len);\n for(let i = 0; i < len; i++)emoji.skins[i] = {\n tone: emoji.skinTones[i],\n unicode: emoji.skinUnicodes[i],\n version: emoji.skinVersions[i]\n };\n delete emoji.skinTones;\n delete emoji.skinUnicodes;\n delete emoji.skinVersions;\n }\n return emoji;\n}\nfunction $d1f26ac162b12b4a$var$warnETag(eTag) {\n if (!eTag) console.warn(\"emoji-picker-element is more efficient if the dataSource server exposes an ETag header.\");\n}\nconst $d1f26ac162b12b4a$var$requiredKeys = [\n \"annotation\",\n \"emoji\",\n \"group\",\n \"order\",\n \"tags\",\n \"version\"\n];\nfunction $d1f26ac162b12b4a$var$assertEmojiData(emojiData) {\n if (!emojiData || !Array.isArray(emojiData) || !emojiData[0] || typeof emojiData[0] !== \"object\" || $d1f26ac162b12b4a$var$requiredKeys.some((key)=>!(key in emojiData[0]))) throw new Error(\"Emoji data is in the wrong format\");\n}\nfunction $d1f26ac162b12b4a$var$assertStatus(response, dataSource) {\n if (Math.floor(response.status / 100) !== 2) throw new Error(\"Failed to fetch: \" + dataSource + \": \" + response.status);\n}\nasync function $d1f26ac162b12b4a$var$getETag(dataSource) {\n const response = await fetch(dataSource, {\n method: \"HEAD\"\n });\n $d1f26ac162b12b4a$var$assertStatus(response, dataSource);\n const eTag = response.headers.get(\"etag\");\n $d1f26ac162b12b4a$var$warnETag(eTag);\n return eTag;\n}\nasync function $d1f26ac162b12b4a$var$getETagAndData(dataSource) {\n const response = await fetch(dataSource);\n $d1f26ac162b12b4a$var$assertStatus(response, dataSource);\n const eTag = response.headers.get(\"etag\");\n $d1f26ac162b12b4a$var$warnETag(eTag);\n const emojiData = await response.json();\n $d1f26ac162b12b4a$var$assertEmojiData(emojiData);\n return [\n eTag,\n emojiData\n ];\n}\n// TODO: including these in blob-util.ts causes typedoc to generate docs for them,\n// even with --excludePrivate ¯\\_(ツ)_/¯\n/** @private */ /**\n * Convert an `ArrayBuffer` to a binary string.\n *\n * Example:\n *\n * ```js\n * var myString = blobUtil.arrayBufferToBinaryString(arrayBuff)\n * ```\n *\n * @param buffer - array buffer\n * @returns binary string\n */ function $d1f26ac162b12b4a$var$arrayBufferToBinaryString(buffer) {\n var binary = \"\";\n var bytes = new Uint8Array(buffer);\n var length = bytes.byteLength;\n var i = -1;\n while(++i < length)binary += String.fromCharCode(bytes[i]);\n return binary;\n}\n/**\n * Convert a binary string to an `ArrayBuffer`.\n *\n * ```js\n * var myBuffer = blobUtil.binaryStringToArrayBuffer(binaryString)\n * ```\n *\n * @param binary - binary string\n * @returns array buffer\n */ function $d1f26ac162b12b4a$var$binaryStringToArrayBuffer(binary) {\n var length = binary.length;\n var buf = new ArrayBuffer(length);\n var arr = new Uint8Array(buf);\n var i = -1;\n while(++i < length)arr[i] = binary.charCodeAt(i);\n return buf;\n}\n// generate a checksum based on the stringified JSON\nasync function $d1f26ac162b12b4a$var$jsonChecksum(object) {\n const inString = JSON.stringify(object);\n let inBuffer = $d1f26ac162b12b4a$var$binaryStringToArrayBuffer(inString);\n // this does not need to be cryptographically secure, SHA-1 is fine\n const outBuffer = await crypto.subtle.digest(\"SHA-1\", inBuffer);\n const outBinString = $d1f26ac162b12b4a$var$arrayBufferToBinaryString(outBuffer);\n const res = btoa(outBinString);\n return res;\n}\nasync function $d1f26ac162b12b4a$var$checkForUpdates(db, dataSource) {\n // just do a simple HEAD request first to see if the eTags match\n let emojiData;\n let eTag = await $d1f26ac162b12b4a$var$getETag(dataSource);\n if (!eTag) {\n const eTagAndData = await $d1f26ac162b12b4a$var$getETagAndData(dataSource);\n eTag = eTagAndData[0];\n emojiData = eTagAndData[1];\n if (!eTag) eTag = await $d1f26ac162b12b4a$var$jsonChecksum(emojiData);\n }\n if (await $d1f26ac162b12b4a$var$hasData(db, dataSource, eTag)) ;\n else {\n if (!emojiData) {\n const eTagAndData = await $d1f26ac162b12b4a$var$getETagAndData(dataSource);\n emojiData = eTagAndData[1];\n }\n await $d1f26ac162b12b4a$var$loadData(db, emojiData, dataSource, eTag);\n }\n}\nasync function $d1f26ac162b12b4a$var$loadDataForFirstTime(db, dataSource) {\n let [eTag, emojiData] = await $d1f26ac162b12b4a$var$getETagAndData(dataSource);\n if (!eTag) // Handle lack of support for ETag or Access-Control-Expose-Headers\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers#Browser_compatibility\n eTag = await $d1f26ac162b12b4a$var$jsonChecksum(emojiData);\n await $d1f26ac162b12b4a$var$loadData(db, emojiData, dataSource, eTag);\n}\nclass $d1f26ac162b12b4a$export$2e2bcd8739ae039 {\n constructor({ dataSource: dataSource = $d1f26ac162b12b4a$var$DEFAULT_DATA_SOURCE, locale: locale = $d1f26ac162b12b4a$var$DEFAULT_LOCALE, customEmoji: customEmoji = [] } = {}){\n this.dataSource = dataSource;\n this.locale = locale;\n this._dbName = `emoji-picker-element-${this.locale}`;\n this._db = undefined;\n this._lazyUpdate = undefined;\n this._custom = $d1f26ac162b12b4a$var$customEmojiIndex(customEmoji);\n this._clear = this._clear.bind(this);\n this._ready = this._init();\n }\n async _init() {\n const db = this._db = await $d1f26ac162b12b4a$var$openDatabase(this._dbName);\n $d1f26ac162b12b4a$var$addOnCloseListener(this._dbName, this._clear);\n const dataSource = this.dataSource;\n const empty = await $d1f26ac162b12b4a$var$isEmpty(db);\n if (empty) await $d1f26ac162b12b4a$var$loadDataForFirstTime(db, dataSource);\n else this._lazyUpdate = $d1f26ac162b12b4a$var$checkForUpdates(db, dataSource);\n }\n async ready() {\n const checkReady = async ()=>{\n if (!this._ready) this._ready = this._init();\n return this._ready;\n };\n await checkReady();\n // There's a possibility of a race condition where the element gets added, removed, and then added again\n // with a particular timing, which would set the _db to undefined.\n // We *could* do a while loop here, but that seems excessive and could lead to an infinite loop.\n if (!this._db) await checkReady();\n }\n async getEmojiByGroup(group) {\n $d1f26ac162b12b4a$var$assertNumber(group);\n await this.ready();\n return $d1f26ac162b12b4a$var$uniqEmoji(await $d1f26ac162b12b4a$var$getEmojiByGroup(this._db, group)).map($d1f26ac162b12b4a$var$cleanEmoji);\n }\n async getEmojiBySearchQuery(query) {\n $d1f26ac162b12b4a$var$assertNonEmptyString(query);\n await this.ready();\n const customs = this._custom.search(query);\n const natives = $d1f26ac162b12b4a$var$uniqEmoji(await $d1f26ac162b12b4a$var$getEmojiBySearchQuery(this._db, query)).map($d1f26ac162b12b4a$var$cleanEmoji);\n return [\n ...customs,\n ...natives\n ];\n }\n async getEmojiByShortcode(shortcode) {\n $d1f26ac162b12b4a$var$assertNonEmptyString(shortcode);\n await this.ready();\n const custom = this._custom.byShortcode(shortcode);\n if (custom) return custom;\n return $d1f26ac162b12b4a$var$cleanEmoji(await $d1f26ac162b12b4a$var$getEmojiByShortcode(this._db, shortcode));\n }\n async getEmojiByUnicodeOrName(unicodeOrName) {\n $d1f26ac162b12b4a$var$assertNonEmptyString(unicodeOrName);\n await this.ready();\n const custom = this._custom.byName(unicodeOrName);\n if (custom) return custom;\n return $d1f26ac162b12b4a$var$cleanEmoji(await $d1f26ac162b12b4a$var$getEmojiByUnicode(this._db, unicodeOrName));\n }\n async getPreferredSkinTone() {\n await this.ready();\n return await $d1f26ac162b12b4a$var$get(this._db, $d1f26ac162b12b4a$var$STORE_KEYVALUE, $d1f26ac162b12b4a$var$KEY_PREFERRED_SKINTONE) || 0;\n }\n async setPreferredSkinTone(skinTone) {\n $d1f26ac162b12b4a$var$assertNumber(skinTone);\n await this.ready();\n return $d1f26ac162b12b4a$var$set(this._db, $d1f26ac162b12b4a$var$STORE_KEYVALUE, $d1f26ac162b12b4a$var$KEY_PREFERRED_SKINTONE, skinTone);\n }\n async incrementFavoriteEmojiCount(unicodeOrName) {\n $d1f26ac162b12b4a$var$assertNonEmptyString(unicodeOrName);\n await this.ready();\n return $d1f26ac162b12b4a$var$incrementFavoriteEmojiCount(this._db, unicodeOrName);\n }\n async getTopFavoriteEmoji(limit) {\n $d1f26ac162b12b4a$var$assertNumber(limit);\n await this.ready();\n return (await $d1f26ac162b12b4a$var$getTopFavoriteEmoji(this._db, this._custom, limit)).map($d1f26ac162b12b4a$var$cleanEmoji);\n }\n set customEmoji(customEmojis) {\n this._custom = $d1f26ac162b12b4a$var$customEmojiIndex(customEmojis);\n }\n get customEmoji() {\n return this._custom.all;\n }\n async _shutdown() {\n await this.ready(); // reopen if we've already been closed/deleted\n try {\n await this._lazyUpdate; // allow any lazy updates to process before closing/deleting\n } catch (err) {}\n }\n // clear references to IDB, e.g. during a close event\n _clear() {\n // We don't need to call removeEventListener or remove the manual \"close\" listeners.\n // The memory leak tests prove this is unnecessary. It's because:\n // 1) IDBDatabases that can no longer fire \"close\" automatically have listeners GCed\n // 2) we clear the manual close listeners in databaseLifecycle.js.\n this._db = this._ready = this._lazyUpdate = undefined;\n }\n async close() {\n await this._shutdown();\n await $d1f26ac162b12b4a$var$closeDatabase(this._dbName);\n }\n async delete() {\n await this._shutdown();\n await $d1f26ac162b12b4a$var$deleteDatabase(this._dbName);\n }\n}\n\n\n// via https://unpkg.com/browse/emojibase-data@6.0.0/meta/groups.json\nconst $1e5dc5e467331cb9$var$allGroups = [\n [\n -1,\n \"\\u2728\",\n \"custom\"\n ],\n [\n 0,\n \"\\uD83D\\uDE00\",\n \"smileys-emotion\"\n ],\n [\n 1,\n \"\\uD83D\\uDC4B\",\n \"people-body\"\n ],\n [\n 3,\n \"\\uD83D\\uDC31\",\n \"animals-nature\"\n ],\n [\n 4,\n \"\\uD83C\\uDF4E\",\n \"food-drink\"\n ],\n [\n 5,\n \"\\uD83C\\uDFE0\\uFE0F\",\n \"travel-places\"\n ],\n [\n 6,\n \"\\u26BD\",\n \"activities\"\n ],\n [\n 7,\n \"\\uD83D\\uDCDD\",\n \"objects\"\n ],\n [\n 8,\n \"\\u26D4\\uFE0F\",\n \"symbols\"\n ],\n [\n 9,\n \"\\uD83C\\uDFC1\",\n \"flags\"\n ]\n].map(([id, emoji, name])=>({\n id: id,\n emoji: emoji,\n name: name\n }));\nconst $1e5dc5e467331cb9$var$groups = $1e5dc5e467331cb9$var$allGroups.slice(1);\nconst $1e5dc5e467331cb9$var$MIN_SEARCH_TEXT_LENGTH = 2;\nconst $1e5dc5e467331cb9$var$NUM_SKIN_TONES = 6;\n/* istanbul ignore next */ const $1e5dc5e467331cb9$var$rIC = typeof requestIdleCallback === \"function\" ? requestIdleCallback : setTimeout;\n// check for ZWJ (zero width joiner) character\nfunction $1e5dc5e467331cb9$var$hasZwj(emoji) {\n return emoji.unicode.includes(\"\\u200D\");\n}\n// Find one good representative emoji from each version to test by checking its color.\n// Ideally it should have color in the center. For some inspiration, see:\n// https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/\n//\n// Note that for certain versions (12.1, 13.1), there is no point in testing them explicitly, because\n// all the emoji from this version are compound-emoji from previous versions. So they would pass a color\n// test, even in browsers that display them as double emoji. (E.g. \"face in clouds\" might render as\n// \"face without mouth\" plus \"fog\".) These emoji can only be filtered using the width test,\n// which happens in checkZwjSupport.js.\nconst $1e5dc5e467331cb9$var$versionsAndTestEmoji = {\n \"\\uD83E\\uDEE8\": 15.1,\n \"\\uD83E\\uDEE0\": 14,\n \"\\uD83E\\uDD72\": 13.1,\n \"\\uD83E\\uDD7B\": 12.1,\n \"\\uD83E\\uDD70\": 11,\n \"\\uD83E\\uDD29\": 5,\n \"\\uD83D\\uDC71\\u200D\\u2640\\uFE0F\": 4,\n \"\\uD83E\\uDD23\": 3,\n \"\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8\\uFE0F\": 2,\n \"\\uD83D\\uDE00\": 1,\n \"\\uD83D\\uDE10\\uFE0F\": 0.7,\n \"\\uD83D\\uDE03\": 0.6\n};\nconst $1e5dc5e467331cb9$var$TIMEOUT_BEFORE_LOADING_MESSAGE = 1000; // 1 second\nconst $1e5dc5e467331cb9$var$DEFAULT_SKIN_TONE_EMOJI = \"\\uD83D\\uDD90\\uFE0F\";\nconst $1e5dc5e467331cb9$var$DEFAULT_NUM_COLUMNS = 8;\n// Based on https://fivethirtyeight.com/features/the-100-most-used-emojis/ and\n// https://blog.emojipedia.org/facebook-reveals-most-and-least-used-emojis/ with\n// a bit of my own curation. (E.g. avoid the \"OK\" gesture because of connotations:\n// https://emojipedia.org/ok-hand/)\nconst $1e5dc5e467331cb9$var$MOST_COMMONLY_USED_EMOJI = [\n \"\\uD83D\\uDE0A\",\n \"\\uD83D\\uDE12\",\n \"\\u2764\\uFE0F\",\n \"\\uD83D\\uDC4D\\uFE0F\",\n \"\\uD83D\\uDE0D\",\n \"\\uD83D\\uDE02\",\n \"\\uD83D\\uDE2D\",\n \"\\u263A\\uFE0F\",\n \"\\uD83D\\uDE14\",\n \"\\uD83D\\uDE29\",\n \"\\uD83D\\uDE0F\",\n \"\\uD83D\\uDC95\",\n \"\\uD83D\\uDE4C\",\n \"\\uD83D\\uDE18\"\n];\n// It's important to list Twemoji Mozilla before everything else, because Mozilla bundles their\n// own font on some platforms (notably Windows and Linux as of this writing). Typically, Mozilla\n// updates faster than the underlying OS, and we don't want to render older emoji in one font and\n// newer emoji in another font:\n// https://github.com/nolanlawson/emoji-picker-element/pull/268#issuecomment-1073347283\nconst $1e5dc5e467331cb9$var$FONT_FAMILY = '\"Twemoji Mozilla\",\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\",\"EmojiOne Color\",\"Android Emoji\",sans-serif';\n/* istanbul ignore next */ const $1e5dc5e467331cb9$var$DEFAULT_CATEGORY_SORTING = (a, b)=>a < b ? -1 : a > b ? 1 : 0;\n// Test if an emoji is supported by rendering it to canvas and checking that the color is not black\n// See https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/\n// and https://www.npmjs.com/package/if-emoji for inspiration\n// This implementation is largely borrowed from if-emoji, adding the font-family\nconst $1e5dc5e467331cb9$var$getTextFeature = (text, color)=>{\n const canvas = document.createElement(\"canvas\");\n canvas.width = canvas.height = 1;\n const ctx = canvas.getContext(\"2d\");\n ctx.textBaseline = \"top\";\n ctx.font = `100px ${$1e5dc5e467331cb9$var$FONT_FAMILY}`;\n ctx.fillStyle = color;\n ctx.scale(0.01, 0.01);\n ctx.fillText(text, 0, 0);\n return ctx.getImageData(0, 0, 1, 1).data;\n};\nconst $1e5dc5e467331cb9$var$compareFeatures = (feature1, feature2)=>{\n const feature1Str = [\n ...feature1\n ].join(\",\");\n const feature2Str = [\n ...feature2\n ].join(\",\");\n // This is RGBA, so for 0,0,0, we are checking that the first RGB is not all zeroes.\n // Most of the time when unsupported this is 0,0,0,0, but on Chrome on Mac it is\n // 0,0,0,61 - there is a transparency here.\n return feature1Str === feature2Str && !feature1Str.startsWith(\"0,0,0,\");\n};\nfunction $1e5dc5e467331cb9$var$testColorEmojiSupported(text) {\n // Render white and black and then compare them to each other and ensure they're the same\n // color, and neither one is black. This shows that the emoji was rendered in color.\n const feature1 = $1e5dc5e467331cb9$var$getTextFeature(text, \"#000\");\n const feature2 = $1e5dc5e467331cb9$var$getTextFeature(text, \"#fff\");\n return feature1 && feature2 && $1e5dc5e467331cb9$var$compareFeatures(feature1, feature2);\n}\n// rather than check every emoji ever, which would be expensive, just check some representatives from the\n// different emoji releases to determine what the font supports\nfunction $1e5dc5e467331cb9$var$determineEmojiSupportLevel() {\n const entries = Object.entries($1e5dc5e467331cb9$var$versionsAndTestEmoji);\n try {\n // start with latest emoji and work backwards\n for (const [emoji, version] of entries){\n if ($1e5dc5e467331cb9$var$testColorEmojiSupported(emoji)) return version;\n }\n } catch (e) {} finally{}\n // In case of an error, be generous and just assume all emoji are supported (e.g. for canvas errors\n // due to anti-fingerprinting add-ons). Better to show some gray boxes than nothing at all.\n return entries[0][1] // first one in the list is the most recent version\n ;\n}\n// Check which emojis we know for sure aren't supported, based on Unicode version level\nlet $1e5dc5e467331cb9$var$promise;\nconst $1e5dc5e467331cb9$var$detectEmojiSupportLevel = ()=>{\n if (!$1e5dc5e467331cb9$var$promise) // Delay so it can run while the IDB database is being created by the browser (on another thread).\n // This helps especially with first load – we want to start pre-populating the database on the main thread,\n // and then wait for IDB to commit everything, and while waiting we run this check.\n $1e5dc5e467331cb9$var$promise = new Promise((resolve)=>$1e5dc5e467331cb9$var$rIC(()=>resolve($1e5dc5e467331cb9$var$determineEmojiSupportLevel()) // delay so ideally this can run while IDB is first populating\n ));\n return $1e5dc5e467331cb9$var$promise;\n};\n// determine which emojis containing ZWJ (zero width joiner) characters\n// are supported (rendered as one glyph) rather than unsupported (rendered as two or more glyphs)\nconst $1e5dc5e467331cb9$var$supportedZwjEmojis = new Map();\nconst $1e5dc5e467331cb9$var$VARIATION_SELECTOR = \"\\uFE0F\";\nconst $1e5dc5e467331cb9$var$SKINTONE_MODIFIER = \"\\ud83c\";\nconst $1e5dc5e467331cb9$var$ZWJ = \"\\u200D\";\nconst $1e5dc5e467331cb9$var$LIGHT_SKIN_TONE = 0x1F3FB;\nconst $1e5dc5e467331cb9$var$LIGHT_SKIN_TONE_MODIFIER = 0xdffb;\n// TODO: this is a naive implementation, we can improve it later\n// It's only used for the skintone picker, so as long as people don't customize with\n// really exotic emoji then it should work fine\nfunction $1e5dc5e467331cb9$var$applySkinTone(str, skinTone) {\n if (skinTone === 0) return str;\n const zwjIndex = str.indexOf($1e5dc5e467331cb9$var$ZWJ);\n if (zwjIndex !== -1) return str.substring(0, zwjIndex) + String.fromCodePoint($1e5dc5e467331cb9$var$LIGHT_SKIN_TONE + skinTone - 1) + str.substring(zwjIndex);\n if (str.endsWith($1e5dc5e467331cb9$var$VARIATION_SELECTOR)) str = str.substring(0, str.length - 1);\n return str + $1e5dc5e467331cb9$var$SKINTONE_MODIFIER + String.fromCodePoint($1e5dc5e467331cb9$var$LIGHT_SKIN_TONE_MODIFIER + skinTone - 1);\n}\nfunction $1e5dc5e467331cb9$var$halt(event) {\n event.preventDefault();\n event.stopPropagation();\n}\n// Implementation left/right or up/down navigation, circling back when you\n// reach the start/end of the list\nfunction $1e5dc5e467331cb9$var$incrementOrDecrement(decrement, val, arr) {\n val += decrement ? -1 : 1;\n if (val < 0) val = arr.length - 1;\n else if (val >= arr.length) val = 0;\n return val;\n}\n// like lodash's uniqBy but much smaller\nfunction $1e5dc5e467331cb9$var$uniqBy(arr, func) {\n const set = new Set();\n const res = [];\n for (const item of arr){\n const key = func(item);\n if (!set.has(key)) {\n set.add(key);\n res.push(item);\n }\n }\n return res;\n}\n// We don't need all the data on every emoji, and there are specific things we need\n// for the UI, so build a \"view model\" from the emoji object we got from the database\nfunction $1e5dc5e467331cb9$var$summarizeEmojisForUI(emojis, emojiSupportLevel) {\n const toSimpleSkinsMap = (skins)=>{\n const res = {};\n for (const skin of skins)// ignore arrays like [1, 2] with multiple skin tones\n // also ignore variants that are in an unsupported emoji version\n // (these do exist - variants from a different version than their base emoji)\n if (typeof skin.tone === \"number\" && skin.version <= emojiSupportLevel) res[skin.tone] = skin.unicode;\n return res;\n };\n return emojis.map(({ unicode: unicode, skins: skins, shortcodes: shortcodes, url: url, name: name, category: category, annotation: annotation })=>({\n unicode: unicode,\n name: name,\n shortcodes: shortcodes,\n url: url,\n category: category,\n annotation: annotation,\n id: unicode || name,\n skins: skins && toSimpleSkinsMap(skins)\n }));\n}\n// import rAF from one place so that the bundle size is a bit smaller\nconst $1e5dc5e467331cb9$var$rAF = requestAnimationFrame;\n// Svelte action to calculate the width of an element and auto-update\n// using ResizeObserver. If ResizeObserver is unsupported, we just use rAF once\n// and don't bother to update.\nlet $1e5dc5e467331cb9$var$resizeObserverSupported = typeof ResizeObserver === \"function\";\nfunction $1e5dc5e467331cb9$var$calculateWidth(node, abortSignal, onUpdate) {\n let resizeObserver;\n if ($1e5dc5e467331cb9$var$resizeObserverSupported) {\n resizeObserver = new ResizeObserver((entries)=>onUpdate(entries[0].contentRect.width));\n resizeObserver.observe(node);\n } else $1e5dc5e467331cb9$var$rAF(()=>onUpdate(node.getBoundingClientRect().width));\n // cleanup function (called on destroy)\n abortSignal.addEventListener(\"abort\", ()=>{\n if (resizeObserver) resizeObserver.disconnect();\n });\n}\n// get the width of the text inside of a DOM node, via https://stackoverflow.com/a/59525891/680742\nfunction $1e5dc5e467331cb9$var$calculateTextWidth(node) {\n /* istanbul ignore else */ {\n const range = document.createRange();\n range.selectNode(node.firstChild);\n return range.getBoundingClientRect().width;\n }\n}\nlet $1e5dc5e467331cb9$var$baselineEmojiWidth;\nfunction $1e5dc5e467331cb9$var$checkZwjSupport(zwjEmojisToCheck, baselineEmoji, emojiToDomNode) {\n for (const emoji of zwjEmojisToCheck){\n const domNode = emojiToDomNode(emoji);\n const emojiWidth = $1e5dc5e467331cb9$var$calculateTextWidth(domNode);\n if (typeof $1e5dc5e467331cb9$var$baselineEmojiWidth === \"undefined\") $1e5dc5e467331cb9$var$baselineEmojiWidth = $1e5dc5e467331cb9$var$calculateTextWidth(baselineEmoji);\n // On Windows, some supported emoji are ~50% bigger than the baseline emoji, but what we really want to guard\n // against are the ones that are 2x the size, because those are truly broken (person with red hair = person with\n // floating red wig, black cat = cat with black square, polar bear = bear with snowflake, etc.)\n // So here we set the threshold at 1.8 times the size of the baseline emoji.\n const supported = emojiWidth / 1.8 < $1e5dc5e467331cb9$var$baselineEmojiWidth;\n $1e5dc5e467331cb9$var$supportedZwjEmojis.set(emoji.unicode, supported);\n }\n}\n// like lodash's uniq\nfunction $1e5dc5e467331cb9$var$uniq(arr) {\n return $1e5dc5e467331cb9$var$uniqBy(arr, (_)=>_);\n}\n// Note we put this in its own function outside Picker.js to avoid Svelte doing an invalidation on the \"setter\" here.\n// At best the invalidation is useless, at worst it can cause infinite loops:\n// https://github.com/nolanlawson/emoji-picker-element/pull/180\n// https://github.com/sveltejs/svelte/issues/6521\n// Also note tabpanelElement can be null if the element is disconnected immediately after connected\nfunction $1e5dc5e467331cb9$var$resetScrollTopIfPossible(element) {\n /* istanbul ignore else */ if (element) element.scrollTop = 0;\n}\nfunction $1e5dc5e467331cb9$var$getFromMap(cache, key, func) {\n let cached = cache.get(key);\n if (!cached) {\n cached = func();\n cache.set(key, cached);\n }\n return cached;\n}\nfunction $1e5dc5e467331cb9$var$toString(value) {\n return \"\" + value;\n}\nfunction $1e5dc5e467331cb9$var$parseTemplate(htmlString) {\n const template = document.createElement(\"template\");\n template.innerHTML = htmlString;\n return template;\n}\nconst $1e5dc5e467331cb9$var$parseCache = new WeakMap();\nconst $1e5dc5e467331cb9$var$domInstancesCache = new WeakMap();\n// This needs to be a symbol because it needs to be different from any possible output of a key function\nconst $1e5dc5e467331cb9$var$unkeyedSymbol = Symbol(\"un-keyed\");\n// Not supported in Safari <=13\nconst $1e5dc5e467331cb9$var$hasReplaceChildren = \"replaceChildren\" in Element.prototype;\nfunction $1e5dc5e467331cb9$var$replaceChildren(parentNode, newChildren) {\n /* istanbul ignore else */ if ($1e5dc5e467331cb9$var$hasReplaceChildren) parentNode.replaceChildren(...newChildren);\n else {\n parentNode.innerHTML = \"\";\n parentNode.append(...newChildren);\n }\n}\nfunction $1e5dc5e467331cb9$var$doChildrenNeedRerender(parentNode, newChildren) {\n let oldChild = parentNode.firstChild;\n let oldChildrenCount = 0;\n // iterate using firstChild/nextSibling because browsers use a linked list under the hood\n while(oldChild){\n const newChild = newChildren[oldChildrenCount];\n // check if the old child and new child are the same\n if (newChild !== oldChild) return true;\n oldChild = oldChild.nextSibling;\n oldChildrenCount++;\n }\n // if new children length is different from old, we must re-render\n return oldChildrenCount !== newChildren.length;\n}\nfunction $1e5dc5e467331cb9$var$patchChildren(newChildren, instanceBinding) {\n const { targetNode: targetNode } = instanceBinding;\n let { targetParentNode: targetParentNode } = instanceBinding;\n let needsRerender = false;\n if (targetParentNode) needsRerender = $1e5dc5e467331cb9$var$doChildrenNeedRerender(targetParentNode, newChildren);\n else {\n needsRerender = true;\n instanceBinding.targetNode = undefined; // placeholder node not needed anymore, free memory\n instanceBinding.targetParentNode = targetParentNode = targetNode.parentNode;\n }\n // avoid re-rendering list if the dom nodes are exactly the same before and after\n if (needsRerender) $1e5dc5e467331cb9$var$replaceChildren(targetParentNode, newChildren);\n}\nfunction $1e5dc5e467331cb9$var$patch(expressions, instanceBindings) {\n for (const instanceBinding of instanceBindings){\n const { targetNode: targetNode, currentExpression: currentExpression, binding: { expressionIndex: expressionIndex, attributeName: attributeName, attributeValuePre: attributeValuePre, attributeValuePost: attributeValuePost } } = instanceBinding;\n const expression = expressions[expressionIndex];\n if (currentExpression === expression) continue;\n instanceBinding.currentExpression = expression;\n if (attributeName) targetNode.setAttribute(attributeName, attributeValuePre + $1e5dc5e467331cb9$var$toString(expression) + attributeValuePost);\n else {\n let newNode;\n if (Array.isArray(expression)) $1e5dc5e467331cb9$var$patchChildren(expression, instanceBinding);\n else if (expression instanceof Element) {\n newNode = expression;\n targetNode.replaceWith(newNode);\n } else // nodeValue is faster than textContent supposedly https://www.youtube.com/watch?v=LY6y3HbDVmg\n // note we may be replacing the value in a placeholder text node\n targetNode.nodeValue = $1e5dc5e467331cb9$var$toString(expression);\n if (newNode) instanceBinding.targetNode = newNode;\n }\n }\n}\nfunction $1e5dc5e467331cb9$var$parse(tokens) {\n let htmlString = \"\";\n let withinTag = false;\n let withinAttribute = false;\n let elementIndexCounter = -1; // depth-first traversal order\n const elementsToBindings = new Map();\n const elementIndexes = [];\n for(let i = 0, len = tokens.length; i < len; i++){\n const token = tokens[i];\n htmlString += token;\n if (i === len - 1) break; // no need to process characters - no more expressions to be found\n for(let j = 0; j < token.length; j++){\n const char = token.charAt(j);\n switch(char){\n case \"<\":\n {\n const nextChar = token.charAt(j + 1);\n if (nextChar === \"/\") // leaving an element\n elementIndexes.pop();\n else {\n withinTag = true;\n elementIndexes.push(++elementIndexCounter);\n }\n break;\n }\n case \">\":\n withinTag = false;\n withinAttribute = false;\n break;\n case \"=\":\n withinAttribute = true;\n break;\n }\n }\n const elementIndex = elementIndexes[elementIndexes.length - 1];\n const bindings = $1e5dc5e467331cb9$var$getFromMap(elementsToBindings, elementIndex, ()=>[]);\n let attributeName;\n let attributeValuePre;\n let attributeValuePost;\n if (withinAttribute) {\n // I never use single-quotes for attribute values in HTML, so just support double-quotes or no-quotes\n const match = /(\\S+)=\"?([^\"=]*)$/.exec(token);\n attributeName = match[1];\n attributeValuePre = match[2];\n attributeValuePost = /^[^\">]*/.exec(tokens[i + 1])[0];\n }\n const binding = {\n attributeName: attributeName,\n attributeValuePre: attributeValuePre,\n attributeValuePost: attributeValuePost,\n expressionIndex: i\n };\n bindings.push(binding);\n if (!withinTag && !withinAttribute) // Add a placeholder text node, so we can find it later. Note we only support one dynamic child text node\n htmlString += \" \";\n }\n const template = $1e5dc5e467331cb9$var$parseTemplate(htmlString);\n return {\n template: template,\n elementsToBindings: elementsToBindings\n };\n}\nfunction $1e5dc5e467331cb9$var$traverseAndSetupBindings(dom, elementsToBindings) {\n const instanceBindings = [];\n // traverse dom\n const treeWalker = document.createTreeWalker(dom, NodeFilter.SHOW_ELEMENT);\n let element = dom;\n let elementIndex = -1;\n do {\n const bindings = elementsToBindings.get(++elementIndex);\n if (bindings) for(let i = 0; i < bindings.length; i++){\n const binding = bindings[i];\n const targetNode = binding.attributeName ? element // attribute binding, just use the element itself\n : element.firstChild; // not an attribute binding, so has a placeholder text node\n const instanceBinding = {\n binding: binding,\n targetNode: targetNode,\n targetParentNode: undefined,\n currentExpression: undefined\n };\n instanceBindings.push(instanceBinding);\n }\n }while (element = treeWalker.nextNode());\n return instanceBindings;\n}\nfunction $1e5dc5e467331cb9$var$parseHtml(tokens) {\n // All templates and bound expressions are unique per tokens array\n const { template: template, elementsToBindings: elementsToBindings } = $1e5dc5e467331cb9$var$getFromMap($1e5dc5e467331cb9$var$parseCache, tokens, ()=>$1e5dc5e467331cb9$var$parse(tokens));\n // When we parseHtml, we always return a fresh DOM instance ready to be updated\n const dom = template.cloneNode(true).content.firstElementChild;\n const instanceBindings = $1e5dc5e467331cb9$var$traverseAndSetupBindings(dom, elementsToBindings);\n return function updateDomInstance(expressions) {\n $1e5dc5e467331cb9$var$patch(expressions, instanceBindings);\n return dom;\n };\n}\nfunction $1e5dc5e467331cb9$var$createFramework(state) {\n const domInstances = $1e5dc5e467331cb9$var$getFromMap($1e5dc5e467331cb9$var$domInstancesCache, state, ()=>new Map());\n let domInstanceCacheKey = $1e5dc5e467331cb9$var$unkeyedSymbol;\n function html(tokens, ...expressions) {\n // Each unique lexical usage of map() is considered unique due to the html`` tagged template call it makes,\n // which has lexically unique tokens. The unkeyed symbol is just used for html`` usage outside of a map().\n const domInstancesForTokens = $1e5dc5e467331cb9$var$getFromMap(domInstances, tokens, ()=>new Map());\n const updateDomInstance = $1e5dc5e467331cb9$var$getFromMap(domInstancesForTokens, domInstanceCacheKey, ()=>$1e5dc5e467331cb9$var$parseHtml(tokens));\n return updateDomInstance(expressions) // update with expressions\n ;\n }\n function map(array, callback, keyFunction) {\n return array.map((item, index)=>{\n const originalCacheKey = domInstanceCacheKey;\n domInstanceCacheKey = keyFunction(item);\n try {\n return callback(item, index);\n } finally{\n domInstanceCacheKey = originalCacheKey;\n }\n });\n }\n return {\n map: map,\n html: html\n };\n}\nfunction $1e5dc5e467331cb9$var$render(container, state, helpers, events, actions, refs, abortSignal, firstRender) {\n const { labelWithSkin: labelWithSkin, titleForEmoji: titleForEmoji, unicodeWithSkin: unicodeWithSkin } = helpers;\n const { html: html, map: map } = $1e5dc5e467331cb9$var$createFramework(state);\n function emojiList(emojis, searchMode, prefix) {\n return map(emojis, (emoji, i)=>{\n return html``;\n // It's important for the cache key to be unique based on the prefix, because the framework caches based on the\n // unique tokens + cache key, and the same emoji may be used in the tab as well as in the fav bar\n }, (emoji)=>`${prefix}-${emoji.id}`);\n }\n const section = ()=>{\n return html`
${state.i18n.searchDescription}
${state.i18n.skinToneDescription}
${map(state.skinTones, (skinTone, i)=>{\n return html`
${skinTone}
`;\n }, (skinTone)=>skinTone)}
${map(state.groups, (group)=>{\n return html``;\n }, (group)=>group.id)}
${state.message}
${map(state.currentEmojisWithCategories, (emojiWithCategory, i)=>{\n return html`
${state.searchMode ? state.i18n.searchResultsLabel : emojiWithCategory.category ? emojiWithCategory.category : state.currentEmojisWithCategories.length > 1 ? state.i18n.categories.custom : state.i18n.categories[state.currentGroup.name]}
${emojiList(emojiWithCategory.emojis, state.searchMode, /* prefix */ \"emo\")}
`;\n }, (emojiWithCategory)=>emojiWithCategory.category)}
${emojiList(state.currentFavorites, /* searchMode */ false, /* prefix */ \"fav\")}
`;\n };\n const rootDom = section();\n if (firstRender) {\n container.appendChild(rootDom);\n // we only bind events/refs/actions once - there is no need to find them again given this component structure\n // helper for traversing the dom, finding elements by an attribute, and getting the attribute value\n const forElementWithAttribute = (attributeName, callback)=>{\n for (const element of container.querySelectorAll(`[${attributeName}]`))callback(element, element.getAttribute(attributeName));\n };\n // bind events\n for (const eventName of [\n \"click\",\n \"focusout\",\n \"input\",\n \"keydown\",\n \"keyup\"\n ])forElementWithAttribute(`data-on-${eventName}`, (element, listenerName)=>{\n element.addEventListener(eventName, events[listenerName]);\n });\n // find refs\n forElementWithAttribute(\"data-ref\", (element, ref)=>{\n refs[ref] = element;\n });\n // set up actions\n forElementWithAttribute(\"data-action\", (element, action)=>{\n actions[action](element);\n });\n // destroy/abort logic\n abortSignal.addEventListener(\"abort\", ()=>{\n container.removeChild(rootDom);\n });\n }\n}\n/* istanbul ignore next */ const $1e5dc5e467331cb9$var$qM = typeof queueMicrotask === \"function\" ? queueMicrotask : (callback)=>Promise.resolve().then(callback);\nfunction $1e5dc5e467331cb9$var$createState(abortSignal) {\n let destroyed = false;\n let currentObserver;\n const propsToObservers = new Map();\n const dirtyObservers = new Set();\n let queued;\n const flush = ()=>{\n if (destroyed) return;\n const observersToRun = [\n ...dirtyObservers\n ];\n dirtyObservers.clear(); // clear before running to force any new updates to run in another tick of the loop\n try {\n for (const observer of observersToRun)observer();\n } finally{\n queued = false;\n if (dirtyObservers.size) {\n queued = true;\n $1e5dc5e467331cb9$var$qM(flush);\n }\n }\n };\n const state = new Proxy({}, {\n get (target, prop) {\n if (currentObserver) {\n let observers = propsToObservers.get(prop);\n if (!observers) {\n observers = new Set();\n propsToObservers.set(prop, observers);\n }\n observers.add(currentObserver);\n }\n return target[prop];\n },\n set (target, prop, newValue) {\n target[prop] = newValue;\n const observers = propsToObservers.get(prop);\n if (observers) {\n for (const observer of observers)dirtyObservers.add(observer);\n if (!queued) {\n queued = true;\n $1e5dc5e467331cb9$var$qM(flush);\n }\n }\n return true;\n }\n });\n const createEffect = (callback)=>{\n const runnable = ()=>{\n const oldObserver = currentObserver;\n currentObserver = runnable;\n try {\n return callback();\n } finally{\n currentObserver = oldObserver;\n }\n };\n return runnable();\n };\n // destroy logic\n abortSignal.addEventListener(\"abort\", ()=>{\n destroyed = true;\n });\n return {\n state: state,\n createEffect: createEffect\n };\n}\n// Compare two arrays, with a function called on each item in the two arrays that returns true if the items are equal\nfunction $1e5dc5e467331cb9$var$arraysAreEqualByFunction(left, right, areEqualFunc) {\n if (left.length !== right.length) return false;\n for(let i = 0; i < left.length; i++){\n if (!areEqualFunc(left[i], right[i])) return false;\n }\n return true;\n}\n/* eslint-disable prefer-const,no-labels,no-inner-declarations */ // constants\nconst $1e5dc5e467331cb9$var$EMPTY_ARRAY = [];\nconst { assign: $1e5dc5e467331cb9$var$assign } = Object;\nfunction $1e5dc5e467331cb9$var$createRoot(shadowRoot, props) {\n const refs = {};\n const abortController = new AbortController();\n const abortSignal = abortController.signal;\n const { state: state, createEffect: createEffect } = $1e5dc5e467331cb9$var$createState(abortSignal);\n // initial state\n $1e5dc5e467331cb9$var$assign(state, {\n skinToneEmoji: undefined,\n i18n: undefined,\n database: undefined,\n customEmoji: undefined,\n customCategorySorting: undefined,\n emojiVersion: undefined\n });\n // public props\n $1e5dc5e467331cb9$var$assign(state, props);\n // private props\n $1e5dc5e467331cb9$var$assign(state, {\n initialLoad: true,\n currentEmojis: [],\n currentEmojisWithCategories: [],\n rawSearchText: \"\",\n searchText: \"\",\n searchMode: false,\n activeSearchItem: -1,\n message: undefined,\n skinTonePickerExpanded: false,\n skinTonePickerExpandedAfterAnimation: false,\n currentSkinTone: 0,\n activeSkinTone: 0,\n skinToneButtonText: undefined,\n pickerStyle: undefined,\n skinToneButtonLabel: \"\",\n skinTones: [],\n currentFavorites: [],\n defaultFavoriteEmojis: undefined,\n numColumns: $1e5dc5e467331cb9$var$DEFAULT_NUM_COLUMNS,\n isRtl: false,\n scrollbarWidth: 0,\n currentGroupIndex: 0,\n groups: $1e5dc5e467331cb9$var$groups,\n databaseLoaded: false,\n activeSearchItemId: undefined\n });\n //\n // Update the current group based on the currentGroupIndex\n //\n createEffect(()=>{\n if (state.currentGroup !== state.groups[state.currentGroupIndex]) state.currentGroup = state.groups[state.currentGroupIndex];\n });\n //\n // Utils/helpers\n //\n const focus = (id)=>{\n shadowRoot.getElementById(id).focus();\n };\n const emojiToDomNode = (emoji)=>shadowRoot.getElementById(`emo-${emoji.id}`);\n // fire a custom event that crosses the shadow boundary\n const fireEvent = (name, detail)=>{\n refs.rootElement.dispatchEvent(new CustomEvent(name, {\n detail: detail,\n bubbles: true,\n composed: true\n }));\n };\n //\n // Comparison utils\n //\n const compareEmojiArrays = (a, b)=>a.id === b.id;\n const compareCurrentEmojisWithCategories = (a, b)=>{\n const { category: aCategory, emojis: aEmojis } = a;\n const { category: bCategory, emojis: bEmojis } = b;\n if (aCategory !== bCategory) return false;\n return $1e5dc5e467331cb9$var$arraysAreEqualByFunction(aEmojis, bEmojis, compareEmojiArrays);\n };\n //\n // Update utils to avoid excessive re-renders\n //\n // avoid excessive re-renders by checking the value before setting\n const updateCurrentEmojis = (newEmojis)=>{\n if (!$1e5dc5e467331cb9$var$arraysAreEqualByFunction(state.currentEmojis, newEmojis, compareEmojiArrays)) state.currentEmojis = newEmojis;\n };\n // avoid excessive re-renders\n const updateSearchMode = (newSearchMode)=>{\n if (state.searchMode !== newSearchMode) state.searchMode = newSearchMode;\n };\n // avoid excessive re-renders\n const updateCurrentEmojisWithCategories = (newEmojisWithCategories)=>{\n if (!$1e5dc5e467331cb9$var$arraysAreEqualByFunction(state.currentEmojisWithCategories, newEmojisWithCategories, compareCurrentEmojisWithCategories)) state.currentEmojisWithCategories = newEmojisWithCategories;\n };\n // Helpers used by PickerTemplate\n const unicodeWithSkin = (emoji, currentSkinTone)=>currentSkinTone && emoji.skins && emoji.skins[currentSkinTone] || emoji.unicode;\n const labelWithSkin = (emoji, currentSkinTone)=>$1e5dc5e467331cb9$var$uniq([\n emoji.name || unicodeWithSkin(emoji, currentSkinTone),\n emoji.annotation,\n ...emoji.shortcodes || $1e5dc5e467331cb9$var$EMPTY_ARRAY\n ].filter(Boolean)).join(\", \");\n const titleForEmoji = (emoji)=>emoji.annotation || (emoji.shortcodes || $1e5dc5e467331cb9$var$EMPTY_ARRAY).join(\", \");\n const helpers = {\n labelWithSkin: labelWithSkin,\n titleForEmoji: titleForEmoji,\n unicodeWithSkin: unicodeWithSkin\n };\n const events = {\n onClickSkinToneButton: onClickSkinToneButton,\n onEmojiClick: onEmojiClick,\n onNavClick: onNavClick,\n onNavKeydown: onNavKeydown,\n onSearchKeydown: onSearchKeydown,\n onSkinToneOptionsClick: onSkinToneOptionsClick,\n onSkinToneOptionsFocusOut: onSkinToneOptionsFocusOut,\n onSkinToneOptionsKeydown: onSkinToneOptionsKeydown,\n onSkinToneOptionsKeyup: onSkinToneOptionsKeyup,\n onSearchInput: onSearchInput\n };\n const actions = {\n calculateEmojiGridStyle: calculateEmojiGridStyle\n };\n let firstRender = true;\n createEffect(()=>{\n $1e5dc5e467331cb9$var$render(shadowRoot, state, helpers, events, actions, refs, abortSignal, firstRender);\n firstRender = false;\n });\n //\n // Determine the emoji support level (in requestIdleCallback)\n //\n // mount logic\n if (!state.emojiVersion) $1e5dc5e467331cb9$var$detectEmojiSupportLevel().then((level)=>{\n // Can't actually test emoji support in Jest/Vitest/JSDom, emoji never render in color in Cairo\n /* istanbul ignore next */ if (!level) state.message = state.i18n.emojiUnsupportedMessage;\n });\n //\n // Set or update the database object\n //\n createEffect(()=>{\n // show a Loading message if it takes a long time, or show an error if there's a network/IDB error\n async function handleDatabaseLoading() {\n let showingLoadingMessage = false;\n const timeoutHandle = setTimeout(()=>{\n showingLoadingMessage = true;\n state.message = state.i18n.loadingMessage;\n }, $1e5dc5e467331cb9$var$TIMEOUT_BEFORE_LOADING_MESSAGE);\n try {\n await state.database.ready();\n state.databaseLoaded = true; // eslint-disable-line no-unused-vars\n } catch (err) {\n console.error(err);\n state.message = state.i18n.networkErrorMessage;\n } finally{\n clearTimeout(timeoutHandle);\n if (showingLoadingMessage) {\n showingLoadingMessage = false;\n state.message = \"\"; // eslint-disable-line no-unused-vars\n }\n }\n }\n if (state.database) /* no await */ handleDatabaseLoading();\n });\n //\n // Global styles for the entire picker\n //\n createEffect(()=>{\n state.pickerStyle = `\n --num-groups: ${state.groups.length}; \n --indicator-opacity: ${state.searchMode ? 0 : 1}; \n --num-skintones: ${$1e5dc5e467331cb9$var$NUM_SKIN_TONES};`;\n });\n //\n // Set or update the customEmoji\n //\n createEffect(()=>{\n if (state.customEmoji && state.database) updateCustomEmoji(); // re-run whenever customEmoji change\n });\n createEffect(()=>{\n if (state.customEmoji && state.customEmoji.length) {\n if (state.groups !== $1e5dc5e467331cb9$var$allGroups) state.groups = $1e5dc5e467331cb9$var$allGroups;\n } else if (state.groups !== $1e5dc5e467331cb9$var$groups) {\n if (state.currentGroupIndex) // If the current group is anything other than \"custom\" (which is first), decrement.\n // This fixes the odd case where you set customEmoji, then pick a category, then unset customEmoji\n state.currentGroupIndex--;\n state.groups = $1e5dc5e467331cb9$var$groups;\n }\n });\n //\n // Set or update the preferred skin tone\n //\n createEffect(()=>{\n async function updatePreferredSkinTone() {\n if (state.databaseLoaded) state.currentSkinTone = await state.database.getPreferredSkinTone();\n }\n /* no await */ updatePreferredSkinTone();\n });\n createEffect(()=>{\n state.skinTones = Array($1e5dc5e467331cb9$var$NUM_SKIN_TONES).fill().map((_, i)=>$1e5dc5e467331cb9$var$applySkinTone(state.skinToneEmoji, i));\n });\n createEffect(()=>{\n state.skinToneButtonText = state.skinTones[state.currentSkinTone];\n });\n createEffect(()=>{\n state.skinToneButtonLabel = state.i18n.skinToneLabel.replace(\"{skinTone}\", state.i18n.skinTones[state.currentSkinTone]);\n });\n //\n // Set or update the favorites emojis\n //\n createEffect(()=>{\n async function updateDefaultFavoriteEmojis() {\n const { database: database } = state;\n const favs = (await Promise.all($1e5dc5e467331cb9$var$MOST_COMMONLY_USED_EMOJI.map((unicode)=>database.getEmojiByUnicodeOrName(unicode)))).filter(Boolean); // filter because in Jest/Vitest tests we don't have all the emoji in the DB\n state.defaultFavoriteEmojis = favs;\n }\n if (state.databaseLoaded) /* no await */ updateDefaultFavoriteEmojis();\n });\n function updateCustomEmoji() {\n // Certain effects have an implicit dependency on customEmoji since it affects the database\n // Getting it here on the state ensures this effect re-runs when customEmoji change.\n // Setting it on the database is pointless but prevents this code from being removed by a minifier.\n state.database.customEmoji = state.customEmoji || $1e5dc5e467331cb9$var$EMPTY_ARRAY;\n }\n createEffect(()=>{\n async function updateFavorites() {\n updateCustomEmoji(); // re-run whenever customEmoji change\n const { database: database, defaultFavoriteEmojis: defaultFavoriteEmojis, numColumns: numColumns } = state;\n const dbFavorites = await database.getTopFavoriteEmoji(numColumns);\n const favorites = await summarizeEmojis($1e5dc5e467331cb9$var$uniqBy([\n ...dbFavorites,\n ...defaultFavoriteEmojis\n ], (_)=>_.unicode || _.name).slice(0, numColumns));\n state.currentFavorites = favorites;\n }\n if (state.databaseLoaded && state.defaultFavoriteEmojis) /* no await */ updateFavorites();\n });\n //\n // Calculate the width of the emoji grid. This serves two purposes:\n // 1) Re-calculate the --num-columns var because it may have changed\n // 2) Re-calculate the scrollbar width because it may have changed\n // (i.e. because the number of items changed)\n // 3) Re-calculate whether we're in RTL mode or not.\n //\n // The benefit of doing this in one place is to align with rAF/ResizeObserver\n // and do all the calculations in one go. RTL vs LTR is not strictly width-related,\n // but since we're already reading the style here, and since it's already aligned with\n // the rAF loop, this is the most appropriate place to do it perf-wise.\n //\n function calculateEmojiGridStyle(node) {\n $1e5dc5e467331cb9$var$calculateWidth(node, abortSignal, (width)=>{\n /* istanbul ignore next */ {\n // read all the style/layout calculations we need to make\n const style = getComputedStyle(refs.rootElement);\n const newNumColumns = parseInt(style.getPropertyValue(\"--num-columns\"), 10);\n const newIsRtl = style.getPropertyValue(\"direction\") === \"rtl\";\n const parentWidth = node.parentElement.getBoundingClientRect().width;\n const newScrollbarWidth = parentWidth - width;\n // write to state variables\n state.numColumns = newNumColumns;\n state.scrollbarWidth = newScrollbarWidth; // eslint-disable-line no-unused-vars\n state.isRtl = newIsRtl; // eslint-disable-line no-unused-vars\n }\n });\n }\n //\n // Set or update the currentEmojis. Check for invalid ZWJ renderings\n // (i.e. double emoji).\n //\n createEffect(()=>{\n async function updateEmojis() {\n const { searchText: searchText, currentGroup: currentGroup, databaseLoaded: databaseLoaded, customEmoji: customEmoji } = state;\n if (!databaseLoaded) {\n state.currentEmojis = [];\n state.searchMode = false;\n } else if (searchText.length >= $1e5dc5e467331cb9$var$MIN_SEARCH_TEXT_LENGTH) {\n const newEmojis = await getEmojisBySearchQuery(searchText);\n if (state.searchText === searchText) {\n updateCurrentEmojis(newEmojis);\n updateSearchMode(true);\n }\n } else {\n const { id: currentGroupId } = currentGroup;\n // avoid race condition where currentGroupId is -1 and customEmoji is undefined/empty\n if (currentGroupId !== -1 || customEmoji && customEmoji.length) {\n const newEmojis = await getEmojisByGroup(currentGroupId);\n if (state.currentGroup.id === currentGroupId) {\n updateCurrentEmojis(newEmojis);\n updateSearchMode(false);\n }\n }\n }\n }\n /* no await */ updateEmojis();\n });\n // Some emojis have their ligatures rendered as two or more consecutive emojis\n // We want to treat these the same as unsupported emojis, so we compare their\n // widths against the baseline widths and remove them as necessary\n createEffect(()=>{\n const { currentEmojis: currentEmojis, emojiVersion: emojiVersion } = state;\n const zwjEmojisToCheck = currentEmojis.filter((emoji)=>emoji.unicode) // filter custom emoji\n .filter((emoji)=>$1e5dc5e467331cb9$var$hasZwj(emoji) && !$1e5dc5e467331cb9$var$supportedZwjEmojis.has(emoji.unicode));\n if (!emojiVersion && zwjEmojisToCheck.length) {\n // render now, check their length later\n updateCurrentEmojis(currentEmojis);\n $1e5dc5e467331cb9$var$rAF(()=>checkZwjSupportAndUpdate(zwjEmojisToCheck));\n } else {\n const newEmojis = emojiVersion ? currentEmojis : currentEmojis.filter(isZwjSupported);\n updateCurrentEmojis(newEmojis);\n // Reset scroll top to 0 when emojis change\n $1e5dc5e467331cb9$var$rAF(()=>$1e5dc5e467331cb9$var$resetScrollTopIfPossible(refs.tabpanelElement));\n }\n });\n function checkZwjSupportAndUpdate(zwjEmojisToCheck) {\n $1e5dc5e467331cb9$var$checkZwjSupport(zwjEmojisToCheck, refs.baselineEmoji, emojiToDomNode);\n // force update\n // eslint-disable-next-line no-self-assign\n state.currentEmojis = state.currentEmojis;\n }\n function isZwjSupported(emoji) {\n return !emoji.unicode || !$1e5dc5e467331cb9$var$hasZwj(emoji) || $1e5dc5e467331cb9$var$supportedZwjEmojis.get(emoji.unicode);\n }\n async function filterEmojisByVersion(emojis) {\n const emojiSupportLevel = state.emojiVersion || await $1e5dc5e467331cb9$var$detectEmojiSupportLevel();\n // !version corresponds to custom emoji\n return emojis.filter(({ version: version })=>!version || version <= emojiSupportLevel);\n }\n async function summarizeEmojis(emojis) {\n return $1e5dc5e467331cb9$var$summarizeEmojisForUI(emojis, state.emojiVersion || await $1e5dc5e467331cb9$var$detectEmojiSupportLevel());\n }\n async function getEmojisByGroup(group) {\n // -1 is custom emoji\n const emoji = group === -1 ? state.customEmoji : await state.database.getEmojiByGroup(group);\n return summarizeEmojis(await filterEmojisByVersion(emoji));\n }\n async function getEmojisBySearchQuery(query) {\n return summarizeEmojis(await filterEmojisByVersion(await state.database.getEmojiBySearchQuery(query)));\n }\n createEffect(()=>{});\n //\n // Derive currentEmojisWithCategories from currentEmojis. This is always done even if there\n // are no categories, because it's just easier to code the HTML this way.\n //\n createEffect(()=>{\n function calculateCurrentEmojisWithCategories() {\n const { searchMode: searchMode, currentEmojis: currentEmojis } = state;\n if (searchMode) return [\n {\n category: \"\",\n emojis: currentEmojis\n }\n ];\n const categoriesToEmoji = new Map();\n for (const emoji of currentEmojis){\n const category = emoji.category || \"\";\n let emojis = categoriesToEmoji.get(category);\n if (!emojis) {\n emojis = [];\n categoriesToEmoji.set(category, emojis);\n }\n emojis.push(emoji);\n }\n return [\n ...categoriesToEmoji.entries()\n ].map(([category, emojis])=>({\n category: category,\n emojis: emojis\n })).sort((a, b)=>state.customCategorySorting(a.category, b.category));\n }\n const newEmojisWithCategories = calculateCurrentEmojisWithCategories();\n updateCurrentEmojisWithCategories(newEmojisWithCategories);\n });\n //\n // Handle active search item (i.e. pressing up or down while searching)\n //\n createEffect(()=>{\n state.activeSearchItemId = state.activeSearchItem !== -1 && state.currentEmojis[state.activeSearchItem].id;\n });\n //\n // Handle user input on the search input\n //\n createEffect(()=>{\n const { rawSearchText: rawSearchText } = state;\n $1e5dc5e467331cb9$var$rIC(()=>{\n state.searchText = (rawSearchText || \"\").trim(); // defer to avoid input delays, plus we can trim here\n state.activeSearchItem = -1;\n });\n });\n function onSearchKeydown(event) {\n if (!state.searchMode || !state.currentEmojis.length) return;\n const goToNextOrPrevious = (previous)=>{\n $1e5dc5e467331cb9$var$halt(event);\n state.activeSearchItem = $1e5dc5e467331cb9$var$incrementOrDecrement(previous, state.activeSearchItem, state.currentEmojis);\n };\n switch(event.key){\n case \"ArrowDown\":\n return goToNextOrPrevious(false);\n case \"ArrowUp\":\n return goToNextOrPrevious(true);\n case \"Enter\":\n if (state.activeSearchItem === -1) // focus the first option in the list since the list must be non-empty at this point (it's verified above)\n state.activeSearchItem = 0;\n else {\n $1e5dc5e467331cb9$var$halt(event);\n return clickEmoji(state.currentEmojis[state.activeSearchItem].id);\n }\n }\n }\n //\n // Handle user input on nav\n //\n function onNavClick(event) {\n const { target: target } = event;\n const closestTarget = target.closest(\".nav-button\");\n /* istanbul ignore if */ if (!closestTarget) return; // This should never happen, but makes me nervous not to have it\n const groupId = parseInt(closestTarget.dataset.groupId, 10);\n refs.searchElement.value = \"\"; // clear search box input\n state.rawSearchText = \"\";\n state.searchText = \"\";\n state.activeSearchItem = -1;\n state.currentGroupIndex = state.groups.findIndex((_)=>_.id === groupId);\n }\n function onNavKeydown(event) {\n const { target: target, key: key } = event;\n const doFocus = (el)=>{\n if (el) {\n $1e5dc5e467331cb9$var$halt(event);\n el.focus();\n }\n };\n switch(key){\n case \"ArrowLeft\":\n return doFocus(target.previousElementSibling);\n case \"ArrowRight\":\n return doFocus(target.nextElementSibling);\n case \"Home\":\n return doFocus(target.parentElement.firstElementChild);\n case \"End\":\n return doFocus(target.parentElement.lastElementChild);\n }\n }\n //\n // Handle user input on an emoji\n //\n async function clickEmoji(unicodeOrName) {\n const emoji = await state.database.getEmojiByUnicodeOrName(unicodeOrName);\n const emojiSummary = [\n ...state.currentEmojis,\n ...state.currentFavorites\n ].find((_)=>_.id === unicodeOrName);\n const skinTonedUnicode = emojiSummary.unicode && unicodeWithSkin(emojiSummary, state.currentSkinTone);\n await state.database.incrementFavoriteEmojiCount(unicodeOrName);\n fireEvent(\"emoji-click\", {\n emoji: emoji,\n skinTone: state.currentSkinTone,\n ...skinTonedUnicode && {\n unicode: skinTonedUnicode\n },\n ...emojiSummary.name && {\n name: emojiSummary.name\n }\n });\n }\n async function onEmojiClick(event) {\n const { target: target } = event;\n /* istanbul ignore if */ if (!target.classList.contains(\"emoji\")) // This should never happen, but makes me nervous not to have it\n return;\n $1e5dc5e467331cb9$var$halt(event);\n const id = target.id.substring(4); // replace 'emo-' or 'fav-' prefix\n /* no await */ clickEmoji(id);\n }\n //\n // Handle user input on the skintone picker\n //\n function changeSkinTone(skinTone) {\n state.currentSkinTone = skinTone;\n state.skinTonePickerExpanded = false;\n focus(\"skintone-button\");\n fireEvent(\"skin-tone-change\", {\n skinTone: skinTone\n });\n /* no await */ state.database.setPreferredSkinTone(skinTone);\n }\n function onSkinToneOptionsClick(event) {\n const { target: { id: id } } = event;\n const match = id && id.match(/^skintone-(\\d)/); // skintone option format\n /* istanbul ignore if */ if (!match) return; // This should never happen, but makes me nervous not to have it\n $1e5dc5e467331cb9$var$halt(event);\n const skinTone = parseInt(match[1], 10); // remove 'skintone-' prefix\n changeSkinTone(skinTone);\n }\n function onClickSkinToneButton(event) {\n state.skinTonePickerExpanded = !state.skinTonePickerExpanded;\n state.activeSkinTone = state.currentSkinTone;\n // this should always be true, since the button is obscured by the listbox, so this `if` is just to be sure\n if (state.skinTonePickerExpanded) {\n $1e5dc5e467331cb9$var$halt(event);\n $1e5dc5e467331cb9$var$rAF(()=>focus(\"skintone-list\"));\n }\n }\n // To make the animation nicer, change the z-index of the skintone picker button\n // *after* the animation has played. This makes it appear that the picker box\n // is expanding \"below\" the button\n createEffect(()=>{\n if (state.skinTonePickerExpanded) refs.skinToneDropdown.addEventListener(\"transitionend\", ()=>{\n state.skinTonePickerExpandedAfterAnimation = true; // eslint-disable-line no-unused-vars\n }, {\n once: true\n });\n else state.skinTonePickerExpandedAfterAnimation = false; // eslint-disable-line no-unused-vars\n });\n function onSkinToneOptionsKeydown(event) {\n // this should never happen, but makes me nervous not to have it\n /* istanbul ignore if */ if (!state.skinTonePickerExpanded) return;\n const changeActiveSkinTone = async (nextSkinTone)=>{\n $1e5dc5e467331cb9$var$halt(event);\n state.activeSkinTone = nextSkinTone;\n };\n switch(event.key){\n case \"ArrowUp\":\n return changeActiveSkinTone($1e5dc5e467331cb9$var$incrementOrDecrement(true, state.activeSkinTone, state.skinTones));\n case \"ArrowDown\":\n return changeActiveSkinTone($1e5dc5e467331cb9$var$incrementOrDecrement(false, state.activeSkinTone, state.skinTones));\n case \"Home\":\n return changeActiveSkinTone(0);\n case \"End\":\n return changeActiveSkinTone(state.skinTones.length - 1);\n case \"Enter\":\n // enter on keydown, space on keyup. this is just how browsers work for buttons\n // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html\n $1e5dc5e467331cb9$var$halt(event);\n return changeSkinTone(state.activeSkinTone);\n case \"Escape\":\n $1e5dc5e467331cb9$var$halt(event);\n state.skinTonePickerExpanded = false;\n return focus(\"skintone-button\");\n }\n }\n function onSkinToneOptionsKeyup(event) {\n // this should never happen, but makes me nervous not to have it\n /* istanbul ignore if */ if (!state.skinTonePickerExpanded) return;\n switch(event.key){\n case \" \":\n // enter on keydown, space on keyup. this is just how browsers work for buttons\n // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html\n $1e5dc5e467331cb9$var$halt(event);\n return changeSkinTone(state.activeSkinTone);\n }\n }\n async function onSkinToneOptionsFocusOut(event) {\n // On blur outside of the skintone listbox, collapse the skintone picker.\n const { relatedTarget: relatedTarget } = event;\n // The `else` should never happen, but makes me nervous not to have it\n /* istanbul ignore else */ if (!relatedTarget || relatedTarget.id !== \"skintone-list\") state.skinTonePickerExpanded = false;\n }\n function onSearchInput(event) {\n state.rawSearchText = event.target.value;\n }\n return {\n $set (newState) {\n $1e5dc5e467331cb9$var$assign(state, newState);\n },\n $destroy () {\n abortController.abort();\n }\n };\n}\nconst $1e5dc5e467331cb9$var$DEFAULT_DATA_SOURCE = \"https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json\";\nconst $1e5dc5e467331cb9$var$DEFAULT_LOCALE = \"en\";\nvar $1e5dc5e467331cb9$var$enI18n = {\n categoriesLabel: \"Categories\",\n emojiUnsupportedMessage: \"Your browser does not support color emoji.\",\n favoritesLabel: \"Favorites\",\n loadingMessage: \"Loading\\u2026\",\n networkErrorMessage: \"Could not load emoji.\",\n regionLabel: \"Emoji picker\",\n searchDescription: \"When search results are available, press up or down to select and enter to choose.\",\n searchLabel: \"Search\",\n searchResultsLabel: \"Search results\",\n skinToneDescription: \"When expanded, press up or down to select and enter to choose.\",\n skinToneLabel: \"Choose a skin tone (currently {skinTone})\",\n skinTonesLabel: \"Skin tones\",\n skinTones: [\n \"Default\",\n \"Light\",\n \"Medium-Light\",\n \"Medium\",\n \"Medium-Dark\",\n \"Dark\"\n ],\n categories: {\n custom: \"Custom\",\n \"smileys-emotion\": \"Smileys and emoticons\",\n \"people-body\": \"People and body\",\n \"animals-nature\": \"Animals and nature\",\n \"food-drink\": \"Food and drink\",\n \"travel-places\": \"Travel and places\",\n activities: \"Activities\",\n objects: \"Objects\",\n symbols: \"Symbols\",\n flags: \"Flags\"\n }\n};\nvar $1e5dc5e467331cb9$var$baseStyles = \":host{--emoji-size:1.375rem;--emoji-padding:0.5rem;--category-emoji-size:var(--emoji-size);--category-emoji-padding:var(--emoji-padding);--indicator-height:3px;--input-border-radius:0.5rem;--input-border-size:1px;--input-font-size:1rem;--input-line-height:1.5;--input-padding:0.25rem;--num-columns:8;--outline-size:2px;--border-size:1px;--skintone-border-radius:1rem;--category-font-size:1rem;display:flex;width:min-content;height:400px}:host,:host(.light){color-scheme:light;--background:#fff;--border-color:#e0e0e0;--indicator-color:#385ac1;--input-border-color:#999;--input-font-color:#111;--input-placeholder-color:#999;--outline-color:#999;--category-font-color:#111;--button-active-background:#e6e6e6;--button-hover-background:#d9d9d9}:host(.dark){color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}@media (prefers-color-scheme:dark){:host{color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}}:host([hidden]){display:none}button{margin:0;padding:0;border:0;background:0 0;box-shadow:none;-webkit-tap-highlight-color:transparent}button::-moz-focus-inner{border:0}input{padding:0;margin:0;line-height:1.15;font-family:inherit}input[type=search]{-webkit-appearance:none}:focus{outline:var(--outline-color) solid var(--outline-size);outline-offset:calc(-1*var(--outline-size))}:host([data-js-focus-visible]) :focus:not([data-focus-visible-added]){outline:0}:focus:not(:focus-visible){outline:0}.hide-focus{outline:0}*{box-sizing:border-box}.picker{contain:content;display:flex;flex-direction:column;background:var(--background);border:var(--border-size) solid var(--border-color);width:100%;height:100%;overflow:hidden;--total-emoji-size:calc(var(--emoji-size) + (2 * var(--emoji-padding)));--total-category-emoji-size:calc(var(--category-emoji-size) + (2 * var(--category-emoji-padding)))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.hidden{opacity:0;pointer-events:none}.abs-pos{position:absolute;left:0;top:0}.gone{display:none!important}.skintone-button-wrapper,.skintone-list{background:var(--background);z-index:3}.skintone-button-wrapper.expanded{z-index:1}.skintone-list{position:absolute;inset-inline-end:0;top:0;z-index:2;overflow:visible;border-bottom:var(--border-size) solid var(--border-color);border-radius:0 0 var(--skintone-border-radius) var(--skintone-border-radius);will-change:transform;transition:transform .2s ease-in-out;transform-origin:center 0}@media (prefers-reduced-motion:reduce){.skintone-list{transition-duration:.001s}}@supports not (inset-inline-end:0){.skintone-list{right:0}}.skintone-list.no-animate{transition:none}.tabpanel{overflow-y:auto;-webkit-overflow-scrolling:touch;will-change:transform;min-height:0;flex:1;contain:content}.emoji-menu{display:grid;grid-template-columns:repeat(var(--num-columns),var(--total-emoji-size));justify-content:space-around;align-items:flex-start;width:100%}.category{padding:var(--emoji-padding);font-size:var(--category-font-size);color:var(--category-font-color)}.custom-emoji,.emoji,button.emoji{height:var(--total-emoji-size);width:var(--total-emoji-size)}.emoji,button.emoji{font-size:var(--emoji-size);display:flex;align-items:center;justify-content:center;border-radius:100%;line-height:1;overflow:hidden;font-family:var(--emoji-font-family);cursor:pointer}@media (hover:hover) and (pointer:fine){.emoji:hover,button.emoji:hover{background:var(--button-hover-background)}}.emoji.active,.emoji:active,button.emoji.active,button.emoji:active{background:var(--button-active-background)}.custom-emoji{padding:var(--emoji-padding);object-fit:contain;pointer-events:none;background-repeat:no-repeat;background-position:center center;background-size:var(--emoji-size) var(--emoji-size)}.nav,.nav-button{align-items:center}.nav{display:grid;justify-content:space-between;contain:content}.nav-button{display:flex;justify-content:center}.nav-emoji{font-size:var(--category-emoji-size);width:var(--total-category-emoji-size);height:var(--total-category-emoji-size)}.indicator-wrapper{display:flex;border-bottom:1px solid var(--border-color)}.indicator{width:calc(100%/var(--num-groups));height:var(--indicator-height);opacity:var(--indicator-opacity);background-color:var(--indicator-color);will-change:transform,opacity;transition:opacity .1s linear,transform .25s ease-in-out}@media (prefers-reduced-motion:reduce){.indicator{will-change:opacity;transition:opacity .1s linear}}.pad-top,input.search{background:var(--background);width:100%}.pad-top{height:var(--emoji-padding);z-index:3}.search-row{display:flex;align-items:center;position:relative;padding-inline-start:var(--emoji-padding);padding-bottom:var(--emoji-padding)}.search-wrapper{flex:1;min-width:0}input.search{padding:var(--input-padding);border-radius:var(--input-border-radius);border:var(--input-border-size) solid var(--input-border-color);color:var(--input-font-color);font-size:var(--input-font-size);line-height:var(--input-line-height)}input.search::placeholder{color:var(--input-placeholder-color)}.favorites{display:flex;flex-direction:row;border-top:var(--border-size) solid var(--border-color);contain:content}.message{padding:var(--emoji-padding)}\";\nconst $1e5dc5e467331cb9$var$PROPS = [\n \"customEmoji\",\n \"customCategorySorting\",\n \"database\",\n \"dataSource\",\n \"i18n\",\n \"locale\",\n \"skinToneEmoji\",\n \"emojiVersion\"\n];\n// Styles injected ourselves, so we can declare the FONT_FAMILY variable in one place\nconst $1e5dc5e467331cb9$var$EXTRA_STYLES = `:host{--emoji-font-family:${$1e5dc5e467331cb9$var$FONT_FAMILY}}`;\nclass $1e5dc5e467331cb9$export$2e2bcd8739ae039 extends HTMLElement {\n constructor(props){\n super();\n this.attachShadow({\n mode: \"open\"\n });\n const style = document.createElement(\"style\");\n style.textContent = $1e5dc5e467331cb9$var$baseStyles + $1e5dc5e467331cb9$var$EXTRA_STYLES;\n this.shadowRoot.appendChild(style);\n this._ctx = {\n // Set defaults\n locale: $1e5dc5e467331cb9$var$DEFAULT_LOCALE,\n dataSource: $1e5dc5e467331cb9$var$DEFAULT_DATA_SOURCE,\n skinToneEmoji: $1e5dc5e467331cb9$var$DEFAULT_SKIN_TONE_EMOJI,\n customCategorySorting: $1e5dc5e467331cb9$var$DEFAULT_CATEGORY_SORTING,\n customEmoji: null,\n i18n: $1e5dc5e467331cb9$var$enI18n,\n emojiVersion: null,\n ...props\n };\n // Handle properties set before the element was upgraded\n for (const prop of $1e5dc5e467331cb9$var$PROPS)if (prop !== \"database\" && Object.prototype.hasOwnProperty.call(this, prop)) {\n this._ctx[prop] = this[prop];\n delete this[prop];\n }\n this._dbFlush(); // wait for a flush before creating the db, in case the user calls e.g. a setter or setAttribute\n }\n connectedCallback() {\n // The _cmp may be defined if the component was immediately disconnected and then reconnected. In that case,\n // do nothing (preserve the state)\n if (!this._cmp) this._cmp = $1e5dc5e467331cb9$var$createRoot(this.shadowRoot, this._ctx);\n }\n disconnectedCallback() {\n // Check in a microtask if the element is still connected. If so, treat this as a \"move\" rather than a disconnect\n // Inspired by Vue: https://vuejs.org/guide/extras/web-components.html#building-custom-elements-with-vue\n $1e5dc5e467331cb9$var$qM(()=>{\n // this._cmp may be defined if connect-disconnect-connect-disconnect occurs synchronously\n if (!this.isConnected && this._cmp) {\n this._cmp.$destroy();\n this._cmp = undefined;\n const { database: database } = this._ctx;\n database.close()// only happens if the database failed to load in the first place, so we don't care\n .catch((err)=>console.error(err));\n }\n });\n }\n static get observedAttributes() {\n return [\n \"locale\",\n \"data-source\",\n \"skin-tone-emoji\",\n \"emoji-version\"\n ] // complex objects aren't supported, also use kebab-case\n ;\n }\n attributeChangedCallback(attrName, oldValue, newValue) {\n this._set(// convert from kebab-case to camelcase\n // see https://github.com/sveltejs/svelte/issues/3852#issuecomment-665037015\n attrName.replace(/-([a-z])/g, (_, up)=>up.toUpperCase()), // convert string attribute to float if necessary\n attrName === \"emoji-version\" ? parseFloat(newValue) : newValue);\n }\n _set(prop, newValue) {\n this._ctx[prop] = newValue;\n if (this._cmp) this._cmp.$set({\n [prop]: newValue\n });\n if ([\n \"locale\",\n \"dataSource\"\n ].includes(prop)) this._dbFlush();\n }\n _dbCreate() {\n const { locale: locale, dataSource: dataSource, database: database } = this._ctx;\n // only create a new database if we really need to\n if (!database || database.locale !== locale || database.dataSource !== dataSource) this._set(\"database\", new (0, $d1f26ac162b12b4a$export$2e2bcd8739ae039)({\n locale: locale,\n dataSource: dataSource\n }));\n }\n // Update the Database in one microtask if the locale/dataSource change. We do one microtask\n // so we don't create two Databases if e.g. both the locale and the dataSource change\n _dbFlush() {\n $1e5dc5e467331cb9$var$qM(()=>this._dbCreate());\n }\n}\nconst $1e5dc5e467331cb9$var$definitions = {};\nfor (const prop of $1e5dc5e467331cb9$var$PROPS)$1e5dc5e467331cb9$var$definitions[prop] = {\n get () {\n if (prop === \"database\") // in rare cases, the microtask may not be flushed yet, so we need to instantiate the DB\n // now if the user is asking for it\n this._dbCreate();\n return this._ctx[prop];\n },\n set (val) {\n if (prop === \"database\") throw new Error(\"database is read-only\");\n this._set(prop, val);\n }\n};\nObject.defineProperties($1e5dc5e467331cb9$export$2e2bcd8739ae039.prototype, $1e5dc5e467331cb9$var$definitions);\n/* istanbul ignore else */ if (!customElements.get(\"emoji-picker\")) customElements.define(\"emoji-picker\", $1e5dc5e467331cb9$export$2e2bcd8739ae039);\n\n\n\n\n\nvar $dec5faeb65064cfd$var$browserSupportsTextareaTextNodes;\n/**\n * @param {HTMLElement} input\n * @return {boolean}\n */ function $dec5faeb65064cfd$var$canManipulateViaTextNodes(input) {\n if (input.nodeName !== \"TEXTAREA\") return false;\n if (typeof $dec5faeb65064cfd$var$browserSupportsTextareaTextNodes === \"undefined\") {\n var textarea = document.createElement(\"textarea\");\n textarea.value = 1;\n $dec5faeb65064cfd$var$browserSupportsTextareaTextNodes = !!textarea.firstChild;\n }\n return $dec5faeb65064cfd$var$browserSupportsTextareaTextNodes;\n}\n/**\n * @param {HTMLTextAreaElement|HTMLInputElement} input\n * @param {string} text\n * @returns {void}\n */ function $dec5faeb65064cfd$var$index(input, text) {\n // Most of the used APIs only work with the field selected\n input.focus(); // IE 8-10\n if (document.selection) {\n var ieRange = document.selection.createRange();\n ieRange.text = text; // Move cursor after the inserted text\n ieRange.collapse(false);\n ieRange.select();\n return;\n } // Webkit + Edge\n var isSuccess = document.execCommand(\"insertText\", false, text);\n if (!isSuccess) {\n var start = input.selectionStart;\n var end = input.selectionEnd; // Firefox (non-standard method)\n if (typeof input.setRangeText === \"function\") input.setRangeText(text);\n else {\n // To make a change we just need a Range, not a Selection\n var range = document.createRange();\n var textNode = document.createTextNode(text);\n if ($dec5faeb65064cfd$var$canManipulateViaTextNodes(input)) {\n var node = input.firstChild; // If textarea is empty, just insert the text\n if (!node) input.appendChild(textNode);\n else {\n // Otherwise we need to find a nodes for start and end\n var offset = 0;\n var startNode = null;\n var endNode = null;\n while(node && (startNode === null || endNode === null)){\n var nodeLength = node.nodeValue.length; // if start of the selection falls into current node\n if (start >= offset && start <= offset + nodeLength) range.setStart(startNode = node, start - offset);\n // if end of the selection falls into current node\n if (end >= offset && end <= offset + nodeLength) range.setEnd(endNode = node, end - offset);\n offset += nodeLength;\n node = node.nextSibling;\n } // If there is some text selected, remove it as we should replace it\n if (start !== end) range.deleteContents();\n }\n } // If the node is a textarea and the range doesn't span outside the element\n //\n // Get the commonAncestorContainer of the selected range and test its type\n // If the node is of type `#text` it means that we're still working with text nodes within our textarea element\n // otherwise, if it's of type `#document` for example it means our selection spans outside the textarea.\n if ($dec5faeb65064cfd$var$canManipulateViaTextNodes(input) && range.commonAncestorContainer.nodeName === \"#text\") // Finally insert a new node. The browser will automatically split start and end nodes into two if necessary\n range.insertNode(textNode);\n else {\n // If the node is not a textarea or the range spans outside a textarea the only way is to replace the whole value\n var value = input.value;\n input.value = value.slice(0, start) + text + value.slice(end);\n }\n } // Correct the cursor position to be at the end of the insertion\n input.setSelectionRange(start + text.length, start + text.length); // Notify any possible listeners of the change\n var e = document.createEvent(\"UIEvent\");\n e.initEvent(\"input\", true, false);\n input.dispatchEvent(e);\n }\n}\nvar $dec5faeb65064cfd$export$2e2bcd8739ae039 = $dec5faeb65064cfd$var$index;\n\n\nfunction $94933cc6427541bd$export$c37129e465f64ef0(a) {\n return null !== a && \"object\" == typeof a ? \"share\" in navigator && \"canShare\" in navigator && navigator.canShare(a) : \"share\" in navigator;\n}\n\n\nObject.defineProperty({}, \"WebShare\", {\n get: function() {\n return $4f74a8126e204146$export$30b344bef3e55b67;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $4f74a8126e204146$var$t = `\n :host {\n display: inline-block;\n }\n`, $4f74a8126e204146$var$e = document.createElement(\"template\");\n$4f74a8126e204146$var$e.innerHTML = `\n \n \n`;\nclass $4f74a8126e204146$export$30b344bef3e55b67 extends HTMLElement {\n #t;\n #e;\n #s = [];\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\",\n delegatesFocus: !0\n }).appendChild($4f74a8126e204146$var$e.content.cloneNode(!0)), this.#t = this.shadowRoot?.querySelector('slot[name=\"button\"]') || null, this.#e = this.#i();\n }\n static get observedAttributes() {\n return [\n \"disabled\"\n ];\n }\n attributeChangedCallback(t, e, s) {\n \"disabled\" === t && e !== s && this.#e && (this.#e.toggleAttribute(\"disabled\", this.disabled), this.#e.setAttribute(\"aria-disabled\", this.disabled.toString()), this.#e.part && this.#e.part.contains(\"button\") && this.#e.part.toggle(\"button--disabled\", this.disabled));\n }\n connectedCallback() {\n this.#r(\"shareUrl\"), this.#r(\"shareTitle\"), this.#r(\"shareText\"), this.#r(\"shareFiles\"), this.#r(\"disabled\"), this.#t?.addEventListener(\"slotchange\", this.#a), this.#e?.addEventListener(\"click\", this.#n);\n }\n disconnectedCallback() {\n this.#t?.removeEventListener(\"slotchange\", this.#a), this.#e?.removeEventListener(\"click\", this.#n);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(t) {\n this.toggleAttribute(\"disabled\", !!t);\n }\n get shareUrl() {\n return this.getAttribute(\"share-url\") || \"\";\n }\n set shareUrl(t) {\n this.setAttribute(\"share-url\", t);\n }\n get shareTitle() {\n return this.getAttribute(\"share-title\") || \"\";\n }\n set shareTitle(t) {\n this.setAttribute(\"share-title\", t);\n }\n get shareText() {\n return this.getAttribute(\"share-text\") || \"\";\n }\n set shareText(t) {\n this.setAttribute(\"share-text\", t);\n }\n get shareFiles() {\n return this.#s;\n }\n set shareFiles(t) {\n Array.isArray(t) && t.length > 0 && (this.#s = t);\n }\n async share() {\n if (!this.disabled) try {\n let t = {};\n this.shareUrl && (t.url = this.shareUrl), this.shareTitle && (t.title = this.shareTitle), this.shareText && (t.text = this.shareText), Array.isArray(this.shareFiles) && this.shareFiles.length > 0 && navigator.canShare && navigator.canShare({\n files: this.shareFiles\n }) && (t.files = this.shareFiles), await navigator.share(t), this.dispatchEvent(new CustomEvent(\"web-share:success\", {\n bubbles: !0,\n composed: !0,\n detail: {\n shareData: t\n }\n }));\n } catch (t) {\n if (t instanceof Error && \"AbortError\" === t.name) {\n this.dispatchEvent(new CustomEvent(\"web-share:abort\", {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n return;\n }\n this.dispatchEvent(new CustomEvent(\"web-share:error\", {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n }\n }\n #n = (t)=>{\n t.preventDefault(), this.disabled || this.share();\n };\n #a = (t)=>{\n t.target && \"button\" === t.target.name && (this.#e?.removeEventListener(\"click\", this.#n), this.#e = this.#i(), this.#e && (this.#e.addEventListener(\"click\", this.#n), \"BUTTON\" === this.#e.nodeName || this.#e.hasAttribute(\"role\") || this.#e.setAttribute(\"role\", \"button\")));\n };\n #i() {\n return this.#t && this.#t.assignedElements({\n flatten: !0\n }).find((t)=>\"BUTTON\" === t.nodeName || \"button\" === t.getAttribute(\"slot\")) || null;\n }\n #r(t) {\n if (Object.prototype.hasOwnProperty.call(this, t)) {\n let e = this[t];\n delete this[t], this[t] = e;\n }\n }\n static defineCustomElement(t = \"web-share\") {\n \"undefined\" == typeof window || window.customElements.get(t) || window.customElements.define(t, $4f74a8126e204146$export$30b344bef3e55b67);\n }\n}\n$4f74a8126e204146$export$30b344bef3e55b67.defineCustomElement();\n\n\nObject.defineProperty({}, \"CapturePhoto\", {\n get: function() {\n return $636b0cf1ed0b9f88$export$cc30a98fe3890794;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $636b0cf1ed0b9f88$var$t = (t, e, i)=>(Number.isNaN(e) && (e = 0), Number.isNaN(i) && (i = 0), Math.min(Math.max(t, Math.min(e, i)), Math.max(e, i))), $636b0cf1ed0b9f88$var$e = \"capture-photo\", $636b0cf1ed0b9f88$var$i = `\n :host {\n display: block;\n box-sizing: border-box;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none;\n }\n\n video {\n display: block;\n }\n\n #output:empty {\n display: none;\n }\n`, $636b0cf1ed0b9f88$var$o = document.createElement(\"template\");\n$636b0cf1ed0b9f88$var$o.innerHTML = `\n \n\n \n\n \n\n
\n \n \n \n\n \n\n \n
\n\n \n\n
\n`;\nclass $636b0cf1ed0b9f88$export$cc30a98fe3890794 extends HTMLElement {\n #t = {};\n #e = null;\n #i = null;\n #o = null;\n #n = null;\n #a = null;\n #s = null;\n #r = null;\n #l = null;\n constructor(){\n super(), this.#t = this.getSupportedConstraints(), this.shadowRoot || this.attachShadow({\n mode: \"open\"\n }).appendChild($636b0cf1ed0b9f88$var$o.content.cloneNode(!0));\n }\n static get observedAttributes() {\n return [\n \"no-image\",\n \"facing-mode\",\n \"camera-resolution\",\n \"pan\",\n \"tilt\",\n \"zoom\"\n ];\n }\n attributeChangedCallback(t, e, i) {\n if (!this.isConnected) return;\n let o = this.getTrackCapabilities(), n = this.getTrackSettings();\n if (\"no-image\" === t && e !== i && this.#u(), \"facing-mode\" === t && e !== i && \"facingMode\" in this.#t) {\n let t = [\n \"user\",\n \"environment\"\n ].includes(this.facingMode || \"\");\n \"facingMode\" in n && t && (this.stopVideoStream(), this.startVideoStream());\n }\n if (\"camera-resolution\" === t && e !== i && \"string\" == typeof this.cameraResolution && this.cameraResolution.trim().length > 0) {\n let [t = 0, e = 0] = this.cameraResolution.split(\"x\").map((t)=>Number(t));\n if (t > 0 && e > 0 && \"width\" in o && \"height\" in o) {\n let i = !!(o.width?.min && o.width?.max) && t >= o?.width?.min && t <= o?.width?.max, a = !!(o.height?.min && o.height?.max) && e >= o?.height?.min && e <= o?.height?.max;\n \"width\" in n && \"height\" in n && i && a && (this.stopVideoStream(), this.startVideoStream());\n }\n }\n if (\"pan\" === t && e !== i && \"pan\" in this.#t) {\n let t = !!(\"pan\" in o && o.pan?.min && o.pan?.max) && this.pan >= o.pan.min && this.pan <= o.pan.max;\n \"pan\" in n && \"number\" == typeof this.pan && t && this.#h(\"pan\", this.pan);\n }\n if (\"tilt\" === t && e !== i && \"tilt\" in this.#t) {\n let t = !!(\"tilt\" in o && o.tilt?.min && o.tilt?.max) && this.tilt >= o.tilt.min && this.tilt <= o.tilt.max;\n \"tilt\" in n && \"number\" == typeof this.tilt && t && this.#h(\"tilt\", this.tilt);\n }\n if (\"zoom\" === t && e !== i && \"zoom\" in this.#t) {\n let t = !!(\"zoom\" in o && o.zoom?.min && o.zoom?.max) && this.zoom >= o.zoom.min && this.zoom <= o.zoom.max;\n \"zoom\" in n && \"number\" == typeof this.zoom && t && this.#h(\"zoom\", this.zoom);\n }\n }\n connectedCallback() {\n if (this.#d(\"autpoPlay\"), this.#d(\"noImage\"), this.#d(\"facingMode\"), this.#d(\"cameraResolution\"), this.#d(\"pan\"), this.#d(\"tilt\"), this.#d(\"zoom\"), this.#d(\"calculateFileSize\"), this.#i = this.shadowRoot?.querySelector(\"canvas\") || null, this.#o = this.shadowRoot?.getElementById(\"output\") || null, this.#n = this.shadowRoot?.querySelector(\"video\") || null, this.#a = this.shadowRoot?.querySelector('slot[name=\"capture-button\"]') || null, this.#s = this.#c(), this.#r = this.shadowRoot?.querySelector('slot[name=\"facing-mode-button\"]') || null, this.#l = this.#m(), this.#n?.addEventListener(\"loadedmetadata\", this.#p), this.#a?.addEventListener(\"slotchange\", this.#g), this.#s?.addEventListener(\"click\", this.#b), this.#r?.addEventListener(\"slotchange\", this.#f), this.#l?.addEventListener(\"click\", this.#v), !$636b0cf1ed0b9f88$export$cc30a98fe3890794.isSupported()) return this.dispatchEvent(new CustomEvent(`${$636b0cf1ed0b9f88$var$e}:error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: {\n name: \"NotSupportedError\",\n message: \"Not supported\"\n }\n }\n }));\n this.autoPlay && this.startVideoStream();\n }\n disconnectedCallback() {\n this.stopVideoStream(), this.#l?.removeEventListener(\"click\", this.#v), this.#s?.removeEventListener(\"click\", this.#b), this.#n?.removeEventListener(\"canplay\", this.#p), this.#a?.removeEventListener(\"slotchange\", this.#g), this.#r?.removeEventListener(\"slotchange\", this.#f);\n }\n get autoPlay() {\n return this.hasAttribute(\"auto-play\");\n }\n set autoPlay(t) {\n this.toggleAttribute(\"auto-play\", !!t);\n }\n get noImage() {\n return this.hasAttribute(\"no-image\");\n }\n set noImage(t) {\n this.toggleAttribute(\"no-image\", !!t);\n }\n get facingMode() {\n return this.getAttribute(\"facing-mode\") || \"user\";\n }\n set facingMode(t) {\n this.setAttribute(\"facing-mode\", t);\n }\n get cameraResolution() {\n return this.getAttribute(\"camera-resolution\") || \"\";\n }\n set cameraResolution(t) {\n this.setAttribute(\"camera-resolution\", t);\n }\n get pan() {\n return Number(this.getAttribute(\"pan\")) || 0;\n }\n set pan(t) {\n this.setAttribute(\"pan\", null != t ? t.toString() : t);\n }\n get tilt() {\n return Number(this.getAttribute(\"tilt\")) || 0;\n }\n set tilt(t) {\n this.setAttribute(\"tilt\", null != t ? t.toString() : t);\n }\n get zoom() {\n return Number(this.getAttribute(\"zoom\")) || 1;\n }\n set zoom(t) {\n this.setAttribute(\"zoom\", null != t ? t.toString() : t);\n }\n get loading() {\n return this.hasAttribute(\"loading\");\n }\n get calculateFileSize() {\n return this.hasAttribute(\"calculate-file-size\");\n }\n set calculateFileSize(t) {\n this.toggleAttribute(\"calculate-file-size\", !!t);\n }\n #v = (t)=>{\n t.preventDefault(), this.loading || (this.facingMode = \"user\" !== this.facingMode && this.facingMode ? \"user\" : \"environment\");\n };\n #b = (t)=>{\n t.preventDefault(), this.capture();\n };\n #p = (t)=>{\n let i = t.target;\n i.play().then(()=>{\n this.dispatchEvent(new CustomEvent(`${$636b0cf1ed0b9f88$var$e}:video-play`, {\n bubbles: !0,\n composed: !0,\n detail: {\n video: i\n }\n }));\n }).catch((t)=>{\n this.dispatchEvent(new CustomEvent(`${$636b0cf1ed0b9f88$var$e}:error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n }).finally(()=>{\n this.removeAttribute(\"loading\");\n });\n };\n #u() {\n this.#o && Array.from(this.#o.childNodes).forEach((t)=>t.remove());\n }\n #h(e, i) {\n if (!this.#e || !e || !i) return;\n let [o] = this.#e.getVideoTracks(), n = this.getTrackCapabilities();\n e in this.getTrackSettings() && o.applyConstraints({\n advanced: [\n {\n [e]: $636b0cf1ed0b9f88$var$t(Number(i), n[e]?.min || 1, n[e]?.max || 1)\n }\n ]\n });\n }\n #g = (t)=>{\n t.target?.name === \"capture-button\" && (this.#s?.removeEventListener(\"click\", this.#b), this.#s = this.#c(), this.#s && (this.#s.addEventListener(\"click\", this.#b), \"BUTTON\" === this.#s.nodeName || this.#s.hasAttribute(\"role\") || this.#s.setAttribute(\"role\", \"button\")));\n };\n #f = (t)=>{\n t.target?.name === \"facing-mode-button\" && (this.#l?.removeEventListener(\"click\", this.#v), this.#l = this.#m(), this.#l && (this.#l.addEventListener(\"click\", this.#v), \"BUTTON\" === this.#l.nodeName || this.#l.hasAttribute(\"role\") || this.#l.setAttribute(\"role\", \"button\")));\n };\n #m() {\n return this.#r && this.#r.assignedElements({\n flatten: !0\n }).find((t)=>\"BUTTON\" === t.nodeName || \"facing-mode-button\" === t.getAttribute(\"slot\")) || null;\n }\n #c() {\n return this.#a && this.#a.assignedElements({\n flatten: !0\n }).find((t)=>\"BUTTON\" === t.nodeName || \"capture-button\" === t.getAttribute(\"slot\")) || null;\n }\n #d(t) {\n if (Object.prototype.hasOwnProperty.call(this, t)) {\n let e = this[t];\n delete this[t], this[t] = e;\n }\n }\n async startVideoStream() {\n if (!$636b0cf1ed0b9f88$export$cc30a98fe3890794.isSupported() || this.#e) return;\n this.setAttribute(\"loading\", \"\");\n let t = {\n video: {\n facingMode: {\n ideal: this.facingMode || \"user\"\n },\n pan: !0,\n tilt: !0,\n zoom: !0\n },\n audio: !1\n };\n if (\"string\" == typeof this.cameraResolution && this.cameraResolution.trim().length > 0) {\n let [e = 0, i = 0] = this.cameraResolution.split(\"x\").map((t)=>Number(t));\n e > 0 && i > 0 && (t.video.width = e, t.video.height = i);\n }\n try {\n this.#e = await navigator.mediaDevices.getUserMedia(t), this.#n && (this.#n.srcObject = this.#e), this.#h(\"pan\", this.pan), this.#h(\"tilt\", this.tilt), this.#h(\"zoom\", this.zoom);\n let e = this.getTrackSettings();\n \"facingMode\" in e && this.#r && (this.#r.hidden = !1);\n } catch (t) {\n this.dispatchEvent(new CustomEvent(`${$636b0cf1ed0b9f88$var$e}:error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n } finally{\n this.removeAttribute(\"loading\");\n }\n }\n stopVideoStream() {\n if (!this.#n || !this.#e) return;\n let [t] = this.#e.getVideoTracks();\n t?.stop(), this.#n.srcObject = null, this.#e = null;\n }\n async capture() {\n if (!this.loading && this.#i && this.#n) try {\n let t = this.#i.getContext(\"2d\"), i = this.#n.videoWidth, o = this.#n.videoHeight;\n this.#i.width = i, this.#i.height = o, t?.drawImage(this.#n, 0, 0, i, o);\n let n = this.#i.toDataURL(\"image/png\");\n if (\"string\" == typeof n && n.includes(\"data:image\")) {\n if (!this.noImage) {\n let t = new Image;\n t.src = n, t.width = i, t.height = o, t.setAttribute(\"part\", \"output-image\"), this.#u(), this.#o?.appendChild(t);\n }\n let t = {\n dataURI: n,\n width: i,\n height: o\n };\n if (this.calculateFileSize) try {\n let e = await fetch(n), i = (await e.blob()).size;\n i && (t.size = i);\n } catch (t) {}\n this.dispatchEvent(new CustomEvent(`${$636b0cf1ed0b9f88$var$e}:success`, {\n bubbles: !0,\n composed: !0,\n detail: t\n }));\n }\n } catch (t) {\n this.dispatchEvent(new CustomEvent(`${$636b0cf1ed0b9f88$var$e}:error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n }\n }\n getSupportedConstraints() {\n return $636b0cf1ed0b9f88$export$cc30a98fe3890794.isSupported() && navigator.mediaDevices.getSupportedConstraints() || {};\n }\n getTrackCapabilities() {\n if (!this.#e) return {};\n let [t] = this.#e.getVideoTracks();\n return t && \"function\" == typeof t.getCapabilities && t.getCapabilities() || {};\n }\n getTrackSettings() {\n if (!this.#e) return {};\n let [t] = this.#e.getVideoTracks();\n return t && \"function\" == typeof t.getSettings && t.getSettings() || {};\n }\n static isSupported() {\n return !!navigator.mediaDevices?.getUserMedia;\n }\n static defineCustomElement(t = $636b0cf1ed0b9f88$var$e) {\n \"undefined\" == typeof window || window.customElements.get(t) || window.customElements.define(t, $636b0cf1ed0b9f88$export$cc30a98fe3890794);\n }\n}\n$636b0cf1ed0b9f88$export$cc30a98fe3890794.defineCustomElement();\n\n\nObject.defineProperty({}, \"ModalElement\", {\n get: function() {\n return $4da30046ce6d9325$export$32589115725b904b;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $4da30046ce6d9325$var$e = document.createElement(\"template\"), $4da30046ce6d9325$var$t = /* css */ `\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n --dialog-placement-margin: calc((2em + 6px) / 2);\n\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n /* Dialog placement */\n :host(:not([fullscreen])[placement=\"top-start\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-center\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-end\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center-start\"]) .dialog {\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center\"]) .dialog {\n margin: auto;\n }\n\n :host(:not([fullscreen])[placement=\"center-end\"]) .dialog {\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-start\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-center\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-end\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n /* Dialog animations */\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: 300ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: end;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n$4da30046ce6d9325$var$e.innerHTML = /* html */ `\n \n\n \n
\n
\n \n\n
\n \n
\n
\n\n \n\n
\n \n
\n
\n
\n`; /**\n * @summary A custom element that renders a modal dialog.\n * @documentation https://github.com/georapbox/modal-element\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines whether the modal is open or not.\n * @property {boolean} staticBackdrop - Determines whether the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines whether the modal should have a header or not.\n * @property {boolean} noAnimations - Determines whether the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines whether the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines whether the modal should be fullscreen or not.\n * @property {boolean} preserveOverflow - Determines whether the overflow of the body should be preserved when the modal is open.\n * @property {string} placement - Determines the placement of the modal.\n * @property {string} closeLabel - The label of the default close button, used as the aria-label attribute of the close button.\n *\n * @attribute {boolean} open - Reflects the open property.\n * @attribute {boolean} static-backdrop - Reflects the staticBackdrop property.\n * @attribute {boolean} no-header - Reflects the noHeader property.\n * @attribute {boolean} no-animations - Reflects the noAnimations property.\n * @attribute {boolean} no-close-button - Reflects the noCloseButton property.\n * @attribute {boolean} fullscreen - Reflects the fullscreen property.\n * @attribute {boolean} preserve-overflow - Reflects the preserveOverflow property.\n * @attribute {string} placement - Reflects the placement property.\n * @attribute {string} close-label - Reflects the closeLabel property.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n */ \nclass $4da30046ce6d9325$export$32589115725b904b extends HTMLElement {\n #e = null;\n #t = null;\n #o = null;\n #l = void 0;\n constructor(){\n if (super(), !this.shadowRoot) {\n let t = this.attachShadow({\n mode: \"open\"\n });\n t.appendChild($4da30046ce6d9325$var$e.content.cloneNode(!0));\n }\n this.shadowRoot && (this.#e = this.shadowRoot.querySelector(\"dialog\"), this.#t = this.shadowRoot.querySelector('slot[name=\"footer\"]'), this.#o = this.shadowRoot.querySelector('slot[name=\"close\"]'));\n }\n static get observedAttributes() {\n return [\n \"open\",\n \"no-header\",\n \"no-animations\",\n \"no-close-button\",\n \"close-label\"\n ];\n }\n attributeChangedCallback(e, t, o) {\n if (null !== this.#e) {\n if (\"open\" === e && t !== o && (this.open ? (this.#e.showModal(), this.dispatchEvent(new CustomEvent(\"me-open\", {\n bubbles: !0,\n composed: !0,\n detail: {\n element: this\n }\n })), document.body && !this.preserveOverflow && (document.body.style.overflow = \"hidden\")) : this.#e.close()), \"no-header\" === e && t !== o) {\n let e = this.#e.querySelector(\".dialog__header\");\n null !== e && (e.hidden = this.noHeader);\n }\n if (\"no-animations\" === e && t !== o && this.#e.classList.toggle(\"dialog--no-animations\", this.noAnimations), \"no-close-button\" === e && t !== o) {\n let e = this.#e.querySelector(\".dialog__close\");\n null !== e && (e.hidden = this.noCloseButton);\n }\n \"close-label\" === e && t !== o && this.#a();\n }\n }\n connectedCallback() {\n this.#i(\"open\"), this.#i(\"staticBackdrop\"), this.#i(\"noHeader\"), this.#i(\"noAnimations\"), this.#i(\"noCloseButton\"), this.#i(\"fullscreen\"), this.#i(\"preserveOverflow\"), this.#i(\"placement\"), this.#i(\"closeLabel\"), this.#e?.addEventListener(\"click\", this.#n), this.#e?.addEventListener(\"close\", this.#r), this.#e?.addEventListener(\"cancel\", this.#s), this.#e?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\", this.#d), this.#t?.addEventListener(\"slotchange\", this.#c), this.#o?.addEventListener(\"slotchange\", this.#h);\n }\n disconnectedCallback() {\n this.#l && clearTimeout(this.#l), this.#e?.addEventListener(\"click\", this.#n), this.#e?.removeEventListener(\"close\", this.#r), this.#e?.removeEventListener(\"cancel\", this.#s), this.#e?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\", this.#d), this.#t?.removeEventListener(\"slotchange\", this.#c), this.#o?.removeEventListener(\"slotchange\", this.#h);\n }\n get open() {\n return this.hasAttribute(\"open\");\n }\n set open(e) {\n this.toggleAttribute(\"open\", !!e);\n }\n get staticBackdrop() {\n return this.hasAttribute(\"static-backdrop\");\n }\n set staticBackdrop(e) {\n this.toggleAttribute(\"static-backdrop\", !!e);\n }\n get noHeader() {\n return this.hasAttribute(\"no-header\");\n }\n set noHeader(e) {\n this.toggleAttribute(\"no-header\", !!e);\n }\n get noAnimations() {\n return this.hasAttribute(\"no-animations\");\n }\n set noAnimations(e) {\n this.toggleAttribute(\"no-animations\", !!e);\n }\n get noCloseButton() {\n return this.hasAttribute(\"no-close-button\");\n }\n set noCloseButton(e) {\n this.toggleAttribute(\"no-close-button\", !!e);\n }\n get fullscreen() {\n return this.hasAttribute(\"fullscreen\");\n }\n set fullscreen(e) {\n this.toggleAttribute(\"fullscreen\", !!e);\n }\n get preserveOverflow() {\n return this.hasAttribute(\"preserve-overflow\");\n }\n set preserveOverflow(e) {\n this.toggleAttribute(\"preserve-overflow\", !!e);\n }\n get placement() {\n return this.getAttribute(\"placement\") || \"center\";\n }\n set placement(e) {\n this.setAttribute(\"placement\", null != e ? e.toString() : e);\n }\n get closeLabel() {\n return this.getAttribute(\"close-label\") || \"Close\";\n }\n set closeLabel(e) {\n this.setAttribute(\"close-label\", null != e ? e.toString() : e);\n }\n #a() {\n if (null === this.#e) return;\n let e = this.#e.querySelector(\".dialog__close\");\n if (null === e) return;\n let t = this.#o?.assignedElements() || [], o = t?.some((e)=>e.textContent?.replace(/\\s/g, \"\") !== \"\");\n o ? e.removeAttribute(\"aria-label\") : e.setAttribute(\"aria-label\", this.closeLabel);\n }\n #g() {\n this.#l || (this.#e?.classList.add(\"dialog--pulse\"), this.#l = setTimeout(()=>{\n this.#e?.classList.remove(\"dialog--pulse\"), clearTimeout(this.#l), this.#l = void 0;\n }, 300));\n }\n #r = ()=>{\n // the open property when the dialog is closed by the user.\n this.open = !1, this.dispatchEvent(new CustomEvent(\"me-close\", {\n bubbles: !0,\n composed: !0,\n detail: {\n element: this\n }\n })), document.body && !this.preserveOverflow && (document.body.style.overflow = \"\");\n };\n #s = (e)=>{\n let t = this.#m(\"escape-key\");\n this.dispatchEvent(t), t.defaultPrevented && (e.preventDefault(), this.noAnimations || this.#g());\n };\n #d = (e)=>{\n let t = this.#m(\"close-button\");\n this.dispatchEvent(t), t.defaultPrevented && (e.preventDefault(), this.noAnimations || this.#g());\n };\n #n = (e)=>{\n let t = e.target, o = e.currentTarget; // Close the dialog when the backdrop is clicked.\n if (t === o) {\n let e = this.#m(\"backdrop-click\");\n this.dispatchEvent(e), e.defaultPrevented || this.staticBackdrop ? this.noAnimations || this.#g() : this.hide();\n } // Close the dialog when external invoker is clicked.\n if (t instanceof HTMLElement && null !== t.closest(\"[data-me-close]\")) {\n let e = this.#m(\"external-invoker\");\n this.dispatchEvent(e), e.defaultPrevented ? this.noAnimations || this.#g() : this.hide();\n }\n };\n #c = ()=>{\n if (null === this.#e) return; /** @type {Nullable} */ \n let e = this.#e.querySelector(\".dialog__footer\");\n if (null === e) return;\n let t = this.#t?.assignedNodes(), o = !!t && t.length > 0;\n e.hidden = !o;\n };\n #h = ()=>{\n this.#a();\n };\n #m(e) {\n return new CustomEvent(\"me-request-close\", {\n bubbles: !0,\n composed: !0,\n cancelable: !0,\n detail: {\n reason: e,\n element: this\n }\n });\n }\n #i(e) {\n if (Object.prototype.hasOwnProperty.call(this, e)) {\n let t = this[e];\n delete this[e], this[e] = t;\n }\n }\n show() {\n this.open || (this.open = !0);\n }\n hide() {\n this.open && (this.open = !1);\n }\n static defineCustomElement(e = \"modal-element\") {\n \"undefined\" == typeof window || window.customElements.get(e) || window.customElements.define(e, $4da30046ce6d9325$export$32589115725b904b);\n }\n}\n$4da30046ce6d9325$export$32589115725b904b.defineCustomElement();\n //# sourceMappingURL=modal-element-defined.js.map\n\n\nObject.defineProperty({}, \"FilesDropzone\", {\n get: function() {\n return $7aad62ebc3d6fae8$export$6ccd1735166caad9;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $7aad62ebc3d6fae8$var$e = new Map([\n [\n \"aac\",\n \"audio/aac\"\n ],\n [\n \"abw\",\n \"application/x-abiword\"\n ],\n [\n \"arc\",\n \"application/x-freearc\"\n ],\n [\n \"avif\",\n \"image/avif\"\n ],\n [\n \"avi\",\n \"video/x-msvideo\"\n ],\n [\n \"azw\",\n \"application/vnd.amazon.ebook\"\n ],\n [\n \"bin\",\n \"application/octet-stream\"\n ],\n [\n \"bmp\",\n \"image/bmp\"\n ],\n [\n \"bz\",\n \"application/x-bzip\"\n ],\n [\n \"bz2\",\n \"application/x-bzip2\"\n ],\n [\n \"cda\",\n \"application/x-cdf\"\n ],\n [\n \"csh\",\n \"application/x-csh\"\n ],\n [\n \"css\",\n \"text/css\"\n ],\n [\n \"csv\",\n \"text/csv\"\n ],\n [\n \"doc\",\n \"application/msword\"\n ],\n [\n \"docx\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n ],\n [\n \"eot\",\n \"application/vnd.ms-fontobject\"\n ],\n [\n \"epub\",\n \"application/epub+zip\"\n ],\n [\n \"gz\",\n \"application/gzip\"\n ],\n [\n \"gif\",\n \"image/gif\"\n ],\n [\n \"heic\",\n \"image/heic\"\n ],\n [\n \"heif\",\n \"image/heif\"\n ],\n [\n \"htm\",\n \"text/html\"\n ],\n [\n \"html\",\n \"text/html\"\n ],\n [\n \"ico\",\n \"image/vnd.microsoft.icon\"\n ],\n [\n \"ics\",\n \"text/calendar\"\n ],\n [\n \"jar\",\n \"application/java-archive\"\n ],\n [\n \"jpeg\",\n \"image/jpeg\"\n ],\n [\n \"jpg\",\n \"image/jpeg\"\n ],\n [\n \"jxl\",\n \"image/jxl\"\n ],\n [\n \"js\",\n \"text/javascript\"\n ],\n [\n \"json\",\n \"application/json\"\n ],\n [\n \"jsonld\",\n \"application/ld+json\"\n ],\n [\n \"markdown\",\n \"text/markdown\"\n ],\n [\n \"md\",\n \"text/markdown\"\n ],\n [\n \"mid\",\n \"audio/midi\"\n ],\n [\n \"midi\",\n \"audio/midi\"\n ],\n [\n \"mjs\",\n \"text/javascript\"\n ],\n [\n \"mp3\",\n \"audio/mpeg\"\n ],\n [\n \"mp4\",\n \"video/mp4\"\n ],\n [\n \"mpeg\",\n \"video/mpeg\"\n ],\n [\n \"mpkg\",\n \"application/vnd.apple.installer+xml\"\n ],\n [\n \"odp\",\n \"application/vnd.oasis.opendocument.presentation\"\n ],\n [\n \"ods\",\n \"application/vnd.oasis.opendocument.spreadsheet\"\n ],\n [\n \"odt\",\n \"application/vnd.oasis.opendocument.text\"\n ],\n [\n \"oga\",\n \"audio/ogg\"\n ],\n [\n \"ogv\",\n \"video/ogg\"\n ],\n [\n \"ogx\",\n \"application/ogg\"\n ],\n [\n \"opus\",\n \"audio/opus\"\n ],\n [\n \"otf\",\n \"font/otf\"\n ],\n [\n \"png\",\n \"image/png\"\n ],\n [\n \"pdf\",\n \"application/pdf\"\n ],\n [\n \"php\",\n \"application/x-httpd-php\"\n ],\n [\n \"ppt\",\n \"application/vnd.ms-powerpoint\"\n ],\n [\n \"pptx\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n ],\n [\n \"rar\",\n \"application/vnd.rar\"\n ],\n [\n \"rtf\",\n \"application/rtf\"\n ],\n [\n \"sh\",\n \"application/x-sh\"\n ],\n [\n \"svg\",\n \"image/svg+xml\"\n ],\n [\n \"swf\",\n \"application/x-shockwave-flash\"\n ],\n [\n \"tar\",\n \"application/x-tar\"\n ],\n [\n \"tif\",\n \"image/tiff\"\n ],\n [\n \"tiff\",\n \"image/tiff\"\n ],\n [\n \"ts\",\n \"video/mp2t\"\n ],\n [\n \"ttf\",\n \"font/ttf\"\n ],\n [\n \"txt\",\n \"text/plain\"\n ],\n [\n \"vsd\",\n \"application/vnd.visio\"\n ],\n [\n \"wav\",\n \"audio/wav\"\n ],\n [\n \"weba\",\n \"audio/webm\"\n ],\n [\n \"webm\",\n \"video/webm\"\n ],\n [\n \"webp\",\n \"image/webp\"\n ],\n [\n \"woff\",\n \"font/woff\"\n ],\n [\n \"woff2\",\n \"font/woff2\"\n ],\n [\n \"xhtml\",\n \"application/xhtml+xml\"\n ],\n [\n \"xls\",\n \"application/vnd.ms-excel\"\n ],\n [\n \"xlsx\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n ],\n [\n \"xml\",\n \"application/xml\"\n ],\n [\n \"xul\",\n \"application/vnd.mozilla.xul+xml\"\n ],\n [\n \"zip\",\n \"application/zip\"\n ],\n [\n \"7z\",\n \"application/x-7z-compressed\"\n ],\n [\n \"mkv\",\n \"video/x-matroska\"\n ],\n [\n \"mov\",\n \"video/quicktime\"\n ],\n [\n \"msg\",\n \"application/vnd.ms-outlook\"\n ]\n]), $7aad62ebc3d6fae8$var$t = [\n \".DS_Store\",\n \"Thumbs.db\"\n], $7aad62ebc3d6fae8$var$o = (t)=>{\n let { name: o } = t;\n if (o && -1 !== o.lastIndexOf(\".\") && !t.type) {\n let i = (o.split(\".\").pop() || \"\").toLowerCase(), r = $7aad62ebc3d6fae8$var$e.get(i);\n r && Object.defineProperty(t, \"type\", {\n value: r,\n writable: !1,\n configurable: !1,\n enumerable: !0\n });\n }\n return t;\n}, $7aad62ebc3d6fae8$var$i = (e, t)=>{\n let i = $7aad62ebc3d6fae8$var$o(e);\n if (\"string\" != typeof i.path) {\n let { webkitRelativePath: o } = e;\n Object.defineProperty(i, \"path\", {\n value: \"string\" == typeof t ? t : o || e.name,\n writable: !1,\n configurable: !1,\n enumerable: !0\n });\n }\n return i;\n}, $7aad62ebc3d6fae8$var$r = async (e)=>await new Promise((t, o)=>{\n e.readEntries(t, o);\n }), $7aad62ebc3d6fae8$var$a = async (e)=>{\n let t = [], o = await $7aad62ebc3d6fae8$var$r(e);\n for(; o.length > 0;)t.push(...o), o = await $7aad62ebc3d6fae8$var$r(e);\n return t;\n}, $7aad62ebc3d6fae8$var$n = (e)=>new Promise((t, o)=>{\n e.file((o)=>t($7aad62ebc3d6fae8$var$i(o, e.fullPath)), o);\n }), $7aad62ebc3d6fae8$var$s = async (e)=>{\n let o = [], i = [];\n for (let t of e){\n if (\"file\" !== t.kind) continue;\n let e = t.getAsEntry ? t.getAsEntry() : t.webkitGetAsEntry();\n i.push(e);\n }\n for(; i.length > 0;){\n let e = i.shift();\n if (e) {\n if (e.isFile) {\n let i = await $7aad62ebc3d6fae8$var$n(e);\n -1 === $7aad62ebc3d6fae8$var$t.indexOf(i.name) && o.push(i);\n } else e.isDirectory && i.push(...await $7aad62ebc3d6fae8$var$a(e.createReader()));\n }\n }\n return o;\n}, $7aad62ebc3d6fae8$var$d = async (e)=>{\n let o = [];\n for (let r of e)-1 === $7aad62ebc3d6fae8$var$t.indexOf(r.name) && o.push($7aad62ebc3d6fae8$var$i(r));\n return o;\n}, $7aad62ebc3d6fae8$var$l = async (e)=>e.dataTransfer ? e.dataTransfer.items ? await $7aad62ebc3d6fae8$var$s(e.dataTransfer.items) : await $7aad62ebc3d6fae8$var$d(e.dataTransfer.files) : await $7aad62ebc3d6fae8$var$d(e.target.files), $7aad62ebc3d6fae8$var$p = \"files-dropzone\", $7aad62ebc3d6fae8$var$c = \"TOO_MANY_FILES\", $7aad62ebc3d6fae8$var$h = document.createElement(\"template\"), $7aad62ebc3d6fae8$var$u = `\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n$7aad62ebc3d6fae8$var$h.innerHTML = `\n \n\n \n\n
\n Drag 'n' drop files here, or click to select files\n
\n`;\nclass $7aad62ebc3d6fae8$export$6ccd1735166caad9 extends HTMLElement {\n #e = null;\n #t = null;\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\",\n delegatesFocus: !0\n }).appendChild($7aad62ebc3d6fae8$var$h.content.cloneNode(!0)), this.shadowRoot && (this.#e = this.shadowRoot.getElementById(\"file-input\"), this.#t = this.shadowRoot.getElementById(\"dropzone\"));\n }\n static get observedAttributes() {\n return [\n \"accept\",\n \"disabled\",\n \"multiple\"\n ];\n }\n attributeChangedCallback(e, t, o) {\n \"accept\" === e && t !== o && this.#e && (this.#e.accept = this.accept), \"disabled\" === e && t !== o && this.#e && (this.#e.disabled = this.disabled, this.disabled ? (this.#t?.removeAttribute(\"tabindex\"), this.#t?.setAttribute(\"aria-disabled\", \"true\")) : (this.#t?.setAttribute(\"tabindex\", \"0\"), this.#t?.setAttribute(\"aria-disabled\", \"false\"))), \"multiple\" === e && t !== o && this.#e && (this.#e.multiple = this.multiple);\n }\n connectedCallback() {\n this.#o(\"accept\"), this.#o(\"disabled\"), this.#o(\"maxFiles\"), this.#o(\"maxSize\"), this.#o(\"minSize\"), this.#o(\"multiple\"), this.#o(\"autoFocus\"), this.#o(\"noStyle\"), this.#e?.addEventListener(\"change\", this.#i), this.#t?.addEventListener(\"dragenter\", this.#r), this.#t?.addEventListener(\"dragover\", this.#a), this.#t?.addEventListener(\"dragleave\", this.#n), this.#t?.addEventListener(\"drop\", this.#s), this.#t?.addEventListener(\"click\", this.#d), this.#t?.addEventListener(\"keyup\", this.#l), this.autoFocus && this.#t?.focus();\n }\n disconnectedCallback() {\n this.#e?.removeEventListener(\"change\", this.#i), this.#t?.removeEventListener(\"dragenter\", this.#r), this.#t?.removeEventListener(\"dragover\", this.#a), this.#t?.removeEventListener(\"dragleave\", this.#n), this.#t?.removeEventListener(\"drop\", this.#s), this.#t?.removeEventListener(\"click\", this.#d), this.#t?.removeEventListener(\"keyup\", this.#l);\n }\n get accept() {\n return this.getAttribute(\"accept\") || \"\";\n }\n set accept(e) {\n this.setAttribute(\"accept\", null != e ? e.toString() : e);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(e) {\n this.toggleAttribute(\"disabled\", !!e);\n }\n get maxFiles() {\n let e = Number(this.getAttribute(\"max-files\")) || 0;\n return e <= 0 ? 1 / 0 : Math.floor(Math.abs(e));\n }\n set maxFiles(e) {\n this.setAttribute(\"max-files\", null != e ? e.toString() : e);\n }\n get maxSize() {\n let e = this.getAttribute(\"max-size\");\n if (null === e) return 1 / 0;\n let t = Number(e);\n return Number.isNaN(t) ? 1 / 0 : t;\n }\n set maxSize(e) {\n this.setAttribute(\"max-size\", null != e ? e.toString() : e);\n }\n get minSize() {\n let e = this.getAttribute(\"min-size\");\n if (null === e) return 0;\n let t = Number(e);\n return Number.isNaN(t) ? 0 : t;\n }\n set minSize(e) {\n this.setAttribute(\"min-size\", null != e ? e.toString() : e);\n }\n get multiple() {\n return this.hasAttribute(\"multiple\");\n }\n set multiple(e) {\n this.toggleAttribute(\"multiple\", !!e);\n }\n get autoFocus() {\n return this.hasAttribute(\"auto-focus\");\n }\n set autoFocus(e) {\n this.toggleAttribute(\"auto-focus\", !!e);\n }\n get noStyle() {\n return this.hasAttribute(\"no-style\");\n }\n set noStyle(e) {\n this.toggleAttribute(\"no-style\", !!e);\n }\n #i = async (e)=>{\n try {\n this.#p(await $7aad62ebc3d6fae8$var$l(e));\n } catch (e) {\n this.dispatchEvent(new CustomEvent(`${$7aad62ebc3d6fae8$var$p}-error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: e\n }\n }));\n }\n };\n #r = ()=>{\n this.disabled || this.dispatchEvent(new Event(`${$7aad62ebc3d6fae8$var$p}-dragenter`, {\n bubbles: !0,\n composed: !0\n }));\n };\n #a = (e)=>{\n if (e.preventDefault(), this.disabled) {\n e.dataTransfer.dropEffect = \"none\";\n return;\n }\n e.dataTransfer.dropEffect = \"copy\", this.#t && (this.#t.classList.add(\"dropzone--dragover\"), this.#t.part.add(\"dropzone--dragover\")), this.dispatchEvent(new Event(`${$7aad62ebc3d6fae8$var$p}-dragover`, {\n bubbles: !0,\n composed: !0\n }));\n };\n #n = ()=>{\n this.disabled || (this.#t && (this.#t.classList.remove(\"dropzone--dragover\"), this.#t.part.remove(\"dropzone--dragover\")), this.dispatchEvent(new Event(`${$7aad62ebc3d6fae8$var$p}-dragleave`, {\n bubbles: !0,\n composed: !0\n })));\n };\n #s = async (e)=>{\n if (!this.disabled) {\n e.preventDefault(), this.#t && (this.#t.classList.remove(\"dropzone--dragover\"), this.#t.part.remove(\"dropzone--dragover\"));\n try {\n this.#p(await $7aad62ebc3d6fae8$var$l(e));\n } catch (e) {\n this.dispatchEvent(new CustomEvent(`${$7aad62ebc3d6fae8$var$p}-error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: e\n }\n }));\n }\n }\n };\n #d = ()=>{\n this.disabled || this.#e?.click();\n };\n #l = (e)=>{\n this.disabled || \" \" !== e.key && \"Enter\" !== e.key || this.#e?.click();\n };\n #p(e) {\n if (!Array.isArray(e) || !e.length) return;\n let t = [], o = [], i = e.length;\n if (!this.multiple && i > 1) for (let t of e)o.push({\n file: t,\n errors: [\n {\n code: $7aad62ebc3d6fae8$var$c,\n message: \"Too many files selected. Only 1 file is allowed.\"\n }\n ]\n });\n else if (this.multiple && i > this.maxFiles) for (let t of e)o.push({\n file: t,\n errors: [\n {\n code: $7aad62ebc3d6fae8$var$c,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? \"files are\" : \"file is\"} allowed.`\n }\n ]\n });\n else for (let i of e){\n let e = function(e, t = \"\") {\n if (!t) return !0;\n let o = [\n ...new Set(t.split(\",\").map((e)=>e.trim()).filter(Boolean))\n ], i = e.type, r = i.replace(/\\/.*$/, \"\");\n for (let t of o)if (\".\" === t.charAt(0)) {\n if (-1 !== e.name.toLowerCase().indexOf(t.toLowerCase(), e.name.length - t.length)) return !0;\n } else if (/\\/\\*$/.test(t)) {\n if (r === t.replace(/\\/.*$/, \"\")) return !0;\n } else if (i === t) return !0;\n return !1;\n }(i, this.accept), r = i.size > this.maxSize, a = i.size < this.minSize;\n if (!e || r || a) {\n let t = [];\n e || t.push({\n code: \"INVALID_MIME_TYPE\",\n message: `File type \"${i.type}\" is not accepted.`\n }), r && t.push({\n code: \"FILE_TOO_LARGE\",\n message: `File size ${i.size} exceeds the maximum size of ${this.maxSize}.`\n }), a && t.push({\n code: \"FILE_TOO_SMALL\",\n message: `File size ${i.size} is smaller than the minimum size of ${this.minSize}.`\n }), o.push({\n file: i,\n errors: t\n });\n } else t.push(i);\n }\n this.dispatchEvent(new CustomEvent(`${$7aad62ebc3d6fae8$var$p}-drop`, {\n bubbles: !0,\n composed: !0,\n detail: {\n acceptedFiles: t,\n rejectedFiles: o\n }\n })), t.length > 0 && this.dispatchEvent(new CustomEvent(`${$7aad62ebc3d6fae8$var$p}-drop-accepted`, {\n bubbles: !0,\n composed: !0,\n detail: {\n acceptedFiles: t\n }\n })), o.length > 0 && this.dispatchEvent(new CustomEvent(`${$7aad62ebc3d6fae8$var$p}-drop-rejected`, {\n bubbles: !0,\n composed: !0,\n detail: {\n rejectedFiles: o\n }\n })), this.#e && (this.#e.value = this.#e.defaultValue);\n }\n openFileDialog() {\n this.disabled || this.#e?.click();\n }\n #o(e) {\n if (Object.prototype.hasOwnProperty.call(this, e)) {\n let t = this[e];\n delete this[e], this[e] = t;\n }\n }\n static defineCustomElement(e = $7aad62ebc3d6fae8$var$p) {\n \"undefined\" == typeof window || window.customElements.get(e) || window.customElements.define(e, $7aad62ebc3d6fae8$export$6ccd1735166caad9);\n }\n}\n$7aad62ebc3d6fae8$export$6ccd1735166caad9.defineCustomElement();\n\n\n\n\nconst $33dea9d9a6da4c9a$export$63e7bed68b07a85c = [\n \"image/jpg\",\n \"image/jpeg\",\n \"image/png\",\n \"image/apng\",\n \"image/gif\",\n \"image/webp\",\n \"image/avif\"\n];\nconst $33dea9d9a6da4c9a$export$62045be72fe457b4 = 20;\nconst $33dea9d9a6da4c9a$export$8f089f0a062560ff = 20;\nconst $33dea9d9a6da4c9a$export$d3f4819a57998cf7 = 360;\n\n\n/**\n * Generates a unique id of the form `${prefix}-${randomString}-${suffix}`.\n *\n * @param {string} [prefix=''] - The prefix to use for the id.\n * @param {string} [suffix=''] - The suffix to use for the id.\n * @returns {string} - The unique id.\n */ const $21c3f3a8dccfa4fd$export$e2a22331486dcca0 = (prefix = \"\", suffix = \"\")=>{\n const prefixString = typeof prefix === \"string\" && prefix !== \"\" ? prefix + \"-\" : \"\";\n const suffixString = typeof suffix === \"string\" && suffix !== \"\" ? \"-\" + suffix : \"\";\n const randomString = Math.random().toString(36).substring(2, 8); // Pseudo-random string of six alphanumeric characters.\n return `${prefixString}${randomString}${suffixString}`;\n};\n\n\n\nconst $c3d7e05a1ce34ed5$export$6539e087749cf9d3 = async (options = {})=>{\n const res = await fetch(options.url);\n const blob = await res.blob();\n const mimeType = options.mimeType || blob.type || \"\";\n if (!(0, $33dea9d9a6da4c9a$export$63e7bed68b07a85c).includes(mimeType)) throw new Error(`This is not an accepted image format. Accepted MIME types are: ${(0, $33dea9d9a6da4c9a$export$63e7bed68b07a85c).join(\", \")}`);\n return new File([\n blob\n ], options.filename || \"\", blob);\n};\n\n\n/**\n * A class representing a storage utility for managing data in `localStorage` or `sessionStorage`.\n */ class $f0a2ccd611c71db8$export$bf2a15d34f3c441c {\n /**\n * The prefix to be added to all keys.\n *\n * @type {string}\n * @private\n */ #keyPrefix = null;\n /**\n * The storage provider (`localStorage` or `sessionStorage`).\n *\n * @type {Storage}\n * @private\n */ #provider = null;\n /**\n * Creates an instance of Storage.\n *\n * @param {string} prefix - The prefix to be added to all keys when storing/retrieving data.\n * @param {Storage} [provider=localStorage] - The storage provider (`localStorage` or `sessionStorage`).\n * @throws {Error} If prefix is not provided or if the provider is not supported.\n */ constructor(prefix, provider = localStorage){\n if (!prefix) throw new Error(\"Storage prefix is required\");\n if (provider !== localStorage && provider !== sessionStorage) throw new Error(\"Storage provider is not supported\");\n this.#keyPrefix = prefix;\n this.#provider = provider;\n }\n /**\n * Sets a key-value pair in the storage.\n *\n * @param {string} key - The key for the data.\n * @param {*} value - The value to be stored (will be converted to JSON string).\n */ set(key, value) {\n try {\n this.#provider.setItem(`${this.#keyPrefix}${key}`, JSON.stringify(value));\n } catch (err) {\n console.error(\"Error saving to storage\", err);\n }\n }\n /**\n * Retrieves the value associated with the given key from the storage.\n *\n * @param {string} key - The key to retrieve the value for.\n * @returns {*} The value associated with the key, or `null` if key is not found or an error occurs.\n */ get(key) {\n try {\n const value = this.#provider.getItem(`${this.#keyPrefix}${key}`);\n return value ? JSON.parse(value) : null;\n } catch (err) {\n console.error(\"Error getting from storage\", err);\n return null;\n }\n }\n}\nconst $f0a2ccd611c71db8$var$DEFAULT_STORAGE_PREFIX = \"meme-generator/\";\nconst $f0a2ccd611c71db8$var$DEFAULT_STORAGE_PROVIDER = localStorage;\nconst $f0a2ccd611c71db8$export$ddcffe0146c8f882 = new $f0a2ccd611c71db8$export$bf2a15d34f3c441c($f0a2ccd611c71db8$var$DEFAULT_STORAGE_PREFIX, $f0a2ccd611c71db8$var$DEFAULT_STORAGE_PROVIDER);\n\n\nconst $fbb55a96d78c7ba0$export$de75f46579dcf24 = (selectedImage)=>{\n return typeof selectedImage === \"string\";\n};\n\n\nvar $eccf21b2da8f185e$exports = {};\n\n$eccf21b2da8f185e$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"Pressuru.684952ea.ttf\";\n\n\nvar $4e9367b4637ab0b3$exports = {};\n\n$4e9367b4637ab0b3$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"Oswald-Regular.89ec7d89.ttf\";\n\n\nvar $98768b53aac35bcc$exports = {};\n\n$98768b53aac35bcc$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"Oswald-Bold.0f6a7ca6.ttf\";\n\n\nvar $81873ad161a9f996$exports = {};\n\n$81873ad161a9f996$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"Roboto-Regular.ca197847.ttf\";\n\n\nvar $f1c993919e45d5c2$exports = {};\n\n$f1c993919e45d5c2$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"Roboto-Bold.fdb9b54a.ttf\";\n\n\nvar $8f40b96e34825d38$exports = {};\n\n$8f40b96e34825d38$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"RobotoCondensed-Regular.d585f5c7.ttf\";\n\n\nvar $51e3f333db254f7d$exports = {};\n\n$51e3f333db254f7d$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"RobotoCondensed-Bold.e1f96d4b.ttf\";\n\n\nvar $0d878777045f8608$exports = {};\n\n$0d878777045f8608$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"CourierPrime-Regular.3a25a501.ttf\";\n\n\nvar $da7f4261981c6446$exports = {};\n\n$da7f4261981c6446$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"CourierPrime-Bold.3d6bf689.ttf\";\n\n\nvar $553eebead4d87493$exports = {};\n\n$553eebead4d87493$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"OpenSans-Regular.edf9e01b.ttf\";\n\n\nvar $e4f4da01dd92f98a$exports = {};\n\n$e4f4da01dd92f98a$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"OpenSans-Bold.8fceb72b.ttf\";\n\n\nconst $055531bbd0af154c$export$6874249d87f2602a = [\n {\n name: \"Pressuru\",\n label: \"Pressuru\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($eccf21b2da8f185e$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"Oswald-Regular\",\n label: \"Oswald\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($4e9367b4637ab0b3$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"Oswald-Bold\",\n label: \"Oswald Bold\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($98768b53aac35bcc$exports))),\n style: \"normal\",\n weight: \"700\"\n },\n {\n name: \"Roboto-Regular\",\n label: \"Roboto\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($81873ad161a9f996$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"Roboto-Bold\",\n label: \"Roboto Bold\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($f1c993919e45d5c2$exports))),\n style: \"normal\",\n weight: \"700\"\n },\n {\n name: \"RobotoCondensed-Regular\",\n label: \"Roboto Condensed\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($8f40b96e34825d38$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"RobotoCondensed-Bold\",\n label: \"Roboto Condensed Bold\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($51e3f333db254f7d$exports))),\n style: \"normal\",\n weight: \"700\"\n },\n {\n name: \"CourierPrime-Regular\",\n label: \"Courier Prime\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($0d878777045f8608$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"CourierPrime-Bold\",\n label: \"Courier Prime Bold\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($da7f4261981c6446$exports))),\n style: \"normal\",\n weight: \"700\"\n },\n {\n name: \"OpenSans-Regular\",\n label: \"Open Sans\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($553eebead4d87493$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"OpenSans-Bold\",\n label: \"Open Sans Bold\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($e4f4da01dd92f98a$exports))),\n style: \"normal\",\n weight: \"400\"\n }\n];\nconst $055531bbd0af154c$export$59eceaef0c7797b2 = async (name, path, options = {})=>{\n try {\n const font = new FontFace(name, `url(${path})`, {\n ...options\n });\n await font.load();\n document.fonts.add(font);\n } catch (err) {\n console.error(err);\n }\n};\n\n\nconst $166cfb2484b08c80$var$errorsContainer = document.getElementById(\"errorsContainer\");\nconst $166cfb2484b08c80$var$hideError = (evt)=>{\n const target = evt.currentTarget;\n target.removeEventListener(\"click\", $166cfb2484b08c80$var$hideError);\n $166cfb2484b08c80$var$errorsContainer.removeChild(target.parentNode);\n};\nconst $166cfb2484b08c80$export$af04143326425dbd = (message = \"\", type = \"info\")=>{\n const types = [\n \"info\",\n \"warning\",\n \"danger\"\n ];\n if (!types.includes(type)) type = \"info\";\n const template = /* html */ `\n ${message}\n \n `;\n const div = document.createElement(\"div\");\n div.className = `alert alert-${type} alert-dismissible text-break mb-2 fade`;\n div.innerHTML = template;\n div.querySelector(\"button\").addEventListener(\"click\", $166cfb2484b08c80$var$hideError);\n $166cfb2484b08c80$var$errorsContainer.appendChild(div);\n setTimeout(()=>div.classList.add(\"show\"), 100);\n};\n\n\n\n\n\nconst $f0ee20a32c2bc385$var$defaultTextboxData = {\n id: \"\",\n text: \"\",\n fillColor: \"#ffffff\",\n strokeColor: \"#000000\",\n font: \"Pressuru\",\n fontSize: 40,\n fontWeight: \"normal\",\n textAlign: \"center\",\n shadowBlur: 0,\n strokeWidth: 1.5,\n offsetY: 0,\n offsetX: 0,\n rotate: 0,\n allCaps: true\n};\nconst $f0ee20a32c2bc385$var$textboxes = new Map();\nclass $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b {\n constructor(data){\n const id = (0, $21c3f3a8dccfa4fd$export$e2a22331486dcca0)(\"textbox\", Date.now().toString(36));\n this.data = data ? {\n ...data,\n id: id\n } : {\n ...$f0ee20a32c2bc385$var$defaultTextboxData,\n id: id\n };\n $f0ee20a32c2bc385$var$textboxes.set(id, this);\n document.dispatchEvent(new CustomEvent(`textbox-create`, {\n bubbles: true,\n composed: true,\n detail: {\n textbox: this\n }\n }));\n }\n getData() {\n return this.data;\n }\n static create(data) {\n return new $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b(data);\n }\n static getAll() {\n return $f0ee20a32c2bc385$var$textboxes;\n }\n static getById(id) {\n return $f0ee20a32c2bc385$var$textboxes.get(id);\n }\n static remove(id) {\n $f0ee20a32c2bc385$var$textboxes.delete(id);\n document.dispatchEvent(new CustomEvent(`textbox-remove`, {\n bubbles: true,\n composed: true,\n detail: {\n id: id\n }\n }));\n }\n static createElement(textbox, autoFocus = true) {\n if (!(textbox instanceof $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b)) return;\n const data = textbox.getData();\n const { id: id, text: text, fillColor: fillColor, strokeColor: strokeColor, fontSize: fontSize, shadowBlur: shadowBlur, strokeWidth: strokeWidth, offsetX: offsetX, offsetY: offsetY, rotate: rotate } = data;\n const template = /* html */ `\n
\n \n \n\n \n\n
\n \n \n\n \n \n\n \n
\n
\n\n \n `;\n const fragment = document.createDocumentFragment();\n const div = document.createElement(\"div\");\n div.setAttribute(\"id\", id);\n div.setAttribute(\"data-section\", \"textbox\");\n div.className = \"bg-light border shadow-sm mb-3 rounded\";\n div.innerHTML = template;\n div.querySelectorAll(\"select\").forEach((el)=>el.value = data[el.dataset.input]);\n div.querySelectorAll('input[type=\"checkbox\"]').forEach((el)=>el.checked = data[el.dataset.input]);\n const textboxEl = fragment.appendChild(div);\n if (autoFocus) setTimeout(()=>textboxEl.querySelector('[data-input=\"text\"]').focus(), 0);\n return textboxEl;\n }\n}\n\n\n\n\nclass $68e654e91d7a7392$export$8d01c972ee8b14a9 {\n #canvas = null;\n #ctx = null;\n constructor(canvasEl){\n this.#canvas = canvasEl;\n this.#ctx = this.#canvas.getContext(\"2d\");\n }\n get width() {\n return this.#canvas.width;\n }\n set width(value) {\n this.#canvas.width = value;\n }\n get height() {\n return this.#canvas.height;\n }\n set height(value) {\n this.#canvas.height = value;\n }\n getDimensions() {\n return {\n width: this.width,\n height: this.height\n };\n }\n setDimensions({ width: width, height: height }) {\n this.width = width;\n this.height = height;\n return this;\n }\n toDataURL() {\n return this.#canvas.toDataURL();\n }\n draw(image, textboxes = new Map()) {\n if (image == null) return;\n const canvas = this.#canvas;\n const ctx = this.#ctx;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n if ((0, $fbb55a96d78c7ba0$export$de75f46579dcf24)(image)) {\n ctx.fillStyle = image;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n } else ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n let multiplier = 0;\n textboxes.forEach((textbox)=>{\n const { data: data } = textbox;\n multiplier += 1;\n ctx.save();\n ctx.font = `${data.fontWeight} ${data.fontSize * canvas.width / 1000}px ${data.font}`;\n ctx.fillStyle = data.fillColor;\n ctx.textAlign = data.textAlign;\n ctx.strokeStyle = data.strokeColor;\n const lineHeight = ctx.measureText(\"M\").width + data.fontSize / 2;\n const xPos = canvas.width / 2;\n const shadowBlur = data.shadowBlur;\n const text = data.allCaps === true ? data.text.toUpperCase() : data.text;\n const textLines = text.split(\"\\n\");\n if (shadowBlur !== 0) {\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n ctx.shadowBlur = Math.min(shadowBlur, (0, $33dea9d9a6da4c9a$export$62045be72fe457b4));\n ctx.shadowColor = data.strokeColor;\n }\n ctx.translate(xPos + data.offsetX, lineHeight * multiplier + data.offsetY);\n ctx.rotate(Math.min(data.rotate, (0, $33dea9d9a6da4c9a$export$d3f4819a57998cf7)) * Math.PI / 180);\n // First draw each line with shadow.\n textLines.forEach((text, index)=>ctx.fillText(text, 0, index * lineHeight));\n // Since shadows of multiline text may be drawn over letters of neighbour lines\n // (when shadow blur is big enough), re-draw text without shadows.\n if (shadowBlur !== 0) {\n ctx.shadowBlur = 0;\n textLines.forEach((text, index)=>ctx.fillText(text, 0, index * lineHeight));\n }\n if (data.strokeWidth > 0) {\n ctx.lineWidth = Math.min(data.strokeWidth, (0, $33dea9d9a6da4c9a$export$8f089f0a062560ff));\n textLines.forEach((text, index)=>ctx.strokeText(text, 0, index * lineHeight));\n }\n ctx.restore();\n });\n return this;\n }\n clear() {\n this.#ctx.clearRect(0, 0, this.#canvas.width, this.#canvas.height);\n return this;\n }\n show() {\n this.#canvas.hidden = false;\n return this;\n }\n hide() {\n this.#canvas.hidden = true;\n return this;\n }\n static createInstance(canvasEl) {\n return new $68e654e91d7a7392$export$8d01c972ee8b14a9(canvasEl);\n }\n}\n\n\nconst $44ae6d9db4eaca0f$var$canvas = (0, $68e654e91d7a7392$export$8d01c972ee8b14a9).createInstance(document.getElementById(\"canvas\"));\nconst $44ae6d9db4eaca0f$var$videoModal = document.getElementById(\"videoModal\");\nconst $44ae6d9db4eaca0f$var$downloadModal = document.getElementById(\"downloadModal\");\nconst $44ae6d9db4eaca0f$var$dropzoneEl = document.querySelector(\"files-dropzone\");\nconst $44ae6d9db4eaca0f$var$instructionsEl = document.getElementById(\"instructions\");\nconst $44ae6d9db4eaca0f$var$imageUploadMethodSelect = document.getElementById(\"imageUploadMethodSelect\");\nconst $44ae6d9db4eaca0f$var$fileSelectBtn = document.getElementById(\"fileSelectBtn\");\nconst $44ae6d9db4eaca0f$var$imageUrlForm = document.getElementById(\"imageUrlForm\");\nconst $44ae6d9db4eaca0f$var$addTextboxBtn = document.getElementById(\"addTextboxBtn\");\nconst $44ae6d9db4eaca0f$var$textboxesContainer = document.getElementById(\"textboxesContainer\");\nconst $44ae6d9db4eaca0f$var$generateMemeBtn = document.getElementById(\"generateMemeBtn\");\nconst $44ae6d9db4eaca0f$var$openVideoModalBtn = document.getElementById(\"openVideoModalBtn\");\nconst $44ae6d9db4eaca0f$var$downloadMemeBtn = document.getElementById(\"downloadMemeBtn\");\nconst $44ae6d9db4eaca0f$var$downloadMemePreview = document.getElementById(\"downloadMemePreview\");\nconst $44ae6d9db4eaca0f$var$webShareComponent = document.querySelector(\"web-share\");\nconst $44ae6d9db4eaca0f$var$galleryEl = document.getElementById(\"gallery\");\nconst $44ae6d9db4eaca0f$var$gallerySearchEl = document.getElementById(\"gallerySearch\");\nconst $44ae6d9db4eaca0f$var$galleryNoResultsEl = $44ae6d9db4eaca0f$var$galleryEl.querySelector(\".gallery__no-results\");\nconst $44ae6d9db4eaca0f$var$solidColorForm = document.getElementById(\"solidColorForm\");\nconst $44ae6d9db4eaca0f$var$uploadMethodEls = document.querySelectorAll(\".upload-method\");\nconst $44ae6d9db4eaca0f$var$removeConfirmationModal = document.getElementById(\"removeConfirmationModal\");\nconst $44ae6d9db4eaca0f$var$removeTextForm = document.getElementById(\"removeTextForm\");\nconst $44ae6d9db4eaca0f$var$maxImageDimensionsForm = document.getElementById(\"maxImageDimensionsForm\");\nconst $44ae6d9db4eaca0f$var$maxImageDimensionsSelect = $44ae6d9db4eaca0f$var$maxImageDimensionsForm[\"maxImageDimensions\"];\nconst $44ae6d9db4eaca0f$var$clearCanvasBtn = document.getElementById(\"clearCanvasBtn\");\nconst $44ae6d9db4eaca0f$var$maxImageDimensionsFromStorage = (0, $f0a2ccd611c71db8$export$ddcffe0146c8f882).get(\"maxImageDimensions\");\nlet $44ae6d9db4eaca0f$var$shouldFocusOnTextboxCreate = false;\nlet $44ae6d9db4eaca0f$var$selectedImage = null;\nlet $44ae6d9db4eaca0f$var$reqAnimFrame = null;\nconst $44ae6d9db4eaca0f$var$renderAcceptedImageFormats = (acceptedMimeTypes, rootEl)=>{\n if (!rootEl) return;\n const extensions = acceptedMimeTypes.map((mimeType)=>mimeType.split(\"/\")[1]);\n const str = `Supported image formats: ${extensions.join(\", \")}`;\n const div = document.createElement(\"div\");\n const small = document.createElement(\"small\");\n small.textContent = str;\n div.appendChild(small);\n rootEl.appendChild(small);\n};\nconst $44ae6d9db4eaca0f$var$generateMeme = async ()=>{\n const dataUrl = $44ae6d9db4eaca0f$var$canvas.toDataURL(\"image/png\");\n const filename = `${(0, $21c3f3a8dccfa4fd$export$e2a22331486dcca0)(\"meme\")}.png`;\n // Prepare download link\n const downloadLink = dataUrl.replace(\"image/png\", \"image/octet-stream\");\n $44ae6d9db4eaca0f$var$downloadMemeBtn.download = filename;\n $44ae6d9db4eaca0f$var$downloadMemeBtn.href = downloadLink;\n $44ae6d9db4eaca0f$var$downloadMemePreview.width = $44ae6d9db4eaca0f$var$canvas.getDimensions().width;\n $44ae6d9db4eaca0f$var$downloadMemePreview.height = $44ae6d9db4eaca0f$var$canvas.getDimensions().height;\n $44ae6d9db4eaca0f$var$downloadMemePreview.src = downloadLink;\n // Prepare for sharing file\n if ((0, $94933cc6427541bd$export$c37129e465f64ef0)()) try {\n const file = await (0, $c3d7e05a1ce34ed5$export$6539e087749cf9d3)({\n url: dataUrl,\n filename: filename,\n mimeType: \"image/png\"\n }).catch((err)=>(0, $166cfb2484b08c80$export$af04143326425dbd)(err.message, \"danger\"));\n if (file && (0, $94933cc6427541bd$export$c37129e465f64ef0)({\n files: [\n file\n ]\n })) {\n $44ae6d9db4eaca0f$var$webShareComponent.shareFiles = [\n file\n ];\n $44ae6d9db4eaca0f$var$webShareComponent.hidden = false;\n }\n } catch (error) {\n console.error(error);\n }\n window.requestAnimationFrame(()=>{\n $44ae6d9db4eaca0f$var$downloadModal.open = true;\n });\n};\nconst $44ae6d9db4eaca0f$var$setImageMaxDimensions = (image)=>{\n const maxImageDimensionsSelect = $44ae6d9db4eaca0f$var$maxImageDimensionsForm[\"maxImageDimensions\"];\n const [maxWidthValue, maxHeightValue] = maxImageDimensionsSelect.value.split(\"x\");\n const MAX_WIDTH = Number(maxWidthValue) || 800;\n const MAX_HEIGHT = Number(maxHeightValue) || 600;\n let width = image.width;\n let height = image.height;\n if (width > height) {\n if (width > MAX_WIDTH) {\n height *= MAX_WIDTH / width;\n width = MAX_WIDTH;\n }\n } else if (height > MAX_HEIGHT) {\n width *= MAX_HEIGHT / height;\n height = MAX_HEIGHT;\n }\n $44ae6d9db4eaca0f$var$canvas.setDimensions({\n width: width,\n height: height\n });\n};\nconst $44ae6d9db4eaca0f$var$afterImageSelect = ()=>{\n $44ae6d9db4eaca0f$var$canvas.draw($44ae6d9db4eaca0f$var$selectedImage, (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).getAll()).show();\n $44ae6d9db4eaca0f$var$dropzoneEl.classList.add(\"dropzone--accepted\");\n $44ae6d9db4eaca0f$var$dropzoneEl.disabled = true;\n $44ae6d9db4eaca0f$var$generateMemeBtn.disabled = false;\n $44ae6d9db4eaca0f$var$instructionsEl.hidden = true;\n $44ae6d9db4eaca0f$var$clearCanvasBtn.hidden = false;\n};\nconst $44ae6d9db4eaca0f$var$handleImageLoad = (evt)=>{\n $44ae6d9db4eaca0f$var$selectedImage = evt.target;\n $44ae6d9db4eaca0f$var$setImageMaxDimensions($44ae6d9db4eaca0f$var$selectedImage);\n $44ae6d9db4eaca0f$var$afterImageSelect();\n};\nconst $44ae6d9db4eaca0f$var$handleSolidColorFormInput = (evt)=>{\n const DEFAULT_WIDTH = 800;\n const DEFAULT_HEIGHT = 600;\n if (evt.target === $44ae6d9db4eaca0f$var$solidColorForm[\"canvasColor\"]) $44ae6d9db4eaca0f$var$selectedImage = evt.target.value;\n if ((0, $fbb55a96d78c7ba0$export$de75f46579dcf24)($44ae6d9db4eaca0f$var$selectedImage)) {\n $44ae6d9db4eaca0f$var$canvas.setDimensions({\n width: Number($44ae6d9db4eaca0f$var$solidColorForm[\"canvasWidth\"].value) || DEFAULT_WIDTH,\n height: Number($44ae6d9db4eaca0f$var$solidColorForm[\"canvasHeight\"].value) || DEFAULT_HEIGHT\n });\n $44ae6d9db4eaca0f$var$afterImageSelect();\n }\n};\nconst $44ae6d9db4eaca0f$var$handleFileSelect = (file)=>{\n if (!file) return;\n const image = new Image();\n const reader = new FileReader();\n reader.addEventListener(\"load\", function(evt) {\n const data = evt.target.result;\n image.addEventListener(\"load\", $44ae6d9db4eaca0f$var$handleImageLoad);\n image.src = data;\n });\n reader.readAsDataURL(file);\n};\nconst $44ae6d9db4eaca0f$var$handleOpenVideoModalButtonClick = ()=>{\n $44ae6d9db4eaca0f$var$videoModal.open = true;\n};\nconst $44ae6d9db4eaca0f$var$handleTextPropChange = (element, textboxId, prop)=>{\n const textboxData = (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).getById(textboxId).getData();\n switch(element.type){\n case \"checkbox\":\n textboxData[prop] = element.checked;\n break;\n case \"number\":\n textboxData[prop] = Number(element.value);\n break;\n default:\n textboxData[prop] = element.value;\n }\n $44ae6d9db4eaca0f$var$canvas.draw($44ae6d9db4eaca0f$var$selectedImage, (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).getAll());\n};\nconst $44ae6d9db4eaca0f$var$handleAddTextboxBtnClick = ()=>(0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).create();\nconst $44ae6d9db4eaca0f$var$handleImageUploadFromURL = async (evt)=>{\n evt.preventDefault();\n const form = evt.target;\n const submitButton = form.querySelector('button[type=\"submit\"]');\n const imageUrl = form[\"imageUrl\"].value;\n if (!imageUrl.trim()) return;\n submitButton.disabled = true;\n submitButton.querySelector(\".spinner\").hidden = false;\n submitButton.querySelector(\".label\").hidden = true;\n try {\n const file = await (0, $c3d7e05a1ce34ed5$export$6539e087749cf9d3)({\n url: imageUrl\n }).catch((err)=>(0, $166cfb2484b08c80$export$af04143326425dbd)(err.message, \"danger\"));\n if (file) $44ae6d9db4eaca0f$var$handleFileSelect(file);\n } catch {\n (0, $166cfb2484b08c80$export$af04143326425dbd)(`Failed to load image from \"${imageUrl}\".`, \"danger\");\n } finally{\n submitButton.disabled = false;\n submitButton.querySelector(\".spinner\").hidden = true;\n submitButton.querySelector(\".label\").hidden = false;\n }\n};\nconst $44ae6d9db4eaca0f$var$moveTextUsingArrowbuttons = (textboxId, direction)=>()=>{\n const textboxEl = document.getElementById(textboxId);\n const offsetYInput = textboxEl.querySelector('[data-input=\"offsetY\"]');\n const offsetXInput = textboxEl.querySelector('[data-input=\"offsetX\"]');\n const textbox = (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).getById(textboxId);\n if (!textbox) return;\n const textboxData = textbox.getData();\n direction = direction.toLowerCase();\n switch(direction){\n case \"up\":\n textboxData.offsetY -= 1;\n offsetYInput.value = textboxData.offsetY;\n break;\n case \"down\":\n textboxData.offsetY += 1;\n offsetYInput.value = textboxData.offsetY;\n break;\n case \"left\":\n textboxData.offsetX -= 1;\n offsetXInput.value = textboxData.offsetX;\n break;\n case \"right\":\n textboxData.offsetX += 1;\n offsetXInput.value = textboxData.offsetX;\n break;\n }\n $44ae6d9db4eaca0f$var$canvas.draw($44ae6d9db4eaca0f$var$selectedImage, (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).getAll());\n $44ae6d9db4eaca0f$var$reqAnimFrame = requestAnimationFrame($44ae6d9db4eaca0f$var$moveTextUsingArrowbuttons(textboxId, direction));\n };\nconst $44ae6d9db4eaca0f$var$handleUploadMethodChange = (evt)=>{\n $44ae6d9db4eaca0f$var$uploadMethodEls.forEach((el)=>el.hidden = el.id !== evt.target.value);\n $44ae6d9db4eaca0f$var$maxImageDimensionsForm.hidden = evt.target.value === \"solidColorForm\";\n};\nconst $44ae6d9db4eaca0f$var$handleFileSelectClick = ()=>{\n if (typeof $44ae6d9db4eaca0f$var$dropzoneEl.openFileDialog === \"function\") $44ae6d9db4eaca0f$var$dropzoneEl.openFileDialog();\n};\nconst $44ae6d9db4eaca0f$var$handleDropFilesAccepted = (evt)=>{\n const [file] = evt.detail.acceptedFiles;\n if (file) $44ae6d9db4eaca0f$var$handleFileSelect(file);\n};\nconst $44ae6d9db4eaca0f$var$handleTextboxesContainerInput = (evt)=>{\n const element = evt.target;\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n let prop;\n if (element.matches('[data-input=\"text\"]')) prop = \"text\";\n else if (element.matches('[data-input=\"fillColor\"]')) prop = \"fillColor\";\n else if (element.matches('[data-input=\"strokeColor\"]')) prop = \"strokeColor\";\n else if (element.matches('[data-input=\"font\"]')) prop = \"font\";\n else if (element.matches('[data-input=\"fontSize\"]')) prop = \"fontSize\";\n else if (element.matches('[data-input=\"fontWeight\"]')) prop = \"fontWeight\";\n else if (element.matches('[data-input=\"textAlign\"]')) prop = \"textAlign\";\n else if (element.matches('[data-input=\"shadowBlur\"]')) prop = \"shadowBlur\";\n else if (element.matches('[data-input=\"offsetY\"]')) prop = \"offsetY\";\n else if (element.matches('[data-input=\"offsetX\"]')) prop = \"offsetX\";\n else if (element.matches('[data-input=\"rotate\"]')) prop = \"rotate\";\n else if (element.matches('[data-input=\"strokeWidth\"]')) prop = \"strokeWidth\";\n if (prop) $44ae6d9db4eaca0f$var$handleTextPropChange(element, textboxId, prop);\n};\nconst $44ae6d9db4eaca0f$var$handleTextboxesContainerChange = (evt)=>{\n const element = evt.target;\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n let prop;\n if (element.matches('[data-input=\"allCaps\"]')) prop = \"allCaps\";\n if (prop) $44ae6d9db4eaca0f$var$handleTextPropChange(element, textboxId, prop);\n};\nconst $44ae6d9db4eaca0f$var$handleTextboxesContainerClick = (evt)=>{\n const element = evt.target;\n if (element.matches('[data-button=\"settings\"]')) {\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n const textboxSettingsEl = textboxEl?.querySelector('[data-section=\"settings\"]');\n if (textboxSettingsEl) textboxSettingsEl.hidden = !textboxSettingsEl.hidden;\n }\n if (element.matches('[data-button=\"duplicate-text-box\"')) {\n const currentTextboxEl = element.closest('[data-section=\"textbox\"]');\n const currentTextboxData = (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).getById(currentTextboxEl.id);\n (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).create({\n ...currentTextboxData.data\n });\n }\n if (element.matches('[data-button=\"delete-text-box\"]')) {\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n const textboxToDelete = (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).getById(textboxId);\n if (textboxToDelete && textboxToDelete.data.text.trim()) {\n const textboxIdInput = $44ae6d9db4eaca0f$var$removeTextForm[\"textbox-id\"];\n if (textboxIdInput) {\n textboxIdInput.value = textboxId;\n $44ae6d9db4eaca0f$var$removeConfirmationModal.open = true;\n }\n } else (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).remove(textboxId);\n }\n};\nconst $44ae6d9db4eaca0f$var$handleTextRemoveFormSubmit = (evt)=>{\n evt.preventDefault();\n const textboxId = evt.target[\"textbox-id\"].value;\n if (textboxId) {\n (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).remove(textboxId);\n $44ae6d9db4eaca0f$var$removeConfirmationModal.open = false;\n }\n};\nconst $44ae6d9db4eaca0f$var$handleTextboxesContainerPointerdown = (evt)=>{\n const element = evt.target;\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n if (!textboxEl) return;\n if (element.matches('[data-action=\"move-text\"]')) $44ae6d9db4eaca0f$var$reqAnimFrame = requestAnimationFrame($44ae6d9db4eaca0f$var$moveTextUsingArrowbuttons(textboxEl.id, element.getAttribute(\"aria-label\")));\n};\nconst $44ae6d9db4eaca0f$var$handleTextboxesContainerPointerup = (evt)=>{\n const element = evt.target;\n if (element.matches('[data-action=\"move-text\"]')) {\n cancelAnimationFrame && cancelAnimationFrame($44ae6d9db4eaca0f$var$reqAnimFrame);\n $44ae6d9db4eaca0f$var$reqAnimFrame = null;\n }\n};\nconst $44ae6d9db4eaca0f$var$handleTextboxesContainerPointerout = (evt)=>{\n const element = evt.target;\n if (element.matches('[data-action=\"move-text\"]')) {\n cancelAnimationFrame && cancelAnimationFrame($44ae6d9db4eaca0f$var$reqAnimFrame);\n $44ae6d9db4eaca0f$var$reqAnimFrame = null;\n }\n};\nconst $44ae6d9db4eaca0f$var$handleTextboxesContainerKeyDown = (evt)=>{\n const element = evt.target;\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n if (element.matches('[data-action=\"move-text\"]')) {\n if (evt.key === \" \" || evt.key === \"Enter\") {\n $44ae6d9db4eaca0f$var$reqAnimFrame && cancelAnimationFrame($44ae6d9db4eaca0f$var$reqAnimFrame);\n $44ae6d9db4eaca0f$var$reqAnimFrame = requestAnimationFrame($44ae6d9db4eaca0f$var$moveTextUsingArrowbuttons(textboxEl.id, element.getAttribute(\"aria-label\")));\n }\n }\n};\nconst $44ae6d9db4eaca0f$var$handleTextboxesContainerKeyUp = (evt)=>{\n const element = evt.target;\n if (element.matches('[data-action=\"move-text\"]')) {\n if (evt.key === \" \" || evt.key === \"Enter\") {\n $44ae6d9db4eaca0f$var$reqAnimFrame && cancelAnimationFrame($44ae6d9db4eaca0f$var$reqAnimFrame);\n $44ae6d9db4eaca0f$var$reqAnimFrame = null;\n }\n }\n};\nconst $44ae6d9db4eaca0f$var$handleGalleryClick = async (evt)=>{\n const button = evt.target.closest(\"button\");\n if (!button) return;\n const img = button.querySelector(\"img\");\n try {\n const file = await (0, $c3d7e05a1ce34ed5$export$6539e087749cf9d3)({\n url: img.src\n }).catch((err)=>(0, $166cfb2484b08c80$export$af04143326425dbd)(err.message, \"danger\"));\n if (file) $44ae6d9db4eaca0f$var$handleFileSelect(file);\n } catch {\n (0, $166cfb2484b08c80$export$af04143326425dbd)(`Failed to load image: \"${img.alt}\".`, \"danger\");\n }\n};\nconst $44ae6d9db4eaca0f$var$handleGallerySearchInput = (evt)=>{\n const query = evt.target.value.toLowerCase().trim();\n const galleryItems = $44ae6d9db4eaca0f$var$galleryEl.querySelectorAll(\"button\");\n galleryItems.forEach((item)=>{\n const alt = (item.querySelector(\"img\").getAttribute(\"alt\") || \"\").toLowerCase();\n item.hidden = !alt.includes(query);\n });\n $44ae6d9db4eaca0f$var$galleryNoResultsEl.hidden = !!$44ae6d9db4eaca0f$var$galleryEl.querySelector(\"button:not([hidden])\");\n};\nconst $44ae6d9db4eaca0f$var$handleWebShareError = ()=>{\n $44ae6d9db4eaca0f$var$downloadModal.open = false;\n (0, $166cfb2484b08c80$export$af04143326425dbd)(\"There was an error while trying to share your meme.\", \"danger\");\n};\nconst $44ae6d9db4eaca0f$var$handleCapturePhotoError = (evt)=>{\n const error = evt.detail.error;\n let errorMessage = \"An error occurred while trying to capture photo.\";\n if (error instanceof Error && (error.name === \"NotAllowedError\" || error.name === \"NotFoundError\")) errorMessage += \" Make sure you have a camera connected and you have granted the appropriate permissions.\";\n (0, $166cfb2484b08c80$export$af04143326425dbd)(errorMessage, \"danger\");\n $44ae6d9db4eaca0f$var$videoModal.open = false;\n console.error(error);\n};\nconst $44ae6d9db4eaca0f$var$handleCapturePhotoSuccess = (evt)=>{\n $44ae6d9db4eaca0f$var$videoModal.open = false;\n const image = new Image();\n image.addEventListener(\"load\", $44ae6d9db4eaca0f$var$handleImageLoad);\n image.src = evt.detail.dataURI;\n};\nconst $44ae6d9db4eaca0f$var$handleModalOpen = (evt)=>{\n if (evt.target.id === \"videoModal\") {\n const capturePhotoComponent = $44ae6d9db4eaca0f$var$videoModal.querySelector(\"capture-photo\");\n if (capturePhotoComponent && typeof capturePhotoComponent.startVideoStream === \"function\") capturePhotoComponent.startVideoStream();\n }\n};\nconst $44ae6d9db4eaca0f$var$handleModalClose = (evt)=>{\n if (evt.target.id === \"videoModal\") {\n const capturePhotoComponent = $44ae6d9db4eaca0f$var$videoModal.querySelector(\"capture-photo\");\n if (capturePhotoComponent && typeof capturePhotoComponent.stopVideoStream === \"function\") capturePhotoComponent.stopVideoStream();\n }\n if (evt.target.id === \"removeConfirmationModal\") $44ae6d9db4eaca0f$var$removeTextForm.reset();\n};\nconst $44ae6d9db4eaca0f$var$handleEmojiPickerSelection = (evt)=>{\n const textboxEl = evt.target.closest('[data-section=\"textbox\"]');\n if (textboxEl) {\n const input = textboxEl.querySelector('[data-input=\"text\"]');\n const emoji = evt.detail.unicode;\n if (input) (0, $dec5faeb65064cfd$export$2e2bcd8739ae039)(input, emoji);\n }\n};\nconst $44ae6d9db4eaca0f$var$handleMaxImageDimensionsFormChange = (evt)=>{\n if (evt.target.matches('[name=\"maxImageDimensions\"]')) (0, $f0a2ccd611c71db8$export$ddcffe0146c8f882).set(\"maxImageDimensions\", evt.target.value);\n if (!$44ae6d9db4eaca0f$var$selectedImage || (0, $fbb55a96d78c7ba0$export$de75f46579dcf24)($44ae6d9db4eaca0f$var$selectedImage)) return;\n $44ae6d9db4eaca0f$var$setImageMaxDimensions($44ae6d9db4eaca0f$var$selectedImage);\n $44ae6d9db4eaca0f$var$canvas.draw($44ae6d9db4eaca0f$var$selectedImage, (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).getAll());\n};\nconst $44ae6d9db4eaca0f$var$handleTextboxCreate = (evt)=>{\n const textbox = evt.detail.textbox;\n const textboxEl = (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).createElement(textbox, $44ae6d9db4eaca0f$var$shouldFocusOnTextboxCreate);\n $44ae6d9db4eaca0f$var$shouldFocusOnTextboxCreate = true;\n $44ae6d9db4eaca0f$var$textboxesContainer.appendChild(textboxEl);\n if (textbox.getData().text) $44ae6d9db4eaca0f$var$canvas.draw($44ae6d9db4eaca0f$var$selectedImage, (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).getAll());\n};\nconst $44ae6d9db4eaca0f$var$handleTextboxDelete = (evt)=>{\n const textboxEl = document.getElementById(evt.detail.id);\n textboxEl && textboxEl.remove();\n $44ae6d9db4eaca0f$var$textboxesContainer.querySelectorAll('[data-section=\"textbox\"]').forEach((el, idx)=>{\n el.querySelector('[data-input=\"text\"]').setAttribute(\"placeholder\", `Text #${idx + 1}`);\n });\n $44ae6d9db4eaca0f$var$canvas.draw($44ae6d9db4eaca0f$var$selectedImage, (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).getAll());\n};\nconst $44ae6d9db4eaca0f$var$handleClearCanvas = (evt)=>{\n if (!$44ae6d9db4eaca0f$var$selectedImage) return;\n evt.stopPropagation();\n $44ae6d9db4eaca0f$var$selectedImage = null;\n $44ae6d9db4eaca0f$var$dropzoneEl.classList.remove(\"dropzone--accepted\");\n $44ae6d9db4eaca0f$var$generateMemeBtn.disabled = true;\n $44ae6d9db4eaca0f$var$instructionsEl.hidden = false;\n $44ae6d9db4eaca0f$var$clearCanvasBtn.hidden = true;\n $44ae6d9db4eaca0f$var$dropzoneEl.disabled = false;\n $44ae6d9db4eaca0f$var$canvas.clear().hide();\n};\n$44ae6d9db4eaca0f$var$fileSelectBtn.addEventListener(\"click\", $44ae6d9db4eaca0f$var$handleFileSelectClick);\n$44ae6d9db4eaca0f$var$openVideoModalBtn.addEventListener(\"click\", $44ae6d9db4eaca0f$var$handleOpenVideoModalButtonClick);\n$44ae6d9db4eaca0f$var$addTextboxBtn.addEventListener(\"click\", $44ae6d9db4eaca0f$var$handleAddTextboxBtnClick);\n$44ae6d9db4eaca0f$var$generateMemeBtn.addEventListener(\"click\", $44ae6d9db4eaca0f$var$generateMeme);\n$44ae6d9db4eaca0f$var$downloadMemeBtn.addEventListener(\"click\", ()=>$44ae6d9db4eaca0f$var$downloadModal.open = false);\n$44ae6d9db4eaca0f$var$imageUrlForm.addEventListener(\"submit\", $44ae6d9db4eaca0f$var$handleImageUploadFromURL);\n$44ae6d9db4eaca0f$var$dropzoneEl.addEventListener(\"files-dropzone-drop-accepted\", $44ae6d9db4eaca0f$var$handleDropFilesAccepted);\n$44ae6d9db4eaca0f$var$textboxesContainer.addEventListener(\"input\", $44ae6d9db4eaca0f$var$handleTextboxesContainerInput);\n$44ae6d9db4eaca0f$var$textboxesContainer.addEventListener(\"change\", $44ae6d9db4eaca0f$var$handleTextboxesContainerChange);\n$44ae6d9db4eaca0f$var$textboxesContainer.addEventListener(\"click\", $44ae6d9db4eaca0f$var$handleTextboxesContainerClick);\n$44ae6d9db4eaca0f$var$textboxesContainer.addEventListener(\"pointerdown\", $44ae6d9db4eaca0f$var$handleTextboxesContainerPointerdown);\n$44ae6d9db4eaca0f$var$textboxesContainer.addEventListener(\"pointerup\", $44ae6d9db4eaca0f$var$handleTextboxesContainerPointerup);\n$44ae6d9db4eaca0f$var$textboxesContainer.addEventListener(\"pointerout\", $44ae6d9db4eaca0f$var$handleTextboxesContainerPointerout);\n$44ae6d9db4eaca0f$var$textboxesContainer.addEventListener(\"keydown\", $44ae6d9db4eaca0f$var$handleTextboxesContainerKeyDown);\n$44ae6d9db4eaca0f$var$textboxesContainer.addEventListener(\"keyup\", $44ae6d9db4eaca0f$var$handleTextboxesContainerKeyUp);\n$44ae6d9db4eaca0f$var$imageUploadMethodSelect.addEventListener(\"change\", $44ae6d9db4eaca0f$var$handleUploadMethodChange);\n$44ae6d9db4eaca0f$var$galleryEl.addEventListener(\"click\", $44ae6d9db4eaca0f$var$handleGalleryClick);\n$44ae6d9db4eaca0f$var$gallerySearchEl.addEventListener(\"input\", $44ae6d9db4eaca0f$var$handleGallerySearchInput);\n$44ae6d9db4eaca0f$var$solidColorForm.addEventListener(\"input\", $44ae6d9db4eaca0f$var$handleSolidColorFormInput);\ndocument.addEventListener(\"web-share:error\", $44ae6d9db4eaca0f$var$handleWebShareError);\ndocument.addEventListener(\"capture-photo:error\", $44ae6d9db4eaca0f$var$handleCapturePhotoError);\ndocument.addEventListener(\"capture-photo:success\", $44ae6d9db4eaca0f$var$handleCapturePhotoSuccess);\ndocument.addEventListener(\"me-open\", $44ae6d9db4eaca0f$var$handleModalOpen);\ndocument.addEventListener(\"me-close\", $44ae6d9db4eaca0f$var$handleModalClose);\ndocument.addEventListener(\"emoji-click\", $44ae6d9db4eaca0f$var$handleEmojiPickerSelection);\ndocument.addEventListener(\"textbox-create\", $44ae6d9db4eaca0f$var$handleTextboxCreate);\ndocument.addEventListener(\"textbox-remove\", $44ae6d9db4eaca0f$var$handleTextboxDelete);\n$44ae6d9db4eaca0f$var$removeTextForm.addEventListener(\"submit\", $44ae6d9db4eaca0f$var$handleTextRemoveFormSubmit);\n$44ae6d9db4eaca0f$var$maxImageDimensionsForm.addEventListener(\"change\", $44ae6d9db4eaca0f$var$handleMaxImageDimensionsFormChange);\n$44ae6d9db4eaca0f$var$clearCanvasBtn.addEventListener(\"click\", $44ae6d9db4eaca0f$var$handleClearCanvas);\n$44ae6d9db4eaca0f$var$galleryEl.querySelectorAll(\"button > img\")?.forEach((image)=>{\n image.setAttribute(\"title\", image.getAttribute(\"alt\"));\n});\n(0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).create();\n$44ae6d9db4eaca0f$var$dropzoneEl.accept = (0, $33dea9d9a6da4c9a$export$63e7bed68b07a85c);\n$44ae6d9db4eaca0f$var$renderAcceptedImageFormats((0, $33dea9d9a6da4c9a$export$63e7bed68b07a85c), $44ae6d9db4eaca0f$var$instructionsEl);\n(0, $055531bbd0af154c$export$6874249d87f2602a).forEach(({ name: name, path: path, style: style, weight: weight })=>{\n (0, $055531bbd0af154c$export$59eceaef0c7797b2)(name, path, {\n style: style,\n weight: weight\n });\n});\nif ($44ae6d9db4eaca0f$var$maxImageDimensionsFromStorage) $44ae6d9db4eaca0f$var$maxImageDimensionsSelect.value = $44ae6d9db4eaca0f$var$maxImageDimensionsFromStorage;\n$44ae6d9db4eaca0f$var$maxImageDimensionsSelect.disabled = false;\n\n})();\n//# sourceMappingURL=index.6d86f4dd.js.map\n","import 'emoji-picker-element';\nimport insertTextAtCursor from 'insert-text-at-cursor';\nimport { isWebShareSupported } from '@georapbox/web-share-element/dist/is-web-share-supported.js';\nimport '@georapbox/web-share-element/dist/web-share-defined.js';\nimport '@georapbox/capture-photo-element/dist/capture-photo-defined.js';\nimport '@georapbox/modal-element/dist/modal-element-defined.js';\nimport '@georapbox/files-dropzone-element/dist/files-dropzone-defined.js';\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport '../css/main.css';\nimport { ACCEPTED_MIME_TYPES } from './constants.js';\nimport { uid } from './utils/uid.js';\nimport { fileFromUrl } from './utils/file-from-url.js';\nimport { storage } from './utils/storage.js';\nimport { isSolidColorSelected } from './utils/is-solid-color-selected.js';\nimport { customFonts, loadCustomFont } from './custom-fonts.js';\nimport { toastAlert } from './toast-alert.js';\nimport { Textbox } from './textbox.js';\nimport { Canvas } from './canvas.js';\n\nconst canvas = Canvas.createInstance(document.getElementById('canvas'));\nconst videoModal = document.getElementById('videoModal');\nconst downloadModal = document.getElementById('downloadModal');\nconst dropzoneEl = document.querySelector('files-dropzone');\nconst instructionsEl = document.getElementById('instructions');\nconst imageUploadMethodSelect = document.getElementById('imageUploadMethodSelect');\nconst fileSelectBtn = document.getElementById('fileSelectBtn');\nconst imageUrlForm = document.getElementById('imageUrlForm');\nconst addTextboxBtn = document.getElementById('addTextboxBtn');\nconst textboxesContainer = document.getElementById('textboxesContainer');\nconst generateMemeBtn = document.getElementById('generateMemeBtn');\nconst openVideoModalBtn = document.getElementById('openVideoModalBtn');\nconst downloadMemeBtn = document.getElementById('downloadMemeBtn');\nconst downloadMemePreview = document.getElementById('downloadMemePreview');\nconst webShareComponent = document.querySelector('web-share');\nconst galleryEl = document.getElementById('gallery');\nconst gallerySearchEl = document.getElementById('gallerySearch');\nconst galleryNoResultsEl = galleryEl.querySelector('.gallery__no-results');\nconst solidColorForm = document.getElementById('solidColorForm');\nconst uploadMethodEls = document.querySelectorAll('.upload-method');\nconst removeConfirmationModal = document.getElementById('removeConfirmationModal');\nconst removeTextForm = document.getElementById('removeTextForm');\nconst maxImageDimensionsForm = document.getElementById('maxImageDimensionsForm');\nconst maxImageDimensionsSelect = maxImageDimensionsForm['maxImageDimensions'];\nconst clearCanvasBtn = document.getElementById('clearCanvasBtn');\nconst maxImageDimensionsFromStorage = storage.get('maxImageDimensions');\nlet shouldFocusOnTextboxCreate = false;\nlet selectedImage = null;\nlet reqAnimFrame = null;\n\nconst renderAcceptedImageFormats = (acceptedMimeTypes, rootEl) => {\n if (!rootEl) {\n return;\n }\n\n const extensions = acceptedMimeTypes.map(mimeType => mimeType.split('/')[1]);\n const str = `Supported image formats: ${extensions.join(', ')}`;\n const div = document.createElement('div');\n const small = document.createElement('small');\n\n small.textContent = str;\n div.appendChild(small);\n rootEl.appendChild(small);\n};\n\nconst generateMeme = async () => {\n const dataUrl = canvas.toDataURL('image/png');\n const filename = `${uid('meme')}.png`;\n\n // Prepare download link\n const downloadLink = dataUrl.replace('image/png', 'image/octet-stream');\n downloadMemeBtn.download = filename;\n downloadMemeBtn.href = downloadLink;\n downloadMemePreview.width = canvas.getDimensions().width;\n downloadMemePreview.height = canvas.getDimensions().height;\n downloadMemePreview.src = downloadLink;\n\n // Prepare for sharing file\n if (isWebShareSupported()) {\n try {\n const file = await fileFromUrl({\n url: dataUrl,\n filename,\n mimeType: 'image/png'\n }).catch(err => toastAlert(err.message, 'danger'));\n\n if (file && isWebShareSupported({ files: [file] })) {\n webShareComponent.shareFiles = [file];\n webShareComponent.hidden = false;\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n window.requestAnimationFrame(() => {\n downloadModal.open = true;\n });\n};\n\nconst setImageMaxDimensions = image => {\n const maxImageDimensionsSelect = maxImageDimensionsForm['maxImageDimensions'];\n const [maxWidthValue, maxHeightValue] = maxImageDimensionsSelect.value.split('x');\n const MAX_WIDTH = Number(maxWidthValue) || 800;\n const MAX_HEIGHT = Number(maxHeightValue) || 600;\n let width = image.width;\n let height = image.height;\n\n if (width > height) {\n if (width > MAX_WIDTH) {\n height *= MAX_WIDTH / width;\n width = MAX_WIDTH;\n }\n } else {\n if (height > MAX_HEIGHT) {\n width *= MAX_HEIGHT / height;\n height = MAX_HEIGHT;\n }\n }\n\n canvas.setDimensions({ width, height });\n};\n\nconst afterImageSelect = () => {\n canvas.draw(selectedImage, Textbox.getAll()).show();\n dropzoneEl.classList.add('dropzone--accepted');\n dropzoneEl.disabled = true;\n generateMemeBtn.disabled = false;\n instructionsEl.hidden = true;\n clearCanvasBtn.hidden = false;\n};\n\nconst handleImageLoad = evt => {\n selectedImage = evt.target;\n setImageMaxDimensions(selectedImage);\n afterImageSelect();\n};\n\nconst handleSolidColorFormInput = evt => {\n const DEFAULT_WIDTH = 800;\n const DEFAULT_HEIGHT = 600;\n\n if (evt.target === solidColorForm['canvasColor']) {\n selectedImage = evt.target.value;\n }\n\n if (isSolidColorSelected(selectedImage)) {\n canvas.setDimensions({\n width: Number(solidColorForm['canvasWidth'].value) || DEFAULT_WIDTH,\n height: Number(solidColorForm['canvasHeight'].value) || DEFAULT_HEIGHT\n });\n\n afterImageSelect();\n }\n};\n\nconst handleFileSelect = file => {\n if (!file) {\n return;\n }\n\n const image = new Image();\n const reader = new FileReader();\n\n reader.addEventListener('load', function (evt) {\n const data = evt.target.result;\n image.addEventListener('load', handleImageLoad);\n image.src = data;\n });\n\n reader.readAsDataURL(file);\n};\n\nconst handleOpenVideoModalButtonClick = () => {\n videoModal.open = true;\n};\n\nconst handleTextPropChange = (element, textboxId, prop) => {\n const textboxData = Textbox.getById(textboxId).getData();\n\n switch (element.type) {\n case 'checkbox':\n textboxData[prop] = element.checked;\n break;\n case 'number':\n textboxData[prop] = Number(element.value);\n break;\n default:\n textboxData[prop] = element.value;\n }\n\n canvas.draw(selectedImage, Textbox.getAll());\n};\n\nconst handleAddTextboxBtnClick = () => Textbox.create();\n\nconst handleImageUploadFromURL = async evt => {\n evt.preventDefault();\n\n const form = evt.target;\n const submitButton = form.querySelector('button[type=\"submit\"]');\n const imageUrl = form['imageUrl'].value;\n\n if (!imageUrl.trim()) {\n return;\n }\n\n submitButton.disabled = true;\n submitButton.querySelector('.spinner').hidden = false;\n submitButton.querySelector('.label').hidden = true;\n\n try {\n const file = await fileFromUrl({\n url: imageUrl\n }).catch(err => toastAlert(err.message, 'danger'));\n\n if (file) {\n handleFileSelect(file);\n }\n } catch {\n toastAlert(`Failed to load image from \"${imageUrl}\".`, 'danger');\n } finally {\n submitButton.disabled = false;\n submitButton.querySelector('.spinner').hidden = true;\n submitButton.querySelector('.label').hidden = false;\n }\n};\n\nconst moveTextUsingArrowbuttons = (textboxId, direction) => () => {\n const textboxEl = document.getElementById(textboxId);\n const offsetYInput = textboxEl.querySelector('[data-input=\"offsetY\"]');\n const offsetXInput = textboxEl.querySelector('[data-input=\"offsetX\"]');\n const textbox = Textbox.getById(textboxId);\n\n if (!textbox) {\n return;\n }\n\n const textboxData = textbox.getData();\n\n direction = direction.toLowerCase();\n\n switch (direction) {\n case 'up':\n textboxData.offsetY -= 1;\n offsetYInput.value = textboxData.offsetY;\n break;\n case 'down':\n textboxData.offsetY += 1;\n offsetYInput.value = textboxData.offsetY;\n break;\n case 'left':\n textboxData.offsetX -= 1;\n offsetXInput.value = textboxData.offsetX;\n break;\n case 'right':\n textboxData.offsetX += 1;\n offsetXInput.value = textboxData.offsetX;\n break;\n }\n\n canvas.draw(selectedImage, Textbox.getAll());\n\n reqAnimFrame = requestAnimationFrame(moveTextUsingArrowbuttons(textboxId, direction));\n};\n\nconst handleUploadMethodChange = evt => {\n uploadMethodEls.forEach(el => (el.hidden = el.id !== evt.target.value));\n maxImageDimensionsForm.hidden = evt.target.value === 'solidColorForm';\n};\n\nconst handleFileSelectClick = () => {\n if (typeof dropzoneEl.openFileDialog === 'function') {\n dropzoneEl.openFileDialog();\n }\n};\n\nconst handleDropFilesAccepted = evt => {\n const [file] = evt.detail.acceptedFiles;\n\n if (file) {\n handleFileSelect(file);\n }\n};\n\nconst handleTextboxesContainerInput = evt => {\n const element = evt.target;\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n let prop;\n\n if (element.matches('[data-input=\"text\"]')) {\n prop = 'text';\n } else if (element.matches('[data-input=\"fillColor\"]')) {\n prop = 'fillColor';\n } else if (element.matches('[data-input=\"strokeColor\"]')) {\n prop = 'strokeColor';\n } else if (element.matches('[data-input=\"font\"]')) {\n prop = 'font';\n } else if (element.matches('[data-input=\"fontSize\"]')) {\n prop = 'fontSize';\n } else if (element.matches('[data-input=\"fontWeight\"]')) {\n prop = 'fontWeight';\n } else if (element.matches('[data-input=\"textAlign\"]')) {\n prop = 'textAlign';\n } else if (element.matches('[data-input=\"shadowBlur\"]')) {\n prop = 'shadowBlur';\n } else if (element.matches('[data-input=\"offsetY\"]')) {\n prop = 'offsetY';\n } else if (element.matches('[data-input=\"offsetX\"]')) {\n prop = 'offsetX';\n } else if (element.matches('[data-input=\"rotate\"]')) {\n prop = 'rotate';\n } else if (element.matches('[data-input=\"strokeWidth\"]')) {\n prop = 'strokeWidth';\n }\n\n if (prop) {\n handleTextPropChange(element, textboxId, prop);\n }\n};\n\nconst handleTextboxesContainerChange = evt => {\n const element = evt.target;\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n let prop;\n\n if (element.matches('[data-input=\"allCaps\"]')) {\n prop = 'allCaps';\n }\n\n if (prop) {\n handleTextPropChange(element, textboxId, prop);\n }\n};\n\nconst handleTextboxesContainerClick = evt => {\n const element = evt.target;\n\n if (element.matches('[data-button=\"settings\"]')) {\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n const textboxSettingsEl = textboxEl?.querySelector('[data-section=\"settings\"]');\n\n if (textboxSettingsEl) {\n textboxSettingsEl.hidden = !textboxSettingsEl.hidden;\n }\n }\n\n if (element.matches('[data-button=\"duplicate-text-box\"')) {\n const currentTextboxEl = element.closest('[data-section=\"textbox\"]');\n const currentTextboxData = Textbox.getById(currentTextboxEl.id);\n Textbox.create({ ...currentTextboxData.data });\n }\n\n if (element.matches('[data-button=\"delete-text-box\"]')) {\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n const textboxToDelete = Textbox.getById(textboxId);\n\n if (textboxToDelete && textboxToDelete.data.text.trim()) {\n const textboxIdInput = removeTextForm['textbox-id'];\n\n if (textboxIdInput) {\n textboxIdInput.value = textboxId;\n removeConfirmationModal.open = true;\n }\n } else {\n Textbox.remove(textboxId);\n }\n }\n};\n\nconst handleTextRemoveFormSubmit = evt => {\n evt.preventDefault();\n const textboxId = evt.target['textbox-id'].value;\n\n if (textboxId) {\n Textbox.remove(textboxId);\n removeConfirmationModal.open = false;\n }\n};\n\nconst handleTextboxesContainerPointerdown = evt => {\n const element = evt.target;\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n\n if (!textboxEl) {\n return;\n }\n\n if (element.matches('[data-action=\"move-text\"]')) {\n reqAnimFrame = requestAnimationFrame(\n moveTextUsingArrowbuttons(textboxEl.id, element.getAttribute('aria-label'))\n );\n }\n};\n\nconst handleTextboxesContainerPointerup = evt => {\n const element = evt.target;\n\n if (element.matches('[data-action=\"move-text\"]')) {\n cancelAnimationFrame && cancelAnimationFrame(reqAnimFrame);\n reqAnimFrame = null;\n }\n};\n\nconst handleTextboxesContainerPointerout = evt => {\n const element = evt.target;\n\n if (element.matches('[data-action=\"move-text\"]')) {\n cancelAnimationFrame && cancelAnimationFrame(reqAnimFrame);\n reqAnimFrame = null;\n }\n};\n\nconst handleTextboxesContainerKeyDown = evt => {\n const element = evt.target;\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n\n if (element.matches('[data-action=\"move-text\"]')) {\n if (evt.key === ' ' || evt.key === 'Enter') {\n reqAnimFrame && cancelAnimationFrame(reqAnimFrame);\n reqAnimFrame = requestAnimationFrame(\n moveTextUsingArrowbuttons(textboxEl.id, element.getAttribute('aria-label'))\n );\n }\n }\n};\n\nconst handleTextboxesContainerKeyUp = evt => {\n const element = evt.target;\n\n if (element.matches('[data-action=\"move-text\"]')) {\n if (evt.key === ' ' || evt.key === 'Enter') {\n reqAnimFrame && cancelAnimationFrame(reqAnimFrame);\n reqAnimFrame = null;\n }\n }\n};\n\nconst handleGalleryClick = async evt => {\n const button = evt.target.closest('button');\n\n if (!button) {\n return;\n }\n\n const img = button.querySelector('img');\n\n try {\n const file = await fileFromUrl({\n url: img.src\n }).catch(err => toastAlert(err.message, 'danger'));\n\n if (file) {\n handleFileSelect(file);\n }\n } catch {\n toastAlert(`Failed to load image: \"${img.alt}\".`, 'danger');\n }\n};\n\nconst handleGallerySearchInput = evt => {\n const query = evt.target.value.toLowerCase().trim();\n const galleryItems = galleryEl.querySelectorAll('button');\n\n galleryItems.forEach(item => {\n const alt = (item.querySelector('img').getAttribute('alt') || '').toLowerCase();\n item.hidden = !alt.includes(query);\n });\n\n galleryNoResultsEl.hidden = !!galleryEl.querySelector('button:not([hidden])');\n};\n\nconst handleWebShareError = () => {\n downloadModal.open = false;\n toastAlert('There was an error while trying to share your meme.', 'danger');\n};\n\nconst handleCapturePhotoError = evt => {\n const error = evt.detail.error;\n let errorMessage = 'An error occurred while trying to capture photo.';\n\n if (\n error instanceof Error &&\n (error.name === 'NotAllowedError' || error.name === 'NotFoundError')\n ) {\n errorMessage +=\n ' Make sure you have a camera connected and you have granted the appropriate permissions.';\n }\n\n toastAlert(errorMessage, 'danger');\n videoModal.open = false;\n console.error(error);\n};\n\nconst handleCapturePhotoSuccess = evt => {\n videoModal.open = false;\n const image = new Image();\n image.addEventListener('load', handleImageLoad);\n image.src = evt.detail.dataURI;\n};\n\nconst handleModalOpen = evt => {\n if (evt.target.id === 'videoModal') {\n const capturePhotoComponent = videoModal.querySelector('capture-photo');\n\n if (capturePhotoComponent && typeof capturePhotoComponent.startVideoStream === 'function') {\n capturePhotoComponent.startVideoStream();\n }\n }\n};\n\nconst handleModalClose = evt => {\n if (evt.target.id === 'videoModal') {\n const capturePhotoComponent = videoModal.querySelector('capture-photo');\n\n if (capturePhotoComponent && typeof capturePhotoComponent.stopVideoStream === 'function') {\n capturePhotoComponent.stopVideoStream();\n }\n }\n\n if (evt.target.id === 'removeConfirmationModal') {\n removeTextForm.reset();\n }\n};\n\nconst handleEmojiPickerSelection = evt => {\n const textboxEl = evt.target.closest('[data-section=\"textbox\"]');\n\n if (textboxEl) {\n const input = textboxEl.querySelector('[data-input=\"text\"]');\n const emoji = evt.detail.unicode;\n\n if (input) {\n insertTextAtCursor(input, emoji);\n }\n }\n};\n\nconst handleMaxImageDimensionsFormChange = evt => {\n if (evt.target.matches('[name=\"maxImageDimensions\"]')) {\n storage.set('maxImageDimensions', evt.target.value);\n }\n\n if (!selectedImage || isSolidColorSelected(selectedImage)) {\n return;\n }\n\n setImageMaxDimensions(selectedImage);\n canvas.draw(selectedImage, Textbox.getAll());\n};\n\nconst handleTextboxCreate = evt => {\n const textbox = evt.detail.textbox;\n const textboxEl = Textbox.createElement(textbox, shouldFocusOnTextboxCreate);\n\n shouldFocusOnTextboxCreate = true;\n textboxesContainer.appendChild(textboxEl);\n\n if (textbox.getData().text) {\n canvas.draw(selectedImage, Textbox.getAll());\n }\n};\n\nconst handleTextboxDelete = evt => {\n const textboxEl = document.getElementById(evt.detail.id);\n textboxEl && textboxEl.remove();\n\n textboxesContainer.querySelectorAll('[data-section=\"textbox\"]').forEach((el, idx) => {\n el.querySelector('[data-input=\"text\"]').setAttribute('placeholder', `Text #${idx + 1}`);\n });\n\n canvas.draw(selectedImage, Textbox.getAll());\n};\n\nconst handleClearCanvas = evt => {\n if (!selectedImage) {\n return;\n }\n\n evt.stopPropagation();\n selectedImage = null;\n dropzoneEl.classList.remove('dropzone--accepted');\n generateMemeBtn.disabled = true;\n instructionsEl.hidden = false;\n clearCanvasBtn.hidden = true;\n dropzoneEl.disabled = false;\n canvas.clear().hide();\n};\n\nfileSelectBtn.addEventListener('click', handleFileSelectClick);\nopenVideoModalBtn.addEventListener('click', handleOpenVideoModalButtonClick);\naddTextboxBtn.addEventListener('click', handleAddTextboxBtnClick);\ngenerateMemeBtn.addEventListener('click', generateMeme);\ndownloadMemeBtn.addEventListener('click', () => (downloadModal.open = false));\nimageUrlForm.addEventListener('submit', handleImageUploadFromURL);\ndropzoneEl.addEventListener('files-dropzone-drop-accepted', handleDropFilesAccepted);\ntextboxesContainer.addEventListener('input', handleTextboxesContainerInput);\ntextboxesContainer.addEventListener('change', handleTextboxesContainerChange);\ntextboxesContainer.addEventListener('click', handleTextboxesContainerClick);\ntextboxesContainer.addEventListener('pointerdown', handleTextboxesContainerPointerdown);\ntextboxesContainer.addEventListener('pointerup', handleTextboxesContainerPointerup);\ntextboxesContainer.addEventListener('pointerout', handleTextboxesContainerPointerout);\ntextboxesContainer.addEventListener('keydown', handleTextboxesContainerKeyDown);\ntextboxesContainer.addEventListener('keyup', handleTextboxesContainerKeyUp);\nimageUploadMethodSelect.addEventListener('change', handleUploadMethodChange);\ngalleryEl.addEventListener('click', handleGalleryClick);\ngallerySearchEl.addEventListener('input', handleGallerySearchInput);\nsolidColorForm.addEventListener('input', handleSolidColorFormInput);\ndocument.addEventListener('web-share:error', handleWebShareError);\ndocument.addEventListener('capture-photo:error', handleCapturePhotoError);\ndocument.addEventListener('capture-photo:success', handleCapturePhotoSuccess);\ndocument.addEventListener('me-open', handleModalOpen);\ndocument.addEventListener('me-close', handleModalClose);\ndocument.addEventListener('emoji-click', handleEmojiPickerSelection);\ndocument.addEventListener('textbox-create', handleTextboxCreate);\ndocument.addEventListener('textbox-remove', handleTextboxDelete);\nremoveTextForm.addEventListener('submit', handleTextRemoveFormSubmit);\nmaxImageDimensionsForm.addEventListener('change', handleMaxImageDimensionsFormChange);\nclearCanvasBtn.addEventListener('click', handleClearCanvas);\n\ngalleryEl.querySelectorAll('button > img')?.forEach(image => {\n image.setAttribute('title', image.getAttribute('alt'));\n});\n\nTextbox.create();\n\ndropzoneEl.accept = ACCEPTED_MIME_TYPES;\n\nrenderAcceptedImageFormats(ACCEPTED_MIME_TYPES, instructionsEl);\n\ncustomFonts.forEach(({ name, path, style, weight }) => {\n loadCustomFont(name, path, { style, weight });\n});\n\nif (maxImageDimensionsFromStorage) {\n maxImageDimensionsSelect.value = maxImageDimensionsFromStorage;\n}\n\nmaxImageDimensionsSelect.disabled = false;\n","import Picker from './picker.js'\nimport Database from './database.js'\nexport { Picker, Database }\n","import Database from './database.js';\n\n// via https://unpkg.com/browse/emojibase-data@6.0.0/meta/groups.json\nconst allGroups = [\n [-1, '✨', 'custom'],\n [0, '😀', 'smileys-emotion'],\n [1, '👋', 'people-body'],\n [3, '🐱', 'animals-nature'],\n [4, '🍎', 'food-drink'],\n [5, '🏠️', 'travel-places'],\n [6, '⚽', 'activities'],\n [7, '📝', 'objects'],\n [8, '⛔️', 'symbols'],\n [9, '🏁', 'flags']\n].map(([id, emoji, name]) => ({ id, emoji, name }));\n\nconst groups = allGroups.slice(1);\n\nconst MIN_SEARCH_TEXT_LENGTH = 2;\nconst NUM_SKIN_TONES = 6;\n\n/* istanbul ignore next */\nconst rIC = typeof requestIdleCallback === 'function' ? requestIdleCallback : setTimeout;\n\n// check for ZWJ (zero width joiner) character\nfunction hasZwj (emoji) {\n return emoji.unicode.includes('\\u200d')\n}\n\n// Find one good representative emoji from each version to test by checking its color.\n// Ideally it should have color in the center. For some inspiration, see:\n// https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/\n//\n// Note that for certain versions (12.1, 13.1), there is no point in testing them explicitly, because\n// all the emoji from this version are compound-emoji from previous versions. So they would pass a color\n// test, even in browsers that display them as double emoji. (E.g. \"face in clouds\" might render as\n// \"face without mouth\" plus \"fog\".) These emoji can only be filtered using the width test,\n// which happens in checkZwjSupport.js.\nconst versionsAndTestEmoji = {\n '🫨': 15.1, // shaking head, technically from v15 but see note above\n '🫠': 14,\n '🥲': 13.1, // smiling face with tear, technically from v13 but see note above\n '🥻': 12.1, // sari, technically from v12 but see note above\n '🥰': 11,\n '🤩': 5,\n '👱‍♀️': 4,\n '🤣': 3,\n '👁️‍🗨️': 2,\n '😀': 1,\n '😐️': 0.7,\n '😃': 0.6\n};\n\nconst TIMEOUT_BEFORE_LOADING_MESSAGE = 1000; // 1 second\nconst DEFAULT_SKIN_TONE_EMOJI = '🖐️';\nconst DEFAULT_NUM_COLUMNS = 8;\n\n// Based on https://fivethirtyeight.com/features/the-100-most-used-emojis/ and\n// https://blog.emojipedia.org/facebook-reveals-most-and-least-used-emojis/ with\n// a bit of my own curation. (E.g. avoid the \"OK\" gesture because of connotations:\n// https://emojipedia.org/ok-hand/)\nconst MOST_COMMONLY_USED_EMOJI = [\n '😊',\n '😒',\n '❤️',\n '👍️',\n '😍',\n '😂',\n '😭',\n '☺️',\n '😔',\n '😩',\n '😏',\n '💕',\n '🙌',\n '😘'\n];\n\n// It's important to list Twemoji Mozilla before everything else, because Mozilla bundles their\n// own font on some platforms (notably Windows and Linux as of this writing). Typically, Mozilla\n// updates faster than the underlying OS, and we don't want to render older emoji in one font and\n// newer emoji in another font:\n// https://github.com/nolanlawson/emoji-picker-element/pull/268#issuecomment-1073347283\nconst FONT_FAMILY = '\"Twemoji Mozilla\",\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",' +\n '\"Noto Color Emoji\",\"EmojiOne Color\",\"Android Emoji\",sans-serif';\n\n/* istanbul ignore next */\nconst DEFAULT_CATEGORY_SORTING = (a, b) => a < b ? -1 : a > b ? 1 : 0;\n\n// Test if an emoji is supported by rendering it to canvas and checking that the color is not black\n// See https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/\n// and https://www.npmjs.com/package/if-emoji for inspiration\n// This implementation is largely borrowed from if-emoji, adding the font-family\n\n\nconst getTextFeature = (text, color) => {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = 1;\n\n const ctx = canvas.getContext('2d');\n ctx.textBaseline = 'top';\n ctx.font = `100px ${FONT_FAMILY}`;\n ctx.fillStyle = color;\n ctx.scale(0.01, 0.01);\n ctx.fillText(text, 0, 0);\n\n return ctx.getImageData(0, 0, 1, 1).data\n};\n\nconst compareFeatures = (feature1, feature2) => {\n const feature1Str = [...feature1].join(',');\n const feature2Str = [...feature2].join(',');\n // This is RGBA, so for 0,0,0, we are checking that the first RGB is not all zeroes.\n // Most of the time when unsupported this is 0,0,0,0, but on Chrome on Mac it is\n // 0,0,0,61 - there is a transparency here.\n return feature1Str === feature2Str && !feature1Str.startsWith('0,0,0,')\n};\n\nfunction testColorEmojiSupported (text) {\n // Render white and black and then compare them to each other and ensure they're the same\n // color, and neither one is black. This shows that the emoji was rendered in color.\n const feature1 = getTextFeature(text, '#000');\n const feature2 = getTextFeature(text, '#fff');\n return feature1 && feature2 && compareFeatures(feature1, feature2)\n}\n\n// rather than check every emoji ever, which would be expensive, just check some representatives from the\n// different emoji releases to determine what the font supports\n\nfunction determineEmojiSupportLevel () {\n const entries = Object.entries(versionsAndTestEmoji);\n try {\n // start with latest emoji and work backwards\n for (const [emoji, version] of entries) {\n if (testColorEmojiSupported(emoji)) {\n return version\n }\n }\n } catch (e) { // canvas error\n } finally {\n }\n // In case of an error, be generous and just assume all emoji are supported (e.g. for canvas errors\n // due to anti-fingerprinting add-ons). Better to show some gray boxes than nothing at all.\n return entries[0][1] // first one in the list is the most recent version\n}\n\n// Check which emojis we know for sure aren't supported, based on Unicode version level\nlet promise;\nconst detectEmojiSupportLevel = () => {\n if (!promise) {\n // Delay so it can run while the IDB database is being created by the browser (on another thread).\n // This helps especially with first load – we want to start pre-populating the database on the main thread,\n // and then wait for IDB to commit everything, and while waiting we run this check.\n promise = new Promise(resolve => (\n rIC(() => (\n resolve(determineEmojiSupportLevel()) // delay so ideally this can run while IDB is first populating\n ))\n ));\n }\n return promise\n};\n// determine which emojis containing ZWJ (zero width joiner) characters\n// are supported (rendered as one glyph) rather than unsupported (rendered as two or more glyphs)\nconst supportedZwjEmojis = new Map();\n\nconst VARIATION_SELECTOR = '\\ufe0f';\nconst SKINTONE_MODIFIER = '\\ud83c';\nconst ZWJ = '\\u200d';\nconst LIGHT_SKIN_TONE = 0x1F3FB;\nconst LIGHT_SKIN_TONE_MODIFIER = 0xdffb;\n\n// TODO: this is a naive implementation, we can improve it later\n// It's only used for the skintone picker, so as long as people don't customize with\n// really exotic emoji then it should work fine\nfunction applySkinTone (str, skinTone) {\n if (skinTone === 0) {\n return str\n }\n const zwjIndex = str.indexOf(ZWJ);\n if (zwjIndex !== -1) {\n return str.substring(0, zwjIndex) +\n String.fromCodePoint(LIGHT_SKIN_TONE + skinTone - 1) +\n str.substring(zwjIndex)\n }\n if (str.endsWith(VARIATION_SELECTOR)) {\n str = str.substring(0, str.length - 1);\n }\n return str + SKINTONE_MODIFIER + String.fromCodePoint(LIGHT_SKIN_TONE_MODIFIER + skinTone - 1)\n}\n\nfunction halt (event) {\n event.preventDefault();\n event.stopPropagation();\n}\n\n// Implementation left/right or up/down navigation, circling back when you\n// reach the start/end of the list\nfunction incrementOrDecrement (decrement, val, arr) {\n val += (decrement ? -1 : 1);\n if (val < 0) {\n val = arr.length - 1;\n } else if (val >= arr.length) {\n val = 0;\n }\n return val\n}\n\n// like lodash's uniqBy but much smaller\nfunction uniqBy (arr, func) {\n const set = new Set();\n const res = [];\n for (const item of arr) {\n const key = func(item);\n if (!set.has(key)) {\n set.add(key);\n res.push(item);\n }\n }\n return res\n}\n\n// We don't need all the data on every emoji, and there are specific things we need\n// for the UI, so build a \"view model\" from the emoji object we got from the database\n\nfunction summarizeEmojisForUI (emojis, emojiSupportLevel) {\n const toSimpleSkinsMap = skins => {\n const res = {};\n for (const skin of skins) {\n // ignore arrays like [1, 2] with multiple skin tones\n // also ignore variants that are in an unsupported emoji version\n // (these do exist - variants from a different version than their base emoji)\n if (typeof skin.tone === 'number' && skin.version <= emojiSupportLevel) {\n res[skin.tone] = skin.unicode;\n }\n }\n return res\n };\n\n return emojis.map(({ unicode, skins, shortcodes, url, name, category, annotation }) => ({\n unicode,\n name,\n shortcodes,\n url,\n category,\n annotation,\n id: unicode || name,\n skins: skins && toSimpleSkinsMap(skins)\n }))\n}\n\n// import rAF from one place so that the bundle size is a bit smaller\nconst rAF = requestAnimationFrame;\n\n// Svelte action to calculate the width of an element and auto-update\n// using ResizeObserver. If ResizeObserver is unsupported, we just use rAF once\n// and don't bother to update.\n\n\nlet resizeObserverSupported = typeof ResizeObserver === 'function';\n\nfunction calculateWidth (node, abortSignal, onUpdate) {\n let resizeObserver;\n if (resizeObserverSupported) {\n resizeObserver = new ResizeObserver(entries => (\n onUpdate(entries[0].contentRect.width)\n ));\n resizeObserver.observe(node);\n } else { // just set the width once, don't bother trying to track it\n rAF(() => (\n onUpdate(node.getBoundingClientRect().width)\n ));\n }\n\n // cleanup function (called on destroy)\n abortSignal.addEventListener('abort', () => {\n if (resizeObserver) {\n resizeObserver.disconnect();\n }\n });\n}\n\n// get the width of the text inside of a DOM node, via https://stackoverflow.com/a/59525891/680742\nfunction calculateTextWidth (node) {\n /* istanbul ignore else */\n {\n const range = document.createRange();\n range.selectNode(node.firstChild);\n return range.getBoundingClientRect().width\n }\n}\n\nlet baselineEmojiWidth;\n\nfunction checkZwjSupport (zwjEmojisToCheck, baselineEmoji, emojiToDomNode) {\n for (const emoji of zwjEmojisToCheck) {\n const domNode = emojiToDomNode(emoji);\n const emojiWidth = calculateTextWidth(domNode);\n if (typeof baselineEmojiWidth === 'undefined') { // calculate the baseline emoji width only once\n baselineEmojiWidth = calculateTextWidth(baselineEmoji);\n }\n // On Windows, some supported emoji are ~50% bigger than the baseline emoji, but what we really want to guard\n // against are the ones that are 2x the size, because those are truly broken (person with red hair = person with\n // floating red wig, black cat = cat with black square, polar bear = bear with snowflake, etc.)\n // So here we set the threshold at 1.8 times the size of the baseline emoji.\n const supported = emojiWidth / 1.8 < baselineEmojiWidth;\n supportedZwjEmojis.set(emoji.unicode, supported);\n }\n}\n\n// like lodash's uniq\n\nfunction uniq (arr) {\n return uniqBy(arr, _ => _)\n}\n\n// Note we put this in its own function outside Picker.js to avoid Svelte doing an invalidation on the \"setter\" here.\n// At best the invalidation is useless, at worst it can cause infinite loops:\n// https://github.com/nolanlawson/emoji-picker-element/pull/180\n// https://github.com/sveltejs/svelte/issues/6521\n// Also note tabpanelElement can be null if the element is disconnected immediately after connected\nfunction resetScrollTopIfPossible (element) {\n /* istanbul ignore else */\n if (element) { // Makes me nervous not to have this `if` guard\n element.scrollTop = 0;\n }\n}\n\nfunction getFromMap (cache, key, func) {\n let cached = cache.get(key);\n if (!cached) {\n cached = func();\n cache.set(key, cached);\n }\n return cached\n}\n\nfunction toString (value) {\n return '' + value\n}\n\nfunction parseTemplate (htmlString) {\n const template = document.createElement('template');\n template.innerHTML = htmlString;\n return template\n}\n\nconst parseCache = new WeakMap();\nconst domInstancesCache = new WeakMap();\n// This needs to be a symbol because it needs to be different from any possible output of a key function\nconst unkeyedSymbol = Symbol('un-keyed');\n\n// Not supported in Safari <=13\nconst hasReplaceChildren = 'replaceChildren' in Element.prototype;\nfunction replaceChildren (parentNode, newChildren) {\n /* istanbul ignore else */\n if (hasReplaceChildren) {\n parentNode.replaceChildren(...newChildren);\n } else { // minimal polyfill for Element.prototype.replaceChildren\n parentNode.innerHTML = '';\n parentNode.append(...newChildren);\n }\n}\n\nfunction doChildrenNeedRerender (parentNode, newChildren) {\n let oldChild = parentNode.firstChild;\n let oldChildrenCount = 0;\n // iterate using firstChild/nextSibling because browsers use a linked list under the hood\n while (oldChild) {\n const newChild = newChildren[oldChildrenCount];\n // check if the old child and new child are the same\n if (newChild !== oldChild) {\n return true\n }\n oldChild = oldChild.nextSibling;\n oldChildrenCount++;\n }\n // if new children length is different from old, we must re-render\n return oldChildrenCount !== newChildren.length\n}\n\nfunction patchChildren (newChildren, instanceBinding) {\n const { targetNode } = instanceBinding;\n let { targetParentNode } = instanceBinding;\n\n let needsRerender = false;\n\n if (targetParentNode) { // already rendered once\n needsRerender = doChildrenNeedRerender(targetParentNode, newChildren);\n } else { // first render of list\n needsRerender = true;\n instanceBinding.targetNode = undefined; // placeholder node not needed anymore, free memory\n instanceBinding.targetParentNode = targetParentNode = targetNode.parentNode;\n }\n // avoid re-rendering list if the dom nodes are exactly the same before and after\n if (needsRerender) {\n replaceChildren(targetParentNode, newChildren);\n }\n}\n\nfunction patch (expressions, instanceBindings) {\n for (const instanceBinding of instanceBindings) {\n const {\n targetNode,\n currentExpression,\n binding: {\n expressionIndex,\n attributeName,\n attributeValuePre,\n attributeValuePost\n }\n } = instanceBinding;\n\n const expression = expressions[expressionIndex];\n\n if (currentExpression === expression) {\n // no need to update, same as before\n continue\n }\n\n instanceBinding.currentExpression = expression;\n\n if (attributeName) { // attribute replacement\n targetNode.setAttribute(attributeName, attributeValuePre + toString(expression) + attributeValuePost);\n } else { // text node / child element / children replacement\n let newNode;\n if (Array.isArray(expression)) { // array of DOM elements produced by tag template literals\n patchChildren(expression, instanceBinding);\n } else if (expression instanceof Element) { // html tag template returning a DOM element\n newNode = expression;\n targetNode.replaceWith(newNode);\n } else { // primitive - string, number, etc\n // nodeValue is faster than textContent supposedly https://www.youtube.com/watch?v=LY6y3HbDVmg\n // note we may be replacing the value in a placeholder text node\n targetNode.nodeValue = toString(expression);\n }\n if (newNode) {\n instanceBinding.targetNode = newNode;\n }\n }\n }\n}\n\nfunction parse (tokens) {\n let htmlString = '';\n\n let withinTag = false;\n let withinAttribute = false;\n let elementIndexCounter = -1; // depth-first traversal order\n\n const elementsToBindings = new Map();\n const elementIndexes = [];\n\n for (let i = 0, len = tokens.length; i < len; i++) {\n const token = tokens[i];\n htmlString += token;\n\n if (i === len - 1) {\n break // no need to process characters - no more expressions to be found\n }\n\n for (let j = 0; j < token.length; j++) {\n const char = token.charAt(j);\n switch (char) {\n case '<': {\n const nextChar = token.charAt(j + 1);\n if (nextChar === '/') { // closing tag\n // leaving an element\n elementIndexes.pop();\n } else { // not a closing tag\n withinTag = true;\n elementIndexes.push(++elementIndexCounter);\n }\n break\n }\n case '>': {\n withinTag = false;\n withinAttribute = false;\n break\n }\n case '=': {\n withinAttribute = true;\n break\n }\n }\n }\n\n const elementIndex = elementIndexes[elementIndexes.length - 1];\n const bindings = getFromMap(elementsToBindings, elementIndex, () => []);\n\n let attributeName;\n let attributeValuePre;\n let attributeValuePost;\n if (withinAttribute) {\n // I never use single-quotes for attribute values in HTML, so just support double-quotes or no-quotes\n const match = /(\\S+)=\"?([^\"=]*)$/.exec(token);\n attributeName = match[1];\n attributeValuePre = match[2];\n attributeValuePost = /^[^\">]*/.exec(tokens[i + 1])[0];\n }\n\n const binding = {\n attributeName,\n attributeValuePre,\n attributeValuePost,\n expressionIndex: i\n };\n\n bindings.push(binding);\n\n if (!withinTag && !withinAttribute) {\n // Add a placeholder text node, so we can find it later. Note we only support one dynamic child text node\n htmlString += ' ';\n }\n }\n\n const template = parseTemplate(htmlString);\n\n return {\n template,\n elementsToBindings\n }\n}\n\nfunction traverseAndSetupBindings (dom, elementsToBindings) {\n const instanceBindings = [];\n // traverse dom\n const treeWalker = document.createTreeWalker(dom, NodeFilter.SHOW_ELEMENT);\n\n let element = dom;\n let elementIndex = -1;\n do {\n const bindings = elementsToBindings.get(++elementIndex);\n if (bindings) {\n for (let i = 0; i < bindings.length; i++) {\n const binding = bindings[i];\n\n const targetNode = binding.attributeName\n ? element // attribute binding, just use the element itself\n : element.firstChild; // not an attribute binding, so has a placeholder text node\n\n const instanceBinding = {\n binding,\n targetNode,\n targetParentNode: undefined,\n currentExpression: undefined\n };\n\n instanceBindings.push(instanceBinding);\n }\n }\n } while ((element = treeWalker.nextNode()))\n\n return instanceBindings\n}\n\nfunction parseHtml (tokens) {\n // All templates and bound expressions are unique per tokens array\n const { template, elementsToBindings } = getFromMap(parseCache, tokens, () => parse(tokens));\n\n // When we parseHtml, we always return a fresh DOM instance ready to be updated\n const dom = template.cloneNode(true).content.firstElementChild;\n const instanceBindings = traverseAndSetupBindings(dom, elementsToBindings);\n\n return function updateDomInstance (expressions) {\n patch(expressions, instanceBindings);\n return dom\n }\n}\n\nfunction createFramework (state) {\n const domInstances = getFromMap(domInstancesCache, state, () => new Map());\n let domInstanceCacheKey = unkeyedSymbol;\n\n function html (tokens, ...expressions) {\n // Each unique lexical usage of map() is considered unique due to the html`` tagged template call it makes,\n // which has lexically unique tokens. The unkeyed symbol is just used for html`` usage outside of a map().\n const domInstancesForTokens = getFromMap(domInstances, tokens, () => new Map());\n const updateDomInstance = getFromMap(domInstancesForTokens, domInstanceCacheKey, () => parseHtml(tokens));\n\n return updateDomInstance(expressions) // update with expressions\n }\n\n function map (array, callback, keyFunction) {\n return array.map((item, index) => {\n const originalCacheKey = domInstanceCacheKey;\n domInstanceCacheKey = keyFunction(item);\n try {\n return callback(item, index)\n } finally {\n domInstanceCacheKey = originalCacheKey;\n }\n })\n }\n\n return { map, html }\n}\n\nfunction render (container, state, helpers, events, actions, refs, abortSignal, firstRender) {\n const { labelWithSkin, titleForEmoji, unicodeWithSkin } = helpers;\n const { html, map } = createFramework(state);\n\n function emojiList (emojis, searchMode, prefix) {\n return map(emojis, (emoji, i) => {\n return html``\n // It's important for the cache key to be unique based on the prefix, because the framework caches based on the\n // unique tokens + cache key, and the same emoji may be used in the tab as well as in the fav bar\n }, emoji => `${prefix}-${emoji.id}`)\n }\n\n const section = () => {\n return html`
${state.i18n.searchDescription}
${state.i18n.skinToneDescription}
${\n map(state.skinTones, (skinTone, i) => {\n return html`
${skinTone}
`\n }, skinTone => skinTone)\n }
${\n map(state.groups, (group) => {\n return html``\n }, group => group.id)\n }
${state.message}
${\n map(state.currentEmojisWithCategories, (emojiWithCategory, i) => {\n return html`
${\n state.searchMode\n ? state.i18n.searchResultsLabel\n : (\n emojiWithCategory.category\n ? emojiWithCategory.category\n : (\n state.currentEmojisWithCategories.length > 1\n ? state.i18n.categories.custom\n : state.i18n.categories[state.currentGroup.name]\n )\n )\n }
${\n emojiList(emojiWithCategory.emojis, state.searchMode, /* prefix */ 'emo')\n }
`\n }, emojiWithCategory => emojiWithCategory.category)\n }
${\n emojiList(state.currentFavorites, /* searchMode */ false, /* prefix */ 'fav')\n }
`\n };\n\n const rootDom = section();\n\n if (firstRender) { // not a re-render\n container.appendChild(rootDom);\n\n // we only bind events/refs/actions once - there is no need to find them again given this component structure\n\n // helper for traversing the dom, finding elements by an attribute, and getting the attribute value\n const forElementWithAttribute = (attributeName, callback) => {\n for (const element of container.querySelectorAll(`[${attributeName}]`)) {\n callback(element, element.getAttribute(attributeName));\n }\n };\n\n // bind events\n for (const eventName of ['click', 'focusout', 'input', 'keydown', 'keyup']) {\n forElementWithAttribute(`data-on-${eventName}`, (element, listenerName) => {\n element.addEventListener(eventName, events[listenerName]);\n });\n }\n\n // find refs\n forElementWithAttribute('data-ref', (element, ref) => {\n refs[ref] = element;\n });\n\n // set up actions\n forElementWithAttribute('data-action', (element, action) => {\n actions[action](element);\n });\n\n // destroy/abort logic\n abortSignal.addEventListener('abort', () => {\n container.removeChild(rootDom);\n });\n }\n}\n\n/* istanbul ignore next */\nconst qM = typeof queueMicrotask === 'function' ? queueMicrotask : callback => Promise.resolve().then(callback);\n\nfunction createState (abortSignal) {\n let destroyed = false;\n let currentObserver;\n\n const propsToObservers = new Map();\n const dirtyObservers = new Set();\n\n let queued;\n\n const flush = () => {\n if (destroyed) {\n return\n }\n const observersToRun = [...dirtyObservers];\n dirtyObservers.clear(); // clear before running to force any new updates to run in another tick of the loop\n try {\n for (const observer of observersToRun) {\n observer();\n }\n } finally {\n queued = false;\n if (dirtyObservers.size) { // new updates, queue another one\n queued = true;\n qM(flush);\n }\n }\n };\n\n const state = new Proxy({}, {\n get (target, prop) {\n if (currentObserver) {\n let observers = propsToObservers.get(prop);\n if (!observers) {\n observers = new Set();\n propsToObservers.set(prop, observers);\n }\n observers.add(currentObserver);\n }\n return target[prop]\n },\n set (target, prop, newValue) {\n target[prop] = newValue;\n const observers = propsToObservers.get(prop);\n if (observers) {\n for (const observer of observers) {\n dirtyObservers.add(observer);\n }\n if (!queued) {\n queued = true;\n qM(flush);\n }\n }\n return true\n }\n });\n\n const createEffect = (callback) => {\n const runnable = () => {\n const oldObserver = currentObserver;\n currentObserver = runnable;\n try {\n return callback()\n } finally {\n currentObserver = oldObserver;\n }\n };\n return runnable()\n };\n\n // destroy logic\n abortSignal.addEventListener('abort', () => {\n destroyed = true;\n });\n\n return {\n state,\n createEffect\n }\n}\n\n// Compare two arrays, with a function called on each item in the two arrays that returns true if the items are equal\nfunction arraysAreEqualByFunction (left, right, areEqualFunc) {\n if (left.length !== right.length) {\n return false\n }\n for (let i = 0; i < left.length; i++) {\n if (!areEqualFunc(left[i], right[i])) {\n return false\n }\n }\n return true\n}\n\n/* eslint-disable prefer-const,no-labels,no-inner-declarations */\n\n// constants\nconst EMPTY_ARRAY = [];\n\nconst { assign } = Object;\n\nfunction createRoot (shadowRoot, props) {\n const refs = {};\n const abortController = new AbortController();\n const abortSignal = abortController.signal;\n const { state, createEffect } = createState(abortSignal);\n\n // initial state\n assign(state, {\n skinToneEmoji: undefined,\n i18n: undefined,\n database: undefined,\n customEmoji: undefined,\n customCategorySorting: undefined,\n emojiVersion: undefined\n });\n\n // public props\n assign(state, props);\n\n // private props\n assign(state, {\n initialLoad: true,\n currentEmojis: [],\n currentEmojisWithCategories: [],\n rawSearchText: '',\n searchText: '',\n searchMode: false,\n activeSearchItem: -1,\n message: undefined,\n skinTonePickerExpanded: false,\n skinTonePickerExpandedAfterAnimation: false,\n currentSkinTone: 0,\n activeSkinTone: 0,\n skinToneButtonText: undefined,\n pickerStyle: undefined,\n skinToneButtonLabel: '',\n skinTones: [],\n currentFavorites: [],\n defaultFavoriteEmojis: undefined,\n numColumns: DEFAULT_NUM_COLUMNS,\n isRtl: false,\n scrollbarWidth: 0,\n currentGroupIndex: 0,\n groups: groups,\n databaseLoaded: false,\n activeSearchItemId: undefined\n });\n\n //\n // Update the current group based on the currentGroupIndex\n //\n createEffect(() => {\n if (state.currentGroup !== state.groups[state.currentGroupIndex]) {\n state.currentGroup = state.groups[state.currentGroupIndex];\n }\n });\n\n //\n // Utils/helpers\n //\n\n const focus = id => {\n shadowRoot.getElementById(id).focus();\n };\n\n const emojiToDomNode = emoji => shadowRoot.getElementById(`emo-${emoji.id}`);\n\n // fire a custom event that crosses the shadow boundary\n const fireEvent = (name, detail) => {\n refs.rootElement.dispatchEvent(new CustomEvent(name, {\n detail,\n bubbles: true,\n composed: true\n }));\n };\n\n //\n // Comparison utils\n //\n\n const compareEmojiArrays = (a, b) => a.id === b.id;\n\n const compareCurrentEmojisWithCategories = (a, b) => {\n const { category: aCategory, emojis: aEmojis } = a;\n const { category: bCategory, emojis: bEmojis } = b;\n\n if (aCategory !== bCategory) {\n return false\n }\n\n return arraysAreEqualByFunction(aEmojis, bEmojis, compareEmojiArrays)\n };\n\n //\n // Update utils to avoid excessive re-renders\n //\n\n // avoid excessive re-renders by checking the value before setting\n const updateCurrentEmojis = (newEmojis) => {\n if (!arraysAreEqualByFunction(state.currentEmojis, newEmojis, compareEmojiArrays)) {\n state.currentEmojis = newEmojis;\n }\n };\n\n // avoid excessive re-renders\n const updateSearchMode = (newSearchMode) => {\n if (state.searchMode !== newSearchMode) {\n state.searchMode = newSearchMode;\n }\n };\n\n // avoid excessive re-renders\n const updateCurrentEmojisWithCategories = (newEmojisWithCategories) => {\n if (!arraysAreEqualByFunction(state.currentEmojisWithCategories, newEmojisWithCategories, compareCurrentEmojisWithCategories)) {\n state.currentEmojisWithCategories = newEmojisWithCategories;\n }\n };\n\n // Helpers used by PickerTemplate\n\n const unicodeWithSkin = (emoji, currentSkinTone) => (\n (currentSkinTone && emoji.skins && emoji.skins[currentSkinTone]) || emoji.unicode\n );\n\n const labelWithSkin = (emoji, currentSkinTone) => (\n uniq([\n (emoji.name || unicodeWithSkin(emoji, currentSkinTone)),\n emoji.annotation,\n ...(emoji.shortcodes || EMPTY_ARRAY)\n ].filter(Boolean)).join(', ')\n );\n\n const titleForEmoji = (emoji) => (\n emoji.annotation || (emoji.shortcodes || EMPTY_ARRAY).join(', ')\n );\n\n const helpers = {\n labelWithSkin, titleForEmoji, unicodeWithSkin\n };\n const events = {\n onClickSkinToneButton,\n onEmojiClick,\n onNavClick,\n onNavKeydown,\n onSearchKeydown,\n onSkinToneOptionsClick,\n onSkinToneOptionsFocusOut,\n onSkinToneOptionsKeydown,\n onSkinToneOptionsKeyup,\n onSearchInput\n };\n const actions = {\n calculateEmojiGridStyle\n };\n\n let firstRender = true;\n createEffect(() => {\n render(shadowRoot, state, helpers, events, actions, refs, abortSignal, firstRender);\n firstRender = false;\n });\n\n //\n // Determine the emoji support level (in requestIdleCallback)\n //\n\n // mount logic\n if (!state.emojiVersion) {\n detectEmojiSupportLevel().then(level => {\n // Can't actually test emoji support in Jest/Vitest/JSDom, emoji never render in color in Cairo\n /* istanbul ignore next */\n if (!level) {\n state.message = state.i18n.emojiUnsupportedMessage;\n }\n });\n }\n\n //\n // Set or update the database object\n //\n\n createEffect(() => {\n // show a Loading message if it takes a long time, or show an error if there's a network/IDB error\n async function handleDatabaseLoading () {\n let showingLoadingMessage = false;\n const timeoutHandle = setTimeout(() => {\n showingLoadingMessage = true;\n state.message = state.i18n.loadingMessage;\n }, TIMEOUT_BEFORE_LOADING_MESSAGE);\n try {\n await state.database.ready();\n state.databaseLoaded = true; // eslint-disable-line no-unused-vars\n } catch (err) {\n console.error(err);\n state.message = state.i18n.networkErrorMessage;\n } finally {\n clearTimeout(timeoutHandle);\n if (showingLoadingMessage) { // Seems safer than checking the i18n string, which may change\n showingLoadingMessage = false;\n state.message = ''; // eslint-disable-line no-unused-vars\n }\n }\n }\n\n if (state.database) {\n /* no await */\n handleDatabaseLoading();\n }\n });\n\n //\n // Global styles for the entire picker\n //\n\n createEffect(() => {\n state.pickerStyle = `\n --num-groups: ${state.groups.length}; \n --indicator-opacity: ${state.searchMode ? 0 : 1}; \n --num-skintones: ${NUM_SKIN_TONES};`;\n });\n\n //\n // Set or update the customEmoji\n //\n\n createEffect(() => {\n if (state.customEmoji && state.database) {\n updateCustomEmoji(); // re-run whenever customEmoji change\n }\n });\n\n createEffect(() => {\n if (state.customEmoji && state.customEmoji.length) {\n if (state.groups !== allGroups) { // don't update unnecessarily\n state.groups = allGroups;\n }\n } else if (state.groups !== groups) {\n if (state.currentGroupIndex) {\n // If the current group is anything other than \"custom\" (which is first), decrement.\n // This fixes the odd case where you set customEmoji, then pick a category, then unset customEmoji\n state.currentGroupIndex--;\n }\n state.groups = groups;\n }\n });\n\n //\n // Set or update the preferred skin tone\n //\n\n createEffect(() => {\n async function updatePreferredSkinTone () {\n if (state.databaseLoaded) {\n state.currentSkinTone = await state.database.getPreferredSkinTone();\n }\n }\n\n /* no await */ updatePreferredSkinTone();\n });\n\n createEffect(() => {\n state.skinTones = Array(NUM_SKIN_TONES).fill().map((_, i) => applySkinTone(state.skinToneEmoji, i));\n });\n\n createEffect(() => {\n state.skinToneButtonText = state.skinTones[state.currentSkinTone];\n });\n\n createEffect(() => {\n state.skinToneButtonLabel = state.i18n.skinToneLabel.replace('{skinTone}', state.i18n.skinTones[state.currentSkinTone]);\n });\n\n //\n // Set or update the favorites emojis\n //\n\n createEffect(() => {\n async function updateDefaultFavoriteEmojis () {\n const { database } = state;\n const favs = (await Promise.all(MOST_COMMONLY_USED_EMOJI.map(unicode => (\n database.getEmojiByUnicodeOrName(unicode)\n )))).filter(Boolean); // filter because in Jest/Vitest tests we don't have all the emoji in the DB\n state.defaultFavoriteEmojis = favs;\n }\n\n if (state.databaseLoaded) {\n /* no await */ updateDefaultFavoriteEmojis();\n }\n });\n\n function updateCustomEmoji () {\n // Certain effects have an implicit dependency on customEmoji since it affects the database\n // Getting it here on the state ensures this effect re-runs when customEmoji change.\n // Setting it on the database is pointless but prevents this code from being removed by a minifier.\n state.database.customEmoji = state.customEmoji || EMPTY_ARRAY;\n }\n\n createEffect(() => {\n async function updateFavorites () {\n updateCustomEmoji(); // re-run whenever customEmoji change\n const { database, defaultFavoriteEmojis, numColumns } = state;\n const dbFavorites = await database.getTopFavoriteEmoji(numColumns);\n const favorites = await summarizeEmojis(uniqBy([\n ...dbFavorites,\n ...defaultFavoriteEmojis\n ], _ => (_.unicode || _.name)).slice(0, numColumns));\n state.currentFavorites = favorites;\n }\n\n if (state.databaseLoaded && state.defaultFavoriteEmojis) {\n /* no await */ updateFavorites();\n }\n });\n\n //\n // Calculate the width of the emoji grid. This serves two purposes:\n // 1) Re-calculate the --num-columns var because it may have changed\n // 2) Re-calculate the scrollbar width because it may have changed\n // (i.e. because the number of items changed)\n // 3) Re-calculate whether we're in RTL mode or not.\n //\n // The benefit of doing this in one place is to align with rAF/ResizeObserver\n // and do all the calculations in one go. RTL vs LTR is not strictly width-related,\n // but since we're already reading the style here, and since it's already aligned with\n // the rAF loop, this is the most appropriate place to do it perf-wise.\n //\n\n function calculateEmojiGridStyle (node) {\n calculateWidth(node, abortSignal, width => {\n /* istanbul ignore next */\n { // jsdom throws errors for this kind of fancy stuff\n // read all the style/layout calculations we need to make\n const style = getComputedStyle(refs.rootElement);\n const newNumColumns = parseInt(style.getPropertyValue('--num-columns'), 10);\n const newIsRtl = style.getPropertyValue('direction') === 'rtl';\n const parentWidth = node.parentElement.getBoundingClientRect().width;\n const newScrollbarWidth = parentWidth - width;\n\n // write to state variables\n state.numColumns = newNumColumns;\n state.scrollbarWidth = newScrollbarWidth; // eslint-disable-line no-unused-vars\n state.isRtl = newIsRtl; // eslint-disable-line no-unused-vars\n }\n });\n }\n\n //\n // Set or update the currentEmojis. Check for invalid ZWJ renderings\n // (i.e. double emoji).\n //\n\n createEffect(() => {\n async function updateEmojis () {\n const { searchText, currentGroup, databaseLoaded, customEmoji } = state;\n if (!databaseLoaded) {\n state.currentEmojis = [];\n state.searchMode = false;\n } else if (searchText.length >= MIN_SEARCH_TEXT_LENGTH) {\n const newEmojis = await getEmojisBySearchQuery(searchText);\n if (state.searchText === searchText) { // if the situation changes asynchronously, do not update\n updateCurrentEmojis(newEmojis);\n updateSearchMode(true);\n }\n } else { // database is loaded and we're not in search mode, so we're in normal category mode\n const { id: currentGroupId } = currentGroup;\n // avoid race condition where currentGroupId is -1 and customEmoji is undefined/empty\n if (currentGroupId !== -1 || (customEmoji && customEmoji.length)) {\n const newEmojis = await getEmojisByGroup(currentGroupId);\n if (state.currentGroup.id === currentGroupId) { // if the situation changes asynchronously, do not update\n updateCurrentEmojis(newEmojis);\n updateSearchMode(false);\n }\n }\n }\n }\n\n /* no await */ updateEmojis();\n });\n\n // Some emojis have their ligatures rendered as two or more consecutive emojis\n // We want to treat these the same as unsupported emojis, so we compare their\n // widths against the baseline widths and remove them as necessary\n createEffect(() => {\n const { currentEmojis, emojiVersion } = state;\n const zwjEmojisToCheck = currentEmojis\n .filter(emoji => emoji.unicode) // filter custom emoji\n .filter(emoji => hasZwj(emoji) && !supportedZwjEmojis.has(emoji.unicode));\n if (!emojiVersion && zwjEmojisToCheck.length) {\n // render now, check their length later\n updateCurrentEmojis(currentEmojis);\n rAF(() => checkZwjSupportAndUpdate(zwjEmojisToCheck));\n } else {\n const newEmojis = emojiVersion ? currentEmojis : currentEmojis.filter(isZwjSupported);\n updateCurrentEmojis(newEmojis);\n // Reset scroll top to 0 when emojis change\n rAF(() => resetScrollTopIfPossible(refs.tabpanelElement));\n }\n });\n\n function checkZwjSupportAndUpdate (zwjEmojisToCheck) {\n checkZwjSupport(zwjEmojisToCheck, refs.baselineEmoji, emojiToDomNode);\n // force update\n // eslint-disable-next-line no-self-assign\n state.currentEmojis = state.currentEmojis;\n }\n\n function isZwjSupported (emoji) {\n return !emoji.unicode || !hasZwj(emoji) || supportedZwjEmojis.get(emoji.unicode)\n }\n\n async function filterEmojisByVersion (emojis) {\n const emojiSupportLevel = state.emojiVersion || await detectEmojiSupportLevel();\n // !version corresponds to custom emoji\n return emojis.filter(({ version }) => !version || version <= emojiSupportLevel)\n }\n\n async function summarizeEmojis (emojis) {\n return summarizeEmojisForUI(emojis, state.emojiVersion || await detectEmojiSupportLevel())\n }\n\n async function getEmojisByGroup (group) {\n // -1 is custom emoji\n const emoji = group === -1 ? state.customEmoji : await state.database.getEmojiByGroup(group);\n return summarizeEmojis(await filterEmojisByVersion(emoji))\n }\n\n async function getEmojisBySearchQuery (query) {\n return summarizeEmojis(await filterEmojisByVersion(await state.database.getEmojiBySearchQuery(query)))\n }\n\n createEffect(() => {\n });\n\n //\n // Derive currentEmojisWithCategories from currentEmojis. This is always done even if there\n // are no categories, because it's just easier to code the HTML this way.\n //\n\n createEffect(() => {\n function calculateCurrentEmojisWithCategories () {\n const { searchMode, currentEmojis } = state;\n if (searchMode) {\n return [\n {\n category: '',\n emojis: currentEmojis\n }\n ]\n }\n const categoriesToEmoji = new Map();\n for (const emoji of currentEmojis) {\n const category = emoji.category || '';\n let emojis = categoriesToEmoji.get(category);\n if (!emojis) {\n emojis = [];\n categoriesToEmoji.set(category, emojis);\n }\n emojis.push(emoji);\n }\n return [...categoriesToEmoji.entries()]\n .map(([category, emojis]) => ({ category, emojis }))\n .sort((a, b) => state.customCategorySorting(a.category, b.category))\n }\n\n const newEmojisWithCategories = calculateCurrentEmojisWithCategories();\n updateCurrentEmojisWithCategories(newEmojisWithCategories);\n });\n\n //\n // Handle active search item (i.e. pressing up or down while searching)\n //\n\n createEffect(() => {\n state.activeSearchItemId = state.activeSearchItem !== -1 && state.currentEmojis[state.activeSearchItem].id;\n });\n\n //\n // Handle user input on the search input\n //\n\n createEffect(() => {\n const { rawSearchText } = state;\n rIC(() => {\n state.searchText = (rawSearchText || '').trim(); // defer to avoid input delays, plus we can trim here\n state.activeSearchItem = -1;\n });\n });\n\n function onSearchKeydown (event) {\n if (!state.searchMode || !state.currentEmojis.length) {\n return\n }\n\n const goToNextOrPrevious = (previous) => {\n halt(event);\n state.activeSearchItem = incrementOrDecrement(previous, state.activeSearchItem, state.currentEmojis);\n };\n\n switch (event.key) {\n case 'ArrowDown':\n return goToNextOrPrevious(false)\n case 'ArrowUp':\n return goToNextOrPrevious(true)\n case 'Enter':\n if (state.activeSearchItem === -1) {\n // focus the first option in the list since the list must be non-empty at this point (it's verified above)\n state.activeSearchItem = 0;\n } else { // there is already an active search item\n halt(event);\n return clickEmoji(state.currentEmojis[state.activeSearchItem].id)\n }\n }\n }\n\n //\n // Handle user input on nav\n //\n\n function onNavClick (event) {\n const { target } = event;\n const closestTarget = target.closest('.nav-button');\n /* istanbul ignore if */\n if (!closestTarget) {\n return // This should never happen, but makes me nervous not to have it\n }\n const groupId = parseInt(closestTarget.dataset.groupId, 10);\n refs.searchElement.value = ''; // clear search box input\n state.rawSearchText = '';\n state.searchText = '';\n state.activeSearchItem = -1;\n state.currentGroupIndex = state.groups.findIndex(_ => _.id === groupId);\n }\n\n function onNavKeydown (event) {\n const { target, key } = event;\n\n const doFocus = el => {\n if (el) {\n halt(event);\n el.focus();\n }\n };\n\n switch (key) {\n case 'ArrowLeft':\n return doFocus(target.previousElementSibling)\n case 'ArrowRight':\n return doFocus(target.nextElementSibling)\n case 'Home':\n return doFocus(target.parentElement.firstElementChild)\n case 'End':\n return doFocus(target.parentElement.lastElementChild)\n }\n }\n\n //\n // Handle user input on an emoji\n //\n\n async function clickEmoji (unicodeOrName) {\n const emoji = await state.database.getEmojiByUnicodeOrName(unicodeOrName);\n const emojiSummary = [...state.currentEmojis, ...state.currentFavorites]\n .find(_ => (_.id === unicodeOrName));\n const skinTonedUnicode = emojiSummary.unicode && unicodeWithSkin(emojiSummary, state.currentSkinTone);\n await state.database.incrementFavoriteEmojiCount(unicodeOrName);\n fireEvent('emoji-click', {\n emoji,\n skinTone: state.currentSkinTone,\n ...(skinTonedUnicode && { unicode: skinTonedUnicode }),\n ...(emojiSummary.name && { name: emojiSummary.name })\n });\n }\n\n async function onEmojiClick (event) {\n const { target } = event;\n /* istanbul ignore if */\n if (!target.classList.contains('emoji')) {\n // This should never happen, but makes me nervous not to have it\n return\n }\n halt(event);\n const id = target.id.substring(4); // replace 'emo-' or 'fav-' prefix\n\n /* no await */ clickEmoji(id);\n }\n\n //\n // Handle user input on the skintone picker\n //\n\n function changeSkinTone (skinTone) {\n state.currentSkinTone = skinTone;\n state.skinTonePickerExpanded = false;\n focus('skintone-button');\n fireEvent('skin-tone-change', { skinTone });\n /* no await */ state.database.setPreferredSkinTone(skinTone);\n }\n\n function onSkinToneOptionsClick (event) {\n const { target: { id } } = event;\n const match = id && id.match(/^skintone-(\\d)/); // skintone option format\n /* istanbul ignore if */\n if (!match) { // not a skintone option\n return // This should never happen, but makes me nervous not to have it\n }\n halt(event);\n const skinTone = parseInt(match[1], 10); // remove 'skintone-' prefix\n changeSkinTone(skinTone);\n }\n\n function onClickSkinToneButton (event) {\n state.skinTonePickerExpanded = !state.skinTonePickerExpanded;\n state.activeSkinTone = state.currentSkinTone;\n // this should always be true, since the button is obscured by the listbox, so this `if` is just to be sure\n if (state.skinTonePickerExpanded) {\n halt(event);\n rAF(() => focus('skintone-list'));\n }\n }\n\n // To make the animation nicer, change the z-index of the skintone picker button\n // *after* the animation has played. This makes it appear that the picker box\n // is expanding \"below\" the button\n createEffect(() => {\n if (state.skinTonePickerExpanded) {\n refs.skinToneDropdown.addEventListener('transitionend', () => {\n state.skinTonePickerExpandedAfterAnimation = true; // eslint-disable-line no-unused-vars\n }, { once: true });\n } else {\n state.skinTonePickerExpandedAfterAnimation = false; // eslint-disable-line no-unused-vars\n }\n });\n\n function onSkinToneOptionsKeydown (event) {\n // this should never happen, but makes me nervous not to have it\n /* istanbul ignore if */\n if (!state.skinTonePickerExpanded) {\n return\n }\n const changeActiveSkinTone = async nextSkinTone => {\n halt(event);\n state.activeSkinTone = nextSkinTone;\n };\n\n switch (event.key) {\n case 'ArrowUp':\n return changeActiveSkinTone(incrementOrDecrement(true, state.activeSkinTone, state.skinTones))\n case 'ArrowDown':\n return changeActiveSkinTone(incrementOrDecrement(false, state.activeSkinTone, state.skinTones))\n case 'Home':\n return changeActiveSkinTone(0)\n case 'End':\n return changeActiveSkinTone(state.skinTones.length - 1)\n case 'Enter':\n // enter on keydown, space on keyup. this is just how browsers work for buttons\n // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html\n halt(event);\n return changeSkinTone(state.activeSkinTone)\n case 'Escape':\n halt(event);\n state.skinTonePickerExpanded = false;\n return focus('skintone-button')\n }\n }\n\n function onSkinToneOptionsKeyup (event) {\n // this should never happen, but makes me nervous not to have it\n /* istanbul ignore if */\n if (!state.skinTonePickerExpanded) {\n return\n }\n switch (event.key) {\n case ' ':\n // enter on keydown, space on keyup. this is just how browsers work for buttons\n // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html\n halt(event);\n return changeSkinTone(state.activeSkinTone)\n }\n }\n\n async function onSkinToneOptionsFocusOut (event) {\n // On blur outside of the skintone listbox, collapse the skintone picker.\n const { relatedTarget } = event;\n // The `else` should never happen, but makes me nervous not to have it\n /* istanbul ignore else */\n if (!relatedTarget || relatedTarget.id !== 'skintone-list') {\n state.skinTonePickerExpanded = false;\n }\n }\n\n function onSearchInput (event) {\n state.rawSearchText = event.target.value;\n }\n\n return {\n $set (newState) {\n assign(state, newState);\n },\n $destroy () {\n abortController.abort();\n }\n }\n}\n\nconst DEFAULT_DATA_SOURCE = 'https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json';\nconst DEFAULT_LOCALE = 'en';\n\nvar enI18n = {\n categoriesLabel: 'Categories',\n emojiUnsupportedMessage: 'Your browser does not support color emoji.',\n favoritesLabel: 'Favorites',\n loadingMessage: 'Loading…',\n networkErrorMessage: 'Could not load emoji.',\n regionLabel: 'Emoji picker',\n searchDescription: 'When search results are available, press up or down to select and enter to choose.',\n searchLabel: 'Search',\n searchResultsLabel: 'Search results',\n skinToneDescription: 'When expanded, press up or down to select and enter to choose.',\n skinToneLabel: 'Choose a skin tone (currently {skinTone})',\n skinTonesLabel: 'Skin tones',\n skinTones: [\n 'Default',\n 'Light',\n 'Medium-Light',\n 'Medium',\n 'Medium-Dark',\n 'Dark'\n ],\n categories: {\n custom: 'Custom',\n 'smileys-emotion': 'Smileys and emoticons',\n 'people-body': 'People and body',\n 'animals-nature': 'Animals and nature',\n 'food-drink': 'Food and drink',\n 'travel-places': 'Travel and places',\n activities: 'Activities',\n objects: 'Objects',\n symbols: 'Symbols',\n flags: 'Flags'\n }\n};\n\nvar baseStyles = \":host{--emoji-size:1.375rem;--emoji-padding:0.5rem;--category-emoji-size:var(--emoji-size);--category-emoji-padding:var(--emoji-padding);--indicator-height:3px;--input-border-radius:0.5rem;--input-border-size:1px;--input-font-size:1rem;--input-line-height:1.5;--input-padding:0.25rem;--num-columns:8;--outline-size:2px;--border-size:1px;--skintone-border-radius:1rem;--category-font-size:1rem;display:flex;width:min-content;height:400px}:host,:host(.light){color-scheme:light;--background:#fff;--border-color:#e0e0e0;--indicator-color:#385ac1;--input-border-color:#999;--input-font-color:#111;--input-placeholder-color:#999;--outline-color:#999;--category-font-color:#111;--button-active-background:#e6e6e6;--button-hover-background:#d9d9d9}:host(.dark){color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}@media (prefers-color-scheme:dark){:host{color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}}:host([hidden]){display:none}button{margin:0;padding:0;border:0;background:0 0;box-shadow:none;-webkit-tap-highlight-color:transparent}button::-moz-focus-inner{border:0}input{padding:0;margin:0;line-height:1.15;font-family:inherit}input[type=search]{-webkit-appearance:none}:focus{outline:var(--outline-color) solid var(--outline-size);outline-offset:calc(-1*var(--outline-size))}:host([data-js-focus-visible]) :focus:not([data-focus-visible-added]){outline:0}:focus:not(:focus-visible){outline:0}.hide-focus{outline:0}*{box-sizing:border-box}.picker{contain:content;display:flex;flex-direction:column;background:var(--background);border:var(--border-size) solid var(--border-color);width:100%;height:100%;overflow:hidden;--total-emoji-size:calc(var(--emoji-size) + (2 * var(--emoji-padding)));--total-category-emoji-size:calc(var(--category-emoji-size) + (2 * var(--category-emoji-padding)))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.hidden{opacity:0;pointer-events:none}.abs-pos{position:absolute;left:0;top:0}.gone{display:none!important}.skintone-button-wrapper,.skintone-list{background:var(--background);z-index:3}.skintone-button-wrapper.expanded{z-index:1}.skintone-list{position:absolute;inset-inline-end:0;top:0;z-index:2;overflow:visible;border-bottom:var(--border-size) solid var(--border-color);border-radius:0 0 var(--skintone-border-radius) var(--skintone-border-radius);will-change:transform;transition:transform .2s ease-in-out;transform-origin:center 0}@media (prefers-reduced-motion:reduce){.skintone-list{transition-duration:.001s}}@supports not (inset-inline-end:0){.skintone-list{right:0}}.skintone-list.no-animate{transition:none}.tabpanel{overflow-y:auto;-webkit-overflow-scrolling:touch;will-change:transform;min-height:0;flex:1;contain:content}.emoji-menu{display:grid;grid-template-columns:repeat(var(--num-columns),var(--total-emoji-size));justify-content:space-around;align-items:flex-start;width:100%}.category{padding:var(--emoji-padding);font-size:var(--category-font-size);color:var(--category-font-color)}.custom-emoji,.emoji,button.emoji{height:var(--total-emoji-size);width:var(--total-emoji-size)}.emoji,button.emoji{font-size:var(--emoji-size);display:flex;align-items:center;justify-content:center;border-radius:100%;line-height:1;overflow:hidden;font-family:var(--emoji-font-family);cursor:pointer}@media (hover:hover) and (pointer:fine){.emoji:hover,button.emoji:hover{background:var(--button-hover-background)}}.emoji.active,.emoji:active,button.emoji.active,button.emoji:active{background:var(--button-active-background)}.custom-emoji{padding:var(--emoji-padding);object-fit:contain;pointer-events:none;background-repeat:no-repeat;background-position:center center;background-size:var(--emoji-size) var(--emoji-size)}.nav,.nav-button{align-items:center}.nav{display:grid;justify-content:space-between;contain:content}.nav-button{display:flex;justify-content:center}.nav-emoji{font-size:var(--category-emoji-size);width:var(--total-category-emoji-size);height:var(--total-category-emoji-size)}.indicator-wrapper{display:flex;border-bottom:1px solid var(--border-color)}.indicator{width:calc(100%/var(--num-groups));height:var(--indicator-height);opacity:var(--indicator-opacity);background-color:var(--indicator-color);will-change:transform,opacity;transition:opacity .1s linear,transform .25s ease-in-out}@media (prefers-reduced-motion:reduce){.indicator{will-change:opacity;transition:opacity .1s linear}}.pad-top,input.search{background:var(--background);width:100%}.pad-top{height:var(--emoji-padding);z-index:3}.search-row{display:flex;align-items:center;position:relative;padding-inline-start:var(--emoji-padding);padding-bottom:var(--emoji-padding)}.search-wrapper{flex:1;min-width:0}input.search{padding:var(--input-padding);border-radius:var(--input-border-radius);border:var(--input-border-size) solid var(--input-border-color);color:var(--input-font-color);font-size:var(--input-font-size);line-height:var(--input-line-height)}input.search::placeholder{color:var(--input-placeholder-color)}.favorites{display:flex;flex-direction:row;border-top:var(--border-size) solid var(--border-color);contain:content}.message{padding:var(--emoji-padding)}\";\n\nconst PROPS = [\n 'customEmoji',\n 'customCategorySorting',\n 'database',\n 'dataSource',\n 'i18n',\n 'locale',\n 'skinToneEmoji',\n 'emojiVersion'\n];\n\n// Styles injected ourselves, so we can declare the FONT_FAMILY variable in one place\nconst EXTRA_STYLES = `:host{--emoji-font-family:${FONT_FAMILY}}`;\n\nclass PickerElement extends HTMLElement {\n constructor (props) {\n super();\n this.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = baseStyles + EXTRA_STYLES;\n this.shadowRoot.appendChild(style);\n this._ctx = {\n // Set defaults\n locale: DEFAULT_LOCALE,\n dataSource: DEFAULT_DATA_SOURCE,\n skinToneEmoji: DEFAULT_SKIN_TONE_EMOJI,\n customCategorySorting: DEFAULT_CATEGORY_SORTING,\n customEmoji: null,\n i18n: enI18n,\n emojiVersion: null,\n ...props\n };\n // Handle properties set before the element was upgraded\n for (const prop of PROPS) {\n if (prop !== 'database' && Object.prototype.hasOwnProperty.call(this, prop)) {\n this._ctx[prop] = this[prop];\n delete this[prop];\n }\n }\n this._dbFlush(); // wait for a flush before creating the db, in case the user calls e.g. a setter or setAttribute\n }\n\n connectedCallback () {\n // The _cmp may be defined if the component was immediately disconnected and then reconnected. In that case,\n // do nothing (preserve the state)\n if (!this._cmp) {\n this._cmp = createRoot(this.shadowRoot, this._ctx);\n }\n }\n\n disconnectedCallback () {\n // Check in a microtask if the element is still connected. If so, treat this as a \"move\" rather than a disconnect\n // Inspired by Vue: https://vuejs.org/guide/extras/web-components.html#building-custom-elements-with-vue\n qM(() => {\n // this._cmp may be defined if connect-disconnect-connect-disconnect occurs synchronously\n if (!this.isConnected && this._cmp) {\n this._cmp.$destroy();\n this._cmp = undefined;\n\n const { database } = this._ctx;\n database.close()\n // only happens if the database failed to load in the first place, so we don't care\n .catch(err => console.error(err));\n }\n });\n }\n\n static get observedAttributes () {\n return ['locale', 'data-source', 'skin-tone-emoji', 'emoji-version'] // complex objects aren't supported, also use kebab-case\n }\n\n attributeChangedCallback (attrName, oldValue, newValue) {\n this._set(\n // convert from kebab-case to camelcase\n // see https://github.com/sveltejs/svelte/issues/3852#issuecomment-665037015\n attrName.replace(/-([a-z])/g, (_, up) => up.toUpperCase()),\n // convert string attribute to float if necessary\n attrName === 'emoji-version' ? parseFloat(newValue) : newValue\n );\n }\n\n _set (prop, newValue) {\n this._ctx[prop] = newValue;\n if (this._cmp) {\n this._cmp.$set({ [prop]: newValue });\n }\n if (['locale', 'dataSource'].includes(prop)) {\n this._dbFlush();\n }\n }\n\n _dbCreate () {\n const { locale, dataSource, database } = this._ctx;\n // only create a new database if we really need to\n if (!database || database.locale !== locale || database.dataSource !== dataSource) {\n this._set('database', new Database({ locale, dataSource }));\n }\n }\n\n // Update the Database in one microtask if the locale/dataSource change. We do one microtask\n // so we don't create two Databases if e.g. both the locale and the dataSource change\n _dbFlush () {\n qM(() => (\n this._dbCreate()\n ));\n }\n}\n\nconst definitions = {};\n\nfor (const prop of PROPS) {\n definitions[prop] = {\n get () {\n if (prop === 'database') {\n // in rare cases, the microtask may not be flushed yet, so we need to instantiate the DB\n // now if the user is asking for it\n this._dbCreate();\n }\n return this._ctx[prop]\n },\n set (val) {\n if (prop === 'database') {\n throw new Error('database is read-only')\n }\n this._set(prop, val);\n }\n };\n}\n\nObject.defineProperties(PickerElement.prototype, definitions);\n\n/* istanbul ignore else */\nif (!customElements.get('emoji-picker')) { // if already defined, do nothing (e.g. same script imported twice)\n customElements.define('emoji-picker', PickerElement);\n}\n\nexport { PickerElement as default };\n","function assertNonEmptyString (str) {\n if (typeof str !== 'string' || !str) {\n throw new Error('expected a non-empty string, got: ' + str)\n }\n}\n\nfunction assertNumber (number) {\n if (typeof number !== 'number') {\n throw new Error('expected a number, got: ' + number)\n }\n}\n\nconst DB_VERSION_CURRENT = 1;\nconst DB_VERSION_INITIAL = 1;\nconst STORE_EMOJI = 'emoji';\nconst STORE_KEYVALUE = 'keyvalue';\nconst STORE_FAVORITES = 'favorites';\nconst FIELD_TOKENS = 'tokens';\nconst INDEX_TOKENS = 'tokens';\nconst FIELD_UNICODE = 'unicode';\nconst INDEX_COUNT = 'count';\nconst FIELD_GROUP = 'group';\nconst FIELD_ORDER = 'order';\nconst INDEX_GROUP_AND_ORDER = 'group-order';\nconst KEY_ETAG = 'eTag';\nconst KEY_URL = 'url';\nconst KEY_PREFERRED_SKINTONE = 'skinTone';\nconst MODE_READONLY = 'readonly';\nconst MODE_READWRITE = 'readwrite';\nconst INDEX_SKIN_UNICODE = 'skinUnicodes';\nconst FIELD_SKIN_UNICODE = 'skinUnicodes';\n\nconst DEFAULT_DATA_SOURCE = 'https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json';\nconst DEFAULT_LOCALE = 'en';\n\n// like lodash's uniqBy but much smaller\nfunction uniqBy (arr, func) {\n const set = new Set();\n const res = [];\n for (const item of arr) {\n const key = func(item);\n if (!set.has(key)) {\n set.add(key);\n res.push(item);\n }\n }\n return res\n}\n\nfunction uniqEmoji (emojis) {\n return uniqBy(emojis, _ => _.unicode)\n}\n\nfunction initialMigration (db) {\n function createObjectStore (name, keyPath, indexes) {\n const store = keyPath\n ? db.createObjectStore(name, { keyPath })\n : db.createObjectStore(name);\n if (indexes) {\n for (const [indexName, [keyPath, multiEntry]] of Object.entries(indexes)) {\n store.createIndex(indexName, keyPath, { multiEntry });\n }\n }\n return store\n }\n\n createObjectStore(STORE_KEYVALUE);\n createObjectStore(STORE_EMOJI, /* keyPath */ FIELD_UNICODE, {\n [INDEX_TOKENS]: [FIELD_TOKENS, /* multiEntry */ true],\n [INDEX_GROUP_AND_ORDER]: [[FIELD_GROUP, FIELD_ORDER]],\n [INDEX_SKIN_UNICODE]: [FIELD_SKIN_UNICODE, /* multiEntry */ true]\n });\n createObjectStore(STORE_FAVORITES, undefined, {\n [INDEX_COUNT]: ['']\n });\n}\n\nconst openIndexedDBRequests = {};\nconst databaseCache = {};\nconst onCloseListeners = {};\n\nfunction handleOpenOrDeleteReq (resolve, reject, req) {\n // These things are almost impossible to test with fakeIndexedDB sadly\n /* istanbul ignore next */\n req.onerror = () => reject(req.error);\n /* istanbul ignore next */\n req.onblocked = () => reject(new Error('IDB blocked'));\n req.onsuccess = () => resolve(req.result);\n}\n\nasync function createDatabase (dbName) {\n const db = await new Promise((resolve, reject) => {\n const req = indexedDB.open(dbName, DB_VERSION_CURRENT);\n openIndexedDBRequests[dbName] = req;\n req.onupgradeneeded = e => {\n // Technically there is only one version, so we don't need this `if` check\n // But if an old version of the JS is in another browser tab\n // and it gets upgraded in the future and we have a new DB version, well...\n // better safe than sorry.\n /* istanbul ignore else */\n if (e.oldVersion < DB_VERSION_INITIAL) {\n initialMigration(req.result);\n }\n };\n handleOpenOrDeleteReq(resolve, reject, req);\n });\n // Handle abnormal closes, e.g. \"delete database\" in chrome dev tools.\n // No need for removeEventListener, because once the DB can no longer\n // fire \"close\" events, it will auto-GC.\n // Unfortunately cannot test in fakeIndexedDB: https://github.com/dumbmatter/fakeIndexedDB/issues/50\n /* istanbul ignore next */\n db.onclose = () => closeDatabase(dbName);\n return db\n}\n\nfunction openDatabase (dbName) {\n if (!databaseCache[dbName]) {\n databaseCache[dbName] = createDatabase(dbName);\n }\n return databaseCache[dbName]\n}\n\nfunction dbPromise (db, storeName, readOnlyOrReadWrite, cb) {\n return new Promise((resolve, reject) => {\n // Use relaxed durability because neither the emoji data nor the favorites/preferred skin tone\n // are really irreplaceable data. IndexedDB is just a cache in this case.\n const txn = db.transaction(storeName, readOnlyOrReadWrite, { durability: 'relaxed' });\n const store = typeof storeName === 'string'\n ? txn.objectStore(storeName)\n : storeName.map(name => txn.objectStore(name));\n let res;\n cb(store, txn, (result) => {\n res = result;\n });\n\n txn.oncomplete = () => resolve(res);\n /* istanbul ignore next */\n txn.onerror = () => reject(txn.error);\n })\n}\n\nfunction closeDatabase (dbName) {\n // close any open requests\n const req = openIndexedDBRequests[dbName];\n const db = req && req.result;\n if (db) {\n db.close();\n const listeners = onCloseListeners[dbName];\n /* istanbul ignore else */\n if (listeners) {\n for (const listener of listeners) {\n listener();\n }\n }\n }\n delete openIndexedDBRequests[dbName];\n delete databaseCache[dbName];\n delete onCloseListeners[dbName];\n}\n\nfunction deleteDatabase (dbName) {\n return new Promise((resolve, reject) => {\n // close any open requests\n closeDatabase(dbName);\n const req = indexedDB.deleteDatabase(dbName);\n handleOpenOrDeleteReq(resolve, reject, req);\n })\n}\n\n// The \"close\" event occurs during an abnormal shutdown, e.g. a user clearing their browser data.\n// However, it doesn't occur with the normal \"close\" event, so we handle that separately.\n// https://www.w3.org/TR/IndexedDB/#close-a-database-connection\nfunction addOnCloseListener (dbName, listener) {\n let listeners = onCloseListeners[dbName];\n if (!listeners) {\n listeners = onCloseListeners[dbName] = [];\n }\n listeners.push(listener);\n}\n\n// list of emoticons that don't match a simple \\W+ regex\n// extracted using:\n// require('emoji-picker-element-data/en/emojibase/data.json').map(_ => _.emoticon).filter(Boolean).filter(_ => !/^\\W+$/.test(_))\nconst irregularEmoticons = new Set([\n ':D', 'XD', \":'D\", 'O:)',\n ':X', ':P', ';P', 'XP',\n ':L', ':Z', ':j', '8D',\n 'XO', '8)', ':B', ':O',\n ':S', \":'o\", 'Dx', 'X(',\n 'D:', ':C', '>0)', ':3',\n ' {\n if (!word.match(/\\w/) || irregularEmoticons.has(word)) {\n // for pure emoticons like :) or :-), just leave them as-is\n return word.toLowerCase()\n }\n\n return word\n .replace(/[)(:,]/g, '')\n .replace(/’/g, \"'\")\n .toLowerCase()\n }).filter(Boolean)\n}\n\nconst MIN_SEARCH_TEXT_LENGTH = 2;\n\n// This is an extra step in addition to extractTokens(). The difference here is that we expect\n// the input to have already been run through extractTokens(). This is useful for cases like\n// emoticons, where we don't want to do any tokenization (because it makes no sense to split up\n// \">:)\" by the colon) but we do want to lowercase it to have consistent search results, so that\n// the user can type ':P' or ':p' and still get the same result.\nfunction normalizeTokens (str) {\n return str\n .filter(Boolean)\n .map(_ => _.toLowerCase())\n .filter(_ => _.length >= MIN_SEARCH_TEXT_LENGTH)\n}\n\n// Transform emoji data for storage in IDB\nfunction transformEmojiData (emojiData) {\n const res = emojiData.map(({ annotation, emoticon, group, order, shortcodes, skins, tags, emoji, version }) => {\n const tokens = [...new Set(\n normalizeTokens([\n ...(shortcodes || []).map(extractTokens).flat(),\n ...tags.map(extractTokens).flat(),\n ...extractTokens(annotation),\n emoticon\n ])\n )].sort();\n const res = {\n annotation,\n group,\n order,\n tags,\n tokens,\n unicode: emoji,\n version\n };\n if (emoticon) {\n res.emoticon = emoticon;\n }\n if (shortcodes) {\n res.shortcodes = shortcodes;\n }\n if (skins) {\n res.skinTones = [];\n res.skinUnicodes = [];\n res.skinVersions = [];\n for (const { tone, emoji, version } of skins) {\n res.skinTones.push(tone);\n res.skinUnicodes.push(emoji);\n res.skinVersions.push(version);\n }\n }\n return res\n });\n return res\n}\n\n// helper functions that help compress the code better\n\nfunction callStore (store, method, key, cb) {\n store[method](key).onsuccess = e => (cb && cb(e.target.result));\n}\n\nfunction getIDB (store, key, cb) {\n callStore(store, 'get', key, cb);\n}\n\nfunction getAllIDB (store, key, cb) {\n callStore(store, 'getAll', key, cb);\n}\n\nfunction commit (txn) {\n /* istanbul ignore else */\n if (txn.commit) {\n txn.commit();\n }\n}\n\n// like lodash's minBy\nfunction minBy (array, func) {\n let minItem = array[0];\n for (let i = 1; i < array.length; i++) {\n const item = array[i];\n if (func(minItem) > func(item)) {\n minItem = item;\n }\n }\n return minItem\n}\n\n// return an array of results representing all items that are found in each one of the arrays\n//\n\nfunction findCommonMembers (arrays, uniqByFunc) {\n const shortestArray = minBy(arrays, _ => _.length);\n const results = [];\n for (const item of shortestArray) {\n // if this item is included in every array in the intermediate results, add it to the final results\n if (!arrays.some(array => array.findIndex(_ => uniqByFunc(_) === uniqByFunc(item)) === -1)) {\n results.push(item);\n }\n }\n return results\n}\n\nasync function isEmpty (db) {\n return !(await get(db, STORE_KEYVALUE, KEY_URL))\n}\n\nasync function hasData (db, url, eTag) {\n const [oldETag, oldUrl] = await Promise.all([KEY_ETAG, KEY_URL]\n .map(key => get(db, STORE_KEYVALUE, key)));\n return (oldETag === eTag && oldUrl === url)\n}\n\nasync function doFullDatabaseScanForSingleResult (db, predicate) {\n // This batching algorithm is just a perf improvement over a basic\n // cursor. The BATCH_SIZE is an estimate of what would give the best\n // perf for doing a full DB scan (worst case).\n //\n // Mini-benchmark for determining the best batch size:\n //\n // PERF=1 pnpm build:rollup && pnpm test:adhoc\n //\n // (async () => {\n // performance.mark('start')\n // await $('emoji-picker').database.getEmojiByShortcode('doesnotexist')\n // performance.measure('total', 'start')\n // console.log(performance.getEntriesByName('total').slice(-1)[0].duration)\n // })()\n const BATCH_SIZE = 50; // Typically around 150ms for 6x slowdown in Chrome for above benchmark\n return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => {\n let lastKey;\n\n const processNextBatch = () => {\n emojiStore.getAll(lastKey && IDBKeyRange.lowerBound(lastKey, true), BATCH_SIZE).onsuccess = e => {\n const results = e.target.result;\n for (const result of results) {\n lastKey = result.unicode;\n if (predicate(result)) {\n return cb(result)\n }\n }\n if (results.length < BATCH_SIZE) {\n return cb()\n }\n processNextBatch();\n };\n };\n processNextBatch();\n })\n}\n\nasync function loadData (db, emojiData, url, eTag) {\n try {\n const transformedData = transformEmojiData(emojiData);\n await dbPromise(db, [STORE_EMOJI, STORE_KEYVALUE], MODE_READWRITE, ([emojiStore, metaStore], txn) => {\n let oldETag;\n let oldUrl;\n let todo = 0;\n\n function checkFetched () {\n if (++todo === 2) { // 2 requests made\n onFetched();\n }\n }\n\n function onFetched () {\n if (oldETag === eTag && oldUrl === url) {\n // check again within the transaction to guard against concurrency, e.g. multiple browser tabs\n return\n }\n // delete old data\n emojiStore.clear();\n // insert new data\n for (const data of transformedData) {\n emojiStore.put(data);\n }\n metaStore.put(eTag, KEY_ETAG);\n metaStore.put(url, KEY_URL);\n commit(txn);\n }\n\n getIDB(metaStore, KEY_ETAG, result => {\n oldETag = result;\n checkFetched();\n });\n\n getIDB(metaStore, KEY_URL, result => {\n oldUrl = result;\n checkFetched();\n });\n });\n } finally {\n }\n}\n\nasync function getEmojiByGroup (db, group) {\n return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => {\n const range = IDBKeyRange.bound([group, 0], [group + 1, 0], false, true);\n getAllIDB(emojiStore.index(INDEX_GROUP_AND_ORDER), range, cb);\n })\n}\n\nasync function getEmojiBySearchQuery (db, query) {\n const tokens = normalizeTokens(extractTokens(query));\n\n if (!tokens.length) {\n return []\n }\n\n return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => {\n // get all results that contain all tokens (i.e. an AND query)\n const intermediateResults = [];\n\n const checkDone = () => {\n if (intermediateResults.length === tokens.length) {\n onDone();\n }\n };\n\n const onDone = () => {\n const results = findCommonMembers(intermediateResults, _ => _.unicode);\n cb(results.sort((a, b) => a.order < b.order ? -1 : 1));\n };\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n const range = i === tokens.length - 1\n ? IDBKeyRange.bound(token, token + '\\uffff', false, true) // treat last token as a prefix search\n : IDBKeyRange.only(token); // treat all other tokens as an exact match\n getAllIDB(emojiStore.index(INDEX_TOKENS), range, result => {\n intermediateResults.push(result);\n checkDone();\n });\n }\n })\n}\n\n// This could have been implemented as an IDB index on shortcodes, but it seemed wasteful to do that\n// when we can already query by tokens and this will give us what we're looking for 99.9% of the time\nasync function getEmojiByShortcode (db, shortcode) {\n const emojis = await getEmojiBySearchQuery(db, shortcode);\n\n // In very rare cases (e.g. the shortcode \"v\" as in \"v for victory\"), we cannot search because\n // there are no usable tokens (too short in this case). In that case, we have to do an inefficient\n // full-database scan, which I believe is an acceptable tradeoff for not having to have an extra\n // index on shortcodes.\n\n if (!emojis.length) {\n const predicate = _ => ((_.shortcodes || []).includes(shortcode.toLowerCase()));\n return (await doFullDatabaseScanForSingleResult(db, predicate)) || null\n }\n\n return emojis.filter(_ => {\n const lowerShortcodes = (_.shortcodes || []).map(_ => _.toLowerCase());\n return lowerShortcodes.includes(shortcode.toLowerCase())\n })[0] || null\n}\n\nasync function getEmojiByUnicode (db, unicode) {\n return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => (\n getIDB(emojiStore, unicode, result => {\n if (result) {\n return cb(result)\n }\n getIDB(emojiStore.index(INDEX_SKIN_UNICODE), unicode, result => cb(result || null));\n })\n ))\n}\n\nfunction get (db, storeName, key) {\n return dbPromise(db, storeName, MODE_READONLY, (store, txn, cb) => (\n getIDB(store, key, cb)\n ))\n}\n\nfunction set (db, storeName, key, value) {\n return dbPromise(db, storeName, MODE_READWRITE, (store, txn) => {\n store.put(value, key);\n commit(txn);\n })\n}\n\nfunction incrementFavoriteEmojiCount (db, unicode) {\n return dbPromise(db, STORE_FAVORITES, MODE_READWRITE, (store, txn) => (\n getIDB(store, unicode, result => {\n store.put((result || 0) + 1, unicode);\n commit(txn);\n })\n ))\n}\n\nfunction getTopFavoriteEmoji (db, customEmojiIndex, limit) {\n if (limit === 0) {\n return []\n }\n return dbPromise(db, [STORE_FAVORITES, STORE_EMOJI], MODE_READONLY, ([favoritesStore, emojiStore], txn, cb) => {\n const results = [];\n favoritesStore.index(INDEX_COUNT).openCursor(undefined, 'prev').onsuccess = e => {\n const cursor = e.target.result;\n if (!cursor) { // no more results\n return cb(results)\n }\n\n function addResult (result) {\n results.push(result);\n if (results.length === limit) {\n return cb(results) // done, reached the limit\n }\n cursor.continue();\n }\n\n const unicodeOrName = cursor.primaryKey;\n const custom = customEmojiIndex.byName(unicodeOrName);\n if (custom) {\n return addResult(custom)\n }\n // This could be done in parallel (i.e. make the cursor and the get()s parallelized),\n // but my testing suggests it's not actually faster.\n getIDB(emojiStore, unicodeOrName, emoji => {\n if (emoji) {\n return addResult(emoji)\n }\n // emoji not found somehow, ignore (may happen if custom emoji change)\n cursor.continue();\n });\n };\n })\n}\n\n// trie data structure for prefix searches\n// loosely based on https://github.com/nolanlawson/substring-trie\n\nconst CODA_MARKER = ''; // marks the end of the string\n\nfunction trie (arr, itemToTokens) {\n const map = new Map();\n for (const item of arr) {\n const tokens = itemToTokens(item);\n for (const token of tokens) {\n let currentMap = map;\n for (let i = 0; i < token.length; i++) {\n const char = token.charAt(i);\n let nextMap = currentMap.get(char);\n if (!nextMap) {\n nextMap = new Map();\n currentMap.set(char, nextMap);\n }\n currentMap = nextMap;\n }\n let valuesAtCoda = currentMap.get(CODA_MARKER);\n if (!valuesAtCoda) {\n valuesAtCoda = [];\n currentMap.set(CODA_MARKER, valuesAtCoda);\n }\n valuesAtCoda.push(item);\n }\n }\n\n const search = (query, exact) => {\n let currentMap = map;\n for (let i = 0; i < query.length; i++) {\n const char = query.charAt(i);\n const nextMap = currentMap.get(char);\n if (nextMap) {\n currentMap = nextMap;\n } else {\n return []\n }\n }\n\n if (exact) {\n const results = currentMap.get(CODA_MARKER);\n return results || []\n }\n\n const results = [];\n // traverse\n const queue = [currentMap];\n while (queue.length) {\n const currentMap = queue.shift();\n const entriesSortedByKey = [...currentMap.entries()].sort((a, b) => a[0] < b[0] ? -1 : 1);\n for (const [key, value] of entriesSortedByKey) {\n if (key === CODA_MARKER) { // CODA_MARKER always comes first; it's the empty string\n results.push(...value);\n } else {\n queue.push(value);\n }\n }\n }\n return results\n };\n\n return search\n}\n\nconst requiredKeys$1 = [\n 'name',\n 'url'\n];\n\nfunction assertCustomEmojis (customEmojis) {\n const isArray = customEmojis && Array.isArray(customEmojis);\n const firstItemIsFaulty = isArray &&\n customEmojis.length &&\n (!customEmojis[0] || requiredKeys$1.some(key => !(key in customEmojis[0])));\n if (!isArray || firstItemIsFaulty) {\n throw new Error('Custom emojis are in the wrong format')\n }\n}\n\nfunction customEmojiIndex (customEmojis) {\n assertCustomEmojis(customEmojis);\n\n const sortByName = (a, b) => a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1;\n\n //\n // all()\n //\n const all = customEmojis.sort(sortByName);\n\n //\n // search()\n //\n const emojiToTokens = emoji => (\n [...new Set((emoji.shortcodes || []).map(shortcode => extractTokens(shortcode)).flat())]\n );\n const searchTrie = trie(customEmojis, emojiToTokens);\n const searchByExactMatch = _ => searchTrie(_, true);\n const searchByPrefix = _ => searchTrie(_, false);\n\n // Search by query for custom emoji. Similar to how we do this in IDB, the last token\n // is treated as a prefix search, but every other one is treated as an exact match.\n // Then we AND the results together\n const search = query => {\n const tokens = extractTokens(query);\n const intermediateResults = tokens.map((token, i) => (\n (i < tokens.length - 1 ? searchByExactMatch : searchByPrefix)(token)\n ));\n return findCommonMembers(intermediateResults, _ => _.name).sort(sortByName)\n };\n\n //\n // byShortcode, byName\n //\n const shortcodeToEmoji = new Map();\n const nameToEmoji = new Map();\n for (const customEmoji of customEmojis) {\n nameToEmoji.set(customEmoji.name.toLowerCase(), customEmoji);\n for (const shortcode of (customEmoji.shortcodes || [])) {\n shortcodeToEmoji.set(shortcode.toLowerCase(), customEmoji);\n }\n }\n\n const byShortcode = shortcode => shortcodeToEmoji.get(shortcode.toLowerCase());\n const byName = name => nameToEmoji.get(name.toLowerCase());\n\n return {\n all,\n search,\n byShortcode,\n byName\n }\n}\n\nconst isFirefoxContentScript = typeof wrappedJSObject !== 'undefined';\n\n// remove some internal implementation details, i.e. the \"tokens\" array on the emoji object\n// essentially, convert the emoji from the version stored in IDB to the version used in-memory\nfunction cleanEmoji (emoji) {\n if (!emoji) {\n return emoji\n }\n // if inside a Firefox content script, need to clone the emoji object to prevent Firefox from complaining about\n // cross-origin object. See: https://github.com/nolanlawson/emoji-picker-element/issues/356\n /* istanbul ignore if */\n if (isFirefoxContentScript) {\n emoji = structuredClone(emoji);\n }\n delete emoji.tokens;\n if (emoji.skinTones) {\n const len = emoji.skinTones.length;\n emoji.skins = Array(len);\n for (let i = 0; i < len; i++) {\n emoji.skins[i] = {\n tone: emoji.skinTones[i],\n unicode: emoji.skinUnicodes[i],\n version: emoji.skinVersions[i]\n };\n }\n delete emoji.skinTones;\n delete emoji.skinUnicodes;\n delete emoji.skinVersions;\n }\n return emoji\n}\n\nfunction warnETag (eTag) {\n if (!eTag) {\n console.warn('emoji-picker-element is more efficient if the dataSource server exposes an ETag header.');\n }\n}\n\nconst requiredKeys = [\n 'annotation',\n 'emoji',\n 'group',\n 'order',\n 'tags',\n 'version'\n];\n\nfunction assertEmojiData (emojiData) {\n if (!emojiData ||\n !Array.isArray(emojiData) ||\n !emojiData[0] ||\n (typeof emojiData[0] !== 'object') ||\n requiredKeys.some(key => (!(key in emojiData[0])))) {\n throw new Error('Emoji data is in the wrong format')\n }\n}\n\nfunction assertStatus (response, dataSource) {\n if (Math.floor(response.status / 100) !== 2) {\n throw new Error('Failed to fetch: ' + dataSource + ': ' + response.status)\n }\n}\n\nasync function getETag (dataSource) {\n const response = await fetch(dataSource, { method: 'HEAD' });\n assertStatus(response, dataSource);\n const eTag = response.headers.get('etag');\n warnETag(eTag);\n return eTag\n}\n\nasync function getETagAndData (dataSource) {\n const response = await fetch(dataSource);\n assertStatus(response, dataSource);\n const eTag = response.headers.get('etag');\n warnETag(eTag);\n const emojiData = await response.json();\n assertEmojiData(emojiData);\n return [eTag, emojiData]\n}\n\n// TODO: including these in blob-util.ts causes typedoc to generate docs for them,\n// even with --excludePrivate ¯\\_(ツ)_/¯\n/** @private */\n/**\n * Convert an `ArrayBuffer` to a binary string.\n *\n * Example:\n *\n * ```js\n * var myString = blobUtil.arrayBufferToBinaryString(arrayBuff)\n * ```\n *\n * @param buffer - array buffer\n * @returns binary string\n */\nfunction arrayBufferToBinaryString(buffer) {\n var binary = '';\n var bytes = new Uint8Array(buffer);\n var length = bytes.byteLength;\n var i = -1;\n while (++i < length) {\n binary += String.fromCharCode(bytes[i]);\n }\n return binary;\n}\n/**\n * Convert a binary string to an `ArrayBuffer`.\n *\n * ```js\n * var myBuffer = blobUtil.binaryStringToArrayBuffer(binaryString)\n * ```\n *\n * @param binary - binary string\n * @returns array buffer\n */\nfunction binaryStringToArrayBuffer(binary) {\n var length = binary.length;\n var buf = new ArrayBuffer(length);\n var arr = new Uint8Array(buf);\n var i = -1;\n while (++i < length) {\n arr[i] = binary.charCodeAt(i);\n }\n return buf;\n}\n\n// generate a checksum based on the stringified JSON\nasync function jsonChecksum (object) {\n const inString = JSON.stringify(object);\n let inBuffer = binaryStringToArrayBuffer(inString);\n\n // this does not need to be cryptographically secure, SHA-1 is fine\n const outBuffer = await crypto.subtle.digest('SHA-1', inBuffer);\n const outBinString = arrayBufferToBinaryString(outBuffer);\n const res = btoa(outBinString);\n return res\n}\n\nasync function checkForUpdates (db, dataSource) {\n // just do a simple HEAD request first to see if the eTags match\n let emojiData;\n let eTag = await getETag(dataSource);\n if (!eTag) { // work around lack of ETag/Access-Control-Expose-Headers\n const eTagAndData = await getETagAndData(dataSource);\n eTag = eTagAndData[0];\n emojiData = eTagAndData[1];\n if (!eTag) {\n eTag = await jsonChecksum(emojiData);\n }\n }\n if (await hasData(db, dataSource, eTag)) ; else {\n if (!emojiData) {\n const eTagAndData = await getETagAndData(dataSource);\n emojiData = eTagAndData[1];\n }\n await loadData(db, emojiData, dataSource, eTag);\n }\n}\n\nasync function loadDataForFirstTime (db, dataSource) {\n let [eTag, emojiData] = await getETagAndData(dataSource);\n if (!eTag) {\n // Handle lack of support for ETag or Access-Control-Expose-Headers\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers#Browser_compatibility\n eTag = await jsonChecksum(emojiData);\n }\n\n await loadData(db, emojiData, dataSource, eTag);\n}\n\nclass Database {\n constructor ({ dataSource = DEFAULT_DATA_SOURCE, locale = DEFAULT_LOCALE, customEmoji = [] } = {}) {\n this.dataSource = dataSource;\n this.locale = locale;\n this._dbName = `emoji-picker-element-${this.locale}`;\n this._db = undefined;\n this._lazyUpdate = undefined;\n this._custom = customEmojiIndex(customEmoji);\n\n this._clear = this._clear.bind(this);\n this._ready = this._init();\n }\n\n async _init () {\n const db = this._db = await openDatabase(this._dbName);\n\n addOnCloseListener(this._dbName, this._clear);\n const dataSource = this.dataSource;\n const empty = await isEmpty(db);\n\n if (empty) {\n await loadDataForFirstTime(db, dataSource);\n } else { // offline-first - do an update asynchronously\n this._lazyUpdate = checkForUpdates(db, dataSource);\n }\n }\n\n async ready () {\n const checkReady = async () => {\n if (!this._ready) {\n this._ready = this._init();\n }\n return this._ready\n };\n await checkReady();\n // There's a possibility of a race condition where the element gets added, removed, and then added again\n // with a particular timing, which would set the _db to undefined.\n // We *could* do a while loop here, but that seems excessive and could lead to an infinite loop.\n if (!this._db) {\n await checkReady();\n }\n }\n\n async getEmojiByGroup (group) {\n assertNumber(group);\n await this.ready();\n return uniqEmoji(await getEmojiByGroup(this._db, group)).map(cleanEmoji)\n }\n\n async getEmojiBySearchQuery (query) {\n assertNonEmptyString(query);\n await this.ready();\n const customs = this._custom.search(query);\n const natives = uniqEmoji(await getEmojiBySearchQuery(this._db, query)).map(cleanEmoji);\n return [\n ...customs,\n ...natives\n ]\n }\n\n async getEmojiByShortcode (shortcode) {\n assertNonEmptyString(shortcode);\n await this.ready();\n const custom = this._custom.byShortcode(shortcode);\n if (custom) {\n return custom\n }\n return cleanEmoji(await getEmojiByShortcode(this._db, shortcode))\n }\n\n async getEmojiByUnicodeOrName (unicodeOrName) {\n assertNonEmptyString(unicodeOrName);\n await this.ready();\n const custom = this._custom.byName(unicodeOrName);\n if (custom) {\n return custom\n }\n return cleanEmoji(await getEmojiByUnicode(this._db, unicodeOrName))\n }\n\n async getPreferredSkinTone () {\n await this.ready();\n return (await get(this._db, STORE_KEYVALUE, KEY_PREFERRED_SKINTONE)) || 0\n }\n\n async setPreferredSkinTone (skinTone) {\n assertNumber(skinTone);\n await this.ready();\n return set(this._db, STORE_KEYVALUE, KEY_PREFERRED_SKINTONE, skinTone)\n }\n\n async incrementFavoriteEmojiCount (unicodeOrName) {\n assertNonEmptyString(unicodeOrName);\n await this.ready();\n return incrementFavoriteEmojiCount(this._db, unicodeOrName)\n }\n\n async getTopFavoriteEmoji (limit) {\n assertNumber(limit);\n await this.ready();\n return (await getTopFavoriteEmoji(this._db, this._custom, limit)).map(cleanEmoji)\n }\n\n set customEmoji (customEmojis) {\n this._custom = customEmojiIndex(customEmojis);\n }\n\n get customEmoji () {\n return this._custom.all\n }\n\n async _shutdown () {\n await this.ready(); // reopen if we've already been closed/deleted\n try {\n await this._lazyUpdate; // allow any lazy updates to process before closing/deleting\n } catch (err) { /* ignore network errors (offline-first) */ }\n }\n\n // clear references to IDB, e.g. during a close event\n _clear () {\n // We don't need to call removeEventListener or remove the manual \"close\" listeners.\n // The memory leak tests prove this is unnecessary. It's because:\n // 1) IDBDatabases that can no longer fire \"close\" automatically have listeners GCed\n // 2) we clear the manual close listeners in databaseLifecycle.js.\n this._db = this._ready = this._lazyUpdate = undefined;\n }\n\n async close () {\n await this._shutdown();\n await closeDatabase(this._dbName);\n }\n\n async delete () {\n await this._shutdown();\n await deleteDatabase(this._dbName);\n }\n}\n\nexport { Database as default };\n","var browserSupportsTextareaTextNodes;\n/**\n * @param {HTMLElement} input\n * @return {boolean}\n */\n\nfunction canManipulateViaTextNodes(input) {\n if (input.nodeName !== \"TEXTAREA\") {\n return false;\n }\n\n if (typeof browserSupportsTextareaTextNodes === \"undefined\") {\n var textarea = document.createElement(\"textarea\");\n textarea.value = 1;\n browserSupportsTextareaTextNodes = !!textarea.firstChild;\n }\n\n return browserSupportsTextareaTextNodes;\n}\n/**\n * @param {HTMLTextAreaElement|HTMLInputElement} input\n * @param {string} text\n * @returns {void}\n */\n\n\nfunction index (input, text) {\n // Most of the used APIs only work with the field selected\n input.focus(); // IE 8-10\n\n if (document.selection) {\n var ieRange = document.selection.createRange();\n ieRange.text = text; // Move cursor after the inserted text\n\n ieRange.collapse(false\n /* to the end */\n );\n ieRange.select();\n return;\n } // Webkit + Edge\n\n\n var isSuccess = document.execCommand(\"insertText\", false, text);\n\n if (!isSuccess) {\n var start = input.selectionStart;\n var end = input.selectionEnd; // Firefox (non-standard method)\n\n if (typeof input.setRangeText === \"function\") {\n input.setRangeText(text);\n } else {\n // To make a change we just need a Range, not a Selection\n var range = document.createRange();\n var textNode = document.createTextNode(text);\n\n if (canManipulateViaTextNodes(input)) {\n var node = input.firstChild; // If textarea is empty, just insert the text\n\n if (!node) {\n input.appendChild(textNode);\n } else {\n // Otherwise we need to find a nodes for start and end\n var offset = 0;\n var startNode = null;\n var endNode = null;\n\n while (node && (startNode === null || endNode === null)) {\n var nodeLength = node.nodeValue.length; // if start of the selection falls into current node\n\n if (start >= offset && start <= offset + nodeLength) {\n range.setStart(startNode = node, start - offset);\n } // if end of the selection falls into current node\n\n\n if (end >= offset && end <= offset + nodeLength) {\n range.setEnd(endNode = node, end - offset);\n }\n\n offset += nodeLength;\n node = node.nextSibling;\n } // If there is some text selected, remove it as we should replace it\n\n\n if (start !== end) {\n range.deleteContents();\n }\n }\n } // If the node is a textarea and the range doesn't span outside the element\n //\n // Get the commonAncestorContainer of the selected range and test its type\n // If the node is of type `#text` it means that we're still working with text nodes within our textarea element\n // otherwise, if it's of type `#document` for example it means our selection spans outside the textarea.\n\n\n if (canManipulateViaTextNodes(input) && range.commonAncestorContainer.nodeName === \"#text\") {\n // Finally insert a new node. The browser will automatically split start and end nodes into two if necessary\n range.insertNode(textNode);\n } else {\n // If the node is not a textarea or the range spans outside a textarea the only way is to replace the whole value\n var value = input.value;\n input.value = value.slice(0, start) + text + value.slice(end);\n }\n } // Correct the cursor position to be at the end of the insertion\n\n\n input.setSelectionRange(start + text.length, start + text.length); // Notify any possible listeners of the change\n\n var e = document.createEvent(\"UIEvent\");\n e.initEvent(\"input\", true, false);\n input.dispatchEvent(e);\n }\n}\n\nexport default index;\n//# sourceMappingURL=index.esm.js.map\n","let browserSupportsTextareaTextNodes;\n\n/**\n * @param {HTMLElement} input\n * @return {boolean}\n */\nfunction canManipulateViaTextNodes(input) {\n if (input.nodeName !== \"TEXTAREA\") {\n return false;\n }\n if (typeof browserSupportsTextareaTextNodes === \"undefined\") {\n const textarea = document.createElement(\"textarea\");\n textarea.value = 1;\n browserSupportsTextareaTextNodes = !!textarea.firstChild;\n }\n return browserSupportsTextareaTextNodes;\n}\n\n/**\n * @param {HTMLTextAreaElement|HTMLInputElement} input\n * @param {string} text\n * @returns {void}\n */\nexport default function(input, text) {\n // Most of the used APIs only work with the field selected\n input.focus();\n\n // IE 8-10\n if (document.selection) {\n const ieRange = document.selection.createRange();\n ieRange.text = text;\n\n // Move cursor after the inserted text\n ieRange.collapse(false /* to the end */);\n ieRange.select();\n\n return;\n }\n\n // Webkit + Edge\n const isSuccess = document.execCommand(\"insertText\", false, text);\n if (!isSuccess) {\n const start = input.selectionStart;\n const end = input.selectionEnd;\n // Firefox (non-standard method)\n if (typeof input.setRangeText === \"function\") {\n input.setRangeText(text);\n } else {\n // To make a change we just need a Range, not a Selection\n const range = document.createRange();\n const textNode = document.createTextNode(text);\n\n if (canManipulateViaTextNodes(input)) {\n let node = input.firstChild;\n\n // If textarea is empty, just insert the text\n if (!node) {\n input.appendChild(textNode);\n } else {\n // Otherwise we need to find a nodes for start and end\n let offset = 0;\n let startNode = null;\n let endNode = null;\n\n while (node && (startNode === null || endNode === null)) {\n const nodeLength = node.nodeValue.length;\n\n // if start of the selection falls into current node\n if (start >= offset && start <= offset + nodeLength) {\n range.setStart((startNode = node), start - offset);\n }\n\n // if end of the selection falls into current node\n if (end >= offset && end <= offset + nodeLength) {\n range.setEnd((endNode = node), end - offset);\n }\n\n offset += nodeLength;\n node = node.nextSibling;\n }\n\n // If there is some text selected, remove it as we should replace it\n if (start !== end) {\n range.deleteContents();\n }\n }\n }\n\n // If the node is a textarea and the range doesn't span outside the element\n //\n // Get the commonAncestorContainer of the selected range and test its type\n // If the node is of type `#text` it means that we're still working with text nodes within our textarea element\n // otherwise, if it's of type `#document` for example it means our selection spans outside the textarea.\n if (\n canManipulateViaTextNodes(input) &&\n range.commonAncestorContainer.nodeName === \"#text\"\n ) {\n // Finally insert a new node. The browser will automatically split start and end nodes into two if necessary\n range.insertNode(textNode);\n } else {\n // If the node is not a textarea or the range spans outside a textarea the only way is to replace the whole value\n const value = input.value;\n input.value = value.slice(0, start) + text + value.slice(end);\n }\n }\n\n // Correct the cursor position to be at the end of the insertion\n input.setSelectionRange(start + text.length, start + text.length);\n\n // Notify any possible listeners of the change\n const e = document.createEvent(\"UIEvent\");\n e.initEvent(\"input\", true, false);\n input.dispatchEvent(e);\n }\n}\n","function a(a){return null!==a&&\"object\"==typeof a?\"share\"in navigator&&\"canShare\"in navigator&&navigator.canShare(a):\"share\"in navigator}export{a as isWebShareSupported};\n//# sourceMappingURL=is-web-share-supported.js.map\n","function $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $e179325634270afd$exports = {};\n\n$parcel$export($e179325634270afd$exports, \"WebShare\", function () { return $e179325634270afd$export$30b344bef3e55b67; });\n// @ts-check\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */ /**\n * Represents the data to share.\n *\n * @typedef {Object} ShareData\n * @property {string} [url] - The URL to share.\n * @property {string} [title] - The title to share.\n * @property {string} [text] - The text to share.\n * @property {File[]} [files] - The files to share.\n */ const $e179325634270afd$var$styles = /* css */ `\n :host {\n display: inline-block;\n }\n`;\nconst $e179325634270afd$var$template = document.createElement(\"template\");\n$e179325634270afd$var$template.innerHTML = /* html */ `\n \n \n`;\n/**\n * @summary A custom element that provides a button to share content.\n * @documentation https://github.com/georapbox/web-share-element\n *\n * @tagname web-share - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {boolean} disabled - Indicates whether the button is disabled.\n * @property {string} shareUrl - The URL to share.\n * @property {string} shareTitle - The title to share.\n * @property {string} shareText - The text to share.\n * @property {File[]} shareFiles - The files to share.\n *\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {string} share-url - Reflects the shareUrl property.\n * @attribute {string} share-title - Reflects the shareTitle property.\n * @attribute {string} share-text - Reflects the shareText property.\n *\n * @slot button - The button to share content.\n * @slot button-content - The content of the button to share content.\n *\n * @csspart button - The button to share content.\n * @csspart button--disabled - The button to share content when disabled.\n *\n * @event web-share:success - Fired when the share operation is successful.\n * @event web-share:abort - Fired when the share operation is aborted.\n * @event web-share:error - Fired when the share operation fails.\n *\n * @method defineCustomElement - Static method. Defines the custom element with the given name.\n * @method share - Instance method. Shares the shareable data taken from the element's properties.\n */ class $e179325634270afd$export$30b344bef3e55b67 extends HTMLElement {\n /** @type {Nullable} */ #buttonSlot;\n /** @type {Nullable} */ #buttonEl;\n /** @type {File[]} */ #files = [];\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\",\n delegatesFocus: true\n });\n shadowRoot.appendChild($e179325634270afd$var$template.content.cloneNode(true));\n }\n this.#buttonSlot = this.shadowRoot?.querySelector('slot[name=\"button\"]') || null;\n this.#buttonEl = this.#getButton();\n }\n static get observedAttributes() {\n return [\n \"disabled\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"disabled\" && oldValue !== newValue && this.#buttonEl) {\n this.#buttonEl.toggleAttribute(\"disabled\", this.disabled);\n this.#buttonEl.setAttribute(\"aria-disabled\", this.disabled.toString());\n if (this.#buttonEl.part && this.#buttonEl.part.contains(\"button\")) this.#buttonEl.part.toggle(\"button--disabled\", this.disabled);\n }\n }\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"shareUrl\");\n this.#upgradeProperty(\"shareTitle\");\n this.#upgradeProperty(\"shareText\");\n this.#upgradeProperty(\"shareFiles\");\n this.#upgradeProperty(\"disabled\");\n this.#buttonSlot?.addEventListener(\"slotchange\", this.#handleSlotChange);\n this.#buttonEl?.addEventListener(\"click\", this.#handleClick);\n }\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */ disconnectedCallback() {\n this.#buttonSlot?.removeEventListener(\"slotchange\", this.#handleSlotChange);\n this.#buttonEl?.removeEventListener(\"click\", this.#handleClick);\n }\n /**\n * @type {boolean} - Indicates whether the button is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */ get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(value) {\n this.toggleAttribute(\"disabled\", !!value);\n }\n /**\n * @type {string} - The URL to share.\n * @attribute share-url - Reflects the shareUrl property.\n */ get shareUrl() {\n return this.getAttribute(\"share-url\") || \"\";\n }\n set shareUrl(value) {\n this.setAttribute(\"share-url\", value);\n }\n /**\n * @type {string} - The title to share.\n * @attribute share-title - Reflects the shareTitle property.\n */ get shareTitle() {\n return this.getAttribute(\"share-title\") || \"\";\n }\n set shareTitle(value) {\n this.setAttribute(\"share-title\", value);\n }\n /**\n * @type {string} - The text to share.\n * @attribute share-text - Reflects the shareText property.\n */ get shareText() {\n return this.getAttribute(\"share-text\") || \"\";\n }\n set shareText(value) {\n this.setAttribute(\"share-text\", value);\n }\n /**\n * @type {File[]} - The files to share.\n */ get shareFiles() {\n return this.#files;\n }\n set shareFiles(value) {\n if (Array.isArray(value) && value.length > 0) this.#files = value;\n }\n /**\n * Shares the shareable data taken from the element's properties.\n *\n * @returns {Promise} - A promise that resolves when the share operation is complete.\n */ async share() {\n if (this.disabled) return;\n try {\n /** @type {ShareData} */ const shareData = {};\n if (this.shareUrl) shareData.url = this.shareUrl;\n if (this.shareTitle) shareData.title = this.shareTitle;\n if (this.shareText) shareData.text = this.shareText;\n if (Array.isArray(this.shareFiles) && this.shareFiles.length > 0 && navigator.canShare && navigator.canShare({\n files: this.shareFiles\n })) shareData.files = this.shareFiles;\n await navigator.share(shareData);\n this.dispatchEvent(new CustomEvent(\"web-share:success\", {\n bubbles: true,\n composed: true,\n detail: {\n shareData: shareData\n }\n }));\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n this.dispatchEvent(new CustomEvent(\"web-share:abort\", {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n return;\n }\n this.dispatchEvent(new CustomEvent(\"web-share:error\", {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }\n }\n /**\n * Handles the click event on the button.\n *\n * @param {any} evt - The event object.\n */ #handleClick = (evt)=>{\n evt.preventDefault();\n if (this.disabled) return;\n this.share();\n };\n /**\n * Handles the slotchange event on the button slot.\n *\n * @param {any} evt - The event object.\n */ #handleSlotChange = (evt)=>{\n if (evt.target && evt.target.name === \"button\") {\n this.#buttonEl?.removeEventListener(\"click\", this.#handleClick);\n this.#buttonEl = this.#getButton();\n if (this.#buttonEl) {\n this.#buttonEl.addEventListener(\"click\", this.#handleClick);\n if (this.#buttonEl.nodeName !== \"BUTTON\" && !this.#buttonEl.hasAttribute(\"role\")) this.#buttonEl.setAttribute(\"role\", \"button\");\n }\n }\n };\n /**\n * Returns the button element from the button slot.\n *\n * @returns {Nullable} - The button element.\n */ #getButton() {\n if (!this.#buttonSlot) return null;\n return this.#buttonSlot.assignedElements({\n flatten: true\n }).find((el)=>{\n return el.nodeName === \"BUTTON\" || el.getAttribute(\"slot\") === \"button\";\n }) || null;\n }\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'shareUrl' | 'shareTitle' | 'shareText' | 'shareFiles' | 'disabled'} prop - The property name to upgrade.\n */ #upgradeProperty(prop) {\n /** @type {any} */ const instance = this;\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n static defineCustomElement(elementName = \"web-share\") {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $e179325634270afd$export$30b344bef3e55b67);\n }\n}\n\n\n(0, $e179325634270afd$export$30b344bef3e55b67).defineCustomElement();\n\n\nexport {$e179325634270afd$export$30b344bef3e55b67 as WebShare};\n//# sourceMappingURL=web-share-defined.js.map\n","// @ts-check\n\n/**\n * Check if Web Share API is supported by the platform.\n *\n * @param {import('./web-share').ShareData} [options]\n * @returns {boolean} Returns `true` if Web Share API is supported; otherwise `false`.\n */\nfunction isWebShareSupported(options) {\n if (options !== null && typeof options === 'object') {\n return 'share' in navigator && 'canShare' in navigator && navigator.canShare(options);\n }\n\n return 'share' in navigator;\n}\n\nexport { isWebShareSupported };\n","Object.defineProperty({},\"WebShare\",{get:function(){return s},set:void 0,enumerable:!0,configurable:!0});let t=`\n :host {\n display: inline-block;\n }\n`,e=document.createElement(\"template\");e.innerHTML=`\n \n \n`;class s extends HTMLElement{#t;#e;#s=[];constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\",delegatesFocus:!0}).appendChild(e.content.cloneNode(!0)),this.#t=this.shadowRoot?.querySelector('slot[name=\"button\"]')||null,this.#e=this.#i()}static get observedAttributes(){return[\"disabled\"]}attributeChangedCallback(t,e,s){\"disabled\"===t&&e!==s&&this.#e&&(this.#e.toggleAttribute(\"disabled\",this.disabled),this.#e.setAttribute(\"aria-disabled\",this.disabled.toString()),this.#e.part&&this.#e.part.contains(\"button\")&&this.#e.part.toggle(\"button--disabled\",this.disabled))}connectedCallback(){this.#r(\"shareUrl\"),this.#r(\"shareTitle\"),this.#r(\"shareText\"),this.#r(\"shareFiles\"),this.#r(\"disabled\"),this.#t?.addEventListener(\"slotchange\",this.#a),this.#e?.addEventListener(\"click\",this.#n)}disconnectedCallback(){this.#t?.removeEventListener(\"slotchange\",this.#a),this.#e?.removeEventListener(\"click\",this.#n)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){this.toggleAttribute(\"disabled\",!!t)}get shareUrl(){return this.getAttribute(\"share-url\")||\"\"}set shareUrl(t){this.setAttribute(\"share-url\",t)}get shareTitle(){return this.getAttribute(\"share-title\")||\"\"}set shareTitle(t){this.setAttribute(\"share-title\",t)}get shareText(){return this.getAttribute(\"share-text\")||\"\"}set shareText(t){this.setAttribute(\"share-text\",t)}get shareFiles(){return this.#s}set shareFiles(t){Array.isArray(t)&&t.length>0&&(this.#s=t)}async share(){if(!this.disabled)try{let t={};this.shareUrl&&(t.url=this.shareUrl),this.shareTitle&&(t.title=this.shareTitle),this.shareText&&(t.text=this.shareText),Array.isArray(this.shareFiles)&&this.shareFiles.length>0&&navigator.canShare&&navigator.canShare({files:this.shareFiles})&&(t.files=this.shareFiles),await navigator.share(t),this.dispatchEvent(new CustomEvent(\"web-share:success\",{bubbles:!0,composed:!0,detail:{shareData:t}}))}catch(t){if(t instanceof Error&&\"AbortError\"===t.name){this.dispatchEvent(new CustomEvent(\"web-share:abort\",{bubbles:!0,composed:!0,detail:{error:t}}));return}this.dispatchEvent(new CustomEvent(\"web-share:error\",{bubbles:!0,composed:!0,detail:{error:t}}))}}#n=t=>{t.preventDefault(),this.disabled||this.share()};#a=t=>{t.target&&\"button\"===t.target.name&&(this.#e?.removeEventListener(\"click\",this.#n),this.#e=this.#i(),this.#e&&(this.#e.addEventListener(\"click\",this.#n),\"BUTTON\"===this.#e.nodeName||this.#e.hasAttribute(\"role\")||this.#e.setAttribute(\"role\",\"button\")))};#i(){return this.#t&&this.#t.assignedElements({flatten:!0}).find(t=>\"BUTTON\"===t.nodeName||\"button\"===t.getAttribute(\"slot\"))||null}#r(t){if(Object.prototype.hasOwnProperty.call(this,t)){let e=this[t];delete this[t],this[t]=e}}static defineCustomElement(t=\"web-share\"){\"undefined\"==typeof window||window.customElements.get(t)||window.customElements.define(t,s)}}s.defineCustomElement();export{s as WebShare};\n//# sourceMappingURL=web-share-defined.js.map\n","import { WebShare } from './web-share.js';\n\nWebShare.defineCustomElement();\n\nexport { WebShare };\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\n/**\n * Represents the data to share.\n *\n * @typedef {Object} ShareData\n * @property {string} [url] - The URL to share.\n * @property {string} [title] - The title to share.\n * @property {string} [text] - The text to share.\n * @property {File[]} [files] - The files to share.\n */\n\nconst styles = /* css */`\n :host {\n display: inline-block;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */ `\n \n \n`;\n\n/**\n * @summary A custom element that provides a button to share content.\n * @documentation https://github.com/georapbox/web-share-element\n *\n * @tagname web-share - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {boolean} disabled - Indicates whether the button is disabled.\n * @property {string} shareUrl - The URL to share.\n * @property {string} shareTitle - The title to share.\n * @property {string} shareText - The text to share.\n * @property {File[]} shareFiles - The files to share.\n *\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {string} share-url - Reflects the shareUrl property.\n * @attribute {string} share-title - Reflects the shareTitle property.\n * @attribute {string} share-text - Reflects the shareText property.\n *\n * @slot button - The button to share content.\n * @slot button-content - The content of the button to share content.\n *\n * @csspart button - The button to share content.\n * @csspart button--disabled - The button to share content when disabled.\n *\n * @event web-share:success - Fired when the share operation is successful.\n * @event web-share:abort - Fired when the share operation is aborted.\n * @event web-share:error - Fired when the share operation fails.\n *\n * @method defineCustomElement - Static method. Defines the custom element with the given name.\n * @method share - Instance method. Shares the shareable data taken from the element's properties.\n */\nclass WebShare extends HTMLElement {\n /** @type {Nullable} */\n #buttonSlot;\n\n /** @type {Nullable} */\n #buttonEl;\n\n /** @type {File[]} */\n #files = [];\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#buttonSlot = this.shadowRoot?.querySelector('slot[name=\"button\"]') || null;\n this.#buttonEl = this.#getButton();\n }\n\n static get observedAttributes() {\n return ['disabled'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'disabled' && oldValue !== newValue && this.#buttonEl) {\n this.#buttonEl.toggleAttribute('disabled', this.disabled);\n this.#buttonEl.setAttribute('aria-disabled', this.disabled.toString());\n\n if (this.#buttonEl.part && this.#buttonEl.part.contains('button')) {\n this.#buttonEl.part.toggle('button--disabled', this.disabled);\n }\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('shareUrl');\n this.#upgradeProperty('shareTitle');\n this.#upgradeProperty('shareText');\n this.#upgradeProperty('shareFiles');\n this.#upgradeProperty('disabled');\n\n this.#buttonSlot?.addEventListener('slotchange', this.#handleSlotChange);\n this.#buttonEl?.addEventListener('click', this.#handleClick);\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#buttonSlot?.removeEventListener('slotchange', this.#handleSlotChange);\n this.#buttonEl?.removeEventListener('click', this.#handleClick);\n }\n\n /**\n * @type {boolean} - Indicates whether the button is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value) {\n this.toggleAttribute('disabled', !!value);\n }\n\n /**\n * @type {string} - The URL to share.\n * @attribute share-url - Reflects the shareUrl property.\n */\n get shareUrl() {\n return this.getAttribute('share-url') || '';\n }\n\n set shareUrl(value) {\n this.setAttribute('share-url', value);\n }\n\n /**\n * @type {string} - The title to share.\n * @attribute share-title - Reflects the shareTitle property.\n */\n get shareTitle() {\n return this.getAttribute('share-title') || '';\n }\n\n set shareTitle(value) {\n this.setAttribute('share-title', value);\n }\n\n /**\n * @type {string} - The text to share.\n * @attribute share-text - Reflects the shareText property.\n */\n get shareText() {\n return this.getAttribute('share-text') || '';\n }\n\n set shareText(value) {\n this.setAttribute('share-text', value);\n }\n\n /**\n * @type {File[]} - The files to share.\n */\n get shareFiles() {\n return this.#files;\n }\n\n set shareFiles(value) {\n if (Array.isArray(value) && value.length > 0) {\n this.#files = value;\n }\n }\n\n /**\n * Shares the shareable data taken from the element's properties.\n *\n * @returns {Promise} - A promise that resolves when the share operation is complete.\n */\n async share() {\n if (this.disabled) {\n return;\n }\n\n try {\n /** @type {ShareData} */\n const shareData = {};\n\n if (this.shareUrl) {\n shareData.url = this.shareUrl;\n }\n\n if (this.shareTitle) {\n shareData.title = this.shareTitle;\n }\n\n if (this.shareText) {\n shareData.text = this.shareText;\n }\n\n if (\n Array.isArray(this.shareFiles)\n && this.shareFiles.length > 0\n && navigator.canShare\n && navigator.canShare({ files: this.shareFiles })\n ) {\n shareData.files = this.shareFiles;\n }\n\n await navigator.share(shareData);\n\n this.dispatchEvent(new CustomEvent('web-share:success', {\n bubbles: true,\n composed: true,\n detail: { shareData }\n }));\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n this.dispatchEvent(new CustomEvent('web-share:abort', {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n\n return;\n }\n\n this.dispatchEvent(new CustomEvent('web-share:error', {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n }\n\n /**\n * Handles the click event on the button.\n *\n * @param {any} evt - The event object.\n */\n #handleClick = evt => {\n evt.preventDefault();\n\n if (this.disabled) {\n return;\n }\n\n this.share();\n };\n\n /**\n * Handles the slotchange event on the button slot.\n *\n * @param {any} evt - The event object.\n */\n #handleSlotChange = evt => {\n if (evt.target && evt.target.name === 'button') {\n this.#buttonEl?.removeEventListener('click', this.#handleClick);\n this.#buttonEl = this.#getButton();\n\n if (this.#buttonEl) {\n this.#buttonEl.addEventListener('click', this.#handleClick);\n\n if (this.#buttonEl.nodeName !== 'BUTTON' && !this.#buttonEl.hasAttribute('role')) {\n this.#buttonEl.setAttribute('role', 'button');\n }\n }\n }\n };\n\n /**\n * Returns the button element from the button slot.\n *\n * @returns {Nullable} - The button element.\n */\n #getButton() {\n if (!this.#buttonSlot) {\n return null;\n }\n\n return this.#buttonSlot.assignedElements({ flatten: true }).find(el => {\n return el.nodeName === 'BUTTON' || el.getAttribute('slot') === 'button';\n }) || null;\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'shareUrl' | 'shareTitle' | 'shareText' | 'shareFiles' | 'disabled'} prop - The property name to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n static defineCustomElement(elementName = 'web-share') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, WebShare);\n }\n }\n}\n\nexport { WebShare };\n","Object.defineProperty({},\"CapturePhoto\",{get:function(){return n},set:void 0,enumerable:!0,configurable:!0});let t=(t,e,i)=>(Number.isNaN(e)&&(e=0),Number.isNaN(i)&&(i=0),Math.min(Math.max(t,Math.min(e,i)),Math.max(e,i))),e=\"capture-photo\",i=`\n :host {\n display: block;\n box-sizing: border-box;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none;\n }\n\n video {\n display: block;\n }\n\n #output:empty {\n display: none;\n }\n`,o=document.createElement(\"template\");o.innerHTML=`\n \n\n \n\n \n\n
\n \n \n \n\n \n\n \n
\n\n \n\n
\n`;class n extends HTMLElement{#t={};#e=null;#i=null;#o=null;#n=null;#a=null;#s=null;#r=null;#l=null;constructor(){super(),this.#t=this.getSupportedConstraints(),this.shadowRoot||this.attachShadow({mode:\"open\"}).appendChild(o.content.cloneNode(!0))}static get observedAttributes(){return[\"no-image\",\"facing-mode\",\"camera-resolution\",\"pan\",\"tilt\",\"zoom\"]}attributeChangedCallback(t,e,i){if(!this.isConnected)return;let o=this.getTrackCapabilities(),n=this.getTrackSettings();if(\"no-image\"===t&&e!==i&&this.#u(),\"facing-mode\"===t&&e!==i&&\"facingMode\"in this.#t){let t=[\"user\",\"environment\"].includes(this.facingMode||\"\");\"facingMode\"in n&&t&&(this.stopVideoStream(),this.startVideoStream())}if(\"camera-resolution\"===t&&e!==i&&\"string\"==typeof this.cameraResolution&&this.cameraResolution.trim().length>0){let[t=0,e=0]=this.cameraResolution.split(\"x\").map(t=>Number(t));if(t>0&&e>0&&\"width\"in o&&\"height\"in o){let i=!!(o.width?.min&&o.width?.max)&&t>=o?.width?.min&&t<=o?.width?.max,a=!!(o.height?.min&&o.height?.max)&&e>=o?.height?.min&&e<=o?.height?.max;\"width\"in n&&\"height\"in n&&i&&a&&(this.stopVideoStream(),this.startVideoStream())}}if(\"pan\"===t&&e!==i&&\"pan\"in this.#t){let t=!!(\"pan\"in o&&o.pan?.min&&o.pan?.max)&&this.pan>=o.pan.min&&this.pan<=o.pan.max;\"pan\"in n&&\"number\"==typeof this.pan&&t&&this.#h(\"pan\",this.pan)}if(\"tilt\"===t&&e!==i&&\"tilt\"in this.#t){let t=!!(\"tilt\"in o&&o.tilt?.min&&o.tilt?.max)&&this.tilt>=o.tilt.min&&this.tilt<=o.tilt.max;\"tilt\"in n&&\"number\"==typeof this.tilt&&t&&this.#h(\"tilt\",this.tilt)}if(\"zoom\"===t&&e!==i&&\"zoom\"in this.#t){let t=!!(\"zoom\"in o&&o.zoom?.min&&o.zoom?.max)&&this.zoom>=o.zoom.min&&this.zoom<=o.zoom.max;\"zoom\"in n&&\"number\"==typeof this.zoom&&t&&this.#h(\"zoom\",this.zoom)}}connectedCallback(){if(this.#d(\"autpoPlay\"),this.#d(\"noImage\"),this.#d(\"facingMode\"),this.#d(\"cameraResolution\"),this.#d(\"pan\"),this.#d(\"tilt\"),this.#d(\"zoom\"),this.#d(\"calculateFileSize\"),this.#i=this.shadowRoot?.querySelector(\"canvas\")||null,this.#o=this.shadowRoot?.getElementById(\"output\")||null,this.#n=this.shadowRoot?.querySelector(\"video\")||null,this.#a=this.shadowRoot?.querySelector('slot[name=\"capture-button\"]')||null,this.#s=this.#c(),this.#r=this.shadowRoot?.querySelector('slot[name=\"facing-mode-button\"]')||null,this.#l=this.#m(),this.#n?.addEventListener(\"loadedmetadata\",this.#p),this.#a?.addEventListener(\"slotchange\",this.#g),this.#s?.addEventListener(\"click\",this.#b),this.#r?.addEventListener(\"slotchange\",this.#f),this.#l?.addEventListener(\"click\",this.#v),!n.isSupported())return this.dispatchEvent(new CustomEvent(`${e}:error`,{bubbles:!0,composed:!0,detail:{error:{name:\"NotSupportedError\",message:\"Not supported\"}}}));this.autoPlay&&this.startVideoStream()}disconnectedCallback(){this.stopVideoStream(),this.#l?.removeEventListener(\"click\",this.#v),this.#s?.removeEventListener(\"click\",this.#b),this.#n?.removeEventListener(\"canplay\",this.#p),this.#a?.removeEventListener(\"slotchange\",this.#g),this.#r?.removeEventListener(\"slotchange\",this.#f)}get autoPlay(){return this.hasAttribute(\"auto-play\")}set autoPlay(t){this.toggleAttribute(\"auto-play\",!!t)}get noImage(){return this.hasAttribute(\"no-image\")}set noImage(t){this.toggleAttribute(\"no-image\",!!t)}get facingMode(){return this.getAttribute(\"facing-mode\")||\"user\"}set facingMode(t){this.setAttribute(\"facing-mode\",t)}get cameraResolution(){return this.getAttribute(\"camera-resolution\")||\"\"}set cameraResolution(t){this.setAttribute(\"camera-resolution\",t)}get pan(){return Number(this.getAttribute(\"pan\"))||0}set pan(t){this.setAttribute(\"pan\",null!=t?t.toString():t)}get tilt(){return Number(this.getAttribute(\"tilt\"))||0}set tilt(t){this.setAttribute(\"tilt\",null!=t?t.toString():t)}get zoom(){return Number(this.getAttribute(\"zoom\"))||1}set zoom(t){this.setAttribute(\"zoom\",null!=t?t.toString():t)}get loading(){return this.hasAttribute(\"loading\")}get calculateFileSize(){return this.hasAttribute(\"calculate-file-size\")}set calculateFileSize(t){this.toggleAttribute(\"calculate-file-size\",!!t)}#v=t=>{t.preventDefault(),this.loading||(this.facingMode=\"user\"!==this.facingMode&&this.facingMode?\"user\":\"environment\")};#b=t=>{t.preventDefault(),this.capture()};#p=t=>{let i=t.target;i.play().then(()=>{this.dispatchEvent(new CustomEvent(`${e}:video-play`,{bubbles:!0,composed:!0,detail:{video:i}}))}).catch(t=>{this.dispatchEvent(new CustomEvent(`${e}:error`,{bubbles:!0,composed:!0,detail:{error:t}}))}).finally(()=>{this.removeAttribute(\"loading\")})};#u(){this.#o&&Array.from(this.#o.childNodes).forEach(t=>t.remove())}#h(e,i){if(!this.#e||!e||!i)return;let[o]=this.#e.getVideoTracks(),n=this.getTrackCapabilities();e in this.getTrackSettings()&&o.applyConstraints({advanced:[{[e]:t(Number(i),n[e]?.min||1,n[e]?.max||1)}]})}#g=t=>{t.target?.name===\"capture-button\"&&(this.#s?.removeEventListener(\"click\",this.#b),this.#s=this.#c(),this.#s&&(this.#s.addEventListener(\"click\",this.#b),\"BUTTON\"===this.#s.nodeName||this.#s.hasAttribute(\"role\")||this.#s.setAttribute(\"role\",\"button\")))};#f=t=>{t.target?.name===\"facing-mode-button\"&&(this.#l?.removeEventListener(\"click\",this.#v),this.#l=this.#m(),this.#l&&(this.#l.addEventListener(\"click\",this.#v),\"BUTTON\"===this.#l.nodeName||this.#l.hasAttribute(\"role\")||this.#l.setAttribute(\"role\",\"button\")))};#m(){return this.#r&&this.#r.assignedElements({flatten:!0}).find(t=>\"BUTTON\"===t.nodeName||\"facing-mode-button\"===t.getAttribute(\"slot\"))||null}#c(){return this.#a&&this.#a.assignedElements({flatten:!0}).find(t=>\"BUTTON\"===t.nodeName||\"capture-button\"===t.getAttribute(\"slot\"))||null}#d(t){if(Object.prototype.hasOwnProperty.call(this,t)){let e=this[t];delete this[t],this[t]=e}}async startVideoStream(){if(!n.isSupported()||this.#e)return;this.setAttribute(\"loading\",\"\");let t={video:{facingMode:{ideal:this.facingMode||\"user\"},pan:!0,tilt:!0,zoom:!0},audio:!1};if(\"string\"==typeof this.cameraResolution&&this.cameraResolution.trim().length>0){let[e=0,i=0]=this.cameraResolution.split(\"x\").map(t=>Number(t));e>0&&i>0&&(t.video.width=e,t.video.height=i)}try{this.#e=await navigator.mediaDevices.getUserMedia(t),this.#n&&(this.#n.srcObject=this.#e),this.#h(\"pan\",this.pan),this.#h(\"tilt\",this.tilt),this.#h(\"zoom\",this.zoom);let e=this.getTrackSettings();\"facingMode\"in e&&this.#r&&(this.#r.hidden=!1)}catch(t){this.dispatchEvent(new CustomEvent(`${e}:error`,{bubbles:!0,composed:!0,detail:{error:t}}))}finally{this.removeAttribute(\"loading\")}}stopVideoStream(){if(!this.#n||!this.#e)return;let[t]=this.#e.getVideoTracks();t?.stop(),this.#n.srcObject=null,this.#e=null}async capture(){if(!this.loading&&this.#i&&this.#n)try{let t=this.#i.getContext(\"2d\"),i=this.#n.videoWidth,o=this.#n.videoHeight;this.#i.width=i,this.#i.height=o,t?.drawImage(this.#n,0,0,i,o);let n=this.#i.toDataURL(\"image/png\");if(\"string\"==typeof n&&n.includes(\"data:image\")){if(!this.noImage){let t=new Image;t.src=n,t.width=i,t.height=o,t.setAttribute(\"part\",\"output-image\"),this.#u(),this.#o?.appendChild(t)}let t={dataURI:n,width:i,height:o};if(this.calculateFileSize)try{let e=await fetch(n),i=(await e.blob()).size;i&&(t.size=i)}catch(t){}this.dispatchEvent(new CustomEvent(`${e}:success`,{bubbles:!0,composed:!0,detail:t}))}}catch(t){this.dispatchEvent(new CustomEvent(`${e}:error`,{bubbles:!0,composed:!0,detail:{error:t}}))}}getSupportedConstraints(){return n.isSupported()&&navigator.mediaDevices.getSupportedConstraints()||{}}getTrackCapabilities(){if(!this.#e)return{};let[t]=this.#e.getVideoTracks();return t&&\"function\"==typeof t.getCapabilities&&t.getCapabilities()||{}}getTrackSettings(){if(!this.#e)return{};let[t]=this.#e.getVideoTracks();return t&&\"function\"==typeof t.getSettings&&t.getSettings()||{}}static isSupported(){return!!navigator.mediaDevices?.getUserMedia}static defineCustomElement(t=e){\"undefined\"==typeof window||window.customElements.get(t)||window.customElements.define(t,n)}}n.defineCustomElement();export{n as CapturePhoto};\n//# sourceMappingURL=capture-photo-defined.js.map\n","function $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $c290816263f90981$exports = {};\n\n$parcel$export($c290816263f90981$exports, \"CapturePhoto\", function () { return $c290816263f90981$export$cc30a98fe3890794; });\n// @ts-check\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */ /**\n * @typedef {Object} ExtendedMediaTrackCapabilities\n * @property {ULongRange} [width] - The width of the video track.\n * @property {ULongRange} [height] - The height of the video track.\n * @property {ULongRange} [pan] - The pan level of the camera.\n * @property {ULongRange} [tilt] - The tilt level of the camera.\n * @property {ULongRange} [zoom] - The zoom level of the camera.\n * @property {MediaTrackCapabilities} [nativeMediaTrackCapabilities] - The native track capabilities.\n */ /**\n * @typedef {Object} ExtendedMediaTrackConstraints\n * @property {MediaTrackConstraints & {pan: boolean, tilt: boolean, zoom: boolean}} video - The video constraints.\n * @property {MediaTrackConstraints | boolean} audio - The audio constraints.\n */ // @ts-check\n/**\n * Clamps number within the inclusive `min` and `max` bounds,\n * making sure it does not go beyond them on either side.\n * If `min` is greater than `max` the parameters are swapped to support inverted ranges.\n *\n * @param {number} value - The number to clamp.\n * @param {number} lower - The lower bound.\n * @param {number} upper - The upper bound.\n * @throws {TypeError} - If one or more of the arguments passed is not a number.\n * @returns {number} - The clamped number.\n * @example\n *\n * clamp(10, -5, 5);\n * // => 5\n *\n * clamp(-10, -5, 5);\n * // => -5\n *\n * clamp(-15, 0, 100);\n * // => 0\n *\n * clamp(120, 0, 100);\n * // => 100\n *\n * clamp(-5, NaN, 5); // If any of lower or upper bound are `NaN`, they will be converted to `0`.\n * // => 0\n *\n * clamp(120, 100, 0); // The order of lower and upper bounds is reversed (100 > 0)\n * // => 100\n */ const $02ad8beec419df62$export$7d15b64cf5a3a4c4 = (value, lower, upper)=>{\n if (Number.isNaN(lower)) lower = 0;\n if (Number.isNaN(upper)) upper = 0;\n return Math.min(Math.max(value, Math.min(lower, upper)), Math.max(lower, upper));\n};\n\n\nconst $c290816263f90981$var$COMPONENT_NAME = \"capture-photo\";\nconst $c290816263f90981$var$styles = /* css */ `\n :host {\n display: block;\n box-sizing: border-box;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none;\n }\n\n video {\n display: block;\n }\n\n #output:empty {\n display: none;\n }\n`;\nconst $c290816263f90981$var$template = document.createElement(\"template\");\n$c290816263f90981$var$template.innerHTML = /* html */ `\n \n\n \n\n \n\n
\n \n \n \n\n \n\n \n
\n\n \n\n
\n`;\n/**\n * @summary A custom element that implements the MediaDevices.getUserMedia() method of the MediaDevices interface to capture a photo in the browser.\n * @documentation https://github.com/georapbox/capture-photo-element\n *\n * @tagname capture-photo This is the default tag name, unless overridden by the `defineCustomElement` method.\n * @extends HTMLElement\n *\n * @property {boolean} autoPlay - Whether or not to start the video stream automatically.\n * @property {boolean} noImage - Whether or not to show the captured image.\n * @property {string} facingMode - The facing mode of the camera.\n * @property {string} cameraResolution - The resolution of the camera.\n * @property {number} pan - The pan value of the camera.\n * @property {number} tilt - The tilt value of the camera.\n * @property {number} zoom - The zoom value of the camera.\n * @property {boolean} loading - Whether or not the video stream is loading.\n * @property {boolean} calculateFileSize - Whether or not to calculate the file size of the captured image.\n *\n * @atttribute {boolean} auto-play - Reflects the autoPlay property.\n * @atttribute {boolean} no-image - Reflects the noImage property.\n * @atttribute {string} facing-mode - Reflects the facingMode property.\n * @atttribute {string} camera-resolution - Reflects the cameraResolution property.\n * @atttribute {number} pan - Reflects the pan property.\n * @atttribute {number} tilt - Reflects the tilt property.\n * @atttribute {number} zoom - Reflects the zoom property.\n * @atttribute {boolean} loading - Reflects the loading property.\n * @atttribute {boolean} calculate-file-size - Reflects the calculateFileSize property.\n *\n * @slot capture-button - The capture button.\n * @slot capture-button-content - The capture button content.\n * @slot facing-mode-button - The facing mode button.\n * @slot facing-mode-button-content - The facing mode button content.\n * @slot actions - The actions container.\n * @slot - A default un-named slot to add content inside the component.\n *\n * @csspart video - The video element.\n * @csspart actions-container - The actions container.\n * @csspart capture-button - The capture button.\n * @csspart facing-mode-button - The facing mode button.\n * @csspart output-container - The output container.\n * @csspart output-image - The output image.\n *\n * @event capture-photo:video-play - Fires when the video stream is successfully playing.\n * @event capture-photo:success - Fires when the photo is successfully captured.\n * @event capture-photo:error - Fires when an error occurs.\n *\n * @method defineCustomElement - Static method. Defines the custom element with the given name.\n * @method isSupported - Static method. Checks if the MediaDevices.getUserMedia() method is supported.\n * @method startVideoStream - Instance method. Starts the video stream.\n * @method stopVideoStream - Instance method. Stops the video stream.\n * @method capture - Instance method. Captures a photo.\n * @method getSupportedConstraints - Instance method. Gets the supported constraints.\n * @method getTrackCapabilities - Instance method. Gets the track capabilities.\n * @method getTrackSettings - Instance method. Gets the track settings.\n */ class $c290816263f90981$export$cc30a98fe3890794 extends HTMLElement {\n /** @type {MediaTrackSupportedConstraints | {}}*/ #supportedConstraints = {};\n /** @type {Nullable} */ #stream = null;\n /** @type {Nullable} */ #canvasElement = null;\n /** @type {Nullable} */ #outputElement = null;\n /** @type {Nullable} */ #videoElement = null;\n /** @type {Nullable} */ #captureButtonSlot = null;\n /** @type {Nullable} */ #captureButton = null;\n /** @type {Nullable} */ #facingModeButtonSlot = null;\n /** @type {Nullable} */ #facingModeButton = null;\n constructor(){\n super();\n this.#supportedConstraints = this.getSupportedConstraints();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\"\n });\n shadowRoot.appendChild($c290816263f90981$var$template.content.cloneNode(true));\n }\n }\n static get observedAttributes() {\n return [\n \"no-image\",\n \"facing-mode\",\n \"camera-resolution\",\n \"pan\",\n \"tilt\",\n \"zoom\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (!this.isConnected) return;\n /** @type {ExtendedMediaTrackCapabilities} */ const trackCapabilities = this.getTrackCapabilities();\n const trackSettings = this.getTrackSettings();\n if (name === \"no-image\" && oldValue !== newValue) this.#emptyOutputElement();\n if (name === \"facing-mode\" && oldValue !== newValue && \"facingMode\" in this.#supportedConstraints) {\n const isValidFacingMode = [\n \"user\",\n \"environment\"\n ].includes(this.facingMode || \"\");\n if (\"facingMode\" in trackSettings && isValidFacingMode) {\n this.stopVideoStream();\n this.startVideoStream();\n }\n }\n if (name === \"camera-resolution\" && oldValue !== newValue) {\n if (typeof this.cameraResolution === \"string\" && this.cameraResolution.trim().length > 0) {\n const [width = 0, height = 0] = this.cameraResolution.split(\"x\").map((x)=>Number(x));\n if (width > 0 && height > 0 && \"width\" in trackCapabilities && \"height\" in trackCapabilities) {\n const widthInAllowedRange = trackCapabilities.width?.min && trackCapabilities.width?.max ? width >= trackCapabilities?.width?.min && width <= trackCapabilities?.width?.max : false;\n const heightInAllowedRange = trackCapabilities.height?.min && trackCapabilities.height?.max ? height >= trackCapabilities?.height?.min && height <= trackCapabilities?.height?.max : false;\n if (\"width\" in trackSettings && \"height\" in trackSettings && widthInAllowedRange && heightInAllowedRange) {\n this.stopVideoStream();\n this.startVideoStream();\n }\n }\n }\n }\n if (name === \"pan\" && oldValue !== newValue && \"pan\" in this.#supportedConstraints) {\n const panInAllowedRange = \"pan\" in trackCapabilities && trackCapabilities.pan?.min && trackCapabilities.pan?.max ? this.pan >= trackCapabilities.pan.min && this.pan <= trackCapabilities.pan.max : false;\n if (\"pan\" in trackSettings && typeof this.pan === \"number\" && panInAllowedRange) this.#applyPTZ(\"pan\", this.pan);\n }\n if (name === \"tilt\" && oldValue !== newValue && \"tilt\" in this.#supportedConstraints) {\n const tiltInAllowedRange = \"tilt\" in trackCapabilities && trackCapabilities.tilt?.min && trackCapabilities.tilt?.max ? this.tilt >= trackCapabilities.tilt.min && this.tilt <= trackCapabilities.tilt.max : false;\n if (\"tilt\" in trackSettings && typeof this.tilt === \"number\" && tiltInAllowedRange) this.#applyPTZ(\"tilt\", this.tilt);\n }\n if (name === \"zoom\" && oldValue !== newValue && \"zoom\" in this.#supportedConstraints) {\n const zoomInAllowedRange = \"zoom\" in trackCapabilities && trackCapabilities.zoom?.min && trackCapabilities.zoom?.max ? this.zoom >= trackCapabilities.zoom.min && this.zoom <= trackCapabilities.zoom.max : false;\n if (\"zoom\" in trackSettings && typeof this.zoom === \"number\" && zoomInAllowedRange) this.#applyPTZ(\"zoom\", this.zoom);\n }\n }\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"autpoPlay\");\n this.#upgradeProperty(\"noImage\");\n this.#upgradeProperty(\"facingMode\");\n this.#upgradeProperty(\"cameraResolution\");\n this.#upgradeProperty(\"pan\");\n this.#upgradeProperty(\"tilt\");\n this.#upgradeProperty(\"zoom\");\n this.#upgradeProperty(\"calculateFileSize\");\n this.#canvasElement = this.shadowRoot?.querySelector(\"canvas\") || null;\n this.#outputElement = this.shadowRoot?.getElementById(\"output\") || null;\n this.#videoElement = this.shadowRoot?.querySelector(\"video\") || null;\n this.#captureButtonSlot = this.shadowRoot?.querySelector('slot[name=\"capture-button\"]') || null;\n this.#captureButton = this.#getCaptureButton();\n this.#facingModeButtonSlot = this.shadowRoot?.querySelector('slot[name=\"facing-mode-button\"]') || null;\n this.#facingModeButton = this.#getFacingModeButton();\n this.#videoElement?.addEventListener(\"loadedmetadata\", this.#onVideoLoadedMetaData);\n this.#captureButtonSlot?.addEventListener(\"slotchange\", this.#onCaptureButtonSlotChange);\n this.#captureButton?.addEventListener(\"click\", this.#onCapturePhotoButtonClick);\n this.#facingModeButtonSlot?.addEventListener(\"slotchange\", this.#onFacingModeButtonSlotChange);\n this.#facingModeButton?.addEventListener(\"click\", this.#onFacingModeButtonClick);\n if (!$c290816263f90981$export$cc30a98fe3890794.isSupported()) return this.dispatchEvent(new CustomEvent(`${$c290816263f90981$var$COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: {\n name: \"NotSupportedError\",\n message: \"Not supported\"\n }\n }\n }));\n if (this.autoPlay) this.startVideoStream();\n }\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */ disconnectedCallback() {\n this.stopVideoStream();\n this.#facingModeButton?.removeEventListener(\"click\", this.#onFacingModeButtonClick);\n this.#captureButton?.removeEventListener(\"click\", this.#onCapturePhotoButtonClick);\n this.#videoElement?.removeEventListener(\"canplay\", this.#onVideoLoadedMetaData);\n this.#captureButtonSlot?.removeEventListener(\"slotchange\", this.#onCaptureButtonSlotChange);\n this.#facingModeButtonSlot?.removeEventListener(\"slotchange\", this.#onFacingModeButtonSlotChange);\n }\n /**\n * @type {boolean} autoPlay - Whether or not to start the video stream automatically.\n * @attribute auto-play - Reflects the autoPlay attribute.\n */ get autoPlay() {\n return this.hasAttribute(\"auto-play\");\n }\n set autoPlay(value) {\n this.toggleAttribute(\"auto-play\", !!value);\n }\n /**\n * @type {boolean} noImage - Whether or not to show the captured image.\n * @attribute no-image - Reflects the noImage attribute.\n */ get noImage() {\n return this.hasAttribute(\"no-image\");\n }\n set noImage(value) {\n this.toggleAttribute(\"no-image\", !!value);\n }\n /**\n * @type {string} facingMode - The facing mode of the camera.\n * @attribute facing-mode - Reflects the facingMode attribute.\n */ get facingMode() {\n return this.getAttribute(\"facing-mode\") || \"user\";\n }\n set facingMode(value) {\n this.setAttribute(\"facing-mode\", value);\n }\n /**\n * @type {string} cameraResolution - The resolution of the camera.\n * @attribute camera-resolution - Reflects the cameraResolution attribute.\n */ get cameraResolution() {\n return this.getAttribute(\"camera-resolution\") || \"\";\n }\n set cameraResolution(value) {\n this.setAttribute(\"camera-resolution\", value);\n }\n /**\n * @type {number} pan - The pan value of the camera.\n * @attribute pan - Reflects the pan attribute.\n */ get pan() {\n return Number(this.getAttribute(\"pan\")) || 0;\n }\n set pan(value) {\n this.setAttribute(\"pan\", value != null ? value.toString() : value);\n }\n /**\n * @type {number} tilt - The tilt value of the camera.\n * @attribute tilt - Reflects the tilt attribute.\n */ get tilt() {\n return Number(this.getAttribute(\"tilt\")) || 0;\n }\n set tilt(value) {\n this.setAttribute(\"tilt\", value != null ? value.toString() : value);\n }\n /**\n * @type {number} zoom - The zoom value of the camera.\n * @attribute zoom - Reflects the zoom attribute.\n */ get zoom() {\n return Number(this.getAttribute(\"zoom\")) || 1;\n }\n set zoom(value) {\n this.setAttribute(\"zoom\", value != null ? value.toString() : value);\n }\n /**\n * @type {boolean} loading - Whether or not the video stream is loading.\n * @attribute loading - Reflects the loading attribute.\n */ get loading() {\n return this.hasAttribute(\"loading\");\n }\n /**\n * @type {boolean} calculateFileSize - Whether or not to calculate the file size of the captured image.\n * @attribute calculate-file-size - Reflects the calculateFileSize attribute.\n */ get calculateFileSize() {\n return this.hasAttribute(\"calculate-file-size\");\n }\n set calculateFileSize(value) {\n this.toggleAttribute(\"calculate-file-size\", !!value);\n }\n /**\n * Handles the click event of the facing mode button.\n *\n * @param {*} evt - The click event.\n */ #onFacingModeButtonClick = (evt)=>{\n evt.preventDefault();\n if (this.loading) return;\n this.facingMode = this.facingMode === \"user\" || !this.facingMode ? \"environment\" : \"user\";\n };\n /**\n * Handles the click event of the capture button.\n *\n * @param {*} evt - The click event.\n */ #onCapturePhotoButtonClick = (evt)=>{\n evt.preventDefault();\n this.capture();\n };\n /**\n * Handles the loadedmetadata event of the video element.\n *\n * @param {*} evt - The loadedmetadata event.\n */ #onVideoLoadedMetaData = (evt)=>{\n const video = evt.target;\n video.play().then(()=>{\n this.dispatchEvent(new CustomEvent(`${$c290816263f90981$var$COMPONENT_NAME}:video-play`, {\n bubbles: true,\n composed: true,\n detail: {\n video: video\n }\n }));\n }).catch(/** @param {Error} error */ (error)=>{\n this.dispatchEvent(new CustomEvent(`${$c290816263f90981$var$COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }).finally(()=>{\n this.removeAttribute(\"loading\");\n });\n };\n /**\n * Removes all child nodes from the output element.\n */ #emptyOutputElement() {\n if (!this.#outputElement) return;\n Array.from(this.#outputElement.childNodes).forEach((node)=>node.remove());\n }\n /**\n * Applies the pan, tilt or zoom constraint.\n *\n * @param {'pan' | 'tilt' | 'zoom'} constraintName - The name of the constraint.\n * @param {number} constraintValue - The value of the constraint.\n */ #applyPTZ(constraintName, constraintValue) {\n if (!this.#stream || !constraintName || !constraintValue) return;\n const [track] = this.#stream.getVideoTracks();\n /** @type {ExtendedMediaTrackCapabilities} */ const trackCapabilities = this.getTrackCapabilities();\n const trackSettings = this.getTrackSettings();\n if (constraintName in trackSettings) track.applyConstraints({\n advanced: [\n {\n [constraintName]: (0, $02ad8beec419df62$export$7d15b64cf5a3a4c4)(Number(constraintValue), trackCapabilities[constraintName]?.min || 1, trackCapabilities[constraintName]?.max || 1)\n }\n ]\n });\n }\n /**\n * Handles the slotchange event of the capture button slot.\n *\n * @param {*} evt - The slotchange event.\n */ #onCaptureButtonSlotChange = (evt)=>{\n if (evt.target?.name === \"capture-button\") {\n this.#captureButton?.removeEventListener(\"click\", this.#onCapturePhotoButtonClick);\n this.#captureButton = this.#getCaptureButton();\n if (this.#captureButton) {\n this.#captureButton.addEventListener(\"click\", this.#onCapturePhotoButtonClick);\n if (this.#captureButton.nodeName !== \"BUTTON\" && !this.#captureButton.hasAttribute(\"role\")) this.#captureButton.setAttribute(\"role\", \"button\");\n }\n }\n };\n /**\n * Handles the slotchange event of the facing mode button slot.\n *\n * @param {*} evt - The slotchange event.\n */ #onFacingModeButtonSlotChange = (evt)=>{\n if (evt.target?.name === \"facing-mode-button\") {\n this.#facingModeButton?.removeEventListener(\"click\", this.#onFacingModeButtonClick);\n this.#facingModeButton = this.#getFacingModeButton();\n if (this.#facingModeButton) {\n this.#facingModeButton.addEventListener(\"click\", this.#onFacingModeButtonClick);\n if (this.#facingModeButton.nodeName !== \"BUTTON\" && !this.#facingModeButton.hasAttribute(\"role\")) this.#facingModeButton.setAttribute(\"role\", \"button\");\n }\n }\n };\n /**\n * Returns the facing mode button.\n *\n * @returns {Nullable}\n */ #getFacingModeButton() {\n if (!this.#facingModeButtonSlot) return null;\n return this.#facingModeButtonSlot.assignedElements({\n flatten: true\n }).find((el)=>{\n return el.nodeName === \"BUTTON\" || el.getAttribute(\"slot\") === \"facing-mode-button\";\n }) || null;\n }\n /**\n * Returns the capture button.\n *\n * @returns {Nullable}\n */ #getCaptureButton() {\n if (!this.#captureButtonSlot) return null;\n return this.#captureButtonSlot.assignedElements({\n flatten: true\n }).find((el)=>{\n return el.nodeName === \"BUTTON\" || el.getAttribute(\"slot\") === \"capture-button\";\n }) || null;\n }\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and\n * set a value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would\n * miss that property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'autpoPlay' | 'noImage' | 'facingMode' | 'cameraResolution' | 'pan' | 'tilt' | 'zoom' | 'calculateFileSize'} prop\n */ #upgradeProperty(prop) {\n /** @type {any} */ const instance = this;\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n /**\n * Starts the video stream.\n *\n * @returns Promise\n */ async startVideoStream() {\n if (!$c290816263f90981$export$cc30a98fe3890794.isSupported() || this.#stream) return;\n this.setAttribute(\"loading\", \"\");\n /** @type {ExtendedMediaTrackConstraints} */ const constraints = {\n video: {\n facingMode: {\n ideal: this.facingMode || \"user\"\n },\n pan: true,\n tilt: true,\n zoom: true\n },\n audio: false\n };\n if (typeof this.cameraResolution === \"string\" && this.cameraResolution.trim().length > 0) {\n const [width = 0, height = 0] = this.cameraResolution.split(\"x\").map((x)=>Number(x));\n if (width > 0 && height > 0) {\n constraints.video.width = width;\n constraints.video.height = height;\n }\n }\n try {\n this.#stream = await navigator.mediaDevices.getUserMedia(constraints);\n if (this.#videoElement) this.#videoElement.srcObject = this.#stream;\n this.#applyPTZ(\"pan\", this.pan);\n this.#applyPTZ(\"tilt\", this.tilt);\n this.#applyPTZ(\"zoom\", this.zoom);\n const trackSettings = this.getTrackSettings();\n if (\"facingMode\" in trackSettings && this.#facingModeButtonSlot) this.#facingModeButtonSlot.hidden = false;\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${$c290816263f90981$var$COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n } finally{\n this.removeAttribute(\"loading\");\n }\n }\n /**\n * Stops the video stream.\n */ stopVideoStream() {\n if (!this.#videoElement || !this.#stream) return;\n const [track] = this.#stream.getVideoTracks();\n track?.stop();\n this.#videoElement.srcObject = null;\n this.#stream = null;\n }\n /**\n * Captures a photo using the element's properties.\n *\n * @returns Promise\n */ async capture() {\n if (this.loading || !this.#canvasElement || !this.#videoElement) return;\n try {\n const ctx = this.#canvasElement.getContext(\"2d\");\n const width = this.#videoElement.videoWidth;\n const height = this.#videoElement.videoHeight;\n this.#canvasElement.width = width;\n this.#canvasElement.height = height;\n ctx?.drawImage(this.#videoElement, 0, 0, width, height);\n const dataURI = this.#canvasElement.toDataURL(\"image/png\");\n if (typeof dataURI === \"string\" && dataURI.includes(\"data:image\")) {\n if (!this.noImage) {\n const image = new Image();\n image.src = dataURI;\n image.width = width;\n image.height = height;\n image.setAttribute(\"part\", \"output-image\");\n this.#emptyOutputElement();\n this.#outputElement?.appendChild(image);\n }\n /** @type {{ dataURI: string, width: number, height: number, size?: number }} */ const eventDetail = {\n dataURI: dataURI,\n width: width,\n height: height\n };\n if (this.calculateFileSize) try {\n const file = await fetch(dataURI);\n const blob = await file.blob();\n const size = blob.size;\n if (size) eventDetail.size = size;\n } catch (err) {\n // Fail silently...\n }\n this.dispatchEvent(new CustomEvent(`${$c290816263f90981$var$COMPONENT_NAME}:success`, {\n bubbles: true,\n composed: true,\n detail: eventDetail\n }));\n }\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${$c290816263f90981$var$COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }\n }\n /**\n * Returns an object based on the `MediaTrackSupportedConstraints` dictionary,\n * whose member fields each specify one ofthe constrainable properties the user agent understands.\n *\n * @see https://developer.mozilla.org/docs/Web/API/MediaDevices/getSupportedConstraints\n * @returns {MediaTrackSupportedConstraints | {}}\n */ getSupportedConstraints() {\n if (!$c290816263f90981$export$cc30a98fe3890794.isSupported()) return {};\n return navigator.mediaDevices.getSupportedConstraints() || {};\n }\n /**\n * Returns a `MediaTrackCapabilities` object which specifies the values or range of values\n * which each constrainable property, based upon the platform and user agent.\n *\n * @see https://developer.mozilla.org/docs/Web/API/MediaStreamTrack/getCapabilities\n * @returns {MediaTrackCapabilities | {}}\n */ getTrackCapabilities() {\n if (!this.#stream) return {};\n const [track] = this.#stream.getVideoTracks();\n if (track && typeof track.getCapabilities === \"function\") return track.getCapabilities() || {};\n return {};\n }\n /**\n * Returns a `MediaTrackSettings` object containing the current values of each of\n * the constrainable properties for the current MediaStreamTrack.\n *\n * @see https://developer.mozilla.org/docs/Web/API/MediaStreamTrack/getSettings\n * @returns {MediaTrackSettings | {}}\n */ getTrackSettings() {\n if (!this.#stream) return {};\n const [track] = this.#stream.getVideoTracks();\n if (track && typeof track.getSettings === \"function\") return track.getSettings() || {};\n return {};\n }\n /**\n * Checks if the `MediaDevices.getUserMedia()` method is supported.\n *\n * @returns {boolean}\n */ static isSupported() {\n return Boolean(navigator.mediaDevices?.getUserMedia);\n }\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='capture-photo'] - The name of the custom element.\n * @example\n *\n * CapturePhoto.defineCustomElement('my-capture-photo');\n */ static defineCustomElement(elementName = $c290816263f90981$var$COMPONENT_NAME) {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $c290816263f90981$export$cc30a98fe3890794);\n }\n}\n\n\n(0, $c290816263f90981$export$cc30a98fe3890794).defineCustomElement();\n\n\nexport {$c290816263f90981$export$cc30a98fe3890794 as CapturePhoto};\n//# sourceMappingURL=capture-photo-defined.js.map\n","import { CapturePhoto } from './capture-photo.js';\n\nCapturePhoto.defineCustomElement();\n\nexport { CapturePhoto };\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\n/**\n * @typedef {Object} ExtendedMediaTrackCapabilities\n * @property {ULongRange} [width] - The width of the video track.\n * @property {ULongRange} [height] - The height of the video track.\n * @property {ULongRange} [pan] - The pan level of the camera.\n * @property {ULongRange} [tilt] - The tilt level of the camera.\n * @property {ULongRange} [zoom] - The zoom level of the camera.\n * @property {MediaTrackCapabilities} [nativeMediaTrackCapabilities] - The native track capabilities.\n */\n\n/**\n * @typedef {Object} ExtendedMediaTrackConstraints\n * @property {MediaTrackConstraints & {pan: boolean, tilt: boolean, zoom: boolean}} video - The video constraints.\n * @property {MediaTrackConstraints | boolean} audio - The audio constraints.\n */\n\nimport { clamp } from './utils/clamp.js';\n\nconst COMPONENT_NAME = 'capture-photo';\n\nconst styles = /* css */`\n :host {\n display: block;\n box-sizing: border-box;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none;\n }\n\n video {\n display: block;\n }\n\n #output:empty {\n display: none;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n \n\n \n\n
\n \n \n \n\n \n\n \n
\n\n \n\n
\n`;\n\n/**\n * @summary A custom element that implements the MediaDevices.getUserMedia() method of the MediaDevices interface to capture a photo in the browser.\n * @documentation https://github.com/georapbox/capture-photo-element\n *\n * @tagname capture-photo This is the default tag name, unless overridden by the `defineCustomElement` method.\n * @extends HTMLElement\n *\n * @property {boolean} autoPlay - Whether or not to start the video stream automatically.\n * @property {boolean} noImage - Whether or not to show the captured image.\n * @property {string} facingMode - The facing mode of the camera.\n * @property {string} cameraResolution - The resolution of the camera.\n * @property {number} pan - The pan value of the camera.\n * @property {number} tilt - The tilt value of the camera.\n * @property {number} zoom - The zoom value of the camera.\n * @property {boolean} loading - Whether or not the video stream is loading.\n * @property {boolean} calculateFileSize - Whether or not to calculate the file size of the captured image.\n *\n * @atttribute {boolean} auto-play - Reflects the autoPlay property.\n * @atttribute {boolean} no-image - Reflects the noImage property.\n * @atttribute {string} facing-mode - Reflects the facingMode property.\n * @atttribute {string} camera-resolution - Reflects the cameraResolution property.\n * @atttribute {number} pan - Reflects the pan property.\n * @atttribute {number} tilt - Reflects the tilt property.\n * @atttribute {number} zoom - Reflects the zoom property.\n * @atttribute {boolean} loading - Reflects the loading property.\n * @atttribute {boolean} calculate-file-size - Reflects the calculateFileSize property.\n *\n * @slot capture-button - The capture button.\n * @slot capture-button-content - The capture button content.\n * @slot facing-mode-button - The facing mode button.\n * @slot facing-mode-button-content - The facing mode button content.\n * @slot actions - The actions container.\n * @slot - A default un-named slot to add content inside the component.\n *\n * @csspart video - The video element.\n * @csspart actions-container - The actions container.\n * @csspart capture-button - The capture button.\n * @csspart facing-mode-button - The facing mode button.\n * @csspart output-container - The output container.\n * @csspart output-image - The output image.\n *\n * @event capture-photo:video-play - Fires when the video stream is successfully playing.\n * @event capture-photo:success - Fires when the photo is successfully captured.\n * @event capture-photo:error - Fires when an error occurs.\n *\n * @method defineCustomElement - Static method. Defines the custom element with the given name.\n * @method isSupported - Static method. Checks if the MediaDevices.getUserMedia() method is supported.\n * @method startVideoStream - Instance method. Starts the video stream.\n * @method stopVideoStream - Instance method. Stops the video stream.\n * @method capture - Instance method. Captures a photo.\n * @method getSupportedConstraints - Instance method. Gets the supported constraints.\n * @method getTrackCapabilities - Instance method. Gets the track capabilities.\n * @method getTrackSettings - Instance method. Gets the track settings.\n */\nclass CapturePhoto extends HTMLElement {\n /** @type {MediaTrackSupportedConstraints | {}}*/\n #supportedConstraints = {};\n\n /** @type {Nullable} */\n #stream = null;\n\n /** @type {Nullable} */\n #canvasElement = null;\n\n /** @type {Nullable} */\n #outputElement = null;\n\n /** @type {Nullable} */\n #videoElement = null;\n\n /** @type {Nullable} */\n #captureButtonSlot = null;\n\n /** @type {Nullable} */\n #captureButton = null;\n\n /** @type {Nullable} */\n #facingModeButtonSlot = null;\n\n /** @type {Nullable} */\n #facingModeButton = null;\n\n constructor() {\n super();\n\n this.#supportedConstraints = this.getSupportedConstraints();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n }\n\n static get observedAttributes() {\n return ['no-image', 'facing-mode', 'camera-resolution', 'pan', 'tilt', 'zoom'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (!this.isConnected) {\n return;\n }\n\n /** @type {ExtendedMediaTrackCapabilities} */\n const trackCapabilities = this.getTrackCapabilities();\n const trackSettings = this.getTrackSettings();\n\n if (name === 'no-image' && oldValue !== newValue) {\n this.#emptyOutputElement();\n }\n\n if (name === 'facing-mode' && oldValue !== newValue && 'facingMode' in this.#supportedConstraints) {\n const isValidFacingMode = ['user', 'environment'].includes(this.facingMode || '');\n\n if ('facingMode' in trackSettings && isValidFacingMode) {\n this.stopVideoStream();\n this.startVideoStream();\n }\n }\n\n if (name === 'camera-resolution' && oldValue !== newValue) {\n if (typeof this.cameraResolution === 'string' && this.cameraResolution.trim().length > 0) {\n const [width = 0, height = 0] = this.cameraResolution.split('x').map(x => Number(x));\n\n if (width > 0 && height > 0 && 'width' in trackCapabilities && 'height' in trackCapabilities) {\n const widthInAllowedRange = trackCapabilities.width?.min && trackCapabilities.width?.max\n ? width >= trackCapabilities?.width?.min && width <= trackCapabilities?.width?.max\n : false;\n\n const heightInAllowedRange = trackCapabilities.height?.min && trackCapabilities.height?.max\n ? height >= trackCapabilities?.height?.min && height <= trackCapabilities?.height?.max\n : false;\n\n if ('width' in trackSettings && 'height' in trackSettings && widthInAllowedRange && heightInAllowedRange) {\n this.stopVideoStream();\n this.startVideoStream();\n }\n }\n }\n }\n\n if (name === 'pan' && oldValue !== newValue && 'pan' in this.#supportedConstraints) {\n const panInAllowedRange = 'pan' in trackCapabilities && trackCapabilities.pan?.min && trackCapabilities.pan?.max\n ? this.pan >= trackCapabilities.pan.min && this.pan <= trackCapabilities.pan.max\n : false;\n\n if ('pan' in trackSettings && typeof this.pan === 'number' && panInAllowedRange) {\n this.#applyPTZ('pan', this.pan);\n }\n }\n\n if (name === 'tilt' && oldValue !== newValue && 'tilt' in this.#supportedConstraints) {\n const tiltInAllowedRange = 'tilt' in trackCapabilities && trackCapabilities.tilt?.min && trackCapabilities.tilt?.max\n ? this.tilt >= trackCapabilities.tilt.min && this.tilt <= trackCapabilities.tilt.max\n : false;\n\n if ('tilt' in trackSettings && typeof this.tilt === 'number' && tiltInAllowedRange) {\n this.#applyPTZ('tilt', this.tilt);\n }\n }\n\n if (name === 'zoom' && oldValue !== newValue && 'zoom' in this.#supportedConstraints) {\n const zoomInAllowedRange = 'zoom' in trackCapabilities && trackCapabilities.zoom?.min && trackCapabilities.zoom?.max\n ? this.zoom >= trackCapabilities.zoom.min && this.zoom <= trackCapabilities.zoom.max\n : false;\n\n if ('zoom' in trackSettings && typeof this.zoom === 'number' && zoomInAllowedRange) {\n this.#applyPTZ('zoom', this.zoom);\n }\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('autpoPlay');\n this.#upgradeProperty('noImage');\n this.#upgradeProperty('facingMode');\n this.#upgradeProperty('cameraResolution');\n this.#upgradeProperty('pan');\n this.#upgradeProperty('tilt');\n this.#upgradeProperty('zoom');\n this.#upgradeProperty('calculateFileSize');\n\n this.#canvasElement = this.shadowRoot?.querySelector('canvas') || null;\n this.#outputElement = this.shadowRoot?.getElementById('output') || null;\n this.#videoElement = this.shadowRoot?.querySelector('video') || null;\n this.#captureButtonSlot = this.shadowRoot?.querySelector('slot[name=\"capture-button\"]') || null;\n this.#captureButton = this.#getCaptureButton();\n this.#facingModeButtonSlot = this.shadowRoot?.querySelector('slot[name=\"facing-mode-button\"]') || null;\n this.#facingModeButton = this.#getFacingModeButton();\n\n this.#videoElement?.addEventListener('loadedmetadata', this.#onVideoLoadedMetaData);\n this.#captureButtonSlot?.addEventListener('slotchange', this.#onCaptureButtonSlotChange);\n this.#captureButton?.addEventListener('click', this.#onCapturePhotoButtonClick);\n this.#facingModeButtonSlot?.addEventListener('slotchange', this.#onFacingModeButtonSlotChange);\n this.#facingModeButton?.addEventListener('click', this.#onFacingModeButtonClick);\n\n if (!CapturePhoto.isSupported()) {\n return this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: {\n name: 'NotSupportedError',\n message: 'Not supported'\n }\n }\n }));\n }\n\n if (this.autoPlay) {\n this.startVideoStream();\n }\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.stopVideoStream();\n this.#facingModeButton?.removeEventListener('click', this.#onFacingModeButtonClick);\n this.#captureButton?.removeEventListener('click', this.#onCapturePhotoButtonClick);\n this.#videoElement?.removeEventListener('canplay', this.#onVideoLoadedMetaData);\n this.#captureButtonSlot?.removeEventListener('slotchange', this.#onCaptureButtonSlotChange);\n this.#facingModeButtonSlot?.removeEventListener('slotchange', this.#onFacingModeButtonSlotChange);\n }\n\n /**\n * @type {boolean} autoPlay - Whether or not to start the video stream automatically.\n * @attribute auto-play - Reflects the autoPlay attribute.\n */\n get autoPlay() {\n return this.hasAttribute('auto-play');\n }\n\n set autoPlay(value) {\n this.toggleAttribute('auto-play', !!value);\n }\n\n /**\n * @type {boolean} noImage - Whether or not to show the captured image.\n * @attribute no-image - Reflects the noImage attribute.\n */\n get noImage() {\n return this.hasAttribute('no-image');\n }\n\n set noImage(value) {\n this.toggleAttribute('no-image', !!value);\n }\n\n /**\n * @type {string} facingMode - The facing mode of the camera.\n * @attribute facing-mode - Reflects the facingMode attribute.\n */\n get facingMode() {\n return this.getAttribute('facing-mode') || 'user';\n }\n\n set facingMode(value) {\n this.setAttribute('facing-mode', value);\n }\n\n /**\n * @type {string} cameraResolution - The resolution of the camera.\n * @attribute camera-resolution - Reflects the cameraResolution attribute.\n */\n get cameraResolution() {\n return this.getAttribute('camera-resolution') || '';\n }\n\n set cameraResolution(value) {\n this.setAttribute('camera-resolution', value);\n }\n\n /**\n * @type {number} pan - The pan value of the camera.\n * @attribute pan - Reflects the pan attribute.\n */\n get pan() {\n return Number(this.getAttribute('pan')) || 0;\n }\n\n set pan(value) {\n this.setAttribute('pan', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} tilt - The tilt value of the camera.\n * @attribute tilt - Reflects the tilt attribute.\n */\n get tilt() {\n return Number(this.getAttribute('tilt')) || 0;\n }\n\n set tilt(value) {\n this.setAttribute('tilt', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} zoom - The zoom value of the camera.\n * @attribute zoom - Reflects the zoom attribute.\n */\n get zoom() {\n return Number(this.getAttribute('zoom')) || 1;\n }\n\n set zoom(value) {\n this.setAttribute('zoom', value != null ? value.toString() : value);\n }\n\n /**\n * @type {boolean} loading - Whether or not the video stream is loading.\n * @attribute loading - Reflects the loading attribute.\n */\n get loading() {\n return this.hasAttribute('loading');\n }\n\n /**\n * @type {boolean} calculateFileSize - Whether or not to calculate the file size of the captured image.\n * @attribute calculate-file-size - Reflects the calculateFileSize attribute.\n */\n get calculateFileSize() {\n return this.hasAttribute('calculate-file-size');\n }\n\n set calculateFileSize(value) {\n this.toggleAttribute('calculate-file-size', !!value);\n }\n\n /**\n * Handles the click event of the facing mode button.\n *\n * @param {*} evt - The click event.\n */\n #onFacingModeButtonClick = evt => {\n evt.preventDefault();\n\n if (this.loading) {\n return;\n }\n\n this.facingMode = this.facingMode === 'user' || !this.facingMode ? 'environment' : 'user';\n };\n\n /**\n * Handles the click event of the capture button.\n *\n * @param {*} evt - The click event.\n */\n #onCapturePhotoButtonClick = evt => {\n evt.preventDefault();\n this.capture();\n };\n\n /**\n * Handles the loadedmetadata event of the video element.\n *\n * @param {*} evt - The loadedmetadata event.\n */\n #onVideoLoadedMetaData = evt => {\n const video = evt.target;\n\n video.play().then(() => {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}:video-play`, {\n bubbles: true,\n composed: true,\n detail: { video }\n }));\n }).catch(/** @param {Error} error */error => {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }).finally(() => {\n this.removeAttribute('loading');\n });\n };\n\n /**\n * Removes all child nodes from the output element.\n */\n #emptyOutputElement() {\n if (!this.#outputElement) {\n return;\n }\n\n Array.from(this.#outputElement.childNodes).forEach(node => node.remove());\n }\n\n /**\n * Applies the pan, tilt or zoom constraint.\n *\n * @param {'pan' | 'tilt' | 'zoom'} constraintName - The name of the constraint.\n * @param {number} constraintValue - The value of the constraint.\n */\n #applyPTZ(constraintName, constraintValue) {\n if (!this.#stream || !constraintName || !constraintValue) {\n return;\n }\n\n const [track] = this.#stream.getVideoTracks();\n /** @type {ExtendedMediaTrackCapabilities} */\n const trackCapabilities = this.getTrackCapabilities();\n const trackSettings = this.getTrackSettings();\n\n if (constraintName in trackSettings) {\n track.applyConstraints({\n advanced: [{\n [constraintName]: clamp(Number(constraintValue), trackCapabilities[constraintName]?.min || 1, trackCapabilities[constraintName]?.max || 1)\n }]\n });\n }\n }\n\n /**\n * Handles the slotchange event of the capture button slot.\n *\n * @param {*} evt - The slotchange event.\n */\n #onCaptureButtonSlotChange = evt => {\n if (evt.target?.name === 'capture-button') {\n this.#captureButton?.removeEventListener('click', this.#onCapturePhotoButtonClick);\n this.#captureButton = this.#getCaptureButton();\n\n if (this.#captureButton) {\n this.#captureButton.addEventListener('click', this.#onCapturePhotoButtonClick);\n\n if (this.#captureButton.nodeName !== 'BUTTON' && !this.#captureButton.hasAttribute('role')) {\n this.#captureButton.setAttribute('role', 'button');\n }\n }\n }\n };\n\n /**\n * Handles the slotchange event of the facing mode button slot.\n *\n * @param {*} evt - The slotchange event.\n */\n #onFacingModeButtonSlotChange = evt => {\n if (evt.target?.name === 'facing-mode-button') {\n this.#facingModeButton?.removeEventListener('click', this.#onFacingModeButtonClick);\n this.#facingModeButton = this.#getFacingModeButton();\n\n if (this.#facingModeButton) {\n this.#facingModeButton.addEventListener('click', this.#onFacingModeButtonClick);\n\n if (this.#facingModeButton.nodeName !== 'BUTTON' && !this.#facingModeButton.hasAttribute('role')) {\n this.#facingModeButton.setAttribute('role', 'button');\n }\n }\n }\n };\n\n /**\n * Returns the facing mode button.\n *\n * @returns {Nullable}\n */\n #getFacingModeButton() {\n if (!this.#facingModeButtonSlot) {\n return null;\n }\n\n return this.#facingModeButtonSlot.assignedElements({ flatten: true }).find(el => {\n return el.nodeName === 'BUTTON' || el.getAttribute('slot') === 'facing-mode-button';\n }) || null;\n }\n\n /**\n * Returns the capture button.\n *\n * @returns {Nullable}\n */\n #getCaptureButton() {\n if (!this.#captureButtonSlot) {\n return null;\n }\n\n return this.#captureButtonSlot.assignedElements({ flatten: true }).find(el => {\n return el.nodeName === 'BUTTON' || el.getAttribute('slot') === 'capture-button';\n }) || null;\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and\n * set a value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would\n * miss that property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'autpoPlay' | 'noImage' | 'facingMode' | 'cameraResolution' | 'pan' | 'tilt' | 'zoom' | 'calculateFileSize'} prop\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Starts the video stream.\n *\n * @returns Promise\n */\n async startVideoStream() {\n if (!CapturePhoto.isSupported() || this.#stream) {\n return;\n }\n\n this.setAttribute('loading', '');\n\n /** @type {ExtendedMediaTrackConstraints} */\n const constraints = {\n video: {\n facingMode: {\n ideal: this.facingMode || 'user'\n },\n pan: true,\n tilt: true,\n zoom: true\n },\n audio: false\n };\n\n if (typeof this.cameraResolution === 'string' && this.cameraResolution.trim().length > 0) {\n const [width = 0, height = 0] = this.cameraResolution.split('x').map(x => Number(x));\n\n if (width > 0 && height > 0) {\n constraints.video.width = width;\n constraints.video.height = height;\n }\n }\n\n try {\n this.#stream = await navigator.mediaDevices.getUserMedia(constraints);\n\n if (this.#videoElement) {\n this.#videoElement.srcObject = this.#stream;\n }\n\n this.#applyPTZ('pan', this.pan);\n this.#applyPTZ('tilt', this.tilt);\n this.#applyPTZ('zoom', this.zoom);\n\n const trackSettings = this.getTrackSettings();\n\n if ('facingMode' in trackSettings && this.#facingModeButtonSlot) {\n this.#facingModeButtonSlot.hidden = false;\n }\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n } finally {\n this.removeAttribute('loading');\n }\n }\n\n /**\n * Stops the video stream.\n */\n stopVideoStream() {\n if (!this.#videoElement || !this.#stream) {\n return;\n }\n\n const [track] = this.#stream.getVideoTracks();\n\n track?.stop();\n this.#videoElement.srcObject = null;\n this.#stream = null;\n }\n\n /**\n * Captures a photo using the element's properties.\n *\n * @returns Promise\n */\n async capture() {\n if (this.loading || !this.#canvasElement || !this.#videoElement) {\n return;\n }\n\n try {\n const ctx = this.#canvasElement.getContext('2d');\n const width = this.#videoElement.videoWidth;\n const height = this.#videoElement.videoHeight;\n this.#canvasElement.width = width;\n this.#canvasElement.height = height;\n ctx?.drawImage(this.#videoElement, 0, 0, width, height);\n const dataURI = this.#canvasElement.toDataURL('image/png');\n\n if (typeof dataURI === 'string' && dataURI.includes('data:image')) {\n if (!this.noImage) {\n const image = new Image();\n image.src = dataURI;\n image.width = width;\n image.height = height;\n image.setAttribute('part', 'output-image');\n this.#emptyOutputElement();\n this.#outputElement?.appendChild(image);\n }\n\n /** @type {{ dataURI: string, width: number, height: number, size?: number }} */\n const eventDetail = { dataURI, width, height };\n\n if (this.calculateFileSize) {\n try {\n const file = await fetch(dataURI);\n const blob = await file.blob();\n const size = blob.size;\n\n if (size) {\n eventDetail.size = size;\n }\n } catch (err) {\n // Fail silently...\n }\n }\n\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}:success`, {\n bubbles: true,\n composed: true,\n detail: eventDetail\n }));\n }\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n }\n\n /**\n * Returns an object based on the `MediaTrackSupportedConstraints` dictionary,\n * whose member fields each specify one ofthe constrainable properties the user agent understands.\n *\n * @see https://developer.mozilla.org/docs/Web/API/MediaDevices/getSupportedConstraints\n * @returns {MediaTrackSupportedConstraints | {}}\n */\n getSupportedConstraints() {\n if (!CapturePhoto.isSupported()) {\n return {};\n }\n\n return navigator.mediaDevices.getSupportedConstraints() || {};\n }\n\n /**\n * Returns a `MediaTrackCapabilities` object which specifies the values or range of values\n * which each constrainable property, based upon the platform and user agent.\n *\n * @see https://developer.mozilla.org/docs/Web/API/MediaStreamTrack/getCapabilities\n * @returns {MediaTrackCapabilities | {}}\n */\n getTrackCapabilities() {\n if (!this.#stream) {\n return {};\n }\n\n const [track] = this.#stream.getVideoTracks();\n\n if (track && typeof track.getCapabilities === 'function') {\n return track.getCapabilities() || {};\n }\n\n return {};\n }\n\n /**\n * Returns a `MediaTrackSettings` object containing the current values of each of\n * the constrainable properties for the current MediaStreamTrack.\n *\n * @see https://developer.mozilla.org/docs/Web/API/MediaStreamTrack/getSettings\n * @returns {MediaTrackSettings | {}}\n */\n getTrackSettings() {\n if (!this.#stream) {\n return {};\n }\n\n const [track] = this.#stream.getVideoTracks();\n\n if (track && typeof track.getSettings === 'function') {\n return track.getSettings() || {};\n }\n\n return {};\n }\n\n /**\n * Checks if the `MediaDevices.getUserMedia()` method is supported.\n *\n * @returns {boolean}\n */\n static isSupported() {\n return Boolean(navigator.mediaDevices?.getUserMedia);\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='capture-photo'] - The name of the custom element.\n * @example\n *\n * CapturePhoto.defineCustomElement('my-capture-photo');\n */\n static defineCustomElement(elementName = COMPONENT_NAME) {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, CapturePhoto);\n }\n }\n}\n\nexport { CapturePhoto };\n","// @ts-check\n\n/**\n * Clamps number within the inclusive `min` and `max` bounds,\n * making sure it does not go beyond them on either side.\n * If `min` is greater than `max` the parameters are swapped to support inverted ranges.\n *\n * @param {number} value - The number to clamp.\n * @param {number} lower - The lower bound.\n * @param {number} upper - The upper bound.\n * @throws {TypeError} - If one or more of the arguments passed is not a number.\n * @returns {number} - The clamped number.\n * @example\n *\n * clamp(10, -5, 5);\n * // => 5\n *\n * clamp(-10, -5, 5);\n * // => -5\n *\n * clamp(-15, 0, 100);\n * // => 0\n *\n * clamp(120, 0, 100);\n * // => 100\n *\n * clamp(-5, NaN, 5); // If any of lower or upper bound are `NaN`, they will be converted to `0`.\n * // => 0\n *\n * clamp(120, 100, 0); // The order of lower and upper bounds is reversed (100 > 0)\n * // => 100\n */\nexport const clamp = (value, lower, upper) => {\n if (Number.isNaN(lower)) {\n lower = 0;\n }\n\n if (Number.isNaN(upper)) {\n upper = 0;\n }\n\n return Math.min(Math.max(value, Math.min(lower, upper)), Math.max(lower, upper));\n};\n","Object.defineProperty({},\"ModalElement\",{get:function(){return o},set:void 0,enumerable:!0,configurable:!0});let e=document.createElement(\"template\"),t=/* css */`\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n --dialog-placement-margin: calc((2em + 6px) / 2);\n\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n /* Dialog placement */\n :host(:not([fullscreen])[placement=\"top-start\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-center\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-end\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center-start\"]) .dialog {\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center\"]) .dialog {\n margin: auto;\n }\n\n :host(:not([fullscreen])[placement=\"center-end\"]) .dialog {\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-start\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-center\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-end\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n /* Dialog animations */\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: 300ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: end;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;e.innerHTML=/* html */`\n \n\n \n
\n
\n \n\n
\n \n
\n
\n\n \n\n
\n \n
\n
\n
\n`;/**\n * @summary A custom element that renders a modal dialog.\n * @documentation https://github.com/georapbox/modal-element\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines whether the modal is open or not.\n * @property {boolean} staticBackdrop - Determines whether the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines whether the modal should have a header or not.\n * @property {boolean} noAnimations - Determines whether the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines whether the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines whether the modal should be fullscreen or not.\n * @property {boolean} preserveOverflow - Determines whether the overflow of the body should be preserved when the modal is open.\n * @property {string} placement - Determines the placement of the modal.\n * @property {string} closeLabel - The label of the default close button, used as the aria-label attribute of the close button.\n *\n * @attribute {boolean} open - Reflects the open property.\n * @attribute {boolean} static-backdrop - Reflects the staticBackdrop property.\n * @attribute {boolean} no-header - Reflects the noHeader property.\n * @attribute {boolean} no-animations - Reflects the noAnimations property.\n * @attribute {boolean} no-close-button - Reflects the noCloseButton property.\n * @attribute {boolean} fullscreen - Reflects the fullscreen property.\n * @attribute {boolean} preserve-overflow - Reflects the preserveOverflow property.\n * @attribute {string} placement - Reflects the placement property.\n * @attribute {string} close-label - Reflects the closeLabel property.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n */class o extends HTMLElement{/** @type {Nullable} */#e=null;/** @type {Nullable} */#t=null;/** @type {Nullable} */#o=null;/** @type {ReturnType | undefined} */#l=void 0;constructor(){if(super(),!this.shadowRoot){let t=this.attachShadow({mode:\"open\"});t.appendChild(e.content.cloneNode(!0))}this.shadowRoot&&(this.#e=this.shadowRoot.querySelector(\"dialog\"),this.#t=this.shadowRoot.querySelector('slot[name=\"footer\"]'),this.#o=this.shadowRoot.querySelector('slot[name=\"close\"]'))}static get observedAttributes(){return[\"open\",\"no-header\",\"no-animations\",\"no-close-button\",\"close-label\"]}/**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */attributeChangedCallback(e,t,o){if(null!==this.#e){if(\"open\"===e&&t!==o&&(this.open?(this.#e.showModal(),this.dispatchEvent(new CustomEvent(\"me-open\",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow=\"hidden\")):this.#e.close()),\"no-header\"===e&&t!==o){/** @type {Nullable} */let e=this.#e.querySelector(\".dialog__header\");null!==e&&(e.hidden=this.noHeader)}if(\"no-animations\"===e&&t!==o&&this.#e.classList.toggle(\"dialog--no-animations\",this.noAnimations),\"no-close-button\"===e&&t!==o){/** @type {Nullable} */let e=this.#e.querySelector(\".dialog__close\");null!==e&&(e.hidden=this.noCloseButton)}\"close-label\"===e&&t!==o&&this.#a()}}/**\n * Lifecycle method that is called when the element is added to the DOM.\n */connectedCallback(){this.#i(\"open\"),this.#i(\"staticBackdrop\"),this.#i(\"noHeader\"),this.#i(\"noAnimations\"),this.#i(\"noCloseButton\"),this.#i(\"fullscreen\"),this.#i(\"preserveOverflow\"),this.#i(\"placement\"),this.#i(\"closeLabel\"),this.#e?.addEventListener(\"click\",this.#n),this.#e?.addEventListener(\"close\",this.#r),this.#e?.addEventListener(\"cancel\",this.#s),this.#e?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\",this.#d),this.#t?.addEventListener(\"slotchange\",this.#c),this.#o?.addEventListener(\"slotchange\",this.#h)}/**\n * Lifecycle method that is called when the element is removed from the DOM.\n */disconnectedCallback(){this.#l&&clearTimeout(this.#l),this.#e?.addEventListener(\"click\",this.#n),this.#e?.removeEventListener(\"close\",this.#r),this.#e?.removeEventListener(\"cancel\",this.#s),this.#e?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\",this.#d),this.#t?.removeEventListener(\"slotchange\",this.#c),this.#o?.removeEventListener(\"slotchange\",this.#h)}/**\n * Deternimes if the modal is open or not.\n *\n * @type {boolean} - True if the modal is open, otherwise false.\n * @default false\n * @attribute open - Reflects the open property.\n */get open(){return this.hasAttribute(\"open\")}set open(e){this.toggleAttribute(\"open\",!!e)}/**\n * Determines whether the modal should close when the backdrop is clicked.\n *\n * @type {boolean} - True if the modal should close when the backdrop is clicked, otherwise false.\n * @default false\n * @attribute static-backdrop - Reflects the staticBackdrop property.\n */get staticBackdrop(){return this.hasAttribute(\"static-backdrop\")}set staticBackdrop(e){this.toggleAttribute(\"static-backdrop\",!!e)}/**\n * Determines whether the modal should have a header or not.\n *\n * @type {boolean} - True if the modal should have a header, otherwise false.\n * @default false\n * @attribute no-header - Reflects the noHeader property.\n */get noHeader(){return this.hasAttribute(\"no-header\")}set noHeader(e){this.toggleAttribute(\"no-header\",!!e)}/**\n * Determines whether the modal should have animations or not when opening and closing.\n *\n * @type {boolean} - True if the modal should have animations, otherwise false.\n * @default false\n * @attribute no-animations - Reflects the noAnimations property.\n */get noAnimations(){return this.hasAttribute(\"no-animations\")}set noAnimations(e){this.toggleAttribute(\"no-animations\",!!e)}/**\n * Determines whether the modal should have a default close button or not.\n *\n * @type {boolean} - True if the modal should have a close button, otherwise false.\n * @default false\n * @attribute no-close-button - Reflects the noCloseButton property.\n */get noCloseButton(){return this.hasAttribute(\"no-close-button\")}set noCloseButton(e){this.toggleAttribute(\"no-close-button\",!!e)}/**\n * Determines whether the modal should be fullscreen or not.\n *\n * @type {boolean} - True if the modal should be fullscreen, otherwise false.\n * @default false\n * @attribute fullscreen - Reflects the fullscreen property.\n */get fullscreen(){return this.hasAttribute(\"fullscreen\")}set fullscreen(e){this.toggleAttribute(\"fullscreen\",!!e)}/**\n * Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @type {boolean} - True if the overflow of the body should be preserved, otherwise false.\n * @default false\n * @attribute preserve-overflow - Reflects the preserveOverflow property.\n */get preserveOverflow(){return this.hasAttribute(\"preserve-overflow\")}set preserveOverflow(e){this.toggleAttribute(\"preserve-overflow\",!!e)}/**\n * Determines the placement of the modal.\n * Possible values are 'top-start', 'top-center', 'top-end', 'center-start', 'center', 'center-end', 'bottom-start', 'bottom-center', 'bottom-end'.\n *\n * @type {string}\n * @default 'center'\n * @attribute placement - Reflects the placement property.\n */get placement(){return this.getAttribute(\"placement\")||\"center\"}set placement(e){this.setAttribute(\"placement\",null!=e?e.toString():e)}/**\n * The label of the default close button, used as the aria-label attribute of the close button.\n * If user provides text content for the close button using the `close` slot, this property is ignored and the aria-label attribute is removed.\n *\n * @type {string}\n * @default 'Close'\n * @attribute close-label - Reflects the closeLabel property.\n */get closeLabel(){return this.getAttribute(\"close-label\")||\"Close\"}set closeLabel(e){this.setAttribute(\"close-label\",null!=e?e.toString():e)}/**\n * Updates the aria-label attribute of the close button.\n * If the slot for the close button has text content, the aria-label attribute is removed to allow the text content to be used as the label.\n * Otherwise, the aria-label attribute is set to the `closeLabel` property.\n *\n * @returns\n */#a(){if(null===this.#e)return;let e=this.#e.querySelector(\".dialog__close\");if(null===e)return;let t=this.#o?.assignedElements()||[],o=t?.some(e=>e.textContent?.replace(/\\s/g,\"\")!==\"\");o?e.removeAttribute(\"aria-label\"):e.setAttribute(\"aria-label\",this.closeLabel)}/**\n * Applies a pulse effect on the dialog.\n */#g(){this.#l||(this.#e?.classList.add(\"dialog--pulse\"),this.#l=setTimeout(()=>{this.#e?.classList.remove(\"dialog--pulse\"),clearTimeout(this.#l),this.#l=void 0},300))}/**\n * Handles the close event of the dialog.\n */#r=()=>{// This is required because the dialog element does not reset\n// the open property when the dialog is closed by the user.\nthis.open=!1,this.dispatchEvent(new CustomEvent(\"me-close\",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow=\"\")};/**\n * Handles the cancel event of the dialog.\n * This event is fired when the user presses the escape key.\n *\n * @param {Event} evt - The cancel event.\n */#s=e=>{let t=this.#m(\"escape-key\");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#g())};/**\n * Handles the click event of the close button.\n *\n * @param {Event} evt - The click event.\n */#d=e=>{let t=this.#m(\"close-button\");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#g())};/**\n * Handles the click event of the dialog.\n *\n * @param {MouseEvent} evt - The click event.\n */#n=e=>{let t=e.target,o=e.currentTarget;// Close the dialog when the backdrop is clicked.\nif(t===o){let e=this.#m(\"backdrop-click\");this.dispatchEvent(e),e.defaultPrevented||this.staticBackdrop?this.noAnimations||this.#g():this.hide()}// Close the dialog when external invoker is clicked.\nif(t instanceof HTMLElement&&null!==t.closest(\"[data-me-close]\")){let e=this.#m(\"external-invoker\");this.dispatchEvent(e),e.defaultPrevented?this.noAnimations||this.#g():this.hide()}};/**\n * Handles the slotchange event of the footer slot.\n */#c=()=>{if(null===this.#e)return;/** @type {Nullable} */let e=this.#e.querySelector(\".dialog__footer\");if(null===e)return;let t=this.#t?.assignedNodes(),o=!!t&&t.length>0;e.hidden=!o};/**\n * Handles the slotchange event of the close slot.\n */#h=()=>{this.#a()};/**\n * Creates a request close event.\n *\n * @param {CloseRequestReason} reason - The reason that the modal is about to close.\n */#m(e){return new CustomEvent(\"me-request-close\",{bubbles:!0,composed:!0,cancelable:!0,detail:{reason:e,element:this}})}/**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'open' | 'staticBackdrop' | 'noHeader' | 'noAnimations' | 'noCloseButton' | 'fullscreen' | 'preserveOverflow' | 'placement' | 'closeLabel'} prop - The property to upgrade.\n */#i(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}/**\n * Opens the modal if it is closed, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.show();\n */show(){this.open||(this.open=!0)}/**\n * Closes the modal if it is open, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.hide();\n */hide(){this.open&&(this.open=!1)}/**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='modal-element']\n * @example\n * ModalElement.defineCustomElement('my-modal');\n */static defineCustomElement(e=\"modal-element\"){\"undefined\"==typeof window||window.customElements.get(e)||window.customElements.define(e,o)}}o.defineCustomElement();export{o as ModalElement};//# sourceMappingURL=modal-element-defined.js.map\n\n//# sourceMappingURL=modal-element-defined.js.map\n","function $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $180b6dcf923bafc7$exports = {};\n\n$parcel$export($180b6dcf923bafc7$exports, \"ModalElement\", function () { return $180b6dcf923bafc7$export$32589115725b904b; });\n// @ts-check\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */ /**\n * Available values for the request close reason.\n *\n * @typedef {'close-button' | 'escape-key' | 'backdrop-click' | 'external-invoker'} CloseRequestReason\n */ const $180b6dcf923bafc7$var$PULSE_ANIMATION_DURATION = 300; // milliseconds\nconst $180b6dcf923bafc7$var$template = document.createElement(\"template\");\nconst $180b6dcf923bafc7$var$styles = /* css */ `\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n --dialog-placement-margin: calc((2em + 6px) / 2);\n\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n /* Dialog placement */\n :host(:not([fullscreen])[placement=\"top-start\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-center\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-end\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center-start\"]) .dialog {\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center\"]) .dialog {\n margin: auto;\n }\n\n :host(:not([fullscreen])[placement=\"center-end\"]) .dialog {\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-start\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-center\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-end\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n /* Dialog animations */\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: ${$180b6dcf923bafc7$var$PULSE_ANIMATION_DURATION}ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: end;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n$180b6dcf923bafc7$var$template.innerHTML = /* html */ `\n \n\n \n
\n
\n \n\n
\n \n
\n
\n\n \n\n
\n \n
\n
\n
\n`;\n/**\n * @summary A custom element that renders a modal dialog.\n * @documentation https://github.com/georapbox/modal-element\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines whether the modal is open or not.\n * @property {boolean} staticBackdrop - Determines whether the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines whether the modal should have a header or not.\n * @property {boolean} noAnimations - Determines whether the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines whether the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines whether the modal should be fullscreen or not.\n * @property {boolean} preserveOverflow - Determines whether the overflow of the body should be preserved when the modal is open.\n * @property {string} placement - Determines the placement of the modal.\n * @property {string} closeLabel - The label of the default close button, used as the aria-label attribute of the close button.\n *\n * @attribute {boolean} open - Reflects the open property.\n * @attribute {boolean} static-backdrop - Reflects the staticBackdrop property.\n * @attribute {boolean} no-header - Reflects the noHeader property.\n * @attribute {boolean} no-animations - Reflects the noAnimations property.\n * @attribute {boolean} no-close-button - Reflects the noCloseButton property.\n * @attribute {boolean} fullscreen - Reflects the fullscreen property.\n * @attribute {boolean} preserve-overflow - Reflects the preserveOverflow property.\n * @attribute {string} placement - Reflects the placement property.\n * @attribute {string} close-label - Reflects the closeLabel property.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n */ class $180b6dcf923bafc7$export$32589115725b904b extends HTMLElement {\n /** @type {Nullable} */ #dialogEl = null;\n /** @type {Nullable} */ #footerSlotEl = null;\n /** @type {Nullable} */ #closeSlotEl = null;\n /** @type {ReturnType | undefined} */ #pulseAnimationTimeout = void 0;\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\"\n });\n shadowRoot.appendChild($180b6dcf923bafc7$var$template.content.cloneNode(true));\n }\n if (this.shadowRoot) {\n this.#dialogEl = this.shadowRoot.querySelector(\"dialog\");\n this.#footerSlotEl = this.shadowRoot.querySelector('slot[name=\"footer\"]');\n this.#closeSlotEl = this.shadowRoot.querySelector('slot[name=\"close\"]');\n }\n }\n static get observedAttributes() {\n return [\n \"open\",\n \"no-header\",\n \"no-animations\",\n \"no-close-button\",\n \"close-label\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (this.#dialogEl === null) return;\n if (name === \"open\" && oldValue !== newValue) {\n if (this.open) {\n this.#dialogEl.showModal();\n this.dispatchEvent(new CustomEvent(\"me-open\", {\n bubbles: true,\n composed: true,\n detail: {\n element: this\n }\n }));\n if (document.body && !this.preserveOverflow) document.body.style.overflow = \"hidden\";\n } else this.#dialogEl.close();\n }\n if (name === \"no-header\" && oldValue !== newValue) {\n /** @type {Nullable} */ const headerEl = this.#dialogEl.querySelector(\".dialog__header\");\n if (headerEl !== null) headerEl.hidden = this.noHeader;\n }\n if (name === \"no-animations\" && oldValue !== newValue) this.#dialogEl.classList.toggle(\"dialog--no-animations\", this.noAnimations);\n if (name === \"no-close-button\" && oldValue !== newValue) {\n /** @type {Nullable} */ const closeBtnEl = this.#dialogEl.querySelector(\".dialog__close\");\n if (closeBtnEl !== null) closeBtnEl.hidden = this.noCloseButton;\n }\n if (name === \"close-label\" && oldValue !== newValue) this.#updateCloseLabel();\n }\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"open\");\n this.#upgradeProperty(\"staticBackdrop\");\n this.#upgradeProperty(\"noHeader\");\n this.#upgradeProperty(\"noAnimations\");\n this.#upgradeProperty(\"noCloseButton\");\n this.#upgradeProperty(\"fullscreen\");\n this.#upgradeProperty(\"preserveOverflow\");\n this.#upgradeProperty(\"placement\");\n this.#upgradeProperty(\"closeLabel\");\n this.#dialogEl?.addEventListener(\"click\", this.#handleDialogClick);\n this.#dialogEl?.addEventListener(\"close\", this.#handleDialogClose);\n this.#dialogEl?.addEventListener(\"cancel\", this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\", this.#handleCloseButtonClick);\n this.#footerSlotEl?.addEventListener(\"slotchange\", this.#handleFooterSlotChange);\n this.#closeSlotEl?.addEventListener(\"slotchange\", this.#handleCloseSlotChange);\n }\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */ disconnectedCallback() {\n this.#pulseAnimationTimeout && clearTimeout(this.#pulseAnimationTimeout);\n this.#dialogEl?.addEventListener(\"click\", this.#handleDialogClick);\n this.#dialogEl?.removeEventListener(\"close\", this.#handleDialogClose);\n this.#dialogEl?.removeEventListener(\"cancel\", this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\", this.#handleCloseButtonClick);\n this.#footerSlotEl?.removeEventListener(\"slotchange\", this.#handleFooterSlotChange);\n this.#closeSlotEl?.removeEventListener(\"slotchange\", this.#handleCloseSlotChange);\n }\n /**\n * Deternimes if the modal is open or not.\n *\n * @type {boolean} - True if the modal is open, otherwise false.\n * @default false\n * @attribute open - Reflects the open property.\n */ get open() {\n return this.hasAttribute(\"open\");\n }\n set open(value) {\n this.toggleAttribute(\"open\", !!value);\n }\n /**\n * Determines whether the modal should close when the backdrop is clicked.\n *\n * @type {boolean} - True if the modal should close when the backdrop is clicked, otherwise false.\n * @default false\n * @attribute static-backdrop - Reflects the staticBackdrop property.\n */ get staticBackdrop() {\n return this.hasAttribute(\"static-backdrop\");\n }\n set staticBackdrop(value) {\n this.toggleAttribute(\"static-backdrop\", !!value);\n }\n /**\n * Determines whether the modal should have a header or not.\n *\n * @type {boolean} - True if the modal should have a header, otherwise false.\n * @default false\n * @attribute no-header - Reflects the noHeader property.\n */ get noHeader() {\n return this.hasAttribute(\"no-header\");\n }\n set noHeader(value) {\n this.toggleAttribute(\"no-header\", !!value);\n }\n /**\n * Determines whether the modal should have animations or not when opening and closing.\n *\n * @type {boolean} - True if the modal should have animations, otherwise false.\n * @default false\n * @attribute no-animations - Reflects the noAnimations property.\n */ get noAnimations() {\n return this.hasAttribute(\"no-animations\");\n }\n set noAnimations(value) {\n this.toggleAttribute(\"no-animations\", !!value);\n }\n /**\n * Determines whether the modal should have a default close button or not.\n *\n * @type {boolean} - True if the modal should have a close button, otherwise false.\n * @default false\n * @attribute no-close-button - Reflects the noCloseButton property.\n */ get noCloseButton() {\n return this.hasAttribute(\"no-close-button\");\n }\n set noCloseButton(value) {\n this.toggleAttribute(\"no-close-button\", !!value);\n }\n /**\n * Determines whether the modal should be fullscreen or not.\n *\n * @type {boolean} - True if the modal should be fullscreen, otherwise false.\n * @default false\n * @attribute fullscreen - Reflects the fullscreen property.\n */ get fullscreen() {\n return this.hasAttribute(\"fullscreen\");\n }\n set fullscreen(value) {\n this.toggleAttribute(\"fullscreen\", !!value);\n }\n /**\n * Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @type {boolean} - True if the overflow of the body should be preserved, otherwise false.\n * @default false\n * @attribute preserve-overflow - Reflects the preserveOverflow property.\n */ get preserveOverflow() {\n return this.hasAttribute(\"preserve-overflow\");\n }\n set preserveOverflow(value) {\n this.toggleAttribute(\"preserve-overflow\", !!value);\n }\n /**\n * Determines the placement of the modal.\n * Possible values are 'top-start', 'top-center', 'top-end', 'center-start', 'center', 'center-end', 'bottom-start', 'bottom-center', 'bottom-end'.\n *\n * @type {string}\n * @default 'center'\n * @attribute placement - Reflects the placement property.\n */ get placement() {\n return this.getAttribute(\"placement\") || \"center\";\n }\n set placement(value) {\n this.setAttribute(\"placement\", value != null ? value.toString() : value);\n }\n /**\n * The label of the default close button, used as the aria-label attribute of the close button.\n * If user provides text content for the close button using the `close` slot, this property is ignored and the aria-label attribute is removed.\n *\n * @type {string}\n * @default 'Close'\n * @attribute close-label - Reflects the closeLabel property.\n */ get closeLabel() {\n return this.getAttribute(\"close-label\") || \"Close\";\n }\n set closeLabel(value) {\n this.setAttribute(\"close-label\", value != null ? value.toString() : value);\n }\n /**\n * Updates the aria-label attribute of the close button.\n * If the slot for the close button has text content, the aria-label attribute is removed to allow the text content to be used as the label.\n * Otherwise, the aria-label attribute is set to the `closeLabel` property.\n *\n * @returns\n */ #updateCloseLabel() {\n if (this.#dialogEl === null) return;\n const closeButtonEl = this.#dialogEl.querySelector(\".dialog__close\");\n if (closeButtonEl === null) return;\n const assignedElements = this.#closeSlotEl?.assignedElements() || [];\n const hasTextContent = assignedElements?.some((el)=>el.textContent?.replace(/\\s/g, \"\") !== \"\");\n hasTextContent ? closeButtonEl.removeAttribute(\"aria-label\") : closeButtonEl.setAttribute(\"aria-label\", this.closeLabel);\n }\n /**\n * Applies a pulse effect on the dialog.\n */ #applyPulseEffectOnDialog() {\n if (this.#pulseAnimationTimeout) return;\n this.#dialogEl?.classList.add(\"dialog--pulse\");\n this.#pulseAnimationTimeout = setTimeout(()=>{\n this.#dialogEl?.classList.remove(\"dialog--pulse\");\n clearTimeout(this.#pulseAnimationTimeout);\n this.#pulseAnimationTimeout = void 0;\n }, $180b6dcf923bafc7$var$PULSE_ANIMATION_DURATION);\n }\n /**\n * Handles the close event of the dialog.\n */ #handleDialogClose = ()=>{\n // This is required because the dialog element does not reset\n // the open property when the dialog is closed by the user.\n this.open = false;\n this.dispatchEvent(new CustomEvent(\"me-close\", {\n bubbles: true,\n composed: true,\n detail: {\n element: this\n }\n }));\n if (document.body && !this.preserveOverflow) document.body.style.overflow = \"\";\n };\n /**\n * Handles the cancel event of the dialog.\n * This event is fired when the user presses the escape key.\n *\n * @param {Event} evt - The cancel event.\n */ #handleDialogCancel = (evt)=>{\n const requestCloseEvent = this.#createRequestCloseEvent(\"escape-key\");\n this.dispatchEvent(requestCloseEvent);\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n /**\n * Handles the click event of the close button.\n *\n * @param {Event} evt - The click event.\n */ #handleCloseButtonClick = (evt)=>{\n const requestCloseEvent = this.#createRequestCloseEvent(\"close-button\");\n this.dispatchEvent(requestCloseEvent);\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n /**\n * Handles the click event of the dialog.\n *\n * @param {MouseEvent} evt - The click event.\n */ #handleDialogClick = (evt)=>{\n const target = evt.target;\n const currentTarget = evt.currentTarget;\n // Close the dialog when the backdrop is clicked.\n if (target === currentTarget) {\n const requestCloseEvent = this.#createRequestCloseEvent(\"backdrop-click\");\n this.dispatchEvent(requestCloseEvent);\n if (requestCloseEvent.defaultPrevented || this.staticBackdrop) !this.noAnimations && this.#applyPulseEffectOnDialog();\n else this.hide();\n }\n // Close the dialog when external invoker is clicked.\n if (target instanceof HTMLElement && target.closest(\"[data-me-close]\") !== null) {\n const requestCloseEvent = this.#createRequestCloseEvent(\"external-invoker\");\n this.dispatchEvent(requestCloseEvent);\n if (requestCloseEvent.defaultPrevented) !this.noAnimations && this.#applyPulseEffectOnDialog();\n else this.hide();\n }\n };\n /**\n * Handles the slotchange event of the footer slot.\n */ #handleFooterSlotChange = ()=>{\n if (this.#dialogEl === null) return;\n /** @type {Nullable} */ const footerEl = this.#dialogEl.querySelector(\".dialog__footer\");\n if (footerEl === null) return;\n const footerSlotNodes = this.#footerSlotEl?.assignedNodes();\n const hasFooterSlotNodes = footerSlotNodes ? footerSlotNodes.length > 0 : false;\n footerEl.hidden = !hasFooterSlotNodes;\n };\n /**\n * Handles the slotchange event of the close slot.\n */ #handleCloseSlotChange = ()=>{\n this.#updateCloseLabel();\n };\n /**\n * Creates a request close event.\n *\n * @param {CloseRequestReason} reason - The reason that the modal is about to close.\n */ #createRequestCloseEvent(reason) {\n return new CustomEvent(\"me-request-close\", {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: {\n reason: reason,\n element: this\n }\n });\n }\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'open' | 'staticBackdrop' | 'noHeader' | 'noAnimations' | 'noCloseButton' | 'fullscreen' | 'preserveOverflow' | 'placement' | 'closeLabel'} prop - The property to upgrade.\n */ #upgradeProperty(prop) {\n /** @type {any} */ const instance = this;\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n /**\n * Opens the modal if it is closed, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.show();\n */ show() {\n if (this.open) return;\n this.open = true;\n }\n /**\n * Closes the modal if it is open, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.hide();\n */ hide() {\n if (!this.open) return;\n this.open = false;\n }\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='modal-element']\n * @example\n * ModalElement.defineCustomElement('my-modal');\n */ static defineCustomElement(elementName = \"modal-element\") {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $180b6dcf923bafc7$export$32589115725b904b);\n }\n}\n\n\n(0, $180b6dcf923bafc7$export$32589115725b904b).defineCustomElement();\n\n\nexport {$180b6dcf923bafc7$export$32589115725b904b as ModalElement};\n//# sourceMappingURL=modal-element-defined.js.map\n","import { ModalElement } from './modal-element.js';\n\nModalElement.defineCustomElement();\n\nexport { ModalElement };\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\n/**\n * Available values for the request close reason.\n *\n * @typedef {'close-button' | 'escape-key' | 'backdrop-click' | 'external-invoker'} CloseRequestReason\n */\n\nconst PULSE_ANIMATION_DURATION = 300; // milliseconds\nconst template = document.createElement('template');\n\nconst styles = /* css */`\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n --dialog-placement-margin: calc((2em + 6px) / 2);\n\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n /* Dialog placement */\n :host(:not([fullscreen])[placement=\"top-start\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-center\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-end\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center-start\"]) .dialog {\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center\"]) .dialog {\n margin: auto;\n }\n\n :host(:not([fullscreen])[placement=\"center-end\"]) .dialog {\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-start\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-center\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-end\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n /* Dialog animations */\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: ${PULSE_ANIMATION_DURATION}ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: end;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n\ntemplate.innerHTML = /* html */`\n \n\n \n
\n
\n \n\n
\n \n
\n
\n\n \n\n
\n \n
\n
\n
\n`;\n\n/**\n * @summary A custom element that renders a modal dialog.\n * @documentation https://github.com/georapbox/modal-element\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines whether the modal is open or not.\n * @property {boolean} staticBackdrop - Determines whether the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines whether the modal should have a header or not.\n * @property {boolean} noAnimations - Determines whether the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines whether the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines whether the modal should be fullscreen or not.\n * @property {boolean} preserveOverflow - Determines whether the overflow of the body should be preserved when the modal is open.\n * @property {string} placement - Determines the placement of the modal.\n * @property {string} closeLabel - The label of the default close button, used as the aria-label attribute of the close button.\n *\n * @attribute {boolean} open - Reflects the open property.\n * @attribute {boolean} static-backdrop - Reflects the staticBackdrop property.\n * @attribute {boolean} no-header - Reflects the noHeader property.\n * @attribute {boolean} no-animations - Reflects the noAnimations property.\n * @attribute {boolean} no-close-button - Reflects the noCloseButton property.\n * @attribute {boolean} fullscreen - Reflects the fullscreen property.\n * @attribute {boolean} preserve-overflow - Reflects the preserveOverflow property.\n * @attribute {string} placement - Reflects the placement property.\n * @attribute {string} close-label - Reflects the closeLabel property.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n */\nclass ModalElement extends HTMLElement {\n /** @type {Nullable} */\n #dialogEl = null;\n\n /** @type {Nullable} */\n #footerSlotEl = null;\n\n /** @type {Nullable} */\n #closeSlotEl = null;\n\n /** @type {ReturnType | undefined} */\n #pulseAnimationTimeout = void 0;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n if (this.shadowRoot) {\n this.#dialogEl = this.shadowRoot.querySelector('dialog');\n this.#footerSlotEl = this.shadowRoot.querySelector('slot[name=\"footer\"]');\n this.#closeSlotEl = this.shadowRoot.querySelector('slot[name=\"close\"]');\n }\n }\n\n static get observedAttributes() {\n return ['open', 'no-header', 'no-animations', 'no-close-button', 'close-label'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (this.#dialogEl === null) {\n return;\n }\n\n if (name === 'open' && oldValue !== newValue) {\n if (this.open) {\n this.#dialogEl.showModal();\n\n this.dispatchEvent(new CustomEvent('me-open', {\n bubbles: true,\n composed: true,\n detail: { element: this }\n }));\n\n if (document.body && !this.preserveOverflow) {\n document.body.style.overflow = 'hidden';\n }\n } else {\n this.#dialogEl.close();\n }\n }\n\n if (name === 'no-header' && oldValue !== newValue) {\n /** @type {Nullable} */\n const headerEl = this.#dialogEl.querySelector('.dialog__header');\n\n if (headerEl !== null) {\n headerEl.hidden = this.noHeader;\n }\n }\n\n if (name === 'no-animations' && oldValue !== newValue) {\n this.#dialogEl.classList.toggle('dialog--no-animations', this.noAnimations);\n }\n\n if (name === 'no-close-button' && oldValue !== newValue) {\n /** @type {Nullable} */\n const closeBtnEl = this.#dialogEl.querySelector('.dialog__close');\n\n if (closeBtnEl !== null) {\n closeBtnEl.hidden = this.noCloseButton;\n }\n }\n\n if (name === 'close-label' && oldValue !== newValue) {\n this.#updateCloseLabel();\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('open');\n this.#upgradeProperty('staticBackdrop');\n this.#upgradeProperty('noHeader');\n this.#upgradeProperty('noAnimations');\n this.#upgradeProperty('noCloseButton');\n this.#upgradeProperty('fullscreen');\n this.#upgradeProperty('preserveOverflow');\n this.#upgradeProperty('placement');\n this.#upgradeProperty('closeLabel');\n\n this.#dialogEl?.addEventListener('click', this.#handleDialogClick);\n this.#dialogEl?.addEventListener('close', this.#handleDialogClose);\n this.#dialogEl?.addEventListener('cancel', this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.addEventListener('submit', this.#handleCloseButtonClick);\n this.#footerSlotEl?.addEventListener('slotchange', this.#handleFooterSlotChange);\n this.#closeSlotEl?.addEventListener('slotchange', this.#handleCloseSlotChange);\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#pulseAnimationTimeout && clearTimeout(this.#pulseAnimationTimeout);\n this.#dialogEl?.addEventListener('click', this.#handleDialogClick);\n this.#dialogEl?.removeEventListener('close', this.#handleDialogClose);\n this.#dialogEl?.removeEventListener('cancel', this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.removeEventListener('submit', this.#handleCloseButtonClick);\n this.#footerSlotEl?.removeEventListener('slotchange', this.#handleFooterSlotChange);\n this.#closeSlotEl?.removeEventListener('slotchange', this.#handleCloseSlotChange);\n }\n\n /**\n * Deternimes if the modal is open or not.\n *\n * @type {boolean} - True if the modal is open, otherwise false.\n * @default false\n * @attribute open - Reflects the open property.\n */\n get open() {\n return this.hasAttribute('open');\n }\n\n set open(value) {\n this.toggleAttribute('open', !!value);\n }\n\n /**\n * Determines whether the modal should close when the backdrop is clicked.\n *\n * @type {boolean} - True if the modal should close when the backdrop is clicked, otherwise false.\n * @default false\n * @attribute static-backdrop - Reflects the staticBackdrop property.\n */\n get staticBackdrop() {\n return this.hasAttribute('static-backdrop');\n }\n\n set staticBackdrop(value) {\n this.toggleAttribute('static-backdrop', !!value);\n }\n\n /**\n * Determines whether the modal should have a header or not.\n *\n * @type {boolean} - True if the modal should have a header, otherwise false.\n * @default false\n * @attribute no-header - Reflects the noHeader property.\n */\n get noHeader() {\n return this.hasAttribute('no-header');\n }\n\n set noHeader(value) {\n this.toggleAttribute('no-header', !!value);\n }\n\n /**\n * Determines whether the modal should have animations or not when opening and closing.\n *\n * @type {boolean} - True if the modal should have animations, otherwise false.\n * @default false\n * @attribute no-animations - Reflects the noAnimations property.\n */\n get noAnimations() {\n return this.hasAttribute('no-animations');\n }\n\n set noAnimations(value) {\n this.toggleAttribute('no-animations', !!value);\n }\n\n /**\n * Determines whether the modal should have a default close button or not.\n *\n * @type {boolean} - True if the modal should have a close button, otherwise false.\n * @default false\n * @attribute no-close-button - Reflects the noCloseButton property.\n */\n get noCloseButton() {\n return this.hasAttribute('no-close-button');\n }\n\n set noCloseButton(value) {\n this.toggleAttribute('no-close-button', !!value);\n }\n\n /**\n * Determines whether the modal should be fullscreen or not.\n *\n * @type {boolean} - True if the modal should be fullscreen, otherwise false.\n * @default false\n * @attribute fullscreen - Reflects the fullscreen property.\n */\n get fullscreen() {\n return this.hasAttribute('fullscreen');\n }\n\n set fullscreen(value) {\n this.toggleAttribute('fullscreen', !!value);\n }\n\n /**\n * Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @type {boolean} - True if the overflow of the body should be preserved, otherwise false.\n * @default false\n * @attribute preserve-overflow - Reflects the preserveOverflow property.\n */\n get preserveOverflow() {\n return this.hasAttribute('preserve-overflow');\n }\n\n set preserveOverflow(value) {\n this.toggleAttribute('preserve-overflow', !!value);\n }\n\n /**\n * Determines the placement of the modal.\n * Possible values are 'top-start', 'top-center', 'top-end', 'center-start', 'center', 'center-end', 'bottom-start', 'bottom-center', 'bottom-end'.\n *\n * @type {string}\n * @default 'center'\n * @attribute placement - Reflects the placement property.\n */\n get placement() {\n return this.getAttribute('placement') || 'center';\n }\n\n set placement(value) {\n this.setAttribute('placement', value != null ? value.toString() : value);\n }\n\n /**\n * The label of the default close button, used as the aria-label attribute of the close button.\n * If user provides text content for the close button using the `close` slot, this property is ignored and the aria-label attribute is removed.\n *\n * @type {string}\n * @default 'Close'\n * @attribute close-label - Reflects the closeLabel property.\n */\n get closeLabel() {\n return this.getAttribute('close-label') || 'Close';\n }\n\n set closeLabel(value) {\n this.setAttribute('close-label', value != null ? value.toString() : value);\n }\n\n /**\n * Updates the aria-label attribute of the close button.\n * If the slot for the close button has text content, the aria-label attribute is removed to allow the text content to be used as the label.\n * Otherwise, the aria-label attribute is set to the `closeLabel` property.\n *\n * @returns\n */\n #updateCloseLabel() {\n if (this.#dialogEl === null) {\n return;\n }\n\n const closeButtonEl = this.#dialogEl.querySelector('.dialog__close');\n\n if (closeButtonEl === null) {\n return;\n }\n\n const assignedElements = this.#closeSlotEl?.assignedElements() || [];\n const hasTextContent = assignedElements?.some(el => el.textContent?.replace(/\\s/g, '') !== '');\n\n hasTextContent\n ? closeButtonEl.removeAttribute('aria-label')\n : closeButtonEl.setAttribute('aria-label', this.closeLabel);\n }\n\n /**\n * Applies a pulse effect on the dialog.\n */\n #applyPulseEffectOnDialog() {\n if (this.#pulseAnimationTimeout) {\n return;\n }\n\n this.#dialogEl?.classList.add('dialog--pulse');\n\n this.#pulseAnimationTimeout = setTimeout(() => {\n this.#dialogEl?.classList.remove('dialog--pulse');\n clearTimeout(this.#pulseAnimationTimeout);\n this.#pulseAnimationTimeout = void 0;\n }, PULSE_ANIMATION_DURATION);\n }\n\n /**\n * Handles the close event of the dialog.\n */\n #handleDialogClose = () => {\n // This is required because the dialog element does not reset\n // the open property when the dialog is closed by the user.\n this.open = false;\n\n this.dispatchEvent(new CustomEvent('me-close', {\n bubbles: true,\n composed: true,\n detail: { element: this }\n }));\n\n if (document.body && !this.preserveOverflow) {\n document.body.style.overflow = '';\n }\n };\n\n /**\n * Handles the cancel event of the dialog.\n * This event is fired when the user presses the escape key.\n *\n * @param {Event} evt - The cancel event.\n */\n #handleDialogCancel = evt => {\n const requestCloseEvent = this.#createRequestCloseEvent('escape-key');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n\n /**\n * Handles the click event of the close button.\n *\n * @param {Event} evt - The click event.\n */\n #handleCloseButtonClick = evt => {\n const requestCloseEvent = this.#createRequestCloseEvent('close-button');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n\n /**\n * Handles the click event of the dialog.\n *\n * @param {MouseEvent} evt - The click event.\n */\n #handleDialogClick = evt => {\n const target = evt.target;\n const currentTarget = evt.currentTarget;\n\n // Close the dialog when the backdrop is clicked.\n if (target === currentTarget) {\n const requestCloseEvent = this.#createRequestCloseEvent('backdrop-click');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented || this.staticBackdrop) {\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n } else {\n this.hide();\n }\n }\n\n // Close the dialog when external invoker is clicked.\n if (target instanceof HTMLElement && target.closest('[data-me-close]') !== null) {\n const requestCloseEvent = this.#createRequestCloseEvent('external-invoker');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented) {\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n } else {\n this.hide();\n }\n }\n };\n\n /**\n * Handles the slotchange event of the footer slot.\n */\n #handleFooterSlotChange = () => {\n if (this.#dialogEl === null) {\n return;\n }\n\n /** @type {Nullable} */\n const footerEl = this.#dialogEl.querySelector('.dialog__footer');\n\n if (footerEl === null) {\n return;\n }\n\n const footerSlotNodes = this.#footerSlotEl?.assignedNodes();\n const hasFooterSlotNodes = footerSlotNodes ? footerSlotNodes.length > 0 : false;\n\n footerEl.hidden = !hasFooterSlotNodes;\n };\n\n /**\n * Handles the slotchange event of the close slot.\n */\n #handleCloseSlotChange = () => {\n this.#updateCloseLabel();\n };\n\n /**\n * Creates a request close event.\n *\n * @param {CloseRequestReason} reason - The reason that the modal is about to close.\n */\n #createRequestCloseEvent(reason) {\n return new CustomEvent('me-request-close', {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: {\n reason,\n element: this\n }\n });\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'open' | 'staticBackdrop' | 'noHeader' | 'noAnimations' | 'noCloseButton' | 'fullscreen' | 'preserveOverflow' | 'placement' | 'closeLabel'} prop - The property to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Opens the modal if it is closed, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.show();\n */\n show() {\n if (this.open) {\n return;\n }\n\n this.open = true;\n }\n\n /**\n * Closes the modal if it is open, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.hide();\n */\n hide() {\n if (!this.open) {\n return;\n }\n\n this.open = false;\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='modal-element']\n * @example\n * ModalElement.defineCustomElement('my-modal');\n */\n static defineCustomElement(elementName = 'modal-element') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, ModalElement);\n }\n }\n}\n\nexport { ModalElement };\n","Object.defineProperty({},\"FilesDropzone\",{get:function(){return m},set:void 0,enumerable:!0,configurable:!0});let e=new Map([[\"aac\",\"audio/aac\"],[\"abw\",\"application/x-abiword\"],[\"arc\",\"application/x-freearc\"],[\"avif\",\"image/avif\"],[\"avi\",\"video/x-msvideo\"],[\"azw\",\"application/vnd.amazon.ebook\"],[\"bin\",\"application/octet-stream\"],[\"bmp\",\"image/bmp\"],[\"bz\",\"application/x-bzip\"],[\"bz2\",\"application/x-bzip2\"],[\"cda\",\"application/x-cdf\"],[\"csh\",\"application/x-csh\"],[\"css\",\"text/css\"],[\"csv\",\"text/csv\"],[\"doc\",\"application/msword\"],[\"docx\",\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"],[\"eot\",\"application/vnd.ms-fontobject\"],[\"epub\",\"application/epub+zip\"],[\"gz\",\"application/gzip\"],[\"gif\",\"image/gif\"],[\"heic\",\"image/heic\"],[\"heif\",\"image/heif\"],[\"htm\",\"text/html\"],[\"html\",\"text/html\"],[\"ico\",\"image/vnd.microsoft.icon\"],[\"ics\",\"text/calendar\"],[\"jar\",\"application/java-archive\"],[\"jpeg\",\"image/jpeg\"],[\"jpg\",\"image/jpeg\"],[\"jxl\",\"image/jxl\"],[\"js\",\"text/javascript\"],[\"json\",\"application/json\"],[\"jsonld\",\"application/ld+json\"],[\"markdown\",\"text/markdown\"],[\"md\",\"text/markdown\"],[\"mid\",\"audio/midi\"],[\"midi\",\"audio/midi\"],[\"mjs\",\"text/javascript\"],[\"mp3\",\"audio/mpeg\"],[\"mp4\",\"video/mp4\"],[\"mpeg\",\"video/mpeg\"],[\"mpkg\",\"application/vnd.apple.installer+xml\"],[\"odp\",\"application/vnd.oasis.opendocument.presentation\"],[\"ods\",\"application/vnd.oasis.opendocument.spreadsheet\"],[\"odt\",\"application/vnd.oasis.opendocument.text\"],[\"oga\",\"audio/ogg\"],[\"ogv\",\"video/ogg\"],[\"ogx\",\"application/ogg\"],[\"opus\",\"audio/opus\"],[\"otf\",\"font/otf\"],[\"png\",\"image/png\"],[\"pdf\",\"application/pdf\"],[\"php\",\"application/x-httpd-php\"],[\"ppt\",\"application/vnd.ms-powerpoint\"],[\"pptx\",\"application/vnd.openxmlformats-officedocument.presentationml.presentation\"],[\"rar\",\"application/vnd.rar\"],[\"rtf\",\"application/rtf\"],[\"sh\",\"application/x-sh\"],[\"svg\",\"image/svg+xml\"],[\"swf\",\"application/x-shockwave-flash\"],[\"tar\",\"application/x-tar\"],[\"tif\",\"image/tiff\"],[\"tiff\",\"image/tiff\"],[\"ts\",\"video/mp2t\"],[\"ttf\",\"font/ttf\"],[\"txt\",\"text/plain\"],[\"vsd\",\"application/vnd.visio\"],[\"wav\",\"audio/wav\"],[\"weba\",\"audio/webm\"],[\"webm\",\"video/webm\"],[\"webp\",\"image/webp\"],[\"woff\",\"font/woff\"],[\"woff2\",\"font/woff2\"],[\"xhtml\",\"application/xhtml+xml\"],[\"xls\",\"application/vnd.ms-excel\"],[\"xlsx\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"],[\"xml\",\"application/xml\"],[\"xul\",\"application/vnd.mozilla.xul+xml\"],[\"zip\",\"application/zip\"],[\"7z\",\"application/x-7z-compressed\"],[\"mkv\",\"video/x-matroska\"],[\"mov\",\"video/quicktime\"],[\"msg\",\"application/vnd.ms-outlook\"]]),t=[\".DS_Store\",\"Thumbs.db\"],o=t=>{let{name:o}=t;if(o&&-1!==o.lastIndexOf(\".\")&&!t.type){let i=(o.split(\".\").pop()||\"\").toLowerCase(),r=e.get(i);r&&Object.defineProperty(t,\"type\",{value:r,writable:!1,configurable:!1,enumerable:!0})}return t},i=(e,t)=>{let i=o(e);if(\"string\"!=typeof i.path){let{webkitRelativePath:o}=e;Object.defineProperty(i,\"path\",{value:\"string\"==typeof t?t:o||e.name,writable:!1,configurable:!1,enumerable:!0})}return i},r=async e=>await new Promise((t,o)=>{e.readEntries(t,o)}),a=async e=>{let t=[],o=await r(e);for(;o.length>0;)t.push(...o),o=await r(e);return t},n=e=>new Promise((t,o)=>{e.file(o=>t(i(o,e.fullPath)),o)}),s=async e=>{let o=[],i=[];for(let t of e){if(\"file\"!==t.kind)continue;let e=t.getAsEntry?t.getAsEntry():t.webkitGetAsEntry();i.push(e)}for(;i.length>0;){let e=i.shift();if(e){if(e.isFile){let i=await n(e);-1===t.indexOf(i.name)&&o.push(i)}else e.isDirectory&&i.push(...await a(e.createReader()))}}return o},d=async e=>{let o=[];for(let r of e)-1===t.indexOf(r.name)&&o.push(i(r));return o},l=async e=>e.dataTransfer?e.dataTransfer.items?await s(e.dataTransfer.items):await d(e.dataTransfer.files):await d(e.target.files),p=\"files-dropzone\",c=\"TOO_MANY_FILES\",h=document.createElement(\"template\"),u=`\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;h.innerHTML=`\n \n\n \n\n
\n Drag 'n' drop files here, or click to select files\n
\n`;class m extends HTMLElement{#e=null;#t=null;constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\",delegatesFocus:!0}).appendChild(h.content.cloneNode(!0)),this.shadowRoot&&(this.#e=this.shadowRoot.getElementById(\"file-input\"),this.#t=this.shadowRoot.getElementById(\"dropzone\"))}static get observedAttributes(){return[\"accept\",\"disabled\",\"multiple\"]}attributeChangedCallback(e,t,o){\"accept\"===e&&t!==o&&this.#e&&(this.#e.accept=this.accept),\"disabled\"===e&&t!==o&&this.#e&&(this.#e.disabled=this.disabled,this.disabled?(this.#t?.removeAttribute(\"tabindex\"),this.#t?.setAttribute(\"aria-disabled\",\"true\")):(this.#t?.setAttribute(\"tabindex\",\"0\"),this.#t?.setAttribute(\"aria-disabled\",\"false\"))),\"multiple\"===e&&t!==o&&this.#e&&(this.#e.multiple=this.multiple)}connectedCallback(){this.#o(\"accept\"),this.#o(\"disabled\"),this.#o(\"maxFiles\"),this.#o(\"maxSize\"),this.#o(\"minSize\"),this.#o(\"multiple\"),this.#o(\"autoFocus\"),this.#o(\"noStyle\"),this.#e?.addEventListener(\"change\",this.#i),this.#t?.addEventListener(\"dragenter\",this.#r),this.#t?.addEventListener(\"dragover\",this.#a),this.#t?.addEventListener(\"dragleave\",this.#n),this.#t?.addEventListener(\"drop\",this.#s),this.#t?.addEventListener(\"click\",this.#d),this.#t?.addEventListener(\"keyup\",this.#l),this.autoFocus&&this.#t?.focus()}disconnectedCallback(){this.#e?.removeEventListener(\"change\",this.#i),this.#t?.removeEventListener(\"dragenter\",this.#r),this.#t?.removeEventListener(\"dragover\",this.#a),this.#t?.removeEventListener(\"dragleave\",this.#n),this.#t?.removeEventListener(\"drop\",this.#s),this.#t?.removeEventListener(\"click\",this.#d),this.#t?.removeEventListener(\"keyup\",this.#l)}get accept(){return this.getAttribute(\"accept\")||\"\"}set accept(e){this.setAttribute(\"accept\",null!=e?e.toString():e)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(e){this.toggleAttribute(\"disabled\",!!e)}get maxFiles(){let e=Number(this.getAttribute(\"max-files\"))||0;return e<=0?1/0:Math.floor(Math.abs(e))}set maxFiles(e){this.setAttribute(\"max-files\",null!=e?e.toString():e)}get maxSize(){let e=this.getAttribute(\"max-size\");if(null===e)return 1/0;let t=Number(e);return Number.isNaN(t)?1/0:t}set maxSize(e){this.setAttribute(\"max-size\",null!=e?e.toString():e)}get minSize(){let e=this.getAttribute(\"min-size\");if(null===e)return 0;let t=Number(e);return Number.isNaN(t)?0:t}set minSize(e){this.setAttribute(\"min-size\",null!=e?e.toString():e)}get multiple(){return this.hasAttribute(\"multiple\")}set multiple(e){this.toggleAttribute(\"multiple\",!!e)}get autoFocus(){return this.hasAttribute(\"auto-focus\")}set autoFocus(e){this.toggleAttribute(\"auto-focus\",!!e)}get noStyle(){return this.hasAttribute(\"no-style\")}set noStyle(e){this.toggleAttribute(\"no-style\",!!e)}#i=async e=>{try{this.#p(await l(e))}catch(e){this.dispatchEvent(new CustomEvent(`${p}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}};#r=()=>{this.disabled||this.dispatchEvent(new Event(`${p}-dragenter`,{bubbles:!0,composed:!0}))};#a=e=>{if(e.preventDefault(),this.disabled){e.dataTransfer.dropEffect=\"none\";return}e.dataTransfer.dropEffect=\"copy\",this.#t&&(this.#t.classList.add(\"dropzone--dragover\"),this.#t.part.add(\"dropzone--dragover\")),this.dispatchEvent(new Event(`${p}-dragover`,{bubbles:!0,composed:!0}))};#n=()=>{this.disabled||(this.#t&&(this.#t.classList.remove(\"dropzone--dragover\"),this.#t.part.remove(\"dropzone--dragover\")),this.dispatchEvent(new Event(`${p}-dragleave`,{bubbles:!0,composed:!0})))};#s=async e=>{if(!this.disabled){e.preventDefault(),this.#t&&(this.#t.classList.remove(\"dropzone--dragover\"),this.#t.part.remove(\"dropzone--dragover\"));try{this.#p(await l(e))}catch(e){this.dispatchEvent(new CustomEvent(`${p}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}}};#d=()=>{this.disabled||this.#e?.click()};#l=e=>{this.disabled||\" \"!==e.key&&\"Enter\"!==e.key||this.#e?.click()};#p(e){if(!Array.isArray(e)||!e.length)return;let t=[],o=[],i=e.length;if(!this.multiple&&i>1)for(let t of e)o.push({file:t,errors:[{code:c,message:\"Too many files selected. Only 1 file is allowed.\"}]});else if(this.multiple&&i>this.maxFiles)for(let t of e)o.push({file:t,errors:[{code:c,message:`Too many files selected. Only ${this.maxFiles} ${this.maxFiles>1?\"files are\":\"file is\"} allowed.`}]});else for(let i of e){let e=function(e,t=\"\"){if(!t)return!0;let o=[...new Set(t.split(\",\").map(e=>e.trim()).filter(Boolean))],i=e.type,r=i.replace(/\\/.*$/,\"\");for(let t of o)if(\".\"===t.charAt(0)){if(-1!==e.name.toLowerCase().indexOf(t.toLowerCase(),e.name.length-t.length))return!0}else if(/\\/\\*$/.test(t)){if(r===t.replace(/\\/.*$/,\"\"))return!0}else if(i===t)return!0;return!1}(i,this.accept),r=i.size>this.maxSize,a=i.size0&&this.dispatchEvent(new CustomEvent(`${p}-drop-accepted`,{bubbles:!0,composed:!0,detail:{acceptedFiles:t}})),o.length>0&&this.dispatchEvent(new CustomEvent(`${p}-drop-rejected`,{bubbles:!0,composed:!0,detail:{rejectedFiles:o}})),this.#e&&(this.#e.value=this.#e.defaultValue)}openFileDialog(){this.disabled||this.#e?.click()}#o(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}static defineCustomElement(e=p){\"undefined\"==typeof window||window.customElements.get(e)||window.customElements.define(e,m)}}m.defineCustomElement();export{m as FilesDropzone};\n//# sourceMappingURL=files-dropzone-defined.js.map\n","function $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $862aa3736b0514bc$exports = {};\n\n$parcel$export($862aa3736b0514bc$exports, \"FilesDropzone\", function () { return $862aa3736b0514bc$export$6ccd1735166caad9; });\n// @ts-check\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */ // @ts-check\n/**\n * Checks if a file is valid based on the accepted file type specifiers.\n *\n * @param {File} file - The File object to validate.\n * @param {string} [acceptedTypeSpecifiers=''] - The accepted file type specifiers.\n * @returns {boolean} - True if the file is valid, false otherwise.\n */ function $38f222170fd4d21a$export$7c47054fed488f80(file, acceptedTypeSpecifiers = \"\") {\n if (!acceptedTypeSpecifiers) return true;\n const acceptedMimeTypesList = [\n ...new Set(acceptedTypeSpecifiers.split(\",\").map((v)=>v.trim()).filter(Boolean))\n ];\n const fileMimeType = file.type;\n const baseMimeType = fileMimeType.replace(/\\/.*$/, \"\");\n for (const validType of acceptedMimeTypesList){\n if (validType.charAt(0) === \".\") {\n if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) return true;\n } else if (/\\/\\*$/.test(validType)) {\n // Check for mime type that looks like \"image/*\" or similar.\n if (baseMimeType === validType.replace(/\\/.*$/, \"\")) return true;\n } else {\n if (fileMimeType === validType) return true;\n }\n }\n return false;\n}\n\n\n// @ts-check\n/**\n * A map of common file extensions and their associated MIME types.\n */ const $f31161edf38949e9$var$COMMON_MIME_TYPES = new Map([\n // https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types\n [\n \"aac\",\n \"audio/aac\"\n ],\n [\n \"abw\",\n \"application/x-abiword\"\n ],\n [\n \"arc\",\n \"application/x-freearc\"\n ],\n [\n \"avif\",\n \"image/avif\"\n ],\n [\n \"avi\",\n \"video/x-msvideo\"\n ],\n [\n \"azw\",\n \"application/vnd.amazon.ebook\"\n ],\n [\n \"bin\",\n \"application/octet-stream\"\n ],\n [\n \"bmp\",\n \"image/bmp\"\n ],\n [\n \"bz\",\n \"application/x-bzip\"\n ],\n [\n \"bz2\",\n \"application/x-bzip2\"\n ],\n [\n \"cda\",\n \"application/x-cdf\"\n ],\n [\n \"csh\",\n \"application/x-csh\"\n ],\n [\n \"css\",\n \"text/css\"\n ],\n [\n \"csv\",\n \"text/csv\"\n ],\n [\n \"doc\",\n \"application/msword\"\n ],\n [\n \"docx\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n ],\n [\n \"eot\",\n \"application/vnd.ms-fontobject\"\n ],\n [\n \"epub\",\n \"application/epub+zip\"\n ],\n [\n \"gz\",\n \"application/gzip\"\n ],\n [\n \"gif\",\n \"image/gif\"\n ],\n [\n \"heic\",\n \"image/heic\"\n ],\n [\n \"heif\",\n \"image/heif\"\n ],\n [\n \"htm\",\n \"text/html\"\n ],\n [\n \"html\",\n \"text/html\"\n ],\n [\n \"ico\",\n \"image/vnd.microsoft.icon\"\n ],\n [\n \"ics\",\n \"text/calendar\"\n ],\n [\n \"jar\",\n \"application/java-archive\"\n ],\n [\n \"jpeg\",\n \"image/jpeg\"\n ],\n [\n \"jpg\",\n \"image/jpeg\"\n ],\n [\n \"jxl\",\n \"image/jxl\"\n ],\n [\n \"js\",\n \"text/javascript\"\n ],\n [\n \"json\",\n \"application/json\"\n ],\n [\n \"jsonld\",\n \"application/ld+json\"\n ],\n [\n \"markdown\",\n \"text/markdown\"\n ],\n [\n \"md\",\n \"text/markdown\"\n ],\n [\n \"mid\",\n \"audio/midi\"\n ],\n [\n \"midi\",\n \"audio/midi\"\n ],\n [\n \"mjs\",\n \"text/javascript\"\n ],\n [\n \"mp3\",\n \"audio/mpeg\"\n ],\n [\n \"mp4\",\n \"video/mp4\"\n ],\n [\n \"mpeg\",\n \"video/mpeg\"\n ],\n [\n \"mpkg\",\n \"application/vnd.apple.installer+xml\"\n ],\n [\n \"odp\",\n \"application/vnd.oasis.opendocument.presentation\"\n ],\n [\n \"ods\",\n \"application/vnd.oasis.opendocument.spreadsheet\"\n ],\n [\n \"odt\",\n \"application/vnd.oasis.opendocument.text\"\n ],\n [\n \"oga\",\n \"audio/ogg\"\n ],\n [\n \"ogv\",\n \"video/ogg\"\n ],\n [\n \"ogx\",\n \"application/ogg\"\n ],\n [\n \"opus\",\n \"audio/opus\"\n ],\n [\n \"otf\",\n \"font/otf\"\n ],\n [\n \"png\",\n \"image/png\"\n ],\n [\n \"pdf\",\n \"application/pdf\"\n ],\n [\n \"php\",\n \"application/x-httpd-php\"\n ],\n [\n \"ppt\",\n \"application/vnd.ms-powerpoint\"\n ],\n [\n \"pptx\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n ],\n [\n \"rar\",\n \"application/vnd.rar\"\n ],\n [\n \"rtf\",\n \"application/rtf\"\n ],\n [\n \"sh\",\n \"application/x-sh\"\n ],\n [\n \"svg\",\n \"image/svg+xml\"\n ],\n [\n \"swf\",\n \"application/x-shockwave-flash\"\n ],\n [\n \"tar\",\n \"application/x-tar\"\n ],\n [\n \"tif\",\n \"image/tiff\"\n ],\n [\n \"tiff\",\n \"image/tiff\"\n ],\n [\n \"ts\",\n \"video/mp2t\"\n ],\n [\n \"ttf\",\n \"font/ttf\"\n ],\n [\n \"txt\",\n \"text/plain\"\n ],\n [\n \"vsd\",\n \"application/vnd.visio\"\n ],\n [\n \"wav\",\n \"audio/wav\"\n ],\n [\n \"weba\",\n \"audio/webm\"\n ],\n [\n \"webm\",\n \"video/webm\"\n ],\n [\n \"webp\",\n \"image/webp\"\n ],\n [\n \"woff\",\n \"font/woff\"\n ],\n [\n \"woff2\",\n \"font/woff2\"\n ],\n [\n \"xhtml\",\n \"application/xhtml+xml\"\n ],\n [\n \"xls\",\n \"application/vnd.ms-excel\"\n ],\n [\n \"xlsx\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n ],\n [\n \"xml\",\n \"application/xml\"\n ],\n [\n \"xul\",\n \"application/vnd.mozilla.xul+xml\"\n ],\n [\n \"zip\",\n \"application/zip\"\n ],\n [\n \"7z\",\n \"application/x-7z-compressed\"\n ],\n // Others\n [\n \"mkv\",\n \"video/x-matroska\"\n ],\n [\n \"mov\",\n \"video/quicktime\"\n ],\n [\n \"msg\",\n \"application/vnd.ms-outlook\"\n ]\n]);\nconst $f31161edf38949e9$var$FILES_TO_IGNORE = [\n // Thumbnail cache files for macOS and Windows\n \".DS_Store\",\n \"Thumbs.db\" // Windows\n];\n/**\n * Adds a `type` property to the file object if it doesn't have one and the file has an extension.\n * This is needed because Firefox doesn't add a type property to files dragged from the desktop.\n * @bug https://bugzilla.mozilla.org/show_bug.cgi?id=1424689\n *\n * @param {File} file - The file object to add the type property to.\n * @returns {File} - The file object with the type property added.\n */ const $f31161edf38949e9$var$toFileWithMimeType = (file)=>{\n const { name: name } = file;\n const hasExtension = name && name.lastIndexOf(\".\") !== -1;\n if (hasExtension && !file.type) {\n const extension = (name.split(\".\").pop() || \"\").toLowerCase();\n const type = $f31161edf38949e9$var$COMMON_MIME_TYPES.get(extension);\n if (type) Object.defineProperty(file, \"type\", {\n value: type,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n return file;\n};\n/**\n * Adds a `path` property to the file object if it doesn't have one.\n * If `path` is not provided, the `webkitRelativePath` property of the file will be used\n * or the file's name if `webkitRelativePath` is not available.\n *\n * @param {File} file - The file object to add the path property to.\n * @param {string} [path] - The path to set on the file object.\n * @returns {File} - The file object with the path property added.\n */ const $f31161edf38949e9$var$toFileWithPath = (file, path)=>{\n const fileWithMimeType = $f31161edf38949e9$var$toFileWithMimeType(file);\n // @ts-ignore\n if (typeof fileWithMimeType.path !== \"string\") {\n const { webkitRelativePath: webkitRelativePath } = file;\n Object.defineProperty(fileWithMimeType, \"path\", {\n value: typeof path === \"string\" ? path : webkitRelativePath || file.name,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n return fileWithMimeType;\n};\n/**\n * Wrap `FileSystemDirectoryReader.readEntries` in a promise to make working with read entries easier.\n * https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryReader/readEntries\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */ const $f31161edf38949e9$var$readEntriesPromise = async (directoryReader)=>{\n return await new Promise((resolve, reject)=>{\n directoryReader.readEntries(resolve, reject);\n });\n};\n/**\n * Read all entries in a directory or sub-directory\n * by calling `readEntries` until it returns an empty array.\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */ const $f31161edf38949e9$var$readAllDirectoryEntries = async (directoryReader)=>{\n const entries = [];\n let readEntries = await $f31161edf38949e9$var$readEntriesPromise(directoryReader);\n while(readEntries.length > 0){\n entries.push(...readEntries);\n readEntries = await $f31161edf38949e9$var$readEntriesPromise(directoryReader);\n }\n return entries;\n};\n/**\n * Get a `File` object from a `FileSystemFileEntry` object.\n *\n * @param {FileSystemFileEntry} fileEntry - The file entry to get a `File` object from.\n * @returns {Promise} - A promise that resolves with a `File` object.\n */ const $f31161edf38949e9$var$getFileFromFileEntry = (fileEntry)=>{\n return new Promise((resolve, reject)=>{\n fileEntry.file((file)=>resolve($f31161edf38949e9$var$toFileWithPath(file, fileEntry.fullPath)), reject);\n });\n};\n/**\n * Get an array of `File` objects from a `DataTransferItemList` object.\n *\n * @param {DataTransferItemList} dataTransferItemList - The item list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */ const $f31161edf38949e9$var$getFilesFromDataTransferItemList = async (dataTransferItemList)=>{\n const files = [];\n // Chromium browsers read only 100 files at a time as per the spec, so we need to use\n // BFS (Breadth-first search) to traverse the entire directory/file structure.\n // https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/webkitGetAsEntry#javascript_content\n const queue = [];\n for (const item of dataTransferItemList){\n if (item.kind !== \"file\") continue;\n // https://developer.mozilla.org/docs/Web/API/DataTransferItem/webkitGetAsEntry\n // This function is implemented as `webkitGetAsEntry()` in non-WebKit browsers\n // including Firefox at this time but it may be renamed to `getAsEntry()` in the future.\n // @ts-ignore\n const entry = item.getAsEntry ? item.getAsEntry() : item.webkitGetAsEntry();\n queue.push(entry);\n }\n while(queue.length > 0){\n const entry = queue.shift();\n if (!entry) continue;\n else if (entry.isFile) {\n const file = await $f31161edf38949e9$var$getFileFromFileEntry(entry);\n if ($f31161edf38949e9$var$FILES_TO_IGNORE.indexOf(file.name) === -1) files.push(file);\n } else if (entry.isDirectory) queue.push(...await $f31161edf38949e9$var$readAllDirectoryEntries(entry.createReader()));\n }\n return files;\n};\n/**\n * Get an array of `File` objects from a `FileList` object.\n *\n * @param {FileList} fileList - The file list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */ const $f31161edf38949e9$var$getFilesFromFileList = async (fileList)=>{\n const files = [];\n for (const file of fileList)if ($f31161edf38949e9$var$FILES_TO_IGNORE.indexOf(file.name) === -1) files.push($f31161edf38949e9$var$toFileWithPath(file));\n return files;\n};\nconst $f31161edf38949e9$export$6d52664cd15c442 = async (evt)=>{\n if (evt.dataTransfer) return evt.dataTransfer.items ? await $f31161edf38949e9$var$getFilesFromDataTransferItemList(evt.dataTransfer.items) : await $f31161edf38949e9$var$getFilesFromFileList(evt.dataTransfer.files);\n return await $f31161edf38949e9$var$getFilesFromFileList(evt.target.files);\n};\n\n\nconst $862aa3736b0514bc$var$COMPONENT_NAME = \"files-dropzone\";\nconst $862aa3736b0514bc$var$TOO_MANY_FILES = \"TOO_MANY_FILES\";\nconst $862aa3736b0514bc$var$FILE_TOO_LARGE = \"FILE_TOO_LARGE\";\nconst $862aa3736b0514bc$var$FILE_TOO_SMALL = \"FILE_TOO_SMALL\";\nconst $862aa3736b0514bc$var$INVALID_MIME_TYPE = \"INVALID_MIME_TYPE\";\nconst $862aa3736b0514bc$var$template = document.createElement(\"template\");\nconst $862aa3736b0514bc$var$styles = /* css */ `\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n$862aa3736b0514bc$var$template.innerHTML = /* html */ `\n \n\n \n\n
\n Drag 'n' drop files here, or click to select files\n
\n`;\n/**\n * @summary A custom element that allows users to drag and drop files into it.\n * @documentation https://github.com/georapbox/files-dropzone-element\n *\n * @tagname files-dropzone - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {string} accept - A comma-separated list of unique file type specifiers describing file types to allow.\n * @property {boolean} disabled - Determines whether the dropzone is disabled.\n * @property {number} maxFiles - The maximum number of files allowed to be dropped.\n * @property {number} maxSize - The maximum file size allowed in bytes.\n * @property {number} minSize - The minimum file size allowed in bytes.\n * @property {boolean} multiple - Allows multiple files to be dropped.\n * @property {boolean} autoFocus - Automatically focuses the dropzone when it's connected to the DOM.\n * @property {boolean} noStyle - Prevents the dropzone from applying any styling.\n *\n * @attribute {string} accept - Reflects the accept property.\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {number} max-files - Reflects the maxFiles property.\n * @attribute {number} max-size - Reflects the maxSize property.\n * @attribute {number} min-size - Reflects the minSize property.\n * @attribute {boolean} multiple - Reflects the multiple property.\n * @attribute {boolean} auto-focus - Reflects the autoFocus property.\n * @attribute {boolean} no-style - Reflects the noStyle property.\n *\n * @slot - The default slot content of the dropzone.\n *\n * @csspart dropzone - The dropzone element.\n * @csspart dropzone--dragover - The state of the dropzone when dragging over it.\n *\n * @cssproperty --dropzone-border-width - The border width of the dropzone.\n * @cssproperty --dropzone-border-style - The border style of the dropzone.\n * @cssproperty --dropzone-border-radius - The border radius of the dropzone.\n * @cssproperty --dropzone-border-color - The border color of the dropzone.\n * @cssproperty --dropzone-border-color-dragover - The border color of the dropzone when dragging over it.\n * @cssproperty --dropzone-border-color-hover - The border color of the dropzone when hovering over it.\n * @cssproperty --dropzone-background-color - The background color of the dropzone.\n * @cssproperty --dropzone-background-color-dragover - The background color of the dropzone when dragging over it.\n * @cssproperty --dropzone-background-color-hover - The background color of the dropzone when hovering over it.\n * @cssproperty --dropzone-body-color - The text color of the dropzone.\n * @cssproperty --dropzone-body-color-dragover - The text color of the dropzone when dragging over it.\n * @cssproperty --dropzone-body-color-hover - The text color of the dropzone when hovering over it.\n * @cssproperty --dropzone-focus-shadow-rgb - The RGB value of the dropzone's focus shadow.\n * @cssproperty --dropzone-focus-box-shadow - The box shadow of the dropzone when focused.\n * @cssproperty --dropzone-transition-duration - The transition's duration for the dropzone area.\n *\n * @event files-dropzone-drop - Fired when files are dropped.\n * @event files-dropzone-drop-accepted - Fired when files dropped files are accepted.\n * @event files-dropzone-drop-rejected - Fired when files dropped files are rejected.\n * @event files-dropzone-dragenter - Fired when files are dragged into the dropzone.\n * @event files-dropzone-dragover - Fired when files are dragged over the dropzone.\n * @event files-dropzone-dragleave - Fired when files are dragged out of the dropzone.\n * @event files-dropzone-error - Fired when there is any error in the process of reading dropped files or directories.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method openFileDialog - Instance method. Opens the file dialog programmatically.\n */ class $862aa3736b0514bc$export$6ccd1735166caad9 extends HTMLElement {\n /** @type {Nullable} */ #fileInput = null;\n /** @type {Nullable} */ #dropzoneEl = null;\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\",\n delegatesFocus: true\n });\n shadowRoot.appendChild($862aa3736b0514bc$var$template.content.cloneNode(true));\n }\n if (this.shadowRoot) {\n this.#fileInput = /** @type {Nullable} */ this.shadowRoot.getElementById(\"file-input\");\n this.#dropzoneEl = this.shadowRoot.getElementById(\"dropzone\");\n }\n }\n static get observedAttributes() {\n return [\n \"accept\",\n \"disabled\",\n \"multiple\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"accept\" && oldValue !== newValue && this.#fileInput) this.#fileInput.accept = this.accept;\n if (name === \"disabled\" && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.disabled = this.disabled;\n if (this.disabled) {\n this.#dropzoneEl?.removeAttribute(\"tabindex\");\n this.#dropzoneEl?.setAttribute(\"aria-disabled\", \"true\");\n } else {\n this.#dropzoneEl?.setAttribute(\"tabindex\", \"0\");\n this.#dropzoneEl?.setAttribute(\"aria-disabled\", \"false\");\n }\n }\n if (name === \"multiple\" && oldValue !== newValue && this.#fileInput) this.#fileInput.multiple = this.multiple;\n }\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"accept\");\n this.#upgradeProperty(\"disabled\");\n this.#upgradeProperty(\"maxFiles\");\n this.#upgradeProperty(\"maxSize\");\n this.#upgradeProperty(\"minSize\");\n this.#upgradeProperty(\"multiple\");\n this.#upgradeProperty(\"autoFocus\");\n this.#upgradeProperty(\"noStyle\");\n this.#fileInput?.addEventListener(\"change\", this.#handleFileInputChange);\n this.#dropzoneEl?.addEventListener(\"dragenter\", this.#handleDragEnter);\n this.#dropzoneEl?.addEventListener(\"dragover\", this.#handleDragOver);\n this.#dropzoneEl?.addEventListener(\"dragleave\", this.#handleDragLeave);\n this.#dropzoneEl?.addEventListener(\"drop\", this.#handleDrop);\n this.#dropzoneEl?.addEventListener(\"click\", this.#handleClick);\n this.#dropzoneEl?.addEventListener(\"keyup\", this.#handleKeyUp);\n this.autoFocus && this.#dropzoneEl?.focus();\n }\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */ disconnectedCallback() {\n this.#fileInput?.removeEventListener(\"change\", this.#handleFileInputChange);\n this.#dropzoneEl?.removeEventListener(\"dragenter\", this.#handleDragEnter);\n this.#dropzoneEl?.removeEventListener(\"dragover\", this.#handleDragOver);\n this.#dropzoneEl?.removeEventListener(\"dragleave\", this.#handleDragLeave);\n this.#dropzoneEl?.removeEventListener(\"drop\", this.#handleDrop);\n this.#dropzoneEl?.removeEventListener(\"click\", this.#handleClick);\n this.#dropzoneEl?.removeEventListener(\"keyup\", this.#handleKeyUp);\n }\n /**\n * @type {string} - A comma-separated list of unique file type specifiers describing file types to allow.\n * @attribute accept - Reflects the accept property.\n */ get accept() {\n return this.getAttribute(\"accept\") || \"\";\n }\n set accept(value) {\n this.setAttribute(\"accept\", value != null ? value.toString() : value);\n }\n /**\n * @type {boolean} - Determines whether the dropzone is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */ get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(value) {\n this.toggleAttribute(\"disabled\", !!value);\n }\n /**\n * @type {number} - The maximum number of files allowed to be dropped.\n * @default Infinity\n * @attribute max-files - Reflects the maxFiles property.\n */ get maxFiles() {\n const num = Number(this.getAttribute(\"max-files\")) || 0;\n if (num <= 0) return Infinity;\n return Math.floor(Math.abs(num));\n }\n set maxFiles(value) {\n this.setAttribute(\"max-files\", value != null ? value.toString() : value);\n }\n /**\n * @type {number} - The maximum file size allowed in bytes.\n * @default Infinity\n * @attribute max-size - Reflects the maxSize property.\n */ get maxSize() {\n const value = this.getAttribute(\"max-size\");\n if (value === null) return Infinity;\n const num = Number(value);\n return Number.isNaN(num) ? Infinity : num;\n }\n set maxSize(value) {\n this.setAttribute(\"max-size\", value != null ? value.toString() : value);\n }\n /**\n * @type {number} - The minimum file size allowed in bytes.\n * @default 0\n * @attribute min-size - Reflects the minSize property.\n */ get minSize() {\n const value = this.getAttribute(\"min-size\");\n if (value === null) return 0;\n const num = Number(value);\n return Number.isNaN(num) ? 0 : num;\n }\n set minSize(value) {\n this.setAttribute(\"min-size\", value != null ? value.toString() : value);\n }\n /**\n * @type {boolean} - Allows multiple files to be dropped.\n * @default false\n * @attribute multiple - Reflects the multiple property.\n */ get multiple() {\n return this.hasAttribute(\"multiple\");\n }\n set multiple(value) {\n this.toggleAttribute(\"multiple\", !!value);\n }\n /**\n * @type {boolean} - Automatically focuses the dropzone when it's connected to the DOM.\n * @default false\n * @attribute auto-focus - Reflects the autoFocus property.\n */ get autoFocus() {\n return this.hasAttribute(\"auto-focus\");\n }\n set autoFocus(value) {\n this.toggleAttribute(\"auto-focus\", !!value);\n }\n /**\n * @type {boolean} - Prevents the dropzone from applying any styling.\n * @default false\n * @attribute no-style - Reflects the noStyle property.\n */ get noStyle() {\n return this.hasAttribute(\"no-style\");\n }\n set noStyle(value) {\n this.toggleAttribute(\"no-style\", !!value);\n }\n /**\n * Handles the change event of the file input.\n *\n * @param {*} evt - The event object.\n */ #handleFileInputChange = async (evt)=>{\n try {\n this.#handleFilesSelect(await (0, $f31161edf38949e9$export$6d52664cd15c442)(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }\n };\n /**\n * Handles the dragenter event of the dropzone.\n */ #handleDragEnter = ()=>{\n if (this.disabled) return;\n this.dispatchEvent(new Event(`${$862aa3736b0514bc$var$COMPONENT_NAME}-dragenter`, {\n bubbles: true,\n composed: true\n }));\n };\n /**\n * Handles the dragover event of the dropzone.\n *\n * @param {*} evt - The event object.\n */ #handleDragOver = (evt)=>{\n evt.preventDefault();\n if (this.disabled) {\n evt.dataTransfer.dropEffect = \"none\";\n return;\n }\n evt.dataTransfer.dropEffect = \"copy\";\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.add(\"dropzone--dragover\");\n this.#dropzoneEl.part.add(\"dropzone--dragover\");\n }\n this.dispatchEvent(new Event(`${$862aa3736b0514bc$var$COMPONENT_NAME}-dragover`, {\n bubbles: true,\n composed: true\n }));\n };\n /**\n * Handles the dragleave event of the dropzone.\n */ #handleDragLeave = ()=>{\n if (this.disabled) return;\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove(\"dropzone--dragover\");\n this.#dropzoneEl.part.remove(\"dropzone--dragover\");\n }\n this.dispatchEvent(new Event(`${$862aa3736b0514bc$var$COMPONENT_NAME}-dragleave`, {\n bubbles: true,\n composed: true\n }));\n };\n /**\n * Handles the drop event of the dropzone.\n *\n * @param {*} evt - The event object.\n */ #handleDrop = async (evt)=>{\n if (this.disabled) return;\n evt.preventDefault();\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove(\"dropzone--dragover\");\n this.#dropzoneEl.part.remove(\"dropzone--dragover\");\n }\n try {\n this.#handleFilesSelect(await (0, $f31161edf38949e9$export$6d52664cd15c442)(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }\n };\n /**\n * Handles the click event of the dropzone.\n */ #handleClick = ()=>{\n if (this.disabled) return;\n this.#fileInput?.click();\n };\n /**\n * Handles the keyup event of the dropzone.\n *\n * @param {*} evt - The event object.\n */ #handleKeyUp = (evt)=>{\n if (this.disabled) return;\n if (evt.key === \" \" || evt.key === \"Enter\") this.#fileInput?.click();\n };\n /**\n * Handles the selection of files.\n *\n * @param {File[]} files - The files to handle.\n */ #handleFilesSelect(files) {\n if (!Array.isArray(files) || !files.length) return;\n const acceptedFiles = [];\n const rejectedFiles = [];\n const filesLength = files.length;\n // If the component is not in multiple mode, reject all files.\n if (!this.multiple && filesLength > 1) for (const file of files)rejectedFiles.push({\n file: file,\n errors: [\n {\n code: $862aa3736b0514bc$var$TOO_MANY_FILES,\n message: `Too many files selected. Only 1 file is allowed.`\n }\n ]\n });\n else if (this.multiple && filesLength > this.maxFiles) // If the component is in multiple mode, but the number of files exceeds\n // the maxFiles attribute, reject all files.\n for (const file of files)rejectedFiles.push({\n file: file,\n errors: [\n {\n code: $862aa3736b0514bc$var$TOO_MANY_FILES,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? \"files are\" : \"file is\"} allowed.`\n }\n ]\n });\n else // Validate each file. If it's valid, add it to the accepted files array,\n // otherwise add it to the rejected files array.\n for (const file of files){\n const fileHasValidType = (0, $38f222170fd4d21a$export$7c47054fed488f80)(file, this.accept);\n const fileExceedsMaxSize = file.size > this.maxSize;\n const fileIsSmallerThanMinSize = file.size < this.minSize;\n if (fileHasValidType && !fileExceedsMaxSize && !fileIsSmallerThanMinSize) acceptedFiles.push(file);\n else {\n const errors = [];\n if (!fileHasValidType) errors.push({\n code: $862aa3736b0514bc$var$INVALID_MIME_TYPE,\n message: `File type \"${file.type}\" is not accepted.`\n });\n if (fileExceedsMaxSize) errors.push({\n code: $862aa3736b0514bc$var$FILE_TOO_LARGE,\n message: `File size ${file.size} exceeds the maximum size of ${this.maxSize}.`\n });\n if (fileIsSmallerThanMinSize) errors.push({\n code: $862aa3736b0514bc$var$FILE_TOO_SMALL,\n message: `File size ${file.size} is smaller than the minimum size of ${this.minSize}.`\n });\n rejectedFiles.push({\n file: file,\n errors: errors\n });\n }\n }\n this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-drop`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles: acceptedFiles,\n rejectedFiles: rejectedFiles\n }\n }));\n if (acceptedFiles.length > 0) this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-drop-accepted`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles: acceptedFiles\n }\n }));\n if (rejectedFiles.length > 0) this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-drop-rejected`, {\n bubbles: true,\n composed: true,\n detail: {\n rejectedFiles: rejectedFiles\n }\n }));\n if (this.#fileInput) this.#fileInput.value = this.#fileInput.defaultValue;\n }\n /**\n * Opens the file dialog programmatically.\n */ openFileDialog() {\n if (this.disabled) return;\n this.#fileInput?.click();\n }\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'accept' | 'disabled' | 'maxFiles' | 'maxSize' | 'minSize' | 'multiple' | 'autoFocus' | 'noStyle'} prop - The property name to upgrade.\n */ #upgradeProperty(prop) {\n /** @type {any} */ const instance = this;\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='files-dropzone'] - The name of the custom element.\n * @example\n *\n * FilesDropzone.defineCustomElement('my-dropzone');\n */ static defineCustomElement(elementName = $862aa3736b0514bc$var$COMPONENT_NAME) {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $862aa3736b0514bc$export$6ccd1735166caad9);\n }\n}\n\n\n(0, $862aa3736b0514bc$export$6ccd1735166caad9).defineCustomElement();\n\n\nexport {$862aa3736b0514bc$export$6ccd1735166caad9 as FilesDropzone};\n//# sourceMappingURL=files-dropzone-defined.js.map\n","import { FilesDropzone } from './files-dropzone.js';\n\nFilesDropzone.defineCustomElement();\n\nexport { FilesDropzone };\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\nimport { isValidFile } from './utils/is-valid-file.js';\nimport { getFilesFromEvent } from './utils/files-selector.js';\n\nconst COMPONENT_NAME = 'files-dropzone';\nconst TOO_MANY_FILES = 'TOO_MANY_FILES';\nconst FILE_TOO_LARGE = 'FILE_TOO_LARGE';\nconst FILE_TOO_SMALL = 'FILE_TOO_SMALL';\nconst INVALID_MIME_TYPE = 'INVALID_MIME_TYPE';\nconst template = document.createElement('template');\n\nconst styles = /* css */`\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n\ntemplate.innerHTML = /* html */`\n \n\n \n\n
\n Drag 'n' drop files here, or click to select files\n
\n`;\n\n/**\n * @summary A custom element that allows users to drag and drop files into it.\n * @documentation https://github.com/georapbox/files-dropzone-element\n *\n * @tagname files-dropzone - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {string} accept - A comma-separated list of unique file type specifiers describing file types to allow.\n * @property {boolean} disabled - Determines whether the dropzone is disabled.\n * @property {number} maxFiles - The maximum number of files allowed to be dropped.\n * @property {number} maxSize - The maximum file size allowed in bytes.\n * @property {number} minSize - The minimum file size allowed in bytes.\n * @property {boolean} multiple - Allows multiple files to be dropped.\n * @property {boolean} autoFocus - Automatically focuses the dropzone when it's connected to the DOM.\n * @property {boolean} noStyle - Prevents the dropzone from applying any styling.\n *\n * @attribute {string} accept - Reflects the accept property.\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {number} max-files - Reflects the maxFiles property.\n * @attribute {number} max-size - Reflects the maxSize property.\n * @attribute {number} min-size - Reflects the minSize property.\n * @attribute {boolean} multiple - Reflects the multiple property.\n * @attribute {boolean} auto-focus - Reflects the autoFocus property.\n * @attribute {boolean} no-style - Reflects the noStyle property.\n *\n * @slot - The default slot content of the dropzone.\n *\n * @csspart dropzone - The dropzone element.\n * @csspart dropzone--dragover - The state of the dropzone when dragging over it.\n *\n * @cssproperty --dropzone-border-width - The border width of the dropzone.\n * @cssproperty --dropzone-border-style - The border style of the dropzone.\n * @cssproperty --dropzone-border-radius - The border radius of the dropzone.\n * @cssproperty --dropzone-border-color - The border color of the dropzone.\n * @cssproperty --dropzone-border-color-dragover - The border color of the dropzone when dragging over it.\n * @cssproperty --dropzone-border-color-hover - The border color of the dropzone when hovering over it.\n * @cssproperty --dropzone-background-color - The background color of the dropzone.\n * @cssproperty --dropzone-background-color-dragover - The background color of the dropzone when dragging over it.\n * @cssproperty --dropzone-background-color-hover - The background color of the dropzone when hovering over it.\n * @cssproperty --dropzone-body-color - The text color of the dropzone.\n * @cssproperty --dropzone-body-color-dragover - The text color of the dropzone when dragging over it.\n * @cssproperty --dropzone-body-color-hover - The text color of the dropzone when hovering over it.\n * @cssproperty --dropzone-focus-shadow-rgb - The RGB value of the dropzone's focus shadow.\n * @cssproperty --dropzone-focus-box-shadow - The box shadow of the dropzone when focused.\n * @cssproperty --dropzone-transition-duration - The transition's duration for the dropzone area.\n *\n * @event files-dropzone-drop - Fired when files are dropped.\n * @event files-dropzone-drop-accepted - Fired when files dropped files are accepted.\n * @event files-dropzone-drop-rejected - Fired when files dropped files are rejected.\n * @event files-dropzone-dragenter - Fired when files are dragged into the dropzone.\n * @event files-dropzone-dragover - Fired when files are dragged over the dropzone.\n * @event files-dropzone-dragleave - Fired when files are dragged out of the dropzone.\n * @event files-dropzone-error - Fired when there is any error in the process of reading dropped files or directories.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method openFileDialog - Instance method. Opens the file dialog programmatically.\n */\nclass FilesDropzone extends HTMLElement {\n /** @type {Nullable} */\n #fileInput = null;\n\n /** @type {Nullable} */\n #dropzoneEl = null;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n if (this.shadowRoot) {\n this.#fileInput = /** @type {Nullable} */(this.shadowRoot.getElementById('file-input'));\n this.#dropzoneEl = this.shadowRoot.getElementById('dropzone');\n }\n }\n\n static get observedAttributes() {\n return ['accept', 'disabled', 'multiple'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'accept' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.accept = this.accept;\n }\n\n if (name === 'disabled' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.disabled = this.disabled;\n\n if (this.disabled) {\n this.#dropzoneEl?.removeAttribute('tabindex');\n this.#dropzoneEl?.setAttribute('aria-disabled', 'true');\n } else {\n this.#dropzoneEl?.setAttribute('tabindex', '0');\n this.#dropzoneEl?.setAttribute('aria-disabled', 'false');\n }\n }\n\n if (name === 'multiple' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.multiple = this.multiple;\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('accept');\n this.#upgradeProperty('disabled');\n this.#upgradeProperty('maxFiles');\n this.#upgradeProperty('maxSize');\n this.#upgradeProperty('minSize');\n this.#upgradeProperty('multiple');\n this.#upgradeProperty('autoFocus');\n this.#upgradeProperty('noStyle');\n\n this.#fileInput?.addEventListener('change', this.#handleFileInputChange);\n this.#dropzoneEl?.addEventListener('dragenter', this.#handleDragEnter);\n this.#dropzoneEl?.addEventListener('dragover', this.#handleDragOver);\n this.#dropzoneEl?.addEventListener('dragleave', this.#handleDragLeave);\n this.#dropzoneEl?.addEventListener('drop', this.#handleDrop);\n this.#dropzoneEl?.addEventListener('click', this.#handleClick);\n this.#dropzoneEl?.addEventListener('keyup', this.#handleKeyUp);\n\n this.autoFocus && this.#dropzoneEl?.focus();\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#fileInput?.removeEventListener('change', this.#handleFileInputChange);\n this.#dropzoneEl?.removeEventListener('dragenter', this.#handleDragEnter);\n this.#dropzoneEl?.removeEventListener('dragover', this.#handleDragOver);\n this.#dropzoneEl?.removeEventListener('dragleave', this.#handleDragLeave);\n this.#dropzoneEl?.removeEventListener('drop', this.#handleDrop);\n this.#dropzoneEl?.removeEventListener('click', this.#handleClick);\n this.#dropzoneEl?.removeEventListener('keyup', this.#handleKeyUp);\n }\n\n /**\n * @type {string} - A comma-separated list of unique file type specifiers describing file types to allow.\n * @attribute accept - Reflects the accept property.\n */\n get accept() {\n return this.getAttribute('accept') || '';\n }\n\n set accept(value) {\n this.setAttribute('accept', value != null ? value.toString() : value);\n }\n\n /**\n * @type {boolean} - Determines whether the dropzone is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value) {\n this.toggleAttribute('disabled', !!value);\n }\n\n /**\n * @type {number} - The maximum number of files allowed to be dropped.\n * @default Infinity\n * @attribute max-files - Reflects the maxFiles property.\n */\n get maxFiles() {\n const num = Number(this.getAttribute('max-files')) || 0;\n\n if (num <= 0) {\n return Infinity;\n }\n\n return Math.floor(Math.abs(num));\n }\n\n set maxFiles(value) {\n this.setAttribute('max-files', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} - The maximum file size allowed in bytes.\n * @default Infinity\n * @attribute max-size - Reflects the maxSize property.\n */\n get maxSize() {\n const value = this.getAttribute('max-size');\n\n if (value === null) {\n return Infinity;\n }\n\n const num = Number(value);\n\n return Number.isNaN(num) ? Infinity : num;\n }\n\n set maxSize(value) {\n this.setAttribute('max-size', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} - The minimum file size allowed in bytes.\n * @default 0\n * @attribute min-size - Reflects the minSize property.\n */\n get minSize() {\n const value = this.getAttribute('min-size');\n\n if (value === null) {\n return 0;\n }\n\n const num = Number(value);\n\n return Number.isNaN(num) ? 0 : num;\n }\n\n set minSize(value) {\n this.setAttribute('min-size', value != null ? value.toString() : value);\n }\n\n /**\n * @type {boolean} - Allows multiple files to be dropped.\n * @default false\n * @attribute multiple - Reflects the multiple property.\n */\n get multiple() {\n return this.hasAttribute('multiple');\n }\n\n set multiple(value) {\n this.toggleAttribute('multiple', !!value);\n }\n\n /**\n * @type {boolean} - Automatically focuses the dropzone when it's connected to the DOM.\n * @default false\n * @attribute auto-focus - Reflects the autoFocus property.\n */\n get autoFocus() {\n return this.hasAttribute('auto-focus');\n }\n\n set autoFocus(value) {\n this.toggleAttribute('auto-focus', !!value);\n }\n\n /**\n * @type {boolean} - Prevents the dropzone from applying any styling.\n * @default false\n * @attribute no-style - Reflects the noStyle property.\n */\n get noStyle() {\n return this.hasAttribute('no-style');\n }\n\n set noStyle(value) {\n this.toggleAttribute('no-style', !!value);\n }\n\n /**\n * Handles the change event of the file input.\n *\n * @param {*} evt - The event object.\n */\n #handleFileInputChange = async evt => {\n try {\n this.#handleFilesSelect(await getFilesFromEvent(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n };\n\n /**\n * Handles the dragenter event of the dropzone.\n */\n #handleDragEnter = () => {\n if (this.disabled) {\n return;\n }\n\n this.dispatchEvent(new Event(`${COMPONENT_NAME}-dragenter`, {\n bubbles: true,\n composed: true\n }));\n };\n\n /**\n * Handles the dragover event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleDragOver = evt => {\n evt.preventDefault();\n\n if (this.disabled) {\n evt.dataTransfer.dropEffect = 'none';\n return;\n }\n\n evt.dataTransfer.dropEffect = 'copy';\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.add('dropzone--dragover');\n this.#dropzoneEl.part.add('dropzone--dragover');\n }\n\n this.dispatchEvent(new Event(`${COMPONENT_NAME}-dragover`, {\n bubbles: true,\n composed: true\n }));\n };\n\n /**\n * Handles the dragleave event of the dropzone.\n */\n #handleDragLeave = () => {\n if (this.disabled) {\n return;\n }\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove('dropzone--dragover');\n this.#dropzoneEl.part.remove('dropzone--dragover');\n }\n\n this.dispatchEvent(new Event(`${COMPONENT_NAME}-dragleave`, {\n bubbles: true,\n composed: true\n }));\n };\n\n /**\n * Handles the drop event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleDrop = async evt => {\n if (this.disabled) {\n return;\n }\n\n evt.preventDefault();\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove('dropzone--dragover');\n this.#dropzoneEl.part.remove('dropzone--dragover');\n }\n\n try {\n this.#handleFilesSelect(await getFilesFromEvent(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n };\n\n /**\n * Handles the click event of the dropzone.\n */\n #handleClick = () => {\n if (this.disabled) {\n return;\n }\n\n this.#fileInput?.click();\n };\n\n /**\n * Handles the keyup event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleKeyUp = evt => {\n if (this.disabled) {\n return;\n }\n\n if (evt.key === ' ' || evt.key === 'Enter') {\n this.#fileInput?.click();\n }\n };\n\n /**\n * Handles the selection of files.\n *\n * @param {File[]} files - The files to handle.\n */\n #handleFilesSelect(files) {\n if (!Array.isArray(files) || !files.length) {\n return;\n }\n\n const acceptedFiles = [];\n const rejectedFiles = [];\n const filesLength = files.length;\n\n // If the component is not in multiple mode, reject all files.\n if (!this.multiple && filesLength > 1) {\n for (const file of files) {\n rejectedFiles.push({\n file,\n errors: [{\n code: TOO_MANY_FILES,\n message: `Too many files selected. Only 1 file is allowed.`\n }]\n });\n }\n } else if (this.multiple && filesLength > this.maxFiles) {\n // If the component is in multiple mode, but the number of files exceeds\n // the maxFiles attribute, reject all files.\n for (const file of files) {\n rejectedFiles.push({\n file,\n errors: [{\n code: TOO_MANY_FILES,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? 'files are' : 'file is'} allowed.`\n }]\n });\n }\n } else {\n // Validate each file. If it's valid, add it to the accepted files array,\n // otherwise add it to the rejected files array.\n for (const file of files) {\n const fileHasValidType = isValidFile(file, this.accept);\n const fileExceedsMaxSize = file.size > this.maxSize;\n const fileIsSmallerThanMinSize = file.size < this.minSize;\n\n if (fileHasValidType && !fileExceedsMaxSize && !fileIsSmallerThanMinSize) {\n acceptedFiles.push(file);\n } else {\n const errors = [];\n\n if (!fileHasValidType) {\n errors.push({\n code: INVALID_MIME_TYPE,\n message: `File type \"${file.type}\" is not accepted.`\n });\n }\n\n if (fileExceedsMaxSize) {\n errors.push({\n code: FILE_TOO_LARGE,\n message: `File size ${file.size} exceeds the maximum size of ${this.maxSize}.`\n });\n }\n\n if (fileIsSmallerThanMinSize) {\n errors.push({\n code: FILE_TOO_SMALL,\n message: `File size ${file.size} is smaller than the minimum size of ${this.minSize}.`\n });\n }\n\n rejectedFiles.push({ file, errors });\n }\n }\n }\n\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-drop`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles,\n rejectedFiles\n }\n }));\n\n if (acceptedFiles.length > 0) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-drop-accepted`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles\n }\n }));\n }\n\n if (rejectedFiles.length > 0) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-drop-rejected`, {\n bubbles: true,\n composed: true,\n detail: {\n rejectedFiles\n }\n }));\n }\n\n if (this.#fileInput) {\n this.#fileInput.value = this.#fileInput.defaultValue;\n }\n }\n\n /**\n * Opens the file dialog programmatically.\n */\n openFileDialog() {\n if (this.disabled) {\n return;\n }\n\n this.#fileInput?.click();\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'accept' | 'disabled' | 'maxFiles' | 'maxSize' | 'minSize' | 'multiple' | 'autoFocus' | 'noStyle'} prop - The property name to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='files-dropzone'] - The name of the custom element.\n * @example\n *\n * FilesDropzone.defineCustomElement('my-dropzone');\n */\n static defineCustomElement(elementName = COMPONENT_NAME) {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, FilesDropzone);\n }\n }\n}\n\nexport { FilesDropzone };\n","// @ts-check\n\n/**\n * Checks if a file is valid based on the accepted file type specifiers.\n *\n * @param {File} file - The File object to validate.\n * @param {string} [acceptedTypeSpecifiers=''] - The accepted file type specifiers.\n * @returns {boolean} - True if the file is valid, false otherwise.\n */\nexport function isValidFile(file, acceptedTypeSpecifiers = '') {\n if (!acceptedTypeSpecifiers) {\n return true;\n }\n\n const acceptedMimeTypesList = [\n ...new Set(acceptedTypeSpecifiers.split(',').map(v => v.trim()).filter(Boolean))\n ];\n\n const fileMimeType = file.type;\n const baseMimeType = fileMimeType.replace(/\\/.*$/, '');\n\n for (const validType of acceptedMimeTypesList) {\n if (validType.charAt(0) === '.') {\n if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) {\n return true;\n }\n } else if (/\\/\\*$/.test(validType)) {\n // Check for mime type that looks like \"image/*\" or similar.\n if (baseMimeType === validType.replace(/\\/.*$/, '')) {\n return true;\n }\n } else {\n if (fileMimeType === validType) {\n return true;\n }\n }\n }\n\n return false;\n}\n","// @ts-check\n\n/**\n * A map of common file extensions and their associated MIME types.\n */\nconst COMMON_MIME_TYPES = new Map([\n // https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types\n ['aac', 'audio/aac'],\n ['abw', 'application/x-abiword'],\n ['arc', 'application/x-freearc'],\n ['avif', 'image/avif'],\n ['avi', 'video/x-msvideo'],\n ['azw', 'application/vnd.amazon.ebook'],\n ['bin', 'application/octet-stream'],\n ['bmp', 'image/bmp'],\n ['bz', 'application/x-bzip'],\n ['bz2', 'application/x-bzip2'],\n ['cda', 'application/x-cdf'],\n ['csh', 'application/x-csh'],\n ['css', 'text/css'],\n ['csv', 'text/csv'],\n ['doc', 'application/msword'],\n ['docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n ['eot', 'application/vnd.ms-fontobject'],\n ['epub', 'application/epub+zip'],\n ['gz', 'application/gzip'],\n ['gif', 'image/gif'],\n ['heic', 'image/heic'],\n ['heif', 'image/heif'],\n ['htm', 'text/html'],\n ['html', 'text/html'],\n ['ico', 'image/vnd.microsoft.icon'],\n ['ics', 'text/calendar'],\n ['jar', 'application/java-archive'],\n ['jpeg', 'image/jpeg'],\n ['jpg', 'image/jpeg'],\n ['jxl', 'image/jxl'],\n ['js', 'text/javascript'],\n ['json', 'application/json'],\n ['jsonld', 'application/ld+json'],\n ['markdown', 'text/markdown'],\n ['md', 'text/markdown'],\n ['mid', 'audio/midi'],\n ['midi', 'audio/midi'],\n ['mjs', 'text/javascript'],\n ['mp3', 'audio/mpeg'],\n ['mp4', 'video/mp4'],\n ['mpeg', 'video/mpeg'],\n ['mpkg', 'application/vnd.apple.installer+xml'],\n ['odp', 'application/vnd.oasis.opendocument.presentation'],\n ['ods', 'application/vnd.oasis.opendocument.spreadsheet'],\n ['odt', 'application/vnd.oasis.opendocument.text'],\n ['oga', 'audio/ogg'],\n ['ogv', 'video/ogg'],\n ['ogx', 'application/ogg'],\n ['opus', 'audio/opus'],\n ['otf', 'font/otf'],\n ['png', 'image/png'],\n ['pdf', 'application/pdf'],\n ['php', 'application/x-httpd-php'],\n ['ppt', 'application/vnd.ms-powerpoint'],\n ['pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],\n ['rar', 'application/vnd.rar'],\n ['rtf', 'application/rtf'],\n ['sh', 'application/x-sh'],\n ['svg', 'image/svg+xml'],\n ['swf', 'application/x-shockwave-flash'],\n ['tar', 'application/x-tar'],\n ['tif', 'image/tiff'],\n ['tiff', 'image/tiff'],\n ['ts', 'video/mp2t'],\n ['ttf', 'font/ttf'],\n ['txt', 'text/plain'],\n ['vsd', 'application/vnd.visio'],\n ['wav', 'audio/wav'],\n ['weba', 'audio/webm'],\n ['webm', 'video/webm'],\n ['webp', 'image/webp'],\n ['woff', 'font/woff'],\n ['woff2', 'font/woff2'],\n ['xhtml', 'application/xhtml+xml'],\n ['xls', 'application/vnd.ms-excel'],\n ['xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],\n ['xml', 'application/xml'],\n ['xul', 'application/vnd.mozilla.xul+xml'],\n ['zip', 'application/zip'],\n ['7z', 'application/x-7z-compressed'],\n\n // Others\n ['mkv', 'video/x-matroska'],\n ['mov', 'video/quicktime'],\n ['msg', 'application/vnd.ms-outlook']\n]);\n\nconst FILES_TO_IGNORE = [\n // Thumbnail cache files for macOS and Windows\n '.DS_Store', // macOs\n 'Thumbs.db' // Windows\n];\n\n/**\n * Adds a `type` property to the file object if it doesn't have one and the file has an extension.\n * This is needed because Firefox doesn't add a type property to files dragged from the desktop.\n * @bug https://bugzilla.mozilla.org/show_bug.cgi?id=1424689\n *\n * @param {File} file - The file object to add the type property to.\n * @returns {File} - The file object with the type property added.\n */\nconst toFileWithMimeType = file => {\n const { name } = file;\n const hasExtension = name && name.lastIndexOf('.') !== -1;\n\n if (hasExtension && !file.type) {\n const extension = (name.split('.').pop() || '').toLowerCase();\n const type = COMMON_MIME_TYPES.get(extension);\n\n if (type) {\n Object.defineProperty(file, 'type', {\n value: type,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n }\n\n return file;\n};\n\n/**\n * Adds a `path` property to the file object if it doesn't have one.\n * If `path` is not provided, the `webkitRelativePath` property of the file will be used\n * or the file's name if `webkitRelativePath` is not available.\n *\n * @param {File} file - The file object to add the path property to.\n * @param {string} [path] - The path to set on the file object.\n * @returns {File} - The file object with the path property added.\n */\nconst toFileWithPath = (file, path) => {\n const fileWithMimeType = toFileWithMimeType(file);\n\n // @ts-ignore\n if (typeof fileWithMimeType.path !== 'string') {\n const { webkitRelativePath } = file;\n\n Object.defineProperty(fileWithMimeType, 'path', {\n value: typeof path === 'string' ? path : webkitRelativePath || file.name,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n\n return fileWithMimeType;\n};\n\n/**\n * Wrap `FileSystemDirectoryReader.readEntries` in a promise to make working with read entries easier.\n * https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryReader/readEntries\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */\nconst readEntriesPromise = async directoryReader => {\n return await new Promise((resolve, reject) => {\n directoryReader.readEntries(resolve, reject);\n });\n};\n\n/**\n * Read all entries in a directory or sub-directory\n * by calling `readEntries` until it returns an empty array.\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */\nconst readAllDirectoryEntries = async directoryReader => {\n const entries = [];\n let readEntries = await readEntriesPromise(directoryReader);\n\n while (readEntries.length > 0) {\n entries.push(...readEntries);\n readEntries = await readEntriesPromise(directoryReader);\n }\n\n return entries;\n};\n\n/**\n * Get a `File` object from a `FileSystemFileEntry` object.\n *\n * @param {FileSystemFileEntry} fileEntry - The file entry to get a `File` object from.\n * @returns {Promise} - A promise that resolves with a `File` object.\n */\nconst getFileFromFileEntry = fileEntry => {\n return new Promise((resolve, reject) => {\n fileEntry.file(file => resolve(toFileWithPath(file, fileEntry.fullPath)), reject);\n });\n};\n\n/**\n * Get an array of `File` objects from a `DataTransferItemList` object.\n *\n * @param {DataTransferItemList} dataTransferItemList - The item list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nconst getFilesFromDataTransferItemList = async dataTransferItemList => {\n const files = [];\n\n // Chromium browsers read only 100 files at a time as per the spec, so we need to use\n // BFS (Breadth-first search) to traverse the entire directory/file structure.\n // https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/webkitGetAsEntry#javascript_content\n const queue = [];\n\n for (const item of dataTransferItemList) {\n if (item.kind !== 'file') {\n // Ignore non-file items, such as links.\n continue;\n }\n\n // https://developer.mozilla.org/docs/Web/API/DataTransferItem/webkitGetAsEntry\n // This function is implemented as `webkitGetAsEntry()` in non-WebKit browsers\n // including Firefox at this time but it may be renamed to `getAsEntry()` in the future.\n // @ts-ignore\n const entry = item.getAsEntry ? item.getAsEntry() : item.webkitGetAsEntry();\n\n queue.push(entry);\n }\n\n while (queue.length > 0) {\n const entry = queue.shift();\n\n if (!entry) {\n continue;\n } else if (entry.isFile) {\n const file = await getFileFromFileEntry(entry);\n\n if (FILES_TO_IGNORE.indexOf(file.name) === -1) {\n files.push(file);\n }\n } else if (entry.isDirectory) {\n queue.push(...await readAllDirectoryEntries(entry.createReader()));\n }\n }\n\n return files;\n};\n\n/**\n * Get an array of `File` objects from a `FileList` object.\n *\n * @param {FileList} fileList - The file list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nconst getFilesFromFileList = async fileList => {\n const files = [];\n\n for (const file of fileList) {\n if (FILES_TO_IGNORE.indexOf(file.name) === -1) {\n files.push(toFileWithPath(file));\n }\n }\n\n return files;\n};\n\n/**\n * Get an array of `File` objects from an event.\n * This function supports both `drop` and `change` events.\n *\n * @param {*} evt - The event to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nexport const getFilesFromEvent = async evt => {\n if (evt.dataTransfer) {\n return evt.dataTransfer.items\n ? await getFilesFromDataTransferItemList(evt.dataTransfer.items)\n : await getFilesFromFileList(evt.dataTransfer.files);\n }\n\n return await getFilesFromFileList(evt.target.files);\n};\n","export const ACCEPTED_MIME_TYPES = [\n 'image/jpg',\n 'image/jpeg',\n 'image/png',\n 'image/apng',\n 'image/gif',\n 'image/webp',\n 'image/avif'\n];\nexport const MAX_SHADOW_BLUR_SIZE = 20;\nexport const MAX_STROKE_WIDTH = 20;\nexport const MAX_ROTATE = 360;\n","/**\n * Generates a unique id of the form `${prefix}-${randomString}-${suffix}`.\n *\n * @param {string} [prefix=''] - The prefix to use for the id.\n * @param {string} [suffix=''] - The suffix to use for the id.\n * @returns {string} - The unique id.\n */\nconst uid = (prefix = '', suffix = '') => {\n const prefixString = typeof prefix === 'string' && prefix !== '' ? prefix + '-' : '';\n const suffixString = typeof suffix === 'string' && suffix !== '' ? '-' + suffix : '';\n const randomString = Math.random().toString(36).substring(2, 8); // Pseudo-random string of six alphanumeric characters.\n\n return `${prefixString}${randomString}${suffixString}`;\n};\n\nexport { uid };\n","import { ACCEPTED_MIME_TYPES } from '../constants.js';\n\n/**\n * Creates a file from a given URL.\n *\n * @param {{ url: string, filename: string, mimeType: string }} options\n * @param {string} options.url - The URL of the file to fetch.\n * @param {string} options.filename - The name of the file to create.\n * @param {string} options.mimeType - The MIME type of the file to create.\n * @returns {Promise} - A promise that resolves to the file created from the given URL.\n */\nexport const fileFromUrl = async (options = {}) => {\n const res = await fetch(options.url);\n const blob = await res.blob();\n const mimeType = options.mimeType || blob.type || '';\n\n if (!ACCEPTED_MIME_TYPES.includes(mimeType)) {\n throw new Error(\n `This is not an accepted image format. Accepted MIME types are: ${ACCEPTED_MIME_TYPES.join(', ')}`\n );\n }\n\n return new File([blob], options.filename || '', blob);\n};\n","/**\n * A class representing a storage utility for managing data in `localStorage` or `sessionStorage`.\n */\nclass Storage {\n /**\n * The prefix to be added to all keys.\n *\n * @type {string}\n * @private\n */\n #keyPrefix = null;\n\n /**\n * The storage provider (`localStorage` or `sessionStorage`).\n *\n * @type {Storage}\n * @private\n */\n #provider = null;\n\n /**\n * Creates an instance of Storage.\n *\n * @param {string} prefix - The prefix to be added to all keys when storing/retrieving data.\n * @param {Storage} [provider=localStorage] - The storage provider (`localStorage` or `sessionStorage`).\n * @throws {Error} If prefix is not provided or if the provider is not supported.\n */\n constructor(prefix, provider = localStorage) {\n if (!prefix) {\n throw new Error('Storage prefix is required');\n }\n\n if (provider !== localStorage && provider !== sessionStorage) {\n throw new Error('Storage provider is not supported');\n }\n\n this.#keyPrefix = prefix;\n this.#provider = provider;\n }\n\n /**\n * Sets a key-value pair in the storage.\n *\n * @param {string} key - The key for the data.\n * @param {*} value - The value to be stored (will be converted to JSON string).\n */\n set(key, value) {\n try {\n this.#provider.setItem(`${this.#keyPrefix}${key}`, JSON.stringify(value));\n } catch (err) {\n console.error('Error saving to storage', err);\n }\n }\n\n /**\n * Retrieves the value associated with the given key from the storage.\n *\n * @param {string} key - The key to retrieve the value for.\n * @returns {*} The value associated with the key, or `null` if key is not found or an error occurs.\n */\n get(key) {\n try {\n const value = this.#provider.getItem(`${this.#keyPrefix}${key}`);\n return value ? JSON.parse(value) : null;\n } catch (err) {\n console.error('Error getting from storage', err);\n return null;\n }\n }\n}\n\nconst DEFAULT_STORAGE_PREFIX = 'meme-generator/';\nconst DEFAULT_STORAGE_PROVIDER = localStorage;\nconst storage = new Storage(DEFAULT_STORAGE_PREFIX, DEFAULT_STORAGE_PROVIDER);\n\nexport { Storage, storage };\n","export const isSolidColorSelected = selectedImage => {\n return typeof selectedImage === 'string';\n};\n","import Pressuru from 'url:../assets/fonts/Pressuru/Pressuru.ttf';\nimport OswaldRegular from 'url:../assets/fonts/Oswald/Oswald-Regular.ttf';\nimport OswaldBold from 'url:../assets/fonts/Oswald/Oswald-Bold.ttf';\nimport RobotoRegular from 'url:../assets/fonts/Roboto/Roboto-Regular.ttf';\nimport RobotoBold from 'url:../assets/fonts/Roboto/Roboto-Bold.ttf';\nimport RobotoCondensedRegular from 'url:../assets/fonts/RobotoCondensed/RobotoCondensed-Regular.ttf';\nimport RobotoCondensedBold from 'url:../assets/fonts/RobotoCondensed/RobotoCondensed-Bold.ttf';\nimport CourierPrimeRegular from 'url:../assets/fonts/CourierPrime/CourierPrime-Regular.ttf';\nimport CourierPrimeBold from 'url:../assets/fonts/CourierPrime/CourierPrime-Bold.ttf';\nimport OpenSansRegular from 'url:../assets/fonts/OpenSans/OpenSans-Regular.ttf';\nimport OpenSansBold from 'url:../assets/fonts/OpenSans/OpenSans-Bold.ttf';\n\nexport const customFonts = [\n { name: 'Pressuru', label: 'Pressuru', path: Pressuru, style: 'normal', weight: '400' },\n { name: 'Oswald-Regular', label: 'Oswald', path: OswaldRegular, style: 'normal', weight: '400' },\n { name: 'Oswald-Bold', label: 'Oswald Bold', path: OswaldBold, style: 'normal', weight: '700' },\n { name: 'Roboto-Regular', label: 'Roboto', path: RobotoRegular, style: 'normal', weight: '400' },\n { name: 'Roboto-Bold', label: 'Roboto Bold', path: RobotoBold, style: 'normal', weight: '700' },\n {\n name: 'RobotoCondensed-Regular',\n label: 'Roboto Condensed',\n path: RobotoCondensedRegular,\n style: 'normal',\n weight: '400'\n },\n {\n name: 'RobotoCondensed-Bold',\n label: 'Roboto Condensed Bold',\n path: RobotoCondensedBold,\n style: 'normal',\n weight: '700'\n },\n {\n name: 'CourierPrime-Regular',\n label: 'Courier Prime',\n path: CourierPrimeRegular,\n style: 'normal',\n weight: '400'\n },\n {\n name: 'CourierPrime-Bold',\n label: 'Courier Prime Bold',\n path: CourierPrimeBold,\n style: 'normal',\n weight: '700'\n },\n {\n name: 'OpenSans-Regular',\n label: 'Open Sans',\n path: OpenSansRegular,\n style: 'normal',\n weight: '400'\n },\n {\n name: 'OpenSans-Bold',\n label: 'Open Sans Bold',\n path: OpenSansBold,\n style: 'normal',\n weight: '400'\n }\n];\n\nexport const loadCustomFont = async (name, path, options = {}) => {\n try {\n const font = new FontFace(name, `url(${path})`, { ...options });\n await font.load();\n document.fonts.add(font);\n } catch (err) {\n console.error(err);\n }\n};\n","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"Pressuru.684952ea.ttf\";","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"Oswald-Regular.89ec7d89.ttf\";","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"Oswald-Bold.0f6a7ca6.ttf\";","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"Roboto-Regular.ca197847.ttf\";","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"Roboto-Bold.fdb9b54a.ttf\";","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"RobotoCondensed-Regular.d585f5c7.ttf\";","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"RobotoCondensed-Bold.e1f96d4b.ttf\";","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"CourierPrime-Regular.3a25a501.ttf\";","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"CourierPrime-Bold.3d6bf689.ttf\";","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"OpenSans-Regular.edf9e01b.ttf\";","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"OpenSans-Bold.8fceb72b.ttf\";","const errorsContainer = document.getElementById('errorsContainer');\n\nconst hideError = evt => {\n const target = evt.currentTarget;\n target.removeEventListener('click', hideError);\n errorsContainer.removeChild(target.parentNode);\n};\n\nexport const toastAlert = (message = '', type = 'info') => {\n const types = ['info', 'warning', 'danger'];\n\n if (!types.includes(type)) {\n type = 'info';\n }\n\n const template = /* html */ `\n ${message}\n \n `;\n\n const div = document.createElement('div');\n div.className = `alert alert-${type} alert-dismissible text-break mb-2 fade`;\n div.innerHTML = template;\n div.querySelector('button').addEventListener('click', hideError);\n errorsContainer.appendChild(div);\n setTimeout(() => div.classList.add('show'), 100);\n};\n","import { uid } from './utils/uid.js';\nimport { customFonts } from './custom-fonts.js';\nimport { MAX_SHADOW_BLUR_SIZE, MAX_STROKE_WIDTH, MAX_ROTATE } from './constants.js';\n\nconst defaultTextboxData = {\n id: '',\n text: '',\n fillColor: '#ffffff',\n strokeColor: '#000000',\n font: 'Pressuru',\n fontSize: 40,\n fontWeight: 'normal',\n textAlign: 'center',\n shadowBlur: 0,\n strokeWidth: 1.5,\n offsetY: 0,\n offsetX: 0,\n rotate: 0,\n allCaps: true\n};\n\nconst textboxes = new Map();\n\nclass Textbox {\n constructor(data) {\n const id = uid('textbox', Date.now().toString(36));\n\n this.data = data ? { ...data, id } : { ...defaultTextboxData, id };\n\n textboxes.set(id, this);\n\n document.dispatchEvent(\n new CustomEvent(`textbox-create`, {\n bubbles: true,\n composed: true,\n detail: { textbox: this }\n })\n );\n }\n\n getData() {\n return this.data;\n }\n\n static create(data) {\n return new Textbox(data);\n }\n\n static getAll() {\n return textboxes;\n }\n\n static getById(id) {\n return textboxes.get(id);\n }\n\n static remove(id) {\n textboxes.delete(id);\n\n document.dispatchEvent(\n new CustomEvent(`textbox-remove`, {\n bubbles: true,\n composed: true,\n detail: { id }\n })\n );\n }\n\n static createElement(textbox, autoFocus = true) {\n if (!(textbox instanceof Textbox)) {\n return;\n }\n\n const data = textbox.getData();\n const {\n id,\n text,\n fillColor,\n strokeColor,\n fontSize,\n shadowBlur,\n strokeWidth,\n offsetX,\n offsetY,\n rotate\n } = data;\n\n const template = /* html */ `\n
\n \n \n\n \n\n
\n \n \n\n \n \n\n \n
\n
\n\n \n `;\n\n const fragment = document.createDocumentFragment();\n const div = document.createElement('div');\n\n div.setAttribute('id', id);\n div.setAttribute('data-section', 'textbox');\n div.className = 'bg-light border shadow-sm mb-3 rounded';\n div.innerHTML = template;\n div.querySelectorAll('select').forEach(el => (el.value = data[el.dataset.input]));\n div\n .querySelectorAll('input[type=\"checkbox\"]')\n .forEach(el => (el.checked = data[el.dataset.input]));\n\n const textboxEl = fragment.appendChild(div);\n\n if (autoFocus) {\n setTimeout(() => textboxEl.querySelector('[data-input=\"text\"]').focus(), 0);\n }\n\n return textboxEl;\n }\n}\n\nexport { Textbox };\n","import { isSolidColorSelected } from './utils/is-solid-color-selected.js';\nimport { MAX_SHADOW_BLUR_SIZE, MAX_STROKE_WIDTH, MAX_ROTATE } from './constants.js';\n\nexport class Canvas {\n #canvas = null;\n #ctx = null;\n\n constructor(canvasEl) {\n this.#canvas = canvasEl;\n this.#ctx = this.#canvas.getContext('2d');\n }\n\n get width() {\n return this.#canvas.width;\n }\n\n set width(value) {\n this.#canvas.width = value;\n }\n\n get height() {\n return this.#canvas.height;\n }\n\n set height(value) {\n this.#canvas.height = value;\n }\n\n getDimensions() {\n return {\n width: this.width,\n height: this.height\n };\n }\n\n setDimensions({ width, height }) {\n this.width = width;\n this.height = height;\n return this;\n }\n\n toDataURL() {\n return this.#canvas.toDataURL();\n }\n\n draw(image, textboxes = new Map()) {\n if (image == null) {\n return;\n }\n\n const canvas = this.#canvas;\n const ctx = this.#ctx;\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n if (isSolidColorSelected(image)) {\n ctx.fillStyle = image;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n } else {\n ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n }\n\n let multiplier = 0;\n\n textboxes.forEach(textbox => {\n const { data } = textbox;\n\n multiplier += 1;\n\n ctx.save();\n\n ctx.font = `${data.fontWeight} ${(data.fontSize * canvas.width) / 1000}px ${data.font}`;\n ctx.fillStyle = data.fillColor;\n ctx.textAlign = data.textAlign;\n ctx.strokeStyle = data.strokeColor;\n\n const lineHeight = ctx.measureText('M').width + data.fontSize / 2;\n const xPos = canvas.width / 2;\n const shadowBlur = data.shadowBlur;\n const text = data.allCaps === true ? data.text.toUpperCase() : data.text;\n const textLines = text.split('\\n');\n\n if (shadowBlur !== 0) {\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n ctx.shadowBlur = Math.min(shadowBlur, MAX_SHADOW_BLUR_SIZE);\n ctx.shadowColor = data.strokeColor;\n }\n\n ctx.translate(xPos + data.offsetX, lineHeight * multiplier + data.offsetY);\n ctx.rotate((Math.min(data.rotate, MAX_ROTATE) * Math.PI) / 180);\n\n // First draw each line with shadow.\n textLines.forEach((text, index) => ctx.fillText(text, 0, index * lineHeight));\n\n // Since shadows of multiline text may be drawn over letters of neighbour lines\n // (when shadow blur is big enough), re-draw text without shadows.\n if (shadowBlur !== 0) {\n ctx.shadowBlur = 0;\n textLines.forEach((text, index) => ctx.fillText(text, 0, index * lineHeight));\n }\n\n if (data.strokeWidth > 0) {\n ctx.lineWidth = Math.min(data.strokeWidth, MAX_STROKE_WIDTH);\n textLines.forEach((text, index) => ctx.strokeText(text, 0, index * lineHeight));\n }\n\n ctx.restore();\n });\n\n return this;\n }\n\n clear() {\n this.#ctx.clearRect(0, 0, this.#canvas.width, this.#canvas.height);\n return this;\n }\n\n show() {\n this.#canvas.hidden = false;\n return this;\n }\n\n hide() {\n this.#canvas.hidden = true;\n return this;\n }\n\n static createInstance(canvasEl) {\n return new Canvas(canvasEl);\n }\n}\n"],"names":["$1e5dc5e467331cb9$var$promise","$1e5dc5e467331cb9$var$baselineEmojiWidth","$parcel$interopDefault","a","__esModule","default","$dec5faeb65064cfd$var$browserSupportsTextareaTextNodes","$parcel$global","globalThis","self","window","global","$parcel$modules","$parcel$inits","parcelRequire","$d1f26ac162b12b4a$var$assertNonEmptyString","str","Error","$d1f26ac162b12b4a$var$assertNumber","number","id","exports","init","module","call","err","code","register","$d1f26ac162b12b4a$var$STORE_EMOJI","$d1f26ac162b12b4a$var$STORE_KEYVALUE","$d1f26ac162b12b4a$var$STORE_FAVORITES","$d1f26ac162b12b4a$var$INDEX_TOKENS","$d1f26ac162b12b4a$var$INDEX_COUNT","$d1f26ac162b12b4a$var$INDEX_GROUP_AND_ORDER","$d1f26ac162b12b4a$var$KEY_ETAG","$d1f26ac162b12b4a$var$KEY_PREFERRED_SKINTONE","$d1f26ac162b12b4a$var$MODE_READONLY","$d1f26ac162b12b4a$var$MODE_READWRITE","$d1f26ac162b12b4a$var$INDEX_SKIN_UNICODE","$d1f26ac162b12b4a$var$uniqEmoji","emojis","$d1f26ac162b12b4a$var$uniqBy","arr","func","set","Set","res","item","key","has","add","push","_","unicode","$d1f26ac162b12b4a$var$openIndexedDBRequests","$d1f26ac162b12b4a$var$databaseCache","$d1f26ac162b12b4a$var$onCloseListeners","$d1f26ac162b12b4a$var$handleOpenOrDeleteReq","resolve","reject","req","onerror","error","onblocked","onsuccess","result","$d1f26ac162b12b4a$var$createDatabase","dbName","db","Promise","indexedDB","open","onupgradeneeded","e","oldVersion","$d1f26ac162b12b4a$var$initialMigration","createObjectStore","name","keyPath","indexes","store","indexName","multiEntry","Object","entries","createIndex","undefined","onclose","$d1f26ac162b12b4a$var$closeDatabase","$d1f26ac162b12b4a$var$dbPromise","storeName","readOnlyOrReadWrite","cb","txn","transaction","durability","objectStore","map","oncomplete","close","listeners","listener","$d1f26ac162b12b4a$var$irregularEmoticons","$d1f26ac162b12b4a$var$extractTokens","split","word","match","toLowerCase","replace","filter","Boolean","$d1f26ac162b12b4a$var$normalizeTokens","length","$d1f26ac162b12b4a$var$callStore","method","target","$d1f26ac162b12b4a$var$getIDB","$d1f26ac162b12b4a$var$getAllIDB","$d1f26ac162b12b4a$var$commit","commit","$d1f26ac162b12b4a$var$findCommonMembers","arrays","uniqByFunc","shortestArray","$d1f26ac162b12b4a$var$minBy","array","minItem","i","results","some","findIndex","$d1f26ac162b12b4a$var$isEmpty","$d1f26ac162b12b4a$var$get","$d1f26ac162b12b4a$var$hasData","url","eTag","oldETag","oldUrl","all","$d1f26ac162b12b4a$var$doFullDatabaseScanForSingleResult","predicate","emojiStore","lastKey","processNextBatch","getAll","IDBKeyRange","lowerBound","$d1f26ac162b12b4a$var$loadData","emojiData","transformedData","annotation","emoticon","group","order","shortcodes","skins","tags","emoji","version","tokens","flat","sort","tone","skinTones","skinUnicodes","skinVersions","metaStore","todo","checkFetched","onFetched","data","clear","put","$d1f26ac162b12b4a$var$getEmojiByGroup","range","bound","index","$d1f26ac162b12b4a$var$getEmojiBySearchQuery","query","intermediateResults","checkDone","onDone","b","token","only","$d1f26ac162b12b4a$var$getEmojiByShortcode","shortcode","lowerShortcodes","includes","$d1f26ac162b12b4a$var$getEmojiByUnicode","$d1f26ac162b12b4a$var$requiredKeys$1","$d1f26ac162b12b4a$var$customEmojiIndex","customEmojis","$d1f26ac162b12b4a$var$assertCustomEmojis","isArray","Array","firstItemIsFaulty","sortByName","searchTrie","$d1f26ac162b12b4a$var$trie","itemToTokens","Map","currentMap","char","charAt","nextMap","get","valuesAtCoda","exact","queue","value","shift","searchByExactMatch","searchByPrefix","shortcodeToEmoji","nameToEmoji","customEmoji","search","byShortcode","byName","$d1f26ac162b12b4a$var$isFirefoxContentScript","wrappedJSObject","$d1f26ac162b12b4a$var$cleanEmoji","structuredClone","len","$d1f26ac162b12b4a$var$warnETag","console","warn","$d1f26ac162b12b4a$var$requiredKeys","$d1f26ac162b12b4a$var$assertStatus","response","dataSource","Math","floor","status","$d1f26ac162b12b4a$var$getETag","fetch","headers","$d1f26ac162b12b4a$var$getETagAndData","json","$d1f26ac162b12b4a$var$assertEmojiData","$d1f26ac162b12b4a$var$jsonChecksum","object","inBuffer","$d1f26ac162b12b4a$var$binaryStringToArrayBuffer","binary","buf","ArrayBuffer","Uint8Array","charCodeAt","JSON","stringify","btoa","$d1f26ac162b12b4a$var$arrayBufferToBinaryString","buffer","bytes","byteLength","String","fromCharCode","crypto","subtle","digest","$d1f26ac162b12b4a$var$checkForUpdates","eTagAndData","$d1f26ac162b12b4a$var$loadDataForFirstTime","$d1f26ac162b12b4a$export$2e2bcd8739ae039","constructor","locale","_dbName","_db","_lazyUpdate","_custom","_clear","bind","_ready","_init","ready","checkReady","getEmojiByGroup","getEmojiBySearchQuery","getEmojiByShortcode","getEmojiByUnicodeOrName","unicodeOrName","getPreferredSkinTone","setPreferredSkinTone","skinTone","incrementFavoriteEmojiCount","getTopFavoriteEmoji","limit","customEmojiIndex","favoritesStore","openCursor","cursor","addResult","continue","primaryKey","custom","_shutdown","delete","deleteDatabase","$1e5dc5e467331cb9$var$allGroups","$1e5dc5e467331cb9$var$groups","slice","$1e5dc5e467331cb9$var$rIC","requestIdleCallback","setTimeout","$1e5dc5e467331cb9$var$hasZwj","$1e5dc5e467331cb9$var$versionsAndTestEmoji","$1e5dc5e467331cb9$var$MOST_COMMONLY_USED_EMOJI","$1e5dc5e467331cb9$var$FONT_FAMILY","$1e5dc5e467331cb9$var$DEFAULT_CATEGORY_SORTING","$1e5dc5e467331cb9$var$getTextFeature","text","color","canvas","document","createElement","width","height","ctx","getContext","textBaseline","font","fillStyle","scale","fillText","getImageData","$1e5dc5e467331cb9$var$compareFeatures","feature1","feature2","feature1Str","join","startsWith","$1e5dc5e467331cb9$var$detectEmojiSupportLevel","$1e5dc5e467331cb9$var$determineEmojiSupportLevel","$1e5dc5e467331cb9$var$testColorEmojiSupported","$1e5dc5e467331cb9$var$supportedZwjEmojis","$1e5dc5e467331cb9$var$halt","event","preventDefault","stopPropagation","$1e5dc5e467331cb9$var$incrementOrDecrement","decrement","val","$1e5dc5e467331cb9$var$uniqBy","$1e5dc5e467331cb9$var$rAF","requestAnimationFrame","$1e5dc5e467331cb9$var$resizeObserverSupported","ResizeObserver","$1e5dc5e467331cb9$var$calculateTextWidth","node","createRange","selectNode","firstChild","getBoundingClientRect","$1e5dc5e467331cb9$var$getFromMap","cache","cached","$1e5dc5e467331cb9$var$parseCache","WeakMap","$1e5dc5e467331cb9$var$domInstancesCache","$1e5dc5e467331cb9$var$unkeyedSymbol","Symbol","$1e5dc5e467331cb9$var$hasReplaceChildren","Element","prototype","$1e5dc5e467331cb9$var$qM","queueMicrotask","callback","then","$1e5dc5e467331cb9$var$arraysAreEqualByFunction","left","right","areEqualFunc","$1e5dc5e467331cb9$var$EMPTY_ARRAY","assign","$1e5dc5e467331cb9$var$assign","$1e5dc5e467331cb9$var$enI18n","categoriesLabel","emojiUnsupportedMessage","favoritesLabel","loadingMessage","networkErrorMessage","regionLabel","searchDescription","searchLabel","searchResultsLabel","skinToneDescription","skinToneLabel","skinTonesLabel","categories","activities","objects","symbols","flags","$1e5dc5e467331cb9$var$PROPS","$1e5dc5e467331cb9$var$EXTRA_STYLES","$1e5dc5e467331cb9$export$2e2bcd8739ae039","HTMLElement","props","attachShadow","mode","style","prop","textContent","$1e5dc5e467331cb9$var$baseStyles","shadowRoot","appendChild","_ctx","skinToneEmoji","customCategorySorting","i18n","emojiVersion","hasOwnProperty","_dbFlush","connectedCallback","_cmp","$1e5dc5e467331cb9$var$createRoot","refs","abortController","AbortController","abortSignal","signal","state","createEffect","$1e5dc5e467331cb9$var$createState","currentObserver","queued","destroyed","propsToObservers","dirtyObservers","flush","observersToRun","observer","size","Proxy","observers","newValue","addEventListener","runnable","oldObserver","database","initialLoad","currentEmojis","currentEmojisWithCategories","rawSearchText","searchText","searchMode","activeSearchItem","message","skinTonePickerExpanded","skinTonePickerExpandedAfterAnimation","currentSkinTone","activeSkinTone","skinToneButtonText","pickerStyle","skinToneButtonLabel","currentFavorites","defaultFavoriteEmojis","numColumns","isRtl","scrollbarWidth","currentGroupIndex","groups","databaseLoaded","activeSearchItemId","currentGroup","focus","getElementById","emojiToDomNode","fireEvent","detail","rootElement","dispatchEvent","CustomEvent","bubbles","composed","compareEmojiArrays","compareCurrentEmojisWithCategories","category","aCategory","aEmojis","bCategory","bEmojis","updateCurrentEmojis","newEmojis","updateSearchMode","newSearchMode","updateCurrentEmojisWithCategories","newEmojisWithCategories","unicodeWithSkin","helpers","labelWithSkin","$1e5dc5e467331cb9$var$uniq","titleForEmoji","events","onClickSkinToneButton","onEmojiClick","onNavClick","closestTarget","closest","groupId","parseInt","dataset","searchElement","onNavKeydown","doFocus","el","previousElementSibling","nextElementSibling","parentElement","firstElementChild","lastElementChild","onSearchKeydown","goToNextOrPrevious","previous","clickEmoji","onSkinToneOptionsClick","changeSkinTone","onSkinToneOptionsFocusOut","onSkinToneOptionsKeydown","changeActiveSkinTone","nextSkinTone","onSkinToneOptionsKeyup","onSearchInput","actions","calculateEmojiGridStyle","onUpdate","resizeObserver","getComputedStyle","newNumColumns","getPropertyValue","newIsRtl","parentWidth","contentRect","observe","disconnect","firstRender","updateCustomEmoji","isZwjSupported","filterEmojisByVersion","emojiSupportLevel","summarizeEmojis","$1e5dc5e467331cb9$var$summarizeEmojisForUI","toSimpleSkinsMap","skin","getEmojisByGroup","getEmojisBySearchQuery","emojiSummary","find","skinTonedUnicode","classList","contains","substring","relatedTarget","$1e5dc5e467331cb9$var$render","container","html","$1e5dc5e467331cb9$var$createFramework","domInstances","domInstanceCacheKey","keyFunction","originalCacheKey","expressions","domInstancesForTokens","updateDomInstance","$1e5dc5e467331cb9$var$parseHtml","template","elementsToBindings","$1e5dc5e467331cb9$var$parse","htmlString","withinTag","withinAttribute","elementIndexCounter","elementIndexes","attributeName","attributeValuePre","attributeValuePost","j","nextChar","pop","bindings","exec","binding","expressionIndex","$1e5dc5e467331cb9$var$parseTemplate","innerHTML","dom","cloneNode","content","instanceBindings","$1e5dc5e467331cb9$var$traverseAndSetupBindings","treeWalker","createTreeWalker","NodeFilter","SHOW_ELEMENT","element","elementIndex","targetNode","instanceBinding","targetParentNode","currentExpression","nextNode","$1e5dc5e467331cb9$var$patch","expression","setAttribute","newNode","$1e5dc5e467331cb9$var$patchChildren","newChildren","needsRerender","$1e5dc5e467331cb9$var$doChildrenNeedRerender","parentNode","oldChild","oldChildrenCount","newChild","nextSibling","$1e5dc5e467331cb9$var$replaceChildren","replaceChildren","append","replaceWith","nodeValue","emojiList","prefix","rootDom","emojiWithCategory","forElementWithAttribute","querySelectorAll","getAttribute","eventName","listenerName","ref","action","removeChild","level","handleDatabaseLoading","showingLoadingMessage","timeoutHandle","clearTimeout","updatePreferredSkinTone","fill","$1e5dc5e467331cb9$var$applySkinTone","zwjIndex","indexOf","fromCodePoint","$1e5dc5e467331cb9$var$LIGHT_SKIN_TONE","endsWith","$1e5dc5e467331cb9$var$LIGHT_SKIN_TONE_MODIFIER","updateDefaultFavoriteEmojis","favs","updateFavorites","dbFavorites","favorites","updateEmojis","currentGroupId","zwjEmojisToCheck","$1e5dc5e467331cb9$var$checkZwjSupport","baselineEmoji","emojiWidth","supported","tabpanelElement","scrollTop","calculateCurrentEmojisWithCategories","categoriesToEmoji","trim","skinToneDropdown","once","$set","newState","$destroy","abort","disconnectedCallback","isConnected","catch","observedAttributes","attributeChangedCallback","attrName","oldValue","_set","up","toUpperCase","parseFloat","_dbCreate","$1e5dc5e467331cb9$var$definitions","$dec5faeb65064cfd$var$canManipulateViaTextNodes","input","nodeName","textarea","defineProperties","customElements","define","$dec5faeb65064cfd$export$2e2bcd8739ae039","selection","ieRange","collapse","select","execCommand","start","selectionStart","end","selectionEnd","setRangeText","textNode","createTextNode","offset","startNode","endNode","nodeLength","setStart","setEnd","deleteContents","commonAncestorContainer","insertNode","setSelectionRange","createEvent","initEvent","$94933cc6427541bd$export$c37129e465f64ef0","navigator","canShare","defineProperty","$4f74a8126e204146$export$30b344bef3e55b67","enumerable","configurable","$4f74a8126e204146$var$t","$4f74a8126e204146$var$e","t","s","delegatesFocus","querySelector","toggleAttribute","disabled","toString","part","toggle","r","n","removeEventListener","hasAttribute","shareUrl","shareTitle","shareText","shareFiles","share","title","files","shareData","assignedElements","flatten","defineCustomElement","$636b0cf1ed0b9f88$export$cc30a98fe3890794","$636b0cf1ed0b9f88$var$t","Number","isNaN","min","max","$636b0cf1ed0b9f88$var$e","$636b0cf1ed0b9f88$var$i","$636b0cf1ed0b9f88$var$o","o","l","getSupportedConstraints","getTrackCapabilities","getTrackSettings","u","facingMode","stopVideoStream","startVideoStream","cameraResolution","pan","h","tilt","zoom","d","c","m","p","g","f","v","isSupported","autoPlay","noImage","loading","calculateFileSize","capture","play","video","finally","removeAttribute","from","childNodes","forEach","remove","getVideoTracks","applyConstraints","advanced","ideal","audio","mediaDevices","getUserMedia","srcObject","hidden","stop","videoWidth","videoHeight","drawImage","toDataURL","Image","src","dataURI","blob","getCapabilities","getSettings","$4da30046ce6d9325$export$32589115725b904b","$4da30046ce6d9325$var$e","$4da30046ce6d9325$var$t","showModal","body","preserveOverflow","overflow","noHeader","noAnimations","noCloseButton","staticBackdrop","fullscreen","placement","closeLabel","defaultPrevented","currentTarget","hide","assignedNodes","cancelable","reason","show","$7aad62ebc3d6fae8$export$6ccd1735166caad9","$7aad62ebc3d6fae8$var$e","$7aad62ebc3d6fae8$var$t","$7aad62ebc3d6fae8$var$o","lastIndexOf","type","writable","$7aad62ebc3d6fae8$var$i","path","webkitRelativePath","$7aad62ebc3d6fae8$var$r","readEntries","$7aad62ebc3d6fae8$var$a","$7aad62ebc3d6fae8$var$n","file","fullPath","$7aad62ebc3d6fae8$var$s","kind","getAsEntry","webkitGetAsEntry","isFile","isDirectory","createReader","$7aad62ebc3d6fae8$var$d","$7aad62ebc3d6fae8$var$l","dataTransfer","items","$7aad62ebc3d6fae8$var$p","$7aad62ebc3d6fae8$var$c","$7aad62ebc3d6fae8$var$h","$7aad62ebc3d6fae8$var$u","accept","multiple","autoFocus","maxFiles","abs","maxSize","minSize","noStyle","Event","dropEffect","click","errors","test","acceptedFiles","rejectedFiles","defaultValue","openFileDialog","$33dea9d9a6da4c9a$export$63e7bed68b07a85c","$21c3f3a8dccfa4fd$export$e2a22331486dcca0","suffix","randomString","random","$c3d7e05a1ce34ed5$export$6539e087749cf9d3","options","mimeType","File","filename","$f0a2ccd611c71db8$var$DEFAULT_STORAGE_PROVIDER","localStorage","$f0a2ccd611c71db8$export$ddcffe0146c8f882","keyPrefix","provider","sessionStorage","setItem","getItem","parse","$fbb55a96d78c7ba0$export$de75f46579dcf24","selectedImage","$eccf21b2da8f185e$exports","getBundleURL","$4e9367b4637ab0b3$exports","$98768b53aac35bcc$exports","$81873ad161a9f996$exports","$f1c993919e45d5c2$exports","$8f40b96e34825d38$exports","$51e3f333db254f7d$exports","$0d878777045f8608$exports","$da7f4261981c6446$exports","$553eebead4d87493$exports","$e4f4da01dd92f98a$exports","$055531bbd0af154c$export$6874249d87f2602a","label","weight","$055531bbd0af154c$export$59eceaef0c7797b2","FontFace","load","fonts","$166cfb2484b08c80$var$errorsContainer","$166cfb2484b08c80$var$hideError","evt","$166cfb2484b08c80$export$af04143326425dbd","types","div","className","$f0ee20a32c2bc385$var$defaultTextboxData","fillColor","strokeColor","fontSize","fontWeight","textAlign","shadowBlur","strokeWidth","offsetY","offsetX","rotate","allCaps","$f0ee20a32c2bc385$var$textboxes","$f0ee20a32c2bc385$export$8e3dca5fa4d5f04b","Date","now","textbox","getData","create","getById","fragment","createDocumentFragment","checked","textboxEl","$68e654e91d7a7392$export$8d01c972ee8b14a9","canvasEl","getDimensions","setDimensions","draw","image","textboxes","clearRect","fillRect","multiplier","save","strokeStyle","lineHeight","measureText","xPos","textLines","shadowOffsetX","shadowOffsetY","shadowColor","translate","PI","lineWidth","strokeText","restore","createInstance","$44ae6d9db4eaca0f$var$canvas","$44ae6d9db4eaca0f$var$videoModal","$44ae6d9db4eaca0f$var$downloadModal","$44ae6d9db4eaca0f$var$dropzoneEl","$44ae6d9db4eaca0f$var$instructionsEl","$44ae6d9db4eaca0f$var$imageUploadMethodSelect","$44ae6d9db4eaca0f$var$fileSelectBtn","$44ae6d9db4eaca0f$var$imageUrlForm","$44ae6d9db4eaca0f$var$addTextboxBtn","$44ae6d9db4eaca0f$var$textboxesContainer","$44ae6d9db4eaca0f$var$generateMemeBtn","$44ae6d9db4eaca0f$var$openVideoModalBtn","$44ae6d9db4eaca0f$var$downloadMemeBtn","$44ae6d9db4eaca0f$var$downloadMemePreview","$44ae6d9db4eaca0f$var$webShareComponent","$44ae6d9db4eaca0f$var$galleryEl","$44ae6d9db4eaca0f$var$gallerySearchEl","$44ae6d9db4eaca0f$var$galleryNoResultsEl","$44ae6d9db4eaca0f$var$solidColorForm","$44ae6d9db4eaca0f$var$uploadMethodEls","$44ae6d9db4eaca0f$var$removeConfirmationModal","$44ae6d9db4eaca0f$var$removeTextForm","$44ae6d9db4eaca0f$var$maxImageDimensionsForm","$44ae6d9db4eaca0f$var$maxImageDimensionsSelect","$44ae6d9db4eaca0f$var$clearCanvasBtn","$44ae6d9db4eaca0f$var$maxImageDimensionsFromStorage","$44ae6d9db4eaca0f$var$shouldFocusOnTextboxCreate","$44ae6d9db4eaca0f$var$selectedImage","$44ae6d9db4eaca0f$var$reqAnimFrame","$44ae6d9db4eaca0f$var$generateMeme","dataUrl","downloadLink","download","href","$44ae6d9db4eaca0f$var$setImageMaxDimensions","maxWidthValue","maxHeightValue","maxImageDimensionsSelect","MAX_WIDTH","MAX_HEIGHT","$44ae6d9db4eaca0f$var$afterImageSelect","$44ae6d9db4eaca0f$var$handleImageLoad","$44ae6d9db4eaca0f$var$handleFileSelect","reader","FileReader","readAsDataURL","$44ae6d9db4eaca0f$var$handleTextPropChange","textboxId","textboxData","$44ae6d9db4eaca0f$var$handleImageUploadFromURL","form","submitButton","imageUrl","$44ae6d9db4eaca0f$var$moveTextUsingArrowbuttons","direction","offsetYInput","offsetXInput","$44ae6d9db4eaca0f$var$handleGalleryClick","button","img","alt","matches","textboxSettingsEl","currentTextboxEl","currentTextboxData","textboxToDelete","textboxIdInput","cancelAnimationFrame","galleryItems","errorMessage","capturePhotoComponent","reset","idx","$44ae6d9db4eaca0f$var$renderAcceptedImageFormats","acceptedMimeTypes","rootEl","extensions","small","browserSupportsTextareaTextNodes","canManipulateViaTextNodes","isSuccess","$442be162a818aed4$export$c37129e465f64ef0","isWebShareSupported","$e179325634270afd$export$30b344bef3e55b67","$e179325634270afd$var$styles","$e179325634270afd$var$template","buttonSlot","buttonEl","getButton","upgradeProperty","handleSlotChange","handleClick","instance","elementName","WebShare","$c290816263f90981$export$cc30a98fe3890794","$02ad8beec419df62$export$7d15b64cf5a3a4c4","lower","upper","$c290816263f90981$var$COMPONENT_NAME","$c290816263f90981$var$styles","$c290816263f90981$var$template","supportedConstraints","stream","canvasElement","outputElement","videoElement","captureButtonSlot","captureButton","facingModeButtonSlot","facingModeButton","trackCapabilities","trackSettings","emptyOutputElement","isValidFacingMode","x","widthInAllowedRange","heightInAllowedRange","panInAllowedRange","applyPTZ","tiltInAllowedRange","zoomInAllowedRange","getCaptureButton","getFacingModeButton","onVideoLoadedMetaData","onCaptureButtonSlotChange","onCapturePhotoButtonClick","onFacingModeButtonSlotChange","onFacingModeButtonClick","constraintName","constraintValue","track","constraints","eventDetail","CapturePhoto","$180b6dcf923bafc7$export$32589115725b904b","$180b6dcf923bafc7$var$template","$180b6dcf923bafc7$var$styles","dialogEl","footerSlotEl","closeSlotEl","pulseAnimationTimeout","headerEl","closeBtnEl","updateCloseLabel","handleDialogClick","handleDialogClose","handleDialogCancel","handleCloseButtonClick","handleFooterSlotChange","handleCloseSlotChange","closeButtonEl","hasTextContent","applyPulseEffectOnDialog","requestCloseEvent","createRequestCloseEvent","footerEl","footerSlotNodes","hasFooterSlotNodes","ModalElement","$862aa3736b0514bc$export$6ccd1735166caad9","$f31161edf38949e9$var$COMMON_MIME_TYPES","$f31161edf38949e9$var$FILES_TO_IGNORE","$f31161edf38949e9$var$toFileWithMimeType","hasExtension","extension","$f31161edf38949e9$var$toFileWithPath","fileWithMimeType","$f31161edf38949e9$var$readEntriesPromise","directoryReader","$f31161edf38949e9$var$readAllDirectoryEntries","$f31161edf38949e9$var$getFileFromFileEntry","fileEntry","$f31161edf38949e9$var$getFilesFromDataTransferItemList","dataTransferItemList","entry","$f31161edf38949e9$var$getFilesFromFileList","fileList","$f31161edf38949e9$export$6d52664cd15c442","$862aa3736b0514bc$var$COMPONENT_NAME","$862aa3736b0514bc$var$TOO_MANY_FILES","$862aa3736b0514bc$var$template","$862aa3736b0514bc$var$styles","fileInput","dropzoneEl","handleFileInputChange","handleDragEnter","handleDragOver","handleDragLeave","handleDrop","handleKeyUp","num","Infinity","handleFilesSelect","filesLength","fileHasValidType","acceptedTypeSpecifiers","acceptedMimeTypesList","fileMimeType","baseMimeType","validType","fileExceedsMaxSize","fileIsSmallerThanMinSize","FilesDropzone"],"version":3,"file":"index.6d86f4dd.js.map"} \ No newline at end of file diff --git a/index.9a005d69.js b/index.9a005d69.js new file mode 100644 index 0000000..a71529d --- /dev/null +++ b/index.9a005d69.js @@ -0,0 +1,530 @@ +!function(){let e,t;function o(e){return e&&e.__esModule?e.default:e}var i,a="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},n={},r={},s=a.parcelRequire5078;function l(e){if("string"!=typeof e||!e)throw Error("expected a non-empty string, got: "+e)}function d(e){if("number"!=typeof e)throw Error("expected a number, got: "+e)}null==s&&((s=function(e){if(e in n)return n[e].exports;if(e in r){var t=r[e];delete r[e];var o={id:e,exports:{}};return n[e]=o,t.call(o.exports,o,o.exports),o.exports}var i=Error("Cannot find module '"+e+"'");throw i.code="MODULE_NOT_FOUND",i}).register=function(e,t){r[e]=t},a.parcelRequire5078=s),s.register;let c="emoji",u="keyvalue",h="favorites",m="tokens",p="count",g="group-order",b="eTag",f="skinTone",v="readonly",y="readwrite",w="skinUnicodes";function k(e){return function(e,t){let o=new Set,i=[];for(let a of e){let e=t(a);o.has(e)||(o.add(e),i.push(a))}return i}(e,e=>e.unicode)}let E={},x={},S={};function C(e,t,o){o.onerror=()=>t(o.error),o.onblocked=()=>t(Error("IDB blocked")),o.onsuccess=()=>e(o.result)}async function j(e){let t=await new Promise((t,o)=>{let i=indexedDB.open(e,1);E[e]=i,i.onupgradeneeded=e=>{e.oldVersion<1&&function(e){function t(t,o,i){let a=o?e.createObjectStore(t,{keyPath:o}):e.createObjectStore(t);if(i)for(let[e,[t,o]]of Object.entries(i))a.createIndex(e,t,{multiEntry:o});return a}t(u),t(c,"unicode",{[m]:["tokens",!0],[g]:[["group","order"]],[w]:["skinUnicodes",!0]}),t(h,void 0,{[p]:[""]})}(i.result)},C(t,o,i)});return t.onclose=()=>T(e),t}function A(e,t,o,i){return new Promise((a,n)=>{let r;let s=e.transaction(t,o,{durability:"relaxed"});i("string"==typeof t?s.objectStore(t):t.map(e=>s.objectStore(e)),s,e=>{r=e}),s.oncomplete=()=>a(r),s.onerror=()=>n(s.error)})}function T(e){let t=E[e],o=t&&t.result;if(o){o.close();let t=S[e];if(t)for(let e of t)e()}delete E[e],delete x[e],delete S[e]}let L=new Set([":D","XD",":'D","O:)",":X",":P",";P","XP",":L",":Z",":j","8D","XO","8)",":B",":O",":S",":'o","Dx","X(","D:",":C",">0)",":3","!e.match(/\w/)||L.has(e)?e.toLowerCase():e.replace(/[)(:,]/g,"").replace(/’/g,"'").toLowerCase()).filter(Boolean)}function D(e){return e.filter(Boolean).map(e=>e.toLowerCase()).filter(e=>e.length>=2)}function $(e,t,o,i){e[t](o).onsuccess=e=>i&&i(e.target.result)}function _(e,t,o){$(e,"get",t,o)}function I(e,t,o){$(e,"getAll",t,o)}function B(e){e.commit&&e.commit()}function R(e,t){let o=function(e,t){let o=e[0];for(let i=1;it(a)&&(o=a)}return o}(e,e=>e.length),i=[];for(let a of o)e.some(e=>-1===e.findIndex(e=>t(e)===t(a)))||i.push(a);return i}async function M(e){return!await V(e,u,"url")}async function F(e,t,o){let[i,a]=await Promise.all([b,"url"].map(t=>V(e,u,t)));return i===o&&a===t}async function N(e,t){return A(e,c,v,(e,o,i)=>{let a;let n=()=>{e.getAll(a&&IDBKeyRange.lowerBound(a,!0),50).onsuccess=e=>{let o=e.target.result;for(let e of o)if(a=e.unicode,t(e))return i(e);if(o.length<50)return i();n()}};n()})}async function O(e,t,o,i){{let a=t.map(({annotation:e,emoticon:t,group:o,order:i,shortcodes:a,skins:n,tags:r,emoji:s,version:l})=>{let d=[...new Set(D([...(a||[]).map(z).flat(),...(r||[]).map(z).flat(),...z(e),t]))].sort(),c={annotation:e,group:o,order:i,tags:r,tokens:d,unicode:s,version:l};if(t&&(c.emoticon=t),a&&(c.shortcodes=a),n)for(let{tone:e,emoji:t,version:o}of(c.skinTones=[],c.skinUnicodes=[],c.skinVersions=[],n))c.skinTones.push(e),c.skinUnicodes.push(t),c.skinVersions.push(o);return c});await A(e,[c,u],y,([e,t],n)=>{let r,s;let l=0;function d(){2==++l&&function(){if(r!==i||s!==o){for(let t of(e.clear(),a))e.put(t);t.put(i,b),t.put(o,"url"),B(n)}}()}_(t,b,e=>{r=e,d()}),_(t,"url",e=>{s=e,d()})})}}async function P(e,t){return A(e,c,v,(e,o,i)=>{let a=IDBKeyRange.bound([t,0],[t+1,0],!1,!0);I(e.index(g),a,i)})}async function U(e,t){let o=D(z(t));return o.length?A(e,c,v,(e,t,i)=>{let a=[],n=()=>{a.length===o.length&&r()},r=()=>{i(R(a,e=>e.unicode).sort((e,t)=>e.order{a.push(e),n()})}}):[]}async function q(e,t){let o=await U(e,t);return o.length?o.filter(e=>(e.shortcodes||[]).map(e=>e.toLowerCase()).includes(t.toLowerCase()))[0]||null:await N(e,e=>(e.shortcodes||[]).includes(t.toLowerCase()))||null}async function H(e,t){return A(e,c,v,(e,o,i)=>_(e,t,o=>{if(o)return i(o);_(e.index(w),t,e=>i(e||null))}))}function V(e,t,o){return A(e,t,v,(e,t,i)=>_(e,o,i))}let W=["name","url"];function G(e){!function(e){let t=e&&Array.isArray(e),o=t&&e.length&&(!e[0]||W.some(t=>!(t in e[0])));if(!t||o)throw Error("Custom emojis are in the wrong format")}(e);let t=(e,t)=>e.name.toLowerCase(){let i=o;for(let t=0;te[0]{let t=new Set;if(e.shortcodes)for(let o of e.shortcodes)for(let e of z(o))t.add(e);return t}),a=e=>i(e,!0),n=e=>i(e,!1),r=new Map,s=new Map;for(let t of e)for(let e of(s.set(t.name.toLowerCase(),t),t.shortcodes||[]))r.set(e.toLowerCase(),t);return{all:o,search:e=>{let o=z(e);return R(o.map((e,t)=>(te.name).sort(t)},byShortcode:e=>r.get(e.toLowerCase()),byName:e=>s.get(e.toLowerCase())}}let X="undefined"!=typeof wrappedJSObject;function Y(e){if(!e)return e;if(X&&(e=structuredClone(e)),delete e.tokens,e.skinTones){let t=e.skinTones.length;e.skins=Array(t);for(let o=0;o!(t in e[0])))throw Error("Emoji data is in the wrong format")}(i),[o,i]}async function et(e){let t=function(e){for(var t=e.length,o=new ArrayBuffer(t),i=new Uint8Array(o),a=-1;++a(this._ready||(this._ready=this._init()),this._ready);await e(),this._db||await e()}async getEmojiByGroup(e){return d(e),await this.ready(),k(await P(this._db,e)).map(Y)}async getEmojiBySearchQuery(e){return l(e),await this.ready(),[...this._custom.search(e),...k(await U(this._db,e)).map(Y)]}async getEmojiByShortcode(e){return l(e),await this.ready(),this._custom.byShortcode(e)||Y(await q(this._db,e))}async getEmojiByUnicodeOrName(e){return l(e),await this.ready(),this._custom.byName(e)||Y(await H(this._db,e))}async getPreferredSkinTone(){return await this.ready(),await V(this._db,u,f)||0}async setPreferredSkinTone(e){return d(e),await this.ready(),A(this._db,u,y,(t,o)=>{t.put(e,f),B(o)})}async incrementFavoriteEmojiCount(e){return l(e),await this.ready(),A(this._db,h,y,(t,o)=>_(t,e,i=>{t.put((i||0)+1,e),B(o)}))}async getTopFavoriteEmoji(e){var t,o;return d(e),await this.ready(),(await (t=this._db,o=this._custom,0===e?[]:A(t,[h,c],v,([t,i],a,n)=>{let r=[];t.index(p).openCursor(void 0,"prev").onsuccess=t=>{let a=t.target.result;if(!a)return n(r);function s(t){if(r.push(t),r.length===e)return n(r);a.continue()}let l=a.primaryKey,d=o.byName(l);if(d)return s(d);_(i,l,e=>{if(e)return s(e);a.continue()})}}))).map(Y)}set customEmoji(e){this._custom=G(e)}get customEmoji(){return this._custom.all}async _shutdown(){await this.ready();try{await this._lazyUpdate}catch(e){}}_clear(){this._db=this._ready=this._lazyUpdate=void 0}async close(){await this._shutdown(),await T(this._dbName)}async delete(){var e;await this._shutdown(),await (e=this._dbName,new Promise((t,o)=>{T(e),C(t,o,indexedDB.deleteDatabase(e))}))}}let en=[[-1,"✨","custom"],[0,"\uD83D\uDE00","smileys-emotion"],[1,"\uD83D\uDC4B","people-body"],[3,"\uD83D\uDC31","animals-nature"],[4,"\uD83C\uDF4E","food-drink"],[5,"\uD83C\uDFE0️","travel-places"],[6,"⚽","activities"],[7,"\uD83D\uDCDD","objects"],[8,"⛔️","symbols"],[9,"\uD83C\uDFC1","flags"]].map(([e,t,o])=>({id:e,emoji:t,name:o})),er=en.slice(1),es="function"==typeof requestIdleCallback?requestIdleCallback:setTimeout;function el(e){return e.unicode.includes("‍")}let ed={"\uD83E\uDEE8":15.1,"\uD83E\uDEE0":14,"\uD83E\uDD72":13.1,"\uD83E\uDD7B":12.1,"\uD83E\uDD70":11,"\uD83E\uDD29":5,"\uD83D\uDC71‍♀️":4,"\uD83E\uDD23":3,"\uD83D\uDC41️‍\uD83D\uDDE8️":2,"\uD83D\uDE00":1,"\uD83D\uDE10️":.7,"\uD83D\uDE03":.6},ec=["\uD83D\uDE0A","\uD83D\uDE12","❤️","\uD83D\uDC4D️","\uD83D\uDE0D","\uD83D\uDE02","\uD83D\uDE2D","☺️","\uD83D\uDE14","\uD83D\uDE29","\uD83D\uDE0F","\uD83D\uDC95","\uD83D\uDE4C","\uD83D\uDE18"],eu='"Twemoji Mozilla","Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji","EmojiOne Color","Android Emoji",sans-serif',eh=(e,t)=>et?1:0,em=(e,t)=>{let o=document.createElement("canvas");o.width=o.height=1;let i=o.getContext("2d",{willReadFrequently:!0});return i.textBaseline="top",i.font=`100px ${eu}`,i.fillStyle=t,i.scale(.01,.01),i.fillText(e,0,0),i.getImageData(0,0,1,1).data},ep=(e,t)=>{let o=[...e].join(",");return o===[...t].join(",")&&!o.startsWith("0,0,0,")},eg=()=>(e||(e=new Promise(e=>es(()=>e(function(){let e=Object.entries(ed);try{for(let[t,o]of e)if(function(e){let t=em(e,"#000"),o=em(e,"#fff");return t&&o&&ep(t,o)}(t))return o}catch(e){}finally{}return e[0][1]}())))),e),eb=new Map;function ef(e){e.preventDefault(),e.stopPropagation()}function ev(e,t,o){return(t+=e?-1:1)<0?t=o.length-1:t>=o.length&&(t=0),t}function ey(e,t){let o=new Set,i=[];for(let a of e){let e=t(a);o.has(e)||(o.add(e),i.push(a))}return i}let ew=requestAnimationFrame,ek="function"==typeof ResizeObserver;function eE(e){{let t=document.createRange();return t.selectNode(e.firstChild),t.getBoundingClientRect().width}}function ex(e,t,o){let i=e.get(t);return i||(i=o(),e.set(t,i)),i}let eS=new WeakMap,eC=new WeakMap,ej=Symbol("un-keyed"),eA="replaceChildren"in Element.prototype;function eT(e,t,o){for(let i=0;iPromise.resolve().then(e);function ez(e,t,o){if(e.length!==t.length)return!1;for(let i=0;i{if(i)return;let e=[...n];n.clear();try{for(let t of e)t()}finally{o=!1,n.size&&(o=!0,eL(r))}},s=new Proxy({},{get(e,o){if(t){let e=a.get(o);e||(e=new Set,a.set(o,e)),e.add(t)}return e[o]},set(e,t,i){if(e[t]!==i){e[t]=i;let s=a.get(t);if(s){for(let e of s)n.add(e);o||(o=!0,eL(r))}}return!0}});return e.addEventListener("abort",()=>{i=!0}),{state:s,createEffect:e=>{let o=()=>{let i=t;t=o;try{return e()}finally{t=i}};return o()}}}(n),l=new Map;e_(r,{skinToneEmoji:void 0,i18n:void 0,database:void 0,customEmoji:void 0,customCategorySorting:void 0,emojiVersion:void 0}),e_(r,o),e_(r,{initialLoad:!0,currentEmojis:[],currentEmojisWithCategories:[],rawSearchText:"",searchText:"",searchMode:!1,activeSearchItem:-1,message:void 0,skinTonePickerExpanded:!1,skinTonePickerExpandedAfterAnimation:!1,currentSkinTone:0,activeSkinTone:0,skinToneButtonText:void 0,pickerStyle:void 0,skinToneButtonLabel:"",skinTones:[],currentFavorites:[],defaultFavoriteEmojis:void 0,numColumns:8,isRtl:!1,currentGroupIndex:0,groups:er,databaseLoaded:!1,activeSearchItemId:void 0}),s(()=>{r.currentGroup!==r.groups[r.currentGroupIndex]&&(r.currentGroup=r.groups[r.currentGroupIndex])});let d=t=>{e.getElementById(t).focus()},c=t=>e.getElementById(`emo-${t.id}`),u=(e,t)=>{i.rootElement.dispatchEvent(new CustomEvent(e,{detail:t,bubbles:!0,composed:!0}))},h=(e,t)=>e.id===t.id,m=(e,t)=>{let{category:o,emojis:i}=e,{category:a,emojis:n}=t;return o===a&&ez(i,n,h)},p=e=>{ez(r.currentEmojis,e,h)||(r.currentEmojis=e)},g=e=>{r.searchMode!==e&&(r.searchMode=e)},b=e=>{ez(r.currentEmojisWithCategories,e,m)||(r.currentEmojisWithCategories=e)},f=(e,t)=>t&&e.skins&&e.skins[t]||e.unicode,v={labelWithSkin:(e,t)=>ey([e.name||f(e,t),e.annotation,...e.shortcodes||e$].filter(Boolean),e=>e).join(", "),titleForEmoji:e=>e.annotation||(e.shortcodes||e$).join(", "),unicodeWithSkin:f},y={onClickSkinToneButton:function(e){r.skinTonePickerExpanded=!r.skinTonePickerExpanded,r.activeSkinTone=r.currentSkinTone,r.skinTonePickerExpanded&&(ef(e),ew(()=>d("skintone-list")))},onEmojiClick:z,onNavClick:function(e){let{target:t}=e,o=t.closest(".nav-button");if(!o)return;let a=parseInt(o.dataset.groupId,10);i.searchElement.value="",r.rawSearchText="",r.searchText="",r.activeSearchItem=-1,r.currentGroupIndex=r.groups.findIndex(e=>e.id===a)},onNavKeydown:function(e){let{target:t,key:o}=e,i=t=>{t&&(ef(e),t.focus())};switch(o){case"ArrowLeft":return i(t.previousElementSibling);case"ArrowRight":return i(t.nextElementSibling);case"Home":return i(t.parentElement.firstElementChild);case"End":return i(t.parentElement.lastElementChild)}},onSearchKeydown:function(e){if(!r.searchMode||!r.currentEmojis.length)return;let t=t=>{ef(e),r.activeSearchItem=ev(t,r.activeSearchItem,r.currentEmojis)};switch(e.key){case"ArrowDown":return t(!1);case"ArrowUp":return t(!0);case"Enter":if(-1!==r.activeSearchItem)return ef(e),L(r.currentEmojis[r.activeSearchItem].id);r.activeSearchItem=0}},onSkinToneOptionsClick:function(e){let{target:{id:t}}=e,o=t&&t.match(/^skintone-(\d)/);o&&(ef(e),D(parseInt(o[1],10)))},onSkinToneOptionsFocusOut:$,onSkinToneOptionsKeydown:function(e){if(!r.skinTonePickerExpanded)return;let t=async t=>{ef(e),r.activeSkinTone=t};switch(e.key){case"ArrowUp":return t(ev(!0,r.activeSkinTone,r.skinTones));case"ArrowDown":return t(ev(!1,r.activeSkinTone,r.skinTones));case"Home":return t(0);case"End":return t(r.skinTones.length-1);case"Enter":return ef(e),D(r.activeSkinTone);case"Escape":return ef(e),r.skinTonePickerExpanded=!1,d("skintone-button")}},onSkinToneOptionsKeyup:function(e){if(r.skinTonePickerExpanded&&" "===e.key)return ef(e),D(r.activeSkinTone)},onSearchInput:function(e){r.rawSearchText=e.target.value}},w={calculateEmojiGridStyle:function(e){var t;let o;t=()=>{{let e=getComputedStyle(i.rootElement),t=parseInt(e.getPropertyValue("--num-columns"),10),o="rtl"===e.getPropertyValue("direction");r.numColumns=t,r.isRtl=o}},ek?(o=new ResizeObserver(t)).observe(e):ew(t),n.addEventListener("abort",()=>{o&&o.disconnect()})},updateOnIntersection:function(e){!function(e,t,o){{let i=e.closest(".tabpanel"),a=eD.get(i);a||(a=new IntersectionObserver(o,{root:i,rootMargin:"50% 0px 50% 0px",threshold:0}),eD.set(i,a),t.addEventListener("abort",()=>{a.disconnect()})),a.observe(e)}}(e,n,e=>{for(let{target:t,isIntersecting:o}of e)t.classList.toggle("onscreen",o)})}},k=!0;function E(){let{customEmoji:e,database:t}=r,o=e||e$;t.customEmoji!==o&&(t.customEmoji=o)}s(()=>{(function(e,t,o,i,a,n,r,s,l){let{labelWithSkin:d,titleForEmoji:c,unicodeWithSkin:u}=o,{html:h,map:m}=function(e){let t=ex(eC,e,()=>new Map),o=ej;return{map:function(e,t,i){return e.map((e,a)=>{let n=o;o=i(e);try{return t(e,a)}finally{o=n}})},html:function(e,...i){let a=ex(t,e,()=>new Map);return ex(a,o,()=>(function(e){let{template:t,elementsToBindings:o}=ex(eS,e,()=>(function(e){let t="",o=!1,i=!1,a=-1,n=new Map,r=[];for(let s=0,l=e.length;s":o=!1,i=!1;break;case"=":i=!0}let m=ex(n,r[r.length-1],()=>[]);if(i){let t=/(\S+)="?([^"=]*)$/.exec(h);d=t[1],c=t[2],u=/^[^">]*/.exec(e[s+1])[0]}let p={attributeName:d,attributeValuePre:c,attributeValuePost:u,expressionIndex:s};m.push(p),o||i||(t+=" ")}return{template:function(e){let t=document.createElement("template");return t.innerHTML=e,t}(t),elementsToBindings:n}})(e)),i=t.cloneNode(!0).content.firstElementChild,a=function(e,t){let o;let i=[];if(1===t.size&&(o=t.get(0)))eT(o,e,i);else{let o=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),a=e,n=-1;do{let e=t.get(++n);e&&eT(e,a,i)}while(a=o.nextNode())}return i}(i,o);return function(e){return function(e,t){for(let o of t){let{targetNode:t,currentExpression:i,binding:{expressionIndex:a,attributeName:n,attributeValuePre:r,attributeValuePost:s}}=o,l=e[a];if(i!==l){if(o.currentExpression=l,n)t.setAttribute(n,r+""+l+s);else{let e;Array.isArray(l)?function(e,t){let{targetNode:o}=t,{targetParentNode:i}=t,a=!1;if(i?a=function(e,t){let o=e.firstChild,i=0;for(;o;){if(t[i]!==o)return!0;o=o.nextSibling,i++}return i!==t.length}(i,e):(a=!0,t.targetNode=void 0,t.targetParentNode=i=o.parentNode),a){var n;n=i,eA?n.replaceChildren(...e):(n.innerHTML="",n.append(...e))}}(l,o):l instanceof Element?(e=l,t.replaceWith(e)):t.nodeValue=""+l,e&&(o.targetNode=e)}}}}(e,a),i}})(e))(i)}}}(t);function p(e,o,i){return m(e,(e,a)=>h``,e=>`${i}-${e.id}`)}let g=h`
${t.i18n.searchDescription}
${t.i18n.skinToneDescription}
${m(t.skinTones,(e,o)=>h`
${e}
`,e=>e)}
${m(t.currentEmojisWithCategories,(e,o)=>h`
${p(e.emojis,t.searchMode,"emo")}
`,e=>e.category)}
`,b=(t,o)=>{for(let i of e.querySelectorAll(`[${t}]`))o(i,i.getAttribute(t))};if(l){for(let t of(e.appendChild(g),["click","focusout","input","keydown","keyup"]))b(`data-on-${t}`,(e,o)=>{e.addEventListener(t,i[o])});b("data-ref",(e,t)=>{n[t]=e}),r.addEventListener("abort",()=>{e.removeChild(g)})}b("data-action",(e,t)=>{let o=s.get(t);o||s.set(t,o=new WeakSet),o.has(e)||(o.add(e),a[t](e))})})(e,r,v,y,w,i,n,l,k),k=!1}),r.emojiVersion||eg().then(e=>{e||(r.message=r.i18n.emojiUnsupportedMessage)}),s(()=>{async function e(){let e=!1,t=setTimeout(()=>{e=!0,r.message=r.i18n.loadingMessage},1e3);try{await r.database.ready(),r.databaseLoaded=!0}catch(e){console.error(e),r.message=r.i18n.networkErrorMessage}finally{clearTimeout(t),e&&(e=!1,r.message="")}}r.database&&e()}),s(()=>{r.pickerStyle=` + --num-groups: ${r.groups.length}; + --indicator-opacity: ${r.searchMode?0:1}; + --num-skintones: 6;`}),s(()=>{r.customEmoji&&r.database&&E()}),s(()=>{r.customEmoji&&r.customEmoji.length?r.groups!==en&&(r.groups=en):r.groups!==er&&(r.currentGroupIndex&&r.currentGroupIndex--,r.groups=er)}),s(()=>{(async function(){r.databaseLoaded&&(r.currentSkinTone=await r.database.getPreferredSkinTone())})()}),s(()=>{r.skinTones=Array(6).fill().map((e,t)=>(function(e,t){if(0===t)return e;let o=e.indexOf("‍");return -1!==o?e.substring(0,o)+String.fromCodePoint(127995+t-1)+e.substring(o):(e.endsWith("️")&&(e=e.substring(0,e.length-1)),e+"\ud83c"+String.fromCodePoint(57339+t-1))})(r.skinToneEmoji,t))}),s(()=>{r.skinToneButtonText=r.skinTones[r.currentSkinTone]}),s(()=>{r.skinToneButtonLabel=r.i18n.skinToneLabel.replace("{skinTone}",r.i18n.skinTones[r.currentSkinTone])}),s(()=>{async function e(){let{database:e}=r,t=(await Promise.all(ec.map(t=>e.getEmojiByUnicodeOrName(t)))).filter(Boolean);r.defaultFavoriteEmojis=t}r.databaseLoaded&&e()}),s(()=>{async function e(){E();let{database:e,defaultFavoriteEmojis:t,numColumns:o}=r,i=await e.getTopFavoriteEmoji(o),a=await j(ey([...i,...t],e=>e.unicode||e.name).slice(0,o));r.currentFavorites=a}r.databaseLoaded&&r.defaultFavoriteEmojis&&e()}),s(()=>{!async function(){let{searchText:e,currentGroup:t,databaseLoaded:o,customEmoji:i}=r;if(o){if(e.length>=2){let t=await T(e);r.searchText===e&&(p(t),g(!0))}else{let{id:e}=t;if(-1!==e||i&&i.length){let t=await A(e);r.currentGroup.id===e&&(p(t),g(!1))}}}else r.currentEmojis=[],r.searchMode=!1}()});let x=()=>{ew(()=>{var e;(e=i.tabpanelElement)&&(e.scrollTop=0)})};function S(e){return!e.unicode||!el(e)||eb.get(e.unicode)}async function C(e){let t=r.emojiVersion||await eg();return e.filter(({version:e})=>!e||e<=t)}async function j(e){return function(e,t){let o=e=>{let o={};for(let i of e)"number"==typeof i.tone&&i.version<=t&&(o[i.tone]=i.unicode);return o};return e.map(({unicode:e,skins:t,shortcodes:i,url:a,name:n,category:r,annotation:s})=>({unicode:e,name:n,shortcodes:i,url:a,category:r,annotation:s,id:e||n,skins:t&&o(t)}))}(e,r.emojiVersion||await eg())}async function A(e){let t=-1===e?r.customEmoji:await r.database.getEmojiByGroup(e);return j(await C(t))}async function T(e){return j(await C(await r.database.getEmojiBySearchQuery(e)))}async function L(e){let t=await r.database.getEmojiByUnicodeOrName(e),o=[...r.currentEmojis,...r.currentFavorites].find(t=>t.id===e),i=o.unicode&&f(o,r.currentSkinTone);await r.database.incrementFavoriteEmojiCount(e),u("emoji-click",{emoji:t,skinTone:r.currentSkinTone,...i&&{unicode:i},...o.name&&{name:o.name}})}async function z(e){let{target:t}=e;t.classList.contains("emoji")&&(ef(e),L(t.id.substring(4)))}function D(e){r.currentSkinTone=e,r.skinTonePickerExpanded=!1,d("skintone-button"),u("skin-tone-change",{skinTone:e}),r.database.setPreferredSkinTone(e)}async function $(e){let{relatedTarget:t}=e;t&&"skintone-list"===t.id||(r.skinTonePickerExpanded=!1)}return s(()=>{let{currentEmojis:e,emojiVersion:o}=r,a=e.filter(e=>e.unicode).filter(e=>el(e)&&!eb.has(e.unicode));!o&&a.length?(p(e),ew(()=>{(function(e,o,i){let a=!0;for(let n of e){let e=eE(i(n));void 0===t&&(t=eE(o));let r=e/1.8{}),s(()=>{b(function(){let{searchMode:e,currentEmojis:t}=r;if(e)return[{category:"",emojis:t}];let o=new Map;for(let e of t){let t=e.category||"",i=o.get(t);i||(i=[],o.set(t,i)),i.push(e)}return[...o.entries()].map(([e,t])=>({category:e,emojis:t})).sort((e,t)=>r.customCategorySorting(e.category,t.category))}())}),s(()=>{r.activeSearchItemId=-1!==r.activeSearchItem&&r.currentEmojis[r.activeSearchItem].id}),s(()=>{let{rawSearchText:e}=r;es(()=>{r.searchText=(e||"").trim(),r.activeSearchItem=-1})}),s(()=>{r.skinTonePickerExpanded?i.skinToneDropdown.addEventListener("transitionend",()=>{r.skinTonePickerExpandedAfterAnimation=!0},{once:!0}):r.skinTonePickerExpandedAfterAnimation=!1}),{$set(e){e_(r,e)},$destroy(){a.abort()}}}(this.shadowRoot,this._ctx))}disconnectedCallback(){eL(()=>{if(!this.isConnected&&this._cmp){this._cmp.$destroy(),this._cmp=void 0;let{database:e}=this._ctx;e.close().catch(e=>console.error(e))}})}static get observedAttributes(){return["locale","data-source","skin-tone-emoji","emoji-version"]}attributeChangedCallback(e,t,o){this._set(e.replace(/-([a-z])/g,(e,t)=>t.toUpperCase()),"emoji-version"===e?parseFloat(o):o)}_set(e,t){this._ctx[e]=t,this._cmp&&this._cmp.$set({[e]:t}),["locale","dataSource"].includes(e)&&this._dbFlush()}_dbCreate(){let{locale:e,dataSource:t,database:o}=this._ctx;o&&o.locale===e&&o.dataSource===t||this._set("database",new ea({locale:e,dataSource:t}))}_dbFlush(){eL(()=>this._dbCreate())}}let eF={};for(let e of eB)eF[e]={get(){return"database"===e&&this._dbCreate(),this._ctx[e]},set(t){if("database"===e)throw Error("database is read-only");this._set(e,t)}};function eN(e){if("TEXTAREA"!==e.nodeName)return!1;if(void 0===i){var t=document.createElement("textarea");t.value=1,i=!!t.firstChild}return i}Object.defineProperties(eM.prototype,eF),customElements.get("emoji-picker")||customElements.define("emoji-picker",eM);var eO=function(e,t){if(e.focus(),document.selection){var o=document.selection.createRange();o.text=t,o.collapse(!1),o.select();return}if(!document.execCommand("insertText",!1,t)){var i=e.selectionStart,a=e.selectionEnd;if("function"==typeof e.setRangeText)e.setRangeText(t);else{var n=document.createRange(),r=document.createTextNode(t);if(eN(e)){var s=e.firstChild;if(s){for(var l=0,d=null,c=null;s&&(null===d||null===c);){var u=s.nodeValue.length;i>=l&&i<=l+u&&n.setStart(d=s,i-l),a>=l&&a<=l+u&&n.setEnd(c=s,a-l),l+=u,s=s.nextSibling}i!==a&&n.deleteContents()}else e.appendChild(r)}if(eN(e)&&"#text"===n.commonAncestorContainer.nodeName)n.insertNode(r);else{var h=e.value;e.value=h.slice(0,i)+t+h.slice(a)}}e.setSelectionRange(i+t.length,i+t.length);var m=document.createEvent("UIEvent");m.initEvent("input",!0,!1),e.dispatchEvent(m)}},eP=(e,t,o)=>(Number.isNaN(t)&&(t=0),Number.isNaN(o)&&(o=0),Math.min(Math.max(e,Math.min(t,o)),Math.max(t,o))),eU="capture-photo",eq=` + :host { display: block; box-sizing: border-box; } + :host *, :host *::before, :host *::after { box-sizing: inherit;} + :host([hidden]), [hidden], ::slotted([hidden]) { display: none; } + video { display: block; } + #output:empty { display: none; } +`,eH=document.createElement("template");eH.innerHTML=` + + + +
+ + + + +
+ +
+`;var eV=class e extends HTMLElement{#e={};#t=null;#o=null;#i=null;#a=null;#n=null;#r=null;constructor(){super(),this.#e=this.getSupportedConstraints(),this.shadowRoot||this.attachShadow({mode:"open"}).appendChild(eH.content.cloneNode(!0))}static get observedAttributes(){return["no-image","pan","tilt","zoom","torch"]}attributeChangedCallback(e,t,o){if(!this.isConnected)return;let i=this.getTrackCapabilities();if("no-image"===e&&t!==o&&this.#s(),"pan"===e&&t!==o&&"pan"in this.#e){let e=!!("pan"in i&&i.pan?.min&&i.pan?.max)&&this.pan>=i.pan.min&&this.pan<=i.pan.max;"number"==typeof this.pan&&e&&this.#l("pan",this.pan)}if("tilt"===e&&t!==o&&"tilt"in this.#e){let e=!!("tilt"in i&&i.tilt?.min&&i.tilt?.max)&&this.tilt>=i.tilt.min&&this.tilt<=i.tilt.max;"number"==typeof this.tilt&&e&&this.#l("tilt",this.tilt)}if("zoom"===e&&t!==o&&"zoom"in this.#e){let e=!!("zoom"in i&&i.zoom?.min&&i.zoom?.max)&&this.zoom>=i.zoom.min&&this.zoom<=i.zoom.max;"number"==typeof this.zoom&&e&&this.#l("zoom",this.zoom)}"torch"===e&&t!==o&&"torch"in this.#e&&this.#l("torch",this.torch)}async connectedCallback(){if(this.#d("autoPlay"),this.#d("noImage"),this.#d("facingMode"),this.#d("cameraResolution"),this.#d("pan"),this.#d("tilt"),this.#d("zoom"),this.#d("torch"),this.#d("calculateFileSize"),this.#o=this.shadowRoot?.querySelector("canvas")||null,this.#i=this.shadowRoot?.getElementById("output")||null,this.#a=this.shadowRoot?.querySelector("video")||null,this.#n=this.shadowRoot?.querySelector('slot[name="capture-button"]')||null,this.#r=this.#c(),this.#a?.addEventListener("loadedmetadata",this.#u),this.#n?.addEventListener("slotchange",this.#h),this.#r?.addEventListener("click",this.#m),!e.isSupported())return this.dispatchEvent(new CustomEvent(`${eU}:error`,{bubbles:!0,composed:!0,detail:{error:{name:"NotSupportedError",message:"Not supported"}}}));this.autoPlay&&this.startVideoStream()}disconnectedCallback(){this.stopVideoStream(),this.#r?.removeEventListener("click",this.#m),this.#a?.removeEventListener("loadedmetadata",this.#u),this.#n?.removeEventListener("slotchange",this.#h)}get autoPlay(){return this.hasAttribute("auto-play")}set autoPlay(e){this.toggleAttribute("auto-play",!!e)}get noImage(){return this.hasAttribute("no-image")}set noImage(e){this.toggleAttribute("no-image",!!e)}get facingMode(){let e=this.getAttribute("facing-mode");return"user"!==e?"environment":e}set facingMode(e){this.setAttribute("facing-mode",e)}get cameraResolution(){return this.getAttribute("camera-resolution")||""}set cameraResolution(e){this.setAttribute("camera-resolution",e)}get pan(){return Number(this.getAttribute("pan"))||0}set pan(e){this.setAttribute("pan",null!=e?e.toString():e)}get tilt(){return Number(this.getAttribute("tilt"))||0}set tilt(e){this.setAttribute("tilt",null!=e?e.toString():e)}get zoom(){return Number(this.getAttribute("zoom"))||1}set zoom(e){this.setAttribute("zoom",null!=e?e.toString():e)}get torch(){return this.hasAttribute("torch")}set torch(e){this.toggleAttribute("torch",!!e)}get calculateFileSize(){return this.hasAttribute("calculate-file-size")}set calculateFileSize(e){this.toggleAttribute("calculate-file-size",!!e)}get loading(){return this.hasAttribute("loading")}#m=e=>{e.preventDefault(),this.capture()};#u=e=>{let t=e.target;t.play().then(()=>{this.dispatchEvent(new CustomEvent(`${eU}:video-play`,{bubbles:!0,composed:!0,detail:{video:t}}))}).catch(e=>{this.dispatchEvent(new CustomEvent(`${eU}:error`,{bubbles:!0,composed:!0,detail:{error:e}}))}).finally(()=>{this.removeAttribute("loading")})};#s(){this.#i&&this.#i.replaceChildren()}#l(e,t){if(!this.#t)return;let[o]=this.#t.getVideoTracks(),i=this.getTrackCapabilities(),a=this.getTrackSettings(),n="pan"===e||"tilt"===e||"zoom"===e?eP(Number(t),i[e]?.min||1,i[e]?.max||1):t;e in a&&o.applyConstraints({advanced:[{[e]:n}]}).catch(()=>{})}#h=e=>{e.target?.name==="capture-button"&&(this.#r?.removeEventListener("click",this.#m),this.#r=this.#c(),this.#r&&(this.#r.addEventListener("click",this.#m),"BUTTON"===this.#r.nodeName||this.#r.hasAttribute("role")||this.#r.setAttribute("role","button")))};#c(){return this.#n&&this.#n.assignedElements({flatten:!0}).find(e=>"BUTTON"===e.nodeName||"capture-button"===e.getAttribute("slot"))||null}#d(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}async startVideoStream(t){if(!e.isSupported()||this.#t)return;this.setAttribute("loading","");let o={video:{facingMode:{ideal:this.facingMode},pan:!0,tilt:!0,zoom:!0,torch:this.torch},audio:!1};if("string"==typeof t&&t.trim().length>0&&(o.video.deviceId={exact:t}),"string"==typeof this.cameraResolution&&this.cameraResolution.trim().length>0){let[e=0,t=0]=this.cameraResolution.split("x").map(e=>Number(e));e>0&&t>0&&(o.video.width=e,o.video.height=t)}try{this.#t=await navigator.mediaDevices.getUserMedia(o),this.#a&&(this.#a.srcObject=this.#t),this.#l("pan",this.pan),this.#l("tilt",this.tilt),this.#l("zoom",this.zoom)}catch(e){this.dispatchEvent(new CustomEvent(`${eU}:error`,{bubbles:!0,composed:!0,detail:{error:e}}))}finally{this.removeAttribute("loading")}}restartVideoStream(e){this.#t&&this.#a&&this.stopVideoStream(),this.startVideoStream(e)}stopVideoStream(){if(!this.#a||!this.#t)return;let[e]=this.#t.getVideoTracks();e?.stop(),this.#a.srcObject=null,this.#t=null}async capture(){if(!(this.loading||!this.#o||!this.#a))try{let e=this.#o.getContext("2d"),t=this.#a.videoWidth,o=this.#a.videoHeight;this.#o.width=t,this.#o.height=o,e?.drawImage(this.#a,0,0,t,o);let i=this.#o.toDataURL("image/png");if("string"==typeof i&&i.includes("data:image")){if(!this.noImage){let e=new Image;e.src=i,e.width=t,e.height=o,e.alt="Captured photo",e.setAttribute("part","output-image"),this.#s(),this.#i?.appendChild(e)}let e={dataURI:i,width:t,height:o};if(this.calculateFileSize)try{let t=(await (await fetch(i)).blob()).size;t&&(e.size=t)}catch{}this.dispatchEvent(new CustomEvent(`${eU}:success`,{bubbles:!0,composed:!0,detail:e}))}}catch(e){this.dispatchEvent(new CustomEvent(`${eU}:error`,{bubbles:!0,composed:!0,detail:{error:e}}))}}getSupportedConstraints(){return e.isSupported()&&navigator.mediaDevices.getSupportedConstraints()||{}}getTrackCapabilities(){if(!this.#t)return{};let[e]=this.#t.getVideoTracks();return e&&"function"==typeof e.getCapabilities&&e.getCapabilities()||{}}getTrackSettings(){if(!this.#t)return{};let[e]=this.#t.getVideoTracks();return e&&"function"==typeof e.getSettings&&e.getSettings()||{}}static async getVideoInputDevices(){return navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices?(await navigator.mediaDevices.enumerateDevices()||[]).filter(e=>"videoinput"===e.kind&&!!e.deviceId):[]}static isSupported(){return!!navigator.mediaDevices?.getUserMedia}static defineCustomElement(t=eU){"u">typeof window&&!window.customElements.get(t)&&window.customElements.define(t,e)}};/*! + * @georapbox/web-share-element + * A custom element that implements the Web Share API to share user-defined data. + * + * @version 3.1.1 + * @homepage https://github.com/georapbox/web-share-element#readme + * @author George Raptis + * @license MIT + */function eW(e){return null!==e&&"object"==typeof e?"share"in navigator&&"canShare"in navigator&&navigator.canShare(e):"share"in navigator}eV.defineCustomElement();/*! + * @georapbox/web-share-element + * A custom element that implements the Web Share API to share user-defined data. + * + * @version 3.1.1 + * @homepage https://github.com/georapbox/web-share-element#readme + * @author George Raptis + * @license MIT + */var eG=` + :host { + display: inline-block; + } +`,eX=document.createElement("template");eX.innerHTML=` + + +`,(class e extends HTMLElement{#a;#t;#n=[];constructor(){super(),this.shadowRoot||this.attachShadow({mode:"open",delegatesFocus:!0}).appendChild(eX.content.cloneNode(!0)),this.#a=this.shadowRoot?.querySelector('slot[name="button"]')||null,this.#t=this.#i()}static get observedAttributes(){return["disabled"]}attributeChangedCallback(e,t,o){"disabled"===e&&t!==o&&this.#t&&(this.#t.toggleAttribute("disabled",this.disabled),this.#t.setAttribute("aria-disabled",this.disabled.toString()),this.#t.part&&this.#t.part.contains("button")&&this.#t.part.toggle("button--disabled",this.disabled))}connectedCallback(){this.#d("shareUrl"),this.#d("shareTitle"),this.#d("shareText"),this.#d("shareFiles"),this.#d("disabled"),this.#a?.addEventListener("slotchange",this.#e),this.#t?.addEventListener("click",this.#r)}disconnectedCallback(){this.#a?.removeEventListener("slotchange",this.#e),this.#t?.removeEventListener("click",this.#r)}get disabled(){return this.hasAttribute("disabled")}set disabled(e){this.toggleAttribute("disabled",!!e)}get shareUrl(){return this.getAttribute("share-url")||""}set shareUrl(e){this.setAttribute("share-url",e)}get shareTitle(){return this.getAttribute("share-title")||""}set shareTitle(e){this.setAttribute("share-title",e)}get shareText(){return this.getAttribute("share-text")||""}set shareText(e){this.setAttribute("share-text",e)}get shareFiles(){return this.#n}set shareFiles(e){Array.isArray(e)&&e.length>0&&(this.#n=e)}async share(){if(!this.disabled)try{let e={};this.shareUrl&&(e.url=this.shareUrl),this.shareTitle&&(e.title=this.shareTitle),this.shareText&&(e.text=this.shareText),Array.isArray(this.shareFiles)&&this.shareFiles.length>0&&navigator.canShare&&navigator.canShare({files:this.shareFiles})&&(e.files=this.shareFiles),await navigator.share(e),this.dispatchEvent(new CustomEvent("web-share:success",{bubbles:!0,composed:!0,detail:{shareData:e}}))}catch(e){if(e instanceof Error&&"AbortError"===e.name){this.dispatchEvent(new CustomEvent("web-share:abort",{bubbles:!0,composed:!0,detail:{error:e}}));return}this.dispatchEvent(new CustomEvent("web-share:error",{bubbles:!0,composed:!0,detail:{error:e}}))}}#r=e=>{e.preventDefault(),this.disabled||this.share()};#e=e=>{e.target&&"button"===e.target.name&&(this.#t?.removeEventListener("click",this.#r),this.#t=this.#i(),this.#t&&(this.#t.addEventListener("click",this.#r),"BUTTON"===this.#t.nodeName||this.#t.hasAttribute("role")||this.#t.setAttribute("role","button")))};#i(){return this.#a&&this.#a.assignedElements({flatten:!0}).find(e=>"BUTTON"===e.nodeName||"button"===e.getAttribute("slot"))||null}#d(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}static defineCustomElement(t="web-share"){"u">typeof window&&!window.customElements.get(t)&&window.customElements.define(t,e)}}).defineCustomElement();/*! + * @georapbox/modal-element + * A custom element to create a modal, using the native dialog element under the hood. + * + * @version 1.8.0 + * @homepage https://github.com/georapbox/modal-element#readme + * @author George Raptis + * @license MIT + */var eY=document.createElement("template"),eJ=` + :host { + --me-width: 32rem; + --me-height: fit-content; + --me-border-color: initial; + --me-border-style: solid; + --me-border-width: initial; + --me-border-radius: 0; + --me-box-shadow: none; + --me-background-color: canvas; + --me-color: canvastext; + + --me-header-spacing: 1rem; + --me-footer-spacing: 1rem; + --me-header-background-color: transparent; + --me-header-color: initial; + + --me-body-spacing: 1rem; + --me-body-background-color: transparent; + --me-body-color: initial; + --me-footer-background-color: transparent; + --me-footer-color: initial; + + --me-close-padding: 0.4375rem; + --me-close-border: none; + --me-close-border-radius: 0; + --me-close-background-color: transparent; + --me-close-color: inherit; + --me-close-font-size: 1rem; + + --me-backdrop-background: rgba(0, 0, 0, 0.5); + --me-backdrop-filter: none; + + display: contents; + box-sizing: border-box; + } + + :host *, + :host *:after, + :host *:before { + box-sizing: inherit; + } + + :host([hidden]), + [hidden] { + display: none !important; + } + + /* Dialog */ + .dialog { + --dialog-placement-margin: calc((2em + 6px) / 2); + + width: var(--me-width); + height: var(--me-height); + padding: 0; + border-color: var(--me-border-color); + border-style: var(--me-border-style); + border-width: var(--me-border-width); + border-radius: var(--me-border-radius); + box-shadow: var(--me-box-shadow); + background-color: var(--me-background-color); + color: var(--me-color); + } + + .dialog[open] { + display: flex; + } + + :host([fullscreen]) .dialog { + max-width: 100%; + max-height: 100%; + width: 100%; + height: 100%; + } + + .dialog::backdrop { + background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5)); + backdrop-filter: var(--me-backdrop-filter, none); + opacity: 0; + } + + .dialog[open]::backdrop { + opacity: 1; + } + + /* Dialog placement */ + :host(:not([fullscreen])[placement="top-start"]) .dialog { + margin-block-start: var(--dialog-placement-margin); + margin-inline-start: var(--dialog-placement-margin); + } + + :host(:not([fullscreen])[placement="top-center"]) .dialog { + margin-block-start: var(--dialog-placement-margin); + } + + :host(:not([fullscreen])[placement="top-end"]) .dialog { + margin-block-start: var(--dialog-placement-margin); + margin-inline-end: var(--dialog-placement-margin); + } + + :host(:not([fullscreen])[placement="center-start"]) .dialog { + margin-inline-start: var(--dialog-placement-margin); + } + + :host(:not([fullscreen])[placement="center"]) .dialog { + margin: auto; + } + + :host(:not([fullscreen])[placement="center-end"]) .dialog { + margin-inline-end: var(--dialog-placement-margin); + } + + :host(:not([fullscreen])[placement="bottom-start"]) .dialog { + margin-block-end: var(--dialog-placement-margin); + margin-inline-start: var(--dialog-placement-margin); + } + + :host(:not([fullscreen])[placement="bottom-center"]) .dialog { + margin-block-end: var(--dialog-placement-margin); + } + + :host(:not([fullscreen])[placement="bottom-end"]) .dialog { + margin-block-end: var(--dialog-placement-margin); + margin-inline-end: var(--dialog-placement-margin); + } + + /* Dialog animations */ + @media (prefers-reduced-motion: no-preference) { + .dialog:not(.dialog--no-animations), + .dialog:not(.dialog--no-animations)::backdrop { + transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete; + } + + /* 1. IS-OPEN STATE */ + .dialog[open] { + transform: scale(1); + opacity: 1; + } + + /* 2. EXIT STATE */ + .dialog { + transform: scale(0.95); + opacity: 0; + } + + /* 0. BEFORE-OPEN STATE */ + @starting-style { + .dialog[open] { + transform: scale(0.95); + opacity: 0; + } + + .dialog[open]::backdrop { + opacity: 0; + } + } + + .dialog--pulse:not(.dialog--no-animations) { + animation-name: pulse; + animation-duration: 300ms; + animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9); + } + + @keyframes pulse { + 0% { transform: scale(1); } + 50% { transform: scale(1.02); } + 100% { transform: scale(1); } + } + } + + /* Dialog panel, header, body, footer */ + .dialog__panel { + display: flex; + flex-direction: column; + flex: 1 1 auto; + width: 100%; + } + + .dialog__header { + display: flex; + align-items: center; + padding: var(--me-header-spacing); + column-gap: 0.5rem; + background-color: var(--me-header-background-color); + color: var(--me-header-color); + } + + :host([no-close-button]) .dialog__header { + column-gap: 0; + } + + .dialog__title { + display: block; + flex: 1 1 auto; + padding: 0; + margin: 0; + } + + .dialog__body { + display: block; + flex: 1 1 auto; + padding: var(--me-body-spacing); + overflow: auto; + background-color: var(--me-body-background-color); + color: var(--me-body-color); + overscroll-behavior: contain; + } + + .dialog__footer { + flex: 0 0 auto; + text-align: end; + padding: var(--me-footer-spacing); + background-color: var(--me-footer-background-color); + color: var(--me-footer-color); + } + + .dialog__close { + display: inline-flex; + align-items: center; + justify-content: center; + padding: var(--me-close-padding); + border: var(--me-close-border); + border-radius: var(--me-close-border-radius); + background-color: var(--me-close-background-color); + color: var(--me-close-color); + font-size: var(--me-close-font-size); + } + + .dialog__close:not(:disabled) { + cursor: pointer; + } + + .dialog__close:disabled { + cursor: not-allowed; + } +`;eY.innerHTML=` + + + +
+
+ + +
+ +
+
+ + + +
+ +
+
+
+`,(class e extends HTMLElement{#a=null;#r=null;#e=null;#l=void 0;constructor(){super(),this.shadowRoot||this.attachShadow({mode:"open"}).appendChild(eY.content.cloneNode(!0)),this.shadowRoot&&(this.#a=this.shadowRoot.querySelector("dialog"),this.#r=this.shadowRoot.querySelector('slot[name="footer"]'),this.#e=this.shadowRoot.querySelector('slot[name="close"]'))}static get observedAttributes(){return["open","no-header","no-animations","no-close-button","close-label"]}attributeChangedCallback(e,t,o){if(null!==this.#a){if("open"===e&&t!==o&&(this.open?(this.#a.showModal(),this.dispatchEvent(new CustomEvent("me-open",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow="hidden")):this.#a.close()),"no-header"===e&&t!==o){let e=this.#a.querySelector(".dialog__header");null!==e&&(e.hidden=this.noHeader)}if("no-animations"===e&&t!==o&&this.#a.classList.toggle("dialog--no-animations",this.noAnimations),"no-close-button"===e&&t!==o){let e=this.#a.querySelector(".dialog__close");null!==e&&(e.hidden=this.noCloseButton)}"close-label"===e&&t!==o&&this.#n()}}connectedCallback(){this.#t("open"),this.#t("staticBackdrop"),this.#t("noHeader"),this.#t("noAnimations"),this.#t("noCloseButton"),this.#t("fullscreen"),this.#t("preserveOverflow"),this.#t("placement"),this.#t("closeLabel"),this.#a?.addEventListener("click",this.#i),this.#a?.addEventListener("close",this.#m),this.#a?.addEventListener("cancel",this.#h),this.#a?.querySelector('form[method="dialog"]')?.addEventListener("submit",this.#u),this.#r?.addEventListener("slotchange",this.#c),this.#e?.addEventListener("slotchange",this.#p)}disconnectedCallback(){this.#l&&clearTimeout(this.#l),this.#a?.addEventListener("click",this.#i),this.#a?.removeEventListener("close",this.#m),this.#a?.removeEventListener("cancel",this.#h),this.#a?.querySelector('form[method="dialog"]')?.removeEventListener("submit",this.#u),this.#r?.removeEventListener("slotchange",this.#c),this.#e?.removeEventListener("slotchange",this.#p)}get open(){return this.hasAttribute("open")}set open(e){this.toggleAttribute("open",!!e)}get staticBackdrop(){return this.hasAttribute("static-backdrop")}set staticBackdrop(e){this.toggleAttribute("static-backdrop",!!e)}get noHeader(){return this.hasAttribute("no-header")}set noHeader(e){this.toggleAttribute("no-header",!!e)}get noAnimations(){return this.hasAttribute("no-animations")}set noAnimations(e){this.toggleAttribute("no-animations",!!e)}get noCloseButton(){return this.hasAttribute("no-close-button")}set noCloseButton(e){this.toggleAttribute("no-close-button",!!e)}get fullscreen(){return this.hasAttribute("fullscreen")}set fullscreen(e){this.toggleAttribute("fullscreen",!!e)}get preserveOverflow(){return this.hasAttribute("preserve-overflow")}set preserveOverflow(e){this.toggleAttribute("preserve-overflow",!!e)}get placement(){return this.getAttribute("placement")||"center"}set placement(e){this.setAttribute("placement",null!=e?e.toString():e)}get closeLabel(){return this.getAttribute("close-label")||"Close"}set closeLabel(e){this.setAttribute("close-label",null!=e?e.toString():e)}#n(){if(null===this.#a)return;let e=this.#a.querySelector(".dialog__close");null!==e&&((this.#e?.assignedElements()||[])?.some(e=>e.textContent?.replace(/\s/g,"")!=="")?e.removeAttribute("aria-label"):e.setAttribute("aria-label",this.closeLabel))}#o(){this.#l||(this.#a?.classList.add("dialog--pulse"),this.#l=setTimeout(()=>{this.#a?.classList.remove("dialog--pulse"),clearTimeout(this.#l),this.#l=void 0},300))}#m=()=>{this.open=!1,this.dispatchEvent(new CustomEvent("me-close",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow="")};#h=e=>{let t=this.#d("escape-key");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#o())};#u=e=>{let t=this.#d("close-button");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#o())};#i=e=>{let t=e.target;if(t===e.currentTarget){let e=this.#d("backdrop-click");this.dispatchEvent(e),e.defaultPrevented||this.staticBackdrop?this.noAnimations||this.#o():this.hide()}if(t instanceof HTMLElement&&null!==t.closest("[data-me-close]")){let e=this.#d("external-invoker");this.dispatchEvent(e),e.defaultPrevented?this.noAnimations||this.#o():this.hide()}};#c=()=>{if(null===this.#a)return;let e=this.#a.querySelector(".dialog__footer");if(null===e)return;let t=this.#r?.assignedNodes(),o=!!t&&t.length>0;e.hidden=!o};#p=()=>{this.#n()};#d(e){return new CustomEvent("me-request-close",{bubbles:!0,composed:!0,cancelable:!0,detail:{reason:e,element:this}})}#t(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}show(){this.open||(this.open=!0)}hide(){this.open&&(this.open=!1)}static defineCustomElement(t="modal-element"){"u">typeof window&&!window.customElements.get(t)&&window.customElements.define(t,e)}}).defineCustomElement();var eK=new Map([["aac","audio/aac"],["abw","application/x-abiword"],["arc","application/x-freearc"],["avif","image/avif"],["avi","video/x-msvideo"],["azw","application/vnd.amazon.ebook"],["bin","application/octet-stream"],["bmp","image/bmp"],["bz","application/x-bzip"],["bz2","application/x-bzip2"],["cda","application/x-cdf"],["csh","application/x-csh"],["css","text/css"],["csv","text/csv"],["doc","application/msword"],["docx","application/vnd.openxmlformats-officedocument.wordprocessingml.document"],["eot","application/vnd.ms-fontobject"],["epub","application/epub+zip"],["gz","application/gzip"],["gif","image/gif"],["heic","image/heic"],["heif","image/heif"],["htm","text/html"],["html","text/html"],["ico","image/vnd.microsoft.icon"],["ics","text/calendar"],["jar","application/java-archive"],["jpeg","image/jpeg"],["jpg","image/jpeg"],["jxl","image/jxl"],["js","text/javascript"],["json","application/json"],["jsonld","application/ld+json"],["markdown","text/markdown"],["md","text/markdown"],["mid","audio/midi"],["midi","audio/midi"],["mjs","text/javascript"],["mp3","audio/mpeg"],["mp4","video/mp4"],["mpeg","video/mpeg"],["mpkg","application/vnd.apple.installer+xml"],["odp","application/vnd.oasis.opendocument.presentation"],["ods","application/vnd.oasis.opendocument.spreadsheet"],["odt","application/vnd.oasis.opendocument.text"],["oga","audio/ogg"],["ogv","video/ogg"],["ogx","application/ogg"],["opus","audio/opus"],["otf","font/otf"],["png","image/png"],["pdf","application/pdf"],["php","application/x-httpd-php"],["ppt","application/vnd.ms-powerpoint"],["pptx","application/vnd.openxmlformats-officedocument.presentationml.presentation"],["rar","application/vnd.rar"],["rtf","application/rtf"],["sh","application/x-sh"],["svg","image/svg+xml"],["swf","application/x-shockwave-flash"],["tar","application/x-tar"],["tif","image/tiff"],["tiff","image/tiff"],["ts","video/mp2t"],["ttf","font/ttf"],["txt","text/plain"],["vsd","application/vnd.visio"],["wav","audio/wav"],["weba","audio/webm"],["webm","video/webm"],["webp","image/webp"],["woff","font/woff"],["woff2","font/woff2"],["xhtml","application/xhtml+xml"],["xls","application/vnd.ms-excel"],["xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],["xml","application/xml"],["xul","application/vnd.mozilla.xul+xml"],["zip","application/zip"],["7z","application/x-7z-compressed"],["mkv","video/x-matroska"],["mov","video/quicktime"],["msg","application/vnd.ms-outlook"]]),eQ=[".DS_Store","Thumbs.db"],eZ=e=>{let{name:t}=e;if(t&&-1!==t.lastIndexOf(".")&&!e.type){let o=(t.split(".").pop()||"").toLowerCase(),i=eK.get(o);i&&Object.defineProperty(e,"type",{value:i,writable:!1,configurable:!1,enumerable:!0})}return e},e0=(e,t)=>{let o=eZ(e);if("string"!=typeof o.path){let{webkitRelativePath:i}=e;Object.defineProperty(o,"path",{value:"string"==typeof t?t:i||e.name,writable:!1,configurable:!1,enumerable:!0})}return o},e1=async e=>await new Promise((t,o)=>{e.readEntries(t,o)}),e8=async e=>{let t=[],o=await e1(e);for(;o.length>0;)t.push(...o),o=await e1(e);return t},e3=e=>new Promise((t,o)=>{e.file(o=>t(e0(o,e.fullPath)),o)}),e2=async e=>{let t=[],o=[];for(let t of e){if("file"!==t.kind)continue;let e=t.getAsEntry?t.getAsEntry():t.webkitGetAsEntry();o.push(e)}for(;o.length>0;){let e=o.shift();if(e){if(e.isFile){let o=await e3(e);-1===eQ.indexOf(o.name)&&t.push(o)}else e.isDirectory&&o.push(...await e8(e.createReader()))}}return t},e5=async e=>{let t=[];for(let o of e)-1===eQ.indexOf(o.name)&&t.push(e0(o));return t},e4=async e=>e.dataTransfer?e.dataTransfer.items?await e2(e.dataTransfer.items):await e5(e.dataTransfer.files):await e5(e.target.files),e9="files-dropzone",e7="TOO_MANY_FILES",e6=document.createElement("template"),te=` + *, + *::before, + *::after { + box-sizing: border-box; + } + + :host([hidden]), + [hidden] { + display: none !important; + } + + :host { + --dropzone-border-width: 2px; + --dropzone-border-style: dashed; + --dropzone-border-radius: 0.25rem; + --dropzone-border-color: #6c757d; + --dropzone-border-color-dragover: #0d6efd; + --dropzone-border-color-hover: var(--dropzone-border-color-dragover); + --dropzone-background-color: #ffffff; + --dropzone-background-color-dragover: #f4f4f5; + --dropzone-background-color-hover: var(--dropzone-background-color-dragover); + --dropzone-body-color: #3f3f46; + --dropzone-body-color-dragover: var(--dropzone-body-color); + --dropzone-body-color-hover: var(--dropzone-body-color-dragover); + --dropzone-focus-shadow-rgb: 49,132,253; + --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5); + --transition-duration: 0.2s; /* for backwards compatibility */ + --dropzone-transition-duration: var(--transition-duration); + + display: block; + } + + :host(:not([no-style])) .dropzone { + border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color); + border-radius: var(--dropzone-border-radius); + padding: 3rem 1rem; + overflow: hidden; + background-color: var(--dropzone-background-color); + color: var(--dropzone-body-color); + text-align: center; + cursor: pointer; + transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out; + } + + :host(:not([no-style])[disabled]) .dropzone { + opacity: 0.8; + cursor: not-allowed; + user-select: none; + } + + :host(:not([no-style]):not([disabled])) .dropzone--dragover { + border-color: var(--dropzone-border-color-dragover); + background-color: var(--dropzone-background-color-dragover); + color: var(--dropzone-body-color-dragover); + } + + :host(:not([no-style]):not([disabled])) .dropzone:focus-visible { + outline: none; + box-shadow: var(--dropzone-focus-box-shadow); + } + + @media (hover: hover) { + :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover { + border-color: var(--dropzone-border-color-hover); + background-color: var(--dropzone-background-color-hover); + color: var(--dropzone-body-color-hover); + } + } +`;e6.innerHTML=` + + + + +
+ Drag 'n' drop files here, or click to select files +
+`,(class e extends HTMLElement{#t=null;#a=null;constructor(){super(),this.shadowRoot||this.attachShadow({mode:"open",delegatesFocus:!0}).appendChild(e6.content.cloneNode(!0)),this.shadowRoot&&(this.#t=this.shadowRoot.getElementById("file-input"),this.#a=this.shadowRoot.getElementById("dropzone"))}static get observedAttributes(){return["accept","disabled","multiple"]}attributeChangedCallback(e,t,o){"accept"===e&&t!==o&&this.#t&&(this.#t.accept=this.accept),"disabled"===e&&t!==o&&this.#t&&(this.#t.disabled=this.disabled,this.disabled?(this.#a?.removeAttribute("tabindex"),this.#a?.setAttribute("aria-disabled","true")):(this.#a?.setAttribute("tabindex","0"),this.#a?.setAttribute("aria-disabled","false"))),"multiple"===e&&t!==o&&this.#t&&(this.#t.multiple=this.multiple)}connectedCallback(){this.#l("accept"),this.#l("disabled"),this.#l("maxFiles"),this.#l("maxSize"),this.#l("minSize"),this.#l("multiple"),this.#l("autoFocus"),this.#l("noStyle"),this.#t?.addEventListener("change",this.#r),this.#a?.addEventListener("dragenter",this.#n),this.#a?.addEventListener("dragover",this.#d),this.#a?.addEventListener("dragleave",this.#o),this.#a?.addEventListener("drop",this.#e),this.#a?.addEventListener("click",this.#h),this.#a?.addEventListener("keyup",this.#m),this.autoFocus&&this.#a?.focus()}disconnectedCallback(){this.#t?.removeEventListener("change",this.#r),this.#a?.removeEventListener("dragenter",this.#n),this.#a?.removeEventListener("dragover",this.#d),this.#a?.removeEventListener("dragleave",this.#o),this.#a?.removeEventListener("drop",this.#e),this.#a?.removeEventListener("click",this.#h),this.#a?.removeEventListener("keyup",this.#m)}get accept(){return this.getAttribute("accept")||""}set accept(e){this.setAttribute("accept",null!=e?e.toString():e)}get disabled(){return this.hasAttribute("disabled")}set disabled(e){this.toggleAttribute("disabled",!!e)}get maxFiles(){let e=Number(this.getAttribute("max-files"))||0;return e<=0?1/0:Math.floor(Math.abs(e))}set maxFiles(e){this.setAttribute("max-files",null!=e?e.toString():e)}get maxSize(){let e=this.getAttribute("max-size");if(null===e)return 1/0;let t=Number(e);return Number.isNaN(t)?1/0:t}set maxSize(e){this.setAttribute("max-size",null!=e?e.toString():e)}get minSize(){let e=this.getAttribute("min-size");if(null===e)return 0;let t=Number(e);return Number.isNaN(t)?0:t}set minSize(e){this.setAttribute("min-size",null!=e?e.toString():e)}get multiple(){return this.hasAttribute("multiple")}set multiple(e){this.toggleAttribute("multiple",!!e)}get autoFocus(){return this.hasAttribute("auto-focus")}set autoFocus(e){this.toggleAttribute("auto-focus",!!e)}get noStyle(){return this.hasAttribute("no-style")}set noStyle(e){this.toggleAttribute("no-style",!!e)}#r=async e=>{try{this.#u(await e4(e))}catch(e){this.dispatchEvent(new CustomEvent(`${e9}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}};#n=()=>{this.disabled||this.dispatchEvent(new Event(`${e9}-dragenter`,{bubbles:!0,composed:!0}))};#d=e=>{if(e.preventDefault(),this.disabled){e.dataTransfer.dropEffect="none";return}e.dataTransfer.dropEffect="copy",this.#a&&(this.#a.classList.add("dropzone--dragover"),this.#a.part.add("dropzone--dragover")),this.dispatchEvent(new Event(`${e9}-dragover`,{bubbles:!0,composed:!0}))};#o=()=>{this.disabled||(this.#a&&(this.#a.classList.remove("dropzone--dragover"),this.#a.part.remove("dropzone--dragover")),this.dispatchEvent(new Event(`${e9}-dragleave`,{bubbles:!0,composed:!0})))};#e=async e=>{if(!this.disabled){e.preventDefault(),this.#a&&(this.#a.classList.remove("dropzone--dragover"),this.#a.part.remove("dropzone--dragover"));try{this.#u(await e4(e))}catch(e){this.dispatchEvent(new CustomEvent(`${e9}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}}};#h=()=>{this.disabled||this.#t?.click()};#m=e=>{this.disabled||(" "===e.key||"Enter"===e.key)&&this.#t?.click()};#u(e){if(!Array.isArray(e)||!e.length)return;let t=[],o=[],i=e.length;if(!this.multiple&&i>1)for(let t of e)o.push({file:t,errors:[{code:e7,message:"Too many files selected. Only 1 file is allowed."}]});else if(this.multiple&&i>this.maxFiles)for(let t of e)o.push({file:t,errors:[{code:e7,message:`Too many files selected. Only ${this.maxFiles} ${this.maxFiles>1?"files are":"file is"} allowed.`}]});else for(let i of e){let e=/*! + * @georapbox/files-dropzone-element + * A custom element that creates a drag and drop zone for files + * + * @version 2.0.1 + * @homepage https://github.com/georapbox/files-dropzone-element#readme + * @author George Raptis + * @license MIT + */function(e,t=""){if(!t)return!0;let o=[...new Set(t.split(",").map(e=>e.trim()).filter(Boolean))],i=e.type,a=i.replace(/\/.*$/,"");for(let t of o)if("."===t.charAt(0)){if(-1!==e.name.toLowerCase().indexOf(t.toLowerCase(),e.name.length-t.length))return!0}else if(/\/\*$/.test(t)){if(a===t.replace(/\/.*$/,""))return!0}else if(i===t)return!0;return!1}(i,this.accept),a=i.size>this.maxSize,n=i.size0&&this.dispatchEvent(new CustomEvent(`${e9}-drop-accepted`,{bubbles:!0,composed:!0,detail:{acceptedFiles:t}})),o.length>0&&this.dispatchEvent(new CustomEvent(`${e9}-drop-rejected`,{bubbles:!0,composed:!0,detail:{rejectedFiles:o}})),this.#t&&(this.#t.value=this.#t.defaultValue)}openFileDialog(){this.disabled||this.#t?.click()}#l(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}static defineCustomElement(t=e9){"u">typeof window&&!window.customElements.get(t)&&window.customElements.define(t,e)}}).defineCustomElement();let tt=["image/jpg","image/jpeg","image/png","image/apng","image/gif","image/webp","image/avif"],to=(e="",t="")=>{let o=Math.random().toString(36).substring(2,8);return`${"string"==typeof e&&""!==e?e+"-":""}${o}${"string"==typeof t&&""!==t?"-"+t:""}`},ti=async(e={})=>{let t=await fetch(e.url),o=await t.blob(),i=e.mimeType||o.type||"";if(!tt.includes(i))throw Error(`This is not an accepted image format. Accepted MIME types are: ${tt.join(", ")}`);return new File([o],e.filename||"",o)},ta=localStorage,tn=new class{#g=null;#b=null;constructor(e,t=localStorage){if(!e)throw Error("Storage prefix is required");if(t!==localStorage&&t!==sessionStorage)throw Error("Storage provider is not supported");this.#g=e,this.#b=t}set(e,t){try{this.#b.setItem(`${this.#g}${e}`,JSON.stringify(t))}catch(e){console.error("Error saving to storage",e)}}get(e){try{let t=this.#b.getItem(`${this.#g}${e}`);return t?JSON.parse(t):null}catch(e){return console.error("Error getting from storage",e),null}}}("meme-generator/",ta),tr=e=>"string"==typeof e;var ts={};ts=s("aNJCr").getBundleURL("9p9yL")+"Pressuru.684952ea.ttf";var tl={};tl=s("aNJCr").getBundleURL("9p9yL")+"Oswald-Regular.89ec7d89.ttf";var td={};td=s("aNJCr").getBundleURL("9p9yL")+"Oswald-Bold.0f6a7ca6.ttf";var tc={};tc=s("aNJCr").getBundleURL("9p9yL")+"Roboto-Regular.ca197847.ttf";var tu={};tu=s("aNJCr").getBundleURL("9p9yL")+"Roboto-Bold.fdb9b54a.ttf";var th={};th=s("aNJCr").getBundleURL("9p9yL")+"RobotoCondensed-Regular.d585f5c7.ttf";var tm={};tm=s("aNJCr").getBundleURL("9p9yL")+"RobotoCondensed-Bold.e1f96d4b.ttf";var tp={};tp=s("aNJCr").getBundleURL("9p9yL")+"CourierPrime-Regular.3a25a501.ttf";var tg={};tg=s("aNJCr").getBundleURL("9p9yL")+"CourierPrime-Bold.3d6bf689.ttf";var tb={};tb=s("aNJCr").getBundleURL("9p9yL")+"OpenSans-Regular.edf9e01b.ttf";var tf={};tf=s("aNJCr").getBundleURL("9p9yL")+"OpenSans-Bold.8fceb72b.ttf";let tv=[{name:"Pressuru",label:"Pressuru",path:o(ts),style:"normal",weight:"400"},{name:"Oswald-Regular",label:"Oswald",path:o(tl),style:"normal",weight:"400"},{name:"Oswald-Bold",label:"Oswald Bold",path:o(td),style:"normal",weight:"700"},{name:"Roboto-Regular",label:"Roboto",path:o(tc),style:"normal",weight:"400"},{name:"Roboto-Bold",label:"Roboto Bold",path:o(tu),style:"normal",weight:"700"},{name:"RobotoCondensed-Regular",label:"Roboto Condensed",path:o(th),style:"normal",weight:"400"},{name:"RobotoCondensed-Bold",label:"Roboto Condensed Bold",path:o(tm),style:"normal",weight:"700"},{name:"CourierPrime-Regular",label:"Courier Prime",path:o(tp),style:"normal",weight:"400"},{name:"CourierPrime-Bold",label:"Courier Prime Bold",path:o(tg),style:"normal",weight:"700"},{name:"OpenSans-Regular",label:"Open Sans",path:o(tb),style:"normal",weight:"400"},{name:"OpenSans-Bold",label:"Open Sans Bold",path:o(tf),style:"normal",weight:"400"}],ty=async(e,t,o={})=>{try{let i=new FontFace(e,`url(${t})`,{...o});await i.load(),document.fonts.add(i)}catch(e){console.error(e)}},tw=document.getElementById("errorsContainer"),tk=e=>{let t=e.currentTarget;t.removeEventListener("click",tk),tw.removeChild(t.parentNode)},tE=(e="",t="info")=>{["info","warning","danger"].includes(t)||(t="info");let o=` + ${e} + + `,i=document.createElement("div");i.className=`alert alert-${t} alert-dismissible text-break mb-2 fade`,i.innerHTML=o,i.querySelector("button").addEventListener("click",tk),tw.appendChild(i),setTimeout(()=>i.classList.add("show"),100)},tx={id:"",text:"",fillColor:"#ffffff",strokeColor:"#000000",font:"Pressuru",fontSize:40,fontWeight:"normal",textAlign:"center",shadowBlur:0,strokeWidth:1.5,offsetY:0,offsetX:0,rotate:0,allCaps:!0},tS=new Map;class tC{constructor(e){let t=to("textbox",Date.now().toString(36));this.data=e?{...e,id:t}:{...tx,id:t},tS.set(t,this),document.dispatchEvent(new CustomEvent("textbox-create",{bubbles:!0,composed:!0,detail:{textbox:this}}))}getData(){return this.data}static create(e){return new tC(e)}static getAll(){return tS}static getById(e){return tS.get(e)}static remove(e){tS.delete(e),document.dispatchEvent(new CustomEvent("textbox-remove",{bubbles:!0,composed:!0,detail:{id:e}}))}static createElement(e,t=!0){if(!(e instanceof tC))return;let o=e.getData(),{id:i,text:a,fillColor:n,strokeColor:r,fontSize:s,shadowBlur:l,strokeWidth:d,offsetX:c,offsetY:u,rotate:h}=o,m=` +
+ + + + + +
+ + + + + + + +
+
+ + + `,p=document.createDocumentFragment(),g=document.createElement("div");g.setAttribute("id",i),g.setAttribute("data-section","textbox"),g.className="bg-light border shadow-sm mb-3 rounded",g.innerHTML=m,g.querySelectorAll("select").forEach(e=>e.value=o[e.dataset.input]),g.querySelectorAll('input[type="checkbox"]').forEach(e=>e.checked=o[e.dataset.input]);let b=p.appendChild(g);return t&&setTimeout(()=>b.querySelector('[data-input="text"]').focus(),0),b}}class tj{#f=null;#v=null;constructor(e){this.#f=e,this.#v=this.#f.getContext("2d")}get width(){return this.#f.width}set width(e){this.#f.width=e}get height(){return this.#f.height}set height(e){this.#f.height=e}getDimensions(){return{width:this.width,height:this.height}}setDimensions({width:e,height:t}){return this.width=e,this.height=t,this}toDataURL(){return this.#f.toDataURL()}draw(e,t=new Map){if(null==e)return;let o=this.#f,i=this.#v;i.clearRect(0,0,o.width,o.height),tr(e)?(i.fillStyle=e,i.fillRect(0,0,o.width,o.height)):i.drawImage(e,0,0,o.width,o.height);let a=0;return t.forEach(e=>{let{data:t}=e;a+=1,i.save(),i.font=`${t.fontWeight} ${t.fontSize*o.width/1e3}px ${t.font}`,i.fillStyle=t.fillColor,i.textAlign=t.textAlign,i.strokeStyle=t.strokeColor;let n=i.measureText("M").width+t.fontSize/2,r=o.width/2,s=t.shadowBlur,l=(!0===t.allCaps?t.text.toUpperCase():t.text).split("\n");0!==s&&(i.shadowOffsetX=0,i.shadowOffsetY=0,i.shadowBlur=Math.min(s,20),i.shadowColor=t.strokeColor),i.translate(r+t.offsetX,n*a+t.offsetY),i.rotate(Math.min(t.rotate,360)*Math.PI/180),l.forEach((e,t)=>i.fillText(e,0,t*n)),0!==s&&(i.shadowBlur=0,l.forEach((e,t)=>i.fillText(e,0,t*n))),t.strokeWidth>0&&(i.lineWidth=Math.min(t.strokeWidth,20),l.forEach((e,t)=>i.strokeText(e,0,t*n))),i.restore()}),this}clear(){return this.#v.clearRect(0,0,this.#f.width,this.#f.height),this}show(){return this.#f.hidden=!1,this}hide(){return this.#f.hidden=!0,this}static createInstance(e){return new tj(e)}}let tA=tj.createInstance(document.getElementById("canvas")),tT=document.getElementById("videoModal"),tL=document.getElementById("downloadModal"),tz=document.querySelector("capture-photo"),tD=document.getElementById("cameraSelect"),t$=document.getElementById("capturePhotoButton"),t_=document.getElementById("torchButton"),tI=document.querySelector("files-dropzone"),tB=document.getElementById("instructions"),tR=document.getElementById("imageUploadMethodSelect"),tM=document.getElementById("fileSelectBtn"),tF=document.getElementById("imageUrlForm"),tN=document.getElementById("addTextboxBtn"),tO=document.getElementById("textboxesContainer"),tP=document.getElementById("generateMemeBtn"),tU=document.getElementById("openVideoModalBtn"),tq=document.getElementById("downloadMemeBtn"),tH=document.getElementById("downloadMemePreview"),tV=document.querySelector("web-share"),tW=document.getElementById("gallery"),tG=document.getElementById("gallerySearch"),tX=tW.querySelector(".gallery__no-results"),tY=document.getElementById("solidColorForm"),tJ=document.querySelectorAll(".upload-method"),tK=document.getElementById("removeConfirmationModal"),tQ=document.getElementById("removeTextForm"),tZ=document.getElementById("maxImageDimensionsForm"),t0=tZ.maxImageDimensions,t1=document.getElementById("clearCanvasBtn"),t8=tn.get("maxImageDimensions"),t3=!1,t2=null,t5=null,t4=async()=>{let e=tA.toDataURL("image/png"),t=`${to("meme")}.png`,o=e.replace("image/png","image/octet-stream");if(tq.download=t,tq.href=o,tH.width=tA.getDimensions().width,tH.height=tA.getDimensions().height,tH.src=o,eW())try{let o=await ti({url:e,filename:t,mimeType:"image/png"}).catch(e=>tE(e.message,"danger"));o&&eW({files:[o]})&&(tV.shareFiles=[o],tV.hidden=!1)}catch(e){console.error(e)}window.requestAnimationFrame(()=>{tL.open=!0})},t9=e=>{let[t,o]=tZ.maxImageDimensions.value.split("x"),i=Number(t)||800,a=Number(o)||600,n=e.width,r=e.height;n>r?n>i&&(r*=i/n,n=i):r>a&&(n*=a/r,r=a),tA.setDimensions({width:n,height:r})},t7=()=>{tA.draw(t2,tC.getAll()).show(),tI.classList.add("dropzone--accepted"),tI.disabled=!0,tP.disabled=!1,tB.hidden=!0,t1.hidden=!1},t6=e=>{t9(t2=e.target),t7()},oe=e=>{if(!e)return;let t=new Image,o=new FileReader;o.addEventListener("load",function(e){let o=e.target.result;t.addEventListener("load",t6),t.src=o}),o.readAsDataURL(e)},ot=(e,t,o)=>{let i=tC.getById(t).getData();switch(e.type){case"checkbox":i[o]=e.checked;break;case"number":i[o]=Number(e.value);break;default:i[o]=e.value}tA.draw(t2,tC.getAll())},oo=async e=>{e.preventDefault();let t=e.target,o=t.querySelector('button[type="submit"]'),i=t.imageUrl.value;if(i.trim()){o.disabled=!0,o.querySelector(".spinner").hidden=!1,o.querySelector(".label").hidden=!0;try{let e=await ti({url:i}).catch(e=>tE(e.message,"danger"));e&&oe(e)}catch{tE(`Failed to load image from "${i}".`,"danger")}finally{o.disabled=!1,o.querySelector(".spinner").hidden=!0,o.querySelector(".label").hidden=!1}}},oi=(e,t)=>()=>{let o=document.getElementById(e),i=o.querySelector('[data-input="offsetY"]'),a=o.querySelector('[data-input="offsetX"]'),n=tC.getById(e);if(!n)return;let r=n.getData();switch(t=t.toLowerCase()){case"up":r.offsetY-=1,i.value=r.offsetY;break;case"down":r.offsetY+=1,i.value=r.offsetY;break;case"left":r.offsetX-=1,a.value=r.offsetX;break;case"right":r.offsetX+=1,a.value=r.offsetX}tA.draw(t2,tC.getAll()),t5=requestAnimationFrame(oi(e,t))},oa=async e=>{let t=e.target.closest("button");if(!t)return;let o=t.querySelector("img");try{let e=await ti({url:o.src}).catch(e=>tE(e.message,"danger"));e&&oe(e)}catch{tE(`Failed to load image: "${o.alt}".`,"danger")}},on=(e={})=>{let{el:t,isTorchOn:o}={el:document.getElementById("torchButton"),isTorchOn:!1,...e},i=t.querySelectorAll("svg path");2===i.length&&(i[0].style.display=o?"none":"block",i[1].style.display=o?"block":"none",t.setAttribute("aria-label",`Turn ${o?"off":"on"} flash`))},or=async e=>{let t=e.target.getTrackCapabilities();t?.torch&&(t_?.removeAttribute("hidden"),tz?.hasAttribute("torch")&&on({el:t_,isTorchOn:!0}));let o=await eV.getVideoInputDevices();o.forEach((e,t)=>{let o=document.createElement("option");o.value=e.deviceId,o.textContent=e.label||`Camera ${t+1}`,tD.appendChild(o)}),o.length>1&&tD?.removeAttribute("hidden")};document.addEventListener("web-share:error",()=>{tL.open=!1,tE("There was an error while trying to share your meme.","danger")}),document.addEventListener("capture-photo:video-play",or,{once:!0}),document.addEventListener("capture-photo:error",e=>{let t=e.detail.error,o="An error occurred while trying to capture photo.";t instanceof Error&&("NotAllowedError"===t.name||"NotFoundError"===t.name)&&(o+=" Make sure you have a camera connected and you have granted the appropriate permissions."),tE(o,"danger"),tT.open=!1,console.error(t)}),document.addEventListener("capture-photo:success",e=>{tT.open=!1;let t=new Image;t.addEventListener("load",t6),t.src=e.detail.dataURI}),document.addEventListener("me-open",e=>{"videoModal"===e.target.id&&tz&&"function"==typeof tz.startVideoStream&&tz.startVideoStream()}),document.addEventListener("me-close",e=>{"videoModal"===e.target.id&&tz&&"function"==typeof tz.stopVideoStream&&tz.stopVideoStream(),"removeConfirmationModal"===e.target.id&&tQ.reset()}),document.addEventListener("emoji-click",e=>{let t=e.target.closest('[data-section="textbox"]');if(t){let o=t.querySelector('[data-input="text"]'),i=e.detail.unicode;o&&eO(o,i)}}),document.addEventListener("textbox-create",e=>{let t=e.detail.textbox,o=tC.createElement(t,t3);t3=!0,tO.appendChild(o),t.getData().text&&tA.draw(t2,tC.getAll())}),document.addEventListener("textbox-remove",e=>{let t=document.getElementById(e.detail.id);t&&t.remove(),tO.querySelectorAll('[data-section="textbox"]').forEach((e,t)=>{e.querySelector('[data-input="text"]').setAttribute("placeholder",`Text #${t+1}`)}),tA.draw(t2,tC.getAll())}),tM.addEventListener("click",()=>{"function"==typeof tI.openFileDialog&&tI.openFileDialog()}),tU.addEventListener("click",()=>{tT.open=!0}),tN.addEventListener("click",()=>tC.create()),tP.addEventListener("click",t4),tq.addEventListener("click",()=>tL.open=!1),tF.addEventListener("submit",oo),tI.addEventListener("files-dropzone-drop-accepted",e=>{let[t]=e.detail.acceptedFiles;t&&oe(t)}),tO.addEventListener("input",e=>{let t;let o=e.target,i=o.closest('[data-section="textbox"]').id;o.matches('[data-input="text"]')?t="text":o.matches('[data-input="fillColor"]')?t="fillColor":o.matches('[data-input="strokeColor"]')?t="strokeColor":o.matches('[data-input="font"]')?t="font":o.matches('[data-input="fontSize"]')?t="fontSize":o.matches('[data-input="fontWeight"]')?t="fontWeight":o.matches('[data-input="textAlign"]')?t="textAlign":o.matches('[data-input="shadowBlur"]')?t="shadowBlur":o.matches('[data-input="offsetY"]')?t="offsetY":o.matches('[data-input="offsetX"]')?t="offsetX":o.matches('[data-input="rotate"]')?t="rotate":o.matches('[data-input="strokeWidth"]')&&(t="strokeWidth"),t&&ot(o,i,t)}),tO.addEventListener("change",e=>{let t;let o=e.target,i=o.closest('[data-section="textbox"]').id;o.matches('[data-input="allCaps"]')&&(t="allCaps"),t&&ot(o,i,t)}),tO.addEventListener("click",e=>{let t=e.target;if(t.matches('[data-button="settings"]')){let e=t.closest('[data-section="textbox"]'),o=e?.querySelector('[data-section="settings"]');o&&(o.hidden=!o.hidden)}if(t.matches('[data-button="duplicate-text-box"')){let e=t.closest('[data-section="textbox"]'),o=tC.getById(e.id);tC.create({...o.data})}if(t.matches('[data-button="delete-text-box"]')){let e=t.closest('[data-section="textbox"]').id,o=tC.getById(e);if(o&&o.data.text.trim()){let t=tQ["textbox-id"];t&&(t.value=e,tK.open=!0)}else tC.remove(e)}}),tO.addEventListener("pointerdown",e=>{let t=e.target,o=t.closest('[data-section="textbox"]');o&&t.matches('[data-action="move-text"]')&&(t5=requestAnimationFrame(oi(o.id,t.getAttribute("aria-label"))))}),tO.addEventListener("pointerup",e=>{e.target.matches('[data-action="move-text"]')&&(cancelAnimationFrame&&cancelAnimationFrame(t5),t5=null)}),tO.addEventListener("pointerout",e=>{e.target.matches('[data-action="move-text"]')&&(cancelAnimationFrame&&cancelAnimationFrame(t5),t5=null)}),tO.addEventListener("keydown",e=>{let t=e.target,o=t.closest('[data-section="textbox"]');t.matches('[data-action="move-text"]')&&(" "===e.key||"Enter"===e.key)&&(t5&&cancelAnimationFrame(t5),t5=requestAnimationFrame(oi(o.id,t.getAttribute("aria-label"))))}),tO.addEventListener("keyup",e=>{e.target.matches('[data-action="move-text"]')&&(" "===e.key||"Enter"===e.key)&&(t5&&cancelAnimationFrame(t5),t5=null)}),tR.addEventListener("change",e=>{tJ.forEach(t=>t.hidden=t.id!==e.target.value),tZ.hidden="solidColorForm"===e.target.value}),tW.addEventListener("click",oa),tG.addEventListener("input",e=>{let t=e.target.value.toLowerCase().trim();tW.querySelectorAll("button").forEach(e=>{let o=(e.querySelector("img").getAttribute("alt")||"").toLowerCase();e.hidden=!o.includes(t)}),tX.hidden=!!tW.querySelector("button:not([hidden])")}),tY.addEventListener("input",e=>{e.target===tY.canvasColor&&(t2=e.target.value),tr(t2)&&(tA.setDimensions({width:Number(tY.canvasWidth.value)||800,height:Number(tY.canvasHeight.value)||600}),t7())}),tQ.addEventListener("submit",e=>{e.preventDefault();let t=e.target["textbox-id"].value;t&&(tC.remove(t),tK.open=!1)}),tZ.addEventListener("change",e=>{e.target.matches('[name="maxImageDimensions"]')&&tn.set("maxImageDimensions",e.target.value),!t2||tr(t2)||(t9(t2),tA.draw(t2,tC.getAll()))}),t1.addEventListener("click",e=>{t2&&(e.stopPropagation(),t2=null,tI.classList.remove("dropzone--accepted"),tP.disabled=!0,tB.hidden=!1,t1.hidden=!0,tI.disabled=!1,tA.clear().hide())}),tD.addEventListener("change",e=>{if(null===tz||"function"!=typeof tz.restartVideoStream||tz.hasAttribute("loading"))return;let t=e.target.value||void 0;tz.restartVideoStream(t)}),t$.addEventListener("click",()=>{null===tz||"function"!=typeof tz.capture||tz.hasAttribute("loading")||tz.capture()}),t_.addEventListener("click",e=>{null!==tz&&(tz.torch=!tz.torch,on({el:e.currentTarget,isTorchOn:tz.hasAttribute("torch")}))}),tW.querySelectorAll("button > img")?.forEach(e=>{e.setAttribute("title",e.getAttribute("alt"))}),tC.create(),tI.accept=tt,((e,t)=>{if(!t)return;let o=e.map(e=>e.split("/")[1]),i=`Supported image formats: ${o.join(", ")}`,a=document.createElement("div"),n=document.createElement("small");n.textContent=i,a.appendChild(n),t.appendChild(n)})(tt,tB),tv.forEach(({name:e,path:t,style:o,weight:i})=>{ty(e,t,{style:o,weight:i})}),t8&&(t0.value=t8),t0.disabled=!1}(); +//# sourceMappingURL=index.9a005d69.js.map diff --git a/index.9a005d69.js.map b/index.9a005d69.js.map new file mode 100644 index 0000000..3d802db --- /dev/null +++ b/index.9a005d69.js.map @@ -0,0 +1 @@ +{"mappings":"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","sources":["","src/js/index.js","node_modules/emoji-picker-element/index.js","node_modules/emoji-picker-element/picker.js","node_modules/emoji-picker-element/database.js","node_modules/insert-text-at-cursor/dist/index.esm.js","node_modules/insert-text-at-cursor/index.js","node_modules/@georapbox/capture-photo-element/dist/capture-photo-defined.js","node_modules/@georapbox/capture-photo-element/src/utils/clamp.js","node_modules/@georapbox/capture-photo-element/src/capture-photo.js","node_modules/@georapbox/capture-photo-element/src/capture-photo-defined.js","node_modules/@georapbox/web-share-element/dist/is-web-share-supported.js","node_modules/@georapbox/web-share-element/src/is-web-share-supported.js","node_modules/@georapbox/web-share-element/dist/web-share-defined.js","node_modules/@georapbox/web-share-element/src/web-share.js","node_modules/@georapbox/web-share-element/src/web-share-defined.js","node_modules/@georapbox/modal-element/dist/modal-element-defined.js","node_modules/@georapbox/modal-element/src/modal-element.js","node_modules/@georapbox/modal-element/src/modal-element-defined.js","node_modules/@georapbox/files-dropzone-element/dist/files-dropzone-defined.js","node_modules/@georapbox/files-dropzone-element/src/utils/is-valid-file.js","node_modules/@georapbox/files-dropzone-element/src/utils/files-selector.js","node_modules/@georapbox/files-dropzone-element/src/files-dropzone.js","node_modules/@georapbox/files-dropzone-element/src/files-dropzone-defined.js","src/js/constants.js","src/js/utils/uid.js","src/js/utils/file-from-url.js","src/js/utils/storage.js","src/js/utils/is-solid-color-selected.js","src/js/custom-fonts.js","node_modules/@parcel/runtime-js/lib/runtime-dc4c638fb3cf3900.js","node_modules/@parcel/runtime-js/lib/runtime-f0173e87d28c89f8.js","node_modules/@parcel/runtime-js/lib/runtime-73957b0a5a96c8f8.js","node_modules/@parcel/runtime-js/lib/runtime-2fab85f36645c8e5.js","node_modules/@parcel/runtime-js/lib/runtime-410721d5a743746d.js","node_modules/@parcel/runtime-js/lib/runtime-ef58ed596f597f4b.js","node_modules/@parcel/runtime-js/lib/runtime-06fb3edab3c48625.js","node_modules/@parcel/runtime-js/lib/runtime-caaef9dc1e506632.js","node_modules/@parcel/runtime-js/lib/runtime-3c82f1536232dcbc.js","node_modules/@parcel/runtime-js/lib/runtime-85d0488227eae081.js","node_modules/@parcel/runtime-js/lib/runtime-80e5177a38047bea.js","src/js/toast-alert.js","src/js/textbox.js","src/js/canvas.js"],"sourcesContent":["(function () {\n\nfunction $parcel$interopDefault(a) {\n return a && a.__esModule ? a.default : a;\n}\n\n var $parcel$global =\n typeof globalThis !== 'undefined'\n ? globalThis\n : typeof self !== 'undefined'\n ? self\n : typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : {};\n \nvar $parcel$modules = {};\nvar $parcel$inits = {};\n\nvar parcelRequire = $parcel$global[\"parcelRequire5078\"];\n\nif (parcelRequire == null) {\n parcelRequire = function(id) {\n if (id in $parcel$modules) {\n return $parcel$modules[id].exports;\n }\n if (id in $parcel$inits) {\n var init = $parcel$inits[id];\n delete $parcel$inits[id];\n var module = {id: id, exports: {}};\n $parcel$modules[id] = module;\n init.call(module.exports, module, module.exports);\n return module.exports;\n }\n var err = new Error(\"Cannot find module '\" + id + \"'\");\n err.code = 'MODULE_NOT_FOUND';\n throw err;\n };\n\n parcelRequire.register = function register(id, init) {\n $parcel$inits[id] = init;\n };\n\n $parcel$global[\"parcelRequire5078\"] = parcelRequire;\n}\n\nvar parcelRegister = parcelRequire.register;\nfunction $d1f26ac162b12b4a$var$assertNonEmptyString(str) {\n if (typeof str !== \"string\" || !str) throw new Error(\"expected a non-empty string, got: \" + str);\n}\nfunction $d1f26ac162b12b4a$var$assertNumber(number) {\n if (typeof number !== \"number\") throw new Error(\"expected a number, got: \" + number);\n}\nconst $d1f26ac162b12b4a$var$DB_VERSION_CURRENT = 1;\nconst $d1f26ac162b12b4a$var$DB_VERSION_INITIAL = 1;\nconst $d1f26ac162b12b4a$var$STORE_EMOJI = \"emoji\";\nconst $d1f26ac162b12b4a$var$STORE_KEYVALUE = \"keyvalue\";\nconst $d1f26ac162b12b4a$var$STORE_FAVORITES = \"favorites\";\nconst $d1f26ac162b12b4a$var$FIELD_TOKENS = \"tokens\";\nconst $d1f26ac162b12b4a$var$INDEX_TOKENS = \"tokens\";\nconst $d1f26ac162b12b4a$var$FIELD_UNICODE = \"unicode\";\nconst $d1f26ac162b12b4a$var$INDEX_COUNT = \"count\";\nconst $d1f26ac162b12b4a$var$FIELD_GROUP = \"group\";\nconst $d1f26ac162b12b4a$var$FIELD_ORDER = \"order\";\nconst $d1f26ac162b12b4a$var$INDEX_GROUP_AND_ORDER = \"group-order\";\nconst $d1f26ac162b12b4a$var$KEY_ETAG = \"eTag\";\nconst $d1f26ac162b12b4a$var$KEY_URL = \"url\";\nconst $d1f26ac162b12b4a$var$KEY_PREFERRED_SKINTONE = \"skinTone\";\nconst $d1f26ac162b12b4a$var$MODE_READONLY = \"readonly\";\nconst $d1f26ac162b12b4a$var$MODE_READWRITE = \"readwrite\";\nconst $d1f26ac162b12b4a$var$INDEX_SKIN_UNICODE = \"skinUnicodes\";\nconst $d1f26ac162b12b4a$var$FIELD_SKIN_UNICODE = \"skinUnicodes\";\nconst $d1f26ac162b12b4a$var$DEFAULT_DATA_SOURCE = \"https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json\";\nconst $d1f26ac162b12b4a$var$DEFAULT_LOCALE = \"en\";\n// like lodash's uniqBy but much smaller\nfunction $d1f26ac162b12b4a$var$uniqBy(arr, func) {\n const set = new Set();\n const res = [];\n for (const item of arr){\n const key = func(item);\n if (!set.has(key)) {\n set.add(key);\n res.push(item);\n }\n }\n return res;\n}\nfunction $d1f26ac162b12b4a$var$uniqEmoji(emojis) {\n return $d1f26ac162b12b4a$var$uniqBy(emojis, (_)=>_.unicode);\n}\nfunction $d1f26ac162b12b4a$var$initialMigration(db) {\n function createObjectStore(name, keyPath, indexes) {\n const store = keyPath ? db.createObjectStore(name, {\n keyPath: keyPath\n }) : db.createObjectStore(name);\n if (indexes) for (const [indexName, [keyPath, multiEntry]] of Object.entries(indexes))store.createIndex(indexName, keyPath, {\n multiEntry: multiEntry\n });\n return store;\n }\n createObjectStore($d1f26ac162b12b4a$var$STORE_KEYVALUE);\n createObjectStore($d1f26ac162b12b4a$var$STORE_EMOJI, /* keyPath */ $d1f26ac162b12b4a$var$FIELD_UNICODE, {\n [$d1f26ac162b12b4a$var$INDEX_TOKENS]: [\n $d1f26ac162b12b4a$var$FIELD_TOKENS,\n /* multiEntry */ true\n ],\n [$d1f26ac162b12b4a$var$INDEX_GROUP_AND_ORDER]: [\n [\n $d1f26ac162b12b4a$var$FIELD_GROUP,\n $d1f26ac162b12b4a$var$FIELD_ORDER\n ]\n ],\n [$d1f26ac162b12b4a$var$INDEX_SKIN_UNICODE]: [\n $d1f26ac162b12b4a$var$FIELD_SKIN_UNICODE,\n /* multiEntry */ true\n ]\n });\n createObjectStore($d1f26ac162b12b4a$var$STORE_FAVORITES, undefined, {\n [$d1f26ac162b12b4a$var$INDEX_COUNT]: [\n \"\"\n ]\n });\n}\nconst $d1f26ac162b12b4a$var$openIndexedDBRequests = {};\nconst $d1f26ac162b12b4a$var$databaseCache = {};\nconst $d1f26ac162b12b4a$var$onCloseListeners = {};\nfunction $d1f26ac162b12b4a$var$handleOpenOrDeleteReq(resolve, reject, req) {\n // These things are almost impossible to test with fakeIndexedDB sadly\n /* istanbul ignore next */ req.onerror = ()=>reject(req.error);\n /* istanbul ignore next */ req.onblocked = ()=>reject(new Error(\"IDB blocked\"));\n req.onsuccess = ()=>resolve(req.result);\n}\nasync function $d1f26ac162b12b4a$var$createDatabase(dbName) {\n const db = await new Promise((resolve, reject)=>{\n const req = indexedDB.open(dbName, $d1f26ac162b12b4a$var$DB_VERSION_CURRENT);\n $d1f26ac162b12b4a$var$openIndexedDBRequests[dbName] = req;\n req.onupgradeneeded = (e)=>{\n // Technically there is only one version, so we don't need this `if` check\n // But if an old version of the JS is in another browser tab\n // and it gets upgraded in the future and we have a new DB version, well...\n // better safe than sorry.\n /* istanbul ignore else */ if (e.oldVersion < $d1f26ac162b12b4a$var$DB_VERSION_INITIAL) $d1f26ac162b12b4a$var$initialMigration(req.result);\n };\n $d1f26ac162b12b4a$var$handleOpenOrDeleteReq(resolve, reject, req);\n });\n // Handle abnormal closes, e.g. \"delete database\" in chrome dev tools.\n // No need for removeEventListener, because once the DB can no longer\n // fire \"close\" events, it will auto-GC.\n // Unfortunately cannot test in fakeIndexedDB: https://github.com/dumbmatter/fakeIndexedDB/issues/50\n /* istanbul ignore next */ db.onclose = ()=>$d1f26ac162b12b4a$var$closeDatabase(dbName);\n return db;\n}\nfunction $d1f26ac162b12b4a$var$openDatabase(dbName) {\n if (!$d1f26ac162b12b4a$var$databaseCache[dbName]) $d1f26ac162b12b4a$var$databaseCache[dbName] = $d1f26ac162b12b4a$var$createDatabase(dbName);\n return $d1f26ac162b12b4a$var$databaseCache[dbName];\n}\nfunction $d1f26ac162b12b4a$var$dbPromise(db, storeName, readOnlyOrReadWrite, cb) {\n return new Promise((resolve, reject)=>{\n // Use relaxed durability because neither the emoji data nor the favorites/preferred skin tone\n // are really irreplaceable data. IndexedDB is just a cache in this case.\n const txn = db.transaction(storeName, readOnlyOrReadWrite, {\n durability: \"relaxed\"\n });\n const store = typeof storeName === \"string\" ? txn.objectStore(storeName) : storeName.map((name)=>txn.objectStore(name));\n let res;\n cb(store, txn, (result)=>{\n res = result;\n });\n txn.oncomplete = ()=>resolve(res);\n /* istanbul ignore next */ txn.onerror = ()=>reject(txn.error);\n });\n}\nfunction $d1f26ac162b12b4a$var$closeDatabase(dbName) {\n // close any open requests\n const req = $d1f26ac162b12b4a$var$openIndexedDBRequests[dbName];\n const db = req && req.result;\n if (db) {\n db.close();\n const listeners = $d1f26ac162b12b4a$var$onCloseListeners[dbName];\n /* istanbul ignore else */ if (listeners) for (const listener of listeners)listener();\n }\n delete $d1f26ac162b12b4a$var$openIndexedDBRequests[dbName];\n delete $d1f26ac162b12b4a$var$databaseCache[dbName];\n delete $d1f26ac162b12b4a$var$onCloseListeners[dbName];\n}\nfunction $d1f26ac162b12b4a$var$deleteDatabase(dbName) {\n return new Promise((resolve, reject)=>{\n // close any open requests\n $d1f26ac162b12b4a$var$closeDatabase(dbName);\n const req = indexedDB.deleteDatabase(dbName);\n $d1f26ac162b12b4a$var$handleOpenOrDeleteReq(resolve, reject, req);\n });\n}\n// The \"close\" event occurs during an abnormal shutdown, e.g. a user clearing their browser data.\n// However, it doesn't occur with the normal \"close\" event, so we handle that separately.\n// https://www.w3.org/TR/IndexedDB/#close-a-database-connection\nfunction $d1f26ac162b12b4a$var$addOnCloseListener(dbName, listener) {\n let listeners = $d1f26ac162b12b4a$var$onCloseListeners[dbName];\n if (!listeners) listeners = $d1f26ac162b12b4a$var$onCloseListeners[dbName] = [];\n listeners.push(listener);\n}\n// list of emoticons that don't match a simple \\W+ regex\n// extracted using:\n// require('emoji-picker-element-data/en/emojibase/data.json').map(_ => _.emoticon).filter(Boolean).filter(_ => !/^\\W+$/.test(_))\nconst $d1f26ac162b12b4a$var$irregularEmoticons = new Set([\n \":D\",\n \"XD\",\n \":'D\",\n \"O:)\",\n \":X\",\n \":P\",\n \";P\",\n \"XP\",\n \":L\",\n \":Z\",\n \":j\",\n \"8D\",\n \"XO\",\n \"8)\",\n \":B\",\n \":O\",\n \":S\",\n \":'o\",\n \"Dx\",\n \"X(\",\n \"D:\",\n \":C\",\n \">0)\",\n \":3\",\n \"{\n if (!word.match(/\\w/) || $d1f26ac162b12b4a$var$irregularEmoticons.has(word)) // for pure emoticons like :) or :-), just leave them as-is\n return word.toLowerCase();\n return word.replace(/[)(:,]/g, \"\").replace(/’/g, \"'\").toLowerCase();\n }).filter(Boolean);\n}\nconst $d1f26ac162b12b4a$var$MIN_SEARCH_TEXT_LENGTH = 2;\n// This is an extra step in addition to extractTokens(). The difference here is that we expect\n// the input to have already been run through extractTokens(). This is useful for cases like\n// emoticons, where we don't want to do any tokenization (because it makes no sense to split up\n// \">:)\" by the colon) but we do want to lowercase it to have consistent search results, so that\n// the user can type ':P' or ':p' and still get the same result.\nfunction $d1f26ac162b12b4a$var$normalizeTokens(str) {\n return str.filter(Boolean).map((_)=>_.toLowerCase()).filter((_)=>_.length >= $d1f26ac162b12b4a$var$MIN_SEARCH_TEXT_LENGTH);\n}\n// Transform emoji data for storage in IDB\nfunction $d1f26ac162b12b4a$var$transformEmojiData(emojiData) {\n const res = emojiData.map(({ annotation: annotation, emoticon: emoticon, group: group, order: order, shortcodes: shortcodes, skins: skins, tags: tags, emoji: emoji, version: version })=>{\n const tokens = [\n ...new Set($d1f26ac162b12b4a$var$normalizeTokens([\n ...(shortcodes || []).map($d1f26ac162b12b4a$var$extractTokens).flat(),\n ...(tags || []).map($d1f26ac162b12b4a$var$extractTokens).flat(),\n ...$d1f26ac162b12b4a$var$extractTokens(annotation),\n emoticon\n ]))\n ].sort();\n const res = {\n annotation: annotation,\n group: group,\n order: order,\n tags: tags,\n tokens: tokens,\n unicode: emoji,\n version: version\n };\n if (emoticon) res.emoticon = emoticon;\n if (shortcodes) res.shortcodes = shortcodes;\n if (skins) {\n res.skinTones = [];\n res.skinUnicodes = [];\n res.skinVersions = [];\n for (const { tone: tone, emoji: emoji, version: version } of skins){\n res.skinTones.push(tone);\n res.skinUnicodes.push(emoji);\n res.skinVersions.push(version);\n }\n }\n return res;\n });\n return res;\n}\n// helper functions that help compress the code better\nfunction $d1f26ac162b12b4a$var$callStore(store, method, key, cb) {\n store[method](key).onsuccess = (e)=>cb && cb(e.target.result);\n}\nfunction $d1f26ac162b12b4a$var$getIDB(store, key, cb) {\n $d1f26ac162b12b4a$var$callStore(store, \"get\", key, cb);\n}\nfunction $d1f26ac162b12b4a$var$getAllIDB(store, key, cb) {\n $d1f26ac162b12b4a$var$callStore(store, \"getAll\", key, cb);\n}\nfunction $d1f26ac162b12b4a$var$commit(txn) {\n /* istanbul ignore else */ if (txn.commit) txn.commit();\n}\n// like lodash's minBy\nfunction $d1f26ac162b12b4a$var$minBy(array, func) {\n let minItem = array[0];\n for(let i = 1; i < array.length; i++){\n const item = array[i];\n if (func(minItem) > func(item)) minItem = item;\n }\n return minItem;\n}\n// return an array of results representing all items that are found in each one of the arrays\n//\nfunction $d1f26ac162b12b4a$var$findCommonMembers(arrays, uniqByFunc) {\n const shortestArray = $d1f26ac162b12b4a$var$minBy(arrays, (_)=>_.length);\n const results = [];\n for (const item of shortestArray)// if this item is included in every array in the intermediate results, add it to the final results\n if (!arrays.some((array)=>array.findIndex((_)=>uniqByFunc(_) === uniqByFunc(item)) === -1)) results.push(item);\n return results;\n}\nasync function $d1f26ac162b12b4a$var$isEmpty(db) {\n return !await $d1f26ac162b12b4a$var$get(db, $d1f26ac162b12b4a$var$STORE_KEYVALUE, $d1f26ac162b12b4a$var$KEY_URL);\n}\nasync function $d1f26ac162b12b4a$var$hasData(db, url, eTag) {\n const [oldETag, oldUrl] = await Promise.all([\n $d1f26ac162b12b4a$var$KEY_ETAG,\n $d1f26ac162b12b4a$var$KEY_URL\n ].map((key)=>$d1f26ac162b12b4a$var$get(db, $d1f26ac162b12b4a$var$STORE_KEYVALUE, key)));\n return oldETag === eTag && oldUrl === url;\n}\nasync function $d1f26ac162b12b4a$var$doFullDatabaseScanForSingleResult(db, predicate) {\n // This batching algorithm is just a perf improvement over a basic\n // cursor. The BATCH_SIZE is an estimate of what would give the best\n // perf for doing a full DB scan (worst case).\n //\n // Mini-benchmark for determining the best batch size:\n //\n // PERF=1 pnpm build:rollup && pnpm test:adhoc\n //\n // (async () => {\n // performance.mark('start')\n // await $('emoji-picker').database.getEmojiByShortcode('doesnotexist')\n // performance.measure('total', 'start')\n // console.log(performance.getEntriesByName('total').slice(-1)[0].duration)\n // })()\n const BATCH_SIZE = 50; // Typically around 150ms for 6x slowdown in Chrome for above benchmark\n return $d1f26ac162b12b4a$var$dbPromise(db, $d1f26ac162b12b4a$var$STORE_EMOJI, $d1f26ac162b12b4a$var$MODE_READONLY, (emojiStore, txn, cb)=>{\n let lastKey;\n const processNextBatch = ()=>{\n emojiStore.getAll(lastKey && IDBKeyRange.lowerBound(lastKey, true), BATCH_SIZE).onsuccess = (e)=>{\n const results = e.target.result;\n for (const result of results){\n lastKey = result.unicode;\n if (predicate(result)) return cb(result);\n }\n if (results.length < BATCH_SIZE) return cb();\n processNextBatch();\n };\n };\n processNextBatch();\n });\n}\nasync function $d1f26ac162b12b4a$var$loadData(db, emojiData, url, eTag) {\n {\n const transformedData = $d1f26ac162b12b4a$var$transformEmojiData(emojiData);\n await $d1f26ac162b12b4a$var$dbPromise(db, [\n $d1f26ac162b12b4a$var$STORE_EMOJI,\n $d1f26ac162b12b4a$var$STORE_KEYVALUE\n ], $d1f26ac162b12b4a$var$MODE_READWRITE, ([emojiStore, metaStore], txn)=>{\n let oldETag;\n let oldUrl;\n let todo = 0;\n function checkFetched() {\n if (++todo === 2) onFetched();\n }\n function onFetched() {\n if (oldETag === eTag && oldUrl === url) // check again within the transaction to guard against concurrency, e.g. multiple browser tabs\n return;\n // delete old data\n emojiStore.clear();\n // insert new data\n for (const data of transformedData)emojiStore.put(data);\n metaStore.put(eTag, $d1f26ac162b12b4a$var$KEY_ETAG);\n metaStore.put(url, $d1f26ac162b12b4a$var$KEY_URL);\n $d1f26ac162b12b4a$var$commit(txn);\n }\n $d1f26ac162b12b4a$var$getIDB(metaStore, $d1f26ac162b12b4a$var$KEY_ETAG, (result)=>{\n oldETag = result;\n checkFetched();\n });\n $d1f26ac162b12b4a$var$getIDB(metaStore, $d1f26ac162b12b4a$var$KEY_URL, (result)=>{\n oldUrl = result;\n checkFetched();\n });\n });\n }\n}\nasync function $d1f26ac162b12b4a$var$getEmojiByGroup(db, group) {\n return $d1f26ac162b12b4a$var$dbPromise(db, $d1f26ac162b12b4a$var$STORE_EMOJI, $d1f26ac162b12b4a$var$MODE_READONLY, (emojiStore, txn, cb)=>{\n const range = IDBKeyRange.bound([\n group,\n 0\n ], [\n group + 1,\n 0\n ], false, true);\n $d1f26ac162b12b4a$var$getAllIDB(emojiStore.index($d1f26ac162b12b4a$var$INDEX_GROUP_AND_ORDER), range, cb);\n });\n}\nasync function $d1f26ac162b12b4a$var$getEmojiBySearchQuery(db, query) {\n const tokens = $d1f26ac162b12b4a$var$normalizeTokens($d1f26ac162b12b4a$var$extractTokens(query));\n if (!tokens.length) return [];\n return $d1f26ac162b12b4a$var$dbPromise(db, $d1f26ac162b12b4a$var$STORE_EMOJI, $d1f26ac162b12b4a$var$MODE_READONLY, (emojiStore, txn, cb)=>{\n // get all results that contain all tokens (i.e. an AND query)\n const intermediateResults = [];\n const checkDone = ()=>{\n if (intermediateResults.length === tokens.length) onDone();\n };\n const onDone = ()=>{\n const results = $d1f26ac162b12b4a$var$findCommonMembers(intermediateResults, (_)=>_.unicode);\n cb(results.sort((a, b)=>a.order < b.order ? -1 : 1));\n };\n for(let i = 0; i < tokens.length; i++){\n const token = tokens[i];\n const range = i === tokens.length - 1 ? IDBKeyRange.bound(token, token + \"\\uFFFF\", false, true) // treat last token as a prefix search\n : IDBKeyRange.only(token); // treat all other tokens as an exact match\n $d1f26ac162b12b4a$var$getAllIDB(emojiStore.index($d1f26ac162b12b4a$var$INDEX_TOKENS), range, (result)=>{\n intermediateResults.push(result);\n checkDone();\n });\n }\n });\n}\n// This could have been implemented as an IDB index on shortcodes, but it seemed wasteful to do that\n// when we can already query by tokens and this will give us what we're looking for 99.9% of the time\nasync function $d1f26ac162b12b4a$var$getEmojiByShortcode(db, shortcode) {\n const emojis = await $d1f26ac162b12b4a$var$getEmojiBySearchQuery(db, shortcode);\n // In very rare cases (e.g. the shortcode \"v\" as in \"v for victory\"), we cannot search because\n // there are no usable tokens (too short in this case). In that case, we have to do an inefficient\n // full-database scan, which I believe is an acceptable tradeoff for not having to have an extra\n // index on shortcodes.\n if (!emojis.length) {\n const predicate = (_)=>(_.shortcodes || []).includes(shortcode.toLowerCase());\n return await $d1f26ac162b12b4a$var$doFullDatabaseScanForSingleResult(db, predicate) || null;\n }\n return emojis.filter((_)=>{\n const lowerShortcodes = (_.shortcodes || []).map((_)=>_.toLowerCase());\n return lowerShortcodes.includes(shortcode.toLowerCase());\n })[0] || null;\n}\nasync function $d1f26ac162b12b4a$var$getEmojiByUnicode(db, unicode) {\n return $d1f26ac162b12b4a$var$dbPromise(db, $d1f26ac162b12b4a$var$STORE_EMOJI, $d1f26ac162b12b4a$var$MODE_READONLY, (emojiStore, txn, cb)=>$d1f26ac162b12b4a$var$getIDB(emojiStore, unicode, (result)=>{\n if (result) return cb(result);\n $d1f26ac162b12b4a$var$getIDB(emojiStore.index($d1f26ac162b12b4a$var$INDEX_SKIN_UNICODE), unicode, (result)=>cb(result || null));\n }));\n}\nfunction $d1f26ac162b12b4a$var$get(db, storeName, key) {\n return $d1f26ac162b12b4a$var$dbPromise(db, storeName, $d1f26ac162b12b4a$var$MODE_READONLY, (store, txn, cb)=>$d1f26ac162b12b4a$var$getIDB(store, key, cb));\n}\nfunction $d1f26ac162b12b4a$var$set(db, storeName, key, value) {\n return $d1f26ac162b12b4a$var$dbPromise(db, storeName, $d1f26ac162b12b4a$var$MODE_READWRITE, (store, txn)=>{\n store.put(value, key);\n $d1f26ac162b12b4a$var$commit(txn);\n });\n}\nfunction $d1f26ac162b12b4a$var$incrementFavoriteEmojiCount(db, unicode) {\n return $d1f26ac162b12b4a$var$dbPromise(db, $d1f26ac162b12b4a$var$STORE_FAVORITES, $d1f26ac162b12b4a$var$MODE_READWRITE, (store, txn)=>$d1f26ac162b12b4a$var$getIDB(store, unicode, (result)=>{\n store.put((result || 0) + 1, unicode);\n $d1f26ac162b12b4a$var$commit(txn);\n }));\n}\nfunction $d1f26ac162b12b4a$var$getTopFavoriteEmoji(db, customEmojiIndex, limit) {\n if (limit === 0) return [];\n return $d1f26ac162b12b4a$var$dbPromise(db, [\n $d1f26ac162b12b4a$var$STORE_FAVORITES,\n $d1f26ac162b12b4a$var$STORE_EMOJI\n ], $d1f26ac162b12b4a$var$MODE_READONLY, ([favoritesStore, emojiStore], txn, cb)=>{\n const results = [];\n favoritesStore.index($d1f26ac162b12b4a$var$INDEX_COUNT).openCursor(undefined, \"prev\").onsuccess = (e)=>{\n const cursor = e.target.result;\n if (!cursor) return cb(results);\n function addResult(result) {\n results.push(result);\n if (results.length === limit) return cb(results) // done, reached the limit\n ;\n cursor.continue();\n }\n const unicodeOrName = cursor.primaryKey;\n const custom = customEmojiIndex.byName(unicodeOrName);\n if (custom) return addResult(custom);\n // This could be done in parallel (i.e. make the cursor and the get()s parallelized),\n // but my testing suggests it's not actually faster.\n $d1f26ac162b12b4a$var$getIDB(emojiStore, unicodeOrName, (emoji)=>{\n if (emoji) return addResult(emoji);\n // emoji not found somehow, ignore (may happen if custom emoji change)\n cursor.continue();\n });\n };\n });\n}\n// trie data structure for prefix searches\n// loosely based on https://github.com/nolanlawson/substring-trie\nconst $d1f26ac162b12b4a$var$CODA_MARKER = \"\"; // marks the end of the string\nfunction $d1f26ac162b12b4a$var$trie(arr, itemToTokens) {\n const map = new Map();\n for (const item of arr){\n const tokens = itemToTokens(item);\n for (const token of tokens){\n let currentMap = map;\n for(let i = 0; i < token.length; i++){\n const char = token.charAt(i);\n let nextMap = currentMap.get(char);\n if (!nextMap) {\n nextMap = new Map();\n currentMap.set(char, nextMap);\n }\n currentMap = nextMap;\n }\n let valuesAtCoda = currentMap.get($d1f26ac162b12b4a$var$CODA_MARKER);\n if (!valuesAtCoda) {\n valuesAtCoda = [];\n currentMap.set($d1f26ac162b12b4a$var$CODA_MARKER, valuesAtCoda);\n }\n valuesAtCoda.push(item);\n }\n }\n const search = (query, exact)=>{\n let currentMap = map;\n for(let i = 0; i < query.length; i++){\n const char = query.charAt(i);\n const nextMap = currentMap.get(char);\n if (nextMap) currentMap = nextMap;\n else return [];\n }\n if (exact) {\n const results = currentMap.get($d1f26ac162b12b4a$var$CODA_MARKER);\n return results || [];\n }\n const results = [];\n // traverse\n const queue = [\n currentMap\n ];\n while(queue.length){\n const currentMap = queue.shift();\n const entriesSortedByKey = [\n ...currentMap.entries()\n ].sort((a, b)=>a[0] < b[0] ? -1 : 1);\n for (const [key, value] of entriesSortedByKey)if (key === $d1f26ac162b12b4a$var$CODA_MARKER) results.push(...value);\n else queue.push(value);\n }\n return results;\n };\n return search;\n}\nconst $d1f26ac162b12b4a$var$requiredKeys$1 = [\n \"name\",\n \"url\"\n];\nfunction $d1f26ac162b12b4a$var$assertCustomEmojis(customEmojis) {\n const isArray = customEmojis && Array.isArray(customEmojis);\n const firstItemIsFaulty = isArray && customEmojis.length && (!customEmojis[0] || $d1f26ac162b12b4a$var$requiredKeys$1.some((key)=>!(key in customEmojis[0])));\n if (!isArray || firstItemIsFaulty) throw new Error(\"Custom emojis are in the wrong format\");\n}\nfunction $d1f26ac162b12b4a$var$customEmojiIndex(customEmojis) {\n $d1f26ac162b12b4a$var$assertCustomEmojis(customEmojis);\n const sortByName = (a, b)=>a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1;\n //\n // all()\n //\n const all = customEmojis.sort(sortByName);\n //\n // search()\n //\n const emojiToTokens = (emoji)=>{\n const set = new Set();\n if (emoji.shortcodes) {\n for (const shortcode of emoji.shortcodes)for (const token of $d1f26ac162b12b4a$var$extractTokens(shortcode))set.add(token);\n }\n return set;\n };\n const searchTrie = $d1f26ac162b12b4a$var$trie(customEmojis, emojiToTokens);\n const searchByExactMatch = (_)=>searchTrie(_, true);\n const searchByPrefix = (_)=>searchTrie(_, false);\n // Search by query for custom emoji. Similar to how we do this in IDB, the last token\n // is treated as a prefix search, but every other one is treated as an exact match.\n // Then we AND the results together\n const search = (query)=>{\n const tokens = $d1f26ac162b12b4a$var$extractTokens(query);\n const intermediateResults = tokens.map((token, i)=>(i < tokens.length - 1 ? searchByExactMatch : searchByPrefix)(token));\n return $d1f26ac162b12b4a$var$findCommonMembers(intermediateResults, (_)=>_.name).sort(sortByName);\n };\n //\n // byShortcode, byName\n //\n const shortcodeToEmoji = new Map();\n const nameToEmoji = new Map();\n for (const customEmoji of customEmojis){\n nameToEmoji.set(customEmoji.name.toLowerCase(), customEmoji);\n for (const shortcode of customEmoji.shortcodes || [])shortcodeToEmoji.set(shortcode.toLowerCase(), customEmoji);\n }\n const byShortcode = (shortcode)=>shortcodeToEmoji.get(shortcode.toLowerCase());\n const byName = (name)=>nameToEmoji.get(name.toLowerCase());\n return {\n all: all,\n search: search,\n byShortcode: byShortcode,\n byName: byName\n };\n}\nconst $d1f26ac162b12b4a$var$isFirefoxContentScript = typeof wrappedJSObject !== \"undefined\";\n// remove some internal implementation details, i.e. the \"tokens\" array on the emoji object\n// essentially, convert the emoji from the version stored in IDB to the version used in-memory\nfunction $d1f26ac162b12b4a$var$cleanEmoji(emoji) {\n if (!emoji) return emoji;\n // if inside a Firefox content script, need to clone the emoji object to prevent Firefox from complaining about\n // cross-origin object. See: https://github.com/nolanlawson/emoji-picker-element/issues/356\n /* istanbul ignore if */ if ($d1f26ac162b12b4a$var$isFirefoxContentScript) emoji = structuredClone(emoji);\n delete emoji.tokens;\n if (emoji.skinTones) {\n const len = emoji.skinTones.length;\n emoji.skins = Array(len);\n for(let i = 0; i < len; i++)emoji.skins[i] = {\n tone: emoji.skinTones[i],\n unicode: emoji.skinUnicodes[i],\n version: emoji.skinVersions[i]\n };\n delete emoji.skinTones;\n delete emoji.skinUnicodes;\n delete emoji.skinVersions;\n }\n return emoji;\n}\nfunction $d1f26ac162b12b4a$var$warnETag(eTag) {\n if (!eTag) console.warn(\"emoji-picker-element is more efficient if the dataSource server exposes an ETag header.\");\n}\nconst $d1f26ac162b12b4a$var$requiredKeys = [\n \"annotation\",\n \"emoji\",\n \"group\",\n \"order\",\n \"version\"\n];\nfunction $d1f26ac162b12b4a$var$assertEmojiData(emojiData) {\n if (!emojiData || !Array.isArray(emojiData) || !emojiData[0] || typeof emojiData[0] !== \"object\" || $d1f26ac162b12b4a$var$requiredKeys.some((key)=>!(key in emojiData[0]))) throw new Error(\"Emoji data is in the wrong format\");\n}\nfunction $d1f26ac162b12b4a$var$assertStatus(response, dataSource) {\n if (Math.floor(response.status / 100) !== 2) throw new Error(\"Failed to fetch: \" + dataSource + \": \" + response.status);\n}\nasync function $d1f26ac162b12b4a$var$getETag(dataSource) {\n const response = await fetch(dataSource, {\n method: \"HEAD\"\n });\n $d1f26ac162b12b4a$var$assertStatus(response, dataSource);\n const eTag = response.headers.get(\"etag\");\n $d1f26ac162b12b4a$var$warnETag(eTag);\n return eTag;\n}\nasync function $d1f26ac162b12b4a$var$getETagAndData(dataSource) {\n const response = await fetch(dataSource);\n $d1f26ac162b12b4a$var$assertStatus(response, dataSource);\n const eTag = response.headers.get(\"etag\");\n $d1f26ac162b12b4a$var$warnETag(eTag);\n const emojiData = await response.json();\n $d1f26ac162b12b4a$var$assertEmojiData(emojiData);\n return [\n eTag,\n emojiData\n ];\n}\n// TODO: including these in blob-util.ts causes typedoc to generate docs for them,\n// even with --excludePrivate ¯\\_(ツ)_/¯\n/** @private */ /**\n * Convert an `ArrayBuffer` to a binary string.\n *\n * Example:\n *\n * ```js\n * var myString = blobUtil.arrayBufferToBinaryString(arrayBuff)\n * ```\n *\n * @param buffer - array buffer\n * @returns binary string\n */ function $d1f26ac162b12b4a$var$arrayBufferToBinaryString(buffer) {\n var binary = \"\";\n var bytes = new Uint8Array(buffer);\n var length = bytes.byteLength;\n var i = -1;\n while(++i < length)binary += String.fromCharCode(bytes[i]);\n return binary;\n}\n/**\n * Convert a binary string to an `ArrayBuffer`.\n *\n * ```js\n * var myBuffer = blobUtil.binaryStringToArrayBuffer(binaryString)\n * ```\n *\n * @param binary - binary string\n * @returns array buffer\n */ function $d1f26ac162b12b4a$var$binaryStringToArrayBuffer(binary) {\n var length = binary.length;\n var buf = new ArrayBuffer(length);\n var arr = new Uint8Array(buf);\n var i = -1;\n while(++i < length)arr[i] = binary.charCodeAt(i);\n return buf;\n}\n// generate a checksum based on the stringified JSON\nasync function $d1f26ac162b12b4a$var$jsonChecksum(object) {\n const inString = JSON.stringify(object);\n let inBuffer = $d1f26ac162b12b4a$var$binaryStringToArrayBuffer(inString);\n // this does not need to be cryptographically secure, SHA-1 is fine\n const outBuffer = await crypto.subtle.digest(\"SHA-1\", inBuffer);\n const outBinString = $d1f26ac162b12b4a$var$arrayBufferToBinaryString(outBuffer);\n const res = btoa(outBinString);\n return res;\n}\nasync function $d1f26ac162b12b4a$var$checkForUpdates(db, dataSource) {\n // just do a simple HEAD request first to see if the eTags match\n let emojiData;\n let eTag = await $d1f26ac162b12b4a$var$getETag(dataSource);\n if (!eTag) {\n const eTagAndData = await $d1f26ac162b12b4a$var$getETagAndData(dataSource);\n eTag = eTagAndData[0];\n emojiData = eTagAndData[1];\n if (!eTag) eTag = await $d1f26ac162b12b4a$var$jsonChecksum(emojiData);\n }\n if (await $d1f26ac162b12b4a$var$hasData(db, dataSource, eTag)) ;\n else {\n if (!emojiData) {\n const eTagAndData = await $d1f26ac162b12b4a$var$getETagAndData(dataSource);\n emojiData = eTagAndData[1];\n }\n await $d1f26ac162b12b4a$var$loadData(db, emojiData, dataSource, eTag);\n }\n}\nasync function $d1f26ac162b12b4a$var$loadDataForFirstTime(db, dataSource) {\n let [eTag, emojiData] = await $d1f26ac162b12b4a$var$getETagAndData(dataSource);\n if (!eTag) // Handle lack of support for ETag or Access-Control-Expose-Headers\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers#Browser_compatibility\n eTag = await $d1f26ac162b12b4a$var$jsonChecksum(emojiData);\n await $d1f26ac162b12b4a$var$loadData(db, emojiData, dataSource, eTag);\n}\nclass $d1f26ac162b12b4a$export$2e2bcd8739ae039 {\n constructor({ dataSource: dataSource = $d1f26ac162b12b4a$var$DEFAULT_DATA_SOURCE, locale: locale = $d1f26ac162b12b4a$var$DEFAULT_LOCALE, customEmoji: customEmoji = [] } = {}){\n this.dataSource = dataSource;\n this.locale = locale;\n this._dbName = `emoji-picker-element-${this.locale}`;\n this._db = undefined;\n this._lazyUpdate = undefined;\n this._custom = $d1f26ac162b12b4a$var$customEmojiIndex(customEmoji);\n this._clear = this._clear.bind(this);\n this._ready = this._init();\n }\n async _init() {\n const db = this._db = await $d1f26ac162b12b4a$var$openDatabase(this._dbName);\n $d1f26ac162b12b4a$var$addOnCloseListener(this._dbName, this._clear);\n const dataSource = this.dataSource;\n const empty = await $d1f26ac162b12b4a$var$isEmpty(db);\n if (empty) await $d1f26ac162b12b4a$var$loadDataForFirstTime(db, dataSource);\n else this._lazyUpdate = $d1f26ac162b12b4a$var$checkForUpdates(db, dataSource);\n }\n async ready() {\n const checkReady = async ()=>{\n if (!this._ready) this._ready = this._init();\n return this._ready;\n };\n await checkReady();\n // There's a possibility of a race condition where the element gets added, removed, and then added again\n // with a particular timing, which would set the _db to undefined.\n // We *could* do a while loop here, but that seems excessive and could lead to an infinite loop.\n if (!this._db) await checkReady();\n }\n async getEmojiByGroup(group) {\n $d1f26ac162b12b4a$var$assertNumber(group);\n await this.ready();\n return $d1f26ac162b12b4a$var$uniqEmoji(await $d1f26ac162b12b4a$var$getEmojiByGroup(this._db, group)).map($d1f26ac162b12b4a$var$cleanEmoji);\n }\n async getEmojiBySearchQuery(query) {\n $d1f26ac162b12b4a$var$assertNonEmptyString(query);\n await this.ready();\n const customs = this._custom.search(query);\n const natives = $d1f26ac162b12b4a$var$uniqEmoji(await $d1f26ac162b12b4a$var$getEmojiBySearchQuery(this._db, query)).map($d1f26ac162b12b4a$var$cleanEmoji);\n return [\n ...customs,\n ...natives\n ];\n }\n async getEmojiByShortcode(shortcode) {\n $d1f26ac162b12b4a$var$assertNonEmptyString(shortcode);\n await this.ready();\n const custom = this._custom.byShortcode(shortcode);\n if (custom) return custom;\n return $d1f26ac162b12b4a$var$cleanEmoji(await $d1f26ac162b12b4a$var$getEmojiByShortcode(this._db, shortcode));\n }\n async getEmojiByUnicodeOrName(unicodeOrName) {\n $d1f26ac162b12b4a$var$assertNonEmptyString(unicodeOrName);\n await this.ready();\n const custom = this._custom.byName(unicodeOrName);\n if (custom) return custom;\n return $d1f26ac162b12b4a$var$cleanEmoji(await $d1f26ac162b12b4a$var$getEmojiByUnicode(this._db, unicodeOrName));\n }\n async getPreferredSkinTone() {\n await this.ready();\n return await $d1f26ac162b12b4a$var$get(this._db, $d1f26ac162b12b4a$var$STORE_KEYVALUE, $d1f26ac162b12b4a$var$KEY_PREFERRED_SKINTONE) || 0;\n }\n async setPreferredSkinTone(skinTone) {\n $d1f26ac162b12b4a$var$assertNumber(skinTone);\n await this.ready();\n return $d1f26ac162b12b4a$var$set(this._db, $d1f26ac162b12b4a$var$STORE_KEYVALUE, $d1f26ac162b12b4a$var$KEY_PREFERRED_SKINTONE, skinTone);\n }\n async incrementFavoriteEmojiCount(unicodeOrName) {\n $d1f26ac162b12b4a$var$assertNonEmptyString(unicodeOrName);\n await this.ready();\n return $d1f26ac162b12b4a$var$incrementFavoriteEmojiCount(this._db, unicodeOrName);\n }\n async getTopFavoriteEmoji(limit) {\n $d1f26ac162b12b4a$var$assertNumber(limit);\n await this.ready();\n return (await $d1f26ac162b12b4a$var$getTopFavoriteEmoji(this._db, this._custom, limit)).map($d1f26ac162b12b4a$var$cleanEmoji);\n }\n set customEmoji(customEmojis) {\n this._custom = $d1f26ac162b12b4a$var$customEmojiIndex(customEmojis);\n }\n get customEmoji() {\n return this._custom.all;\n }\n async _shutdown() {\n await this.ready(); // reopen if we've already been closed/deleted\n try {\n await this._lazyUpdate; // allow any lazy updates to process before closing/deleting\n } catch (err) {}\n }\n // clear references to IDB, e.g. during a close event\n _clear() {\n // We don't need to call removeEventListener or remove the manual \"close\" listeners.\n // The memory leak tests prove this is unnecessary. It's because:\n // 1) IDBDatabases that can no longer fire \"close\" automatically have listeners GCed\n // 2) we clear the manual close listeners in databaseLifecycle.js.\n this._db = this._ready = this._lazyUpdate = undefined;\n }\n async close() {\n await this._shutdown();\n await $d1f26ac162b12b4a$var$closeDatabase(this._dbName);\n }\n async delete() {\n await this._shutdown();\n await $d1f26ac162b12b4a$var$deleteDatabase(this._dbName);\n }\n}\n\n\n// via https://unpkg.com/browse/emojibase-data@6.0.0/meta/groups.json\nconst $1e5dc5e467331cb9$var$allGroups = [\n [\n -1,\n \"\\u2728\",\n \"custom\"\n ],\n [\n 0,\n \"\\uD83D\\uDE00\",\n \"smileys-emotion\"\n ],\n [\n 1,\n \"\\uD83D\\uDC4B\",\n \"people-body\"\n ],\n [\n 3,\n \"\\uD83D\\uDC31\",\n \"animals-nature\"\n ],\n [\n 4,\n \"\\uD83C\\uDF4E\",\n \"food-drink\"\n ],\n [\n 5,\n \"\\uD83C\\uDFE0\\uFE0F\",\n \"travel-places\"\n ],\n [\n 6,\n \"\\u26BD\",\n \"activities\"\n ],\n [\n 7,\n \"\\uD83D\\uDCDD\",\n \"objects\"\n ],\n [\n 8,\n \"\\u26D4\\uFE0F\",\n \"symbols\"\n ],\n [\n 9,\n \"\\uD83C\\uDFC1\",\n \"flags\"\n ]\n].map(([id, emoji, name])=>({\n id: id,\n emoji: emoji,\n name: name\n }));\nconst $1e5dc5e467331cb9$var$groups = $1e5dc5e467331cb9$var$allGroups.slice(1);\nconst $1e5dc5e467331cb9$var$MIN_SEARCH_TEXT_LENGTH = 2;\nconst $1e5dc5e467331cb9$var$NUM_SKIN_TONES = 6;\n/* istanbul ignore next */ const $1e5dc5e467331cb9$var$rIC = typeof requestIdleCallback === \"function\" ? requestIdleCallback : setTimeout;\n// check for ZWJ (zero width joiner) character\nfunction $1e5dc5e467331cb9$var$hasZwj(emoji) {\n return emoji.unicode.includes(\"\\u200D\");\n}\n// Find one good representative emoji from each version to test by checking its color.\n// Ideally it should have color in the center. For some inspiration, see:\n// https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/\n//\n// Note that for certain versions (12.1, 13.1), there is no point in testing them explicitly, because\n// all the emoji from this version are compound-emoji from previous versions. So they would pass a color\n// test, even in browsers that display them as double emoji. (E.g. \"face in clouds\" might render as\n// \"face without mouth\" plus \"fog\".) These emoji can only be filtered using the width test,\n// which happens in checkZwjSupport.js.\nconst $1e5dc5e467331cb9$var$versionsAndTestEmoji = {\n \"\\uD83E\\uDEE8\": 15.1,\n \"\\uD83E\\uDEE0\": 14,\n \"\\uD83E\\uDD72\": 13.1,\n \"\\uD83E\\uDD7B\": 12.1,\n \"\\uD83E\\uDD70\": 11,\n \"\\uD83E\\uDD29\": 5,\n \"\\uD83D\\uDC71\\u200D\\u2640\\uFE0F\": 4,\n \"\\uD83E\\uDD23\": 3,\n \"\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8\\uFE0F\": 2,\n \"\\uD83D\\uDE00\": 1,\n \"\\uD83D\\uDE10\\uFE0F\": 0.7,\n \"\\uD83D\\uDE03\": 0.6\n};\nconst $1e5dc5e467331cb9$var$TIMEOUT_BEFORE_LOADING_MESSAGE = 1000; // 1 second\nconst $1e5dc5e467331cb9$var$DEFAULT_SKIN_TONE_EMOJI = \"\\uD83D\\uDD90\\uFE0F\";\nconst $1e5dc5e467331cb9$var$DEFAULT_NUM_COLUMNS = 8;\n// Based on https://fivethirtyeight.com/features/the-100-most-used-emojis/ and\n// https://blog.emojipedia.org/facebook-reveals-most-and-least-used-emojis/ with\n// a bit of my own curation. (E.g. avoid the \"OK\" gesture because of connotations:\n// https://emojipedia.org/ok-hand/)\nconst $1e5dc5e467331cb9$var$MOST_COMMONLY_USED_EMOJI = [\n \"\\uD83D\\uDE0A\",\n \"\\uD83D\\uDE12\",\n \"\\u2764\\uFE0F\",\n \"\\uD83D\\uDC4D\\uFE0F\",\n \"\\uD83D\\uDE0D\",\n \"\\uD83D\\uDE02\",\n \"\\uD83D\\uDE2D\",\n \"\\u263A\\uFE0F\",\n \"\\uD83D\\uDE14\",\n \"\\uD83D\\uDE29\",\n \"\\uD83D\\uDE0F\",\n \"\\uD83D\\uDC95\",\n \"\\uD83D\\uDE4C\",\n \"\\uD83D\\uDE18\"\n];\n// It's important to list Twemoji Mozilla before everything else, because Mozilla bundles their\n// own font on some platforms (notably Windows and Linux as of this writing). Typically, Mozilla\n// updates faster than the underlying OS, and we don't want to render older emoji in one font and\n// newer emoji in another font:\n// https://github.com/nolanlawson/emoji-picker-element/pull/268#issuecomment-1073347283\nconst $1e5dc5e467331cb9$var$FONT_FAMILY = '\"Twemoji Mozilla\",\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\",\"EmojiOne Color\",\"Android Emoji\",sans-serif';\n/* istanbul ignore next */ const $1e5dc5e467331cb9$var$DEFAULT_CATEGORY_SORTING = (a, b)=>a < b ? -1 : a > b ? 1 : 0;\n// Test if an emoji is supported by rendering it to canvas and checking that the color is not black\n// See https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/\n// and https://www.npmjs.com/package/if-emoji for inspiration\n// This implementation is largely borrowed from if-emoji, adding the font-family\nconst $1e5dc5e467331cb9$var$getTextFeature = (text, color)=>{\n const canvas = document.createElement(\"canvas\");\n canvas.width = canvas.height = 1;\n const ctx = canvas.getContext(\"2d\", {\n // Improves the performance of `getImageData()`\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/getContextAttributes#willreadfrequently\n willReadFrequently: true\n });\n ctx.textBaseline = \"top\";\n ctx.font = `100px ${$1e5dc5e467331cb9$var$FONT_FAMILY}`;\n ctx.fillStyle = color;\n ctx.scale(0.01, 0.01);\n ctx.fillText(text, 0, 0);\n return ctx.getImageData(0, 0, 1, 1).data;\n};\nconst $1e5dc5e467331cb9$var$compareFeatures = (feature1, feature2)=>{\n const feature1Str = [\n ...feature1\n ].join(\",\");\n const feature2Str = [\n ...feature2\n ].join(\",\");\n // This is RGBA, so for 0,0,0, we are checking that the first RGB is not all zeroes.\n // Most of the time when unsupported this is 0,0,0,0, but on Chrome on Mac it is\n // 0,0,0,61 - there is a transparency here.\n return feature1Str === feature2Str && !feature1Str.startsWith(\"0,0,0,\");\n};\nfunction $1e5dc5e467331cb9$var$testColorEmojiSupported(text) {\n // Render white and black and then compare them to each other and ensure they're the same\n // color, and neither one is black. This shows that the emoji was rendered in color.\n const feature1 = $1e5dc5e467331cb9$var$getTextFeature(text, \"#000\");\n const feature2 = $1e5dc5e467331cb9$var$getTextFeature(text, \"#fff\");\n return feature1 && feature2 && $1e5dc5e467331cb9$var$compareFeatures(feature1, feature2);\n}\n// rather than check every emoji ever, which would be expensive, just check some representatives from the\n// different emoji releases to determine what the font supports\nfunction $1e5dc5e467331cb9$var$determineEmojiSupportLevel() {\n const entries = Object.entries($1e5dc5e467331cb9$var$versionsAndTestEmoji);\n try {\n // start with latest emoji and work backwards\n for (const [emoji, version] of entries){\n if ($1e5dc5e467331cb9$var$testColorEmojiSupported(emoji)) return version;\n }\n } catch (e) {} finally{}\n // In case of an error, be generous and just assume all emoji are supported (e.g. for canvas errors\n // due to anti-fingerprinting add-ons). Better to show some gray boxes than nothing at all.\n return entries[0][1] // first one in the list is the most recent version\n ;\n}\n// Check which emojis we know for sure aren't supported, based on Unicode version level\nlet $1e5dc5e467331cb9$var$promise;\nconst $1e5dc5e467331cb9$var$detectEmojiSupportLevel = ()=>{\n if (!$1e5dc5e467331cb9$var$promise) // Delay so it can run while the IDB database is being created by the browser (on another thread).\n // This helps especially with first load – we want to start pre-populating the database on the main thread,\n // and then wait for IDB to commit everything, and while waiting we run this check.\n $1e5dc5e467331cb9$var$promise = new Promise((resolve)=>$1e5dc5e467331cb9$var$rIC(()=>resolve($1e5dc5e467331cb9$var$determineEmojiSupportLevel()) // delay so ideally this can run while IDB is first populating\n ));\n return $1e5dc5e467331cb9$var$promise;\n};\n// determine which emojis containing ZWJ (zero width joiner) characters\n// are supported (rendered as one glyph) rather than unsupported (rendered as two or more glyphs)\nconst $1e5dc5e467331cb9$var$supportedZwjEmojis = new Map();\nconst $1e5dc5e467331cb9$var$VARIATION_SELECTOR = \"\\uFE0F\";\nconst $1e5dc5e467331cb9$var$SKINTONE_MODIFIER = \"\\ud83c\";\nconst $1e5dc5e467331cb9$var$ZWJ = \"\\u200D\";\nconst $1e5dc5e467331cb9$var$LIGHT_SKIN_TONE = 0x1F3FB;\nconst $1e5dc5e467331cb9$var$LIGHT_SKIN_TONE_MODIFIER = 0xdffb;\n// TODO: this is a naive implementation, we can improve it later\n// It's only used for the skintone picker, so as long as people don't customize with\n// really exotic emoji then it should work fine\nfunction $1e5dc5e467331cb9$var$applySkinTone(str, skinTone) {\n if (skinTone === 0) return str;\n const zwjIndex = str.indexOf($1e5dc5e467331cb9$var$ZWJ);\n if (zwjIndex !== -1) return str.substring(0, zwjIndex) + String.fromCodePoint($1e5dc5e467331cb9$var$LIGHT_SKIN_TONE + skinTone - 1) + str.substring(zwjIndex);\n if (str.endsWith($1e5dc5e467331cb9$var$VARIATION_SELECTOR)) str = str.substring(0, str.length - 1);\n return str + $1e5dc5e467331cb9$var$SKINTONE_MODIFIER + String.fromCodePoint($1e5dc5e467331cb9$var$LIGHT_SKIN_TONE_MODIFIER + skinTone - 1);\n}\nfunction $1e5dc5e467331cb9$var$halt(event) {\n event.preventDefault();\n event.stopPropagation();\n}\n// Implementation left/right or up/down navigation, circling back when you\n// reach the start/end of the list\nfunction $1e5dc5e467331cb9$var$incrementOrDecrement(decrement, val, arr) {\n val += decrement ? -1 : 1;\n if (val < 0) val = arr.length - 1;\n else if (val >= arr.length) val = 0;\n return val;\n}\n// like lodash's uniqBy but much smaller\nfunction $1e5dc5e467331cb9$var$uniqBy(arr, func) {\n const set = new Set();\n const res = [];\n for (const item of arr){\n const key = func(item);\n if (!set.has(key)) {\n set.add(key);\n res.push(item);\n }\n }\n return res;\n}\n// We don't need all the data on every emoji, and there are specific things we need\n// for the UI, so build a \"view model\" from the emoji object we got from the database\nfunction $1e5dc5e467331cb9$var$summarizeEmojisForUI(emojis, emojiSupportLevel) {\n const toSimpleSkinsMap = (skins)=>{\n const res = {};\n for (const skin of skins)// ignore arrays like [1, 2] with multiple skin tones\n // also ignore variants that are in an unsupported emoji version\n // (these do exist - variants from a different version than their base emoji)\n if (typeof skin.tone === \"number\" && skin.version <= emojiSupportLevel) res[skin.tone] = skin.unicode;\n return res;\n };\n return emojis.map(({ unicode: unicode, skins: skins, shortcodes: shortcodes, url: url, name: name, category: category, annotation: annotation })=>({\n unicode: unicode,\n name: name,\n shortcodes: shortcodes,\n url: url,\n category: category,\n annotation: annotation,\n id: unicode || name,\n skins: skins && toSimpleSkinsMap(skins)\n }));\n}\n// import rAF from one place so that the bundle size is a bit smaller\nconst $1e5dc5e467331cb9$var$rAF = requestAnimationFrame;\n// \"Svelte action\"-like utility to detect layout changes via ResizeObserver.\n// If ResizeObserver is unsupported, we just use rAF once and don't bother to update.\nlet $1e5dc5e467331cb9$var$resizeObserverSupported = typeof ResizeObserver === \"function\";\nfunction $1e5dc5e467331cb9$var$resizeObserverAction(node, abortSignal, onUpdate) {\n let resizeObserver;\n if ($1e5dc5e467331cb9$var$resizeObserverSupported) {\n resizeObserver = new ResizeObserver(onUpdate);\n resizeObserver.observe(node);\n } else $1e5dc5e467331cb9$var$rAF(onUpdate);\n // cleanup function (called on destroy)\n abortSignal.addEventListener(\"abort\", ()=>{\n if (resizeObserver) resizeObserver.disconnect();\n });\n}\n// get the width of the text inside of a DOM node, via https://stackoverflow.com/a/59525891/680742\nfunction $1e5dc5e467331cb9$var$calculateTextWidth(node) {\n // skip running this in jest/vitest because we don't need to check for emoji support in that environment\n /* istanbul ignore else */ {\n const range = document.createRange();\n range.selectNode(node.firstChild);\n return range.getBoundingClientRect().width;\n }\n}\nlet $1e5dc5e467331cb9$var$baselineEmojiWidth;\n/**\n * Check if the given emojis containing ZWJ characters are supported by the current browser (don't render\n * as double characters) and return true if all are supported.\n * @param zwjEmojisToCheck\n * @param baselineEmoji\n * @param emojiToDomNode\n */ function $1e5dc5e467331cb9$var$checkZwjSupport(zwjEmojisToCheck, baselineEmoji, emojiToDomNode) {\n let allSupported = true;\n for (const emoji of zwjEmojisToCheck){\n const domNode = emojiToDomNode(emoji);\n const emojiWidth = $1e5dc5e467331cb9$var$calculateTextWidth(domNode);\n if (typeof $1e5dc5e467331cb9$var$baselineEmojiWidth === \"undefined\") $1e5dc5e467331cb9$var$baselineEmojiWidth = $1e5dc5e467331cb9$var$calculateTextWidth(baselineEmoji);\n // On Windows, some supported emoji are ~50% bigger than the baseline emoji, but what we really want to guard\n // against are the ones that are 2x the size, because those are truly broken (person with red hair = person with\n // floating red wig, black cat = cat with black square, polar bear = bear with snowflake, etc.)\n // So here we set the threshold at 1.8 times the size of the baseline emoji.\n const supported = emojiWidth / 1.8 < $1e5dc5e467331cb9$var$baselineEmojiWidth;\n $1e5dc5e467331cb9$var$supportedZwjEmojis.set(emoji.unicode, supported);\n if (!supported) allSupported = false;\n }\n return allSupported;\n}\n// like lodash's uniq\nfunction $1e5dc5e467331cb9$var$uniq(arr) {\n return $1e5dc5e467331cb9$var$uniqBy(arr, (_)=>_);\n}\n// Note we put this in its own function outside Picker.js to avoid Svelte doing an invalidation on the \"setter\" here.\n// At best the invalidation is useless, at worst it can cause infinite loops:\n// https://github.com/nolanlawson/emoji-picker-element/pull/180\n// https://github.com/sveltejs/svelte/issues/6521\n// Also note tabpanelElement can be null if the element is disconnected immediately after connected\nfunction $1e5dc5e467331cb9$var$resetScrollTopIfPossible(element) {\n /* istanbul ignore else */ if (element) element.scrollTop = 0;\n}\nfunction $1e5dc5e467331cb9$var$getFromMap(cache, key, func) {\n let cached = cache.get(key);\n if (!cached) {\n cached = func();\n cache.set(key, cached);\n }\n return cached;\n}\nfunction $1e5dc5e467331cb9$var$toString(value) {\n return \"\" + value;\n}\nfunction $1e5dc5e467331cb9$var$parseTemplate(htmlString) {\n const template = document.createElement(\"template\");\n template.innerHTML = htmlString;\n return template;\n}\nconst $1e5dc5e467331cb9$var$parseCache = new WeakMap();\nconst $1e5dc5e467331cb9$var$domInstancesCache = new WeakMap();\n// This needs to be a symbol because it needs to be different from any possible output of a key function\nconst $1e5dc5e467331cb9$var$unkeyedSymbol = Symbol(\"un-keyed\");\n// Not supported in Safari <=13\nconst $1e5dc5e467331cb9$var$hasReplaceChildren = \"replaceChildren\" in Element.prototype;\nfunction $1e5dc5e467331cb9$var$replaceChildren(parentNode, newChildren) {\n /* istanbul ignore else */ if ($1e5dc5e467331cb9$var$hasReplaceChildren) parentNode.replaceChildren(...newChildren);\n else {\n parentNode.innerHTML = \"\";\n parentNode.append(...newChildren);\n }\n}\nfunction $1e5dc5e467331cb9$var$doChildrenNeedRerender(parentNode, newChildren) {\n let oldChild = parentNode.firstChild;\n let oldChildrenCount = 0;\n // iterate using firstChild/nextSibling because browsers use a linked list under the hood\n while(oldChild){\n const newChild = newChildren[oldChildrenCount];\n // check if the old child and new child are the same\n if (newChild !== oldChild) return true;\n oldChild = oldChild.nextSibling;\n oldChildrenCount++;\n }\n // if new children length is different from old, we must re-render\n return oldChildrenCount !== newChildren.length;\n}\nfunction $1e5dc5e467331cb9$var$patchChildren(newChildren, instanceBinding) {\n const { targetNode: targetNode } = instanceBinding;\n let { targetParentNode: targetParentNode } = instanceBinding;\n let needsRerender = false;\n if (targetParentNode) needsRerender = $1e5dc5e467331cb9$var$doChildrenNeedRerender(targetParentNode, newChildren);\n else {\n needsRerender = true;\n instanceBinding.targetNode = undefined; // placeholder node not needed anymore, free memory\n instanceBinding.targetParentNode = targetParentNode = targetNode.parentNode;\n }\n // avoid re-rendering list if the dom nodes are exactly the same before and after\n if (needsRerender) $1e5dc5e467331cb9$var$replaceChildren(targetParentNode, newChildren);\n}\nfunction $1e5dc5e467331cb9$var$patch(expressions, instanceBindings) {\n for (const instanceBinding of instanceBindings){\n const { targetNode: targetNode, currentExpression: currentExpression, binding: { expressionIndex: expressionIndex, attributeName: attributeName, attributeValuePre: attributeValuePre, attributeValuePost: attributeValuePost } } = instanceBinding;\n const expression = expressions[expressionIndex];\n if (currentExpression === expression) continue;\n instanceBinding.currentExpression = expression;\n if (attributeName) targetNode.setAttribute(attributeName, attributeValuePre + $1e5dc5e467331cb9$var$toString(expression) + attributeValuePost);\n else {\n let newNode;\n if (Array.isArray(expression)) $1e5dc5e467331cb9$var$patchChildren(expression, instanceBinding);\n else if (expression instanceof Element) {\n newNode = expression;\n targetNode.replaceWith(newNode);\n } else // nodeValue is faster than textContent supposedly https://www.youtube.com/watch?v=LY6y3HbDVmg\n // note we may be replacing the value in a placeholder text node\n targetNode.nodeValue = $1e5dc5e467331cb9$var$toString(expression);\n if (newNode) instanceBinding.targetNode = newNode;\n }\n }\n}\nfunction $1e5dc5e467331cb9$var$parse(tokens) {\n let htmlString = \"\";\n let withinTag = false;\n let withinAttribute = false;\n let elementIndexCounter = -1; // depth-first traversal order\n const elementsToBindings = new Map();\n const elementIndexes = [];\n for(let i = 0, len = tokens.length; i < len; i++){\n const token = tokens[i];\n htmlString += token;\n if (i === len - 1) break; // no need to process characters - no more expressions to be found\n for(let j = 0; j < token.length; j++){\n const char = token.charAt(j);\n switch(char){\n case \"<\":\n {\n const nextChar = token.charAt(j + 1);\n if (nextChar === \"/\") // leaving an element\n elementIndexes.pop();\n else {\n withinTag = true;\n elementIndexes.push(++elementIndexCounter);\n }\n break;\n }\n case \">\":\n withinTag = false;\n withinAttribute = false;\n break;\n case \"=\":\n withinAttribute = true;\n break;\n }\n }\n const elementIndex = elementIndexes[elementIndexes.length - 1];\n const bindings = $1e5dc5e467331cb9$var$getFromMap(elementsToBindings, elementIndex, ()=>[]);\n let attributeName;\n let attributeValuePre;\n let attributeValuePost;\n if (withinAttribute) {\n // I never use single-quotes for attribute values in HTML, so just support double-quotes or no-quotes\n const match = /(\\S+)=\"?([^\"=]*)$/.exec(token);\n attributeName = match[1];\n attributeValuePre = match[2];\n attributeValuePost = /^[^\">]*/.exec(tokens[i + 1])[0];\n }\n const binding = {\n attributeName: attributeName,\n attributeValuePre: attributeValuePre,\n attributeValuePost: attributeValuePost,\n expressionIndex: i\n };\n bindings.push(binding);\n if (!withinTag && !withinAttribute) // Add a placeholder text node, so we can find it later. Note we only support one dynamic child text node\n htmlString += \" \";\n }\n const template = $1e5dc5e467331cb9$var$parseTemplate(htmlString);\n return {\n template: template,\n elementsToBindings: elementsToBindings\n };\n}\nfunction $1e5dc5e467331cb9$var$applyBindings(bindings, element, instanceBindings) {\n for(let i = 0; i < bindings.length; i++){\n const binding = bindings[i];\n const targetNode = binding.attributeName ? element // attribute binding, just use the element itself\n : element.firstChild; // not an attribute binding, so has a placeholder text node\n const instanceBinding = {\n binding: binding,\n targetNode: targetNode,\n targetParentNode: undefined,\n currentExpression: undefined\n };\n instanceBindings.push(instanceBinding);\n }\n}\nfunction $1e5dc5e467331cb9$var$traverseAndSetupBindings(rootElement, elementsToBindings) {\n const instanceBindings = [];\n let topLevelBindings;\n if (elementsToBindings.size === 1 && (topLevelBindings = elementsToBindings.get(0))) // Optimization for the common case where there's only one element and one binding\n // Skip creating a TreeWalker entirely and just handle the root DOM element\n $1e5dc5e467331cb9$var$applyBindings(topLevelBindings, rootElement, instanceBindings);\n else {\n // traverse dom\n const treeWalker = document.createTreeWalker(rootElement, NodeFilter.SHOW_ELEMENT);\n let element = rootElement;\n let elementIndex = -1;\n do {\n const bindings = elementsToBindings.get(++elementIndex);\n if (bindings) $1e5dc5e467331cb9$var$applyBindings(bindings, element, instanceBindings);\n }while (element = treeWalker.nextNode());\n }\n return instanceBindings;\n}\nfunction $1e5dc5e467331cb9$var$parseHtml(tokens) {\n // All templates and bound expressions are unique per tokens array\n const { template: template, elementsToBindings: elementsToBindings } = $1e5dc5e467331cb9$var$getFromMap($1e5dc5e467331cb9$var$parseCache, tokens, ()=>$1e5dc5e467331cb9$var$parse(tokens));\n // When we parseHtml, we always return a fresh DOM instance ready to be updated\n const dom = template.cloneNode(true).content.firstElementChild;\n const instanceBindings = $1e5dc5e467331cb9$var$traverseAndSetupBindings(dom, elementsToBindings);\n return function updateDomInstance(expressions) {\n $1e5dc5e467331cb9$var$patch(expressions, instanceBindings);\n return dom;\n };\n}\nfunction $1e5dc5e467331cb9$var$createFramework(state) {\n const domInstances = $1e5dc5e467331cb9$var$getFromMap($1e5dc5e467331cb9$var$domInstancesCache, state, ()=>new Map());\n let domInstanceCacheKey = $1e5dc5e467331cb9$var$unkeyedSymbol;\n function html(tokens, ...expressions) {\n // Each unique lexical usage of map() is considered unique due to the html`` tagged template call it makes,\n // which has lexically unique tokens. The unkeyed symbol is just used for html`` usage outside of a map().\n const domInstancesForTokens = $1e5dc5e467331cb9$var$getFromMap(domInstances, tokens, ()=>new Map());\n const updateDomInstance = $1e5dc5e467331cb9$var$getFromMap(domInstancesForTokens, domInstanceCacheKey, ()=>$1e5dc5e467331cb9$var$parseHtml(tokens));\n return updateDomInstance(expressions) // update with expressions\n ;\n }\n function map(array, callback, keyFunction) {\n return array.map((item, index)=>{\n const originalCacheKey = domInstanceCacheKey;\n domInstanceCacheKey = keyFunction(item);\n try {\n return callback(item, index);\n } finally{\n domInstanceCacheKey = originalCacheKey;\n }\n });\n }\n return {\n map: map,\n html: html\n };\n}\nfunction $1e5dc5e467331cb9$var$render(container, state, helpers, events, actions, refs, abortSignal, actionContext, firstRender) {\n const { labelWithSkin: labelWithSkin, titleForEmoji: titleForEmoji, unicodeWithSkin: unicodeWithSkin } = helpers;\n const { html: html, map: map } = $1e5dc5e467331cb9$var$createFramework(state);\n function emojiList(emojis, searchMode, prefix) {\n return map(emojis, (emoji, i)=>{\n return html``;\n // It's important for the cache key to be unique based on the prefix, because the framework caches based on the\n // unique tokens + cache key, and the same emoji may be used in the tab as well as in the fav bar\n }, (emoji)=>`${prefix}-${emoji.id}`);\n }\n const section = ()=>{\n return html`
${state.i18n.searchDescription}
${state.i18n.skinToneDescription}
${map(state.skinTones, (skinTone, i)=>{\n return html`
${skinTone}
`;\n }, (skinTone)=>skinTone)}
${map(state.groups, (group)=>{\n return html``;\n }, (group)=>group.id)}
${state.message || \"\"}
${map(state.currentEmojisWithCategories, (emojiWithCategory, i)=>{\n return html`
${state.searchMode ? state.i18n.searchResultsLabel : emojiWithCategory.category ? emojiWithCategory.category : state.currentEmojisWithCategories.length > 1 ? state.i18n.categories.custom : state.i18n.categories[state.currentGroup.name]}
${emojiList(emojiWithCategory.emojis, state.searchMode, /* prefix */ \"emo\")}
`;\n }, (emojiWithCategory)=>emojiWithCategory.category)}
${emojiList(state.currentFavorites, /* searchMode */ false, /* prefix */ \"fav\")}
`;\n };\n const rootDom = section();\n // helper for traversing the dom, finding elements by an attribute, and getting the attribute value\n const forElementWithAttribute = (attributeName, callback)=>{\n for (const element of container.querySelectorAll(`[${attributeName}]`))callback(element, element.getAttribute(attributeName));\n };\n if (firstRender) {\n container.appendChild(rootDom);\n // we only bind events/refs once - there is no need to find them again given this component structure\n // bind events\n for (const eventName of [\n \"click\",\n \"focusout\",\n \"input\",\n \"keydown\",\n \"keyup\"\n ])forElementWithAttribute(`data-on-${eventName}`, (element, listenerName)=>{\n element.addEventListener(eventName, events[listenerName]);\n });\n // find refs\n forElementWithAttribute(\"data-ref\", (element, ref)=>{\n refs[ref] = element;\n });\n // destroy/abort logic\n abortSignal.addEventListener(\"abort\", ()=>{\n container.removeChild(rootDom);\n });\n }\n // set up actions - these are re-bound on every render\n forElementWithAttribute(\"data-action\", (element, action)=>{\n let boundActions = actionContext.get(action);\n if (!boundActions) actionContext.set(action, boundActions = new WeakSet());\n // avoid applying the same action to the same element multiple times\n if (!boundActions.has(element)) {\n boundActions.add(element);\n actions[action](element);\n }\n });\n}\n/* istanbul ignore next */ const $1e5dc5e467331cb9$var$qM = typeof queueMicrotask === \"function\" ? queueMicrotask : (callback)=>Promise.resolve().then(callback);\nfunction $1e5dc5e467331cb9$var$createState(abortSignal) {\n let destroyed = false;\n let currentObserver;\n const propsToObservers = new Map();\n const dirtyObservers = new Set();\n let queued;\n const flush = ()=>{\n if (destroyed) return;\n const observersToRun = [\n ...dirtyObservers\n ];\n dirtyObservers.clear(); // clear before running to force any new updates to run in another tick of the loop\n try {\n for (const observer of observersToRun)observer();\n } finally{\n queued = false;\n if (dirtyObservers.size) {\n queued = true;\n $1e5dc5e467331cb9$var$qM(flush);\n }\n }\n };\n const state = new Proxy({}, {\n get (target, prop) {\n if (currentObserver) {\n let observers = propsToObservers.get(prop);\n if (!observers) {\n observers = new Set();\n propsToObservers.set(prop, observers);\n }\n observers.add(currentObserver);\n }\n return target[prop];\n },\n set (target, prop, newValue) {\n if (target[prop] !== newValue) {\n target[prop] = newValue;\n const observers = propsToObservers.get(prop);\n if (observers) {\n for (const observer of observers)dirtyObservers.add(observer);\n if (!queued) {\n queued = true;\n $1e5dc5e467331cb9$var$qM(flush);\n }\n }\n }\n return true;\n }\n });\n const createEffect = (callback)=>{\n const runnable = ()=>{\n const oldObserver = currentObserver;\n currentObserver = runnable;\n try {\n return callback();\n } finally{\n currentObserver = oldObserver;\n }\n };\n return runnable();\n };\n // destroy logic\n abortSignal.addEventListener(\"abort\", ()=>{\n destroyed = true;\n });\n return {\n state: state,\n createEffect: createEffect\n };\n}\n// Compare two arrays, with a function called on each item in the two arrays that returns true if the items are equal\nfunction $1e5dc5e467331cb9$var$arraysAreEqualByFunction(left, right, areEqualFunc) {\n if (left.length !== right.length) return false;\n for(let i = 0; i < left.length; i++){\n if (!areEqualFunc(left[i], right[i])) return false;\n }\n return true;\n}\nconst $1e5dc5e467331cb9$var$intersectionObserverCache = new WeakMap();\nfunction $1e5dc5e467331cb9$var$intersectionObserverAction(node, abortSignal, listener) {\n /* istanbul ignore else */ {\n // The scroll root is always `.tabpanel`\n const root = node.closest(\".tabpanel\");\n let observer = $1e5dc5e467331cb9$var$intersectionObserverCache.get(root);\n if (!observer) {\n // TODO: replace this with the contentvisibilityautostatechange event when all supported browsers support it.\n // For now we use IntersectionObserver because it has better cross-browser support, and it would be bad for\n // old Safari versions if they eagerly downloaded all custom emoji all at once.\n observer = new IntersectionObserver(listener, {\n root: root,\n // trigger if we are 1/2 scroll container height away so that the images load a bit quicker while scrolling\n rootMargin: \"50% 0px 50% 0px\",\n // trigger if any part of the emoji grid is intersecting\n threshold: 0\n });\n // avoid creating a new IntersectionObserver for every category; just use one for the whole root\n $1e5dc5e467331cb9$var$intersectionObserverCache.set(root, observer);\n // assume that the abortSignal is always the same for this root node; just add one event listener\n abortSignal.addEventListener(\"abort\", ()=>{\n observer.disconnect();\n });\n }\n observer.observe(node);\n }\n}\n/* eslint-disable prefer-const,no-labels,no-inner-declarations */ // constants\nconst $1e5dc5e467331cb9$var$EMPTY_ARRAY = [];\nconst { assign: $1e5dc5e467331cb9$var$assign } = Object;\nfunction $1e5dc5e467331cb9$var$createRoot(shadowRoot, props) {\n const refs = {};\n const abortController = new AbortController();\n const abortSignal = abortController.signal;\n const { state: state, createEffect: createEffect } = $1e5dc5e467331cb9$var$createState(abortSignal);\n const actionContext = new Map();\n // initial state\n $1e5dc5e467331cb9$var$assign(state, {\n skinToneEmoji: undefined,\n i18n: undefined,\n database: undefined,\n customEmoji: undefined,\n customCategorySorting: undefined,\n emojiVersion: undefined\n });\n // public props\n $1e5dc5e467331cb9$var$assign(state, props);\n // private props\n $1e5dc5e467331cb9$var$assign(state, {\n initialLoad: true,\n currentEmojis: [],\n currentEmojisWithCategories: [],\n rawSearchText: \"\",\n searchText: \"\",\n searchMode: false,\n activeSearchItem: -1,\n message: undefined,\n skinTonePickerExpanded: false,\n skinTonePickerExpandedAfterAnimation: false,\n currentSkinTone: 0,\n activeSkinTone: 0,\n skinToneButtonText: undefined,\n pickerStyle: undefined,\n skinToneButtonLabel: \"\",\n skinTones: [],\n currentFavorites: [],\n defaultFavoriteEmojis: undefined,\n numColumns: $1e5dc5e467331cb9$var$DEFAULT_NUM_COLUMNS,\n isRtl: false,\n currentGroupIndex: 0,\n groups: $1e5dc5e467331cb9$var$groups,\n databaseLoaded: false,\n activeSearchItemId: undefined\n });\n //\n // Update the current group based on the currentGroupIndex\n //\n createEffect(()=>{\n if (state.currentGroup !== state.groups[state.currentGroupIndex]) state.currentGroup = state.groups[state.currentGroupIndex];\n });\n //\n // Utils/helpers\n //\n const focus = (id)=>{\n shadowRoot.getElementById(id).focus();\n };\n const emojiToDomNode = (emoji)=>shadowRoot.getElementById(`emo-${emoji.id}`);\n // fire a custom event that crosses the shadow boundary\n const fireEvent = (name, detail)=>{\n refs.rootElement.dispatchEvent(new CustomEvent(name, {\n detail: detail,\n bubbles: true,\n composed: true\n }));\n };\n //\n // Comparison utils\n //\n const compareEmojiArrays = (a, b)=>a.id === b.id;\n const compareCurrentEmojisWithCategories = (a, b)=>{\n const { category: aCategory, emojis: aEmojis } = a;\n const { category: bCategory, emojis: bEmojis } = b;\n if (aCategory !== bCategory) return false;\n return $1e5dc5e467331cb9$var$arraysAreEqualByFunction(aEmojis, bEmojis, compareEmojiArrays);\n };\n //\n // Update utils to avoid excessive re-renders\n //\n // avoid excessive re-renders by checking the value before setting\n const updateCurrentEmojis = (newEmojis)=>{\n if (!$1e5dc5e467331cb9$var$arraysAreEqualByFunction(state.currentEmojis, newEmojis, compareEmojiArrays)) state.currentEmojis = newEmojis;\n };\n // avoid excessive re-renders\n const updateSearchMode = (newSearchMode)=>{\n if (state.searchMode !== newSearchMode) state.searchMode = newSearchMode;\n };\n // avoid excessive re-renders\n const updateCurrentEmojisWithCategories = (newEmojisWithCategories)=>{\n if (!$1e5dc5e467331cb9$var$arraysAreEqualByFunction(state.currentEmojisWithCategories, newEmojisWithCategories, compareCurrentEmojisWithCategories)) state.currentEmojisWithCategories = newEmojisWithCategories;\n };\n // Helpers used by PickerTemplate\n const unicodeWithSkin = (emoji, currentSkinTone)=>currentSkinTone && emoji.skins && emoji.skins[currentSkinTone] || emoji.unicode;\n const labelWithSkin = (emoji, currentSkinTone)=>$1e5dc5e467331cb9$var$uniq([\n emoji.name || unicodeWithSkin(emoji, currentSkinTone),\n emoji.annotation,\n ...emoji.shortcodes || $1e5dc5e467331cb9$var$EMPTY_ARRAY\n ].filter(Boolean)).join(\", \");\n const titleForEmoji = (emoji)=>emoji.annotation || (emoji.shortcodes || $1e5dc5e467331cb9$var$EMPTY_ARRAY).join(\", \");\n const helpers = {\n labelWithSkin: labelWithSkin,\n titleForEmoji: titleForEmoji,\n unicodeWithSkin: unicodeWithSkin\n };\n const events = {\n onClickSkinToneButton: onClickSkinToneButton,\n onEmojiClick: onEmojiClick,\n onNavClick: onNavClick,\n onNavKeydown: onNavKeydown,\n onSearchKeydown: onSearchKeydown,\n onSkinToneOptionsClick: onSkinToneOptionsClick,\n onSkinToneOptionsFocusOut: onSkinToneOptionsFocusOut,\n onSkinToneOptionsKeydown: onSkinToneOptionsKeydown,\n onSkinToneOptionsKeyup: onSkinToneOptionsKeyup,\n onSearchInput: onSearchInput\n };\n const actions = {\n calculateEmojiGridStyle: calculateEmojiGridStyle,\n updateOnIntersection: updateOnIntersection\n };\n let firstRender = true;\n createEffect(()=>{\n $1e5dc5e467331cb9$var$render(shadowRoot, state, helpers, events, actions, refs, abortSignal, actionContext, firstRender);\n firstRender = false;\n });\n //\n // Determine the emoji support level (in requestIdleCallback)\n //\n // mount logic\n if (!state.emojiVersion) $1e5dc5e467331cb9$var$detectEmojiSupportLevel().then((level)=>{\n // Can't actually test emoji support in Jest/Vitest/JSDom, emoji never render in color in Cairo\n /* istanbul ignore next */ if (!level) state.message = state.i18n.emojiUnsupportedMessage;\n });\n //\n // Set or update the database object\n //\n createEffect(()=>{\n // show a Loading message if it takes a long time, or show an error if there's a network/IDB error\n async function handleDatabaseLoading() {\n let showingLoadingMessage = false;\n const timeoutHandle = setTimeout(()=>{\n showingLoadingMessage = true;\n state.message = state.i18n.loadingMessage;\n }, $1e5dc5e467331cb9$var$TIMEOUT_BEFORE_LOADING_MESSAGE);\n try {\n await state.database.ready();\n state.databaseLoaded = true; // eslint-disable-line no-unused-vars\n } catch (err) {\n console.error(err);\n state.message = state.i18n.networkErrorMessage;\n } finally{\n clearTimeout(timeoutHandle);\n if (showingLoadingMessage) {\n showingLoadingMessage = false;\n state.message = \"\"; // eslint-disable-line no-unused-vars\n }\n }\n }\n if (state.database) /* no await */ handleDatabaseLoading();\n });\n //\n // Global styles for the entire picker\n //\n createEffect(()=>{\n state.pickerStyle = `\n --num-groups: ${state.groups.length}; \n --indicator-opacity: ${state.searchMode ? 0 : 1}; \n --num-skintones: ${$1e5dc5e467331cb9$var$NUM_SKIN_TONES};`;\n });\n //\n // Set or update the customEmoji\n //\n createEffect(()=>{\n if (state.customEmoji && state.database) updateCustomEmoji(); // re-run whenever customEmoji change\n });\n createEffect(()=>{\n if (state.customEmoji && state.customEmoji.length) {\n if (state.groups !== $1e5dc5e467331cb9$var$allGroups) state.groups = $1e5dc5e467331cb9$var$allGroups;\n } else if (state.groups !== $1e5dc5e467331cb9$var$groups) {\n if (state.currentGroupIndex) // If the current group is anything other than \"custom\" (which is first), decrement.\n // This fixes the odd case where you set customEmoji, then pick a category, then unset customEmoji\n state.currentGroupIndex--;\n state.groups = $1e5dc5e467331cb9$var$groups;\n }\n });\n //\n // Set or update the preferred skin tone\n //\n createEffect(()=>{\n async function updatePreferredSkinTone() {\n if (state.databaseLoaded) state.currentSkinTone = await state.database.getPreferredSkinTone();\n }\n /* no await */ updatePreferredSkinTone();\n });\n createEffect(()=>{\n state.skinTones = Array($1e5dc5e467331cb9$var$NUM_SKIN_TONES).fill().map((_, i)=>$1e5dc5e467331cb9$var$applySkinTone(state.skinToneEmoji, i));\n });\n createEffect(()=>{\n state.skinToneButtonText = state.skinTones[state.currentSkinTone];\n });\n createEffect(()=>{\n state.skinToneButtonLabel = state.i18n.skinToneLabel.replace(\"{skinTone}\", state.i18n.skinTones[state.currentSkinTone]);\n });\n //\n // Set or update the favorites emojis\n //\n createEffect(()=>{\n async function updateDefaultFavoriteEmojis() {\n const { database: database } = state;\n const favs = (await Promise.all($1e5dc5e467331cb9$var$MOST_COMMONLY_USED_EMOJI.map((unicode)=>database.getEmojiByUnicodeOrName(unicode)))).filter(Boolean); // filter because in Jest/Vitest tests we don't have all the emoji in the DB\n state.defaultFavoriteEmojis = favs;\n }\n if (state.databaseLoaded) /* no await */ updateDefaultFavoriteEmojis();\n });\n function updateCustomEmoji() {\n // Certain effects have an implicit dependency on customEmoji since it affects the database\n // Getting it here on the state ensures this effect re-runs when customEmoji change.\n const { customEmoji: customEmoji, database: database } = state;\n const databaseCustomEmoji = customEmoji || $1e5dc5e467331cb9$var$EMPTY_ARRAY;\n if (database.customEmoji !== databaseCustomEmoji) // Avoid setting this if the customEmoji have _not_ changed, because the setter triggers a re-computation of the\n // `customEmojiIndex`. Note we don't bother with deep object changes.\n database.customEmoji = databaseCustomEmoji;\n }\n createEffect(()=>{\n async function updateFavorites() {\n updateCustomEmoji(); // re-run whenever customEmoji change\n const { database: database, defaultFavoriteEmojis: defaultFavoriteEmojis, numColumns: numColumns } = state;\n const dbFavorites = await database.getTopFavoriteEmoji(numColumns);\n const favorites = await summarizeEmojis($1e5dc5e467331cb9$var$uniqBy([\n ...dbFavorites,\n ...defaultFavoriteEmojis\n ], (_)=>_.unicode || _.name).slice(0, numColumns));\n state.currentFavorites = favorites;\n }\n if (state.databaseLoaded && state.defaultFavoriteEmojis) /* no await */ updateFavorites();\n });\n //\n // Re-run whenever the emoji grid changes size, and re-calc style/layout-related state variables:\n // 1) Re-calculate the --num-columns var because it may have changed\n // 2) Re-calculate whether we're in RTL mode or not.\n //\n // The benefit of doing this in one place is to align with rAF/ResizeObserver\n // and do all the calculations in one go. RTL vs LTR is not strictly layout-related,\n // but since we're already reading the style here, and since it's already aligned with\n // the rAF loop, this is the most appropriate place to do it perf-wise.\n //\n function calculateEmojiGridStyle(node) {\n $1e5dc5e467331cb9$var$resizeObserverAction(node, abortSignal, ()=>{\n /* istanbul ignore next */ {\n // read all the style/layout calculations we need to make\n const style = getComputedStyle(refs.rootElement);\n const newNumColumns = parseInt(style.getPropertyValue(\"--num-columns\"), 10);\n const newIsRtl = style.getPropertyValue(\"direction\") === \"rtl\";\n // write to state variables\n state.numColumns = newNumColumns;\n state.isRtl = newIsRtl;\n }\n });\n }\n // Re-run whenever the custom emoji in a category are shown/hidden. This is an optimization that simulates\n // what we'd get from `` but without rendering an ``.\n function updateOnIntersection(node) {\n $1e5dc5e467331cb9$var$intersectionObserverAction(node, abortSignal, (entries)=>{\n for (const { target: target, isIntersecting: isIntersecting } of entries)target.classList.toggle(\"onscreen\", isIntersecting);\n });\n }\n //\n // Set or update the currentEmojis. Check for invalid ZWJ renderings\n // (i.e. double emoji).\n //\n createEffect(()=>{\n async function updateEmojis() {\n const { searchText: searchText, currentGroup: currentGroup, databaseLoaded: databaseLoaded, customEmoji: customEmoji } = state;\n if (!databaseLoaded) {\n state.currentEmojis = [];\n state.searchMode = false;\n } else if (searchText.length >= $1e5dc5e467331cb9$var$MIN_SEARCH_TEXT_LENGTH) {\n const newEmojis = await getEmojisBySearchQuery(searchText);\n if (state.searchText === searchText) {\n updateCurrentEmojis(newEmojis);\n updateSearchMode(true);\n }\n } else {\n const { id: currentGroupId } = currentGroup;\n // avoid race condition where currentGroupId is -1 and customEmoji is undefined/empty\n if (currentGroupId !== -1 || customEmoji && customEmoji.length) {\n const newEmojis = await getEmojisByGroup(currentGroupId);\n if (state.currentGroup.id === currentGroupId) {\n updateCurrentEmojis(newEmojis);\n updateSearchMode(false);\n }\n }\n }\n }\n /* no await */ updateEmojis();\n });\n const resetScrollTopInRaf = ()=>{\n $1e5dc5e467331cb9$var$rAF(()=>$1e5dc5e467331cb9$var$resetScrollTopIfPossible(refs.tabpanelElement));\n };\n // Some emojis have their ligatures rendered as two or more consecutive emojis\n // We want to treat these the same as unsupported emojis, so we compare their\n // widths against the baseline widths and remove them as necessary\n createEffect(()=>{\n const { currentEmojis: currentEmojis, emojiVersion: emojiVersion } = state;\n const zwjEmojisToCheck = currentEmojis.filter((emoji)=>emoji.unicode) // filter custom emoji\n .filter((emoji)=>$1e5dc5e467331cb9$var$hasZwj(emoji) && !$1e5dc5e467331cb9$var$supportedZwjEmojis.has(emoji.unicode));\n if (!emojiVersion && zwjEmojisToCheck.length) {\n // render now, check their length later\n updateCurrentEmojis(currentEmojis);\n $1e5dc5e467331cb9$var$rAF(()=>checkZwjSupportAndUpdate(zwjEmojisToCheck));\n } else {\n const newEmojis = emojiVersion ? currentEmojis : currentEmojis.filter(isZwjSupported);\n updateCurrentEmojis(newEmojis);\n // Reset scroll top to 0 when emojis change\n resetScrollTopInRaf();\n }\n });\n function checkZwjSupportAndUpdate(zwjEmojisToCheck) {\n const allSupported = $1e5dc5e467331cb9$var$checkZwjSupport(zwjEmojisToCheck, refs.baselineEmoji, emojiToDomNode);\n if (allSupported) // Even if all emoji are supported, we still need to reset the scroll top to 0 when emojis change\n resetScrollTopInRaf();\n else // Force update. We only do this if there are any unsupported ZWJ characters since otherwise,\n // for browsers that support all emoji, it would be an unnecessary extra re-render.\n state.currentEmojis = [\n ...state.currentEmojis\n ];\n }\n function isZwjSupported(emoji) {\n return !emoji.unicode || !$1e5dc5e467331cb9$var$hasZwj(emoji) || $1e5dc5e467331cb9$var$supportedZwjEmojis.get(emoji.unicode);\n }\n async function filterEmojisByVersion(emojis) {\n const emojiSupportLevel = state.emojiVersion || await $1e5dc5e467331cb9$var$detectEmojiSupportLevel();\n // !version corresponds to custom emoji\n return emojis.filter(({ version: version })=>!version || version <= emojiSupportLevel);\n }\n async function summarizeEmojis(emojis) {\n return $1e5dc5e467331cb9$var$summarizeEmojisForUI(emojis, state.emojiVersion || await $1e5dc5e467331cb9$var$detectEmojiSupportLevel());\n }\n async function getEmojisByGroup(group) {\n // -1 is custom emoji\n const emoji = group === -1 ? state.customEmoji : await state.database.getEmojiByGroup(group);\n return summarizeEmojis(await filterEmojisByVersion(emoji));\n }\n async function getEmojisBySearchQuery(query) {\n return summarizeEmojis(await filterEmojisByVersion(await state.database.getEmojiBySearchQuery(query)));\n }\n createEffect(()=>{});\n //\n // Derive currentEmojisWithCategories from currentEmojis. This is always done even if there\n // are no categories, because it's just easier to code the HTML this way.\n //\n createEffect(()=>{\n function calculateCurrentEmojisWithCategories() {\n const { searchMode: searchMode, currentEmojis: currentEmojis } = state;\n if (searchMode) return [\n {\n category: \"\",\n emojis: currentEmojis\n }\n ];\n const categoriesToEmoji = new Map();\n for (const emoji of currentEmojis){\n const category = emoji.category || \"\";\n let emojis = categoriesToEmoji.get(category);\n if (!emojis) {\n emojis = [];\n categoriesToEmoji.set(category, emojis);\n }\n emojis.push(emoji);\n }\n return [\n ...categoriesToEmoji.entries()\n ].map(([category, emojis])=>({\n category: category,\n emojis: emojis\n })).sort((a, b)=>state.customCategorySorting(a.category, b.category));\n }\n const newEmojisWithCategories = calculateCurrentEmojisWithCategories();\n updateCurrentEmojisWithCategories(newEmojisWithCategories);\n });\n //\n // Handle active search item (i.e. pressing up or down while searching)\n //\n createEffect(()=>{\n state.activeSearchItemId = state.activeSearchItem !== -1 && state.currentEmojis[state.activeSearchItem].id;\n });\n //\n // Handle user input on the search input\n //\n createEffect(()=>{\n const { rawSearchText: rawSearchText } = state;\n $1e5dc5e467331cb9$var$rIC(()=>{\n state.searchText = (rawSearchText || \"\").trim(); // defer to avoid input delays, plus we can trim here\n state.activeSearchItem = -1;\n });\n });\n function onSearchKeydown(event) {\n if (!state.searchMode || !state.currentEmojis.length) return;\n const goToNextOrPrevious = (previous)=>{\n $1e5dc5e467331cb9$var$halt(event);\n state.activeSearchItem = $1e5dc5e467331cb9$var$incrementOrDecrement(previous, state.activeSearchItem, state.currentEmojis);\n };\n switch(event.key){\n case \"ArrowDown\":\n return goToNextOrPrevious(false);\n case \"ArrowUp\":\n return goToNextOrPrevious(true);\n case \"Enter\":\n if (state.activeSearchItem === -1) // focus the first option in the list since the list must be non-empty at this point (it's verified above)\n state.activeSearchItem = 0;\n else {\n $1e5dc5e467331cb9$var$halt(event);\n return clickEmoji(state.currentEmojis[state.activeSearchItem].id);\n }\n }\n }\n //\n // Handle user input on nav\n //\n function onNavClick(event) {\n const { target: target } = event;\n const closestTarget = target.closest(\".nav-button\");\n /* istanbul ignore if */ if (!closestTarget) return; // This should never happen, but makes me nervous not to have it\n const groupId = parseInt(closestTarget.dataset.groupId, 10);\n refs.searchElement.value = \"\"; // clear search box input\n state.rawSearchText = \"\";\n state.searchText = \"\";\n state.activeSearchItem = -1;\n state.currentGroupIndex = state.groups.findIndex((_)=>_.id === groupId);\n }\n function onNavKeydown(event) {\n const { target: target, key: key } = event;\n const doFocus = (el)=>{\n if (el) {\n $1e5dc5e467331cb9$var$halt(event);\n el.focus();\n }\n };\n switch(key){\n case \"ArrowLeft\":\n return doFocus(target.previousElementSibling);\n case \"ArrowRight\":\n return doFocus(target.nextElementSibling);\n case \"Home\":\n return doFocus(target.parentElement.firstElementChild);\n case \"End\":\n return doFocus(target.parentElement.lastElementChild);\n }\n }\n //\n // Handle user input on an emoji\n //\n async function clickEmoji(unicodeOrName) {\n const emoji = await state.database.getEmojiByUnicodeOrName(unicodeOrName);\n const emojiSummary = [\n ...state.currentEmojis,\n ...state.currentFavorites\n ].find((_)=>_.id === unicodeOrName);\n const skinTonedUnicode = emojiSummary.unicode && unicodeWithSkin(emojiSummary, state.currentSkinTone);\n await state.database.incrementFavoriteEmojiCount(unicodeOrName);\n fireEvent(\"emoji-click\", {\n emoji: emoji,\n skinTone: state.currentSkinTone,\n ...skinTonedUnicode && {\n unicode: skinTonedUnicode\n },\n ...emojiSummary.name && {\n name: emojiSummary.name\n }\n });\n }\n async function onEmojiClick(event) {\n const { target: target } = event;\n /* istanbul ignore if */ if (!target.classList.contains(\"emoji\")) // This should never happen, but makes me nervous not to have it\n return;\n $1e5dc5e467331cb9$var$halt(event);\n const id = target.id.substring(4); // replace 'emo-' or 'fav-' prefix\n /* no await */ clickEmoji(id);\n }\n //\n // Handle user input on the skintone picker\n //\n function changeSkinTone(skinTone) {\n state.currentSkinTone = skinTone;\n state.skinTonePickerExpanded = false;\n focus(\"skintone-button\");\n fireEvent(\"skin-tone-change\", {\n skinTone: skinTone\n });\n /* no await */ state.database.setPreferredSkinTone(skinTone);\n }\n function onSkinToneOptionsClick(event) {\n const { target: { id: id } } = event;\n const match = id && id.match(/^skintone-(\\d)/); // skintone option format\n /* istanbul ignore if */ if (!match) return; // This should never happen, but makes me nervous not to have it\n $1e5dc5e467331cb9$var$halt(event);\n const skinTone = parseInt(match[1], 10); // remove 'skintone-' prefix\n changeSkinTone(skinTone);\n }\n function onClickSkinToneButton(event) {\n state.skinTonePickerExpanded = !state.skinTonePickerExpanded;\n state.activeSkinTone = state.currentSkinTone;\n // this should always be true, since the button is obscured by the listbox, so this `if` is just to be sure\n if (state.skinTonePickerExpanded) {\n $1e5dc5e467331cb9$var$halt(event);\n $1e5dc5e467331cb9$var$rAF(()=>focus(\"skintone-list\"));\n }\n }\n // To make the animation nicer, change the z-index of the skintone picker button\n // *after* the animation has played. This makes it appear that the picker box\n // is expanding \"below\" the button\n createEffect(()=>{\n if (state.skinTonePickerExpanded) refs.skinToneDropdown.addEventListener(\"transitionend\", ()=>{\n state.skinTonePickerExpandedAfterAnimation = true; // eslint-disable-line no-unused-vars\n }, {\n once: true\n });\n else state.skinTonePickerExpandedAfterAnimation = false; // eslint-disable-line no-unused-vars\n });\n function onSkinToneOptionsKeydown(event) {\n // this should never happen, but makes me nervous not to have it\n /* istanbul ignore if */ if (!state.skinTonePickerExpanded) return;\n const changeActiveSkinTone = async (nextSkinTone)=>{\n $1e5dc5e467331cb9$var$halt(event);\n state.activeSkinTone = nextSkinTone;\n };\n switch(event.key){\n case \"ArrowUp\":\n return changeActiveSkinTone($1e5dc5e467331cb9$var$incrementOrDecrement(true, state.activeSkinTone, state.skinTones));\n case \"ArrowDown\":\n return changeActiveSkinTone($1e5dc5e467331cb9$var$incrementOrDecrement(false, state.activeSkinTone, state.skinTones));\n case \"Home\":\n return changeActiveSkinTone(0);\n case \"End\":\n return changeActiveSkinTone(state.skinTones.length - 1);\n case \"Enter\":\n // enter on keydown, space on keyup. this is just how browsers work for buttons\n // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html\n $1e5dc5e467331cb9$var$halt(event);\n return changeSkinTone(state.activeSkinTone);\n case \"Escape\":\n $1e5dc5e467331cb9$var$halt(event);\n state.skinTonePickerExpanded = false;\n return focus(\"skintone-button\");\n }\n }\n function onSkinToneOptionsKeyup(event) {\n // this should never happen, but makes me nervous not to have it\n /* istanbul ignore if */ if (!state.skinTonePickerExpanded) return;\n switch(event.key){\n case \" \":\n // enter on keydown, space on keyup. this is just how browsers work for buttons\n // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html\n $1e5dc5e467331cb9$var$halt(event);\n return changeSkinTone(state.activeSkinTone);\n }\n }\n async function onSkinToneOptionsFocusOut(event) {\n // On blur outside of the skintone listbox, collapse the skintone picker.\n const { relatedTarget: relatedTarget } = event;\n // The `else` should never happen, but makes me nervous not to have it\n /* istanbul ignore else */ if (!relatedTarget || relatedTarget.id !== \"skintone-list\") state.skinTonePickerExpanded = false;\n }\n function onSearchInput(event) {\n state.rawSearchText = event.target.value;\n }\n return {\n $set (newState) {\n $1e5dc5e467331cb9$var$assign(state, newState);\n },\n $destroy () {\n abortController.abort();\n }\n };\n}\nconst $1e5dc5e467331cb9$var$DEFAULT_DATA_SOURCE = \"https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json\";\nconst $1e5dc5e467331cb9$var$DEFAULT_LOCALE = \"en\";\nvar $1e5dc5e467331cb9$var$enI18n = {\n categoriesLabel: \"Categories\",\n emojiUnsupportedMessage: \"Your browser does not support color emoji.\",\n favoritesLabel: \"Favorites\",\n loadingMessage: \"Loading\\u2026\",\n networkErrorMessage: \"Could not load emoji.\",\n regionLabel: \"Emoji picker\",\n searchDescription: \"When search results are available, press up or down to select and enter to choose.\",\n searchLabel: \"Search\",\n searchResultsLabel: \"Search results\",\n skinToneDescription: \"When expanded, press up or down to select and enter to choose.\",\n skinToneLabel: \"Choose a skin tone (currently {skinTone})\",\n skinTonesLabel: \"Skin tones\",\n skinTones: [\n \"Default\",\n \"Light\",\n \"Medium-Light\",\n \"Medium\",\n \"Medium-Dark\",\n \"Dark\"\n ],\n categories: {\n custom: \"Custom\",\n \"smileys-emotion\": \"Smileys and emoticons\",\n \"people-body\": \"People and body\",\n \"animals-nature\": \"Animals and nature\",\n \"food-drink\": \"Food and drink\",\n \"travel-places\": \"Travel and places\",\n activities: \"Activities\",\n objects: \"Objects\",\n symbols: \"Symbols\",\n flags: \"Flags\"\n }\n};\nvar $1e5dc5e467331cb9$var$baseStyles = ':host{--emoji-size:1.375rem;--emoji-padding:0.5rem;--category-emoji-size:var(--emoji-size);--category-emoji-padding:var(--emoji-padding);--indicator-height:3px;--input-border-radius:0.5rem;--input-border-size:1px;--input-font-size:1rem;--input-line-height:1.5;--input-padding:0.25rem;--num-columns:8;--outline-size:2px;--border-size:1px;--border-radius:0;--skintone-border-radius:1rem;--category-font-size:1rem;display:flex;width:min-content;height:400px}:host,:host(.light){color-scheme:light;--background:#fff;--border-color:#e0e0e0;--indicator-color:#385ac1;--input-border-color:#999;--input-font-color:#111;--input-placeholder-color:#999;--outline-color:#999;--category-font-color:#111;--button-active-background:#e6e6e6;--button-hover-background:#d9d9d9}:host(.dark){color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}@media (prefers-color-scheme:dark){:host{color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}}:host([hidden]){display:none}button{margin:0;padding:0;border:0;background:0 0;box-shadow:none;-webkit-tap-highlight-color:transparent}button::-moz-focus-inner{border:0}input{padding:0;margin:0;line-height:1.15;font-family:inherit}input[type=search]{-webkit-appearance:none}:focus{outline:var(--outline-color) solid var(--outline-size);outline-offset:calc(-1*var(--outline-size))}:host([data-js-focus-visible]) :focus:not([data-focus-visible-added]){outline:0}:focus:not(:focus-visible){outline:0}.hide-focus{outline:0}*{box-sizing:border-box}.picker{contain:content;display:flex;flex-direction:column;background:var(--background);border:var(--border-size) solid var(--border-color);border-radius:var(--border-radius);width:100%;height:100%;overflow:hidden;--total-emoji-size:calc(var(--emoji-size) + (2 * var(--emoji-padding)));--total-category-emoji-size:calc(var(--category-emoji-size) + (2 * var(--category-emoji-padding)))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.hidden{opacity:0;pointer-events:none}.abs-pos{position:absolute;left:0;top:0}.gone{display:none!important}.skintone-button-wrapper,.skintone-list{background:var(--background);z-index:3}.skintone-button-wrapper.expanded{z-index:1}.skintone-list{position:absolute;inset-inline-end:0;top:0;z-index:2;overflow:visible;border-bottom:var(--border-size) solid var(--border-color);border-radius:0 0 var(--skintone-border-radius) var(--skintone-border-radius);will-change:transform;transition:transform .2s ease-in-out;transform-origin:center 0}@media (prefers-reduced-motion:reduce){.skintone-list{transition-duration:.001s}}@supports not (inset-inline-end:0){.skintone-list{right:0}}.skintone-list.no-animate{transition:none}.tabpanel{overflow-y:auto;scrollbar-gutter:stable;-webkit-overflow-scrolling:touch;will-change:transform;min-height:0;flex:1;contain:content}.emoji-menu{display:grid;grid-template-columns:repeat(var(--num-columns),var(--total-emoji-size));justify-content:space-around;align-items:flex-start;width:100%}.emoji-menu.visibility-auto{content-visibility:auto;contain-intrinsic-size:calc(var(--num-columns)*var(--total-emoji-size)) calc(var(--num-rows)*var(--total-emoji-size))}.category{padding:var(--emoji-padding);font-size:var(--category-font-size);color:var(--category-font-color)}.emoji,button.emoji{font-size:var(--emoji-size);display:flex;align-items:center;justify-content:center;border-radius:100%;height:var(--total-emoji-size);width:var(--total-emoji-size);line-height:1;overflow:hidden;font-family:var(--emoji-font-family);cursor:pointer}@media (hover:hover) and (pointer:fine){.emoji:hover,button.emoji:hover{background:var(--button-hover-background)}}.emoji.active,.emoji:active,button.emoji.active,button.emoji:active{background:var(--button-active-background)}.onscreen .custom-emoji::after{content:\"\";width:var(--emoji-size);height:var(--emoji-size);background-repeat:no-repeat;background-position:center center;background-size:contain;background-image:var(--custom-emoji-background)}.nav,.nav-button{align-items:center}.nav{display:grid;justify-content:space-between;contain:content}.nav-button{display:flex;justify-content:center}.nav-emoji{font-size:var(--category-emoji-size);width:var(--total-category-emoji-size);height:var(--total-category-emoji-size)}.indicator-wrapper{display:flex;border-bottom:1px solid var(--border-color)}.indicator{width:calc(100%/var(--num-groups));height:var(--indicator-height);opacity:var(--indicator-opacity);background-color:var(--indicator-color);will-change:transform,opacity;transition:opacity .1s linear,transform .25s ease-in-out}@media (prefers-reduced-motion:reduce){.indicator{will-change:opacity;transition:opacity .1s linear}}.pad-top,input.search{background:var(--background);width:100%}.pad-top{height:var(--emoji-padding);z-index:3}.search-row{display:flex;align-items:center;position:relative;padding-inline-start:var(--emoji-padding);padding-bottom:var(--emoji-padding)}.search-wrapper{flex:1;min-width:0}input.search{padding:var(--input-padding);border-radius:var(--input-border-radius);border:var(--input-border-size) solid var(--input-border-color);color:var(--input-font-color);font-size:var(--input-font-size);line-height:var(--input-line-height)}input.search::placeholder{color:var(--input-placeholder-color)}.favorites{overflow-y:auto;scrollbar-gutter:stable;display:flex;flex-direction:row;border-top:var(--border-size) solid var(--border-color);contain:content}.message{padding:var(--emoji-padding)}';\nconst $1e5dc5e467331cb9$var$PROPS = [\n \"customEmoji\",\n \"customCategorySorting\",\n \"database\",\n \"dataSource\",\n \"i18n\",\n \"locale\",\n \"skinToneEmoji\",\n \"emojiVersion\"\n];\n// Styles injected ourselves, so we can declare the FONT_FAMILY variable in one place\nconst $1e5dc5e467331cb9$var$EXTRA_STYLES = `:host{--emoji-font-family:${$1e5dc5e467331cb9$var$FONT_FAMILY}}`;\nclass $1e5dc5e467331cb9$export$2e2bcd8739ae039 extends HTMLElement {\n constructor(props){\n super();\n this.attachShadow({\n mode: \"open\"\n });\n const style = document.createElement(\"style\");\n style.textContent = $1e5dc5e467331cb9$var$baseStyles + $1e5dc5e467331cb9$var$EXTRA_STYLES;\n this.shadowRoot.appendChild(style);\n this._ctx = {\n // Set defaults\n locale: $1e5dc5e467331cb9$var$DEFAULT_LOCALE,\n dataSource: $1e5dc5e467331cb9$var$DEFAULT_DATA_SOURCE,\n skinToneEmoji: $1e5dc5e467331cb9$var$DEFAULT_SKIN_TONE_EMOJI,\n customCategorySorting: $1e5dc5e467331cb9$var$DEFAULT_CATEGORY_SORTING,\n customEmoji: null,\n i18n: $1e5dc5e467331cb9$var$enI18n,\n emojiVersion: null,\n ...props\n };\n // Handle properties set before the element was upgraded\n for (const prop of $1e5dc5e467331cb9$var$PROPS)if (prop !== \"database\" && Object.prototype.hasOwnProperty.call(this, prop)) {\n this._ctx[prop] = this[prop];\n delete this[prop];\n }\n this._dbFlush(); // wait for a flush before creating the db, in case the user calls e.g. a setter or setAttribute\n }\n connectedCallback() {\n // The _cmp may be defined if the component was immediately disconnected and then reconnected. In that case,\n // do nothing (preserve the state)\n if (!this._cmp) this._cmp = $1e5dc5e467331cb9$var$createRoot(this.shadowRoot, this._ctx);\n }\n disconnectedCallback() {\n // Check in a microtask if the element is still connected. If so, treat this as a \"move\" rather than a disconnect\n // Inspired by Vue: https://vuejs.org/guide/extras/web-components.html#building-custom-elements-with-vue\n $1e5dc5e467331cb9$var$qM(()=>{\n // this._cmp may be defined if connect-disconnect-connect-disconnect occurs synchronously\n if (!this.isConnected && this._cmp) {\n this._cmp.$destroy();\n this._cmp = undefined;\n const { database: database } = this._ctx;\n database.close()// only happens if the database failed to load in the first place, so we don't care\n .catch((err)=>console.error(err));\n }\n });\n }\n static get observedAttributes() {\n return [\n \"locale\",\n \"data-source\",\n \"skin-tone-emoji\",\n \"emoji-version\"\n ] // complex objects aren't supported, also use kebab-case\n ;\n }\n attributeChangedCallback(attrName, oldValue, newValue) {\n this._set(// convert from kebab-case to camelcase\n // see https://github.com/sveltejs/svelte/issues/3852#issuecomment-665037015\n attrName.replace(/-([a-z])/g, (_, up)=>up.toUpperCase()), // convert string attribute to float if necessary\n attrName === \"emoji-version\" ? parseFloat(newValue) : newValue);\n }\n _set(prop, newValue) {\n this._ctx[prop] = newValue;\n if (this._cmp) this._cmp.$set({\n [prop]: newValue\n });\n if ([\n \"locale\",\n \"dataSource\"\n ].includes(prop)) this._dbFlush();\n }\n _dbCreate() {\n const { locale: locale, dataSource: dataSource, database: database } = this._ctx;\n // only create a new database if we really need to\n if (!database || database.locale !== locale || database.dataSource !== dataSource) this._set(\"database\", new (0, $d1f26ac162b12b4a$export$2e2bcd8739ae039)({\n locale: locale,\n dataSource: dataSource\n }));\n }\n // Update the Database in one microtask if the locale/dataSource change. We do one microtask\n // so we don't create two Databases if e.g. both the locale and the dataSource change\n _dbFlush() {\n $1e5dc5e467331cb9$var$qM(()=>this._dbCreate());\n }\n}\nconst $1e5dc5e467331cb9$var$definitions = {};\nfor (const prop of $1e5dc5e467331cb9$var$PROPS)$1e5dc5e467331cb9$var$definitions[prop] = {\n get () {\n if (prop === \"database\") // in rare cases, the microtask may not be flushed yet, so we need to instantiate the DB\n // now if the user is asking for it\n this._dbCreate();\n return this._ctx[prop];\n },\n set (val) {\n if (prop === \"database\") throw new Error(\"database is read-only\");\n this._set(prop, val);\n }\n};\nObject.defineProperties($1e5dc5e467331cb9$export$2e2bcd8739ae039.prototype, $1e5dc5e467331cb9$var$definitions);\n/* istanbul ignore else */ if (!customElements.get(\"emoji-picker\")) customElements.define(\"emoji-picker\", $1e5dc5e467331cb9$export$2e2bcd8739ae039);\n\n\n\n\n\nvar $dec5faeb65064cfd$var$browserSupportsTextareaTextNodes;\n/**\n * @param {HTMLElement} input\n * @return {boolean}\n */ function $dec5faeb65064cfd$var$canManipulateViaTextNodes(input) {\n if (input.nodeName !== \"TEXTAREA\") return false;\n if (typeof $dec5faeb65064cfd$var$browserSupportsTextareaTextNodes === \"undefined\") {\n var textarea = document.createElement(\"textarea\");\n textarea.value = 1;\n $dec5faeb65064cfd$var$browserSupportsTextareaTextNodes = !!textarea.firstChild;\n }\n return $dec5faeb65064cfd$var$browserSupportsTextareaTextNodes;\n}\n/**\n * @param {HTMLTextAreaElement|HTMLInputElement} input\n * @param {string} text\n * @returns {void}\n */ function $dec5faeb65064cfd$var$index(input, text) {\n // Most of the used APIs only work with the field selected\n input.focus(); // IE 8-10\n if (document.selection) {\n var ieRange = document.selection.createRange();\n ieRange.text = text; // Move cursor after the inserted text\n ieRange.collapse(false);\n ieRange.select();\n return;\n } // Webkit + Edge\n var isSuccess = document.execCommand(\"insertText\", false, text);\n if (!isSuccess) {\n var start = input.selectionStart;\n var end = input.selectionEnd; // Firefox (non-standard method)\n if (typeof input.setRangeText === \"function\") input.setRangeText(text);\n else {\n // To make a change we just need a Range, not a Selection\n var range = document.createRange();\n var textNode = document.createTextNode(text);\n if ($dec5faeb65064cfd$var$canManipulateViaTextNodes(input)) {\n var node = input.firstChild; // If textarea is empty, just insert the text\n if (!node) input.appendChild(textNode);\n else {\n // Otherwise we need to find a nodes for start and end\n var offset = 0;\n var startNode = null;\n var endNode = null;\n while(node && (startNode === null || endNode === null)){\n var nodeLength = node.nodeValue.length; // if start of the selection falls into current node\n if (start >= offset && start <= offset + nodeLength) range.setStart(startNode = node, start - offset);\n // if end of the selection falls into current node\n if (end >= offset && end <= offset + nodeLength) range.setEnd(endNode = node, end - offset);\n offset += nodeLength;\n node = node.nextSibling;\n } // If there is some text selected, remove it as we should replace it\n if (start !== end) range.deleteContents();\n }\n } // If the node is a textarea and the range doesn't span outside the element\n //\n // Get the commonAncestorContainer of the selected range and test its type\n // If the node is of type `#text` it means that we're still working with text nodes within our textarea element\n // otherwise, if it's of type `#document` for example it means our selection spans outside the textarea.\n if ($dec5faeb65064cfd$var$canManipulateViaTextNodes(input) && range.commonAncestorContainer.nodeName === \"#text\") // Finally insert a new node. The browser will automatically split start and end nodes into two if necessary\n range.insertNode(textNode);\n else {\n // If the node is not a textarea or the range spans outside a textarea the only way is to replace the whole value\n var value = input.value;\n input.value = value.slice(0, start) + text + value.slice(end);\n }\n } // Correct the cursor position to be at the end of the insertion\n input.setSelectionRange(start + text.length, start + text.length); // Notify any possible listeners of the change\n var e = document.createEvent(\"UIEvent\");\n e.initEvent(\"input\", true, false);\n input.dispatchEvent(e);\n }\n}\nvar $dec5faeb65064cfd$export$2e2bcd8739ae039 = $dec5faeb65064cfd$var$index;\n\n\n/*!\n * @georapbox/capture-photo-element\n * A custom element that implements the MediaDevices.getUserMedia() method of the MediaDevices interface to capture a photo in the browser.\n *\n * @version 5.0.0\n * @homepage https://github.com/georapbox/capture-photo-element#readme\n * @author George Raptis \n * @license MIT\n */ var $636b0cf1ed0b9f88$var$c = (r, t, e)=>(Number.isNaN(t) && (t = 0), Number.isNaN(e) && (e = 0), Math.min(Math.max(r, Math.min(t, e)), Math.max(t, e)));\nvar $636b0cf1ed0b9f88$var$a = \"capture-photo\", $636b0cf1ed0b9f88$var$d = `\n :host { display: block; box-sizing: border-box; }\n :host *, :host *::before, :host *::after { box-sizing: inherit;}\n :host([hidden]), [hidden], ::slotted([hidden]) { display: none; }\n video { display: block; }\n #output:empty { display: none; }\n`, $636b0cf1ed0b9f88$var$u = document.createElement(\"template\");\n$636b0cf1ed0b9f88$var$u.innerHTML = `\n \n \n \n
\n \n \n \n \n
\n \n
\n`;\nvar $636b0cf1ed0b9f88$export$cc30a98fe3890794 = class r extends HTMLElement {\n #a = {};\n #t = null;\n #n = null;\n #h = null;\n #e = null;\n #r = null;\n #i = null;\n constructor(){\n super(), this.#a = this.getSupportedConstraints(), this.shadowRoot || this.attachShadow({\n mode: \"open\"\n }).appendChild($636b0cf1ed0b9f88$var$u.content.cloneNode(!0));\n }\n static get observedAttributes() {\n return [\n \"no-image\",\n \"pan\",\n \"tilt\",\n \"zoom\",\n \"torch\"\n ];\n }\n attributeChangedCallback(t, e, s) {\n if (!this.isConnected) return;\n let i = this.getTrackCapabilities();\n if (t === \"no-image\" && e !== s && this.#u(), t === \"pan\" && e !== s && \"pan\" in this.#a) {\n let o = \"pan\" in i && i.pan?.min && i.pan?.max ? this.pan >= i.pan.min && this.pan <= i.pan.max : !1;\n typeof this.pan == \"number\" && o && this.#o(\"pan\", this.pan);\n }\n if (t === \"tilt\" && e !== s && \"tilt\" in this.#a) {\n let o = \"tilt\" in i && i.tilt?.min && i.tilt?.max ? this.tilt >= i.tilt.min && this.tilt <= i.tilt.max : !1;\n typeof this.tilt == \"number\" && o && this.#o(\"tilt\", this.tilt);\n }\n if (t === \"zoom\" && e !== s && \"zoom\" in this.#a) {\n let o = \"zoom\" in i && i.zoom?.min && i.zoom?.max ? this.zoom >= i.zoom.min && this.zoom <= i.zoom.max : !1;\n typeof this.zoom == \"number\" && o && this.#o(\"zoom\", this.zoom);\n }\n t === \"torch\" && e !== s && \"torch\" in this.#a && this.#o(\"torch\", this.torch);\n }\n async connectedCallback() {\n if (this.#s(\"autoPlay\"), this.#s(\"noImage\"), this.#s(\"facingMode\"), this.#s(\"cameraResolution\"), this.#s(\"pan\"), this.#s(\"tilt\"), this.#s(\"zoom\"), this.#s(\"torch\"), this.#s(\"calculateFileSize\"), this.#n = this.shadowRoot?.querySelector(\"canvas\") || null, this.#h = this.shadowRoot?.getElementById(\"output\") || null, this.#e = this.shadowRoot?.querySelector(\"video\") || null, this.#r = this.shadowRoot?.querySelector('slot[name=\"capture-button\"]') || null, this.#i = this.#m(), this.#e?.addEventListener(\"loadedmetadata\", this.#c), this.#r?.addEventListener(\"slotchange\", this.#d), this.#i?.addEventListener(\"click\", this.#l), !r.isSupported()) return this.dispatchEvent(new CustomEvent(`${$636b0cf1ed0b9f88$var$a}:error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: {\n name: \"NotSupportedError\",\n message: \"Not supported\"\n }\n }\n }));\n this.autoPlay && this.startVideoStream();\n }\n disconnectedCallback() {\n this.stopVideoStream(), this.#i?.removeEventListener(\"click\", this.#l), this.#e?.removeEventListener(\"loadedmetadata\", this.#c), this.#r?.removeEventListener(\"slotchange\", this.#d);\n }\n get autoPlay() {\n return this.hasAttribute(\"auto-play\");\n }\n set autoPlay(t) {\n this.toggleAttribute(\"auto-play\", !!t);\n }\n get noImage() {\n return this.hasAttribute(\"no-image\");\n }\n set noImage(t) {\n this.toggleAttribute(\"no-image\", !!t);\n }\n get facingMode() {\n let t = this.getAttribute(\"facing-mode\");\n return t !== \"user\" ? \"environment\" : t;\n }\n set facingMode(t) {\n this.setAttribute(\"facing-mode\", t);\n }\n get cameraResolution() {\n return this.getAttribute(\"camera-resolution\") || \"\";\n }\n set cameraResolution(t) {\n this.setAttribute(\"camera-resolution\", t);\n }\n get pan() {\n return Number(this.getAttribute(\"pan\")) || 0;\n }\n set pan(t) {\n this.setAttribute(\"pan\", t != null ? t.toString() : t);\n }\n get tilt() {\n return Number(this.getAttribute(\"tilt\")) || 0;\n }\n set tilt(t) {\n this.setAttribute(\"tilt\", t != null ? t.toString() : t);\n }\n get zoom() {\n return Number(this.getAttribute(\"zoom\")) || 1;\n }\n set zoom(t) {\n this.setAttribute(\"zoom\", t != null ? t.toString() : t);\n }\n get torch() {\n return this.hasAttribute(\"torch\");\n }\n set torch(t) {\n this.toggleAttribute(\"torch\", !!t);\n }\n get calculateFileSize() {\n return this.hasAttribute(\"calculate-file-size\");\n }\n set calculateFileSize(t) {\n this.toggleAttribute(\"calculate-file-size\", !!t);\n }\n get loading() {\n return this.hasAttribute(\"loading\");\n }\n #l = (t)=>{\n t.preventDefault(), this.capture();\n };\n #c = (t)=>{\n let e = t.target;\n e.play().then(()=>{\n this.dispatchEvent(new CustomEvent(`${$636b0cf1ed0b9f88$var$a}:video-play`, {\n bubbles: !0,\n composed: !0,\n detail: {\n video: e\n }\n }));\n }).catch((s)=>{\n this.dispatchEvent(new CustomEvent(`${$636b0cf1ed0b9f88$var$a}:error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: s\n }\n }));\n }).finally(()=>{\n this.removeAttribute(\"loading\");\n });\n };\n #u() {\n this.#h && this.#h.replaceChildren();\n }\n #o(t, e) {\n if (!this.#t) return;\n let [s] = this.#t.getVideoTracks(), i = this.getTrackCapabilities(), o = this.getTrackSettings(), n = t === \"pan\" || t === \"tilt\" || t === \"zoom\" ? $636b0cf1ed0b9f88$var$c(Number(e), i[t]?.min || 1, i[t]?.max || 1) : e;\n t in o && s.applyConstraints({\n advanced: [\n {\n [t]: n\n }\n ]\n }).catch(()=>{});\n }\n #d = (t)=>{\n t.target?.name === \"capture-button\" && (this.#i?.removeEventListener(\"click\", this.#l), this.#i = this.#m(), this.#i && (this.#i.addEventListener(\"click\", this.#l), this.#i.nodeName !== \"BUTTON\" && !this.#i.hasAttribute(\"role\") && this.#i.setAttribute(\"role\", \"button\")));\n };\n #m() {\n return this.#r && this.#r.assignedElements({\n flatten: !0\n }).find((t)=>t.nodeName === \"BUTTON\" || t.getAttribute(\"slot\") === \"capture-button\") || null;\n }\n #s(t) {\n let e = this;\n if (Object.prototype.hasOwnProperty.call(e, t)) {\n let s = e[t];\n delete e[t], e[t] = s;\n }\n }\n async startVideoStream(t) {\n if (!r.isSupported() || this.#t) return;\n this.setAttribute(\"loading\", \"\");\n let e = {\n video: {\n facingMode: {\n ideal: this.facingMode\n },\n pan: !0,\n tilt: !0,\n zoom: !0,\n torch: this.torch\n },\n audio: !1\n };\n if (typeof t == \"string\" && t.trim().length > 0 && (e.video.deviceId = {\n exact: t\n }), typeof this.cameraResolution == \"string\" && this.cameraResolution.trim().length > 0) {\n let [s = 0, i = 0] = this.cameraResolution.split(\"x\").map((o)=>Number(o));\n s > 0 && i > 0 && (e.video.width = s, e.video.height = i);\n }\n try {\n this.#t = await navigator.mediaDevices.getUserMedia(e), this.#e && (this.#e.srcObject = this.#t), this.#o(\"pan\", this.pan), this.#o(\"tilt\", this.tilt), this.#o(\"zoom\", this.zoom);\n } catch (s) {\n this.dispatchEvent(new CustomEvent(`${$636b0cf1ed0b9f88$var$a}:error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: s\n }\n }));\n } finally{\n this.removeAttribute(\"loading\");\n }\n }\n restartVideoStream(t) {\n this.#t && this.#e && this.stopVideoStream(), this.startVideoStream(t);\n }\n stopVideoStream() {\n if (!this.#e || !this.#t) return;\n let [t] = this.#t.getVideoTracks();\n t?.stop(), this.#e.srcObject = null, this.#t = null;\n }\n async capture() {\n if (!(this.loading || !this.#n || !this.#e)) try {\n let t = this.#n.getContext(\"2d\"), e = this.#e.videoWidth, s = this.#e.videoHeight;\n this.#n.width = e, this.#n.height = s, t?.drawImage(this.#e, 0, 0, e, s);\n let i = this.#n.toDataURL(\"image/png\");\n if (typeof i == \"string\" && i.includes(\"data:image\")) {\n if (!this.noImage) {\n let n = new Image;\n n.src = i, n.width = e, n.height = s, n.alt = \"Captured photo\", n.setAttribute(\"part\", \"output-image\"), this.#u(), this.#h?.appendChild(n);\n }\n let o = {\n dataURI: i,\n width: e,\n height: s\n };\n if (this.calculateFileSize) try {\n let l = (await (await fetch(i)).blob()).size;\n l && (o.size = l);\n } catch {}\n this.dispatchEvent(new CustomEvent(`${$636b0cf1ed0b9f88$var$a}:success`, {\n bubbles: !0,\n composed: !0,\n detail: o\n }));\n }\n } catch (t) {\n this.dispatchEvent(new CustomEvent(`${$636b0cf1ed0b9f88$var$a}:error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n }\n }\n getSupportedConstraints() {\n return r.isSupported() ? navigator.mediaDevices.getSupportedConstraints() || {} : {};\n }\n getTrackCapabilities() {\n if (!this.#t) return {};\n let [t] = this.#t.getVideoTracks();\n return t && typeof t.getCapabilities == \"function\" ? t.getCapabilities() || {} : {};\n }\n getTrackSettings() {\n if (!this.#t) return {};\n let [t] = this.#t.getVideoTracks();\n return t && typeof t.getSettings == \"function\" ? t.getSettings() || {} : {};\n }\n static async getVideoInputDevices() {\n return !navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices ? [] : (await navigator.mediaDevices.enumerateDevices() || []).filter((e)=>e.kind === \"videoinput\" && !!e.deviceId);\n }\n static isSupported() {\n return !!navigator.mediaDevices?.getUserMedia;\n }\n static defineCustomElement(t = $636b0cf1ed0b9f88$var$a) {\n typeof window < \"u\" && !window.customElements.get(t) && window.customElements.define(t, r);\n }\n};\n$636b0cf1ed0b9f88$export$cc30a98fe3890794.defineCustomElement();\n\n\n/*!\n * @georapbox/web-share-element\n * A custom element that implements the Web Share API to share user-defined data.\n *\n * @version 3.1.1\n * @homepage https://github.com/georapbox/web-share-element#readme\n * @author George Raptis \n * @license MIT\n */ function $94933cc6427541bd$export$c37129e465f64ef0(a) {\n return a !== null && typeof a == \"object\" ? \"share\" in navigator && \"canShare\" in navigator && navigator.canShare(a) : \"share\" in navigator;\n}\n\n\n/*!\n * @georapbox/web-share-element\n * A custom element that implements the Web Share API to share user-defined data.\n *\n * @version 3.1.1\n * @homepage https://github.com/georapbox/web-share-element#readme\n * @author George Raptis \n * @license MIT\n */ var $4f74a8126e204146$var$h = `\n :host {\n display: inline-block;\n }\n`, $4f74a8126e204146$var$r = document.createElement(\"template\");\n$4f74a8126e204146$var$r.innerHTML = `\n \n \n`;\nvar $4f74a8126e204146$export$30b344bef3e55b67 = class a extends HTMLElement {\n #e;\n #t;\n #r = [];\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\",\n delegatesFocus: !0\n }).appendChild($4f74a8126e204146$var$r.content.cloneNode(!0)), this.#e = this.shadowRoot?.querySelector('slot[name=\"button\"]') || null, this.#t = this.#h();\n }\n static get observedAttributes() {\n return [\n \"disabled\"\n ];\n }\n attributeChangedCallback(t, e, i) {\n t === \"disabled\" && e !== i && this.#t && (this.#t.toggleAttribute(\"disabled\", this.disabled), this.#t.setAttribute(\"aria-disabled\", this.disabled.toString()), this.#t.part && this.#t.part.contains(\"button\") && this.#t.part.toggle(\"button--disabled\", this.disabled));\n }\n connectedCallback() {\n this.#s(\"shareUrl\"), this.#s(\"shareTitle\"), this.#s(\"shareText\"), this.#s(\"shareFiles\"), this.#s(\"disabled\"), this.#e?.addEventListener(\"slotchange\", this.#a), this.#t?.addEventListener(\"click\", this.#i);\n }\n disconnectedCallback() {\n this.#e?.removeEventListener(\"slotchange\", this.#a), this.#t?.removeEventListener(\"click\", this.#i);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(t) {\n this.toggleAttribute(\"disabled\", !!t);\n }\n get shareUrl() {\n return this.getAttribute(\"share-url\") || \"\";\n }\n set shareUrl(t) {\n this.setAttribute(\"share-url\", t);\n }\n get shareTitle() {\n return this.getAttribute(\"share-title\") || \"\";\n }\n set shareTitle(t) {\n this.setAttribute(\"share-title\", t);\n }\n get shareText() {\n return this.getAttribute(\"share-text\") || \"\";\n }\n set shareText(t) {\n this.setAttribute(\"share-text\", t);\n }\n get shareFiles() {\n return this.#r;\n }\n set shareFiles(t) {\n Array.isArray(t) && t.length > 0 && (this.#r = t);\n }\n async share() {\n if (!this.disabled) try {\n let t = {};\n this.shareUrl && (t.url = this.shareUrl), this.shareTitle && (t.title = this.shareTitle), this.shareText && (t.text = this.shareText), Array.isArray(this.shareFiles) && this.shareFiles.length > 0 && navigator.canShare && navigator.canShare({\n files: this.shareFiles\n }) && (t.files = this.shareFiles), await navigator.share(t), this.dispatchEvent(new CustomEvent(\"web-share:success\", {\n bubbles: !0,\n composed: !0,\n detail: {\n shareData: t\n }\n }));\n } catch (t) {\n if (t instanceof Error && t.name === \"AbortError\") {\n this.dispatchEvent(new CustomEvent(\"web-share:abort\", {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n return;\n }\n this.dispatchEvent(new CustomEvent(\"web-share:error\", {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n }\n }\n #i = (t)=>{\n t.preventDefault(), !this.disabled && this.share();\n };\n #a = (t)=>{\n t.target && t.target.name === \"button\" && (this.#t?.removeEventListener(\"click\", this.#i), this.#t = this.#h(), this.#t && (this.#t.addEventListener(\"click\", this.#i), this.#t.nodeName !== \"BUTTON\" && !this.#t.hasAttribute(\"role\") && this.#t.setAttribute(\"role\", \"button\")));\n };\n #h() {\n return this.#e && this.#e.assignedElements({\n flatten: !0\n }).find((t)=>t.nodeName === \"BUTTON\" || t.getAttribute(\"slot\") === \"button\") || null;\n }\n #s(t) {\n let e = this;\n if (Object.prototype.hasOwnProperty.call(e, t)) {\n let i = e[t];\n delete e[t], e[t] = i;\n }\n }\n static defineCustomElement(t = \"web-share\") {\n typeof window < \"u\" && !window.customElements.get(t) && window.customElements.define(t, a);\n }\n};\n$4f74a8126e204146$export$30b344bef3e55b67.defineCustomElement();\n\n\n/*!\n * @georapbox/modal-element\n * A custom element to create a modal, using the native dialog element under the hood.\n *\n * @version 1.8.0\n * @homepage https://github.com/georapbox/modal-element#readme\n * @author George Raptis \n * @license MIT\n */ var $4da30046ce6d9325$var$n = document.createElement(\"template\"), $4da30046ce6d9325$var$r = `\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-color: canvastext;\n\n --me-header-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-header-color: initial;\n\n --me-body-spacing: 1rem;\n --me-body-background-color: transparent;\n --me-body-color: initial;\n --me-footer-background-color: transparent;\n --me-footer-color: initial;\n\n --me-close-padding: 0.4375rem;\n --me-close-border: none;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-close-color: inherit;\n --me-close-font-size: 1rem;\n\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n --dialog-placement-margin: calc((2em + 6px) / 2);\n\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n color: var(--me-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n /* Dialog placement */\n :host(:not([fullscreen])[placement=\"top-start\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-center\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-end\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center-start\"]) .dialog {\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center\"]) .dialog {\n margin: auto;\n }\n\n :host(:not([fullscreen])[placement=\"center-end\"]) .dialog {\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-start\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-center\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-end\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n /* Dialog animations */\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: 300ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n color: var(--me-header-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n color: var(--me-body-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: end;\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n color: var(--me-footer-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: var(--me-close-padding);\n border: var(--me-close-border);\n border-radius: var(--me-close-border-radius);\n background-color: var(--me-close-background-color);\n color: var(--me-close-color);\n font-size: var(--me-close-font-size);\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n$4da30046ce6d9325$var$n.innerHTML = `\n \n\n \n
\n
\n \n\n
\n \n
\n
\n\n \n\n
\n \n
\n
\n
\n`;\nvar $4da30046ce6d9325$export$32589115725b904b = class s extends HTMLElement {\n #e = null;\n #i = null;\n #a = null;\n #o = void 0;\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\"\n }).appendChild($4da30046ce6d9325$var$n.content.cloneNode(!0)), this.shadowRoot && (this.#e = this.shadowRoot.querySelector(\"dialog\"), this.#i = this.shadowRoot.querySelector('slot[name=\"footer\"]'), this.#a = this.shadowRoot.querySelector('slot[name=\"close\"]'));\n }\n static get observedAttributes() {\n return [\n \"open\",\n \"no-header\",\n \"no-animations\",\n \"no-close-button\",\n \"close-label\"\n ];\n }\n attributeChangedCallback(e, t, i) {\n if (this.#e !== null) {\n if (e === \"open\" && t !== i && (this.open ? (this.#e.showModal(), this.dispatchEvent(new CustomEvent(\"me-open\", {\n bubbles: !0,\n composed: !0,\n detail: {\n element: this\n }\n })), document.body && !this.preserveOverflow && (document.body.style.overflow = \"hidden\")) : this.#e.close()), e === \"no-header\" && t !== i) {\n let o = this.#e.querySelector(\".dialog__header\");\n o !== null && (o.hidden = this.noHeader);\n }\n if (e === \"no-animations\" && t !== i && this.#e.classList.toggle(\"dialog--no-animations\", this.noAnimations), e === \"no-close-button\" && t !== i) {\n let o = this.#e.querySelector(\".dialog__close\");\n o !== null && (o.hidden = this.noCloseButton);\n }\n e === \"close-label\" && t !== i && this.#r();\n }\n }\n connectedCallback() {\n this.#t(\"open\"), this.#t(\"staticBackdrop\"), this.#t(\"noHeader\"), this.#t(\"noAnimations\"), this.#t(\"noCloseButton\"), this.#t(\"fullscreen\"), this.#t(\"preserveOverflow\"), this.#t(\"placement\"), this.#t(\"closeLabel\"), this.#e?.addEventListener(\"click\", this.#h), this.#e?.addEventListener(\"close\", this.#l), this.#e?.addEventListener(\"cancel\", this.#d), this.#e?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\", this.#c), this.#i?.addEventListener(\"slotchange\", this.#m), this.#a?.addEventListener(\"slotchange\", this.#g);\n }\n disconnectedCallback() {\n this.#o && clearTimeout(this.#o), this.#e?.addEventListener(\"click\", this.#h), this.#e?.removeEventListener(\"close\", this.#l), this.#e?.removeEventListener(\"cancel\", this.#d), this.#e?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\", this.#c), this.#i?.removeEventListener(\"slotchange\", this.#m), this.#a?.removeEventListener(\"slotchange\", this.#g);\n }\n get open() {\n return this.hasAttribute(\"open\");\n }\n set open(e) {\n this.toggleAttribute(\"open\", !!e);\n }\n get staticBackdrop() {\n return this.hasAttribute(\"static-backdrop\");\n }\n set staticBackdrop(e) {\n this.toggleAttribute(\"static-backdrop\", !!e);\n }\n get noHeader() {\n return this.hasAttribute(\"no-header\");\n }\n set noHeader(e) {\n this.toggleAttribute(\"no-header\", !!e);\n }\n get noAnimations() {\n return this.hasAttribute(\"no-animations\");\n }\n set noAnimations(e) {\n this.toggleAttribute(\"no-animations\", !!e);\n }\n get noCloseButton() {\n return this.hasAttribute(\"no-close-button\");\n }\n set noCloseButton(e) {\n this.toggleAttribute(\"no-close-button\", !!e);\n }\n get fullscreen() {\n return this.hasAttribute(\"fullscreen\");\n }\n set fullscreen(e) {\n this.toggleAttribute(\"fullscreen\", !!e);\n }\n get preserveOverflow() {\n return this.hasAttribute(\"preserve-overflow\");\n }\n set preserveOverflow(e) {\n this.toggleAttribute(\"preserve-overflow\", !!e);\n }\n get placement() {\n return this.getAttribute(\"placement\") || \"center\";\n }\n set placement(e) {\n this.setAttribute(\"placement\", e != null ? e.toString() : e);\n }\n get closeLabel() {\n return this.getAttribute(\"close-label\") || \"Close\";\n }\n set closeLabel(e) {\n this.setAttribute(\"close-label\", e != null ? e.toString() : e);\n }\n #r() {\n if (this.#e === null) return;\n let e = this.#e.querySelector(\".dialog__close\");\n if (e === null) return;\n (this.#a?.assignedElements() || [])?.some((o)=>o.textContent?.replace(/\\s/g, \"\") !== \"\") ? e.removeAttribute(\"aria-label\") : e.setAttribute(\"aria-label\", this.closeLabel);\n }\n #n() {\n this.#o || (this.#e?.classList.add(\"dialog--pulse\"), this.#o = setTimeout(()=>{\n this.#e?.classList.remove(\"dialog--pulse\"), clearTimeout(this.#o), this.#o = void 0;\n }, 300));\n }\n #l = ()=>{\n this.open = !1, this.dispatchEvent(new CustomEvent(\"me-close\", {\n bubbles: !0,\n composed: !0,\n detail: {\n element: this\n }\n })), document.body && !this.preserveOverflow && (document.body.style.overflow = \"\");\n };\n #d = (e)=>{\n let t = this.#s(\"escape-key\");\n this.dispatchEvent(t), t.defaultPrevented && (e.preventDefault(), !this.noAnimations && this.#n());\n };\n #c = (e)=>{\n let t = this.#s(\"close-button\");\n this.dispatchEvent(t), t.defaultPrevented && (e.preventDefault(), !this.noAnimations && this.#n());\n };\n #h = (e)=>{\n let t = e.target, i = e.currentTarget;\n if (t === i) {\n let o = this.#s(\"backdrop-click\");\n this.dispatchEvent(o), o.defaultPrevented || this.staticBackdrop ? !this.noAnimations && this.#n() : this.hide();\n }\n if (t instanceof HTMLElement && t.closest(\"[data-me-close]\") !== null) {\n let o = this.#s(\"external-invoker\");\n this.dispatchEvent(o), o.defaultPrevented ? !this.noAnimations && this.#n() : this.hide();\n }\n };\n #m = ()=>{\n if (this.#e === null) return;\n let e = this.#e.querySelector(\".dialog__footer\");\n if (e === null) return;\n let t = this.#i?.assignedNodes(), i = t ? t.length > 0 : !1;\n e.hidden = !i;\n };\n #g = ()=>{\n this.#r();\n };\n #s(e) {\n return new CustomEvent(\"me-request-close\", {\n bubbles: !0,\n composed: !0,\n cancelable: !0,\n detail: {\n reason: e,\n element: this\n }\n });\n }\n #t(e) {\n let t = this;\n if (Object.prototype.hasOwnProperty.call(t, e)) {\n let i = t[e];\n delete t[e], t[e] = i;\n }\n }\n show() {\n this.open || (this.open = !0);\n }\n hide() {\n this.open && (this.open = !1);\n }\n static defineCustomElement(e = \"modal-element\") {\n typeof window < \"u\" && !window.customElements.get(e) && window.customElements.define(e, s);\n }\n};\n$4da30046ce6d9325$export$32589115725b904b.defineCustomElement();\n\n\n/*!\n * @georapbox/files-dropzone-element\n * A custom element that creates a drag and drop zone for files\n *\n * @version 2.0.1\n * @homepage https://github.com/georapbox/files-dropzone-element#readme\n * @author George Raptis \n * @license MIT\n */ function $7aad62ebc3d6fae8$var$u(o, e = \"\") {\n if (!e) return !0;\n let t = [\n ...new Set(e.split(\",\").map((r)=>r.trim()).filter(Boolean))\n ], i = o.type, s = i.replace(/\\/.*$/, \"\");\n for (let r of t)if (r.charAt(0) === \".\") {\n if (o.name.toLowerCase().indexOf(r.toLowerCase(), o.name.length - r.length) !== -1) return !0;\n } else if (/\\/\\*$/.test(r)) {\n if (s === r.replace(/\\/.*$/, \"\")) return !0;\n } else if (i === r) return !0;\n return !1;\n}\nvar $7aad62ebc3d6fae8$var$x = new Map([\n [\n \"aac\",\n \"audio/aac\"\n ],\n [\n \"abw\",\n \"application/x-abiword\"\n ],\n [\n \"arc\",\n \"application/x-freearc\"\n ],\n [\n \"avif\",\n \"image/avif\"\n ],\n [\n \"avi\",\n \"video/x-msvideo\"\n ],\n [\n \"azw\",\n \"application/vnd.amazon.ebook\"\n ],\n [\n \"bin\",\n \"application/octet-stream\"\n ],\n [\n \"bmp\",\n \"image/bmp\"\n ],\n [\n \"bz\",\n \"application/x-bzip\"\n ],\n [\n \"bz2\",\n \"application/x-bzip2\"\n ],\n [\n \"cda\",\n \"application/x-cdf\"\n ],\n [\n \"csh\",\n \"application/x-csh\"\n ],\n [\n \"css\",\n \"text/css\"\n ],\n [\n \"csv\",\n \"text/csv\"\n ],\n [\n \"doc\",\n \"application/msword\"\n ],\n [\n \"docx\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n ],\n [\n \"eot\",\n \"application/vnd.ms-fontobject\"\n ],\n [\n \"epub\",\n \"application/epub+zip\"\n ],\n [\n \"gz\",\n \"application/gzip\"\n ],\n [\n \"gif\",\n \"image/gif\"\n ],\n [\n \"heic\",\n \"image/heic\"\n ],\n [\n \"heif\",\n \"image/heif\"\n ],\n [\n \"htm\",\n \"text/html\"\n ],\n [\n \"html\",\n \"text/html\"\n ],\n [\n \"ico\",\n \"image/vnd.microsoft.icon\"\n ],\n [\n \"ics\",\n \"text/calendar\"\n ],\n [\n \"jar\",\n \"application/java-archive\"\n ],\n [\n \"jpeg\",\n \"image/jpeg\"\n ],\n [\n \"jpg\",\n \"image/jpeg\"\n ],\n [\n \"jxl\",\n \"image/jxl\"\n ],\n [\n \"js\",\n \"text/javascript\"\n ],\n [\n \"json\",\n \"application/json\"\n ],\n [\n \"jsonld\",\n \"application/ld+json\"\n ],\n [\n \"markdown\",\n \"text/markdown\"\n ],\n [\n \"md\",\n \"text/markdown\"\n ],\n [\n \"mid\",\n \"audio/midi\"\n ],\n [\n \"midi\",\n \"audio/midi\"\n ],\n [\n \"mjs\",\n \"text/javascript\"\n ],\n [\n \"mp3\",\n \"audio/mpeg\"\n ],\n [\n \"mp4\",\n \"video/mp4\"\n ],\n [\n \"mpeg\",\n \"video/mpeg\"\n ],\n [\n \"mpkg\",\n \"application/vnd.apple.installer+xml\"\n ],\n [\n \"odp\",\n \"application/vnd.oasis.opendocument.presentation\"\n ],\n [\n \"ods\",\n \"application/vnd.oasis.opendocument.spreadsheet\"\n ],\n [\n \"odt\",\n \"application/vnd.oasis.opendocument.text\"\n ],\n [\n \"oga\",\n \"audio/ogg\"\n ],\n [\n \"ogv\",\n \"video/ogg\"\n ],\n [\n \"ogx\",\n \"application/ogg\"\n ],\n [\n \"opus\",\n \"audio/opus\"\n ],\n [\n \"otf\",\n \"font/otf\"\n ],\n [\n \"png\",\n \"image/png\"\n ],\n [\n \"pdf\",\n \"application/pdf\"\n ],\n [\n \"php\",\n \"application/x-httpd-php\"\n ],\n [\n \"ppt\",\n \"application/vnd.ms-powerpoint\"\n ],\n [\n \"pptx\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n ],\n [\n \"rar\",\n \"application/vnd.rar\"\n ],\n [\n \"rtf\",\n \"application/rtf\"\n ],\n [\n \"sh\",\n \"application/x-sh\"\n ],\n [\n \"svg\",\n \"image/svg+xml\"\n ],\n [\n \"swf\",\n \"application/x-shockwave-flash\"\n ],\n [\n \"tar\",\n \"application/x-tar\"\n ],\n [\n \"tif\",\n \"image/tiff\"\n ],\n [\n \"tiff\",\n \"image/tiff\"\n ],\n [\n \"ts\",\n \"video/mp2t\"\n ],\n [\n \"ttf\",\n \"font/ttf\"\n ],\n [\n \"txt\",\n \"text/plain\"\n ],\n [\n \"vsd\",\n \"application/vnd.visio\"\n ],\n [\n \"wav\",\n \"audio/wav\"\n ],\n [\n \"weba\",\n \"audio/webm\"\n ],\n [\n \"webm\",\n \"video/webm\"\n ],\n [\n \"webp\",\n \"image/webp\"\n ],\n [\n \"woff\",\n \"font/woff\"\n ],\n [\n \"woff2\",\n \"font/woff2\"\n ],\n [\n \"xhtml\",\n \"application/xhtml+xml\"\n ],\n [\n \"xls\",\n \"application/vnd.ms-excel\"\n ],\n [\n \"xlsx\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n ],\n [\n \"xml\",\n \"application/xml\"\n ],\n [\n \"xul\",\n \"application/vnd.mozilla.xul+xml\"\n ],\n [\n \"zip\",\n \"application/zip\"\n ],\n [\n \"7z\",\n \"application/x-7z-compressed\"\n ],\n [\n \"mkv\",\n \"video/x-matroska\"\n ],\n [\n \"mov\",\n \"video/quicktime\"\n ],\n [\n \"msg\",\n \"application/vnd.ms-outlook\"\n ]\n]), $7aad62ebc3d6fae8$var$b = [\n \".DS_Store\",\n \"Thumbs.db\"\n], $7aad62ebc3d6fae8$var$y = (o)=>{\n let { name: e } = o;\n if (e && e.lastIndexOf(\".\") !== -1 && !o.type) {\n let i = (e.split(\".\").pop() || \"\").toLowerCase(), s = $7aad62ebc3d6fae8$var$x.get(i);\n s && Object.defineProperty(o, \"type\", {\n value: s,\n writable: !1,\n configurable: !1,\n enumerable: !0\n });\n }\n return o;\n}, $7aad62ebc3d6fae8$var$g = (o, e)=>{\n let t = $7aad62ebc3d6fae8$var$y(o);\n if (typeof t.path != \"string\") {\n let { webkitRelativePath: i } = o;\n Object.defineProperty(t, \"path\", {\n value: typeof e == \"string\" ? e : i || o.name,\n writable: !1,\n configurable: !1,\n enumerable: !0\n });\n }\n return t;\n}, $7aad62ebc3d6fae8$var$m = async (o)=>await new Promise((e, t)=>{\n o.readEntries(e, t);\n }), $7aad62ebc3d6fae8$var$w = async (o)=>{\n let e = [], t = await $7aad62ebc3d6fae8$var$m(o);\n for(; t.length > 0;)e.push(...t), t = await $7aad62ebc3d6fae8$var$m(o);\n return e;\n}, $7aad62ebc3d6fae8$var$E = (o)=>new Promise((e, t)=>{\n o.file((i)=>e($7aad62ebc3d6fae8$var$g(i, o.fullPath)), t);\n }), $7aad62ebc3d6fae8$var$F = async (o)=>{\n let e = [], t = [];\n for (let i of o){\n if (i.kind !== \"file\") continue;\n let s = i.getAsEntry ? i.getAsEntry() : i.webkitGetAsEntry();\n t.push(s);\n }\n for(; t.length > 0;){\n let i = t.shift();\n if (i) {\n if (i.isFile) {\n let s = await $7aad62ebc3d6fae8$var$E(i);\n $7aad62ebc3d6fae8$var$b.indexOf(s.name) === -1 && e.push(s);\n } else i.isDirectory && t.push(...await $7aad62ebc3d6fae8$var$w(i.createReader()));\n } else continue;\n }\n return e;\n}, $7aad62ebc3d6fae8$var$f = async (o)=>{\n let e = [];\n for (let t of o)$7aad62ebc3d6fae8$var$b.indexOf(t.name) === -1 && e.push($7aad62ebc3d6fae8$var$g(t));\n return e;\n}, $7aad62ebc3d6fae8$var$l = async (o)=>o.dataTransfer ? o.dataTransfer.items ? await $7aad62ebc3d6fae8$var$F(o.dataTransfer.items) : await $7aad62ebc3d6fae8$var$f(o.dataTransfer.files) : await $7aad62ebc3d6fae8$var$f(o.target.files);\nvar $7aad62ebc3d6fae8$var$n = \"files-dropzone\", $7aad62ebc3d6fae8$var$v = \"TOO_MANY_FILES\", $7aad62ebc3d6fae8$var$L = \"FILE_TOO_LARGE\", $7aad62ebc3d6fae8$var$k = \"FILE_TOO_SMALL\", $7aad62ebc3d6fae8$var$A = \"INVALID_MIME_TYPE\", $7aad62ebc3d6fae8$var$z = document.createElement(\"template\"), $7aad62ebc3d6fae8$var$S = `\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n$7aad62ebc3d6fae8$var$z.innerHTML = `\n \n\n \n\n
\n Drag 'n' drop files here, or click to select files\n
\n`;\nvar $7aad62ebc3d6fae8$export$6ccd1735166caad9 = class o extends HTMLElement {\n #t = null;\n #e = null;\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\",\n delegatesFocus: !0\n }).appendChild($7aad62ebc3d6fae8$var$z.content.cloneNode(!0)), this.shadowRoot && (this.#t = this.shadowRoot.getElementById(\"file-input\"), this.#e = this.shadowRoot.getElementById(\"dropzone\"));\n }\n static get observedAttributes() {\n return [\n \"accept\",\n \"disabled\",\n \"multiple\"\n ];\n }\n attributeChangedCallback(e, t, i) {\n e === \"accept\" && t !== i && this.#t && (this.#t.accept = this.accept), e === \"disabled\" && t !== i && this.#t && (this.#t.disabled = this.disabled, this.disabled ? (this.#e?.removeAttribute(\"tabindex\"), this.#e?.setAttribute(\"aria-disabled\", \"true\")) : (this.#e?.setAttribute(\"tabindex\", \"0\"), this.#e?.setAttribute(\"aria-disabled\", \"false\"))), e === \"multiple\" && t !== i && this.#t && (this.#t.multiple = this.multiple);\n }\n connectedCallback() {\n this.#o(\"accept\"), this.#o(\"disabled\"), this.#o(\"maxFiles\"), this.#o(\"maxSize\"), this.#o(\"minSize\"), this.#o(\"multiple\"), this.#o(\"autoFocus\"), this.#o(\"noStyle\"), this.#t?.addEventListener(\"change\", this.#i), this.#e?.addEventListener(\"dragenter\", this.#r), this.#e?.addEventListener(\"dragover\", this.#s), this.#e?.addEventListener(\"dragleave\", this.#n), this.#e?.addEventListener(\"drop\", this.#a), this.#e?.addEventListener(\"click\", this.#d), this.#e?.addEventListener(\"keyup\", this.#l), this.autoFocus && this.#e?.focus();\n }\n disconnectedCallback() {\n this.#t?.removeEventListener(\"change\", this.#i), this.#e?.removeEventListener(\"dragenter\", this.#r), this.#e?.removeEventListener(\"dragover\", this.#s), this.#e?.removeEventListener(\"dragleave\", this.#n), this.#e?.removeEventListener(\"drop\", this.#a), this.#e?.removeEventListener(\"click\", this.#d), this.#e?.removeEventListener(\"keyup\", this.#l);\n }\n get accept() {\n return this.getAttribute(\"accept\") || \"\";\n }\n set accept(e) {\n this.setAttribute(\"accept\", e != null ? e.toString() : e);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(e) {\n this.toggleAttribute(\"disabled\", !!e);\n }\n get maxFiles() {\n let e = Number(this.getAttribute(\"max-files\")) || 0;\n return e <= 0 ? 1 / 0 : Math.floor(Math.abs(e));\n }\n set maxFiles(e) {\n this.setAttribute(\"max-files\", e != null ? e.toString() : e);\n }\n get maxSize() {\n let e = this.getAttribute(\"max-size\");\n if (e === null) return 1 / 0;\n let t = Number(e);\n return Number.isNaN(t) ? 1 / 0 : t;\n }\n set maxSize(e) {\n this.setAttribute(\"max-size\", e != null ? e.toString() : e);\n }\n get minSize() {\n let e = this.getAttribute(\"min-size\");\n if (e === null) return 0;\n let t = Number(e);\n return Number.isNaN(t) ? 0 : t;\n }\n set minSize(e) {\n this.setAttribute(\"min-size\", e != null ? e.toString() : e);\n }\n get multiple() {\n return this.hasAttribute(\"multiple\");\n }\n set multiple(e) {\n this.toggleAttribute(\"multiple\", !!e);\n }\n get autoFocus() {\n return this.hasAttribute(\"auto-focus\");\n }\n set autoFocus(e) {\n this.toggleAttribute(\"auto-focus\", !!e);\n }\n get noStyle() {\n return this.hasAttribute(\"no-style\");\n }\n set noStyle(e) {\n this.toggleAttribute(\"no-style\", !!e);\n }\n #i = async (e)=>{\n try {\n this.#c(await $7aad62ebc3d6fae8$var$l(e));\n } catch (t) {\n this.dispatchEvent(new CustomEvent(`${$7aad62ebc3d6fae8$var$n}-error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n }\n };\n #r = ()=>{\n this.disabled || this.dispatchEvent(new Event(`${$7aad62ebc3d6fae8$var$n}-dragenter`, {\n bubbles: !0,\n composed: !0\n }));\n };\n #s = (e)=>{\n if (e.preventDefault(), this.disabled) {\n e.dataTransfer.dropEffect = \"none\";\n return;\n }\n e.dataTransfer.dropEffect = \"copy\", this.#e && (this.#e.classList.add(\"dropzone--dragover\"), this.#e.part.add(\"dropzone--dragover\")), this.dispatchEvent(new Event(`${$7aad62ebc3d6fae8$var$n}-dragover`, {\n bubbles: !0,\n composed: !0\n }));\n };\n #n = ()=>{\n this.disabled || (this.#e && (this.#e.classList.remove(\"dropzone--dragover\"), this.#e.part.remove(\"dropzone--dragover\")), this.dispatchEvent(new Event(`${$7aad62ebc3d6fae8$var$n}-dragleave`, {\n bubbles: !0,\n composed: !0\n })));\n };\n #a = async (e)=>{\n if (!this.disabled) {\n e.preventDefault(), this.#e && (this.#e.classList.remove(\"dropzone--dragover\"), this.#e.part.remove(\"dropzone--dragover\"));\n try {\n this.#c(await $7aad62ebc3d6fae8$var$l(e));\n } catch (t) {\n this.dispatchEvent(new CustomEvent(`${$7aad62ebc3d6fae8$var$n}-error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n }\n }\n };\n #d = ()=>{\n this.disabled || this.#t?.click();\n };\n #l = (e)=>{\n this.disabled || (e.key === \" \" || e.key === \"Enter\") && this.#t?.click();\n };\n #c(e) {\n if (!Array.isArray(e) || !e.length) return;\n let t = [], i = [], s = e.length;\n if (!this.multiple && s > 1) for (let r of e)i.push({\n file: r,\n errors: [\n {\n code: $7aad62ebc3d6fae8$var$v,\n message: \"Too many files selected. Only 1 file is allowed.\"\n }\n ]\n });\n else if (this.multiple && s > this.maxFiles) for (let r of e)i.push({\n file: r,\n errors: [\n {\n code: $7aad62ebc3d6fae8$var$v,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? \"files are\" : \"file is\"} allowed.`\n }\n ]\n });\n else for (let r of e){\n let c = $7aad62ebc3d6fae8$var$u(r, this.accept), p = r.size > this.maxSize, h = r.size < this.minSize;\n if (c && !p && !h) t.push(r);\n else {\n let a = [];\n c || a.push({\n code: $7aad62ebc3d6fae8$var$A,\n message: `File type \"${r.type}\" is not accepted.`\n }), p && a.push({\n code: $7aad62ebc3d6fae8$var$L,\n message: `File size ${r.size} exceeds the maximum size of ${this.maxSize}.`\n }), h && a.push({\n code: $7aad62ebc3d6fae8$var$k,\n message: `File size ${r.size} is smaller than the minimum size of ${this.minSize}.`\n }), i.push({\n file: r,\n errors: a\n });\n }\n }\n this.dispatchEvent(new CustomEvent(`${$7aad62ebc3d6fae8$var$n}-drop`, {\n bubbles: !0,\n composed: !0,\n detail: {\n acceptedFiles: t,\n rejectedFiles: i\n }\n })), t.length > 0 && this.dispatchEvent(new CustomEvent(`${$7aad62ebc3d6fae8$var$n}-drop-accepted`, {\n bubbles: !0,\n composed: !0,\n detail: {\n acceptedFiles: t\n }\n })), i.length > 0 && this.dispatchEvent(new CustomEvent(`${$7aad62ebc3d6fae8$var$n}-drop-rejected`, {\n bubbles: !0,\n composed: !0,\n detail: {\n rejectedFiles: i\n }\n })), this.#t && (this.#t.value = this.#t.defaultValue);\n }\n openFileDialog() {\n this.disabled || this.#t?.click();\n }\n #o(e) {\n let t = this;\n if (Object.prototype.hasOwnProperty.call(t, e)) {\n let i = t[e];\n delete t[e], t[e] = i;\n }\n }\n static defineCustomElement(e = $7aad62ebc3d6fae8$var$n) {\n typeof window < \"u\" && !window.customElements.get(e) && window.customElements.define(e, o);\n }\n};\n$7aad62ebc3d6fae8$export$6ccd1735166caad9.defineCustomElement();\n\n\n\n\nconst $33dea9d9a6da4c9a$export$63e7bed68b07a85c = [\n \"image/jpg\",\n \"image/jpeg\",\n \"image/png\",\n \"image/apng\",\n \"image/gif\",\n \"image/webp\",\n \"image/avif\"\n];\nconst $33dea9d9a6da4c9a$export$62045be72fe457b4 = 20;\nconst $33dea9d9a6da4c9a$export$8f089f0a062560ff = 20;\nconst $33dea9d9a6da4c9a$export$d3f4819a57998cf7 = 360;\n\n\n/**\n * Generates a unique id of the form `${prefix}-${randomString}-${suffix}`.\n *\n * @param {string} [prefix=''] - The prefix to use for the id.\n * @param {string} [suffix=''] - The suffix to use for the id.\n * @returns {string} - The unique id.\n */ const $21c3f3a8dccfa4fd$export$e2a22331486dcca0 = (prefix = \"\", suffix = \"\")=>{\n const prefixString = typeof prefix === \"string\" && prefix !== \"\" ? prefix + \"-\" : \"\";\n const suffixString = typeof suffix === \"string\" && suffix !== \"\" ? \"-\" + suffix : \"\";\n const randomString = Math.random().toString(36).substring(2, 8); // Pseudo-random string of six alphanumeric characters.\n return `${prefixString}${randomString}${suffixString}`;\n};\n\n\n\nconst $c3d7e05a1ce34ed5$export$6539e087749cf9d3 = async (options = {})=>{\n const res = await fetch(options.url);\n const blob = await res.blob();\n const mimeType = options.mimeType || blob.type || \"\";\n if (!(0, $33dea9d9a6da4c9a$export$63e7bed68b07a85c).includes(mimeType)) throw new Error(`This is not an accepted image format. Accepted MIME types are: ${(0, $33dea9d9a6da4c9a$export$63e7bed68b07a85c).join(\", \")}`);\n return new File([\n blob\n ], options.filename || \"\", blob);\n};\n\n\n/**\n * A class representing a storage utility for managing data in `localStorage` or `sessionStorage`.\n */ class $f0a2ccd611c71db8$export$bf2a15d34f3c441c {\n /**\n * The prefix to be added to all keys.\n *\n * @type {string}\n * @private\n */ #keyPrefix = null;\n /**\n * The storage provider (`localStorage` or `sessionStorage`).\n *\n * @type {Storage}\n * @private\n */ #provider = null;\n /**\n * Creates an instance of Storage.\n *\n * @param {string} prefix - The prefix to be added to all keys when storing/retrieving data.\n * @param {Storage} [provider=localStorage] - The storage provider (`localStorage` or `sessionStorage`).\n * @throws {Error} If prefix is not provided or if the provider is not supported.\n */ constructor(prefix, provider = localStorage){\n if (!prefix) throw new Error(\"Storage prefix is required\");\n if (provider !== localStorage && provider !== sessionStorage) throw new Error(\"Storage provider is not supported\");\n this.#keyPrefix = prefix;\n this.#provider = provider;\n }\n /**\n * Sets a key-value pair in the storage.\n *\n * @param {string} key - The key for the data.\n * @param {*} value - The value to be stored (will be converted to JSON string).\n */ set(key, value) {\n try {\n this.#provider.setItem(`${this.#keyPrefix}${key}`, JSON.stringify(value));\n } catch (err) {\n console.error(\"Error saving to storage\", err);\n }\n }\n /**\n * Retrieves the value associated with the given key from the storage.\n *\n * @param {string} key - The key to retrieve the value for.\n * @returns {*} The value associated with the key, or `null` if key is not found or an error occurs.\n */ get(key) {\n try {\n const value = this.#provider.getItem(`${this.#keyPrefix}${key}`);\n return value ? JSON.parse(value) : null;\n } catch (err) {\n console.error(\"Error getting from storage\", err);\n return null;\n }\n }\n}\nconst $f0a2ccd611c71db8$var$DEFAULT_STORAGE_PREFIX = \"meme-generator/\";\nconst $f0a2ccd611c71db8$var$DEFAULT_STORAGE_PROVIDER = localStorage;\nconst $f0a2ccd611c71db8$export$ddcffe0146c8f882 = new $f0a2ccd611c71db8$export$bf2a15d34f3c441c($f0a2ccd611c71db8$var$DEFAULT_STORAGE_PREFIX, $f0a2ccd611c71db8$var$DEFAULT_STORAGE_PROVIDER);\n\n\nconst $fbb55a96d78c7ba0$export$de75f46579dcf24 = (selectedImage)=>{\n return typeof selectedImage === \"string\";\n};\n\n\nvar $eccf21b2da8f185e$exports = {};\n\n$eccf21b2da8f185e$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"Pressuru.684952ea.ttf\";\n\n\nvar $4e9367b4637ab0b3$exports = {};\n\n$4e9367b4637ab0b3$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"Oswald-Regular.89ec7d89.ttf\";\n\n\nvar $98768b53aac35bcc$exports = {};\n\n$98768b53aac35bcc$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"Oswald-Bold.0f6a7ca6.ttf\";\n\n\nvar $81873ad161a9f996$exports = {};\n\n$81873ad161a9f996$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"Roboto-Regular.ca197847.ttf\";\n\n\nvar $f1c993919e45d5c2$exports = {};\n\n$f1c993919e45d5c2$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"Roboto-Bold.fdb9b54a.ttf\";\n\n\nvar $8f40b96e34825d38$exports = {};\n\n$8f40b96e34825d38$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"RobotoCondensed-Regular.d585f5c7.ttf\";\n\n\nvar $51e3f333db254f7d$exports = {};\n\n$51e3f333db254f7d$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"RobotoCondensed-Bold.e1f96d4b.ttf\";\n\n\nvar $0d878777045f8608$exports = {};\n\n$0d878777045f8608$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"CourierPrime-Regular.3a25a501.ttf\";\n\n\nvar $da7f4261981c6446$exports = {};\n\n$da7f4261981c6446$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"CourierPrime-Bold.3d6bf689.ttf\";\n\n\nvar $553eebead4d87493$exports = {};\n\n$553eebead4d87493$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"OpenSans-Regular.edf9e01b.ttf\";\n\n\nvar $e4f4da01dd92f98a$exports = {};\n\n$e4f4da01dd92f98a$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\") + \"OpenSans-Bold.8fceb72b.ttf\";\n\n\nconst $055531bbd0af154c$export$6874249d87f2602a = [\n {\n name: \"Pressuru\",\n label: \"Pressuru\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($eccf21b2da8f185e$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"Oswald-Regular\",\n label: \"Oswald\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($4e9367b4637ab0b3$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"Oswald-Bold\",\n label: \"Oswald Bold\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($98768b53aac35bcc$exports))),\n style: \"normal\",\n weight: \"700\"\n },\n {\n name: \"Roboto-Regular\",\n label: \"Roboto\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($81873ad161a9f996$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"Roboto-Bold\",\n label: \"Roboto Bold\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($f1c993919e45d5c2$exports))),\n style: \"normal\",\n weight: \"700\"\n },\n {\n name: \"RobotoCondensed-Regular\",\n label: \"Roboto Condensed\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($8f40b96e34825d38$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"RobotoCondensed-Bold\",\n label: \"Roboto Condensed Bold\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($51e3f333db254f7d$exports))),\n style: \"normal\",\n weight: \"700\"\n },\n {\n name: \"CourierPrime-Regular\",\n label: \"Courier Prime\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($0d878777045f8608$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"CourierPrime-Bold\",\n label: \"Courier Prime Bold\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($da7f4261981c6446$exports))),\n style: \"normal\",\n weight: \"700\"\n },\n {\n name: \"OpenSans-Regular\",\n label: \"Open Sans\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($553eebead4d87493$exports))),\n style: \"normal\",\n weight: \"400\"\n },\n {\n name: \"OpenSans-Bold\",\n label: \"Open Sans Bold\",\n path: (0, (/*@__PURE__*/$parcel$interopDefault($e4f4da01dd92f98a$exports))),\n style: \"normal\",\n weight: \"400\"\n }\n];\nconst $055531bbd0af154c$export$59eceaef0c7797b2 = async (name, path, options = {})=>{\n try {\n const font = new FontFace(name, `url(${path})`, {\n ...options\n });\n await font.load();\n document.fonts.add(font);\n } catch (err) {\n console.error(err);\n }\n};\n\n\nconst $166cfb2484b08c80$var$errorsContainer = document.getElementById(\"errorsContainer\");\nconst $166cfb2484b08c80$var$hideError = (evt)=>{\n const target = evt.currentTarget;\n target.removeEventListener(\"click\", $166cfb2484b08c80$var$hideError);\n $166cfb2484b08c80$var$errorsContainer.removeChild(target.parentNode);\n};\nconst $166cfb2484b08c80$export$af04143326425dbd = (message = \"\", type = \"info\")=>{\n const types = [\n \"info\",\n \"warning\",\n \"danger\"\n ];\n if (!types.includes(type)) type = \"info\";\n const template = /* html */ `\n ${message}\n \n `;\n const div = document.createElement(\"div\");\n div.className = `alert alert-${type} alert-dismissible text-break mb-2 fade`;\n div.innerHTML = template;\n div.querySelector(\"button\").addEventListener(\"click\", $166cfb2484b08c80$var$hideError);\n $166cfb2484b08c80$var$errorsContainer.appendChild(div);\n setTimeout(()=>div.classList.add(\"show\"), 100);\n};\n\n\n\n\n\nconst $f0ee20a32c2bc385$var$defaultTextboxData = {\n id: \"\",\n text: \"\",\n fillColor: \"#ffffff\",\n strokeColor: \"#000000\",\n font: \"Pressuru\",\n fontSize: 40,\n fontWeight: \"normal\",\n textAlign: \"center\",\n shadowBlur: 0,\n strokeWidth: 1.5,\n offsetY: 0,\n offsetX: 0,\n rotate: 0,\n allCaps: true\n};\nconst $f0ee20a32c2bc385$var$textboxes = new Map();\nclass $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b {\n constructor(data){\n const id = (0, $21c3f3a8dccfa4fd$export$e2a22331486dcca0)(\"textbox\", Date.now().toString(36));\n this.data = data ? {\n ...data,\n id: id\n } : {\n ...$f0ee20a32c2bc385$var$defaultTextboxData,\n id: id\n };\n $f0ee20a32c2bc385$var$textboxes.set(id, this);\n document.dispatchEvent(new CustomEvent(`textbox-create`, {\n bubbles: true,\n composed: true,\n detail: {\n textbox: this\n }\n }));\n }\n getData() {\n return this.data;\n }\n static create(data) {\n return new $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b(data);\n }\n static getAll() {\n return $f0ee20a32c2bc385$var$textboxes;\n }\n static getById(id) {\n return $f0ee20a32c2bc385$var$textboxes.get(id);\n }\n static remove(id) {\n $f0ee20a32c2bc385$var$textboxes.delete(id);\n document.dispatchEvent(new CustomEvent(`textbox-remove`, {\n bubbles: true,\n composed: true,\n detail: {\n id: id\n }\n }));\n }\n static createElement(textbox, autoFocus = true) {\n if (!(textbox instanceof $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b)) return;\n const data = textbox.getData();\n const { id: id, text: text, fillColor: fillColor, strokeColor: strokeColor, fontSize: fontSize, shadowBlur: shadowBlur, strokeWidth: strokeWidth, offsetX: offsetX, offsetY: offsetY, rotate: rotate } = data;\n const template = /* html */ `\n
\n \n \n\n \n\n
\n \n \n\n \n \n\n \n
\n
\n\n \n `;\n const fragment = document.createDocumentFragment();\n const div = document.createElement(\"div\");\n div.setAttribute(\"id\", id);\n div.setAttribute(\"data-section\", \"textbox\");\n div.className = \"bg-light border shadow-sm mb-3 rounded\";\n div.innerHTML = template;\n div.querySelectorAll(\"select\").forEach((el)=>el.value = data[el.dataset.input]);\n div.querySelectorAll('input[type=\"checkbox\"]').forEach((el)=>el.checked = data[el.dataset.input]);\n const textboxEl = fragment.appendChild(div);\n if (autoFocus) setTimeout(()=>textboxEl.querySelector('[data-input=\"text\"]').focus(), 0);\n return textboxEl;\n }\n}\n\n\n\n\nclass $68e654e91d7a7392$export$8d01c972ee8b14a9 {\n #canvas = null;\n #ctx = null;\n constructor(canvasEl){\n this.#canvas = canvasEl;\n this.#ctx = this.#canvas.getContext(\"2d\");\n }\n get width() {\n return this.#canvas.width;\n }\n set width(value) {\n this.#canvas.width = value;\n }\n get height() {\n return this.#canvas.height;\n }\n set height(value) {\n this.#canvas.height = value;\n }\n getDimensions() {\n return {\n width: this.width,\n height: this.height\n };\n }\n setDimensions({ width: width, height: height }) {\n this.width = width;\n this.height = height;\n return this;\n }\n toDataURL() {\n return this.#canvas.toDataURL();\n }\n draw(image, textboxes = new Map()) {\n if (image == null) return;\n const canvas = this.#canvas;\n const ctx = this.#ctx;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n if ((0, $fbb55a96d78c7ba0$export$de75f46579dcf24)(image)) {\n ctx.fillStyle = image;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n } else ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n let multiplier = 0;\n textboxes.forEach((textbox)=>{\n const { data: data } = textbox;\n multiplier += 1;\n ctx.save();\n ctx.font = `${data.fontWeight} ${data.fontSize * canvas.width / 1000}px ${data.font}`;\n ctx.fillStyle = data.fillColor;\n ctx.textAlign = data.textAlign;\n ctx.strokeStyle = data.strokeColor;\n const lineHeight = ctx.measureText(\"M\").width + data.fontSize / 2;\n const xPos = canvas.width / 2;\n const shadowBlur = data.shadowBlur;\n const text = data.allCaps === true ? data.text.toUpperCase() : data.text;\n const textLines = text.split(\"\\n\");\n if (shadowBlur !== 0) {\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n ctx.shadowBlur = Math.min(shadowBlur, (0, $33dea9d9a6da4c9a$export$62045be72fe457b4));\n ctx.shadowColor = data.strokeColor;\n }\n ctx.translate(xPos + data.offsetX, lineHeight * multiplier + data.offsetY);\n ctx.rotate(Math.min(data.rotate, (0, $33dea9d9a6da4c9a$export$d3f4819a57998cf7)) * Math.PI / 180);\n // First draw each line with shadow.\n textLines.forEach((text, index)=>ctx.fillText(text, 0, index * lineHeight));\n // Since shadows of multiline text may be drawn over letters of neighbour lines\n // (when shadow blur is big enough), re-draw text without shadows.\n if (shadowBlur !== 0) {\n ctx.shadowBlur = 0;\n textLines.forEach((text, index)=>ctx.fillText(text, 0, index * lineHeight));\n }\n if (data.strokeWidth > 0) {\n ctx.lineWidth = Math.min(data.strokeWidth, (0, $33dea9d9a6da4c9a$export$8f089f0a062560ff));\n textLines.forEach((text, index)=>ctx.strokeText(text, 0, index * lineHeight));\n }\n ctx.restore();\n });\n return this;\n }\n clear() {\n this.#ctx.clearRect(0, 0, this.#canvas.width, this.#canvas.height);\n return this;\n }\n show() {\n this.#canvas.hidden = false;\n return this;\n }\n hide() {\n this.#canvas.hidden = true;\n return this;\n }\n static createInstance(canvasEl) {\n return new $68e654e91d7a7392$export$8d01c972ee8b14a9(canvasEl);\n }\n}\n\n\nconst $44ae6d9db4eaca0f$var$canvas = (0, $68e654e91d7a7392$export$8d01c972ee8b14a9).createInstance(document.getElementById(\"canvas\"));\nconst $44ae6d9db4eaca0f$var$videoModal = document.getElementById(\"videoModal\");\nconst $44ae6d9db4eaca0f$var$downloadModal = document.getElementById(\"downloadModal\");\nconst $44ae6d9db4eaca0f$var$capturePhotoEl = document.querySelector(\"capture-photo\");\nconst $44ae6d9db4eaca0f$var$cameraSelect = document.getElementById(\"cameraSelect\");\nconst $44ae6d9db4eaca0f$var$capturePhotoButton = document.getElementById(\"capturePhotoButton\");\nconst $44ae6d9db4eaca0f$var$torchButton = document.getElementById(\"torchButton\");\nconst $44ae6d9db4eaca0f$var$dropzoneEl = document.querySelector(\"files-dropzone\");\nconst $44ae6d9db4eaca0f$var$instructionsEl = document.getElementById(\"instructions\");\nconst $44ae6d9db4eaca0f$var$imageUploadMethodSelect = document.getElementById(\"imageUploadMethodSelect\");\nconst $44ae6d9db4eaca0f$var$fileSelectBtn = document.getElementById(\"fileSelectBtn\");\nconst $44ae6d9db4eaca0f$var$imageUrlForm = document.getElementById(\"imageUrlForm\");\nconst $44ae6d9db4eaca0f$var$addTextboxBtn = document.getElementById(\"addTextboxBtn\");\nconst $44ae6d9db4eaca0f$var$textboxesContainer = document.getElementById(\"textboxesContainer\");\nconst $44ae6d9db4eaca0f$var$generateMemeBtn = document.getElementById(\"generateMemeBtn\");\nconst $44ae6d9db4eaca0f$var$openVideoModalBtn = document.getElementById(\"openVideoModalBtn\");\nconst $44ae6d9db4eaca0f$var$downloadMemeBtn = document.getElementById(\"downloadMemeBtn\");\nconst $44ae6d9db4eaca0f$var$downloadMemePreview = document.getElementById(\"downloadMemePreview\");\nconst $44ae6d9db4eaca0f$var$webShareComponent = document.querySelector(\"web-share\");\nconst $44ae6d9db4eaca0f$var$galleryEl = document.getElementById(\"gallery\");\nconst $44ae6d9db4eaca0f$var$gallerySearchEl = document.getElementById(\"gallerySearch\");\nconst $44ae6d9db4eaca0f$var$galleryNoResultsEl = $44ae6d9db4eaca0f$var$galleryEl.querySelector(\".gallery__no-results\");\nconst $44ae6d9db4eaca0f$var$solidColorForm = document.getElementById(\"solidColorForm\");\nconst $44ae6d9db4eaca0f$var$uploadMethodEls = document.querySelectorAll(\".upload-method\");\nconst $44ae6d9db4eaca0f$var$removeConfirmationModal = document.getElementById(\"removeConfirmationModal\");\nconst $44ae6d9db4eaca0f$var$removeTextForm = document.getElementById(\"removeTextForm\");\nconst $44ae6d9db4eaca0f$var$maxImageDimensionsForm = document.getElementById(\"maxImageDimensionsForm\");\nconst $44ae6d9db4eaca0f$var$maxImageDimensionsSelect = $44ae6d9db4eaca0f$var$maxImageDimensionsForm[\"maxImageDimensions\"];\nconst $44ae6d9db4eaca0f$var$clearCanvasBtn = document.getElementById(\"clearCanvasBtn\");\nconst $44ae6d9db4eaca0f$var$maxImageDimensionsFromStorage = (0, $f0a2ccd611c71db8$export$ddcffe0146c8f882).get(\"maxImageDimensions\");\nlet $44ae6d9db4eaca0f$var$shouldFocusOnTextboxCreate = false;\nlet $44ae6d9db4eaca0f$var$selectedImage = null;\nlet $44ae6d9db4eaca0f$var$reqAnimFrame = null;\nconst $44ae6d9db4eaca0f$var$renderAcceptedImageFormats = (acceptedMimeTypes, rootEl)=>{\n if (!rootEl) return;\n const extensions = acceptedMimeTypes.map((mimeType)=>mimeType.split(\"/\")[1]);\n const str = `Supported image formats: ${extensions.join(\", \")}`;\n const div = document.createElement(\"div\");\n const small = document.createElement(\"small\");\n small.textContent = str;\n div.appendChild(small);\n rootEl.appendChild(small);\n};\nconst $44ae6d9db4eaca0f$var$generateMeme = async ()=>{\n const dataUrl = $44ae6d9db4eaca0f$var$canvas.toDataURL(\"image/png\");\n const filename = `${(0, $21c3f3a8dccfa4fd$export$e2a22331486dcca0)(\"meme\")}.png`;\n // Prepare download link\n const downloadLink = dataUrl.replace(\"image/png\", \"image/octet-stream\");\n $44ae6d9db4eaca0f$var$downloadMemeBtn.download = filename;\n $44ae6d9db4eaca0f$var$downloadMemeBtn.href = downloadLink;\n $44ae6d9db4eaca0f$var$downloadMemePreview.width = $44ae6d9db4eaca0f$var$canvas.getDimensions().width;\n $44ae6d9db4eaca0f$var$downloadMemePreview.height = $44ae6d9db4eaca0f$var$canvas.getDimensions().height;\n $44ae6d9db4eaca0f$var$downloadMemePreview.src = downloadLink;\n // Prepare for sharing file\n if ((0, $94933cc6427541bd$export$c37129e465f64ef0)()) try {\n const file = await (0, $c3d7e05a1ce34ed5$export$6539e087749cf9d3)({\n url: dataUrl,\n filename: filename,\n mimeType: \"image/png\"\n }).catch((err)=>(0, $166cfb2484b08c80$export$af04143326425dbd)(err.message, \"danger\"));\n if (file && (0, $94933cc6427541bd$export$c37129e465f64ef0)({\n files: [\n file\n ]\n })) {\n $44ae6d9db4eaca0f$var$webShareComponent.shareFiles = [\n file\n ];\n $44ae6d9db4eaca0f$var$webShareComponent.hidden = false;\n }\n } catch (error) {\n console.error(error);\n }\n window.requestAnimationFrame(()=>{\n $44ae6d9db4eaca0f$var$downloadModal.open = true;\n });\n};\nconst $44ae6d9db4eaca0f$var$setImageMaxDimensions = (image)=>{\n const maxImageDimensionsSelect = $44ae6d9db4eaca0f$var$maxImageDimensionsForm[\"maxImageDimensions\"];\n const [maxWidthValue, maxHeightValue] = maxImageDimensionsSelect.value.split(\"x\");\n const MAX_WIDTH = Number(maxWidthValue) || 800;\n const MAX_HEIGHT = Number(maxHeightValue) || 600;\n let width = image.width;\n let height = image.height;\n if (width > height) {\n if (width > MAX_WIDTH) {\n height *= MAX_WIDTH / width;\n width = MAX_WIDTH;\n }\n } else if (height > MAX_HEIGHT) {\n width *= MAX_HEIGHT / height;\n height = MAX_HEIGHT;\n }\n $44ae6d9db4eaca0f$var$canvas.setDimensions({\n width: width,\n height: height\n });\n};\nconst $44ae6d9db4eaca0f$var$afterImageSelect = ()=>{\n $44ae6d9db4eaca0f$var$canvas.draw($44ae6d9db4eaca0f$var$selectedImage, (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).getAll()).show();\n $44ae6d9db4eaca0f$var$dropzoneEl.classList.add(\"dropzone--accepted\");\n $44ae6d9db4eaca0f$var$dropzoneEl.disabled = true;\n $44ae6d9db4eaca0f$var$generateMemeBtn.disabled = false;\n $44ae6d9db4eaca0f$var$instructionsEl.hidden = true;\n $44ae6d9db4eaca0f$var$clearCanvasBtn.hidden = false;\n};\nconst $44ae6d9db4eaca0f$var$handleImageLoad = (evt)=>{\n $44ae6d9db4eaca0f$var$selectedImage = evt.target;\n $44ae6d9db4eaca0f$var$setImageMaxDimensions($44ae6d9db4eaca0f$var$selectedImage);\n $44ae6d9db4eaca0f$var$afterImageSelect();\n};\nconst $44ae6d9db4eaca0f$var$handleSolidColorFormInput = (evt)=>{\n const DEFAULT_WIDTH = 800;\n const DEFAULT_HEIGHT = 600;\n if (evt.target === $44ae6d9db4eaca0f$var$solidColorForm[\"canvasColor\"]) $44ae6d9db4eaca0f$var$selectedImage = evt.target.value;\n if ((0, $fbb55a96d78c7ba0$export$de75f46579dcf24)($44ae6d9db4eaca0f$var$selectedImage)) {\n $44ae6d9db4eaca0f$var$canvas.setDimensions({\n width: Number($44ae6d9db4eaca0f$var$solidColorForm[\"canvasWidth\"].value) || DEFAULT_WIDTH,\n height: Number($44ae6d9db4eaca0f$var$solidColorForm[\"canvasHeight\"].value) || DEFAULT_HEIGHT\n });\n $44ae6d9db4eaca0f$var$afterImageSelect();\n }\n};\nconst $44ae6d9db4eaca0f$var$handleFileSelect = (file)=>{\n if (!file) return;\n const image = new Image();\n const reader = new FileReader();\n reader.addEventListener(\"load\", function(evt) {\n const data = evt.target.result;\n image.addEventListener(\"load\", $44ae6d9db4eaca0f$var$handleImageLoad);\n image.src = data;\n });\n reader.readAsDataURL(file);\n};\nconst $44ae6d9db4eaca0f$var$handleOpenVideoModalButtonClick = ()=>{\n $44ae6d9db4eaca0f$var$videoModal.open = true;\n};\nconst $44ae6d9db4eaca0f$var$handleTextPropChange = (element, textboxId, prop)=>{\n const textboxData = (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).getById(textboxId).getData();\n switch(element.type){\n case \"checkbox\":\n textboxData[prop] = element.checked;\n break;\n case \"number\":\n textboxData[prop] = Number(element.value);\n break;\n default:\n textboxData[prop] = element.value;\n }\n $44ae6d9db4eaca0f$var$canvas.draw($44ae6d9db4eaca0f$var$selectedImage, (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).getAll());\n};\nconst $44ae6d9db4eaca0f$var$handleAddTextboxBtnClick = ()=>(0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).create();\nconst $44ae6d9db4eaca0f$var$handleImageUploadFromURL = async (evt)=>{\n evt.preventDefault();\n const form = evt.target;\n const submitButton = form.querySelector('button[type=\"submit\"]');\n const imageUrl = form[\"imageUrl\"].value;\n if (!imageUrl.trim()) return;\n submitButton.disabled = true;\n submitButton.querySelector(\".spinner\").hidden = false;\n submitButton.querySelector(\".label\").hidden = true;\n try {\n const file = await (0, $c3d7e05a1ce34ed5$export$6539e087749cf9d3)({\n url: imageUrl\n }).catch((err)=>(0, $166cfb2484b08c80$export$af04143326425dbd)(err.message, \"danger\"));\n if (file) $44ae6d9db4eaca0f$var$handleFileSelect(file);\n } catch {\n (0, $166cfb2484b08c80$export$af04143326425dbd)(`Failed to load image from \"${imageUrl}\".`, \"danger\");\n } finally{\n submitButton.disabled = false;\n submitButton.querySelector(\".spinner\").hidden = true;\n submitButton.querySelector(\".label\").hidden = false;\n }\n};\nconst $44ae6d9db4eaca0f$var$moveTextUsingArrowbuttons = (textboxId, direction)=>()=>{\n const textboxEl = document.getElementById(textboxId);\n const offsetYInput = textboxEl.querySelector('[data-input=\"offsetY\"]');\n const offsetXInput = textboxEl.querySelector('[data-input=\"offsetX\"]');\n const textbox = (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).getById(textboxId);\n if (!textbox) return;\n const textboxData = textbox.getData();\n direction = direction.toLowerCase();\n switch(direction){\n case \"up\":\n textboxData.offsetY -= 1;\n offsetYInput.value = textboxData.offsetY;\n break;\n case \"down\":\n textboxData.offsetY += 1;\n offsetYInput.value = textboxData.offsetY;\n break;\n case \"left\":\n textboxData.offsetX -= 1;\n offsetXInput.value = textboxData.offsetX;\n break;\n case \"right\":\n textboxData.offsetX += 1;\n offsetXInput.value = textboxData.offsetX;\n break;\n }\n $44ae6d9db4eaca0f$var$canvas.draw($44ae6d9db4eaca0f$var$selectedImage, (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).getAll());\n $44ae6d9db4eaca0f$var$reqAnimFrame = requestAnimationFrame($44ae6d9db4eaca0f$var$moveTextUsingArrowbuttons(textboxId, direction));\n };\nconst $44ae6d9db4eaca0f$var$handleUploadMethodChange = (evt)=>{\n $44ae6d9db4eaca0f$var$uploadMethodEls.forEach((el)=>el.hidden = el.id !== evt.target.value);\n $44ae6d9db4eaca0f$var$maxImageDimensionsForm.hidden = evt.target.value === \"solidColorForm\";\n};\nconst $44ae6d9db4eaca0f$var$handleFileSelectClick = ()=>{\n if (typeof $44ae6d9db4eaca0f$var$dropzoneEl.openFileDialog === \"function\") $44ae6d9db4eaca0f$var$dropzoneEl.openFileDialog();\n};\nconst $44ae6d9db4eaca0f$var$handleDropFilesAccepted = (evt)=>{\n const [file] = evt.detail.acceptedFiles;\n if (file) $44ae6d9db4eaca0f$var$handleFileSelect(file);\n};\nconst $44ae6d9db4eaca0f$var$handleTextboxesContainerInput = (evt)=>{\n const element = evt.target;\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n let prop;\n if (element.matches('[data-input=\"text\"]')) prop = \"text\";\n else if (element.matches('[data-input=\"fillColor\"]')) prop = \"fillColor\";\n else if (element.matches('[data-input=\"strokeColor\"]')) prop = \"strokeColor\";\n else if (element.matches('[data-input=\"font\"]')) prop = \"font\";\n else if (element.matches('[data-input=\"fontSize\"]')) prop = \"fontSize\";\n else if (element.matches('[data-input=\"fontWeight\"]')) prop = \"fontWeight\";\n else if (element.matches('[data-input=\"textAlign\"]')) prop = \"textAlign\";\n else if (element.matches('[data-input=\"shadowBlur\"]')) prop = \"shadowBlur\";\n else if (element.matches('[data-input=\"offsetY\"]')) prop = \"offsetY\";\n else if (element.matches('[data-input=\"offsetX\"]')) prop = \"offsetX\";\n else if (element.matches('[data-input=\"rotate\"]')) prop = \"rotate\";\n else if (element.matches('[data-input=\"strokeWidth\"]')) prop = \"strokeWidth\";\n if (prop) $44ae6d9db4eaca0f$var$handleTextPropChange(element, textboxId, prop);\n};\nconst $44ae6d9db4eaca0f$var$handleTextboxesContainerChange = (evt)=>{\n const element = evt.target;\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n let prop;\n if (element.matches('[data-input=\"allCaps\"]')) prop = \"allCaps\";\n if (prop) $44ae6d9db4eaca0f$var$handleTextPropChange(element, textboxId, prop);\n};\nconst $44ae6d9db4eaca0f$var$handleTextboxesContainerClick = (evt)=>{\n const element = evt.target;\n if (element.matches('[data-button=\"settings\"]')) {\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n const textboxSettingsEl = textboxEl?.querySelector('[data-section=\"settings\"]');\n if (textboxSettingsEl) textboxSettingsEl.hidden = !textboxSettingsEl.hidden;\n }\n if (element.matches('[data-button=\"duplicate-text-box\"')) {\n const currentTextboxEl = element.closest('[data-section=\"textbox\"]');\n const currentTextboxData = (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).getById(currentTextboxEl.id);\n (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).create({\n ...currentTextboxData.data\n });\n }\n if (element.matches('[data-button=\"delete-text-box\"]')) {\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n const textboxToDelete = (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).getById(textboxId);\n if (textboxToDelete && textboxToDelete.data.text.trim()) {\n const textboxIdInput = $44ae6d9db4eaca0f$var$removeTextForm[\"textbox-id\"];\n if (textboxIdInput) {\n textboxIdInput.value = textboxId;\n $44ae6d9db4eaca0f$var$removeConfirmationModal.open = true;\n }\n } else (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).remove(textboxId);\n }\n};\nconst $44ae6d9db4eaca0f$var$handleTextRemoveFormSubmit = (evt)=>{\n evt.preventDefault();\n const textboxId = evt.target[\"textbox-id\"].value;\n if (textboxId) {\n (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).remove(textboxId);\n $44ae6d9db4eaca0f$var$removeConfirmationModal.open = false;\n }\n};\nconst $44ae6d9db4eaca0f$var$handleTextboxesContainerPointerdown = (evt)=>{\n const element = evt.target;\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n if (!textboxEl) return;\n if (element.matches('[data-action=\"move-text\"]')) $44ae6d9db4eaca0f$var$reqAnimFrame = requestAnimationFrame($44ae6d9db4eaca0f$var$moveTextUsingArrowbuttons(textboxEl.id, element.getAttribute(\"aria-label\")));\n};\nconst $44ae6d9db4eaca0f$var$handleTextboxesContainerPointerup = (evt)=>{\n const element = evt.target;\n if (element.matches('[data-action=\"move-text\"]')) {\n cancelAnimationFrame && cancelAnimationFrame($44ae6d9db4eaca0f$var$reqAnimFrame);\n $44ae6d9db4eaca0f$var$reqAnimFrame = null;\n }\n};\nconst $44ae6d9db4eaca0f$var$handleTextboxesContainerPointerout = (evt)=>{\n const element = evt.target;\n if (element.matches('[data-action=\"move-text\"]')) {\n cancelAnimationFrame && cancelAnimationFrame($44ae6d9db4eaca0f$var$reqAnimFrame);\n $44ae6d9db4eaca0f$var$reqAnimFrame = null;\n }\n};\nconst $44ae6d9db4eaca0f$var$handleTextboxesContainerKeyDown = (evt)=>{\n const element = evt.target;\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n if (element.matches('[data-action=\"move-text\"]')) {\n if (evt.key === \" \" || evt.key === \"Enter\") {\n $44ae6d9db4eaca0f$var$reqAnimFrame && cancelAnimationFrame($44ae6d9db4eaca0f$var$reqAnimFrame);\n $44ae6d9db4eaca0f$var$reqAnimFrame = requestAnimationFrame($44ae6d9db4eaca0f$var$moveTextUsingArrowbuttons(textboxEl.id, element.getAttribute(\"aria-label\")));\n }\n }\n};\nconst $44ae6d9db4eaca0f$var$handleTextboxesContainerKeyUp = (evt)=>{\n const element = evt.target;\n if (element.matches('[data-action=\"move-text\"]')) {\n if (evt.key === \" \" || evt.key === \"Enter\") {\n $44ae6d9db4eaca0f$var$reqAnimFrame && cancelAnimationFrame($44ae6d9db4eaca0f$var$reqAnimFrame);\n $44ae6d9db4eaca0f$var$reqAnimFrame = null;\n }\n }\n};\nconst $44ae6d9db4eaca0f$var$handleGalleryClick = async (evt)=>{\n const button = evt.target.closest(\"button\");\n if (!button) return;\n const img = button.querySelector(\"img\");\n try {\n const file = await (0, $c3d7e05a1ce34ed5$export$6539e087749cf9d3)({\n url: img.src\n }).catch((err)=>(0, $166cfb2484b08c80$export$af04143326425dbd)(err.message, \"danger\"));\n if (file) $44ae6d9db4eaca0f$var$handleFileSelect(file);\n } catch {\n (0, $166cfb2484b08c80$export$af04143326425dbd)(`Failed to load image: \"${img.alt}\".`, \"danger\");\n }\n};\nconst $44ae6d9db4eaca0f$var$handleGallerySearchInput = (evt)=>{\n const query = evt.target.value.toLowerCase().trim();\n const galleryItems = $44ae6d9db4eaca0f$var$galleryEl.querySelectorAll(\"button\");\n galleryItems.forEach((item)=>{\n const alt = (item.querySelector(\"img\").getAttribute(\"alt\") || \"\").toLowerCase();\n item.hidden = !alt.includes(query);\n });\n $44ae6d9db4eaca0f$var$galleryNoResultsEl.hidden = !!$44ae6d9db4eaca0f$var$galleryEl.querySelector(\"button:not([hidden])\");\n};\nconst $44ae6d9db4eaca0f$var$handleWebShareError = ()=>{\n $44ae6d9db4eaca0f$var$downloadModal.open = false;\n (0, $166cfb2484b08c80$export$af04143326425dbd)(\"There was an error while trying to share your meme.\", \"danger\");\n};\nconst $44ae6d9db4eaca0f$var$handleCapturePhotoError = (evt)=>{\n const error = evt.detail.error;\n let errorMessage = \"An error occurred while trying to capture photo.\";\n if (error instanceof Error && (error.name === \"NotAllowedError\" || error.name === \"NotFoundError\")) errorMessage += \" Make sure you have a camera connected and you have granted the appropriate permissions.\";\n (0, $166cfb2484b08c80$export$af04143326425dbd)(errorMessage, \"danger\");\n $44ae6d9db4eaca0f$var$videoModal.open = false;\n console.error(error);\n};\nconst $44ae6d9db4eaca0f$var$handleCapturePhotoSuccess = (evt)=>{\n $44ae6d9db4eaca0f$var$videoModal.open = false;\n const image = new Image();\n image.addEventListener(\"load\", $44ae6d9db4eaca0f$var$handleImageLoad);\n image.src = evt.detail.dataURI;\n};\nconst $44ae6d9db4eaca0f$var$handleModalOpen = (evt)=>{\n if (evt.target.id === \"videoModal\") {\n if ($44ae6d9db4eaca0f$var$capturePhotoEl && typeof $44ae6d9db4eaca0f$var$capturePhotoEl.startVideoStream === \"function\") $44ae6d9db4eaca0f$var$capturePhotoEl.startVideoStream();\n }\n};\nconst $44ae6d9db4eaca0f$var$handleModalClose = (evt)=>{\n if (evt.target.id === \"videoModal\") {\n if ($44ae6d9db4eaca0f$var$capturePhotoEl && typeof $44ae6d9db4eaca0f$var$capturePhotoEl.stopVideoStream === \"function\") $44ae6d9db4eaca0f$var$capturePhotoEl.stopVideoStream();\n }\n if (evt.target.id === \"removeConfirmationModal\") $44ae6d9db4eaca0f$var$removeTextForm.reset();\n};\nconst $44ae6d9db4eaca0f$var$handleEmojiPickerSelection = (evt)=>{\n const textboxEl = evt.target.closest('[data-section=\"textbox\"]');\n if (textboxEl) {\n const input = textboxEl.querySelector('[data-input=\"text\"]');\n const emoji = evt.detail.unicode;\n if (input) (0, $dec5faeb65064cfd$export$2e2bcd8739ae039)(input, emoji);\n }\n};\nconst $44ae6d9db4eaca0f$var$handleMaxImageDimensionsFormChange = (evt)=>{\n if (evt.target.matches('[name=\"maxImageDimensions\"]')) (0, $f0a2ccd611c71db8$export$ddcffe0146c8f882).set(\"maxImageDimensions\", evt.target.value);\n if (!$44ae6d9db4eaca0f$var$selectedImage || (0, $fbb55a96d78c7ba0$export$de75f46579dcf24)($44ae6d9db4eaca0f$var$selectedImage)) return;\n $44ae6d9db4eaca0f$var$setImageMaxDimensions($44ae6d9db4eaca0f$var$selectedImage);\n $44ae6d9db4eaca0f$var$canvas.draw($44ae6d9db4eaca0f$var$selectedImage, (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).getAll());\n};\nconst $44ae6d9db4eaca0f$var$handleTextboxCreate = (evt)=>{\n const textbox = evt.detail.textbox;\n const textboxEl = (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).createElement(textbox, $44ae6d9db4eaca0f$var$shouldFocusOnTextboxCreate);\n $44ae6d9db4eaca0f$var$shouldFocusOnTextboxCreate = true;\n $44ae6d9db4eaca0f$var$textboxesContainer.appendChild(textboxEl);\n if (textbox.getData().text) $44ae6d9db4eaca0f$var$canvas.draw($44ae6d9db4eaca0f$var$selectedImage, (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).getAll());\n};\nconst $44ae6d9db4eaca0f$var$handleTextboxDelete = (evt)=>{\n const textboxEl = document.getElementById(evt.detail.id);\n textboxEl && textboxEl.remove();\n $44ae6d9db4eaca0f$var$textboxesContainer.querySelectorAll('[data-section=\"textbox\"]').forEach((el, idx)=>{\n el.querySelector('[data-input=\"text\"]').setAttribute(\"placeholder\", `Text #${idx + 1}`);\n });\n $44ae6d9db4eaca0f$var$canvas.draw($44ae6d9db4eaca0f$var$selectedImage, (0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).getAll());\n};\nconst $44ae6d9db4eaca0f$var$handleClearCanvas = (evt)=>{\n if (!$44ae6d9db4eaca0f$var$selectedImage) return;\n evt.stopPropagation();\n $44ae6d9db4eaca0f$var$selectedImage = null;\n $44ae6d9db4eaca0f$var$dropzoneEl.classList.remove(\"dropzone--accepted\");\n $44ae6d9db4eaca0f$var$generateMemeBtn.disabled = true;\n $44ae6d9db4eaca0f$var$instructionsEl.hidden = false;\n $44ae6d9db4eaca0f$var$clearCanvasBtn.hidden = true;\n $44ae6d9db4eaca0f$var$dropzoneEl.disabled = false;\n $44ae6d9db4eaca0f$var$canvas.clear().hide();\n};\nconst $44ae6d9db4eaca0f$var$toggleTorchButtonStatus = (options = {})=>{\n const defaults = {\n el: document.getElementById(\"torchButton\"),\n isTorchOn: false\n };\n const { el: el, isTorchOn: isTorchOn } = {\n ...defaults,\n ...options\n };\n const iconPaths = el.querySelectorAll(\"svg path\");\n if (iconPaths.length !== 2) return;\n iconPaths[0].style.display = isTorchOn ? \"none\" : \"block\";\n iconPaths[1].style.display = isTorchOn ? \"block\" : \"none\";\n el.setAttribute(\"aria-label\", `Turn ${isTorchOn ? \"off\" : \"on\"} flash`);\n};\nconst $44ae6d9db4eaca0f$var$handleTorchButtonClick = (evt)=>{\n if ($44ae6d9db4eaca0f$var$capturePhotoEl === null) return;\n $44ae6d9db4eaca0f$var$capturePhotoEl.torch = !$44ae6d9db4eaca0f$var$capturePhotoEl.torch;\n $44ae6d9db4eaca0f$var$toggleTorchButtonStatus({\n el: evt.currentTarget,\n isTorchOn: $44ae6d9db4eaca0f$var$capturePhotoEl.hasAttribute(\"torch\")\n });\n};\nconst $44ae6d9db4eaca0f$var$handleCapturePhotoVideoPlay = async (evt)=>{\n const trackCapabilities = evt.target.getTrackCapabilities();\n if (trackCapabilities?.torch) {\n $44ae6d9db4eaca0f$var$torchButton?.removeAttribute(\"hidden\");\n if ($44ae6d9db4eaca0f$var$capturePhotoEl?.hasAttribute(\"torch\")) $44ae6d9db4eaca0f$var$toggleTorchButtonStatus({\n el: $44ae6d9db4eaca0f$var$torchButton,\n isTorchOn: true\n });\n }\n const videoInputDevices = await (0, $636b0cf1ed0b9f88$export$cc30a98fe3890794).getVideoInputDevices();\n videoInputDevices.forEach((device, index)=>{\n const option = document.createElement(\"option\");\n option.value = device.deviceId;\n option.textContent = device.label || `Camera ${index + 1}`;\n $44ae6d9db4eaca0f$var$cameraSelect.appendChild(option);\n });\n if (videoInputDevices.length > 1) $44ae6d9db4eaca0f$var$cameraSelect?.removeAttribute(\"hidden\");\n};\nconst $44ae6d9db4eaca0f$var$handleCameraSelectChange = (evt)=>{\n if ($44ae6d9db4eaca0f$var$capturePhotoEl === null || typeof $44ae6d9db4eaca0f$var$capturePhotoEl.restartVideoStream !== \"function\" || $44ae6d9db4eaca0f$var$capturePhotoEl.hasAttribute(\"loading\")) return;\n const videoDeviceId = evt.target.value || undefined;\n $44ae6d9db4eaca0f$var$capturePhotoEl.restartVideoStream(videoDeviceId);\n};\nconst $44ae6d9db4eaca0f$var$handleCapturePhotoButtonClick = ()=>{\n if ($44ae6d9db4eaca0f$var$capturePhotoEl === null || typeof $44ae6d9db4eaca0f$var$capturePhotoEl.capture !== \"function\" || $44ae6d9db4eaca0f$var$capturePhotoEl.hasAttribute(\"loading\")) return;\n $44ae6d9db4eaca0f$var$capturePhotoEl.capture();\n};\ndocument.addEventListener(\"web-share:error\", $44ae6d9db4eaca0f$var$handleWebShareError);\ndocument.addEventListener(\"capture-photo:video-play\", $44ae6d9db4eaca0f$var$handleCapturePhotoVideoPlay, {\n once: true\n});\ndocument.addEventListener(\"capture-photo:error\", $44ae6d9db4eaca0f$var$handleCapturePhotoError);\ndocument.addEventListener(\"capture-photo:success\", $44ae6d9db4eaca0f$var$handleCapturePhotoSuccess);\ndocument.addEventListener(\"me-open\", $44ae6d9db4eaca0f$var$handleModalOpen);\ndocument.addEventListener(\"me-close\", $44ae6d9db4eaca0f$var$handleModalClose);\ndocument.addEventListener(\"emoji-click\", $44ae6d9db4eaca0f$var$handleEmojiPickerSelection);\ndocument.addEventListener(\"textbox-create\", $44ae6d9db4eaca0f$var$handleTextboxCreate);\ndocument.addEventListener(\"textbox-remove\", $44ae6d9db4eaca0f$var$handleTextboxDelete);\n$44ae6d9db4eaca0f$var$fileSelectBtn.addEventListener(\"click\", $44ae6d9db4eaca0f$var$handleFileSelectClick);\n$44ae6d9db4eaca0f$var$openVideoModalBtn.addEventListener(\"click\", $44ae6d9db4eaca0f$var$handleOpenVideoModalButtonClick);\n$44ae6d9db4eaca0f$var$addTextboxBtn.addEventListener(\"click\", $44ae6d9db4eaca0f$var$handleAddTextboxBtnClick);\n$44ae6d9db4eaca0f$var$generateMemeBtn.addEventListener(\"click\", $44ae6d9db4eaca0f$var$generateMeme);\n$44ae6d9db4eaca0f$var$downloadMemeBtn.addEventListener(\"click\", ()=>$44ae6d9db4eaca0f$var$downloadModal.open = false);\n$44ae6d9db4eaca0f$var$imageUrlForm.addEventListener(\"submit\", $44ae6d9db4eaca0f$var$handleImageUploadFromURL);\n$44ae6d9db4eaca0f$var$dropzoneEl.addEventListener(\"files-dropzone-drop-accepted\", $44ae6d9db4eaca0f$var$handleDropFilesAccepted);\n$44ae6d9db4eaca0f$var$textboxesContainer.addEventListener(\"input\", $44ae6d9db4eaca0f$var$handleTextboxesContainerInput);\n$44ae6d9db4eaca0f$var$textboxesContainer.addEventListener(\"change\", $44ae6d9db4eaca0f$var$handleTextboxesContainerChange);\n$44ae6d9db4eaca0f$var$textboxesContainer.addEventListener(\"click\", $44ae6d9db4eaca0f$var$handleTextboxesContainerClick);\n$44ae6d9db4eaca0f$var$textboxesContainer.addEventListener(\"pointerdown\", $44ae6d9db4eaca0f$var$handleTextboxesContainerPointerdown);\n$44ae6d9db4eaca0f$var$textboxesContainer.addEventListener(\"pointerup\", $44ae6d9db4eaca0f$var$handleTextboxesContainerPointerup);\n$44ae6d9db4eaca0f$var$textboxesContainer.addEventListener(\"pointerout\", $44ae6d9db4eaca0f$var$handleTextboxesContainerPointerout);\n$44ae6d9db4eaca0f$var$textboxesContainer.addEventListener(\"keydown\", $44ae6d9db4eaca0f$var$handleTextboxesContainerKeyDown);\n$44ae6d9db4eaca0f$var$textboxesContainer.addEventListener(\"keyup\", $44ae6d9db4eaca0f$var$handleTextboxesContainerKeyUp);\n$44ae6d9db4eaca0f$var$imageUploadMethodSelect.addEventListener(\"change\", $44ae6d9db4eaca0f$var$handleUploadMethodChange);\n$44ae6d9db4eaca0f$var$galleryEl.addEventListener(\"click\", $44ae6d9db4eaca0f$var$handleGalleryClick);\n$44ae6d9db4eaca0f$var$gallerySearchEl.addEventListener(\"input\", $44ae6d9db4eaca0f$var$handleGallerySearchInput);\n$44ae6d9db4eaca0f$var$solidColorForm.addEventListener(\"input\", $44ae6d9db4eaca0f$var$handleSolidColorFormInput);\n$44ae6d9db4eaca0f$var$removeTextForm.addEventListener(\"submit\", $44ae6d9db4eaca0f$var$handleTextRemoveFormSubmit);\n$44ae6d9db4eaca0f$var$maxImageDimensionsForm.addEventListener(\"change\", $44ae6d9db4eaca0f$var$handleMaxImageDimensionsFormChange);\n$44ae6d9db4eaca0f$var$clearCanvasBtn.addEventListener(\"click\", $44ae6d9db4eaca0f$var$handleClearCanvas);\n$44ae6d9db4eaca0f$var$cameraSelect.addEventListener(\"change\", $44ae6d9db4eaca0f$var$handleCameraSelectChange);\n$44ae6d9db4eaca0f$var$capturePhotoButton.addEventListener(\"click\", $44ae6d9db4eaca0f$var$handleCapturePhotoButtonClick);\n$44ae6d9db4eaca0f$var$torchButton.addEventListener(\"click\", $44ae6d9db4eaca0f$var$handleTorchButtonClick);\n$44ae6d9db4eaca0f$var$galleryEl.querySelectorAll(\"button > img\")?.forEach((image)=>{\n image.setAttribute(\"title\", image.getAttribute(\"alt\"));\n});\n(0, $f0ee20a32c2bc385$export$8e3dca5fa4d5f04b).create();\n$44ae6d9db4eaca0f$var$dropzoneEl.accept = (0, $33dea9d9a6da4c9a$export$63e7bed68b07a85c);\n$44ae6d9db4eaca0f$var$renderAcceptedImageFormats((0, $33dea9d9a6da4c9a$export$63e7bed68b07a85c), $44ae6d9db4eaca0f$var$instructionsEl);\n(0, $055531bbd0af154c$export$6874249d87f2602a).forEach(({ name: name, path: path, style: style, weight: weight })=>{\n (0, $055531bbd0af154c$export$59eceaef0c7797b2)(name, path, {\n style: style,\n weight: weight\n });\n});\nif ($44ae6d9db4eaca0f$var$maxImageDimensionsFromStorage) $44ae6d9db4eaca0f$var$maxImageDimensionsSelect.value = $44ae6d9db4eaca0f$var$maxImageDimensionsFromStorage;\n$44ae6d9db4eaca0f$var$maxImageDimensionsSelect.disabled = false;\n\n})();\n//# sourceMappingURL=index.9a005d69.js.map\n","import 'emoji-picker-element';\nimport insertTextAtCursor from 'insert-text-at-cursor';\nimport { CapturePhoto } from '@georapbox/capture-photo-element/dist/capture-photo-defined.js';\nimport { isWebShareSupported } from '@georapbox/web-share-element/dist/is-web-share-supported.js';\nimport '@georapbox/web-share-element/dist/web-share-defined.js';\nimport '@georapbox/modal-element/dist/modal-element-defined.js';\nimport '@georapbox/files-dropzone-element/dist/files-dropzone-defined.js';\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport '../css/main.css';\nimport { ACCEPTED_MIME_TYPES } from './constants.js';\nimport { uid } from './utils/uid.js';\nimport { fileFromUrl } from './utils/file-from-url.js';\nimport { storage } from './utils/storage.js';\nimport { isSolidColorSelected } from './utils/is-solid-color-selected.js';\nimport { customFonts, loadCustomFont } from './custom-fonts.js';\nimport { toastAlert } from './toast-alert.js';\nimport { Textbox } from './textbox.js';\nimport { Canvas } from './canvas.js';\n\nconst canvas = Canvas.createInstance(document.getElementById('canvas'));\nconst videoModal = document.getElementById('videoModal');\nconst downloadModal = document.getElementById('downloadModal');\nconst capturePhotoEl = document.querySelector('capture-photo');\nconst cameraSelect = document.getElementById('cameraSelect');\nconst capturePhotoButton = document.getElementById('capturePhotoButton');\nconst torchButton = document.getElementById('torchButton');\nconst dropzoneEl = document.querySelector('files-dropzone');\nconst instructionsEl = document.getElementById('instructions');\nconst imageUploadMethodSelect = document.getElementById('imageUploadMethodSelect');\nconst fileSelectBtn = document.getElementById('fileSelectBtn');\nconst imageUrlForm = document.getElementById('imageUrlForm');\nconst addTextboxBtn = document.getElementById('addTextboxBtn');\nconst textboxesContainer = document.getElementById('textboxesContainer');\nconst generateMemeBtn = document.getElementById('generateMemeBtn');\nconst openVideoModalBtn = document.getElementById('openVideoModalBtn');\nconst downloadMemeBtn = document.getElementById('downloadMemeBtn');\nconst downloadMemePreview = document.getElementById('downloadMemePreview');\nconst webShareComponent = document.querySelector('web-share');\nconst galleryEl = document.getElementById('gallery');\nconst gallerySearchEl = document.getElementById('gallerySearch');\nconst galleryNoResultsEl = galleryEl.querySelector('.gallery__no-results');\nconst solidColorForm = document.getElementById('solidColorForm');\nconst uploadMethodEls = document.querySelectorAll('.upload-method');\nconst removeConfirmationModal = document.getElementById('removeConfirmationModal');\nconst removeTextForm = document.getElementById('removeTextForm');\nconst maxImageDimensionsForm = document.getElementById('maxImageDimensionsForm');\nconst maxImageDimensionsSelect = maxImageDimensionsForm['maxImageDimensions'];\nconst clearCanvasBtn = document.getElementById('clearCanvasBtn');\nconst maxImageDimensionsFromStorage = storage.get('maxImageDimensions');\nlet shouldFocusOnTextboxCreate = false;\nlet selectedImage = null;\nlet reqAnimFrame = null;\n\nconst renderAcceptedImageFormats = (acceptedMimeTypes, rootEl) => {\n if (!rootEl) {\n return;\n }\n\n const extensions = acceptedMimeTypes.map(mimeType => mimeType.split('/')[1]);\n const str = `Supported image formats: ${extensions.join(', ')}`;\n const div = document.createElement('div');\n const small = document.createElement('small');\n\n small.textContent = str;\n div.appendChild(small);\n rootEl.appendChild(small);\n};\n\nconst generateMeme = async () => {\n const dataUrl = canvas.toDataURL('image/png');\n const filename = `${uid('meme')}.png`;\n\n // Prepare download link\n const downloadLink = dataUrl.replace('image/png', 'image/octet-stream');\n downloadMemeBtn.download = filename;\n downloadMemeBtn.href = downloadLink;\n downloadMemePreview.width = canvas.getDimensions().width;\n downloadMemePreview.height = canvas.getDimensions().height;\n downloadMemePreview.src = downloadLink;\n\n // Prepare for sharing file\n if (isWebShareSupported()) {\n try {\n const file = await fileFromUrl({\n url: dataUrl,\n filename,\n mimeType: 'image/png'\n }).catch(err => toastAlert(err.message, 'danger'));\n\n if (file && isWebShareSupported({ files: [file] })) {\n webShareComponent.shareFiles = [file];\n webShareComponent.hidden = false;\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n window.requestAnimationFrame(() => {\n downloadModal.open = true;\n });\n};\n\nconst setImageMaxDimensions = image => {\n const maxImageDimensionsSelect = maxImageDimensionsForm['maxImageDimensions'];\n const [maxWidthValue, maxHeightValue] = maxImageDimensionsSelect.value.split('x');\n const MAX_WIDTH = Number(maxWidthValue) || 800;\n const MAX_HEIGHT = Number(maxHeightValue) || 600;\n let width = image.width;\n let height = image.height;\n\n if (width > height) {\n if (width > MAX_WIDTH) {\n height *= MAX_WIDTH / width;\n width = MAX_WIDTH;\n }\n } else {\n if (height > MAX_HEIGHT) {\n width *= MAX_HEIGHT / height;\n height = MAX_HEIGHT;\n }\n }\n\n canvas.setDimensions({ width, height });\n};\n\nconst afterImageSelect = () => {\n canvas.draw(selectedImage, Textbox.getAll()).show();\n dropzoneEl.classList.add('dropzone--accepted');\n dropzoneEl.disabled = true;\n generateMemeBtn.disabled = false;\n instructionsEl.hidden = true;\n clearCanvasBtn.hidden = false;\n};\n\nconst handleImageLoad = evt => {\n selectedImage = evt.target;\n setImageMaxDimensions(selectedImage);\n afterImageSelect();\n};\n\nconst handleSolidColorFormInput = evt => {\n const DEFAULT_WIDTH = 800;\n const DEFAULT_HEIGHT = 600;\n\n if (evt.target === solidColorForm['canvasColor']) {\n selectedImage = evt.target.value;\n }\n\n if (isSolidColorSelected(selectedImage)) {\n canvas.setDimensions({\n width: Number(solidColorForm['canvasWidth'].value) || DEFAULT_WIDTH,\n height: Number(solidColorForm['canvasHeight'].value) || DEFAULT_HEIGHT\n });\n\n afterImageSelect();\n }\n};\n\nconst handleFileSelect = file => {\n if (!file) {\n return;\n }\n\n const image = new Image();\n const reader = new FileReader();\n\n reader.addEventListener('load', function (evt) {\n const data = evt.target.result;\n image.addEventListener('load', handleImageLoad);\n image.src = data;\n });\n\n reader.readAsDataURL(file);\n};\n\nconst handleOpenVideoModalButtonClick = () => {\n videoModal.open = true;\n};\n\nconst handleTextPropChange = (element, textboxId, prop) => {\n const textboxData = Textbox.getById(textboxId).getData();\n\n switch (element.type) {\n case 'checkbox':\n textboxData[prop] = element.checked;\n break;\n case 'number':\n textboxData[prop] = Number(element.value);\n break;\n default:\n textboxData[prop] = element.value;\n }\n\n canvas.draw(selectedImage, Textbox.getAll());\n};\n\nconst handleAddTextboxBtnClick = () => Textbox.create();\n\nconst handleImageUploadFromURL = async evt => {\n evt.preventDefault();\n\n const form = evt.target;\n const submitButton = form.querySelector('button[type=\"submit\"]');\n const imageUrl = form['imageUrl'].value;\n\n if (!imageUrl.trim()) {\n return;\n }\n\n submitButton.disabled = true;\n submitButton.querySelector('.spinner').hidden = false;\n submitButton.querySelector('.label').hidden = true;\n\n try {\n const file = await fileFromUrl({\n url: imageUrl\n }).catch(err => toastAlert(err.message, 'danger'));\n\n if (file) {\n handleFileSelect(file);\n }\n } catch {\n toastAlert(`Failed to load image from \"${imageUrl}\".`, 'danger');\n } finally {\n submitButton.disabled = false;\n submitButton.querySelector('.spinner').hidden = true;\n submitButton.querySelector('.label').hidden = false;\n }\n};\n\nconst moveTextUsingArrowbuttons = (textboxId, direction) => () => {\n const textboxEl = document.getElementById(textboxId);\n const offsetYInput = textboxEl.querySelector('[data-input=\"offsetY\"]');\n const offsetXInput = textboxEl.querySelector('[data-input=\"offsetX\"]');\n const textbox = Textbox.getById(textboxId);\n\n if (!textbox) {\n return;\n }\n\n const textboxData = textbox.getData();\n\n direction = direction.toLowerCase();\n\n switch (direction) {\n case 'up':\n textboxData.offsetY -= 1;\n offsetYInput.value = textboxData.offsetY;\n break;\n case 'down':\n textboxData.offsetY += 1;\n offsetYInput.value = textboxData.offsetY;\n break;\n case 'left':\n textboxData.offsetX -= 1;\n offsetXInput.value = textboxData.offsetX;\n break;\n case 'right':\n textboxData.offsetX += 1;\n offsetXInput.value = textboxData.offsetX;\n break;\n }\n\n canvas.draw(selectedImage, Textbox.getAll());\n\n reqAnimFrame = requestAnimationFrame(moveTextUsingArrowbuttons(textboxId, direction));\n};\n\nconst handleUploadMethodChange = evt => {\n uploadMethodEls.forEach(el => (el.hidden = el.id !== evt.target.value));\n maxImageDimensionsForm.hidden = evt.target.value === 'solidColorForm';\n};\n\nconst handleFileSelectClick = () => {\n if (typeof dropzoneEl.openFileDialog === 'function') {\n dropzoneEl.openFileDialog();\n }\n};\n\nconst handleDropFilesAccepted = evt => {\n const [file] = evt.detail.acceptedFiles;\n\n if (file) {\n handleFileSelect(file);\n }\n};\n\nconst handleTextboxesContainerInput = evt => {\n const element = evt.target;\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n let prop;\n\n if (element.matches('[data-input=\"text\"]')) {\n prop = 'text';\n } else if (element.matches('[data-input=\"fillColor\"]')) {\n prop = 'fillColor';\n } else if (element.matches('[data-input=\"strokeColor\"]')) {\n prop = 'strokeColor';\n } else if (element.matches('[data-input=\"font\"]')) {\n prop = 'font';\n } else if (element.matches('[data-input=\"fontSize\"]')) {\n prop = 'fontSize';\n } else if (element.matches('[data-input=\"fontWeight\"]')) {\n prop = 'fontWeight';\n } else if (element.matches('[data-input=\"textAlign\"]')) {\n prop = 'textAlign';\n } else if (element.matches('[data-input=\"shadowBlur\"]')) {\n prop = 'shadowBlur';\n } else if (element.matches('[data-input=\"offsetY\"]')) {\n prop = 'offsetY';\n } else if (element.matches('[data-input=\"offsetX\"]')) {\n prop = 'offsetX';\n } else if (element.matches('[data-input=\"rotate\"]')) {\n prop = 'rotate';\n } else if (element.matches('[data-input=\"strokeWidth\"]')) {\n prop = 'strokeWidth';\n }\n\n if (prop) {\n handleTextPropChange(element, textboxId, prop);\n }\n};\n\nconst handleTextboxesContainerChange = evt => {\n const element = evt.target;\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n let prop;\n\n if (element.matches('[data-input=\"allCaps\"]')) {\n prop = 'allCaps';\n }\n\n if (prop) {\n handleTextPropChange(element, textboxId, prop);\n }\n};\n\nconst handleTextboxesContainerClick = evt => {\n const element = evt.target;\n\n if (element.matches('[data-button=\"settings\"]')) {\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n const textboxSettingsEl = textboxEl?.querySelector('[data-section=\"settings\"]');\n\n if (textboxSettingsEl) {\n textboxSettingsEl.hidden = !textboxSettingsEl.hidden;\n }\n }\n\n if (element.matches('[data-button=\"duplicate-text-box\"')) {\n const currentTextboxEl = element.closest('[data-section=\"textbox\"]');\n const currentTextboxData = Textbox.getById(currentTextboxEl.id);\n Textbox.create({ ...currentTextboxData.data });\n }\n\n if (element.matches('[data-button=\"delete-text-box\"]')) {\n const textboxId = element.closest('[data-section=\"textbox\"]').id;\n const textboxToDelete = Textbox.getById(textboxId);\n\n if (textboxToDelete && textboxToDelete.data.text.trim()) {\n const textboxIdInput = removeTextForm['textbox-id'];\n\n if (textboxIdInput) {\n textboxIdInput.value = textboxId;\n removeConfirmationModal.open = true;\n }\n } else {\n Textbox.remove(textboxId);\n }\n }\n};\n\nconst handleTextRemoveFormSubmit = evt => {\n evt.preventDefault();\n const textboxId = evt.target['textbox-id'].value;\n\n if (textboxId) {\n Textbox.remove(textboxId);\n removeConfirmationModal.open = false;\n }\n};\n\nconst handleTextboxesContainerPointerdown = evt => {\n const element = evt.target;\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n\n if (!textboxEl) {\n return;\n }\n\n if (element.matches('[data-action=\"move-text\"]')) {\n reqAnimFrame = requestAnimationFrame(\n moveTextUsingArrowbuttons(textboxEl.id, element.getAttribute('aria-label'))\n );\n }\n};\n\nconst handleTextboxesContainerPointerup = evt => {\n const element = evt.target;\n\n if (element.matches('[data-action=\"move-text\"]')) {\n cancelAnimationFrame && cancelAnimationFrame(reqAnimFrame);\n reqAnimFrame = null;\n }\n};\n\nconst handleTextboxesContainerPointerout = evt => {\n const element = evt.target;\n\n if (element.matches('[data-action=\"move-text\"]')) {\n cancelAnimationFrame && cancelAnimationFrame(reqAnimFrame);\n reqAnimFrame = null;\n }\n};\n\nconst handleTextboxesContainerKeyDown = evt => {\n const element = evt.target;\n const textboxEl = element.closest('[data-section=\"textbox\"]');\n\n if (element.matches('[data-action=\"move-text\"]')) {\n if (evt.key === ' ' || evt.key === 'Enter') {\n reqAnimFrame && cancelAnimationFrame(reqAnimFrame);\n reqAnimFrame = requestAnimationFrame(\n moveTextUsingArrowbuttons(textboxEl.id, element.getAttribute('aria-label'))\n );\n }\n }\n};\n\nconst handleTextboxesContainerKeyUp = evt => {\n const element = evt.target;\n\n if (element.matches('[data-action=\"move-text\"]')) {\n if (evt.key === ' ' || evt.key === 'Enter') {\n reqAnimFrame && cancelAnimationFrame(reqAnimFrame);\n reqAnimFrame = null;\n }\n }\n};\n\nconst handleGalleryClick = async evt => {\n const button = evt.target.closest('button');\n\n if (!button) {\n return;\n }\n\n const img = button.querySelector('img');\n\n try {\n const file = await fileFromUrl({\n url: img.src\n }).catch(err => toastAlert(err.message, 'danger'));\n\n if (file) {\n handleFileSelect(file);\n }\n } catch {\n toastAlert(`Failed to load image: \"${img.alt}\".`, 'danger');\n }\n};\n\nconst handleGallerySearchInput = evt => {\n const query = evt.target.value.toLowerCase().trim();\n const galleryItems = galleryEl.querySelectorAll('button');\n\n galleryItems.forEach(item => {\n const alt = (item.querySelector('img').getAttribute('alt') || '').toLowerCase();\n item.hidden = !alt.includes(query);\n });\n\n galleryNoResultsEl.hidden = !!galleryEl.querySelector('button:not([hidden])');\n};\n\nconst handleWebShareError = () => {\n downloadModal.open = false;\n toastAlert('There was an error while trying to share your meme.', 'danger');\n};\n\nconst handleCapturePhotoError = evt => {\n const error = evt.detail.error;\n let errorMessage = 'An error occurred while trying to capture photo.';\n\n if (\n error instanceof Error &&\n (error.name === 'NotAllowedError' || error.name === 'NotFoundError')\n ) {\n errorMessage +=\n ' Make sure you have a camera connected and you have granted the appropriate permissions.';\n }\n\n toastAlert(errorMessage, 'danger');\n videoModal.open = false;\n console.error(error);\n};\n\nconst handleCapturePhotoSuccess = evt => {\n videoModal.open = false;\n const image = new Image();\n image.addEventListener('load', handleImageLoad);\n image.src = evt.detail.dataURI;\n};\n\nconst handleModalOpen = evt => {\n if (evt.target.id === 'videoModal') {\n if (capturePhotoEl && typeof capturePhotoEl.startVideoStream === 'function') {\n capturePhotoEl.startVideoStream();\n }\n }\n};\n\nconst handleModalClose = evt => {\n if (evt.target.id === 'videoModal') {\n if (capturePhotoEl && typeof capturePhotoEl.stopVideoStream === 'function') {\n capturePhotoEl.stopVideoStream();\n }\n }\n\n if (evt.target.id === 'removeConfirmationModal') {\n removeTextForm.reset();\n }\n};\n\nconst handleEmojiPickerSelection = evt => {\n const textboxEl = evt.target.closest('[data-section=\"textbox\"]');\n\n if (textboxEl) {\n const input = textboxEl.querySelector('[data-input=\"text\"]');\n const emoji = evt.detail.unicode;\n\n if (input) {\n insertTextAtCursor(input, emoji);\n }\n }\n};\n\nconst handleMaxImageDimensionsFormChange = evt => {\n if (evt.target.matches('[name=\"maxImageDimensions\"]')) {\n storage.set('maxImageDimensions', evt.target.value);\n }\n\n if (!selectedImage || isSolidColorSelected(selectedImage)) {\n return;\n }\n\n setImageMaxDimensions(selectedImage);\n canvas.draw(selectedImage, Textbox.getAll());\n};\n\nconst handleTextboxCreate = evt => {\n const textbox = evt.detail.textbox;\n const textboxEl = Textbox.createElement(textbox, shouldFocusOnTextboxCreate);\n\n shouldFocusOnTextboxCreate = true;\n textboxesContainer.appendChild(textboxEl);\n\n if (textbox.getData().text) {\n canvas.draw(selectedImage, Textbox.getAll());\n }\n};\n\nconst handleTextboxDelete = evt => {\n const textboxEl = document.getElementById(evt.detail.id);\n textboxEl && textboxEl.remove();\n\n textboxesContainer.querySelectorAll('[data-section=\"textbox\"]').forEach((el, idx) => {\n el.querySelector('[data-input=\"text\"]').setAttribute('placeholder', `Text #${idx + 1}`);\n });\n\n canvas.draw(selectedImage, Textbox.getAll());\n};\n\nconst handleClearCanvas = evt => {\n if (!selectedImage) {\n return;\n }\n\n evt.stopPropagation();\n selectedImage = null;\n dropzoneEl.classList.remove('dropzone--accepted');\n generateMemeBtn.disabled = true;\n instructionsEl.hidden = false;\n clearCanvasBtn.hidden = true;\n dropzoneEl.disabled = false;\n canvas.clear().hide();\n};\n\nconst toggleTorchButtonStatus = (options = {}) => {\n const defaults = {\n el: document.getElementById('torchButton'),\n isTorchOn: false\n };\n const { el, isTorchOn } = { ...defaults, ...options };\n const iconPaths = el.querySelectorAll('svg path');\n\n if (iconPaths.length !== 2) {\n return;\n }\n\n iconPaths[0].style.display = isTorchOn ? 'none' : 'block';\n iconPaths[1].style.display = isTorchOn ? 'block' : 'none';\n el.setAttribute('aria-label', `Turn ${isTorchOn ? 'off' : 'on'} flash`);\n};\n\nconst handleTorchButtonClick = evt => {\n if (capturePhotoEl === null) {\n return;\n }\n\n capturePhotoEl.torch = !capturePhotoEl.torch;\n\n toggleTorchButtonStatus({\n el: evt.currentTarget,\n isTorchOn: capturePhotoEl.hasAttribute('torch')\n });\n};\n\nconst handleCapturePhotoVideoPlay = async evt => {\n const trackCapabilities = evt.target.getTrackCapabilities();\n\n if (trackCapabilities?.torch) {\n torchButton?.removeAttribute('hidden');\n\n if (capturePhotoEl?.hasAttribute('torch')) {\n toggleTorchButtonStatus({ el: torchButton, isTorchOn: true });\n }\n }\n\n const videoInputDevices = await CapturePhoto.getVideoInputDevices();\n\n videoInputDevices.forEach((device, index) => {\n const option = document.createElement('option');\n option.value = device.deviceId;\n option.textContent = device.label || `Camera ${index + 1}`;\n cameraSelect.appendChild(option);\n });\n\n if (videoInputDevices.length > 1) {\n cameraSelect?.removeAttribute('hidden');\n }\n};\n\nconst handleCameraSelectChange = evt => {\n if (\n capturePhotoEl === null ||\n typeof capturePhotoEl.restartVideoStream !== 'function' ||\n capturePhotoEl.hasAttribute('loading')\n ) {\n return;\n }\n\n const videoDeviceId = evt.target.value || undefined;\n capturePhotoEl.restartVideoStream(videoDeviceId);\n};\n\nconst handleCapturePhotoButtonClick = () => {\n if (\n capturePhotoEl === null ||\n typeof capturePhotoEl.capture !== 'function' ||\n capturePhotoEl.hasAttribute('loading')\n ) {\n return;\n }\n\n capturePhotoEl.capture();\n};\n\ndocument.addEventListener('web-share:error', handleWebShareError);\ndocument.addEventListener('capture-photo:video-play', handleCapturePhotoVideoPlay, { once: true });\ndocument.addEventListener('capture-photo:error', handleCapturePhotoError);\ndocument.addEventListener('capture-photo:success', handleCapturePhotoSuccess);\ndocument.addEventListener('me-open', handleModalOpen);\ndocument.addEventListener('me-close', handleModalClose);\ndocument.addEventListener('emoji-click', handleEmojiPickerSelection);\ndocument.addEventListener('textbox-create', handleTextboxCreate);\ndocument.addEventListener('textbox-remove', handleTextboxDelete);\nfileSelectBtn.addEventListener('click', handleFileSelectClick);\nopenVideoModalBtn.addEventListener('click', handleOpenVideoModalButtonClick);\naddTextboxBtn.addEventListener('click', handleAddTextboxBtnClick);\ngenerateMemeBtn.addEventListener('click', generateMeme);\ndownloadMemeBtn.addEventListener('click', () => (downloadModal.open = false));\nimageUrlForm.addEventListener('submit', handleImageUploadFromURL);\ndropzoneEl.addEventListener('files-dropzone-drop-accepted', handleDropFilesAccepted);\ntextboxesContainer.addEventListener('input', handleTextboxesContainerInput);\ntextboxesContainer.addEventListener('change', handleTextboxesContainerChange);\ntextboxesContainer.addEventListener('click', handleTextboxesContainerClick);\ntextboxesContainer.addEventListener('pointerdown', handleTextboxesContainerPointerdown);\ntextboxesContainer.addEventListener('pointerup', handleTextboxesContainerPointerup);\ntextboxesContainer.addEventListener('pointerout', handleTextboxesContainerPointerout);\ntextboxesContainer.addEventListener('keydown', handleTextboxesContainerKeyDown);\ntextboxesContainer.addEventListener('keyup', handleTextboxesContainerKeyUp);\nimageUploadMethodSelect.addEventListener('change', handleUploadMethodChange);\ngalleryEl.addEventListener('click', handleGalleryClick);\ngallerySearchEl.addEventListener('input', handleGallerySearchInput);\nsolidColorForm.addEventListener('input', handleSolidColorFormInput);\nremoveTextForm.addEventListener('submit', handleTextRemoveFormSubmit);\nmaxImageDimensionsForm.addEventListener('change', handleMaxImageDimensionsFormChange);\nclearCanvasBtn.addEventListener('click', handleClearCanvas);\ncameraSelect.addEventListener('change', handleCameraSelectChange);\ncapturePhotoButton.addEventListener('click', handleCapturePhotoButtonClick);\ntorchButton.addEventListener('click', handleTorchButtonClick);\n\ngalleryEl.querySelectorAll('button > img')?.forEach(image => {\n image.setAttribute('title', image.getAttribute('alt'));\n});\n\nTextbox.create();\n\ndropzoneEl.accept = ACCEPTED_MIME_TYPES;\n\nrenderAcceptedImageFormats(ACCEPTED_MIME_TYPES, instructionsEl);\n\ncustomFonts.forEach(({ name, path, style, weight }) => {\n loadCustomFont(name, path, { style, weight });\n});\n\nif (maxImageDimensionsFromStorage) {\n maxImageDimensionsSelect.value = maxImageDimensionsFromStorage;\n}\n\nmaxImageDimensionsSelect.disabled = false;\n","import Picker from './picker.js'\nimport Database from './database.js'\nexport { Picker, Database }\n","import Database from './database.js';\n\n// via https://unpkg.com/browse/emojibase-data@6.0.0/meta/groups.json\nconst allGroups = [\n [-1, '✨', 'custom'],\n [0, '😀', 'smileys-emotion'],\n [1, '👋', 'people-body'],\n [3, '🐱', 'animals-nature'],\n [4, '🍎', 'food-drink'],\n [5, '🏠️', 'travel-places'],\n [6, '⚽', 'activities'],\n [7, '📝', 'objects'],\n [8, '⛔️', 'symbols'],\n [9, '🏁', 'flags']\n].map(([id, emoji, name]) => ({ id, emoji, name }));\n\nconst groups = allGroups.slice(1);\n\nconst MIN_SEARCH_TEXT_LENGTH = 2;\nconst NUM_SKIN_TONES = 6;\n\n/* istanbul ignore next */\nconst rIC = typeof requestIdleCallback === 'function' ? requestIdleCallback : setTimeout;\n\n// check for ZWJ (zero width joiner) character\nfunction hasZwj (emoji) {\n return emoji.unicode.includes('\\u200d')\n}\n\n// Find one good representative emoji from each version to test by checking its color.\n// Ideally it should have color in the center. For some inspiration, see:\n// https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/\n//\n// Note that for certain versions (12.1, 13.1), there is no point in testing them explicitly, because\n// all the emoji from this version are compound-emoji from previous versions. So they would pass a color\n// test, even in browsers that display them as double emoji. (E.g. \"face in clouds\" might render as\n// \"face without mouth\" plus \"fog\".) These emoji can only be filtered using the width test,\n// which happens in checkZwjSupport.js.\nconst versionsAndTestEmoji = {\n '🫨': 15.1, // shaking head, technically from v15 but see note above\n '🫠': 14,\n '🥲': 13.1, // smiling face with tear, technically from v13 but see note above\n '🥻': 12.1, // sari, technically from v12 but see note above\n '🥰': 11,\n '🤩': 5,\n '👱‍♀️': 4,\n '🤣': 3,\n '👁️‍🗨️': 2,\n '😀': 1,\n '😐️': 0.7,\n '😃': 0.6\n};\n\nconst TIMEOUT_BEFORE_LOADING_MESSAGE = 1000; // 1 second\nconst DEFAULT_SKIN_TONE_EMOJI = '🖐️';\nconst DEFAULT_NUM_COLUMNS = 8;\n\n// Based on https://fivethirtyeight.com/features/the-100-most-used-emojis/ and\n// https://blog.emojipedia.org/facebook-reveals-most-and-least-used-emojis/ with\n// a bit of my own curation. (E.g. avoid the \"OK\" gesture because of connotations:\n// https://emojipedia.org/ok-hand/)\nconst MOST_COMMONLY_USED_EMOJI = [\n '😊',\n '😒',\n '❤️',\n '👍️',\n '😍',\n '😂',\n '😭',\n '☺️',\n '😔',\n '😩',\n '😏',\n '💕',\n '🙌',\n '😘'\n];\n\n// It's important to list Twemoji Mozilla before everything else, because Mozilla bundles their\n// own font on some platforms (notably Windows and Linux as of this writing). Typically, Mozilla\n// updates faster than the underlying OS, and we don't want to render older emoji in one font and\n// newer emoji in another font:\n// https://github.com/nolanlawson/emoji-picker-element/pull/268#issuecomment-1073347283\nconst FONT_FAMILY = '\"Twemoji Mozilla\",\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",' +\n '\"Noto Color Emoji\",\"EmojiOne Color\",\"Android Emoji\",sans-serif';\n\n/* istanbul ignore next */\nconst DEFAULT_CATEGORY_SORTING = (a, b) => a < b ? -1 : a > b ? 1 : 0;\n\n// Test if an emoji is supported by rendering it to canvas and checking that the color is not black\n// See https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/\n// and https://www.npmjs.com/package/if-emoji for inspiration\n// This implementation is largely borrowed from if-emoji, adding the font-family\n\n\nconst getTextFeature = (text, color) => {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = 1;\n\n const ctx = canvas.getContext('2d', {\n // Improves the performance of `getImageData()`\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/getContextAttributes#willreadfrequently\n willReadFrequently: true\n });\n ctx.textBaseline = 'top';\n ctx.font = `100px ${FONT_FAMILY}`;\n ctx.fillStyle = color;\n ctx.scale(0.01, 0.01);\n ctx.fillText(text, 0, 0);\n\n return ctx.getImageData(0, 0, 1, 1).data\n};\n\nconst compareFeatures = (feature1, feature2) => {\n const feature1Str = [...feature1].join(',');\n const feature2Str = [...feature2].join(',');\n // This is RGBA, so for 0,0,0, we are checking that the first RGB is not all zeroes.\n // Most of the time when unsupported this is 0,0,0,0, but on Chrome on Mac it is\n // 0,0,0,61 - there is a transparency here.\n return feature1Str === feature2Str && !feature1Str.startsWith('0,0,0,')\n};\n\nfunction testColorEmojiSupported (text) {\n // Render white and black and then compare them to each other and ensure they're the same\n // color, and neither one is black. This shows that the emoji was rendered in color.\n const feature1 = getTextFeature(text, '#000');\n const feature2 = getTextFeature(text, '#fff');\n return feature1 && feature2 && compareFeatures(feature1, feature2)\n}\n\n// rather than check every emoji ever, which would be expensive, just check some representatives from the\n// different emoji releases to determine what the font supports\n\nfunction determineEmojiSupportLevel () {\n const entries = Object.entries(versionsAndTestEmoji);\n try {\n // start with latest emoji and work backwards\n for (const [emoji, version] of entries) {\n if (testColorEmojiSupported(emoji)) {\n return version\n }\n }\n } catch (e) { // canvas error\n } finally {\n }\n // In case of an error, be generous and just assume all emoji are supported (e.g. for canvas errors\n // due to anti-fingerprinting add-ons). Better to show some gray boxes than nothing at all.\n return entries[0][1] // first one in the list is the most recent version\n}\n\n// Check which emojis we know for sure aren't supported, based on Unicode version level\nlet promise;\nconst detectEmojiSupportLevel = () => {\n if (!promise) {\n // Delay so it can run while the IDB database is being created by the browser (on another thread).\n // This helps especially with first load – we want to start pre-populating the database on the main thread,\n // and then wait for IDB to commit everything, and while waiting we run this check.\n promise = new Promise(resolve => (\n rIC(() => (\n resolve(determineEmojiSupportLevel()) // delay so ideally this can run while IDB is first populating\n ))\n ));\n }\n return promise\n};\n// determine which emojis containing ZWJ (zero width joiner) characters\n// are supported (rendered as one glyph) rather than unsupported (rendered as two or more glyphs)\nconst supportedZwjEmojis = new Map();\n\nconst VARIATION_SELECTOR = '\\ufe0f';\nconst SKINTONE_MODIFIER = '\\ud83c';\nconst ZWJ = '\\u200d';\nconst LIGHT_SKIN_TONE = 0x1F3FB;\nconst LIGHT_SKIN_TONE_MODIFIER = 0xdffb;\n\n// TODO: this is a naive implementation, we can improve it later\n// It's only used for the skintone picker, so as long as people don't customize with\n// really exotic emoji then it should work fine\nfunction applySkinTone (str, skinTone) {\n if (skinTone === 0) {\n return str\n }\n const zwjIndex = str.indexOf(ZWJ);\n if (zwjIndex !== -1) {\n return str.substring(0, zwjIndex) +\n String.fromCodePoint(LIGHT_SKIN_TONE + skinTone - 1) +\n str.substring(zwjIndex)\n }\n if (str.endsWith(VARIATION_SELECTOR)) {\n str = str.substring(0, str.length - 1);\n }\n return str + SKINTONE_MODIFIER + String.fromCodePoint(LIGHT_SKIN_TONE_MODIFIER + skinTone - 1)\n}\n\nfunction halt (event) {\n event.preventDefault();\n event.stopPropagation();\n}\n\n// Implementation left/right or up/down navigation, circling back when you\n// reach the start/end of the list\nfunction incrementOrDecrement (decrement, val, arr) {\n val += (decrement ? -1 : 1);\n if (val < 0) {\n val = arr.length - 1;\n } else if (val >= arr.length) {\n val = 0;\n }\n return val\n}\n\n// like lodash's uniqBy but much smaller\nfunction uniqBy (arr, func) {\n const set = new Set();\n const res = [];\n for (const item of arr) {\n const key = func(item);\n if (!set.has(key)) {\n set.add(key);\n res.push(item);\n }\n }\n return res\n}\n\n// We don't need all the data on every emoji, and there are specific things we need\n// for the UI, so build a \"view model\" from the emoji object we got from the database\n\nfunction summarizeEmojisForUI (emojis, emojiSupportLevel) {\n const toSimpleSkinsMap = skins => {\n const res = {};\n for (const skin of skins) {\n // ignore arrays like [1, 2] with multiple skin tones\n // also ignore variants that are in an unsupported emoji version\n // (these do exist - variants from a different version than their base emoji)\n if (typeof skin.tone === 'number' && skin.version <= emojiSupportLevel) {\n res[skin.tone] = skin.unicode;\n }\n }\n return res\n };\n\n return emojis.map(({ unicode, skins, shortcodes, url, name, category, annotation }) => ({\n unicode,\n name,\n shortcodes,\n url,\n category,\n annotation,\n id: unicode || name,\n skins: skins && toSimpleSkinsMap(skins)\n }))\n}\n\n// import rAF from one place so that the bundle size is a bit smaller\nconst rAF = requestAnimationFrame;\n\n// \"Svelte action\"-like utility to detect layout changes via ResizeObserver.\n// If ResizeObserver is unsupported, we just use rAF once and don't bother to update.\n\n\nlet resizeObserverSupported = typeof ResizeObserver === 'function';\n\nfunction resizeObserverAction (node, abortSignal, onUpdate) {\n let resizeObserver;\n if (resizeObserverSupported) {\n resizeObserver = new ResizeObserver(onUpdate);\n resizeObserver.observe(node);\n } else { // just run once, don't bother trying to track it\n rAF(onUpdate);\n }\n\n // cleanup function (called on destroy)\n abortSignal.addEventListener('abort', () => {\n if (resizeObserver) {\n resizeObserver.disconnect();\n }\n });\n}\n\n// get the width of the text inside of a DOM node, via https://stackoverflow.com/a/59525891/680742\nfunction calculateTextWidth (node) {\n // skip running this in jest/vitest because we don't need to check for emoji support in that environment\n /* istanbul ignore else */\n {\n const range = document.createRange();\n range.selectNode(node.firstChild);\n return range.getBoundingClientRect().width\n }\n}\n\nlet baselineEmojiWidth;\n\n/**\n * Check if the given emojis containing ZWJ characters are supported by the current browser (don't render\n * as double characters) and return true if all are supported.\n * @param zwjEmojisToCheck\n * @param baselineEmoji\n * @param emojiToDomNode\n */\nfunction checkZwjSupport (zwjEmojisToCheck, baselineEmoji, emojiToDomNode) {\n let allSupported = true;\n for (const emoji of zwjEmojisToCheck) {\n const domNode = emojiToDomNode(emoji);\n const emojiWidth = calculateTextWidth(domNode);\n if (typeof baselineEmojiWidth === 'undefined') { // calculate the baseline emoji width only once\n baselineEmojiWidth = calculateTextWidth(baselineEmoji);\n }\n // On Windows, some supported emoji are ~50% bigger than the baseline emoji, but what we really want to guard\n // against are the ones that are 2x the size, because those are truly broken (person with red hair = person with\n // floating red wig, black cat = cat with black square, polar bear = bear with snowflake, etc.)\n // So here we set the threshold at 1.8 times the size of the baseline emoji.\n const supported = emojiWidth / 1.8 < baselineEmojiWidth;\n supportedZwjEmojis.set(emoji.unicode, supported);\n\n if (!supported) {\n allSupported = false;\n }\n }\n return allSupported\n}\n\n// like lodash's uniq\n\nfunction uniq (arr) {\n return uniqBy(arr, _ => _)\n}\n\n// Note we put this in its own function outside Picker.js to avoid Svelte doing an invalidation on the \"setter\" here.\n// At best the invalidation is useless, at worst it can cause infinite loops:\n// https://github.com/nolanlawson/emoji-picker-element/pull/180\n// https://github.com/sveltejs/svelte/issues/6521\n// Also note tabpanelElement can be null if the element is disconnected immediately after connected\nfunction resetScrollTopIfPossible (element) {\n /* istanbul ignore else */\n if (element) { // Makes me nervous not to have this `if` guard\n element.scrollTop = 0;\n }\n}\n\nfunction getFromMap (cache, key, func) {\n let cached = cache.get(key);\n if (!cached) {\n cached = func();\n cache.set(key, cached);\n }\n return cached\n}\n\nfunction toString (value) {\n return '' + value\n}\n\nfunction parseTemplate (htmlString) {\n const template = document.createElement('template');\n template.innerHTML = htmlString;\n return template\n}\n\nconst parseCache = new WeakMap();\nconst domInstancesCache = new WeakMap();\n// This needs to be a symbol because it needs to be different from any possible output of a key function\nconst unkeyedSymbol = Symbol('un-keyed');\n\n// Not supported in Safari <=13\nconst hasReplaceChildren = 'replaceChildren' in Element.prototype;\nfunction replaceChildren (parentNode, newChildren) {\n /* istanbul ignore else */\n if (hasReplaceChildren) {\n parentNode.replaceChildren(...newChildren);\n } else { // minimal polyfill for Element.prototype.replaceChildren\n parentNode.innerHTML = '';\n parentNode.append(...newChildren);\n }\n}\n\nfunction doChildrenNeedRerender (parentNode, newChildren) {\n let oldChild = parentNode.firstChild;\n let oldChildrenCount = 0;\n // iterate using firstChild/nextSibling because browsers use a linked list under the hood\n while (oldChild) {\n const newChild = newChildren[oldChildrenCount];\n // check if the old child and new child are the same\n if (newChild !== oldChild) {\n return true\n }\n oldChild = oldChild.nextSibling;\n oldChildrenCount++;\n }\n // if new children length is different from old, we must re-render\n return oldChildrenCount !== newChildren.length\n}\n\nfunction patchChildren (newChildren, instanceBinding) {\n const { targetNode } = instanceBinding;\n let { targetParentNode } = instanceBinding;\n\n let needsRerender = false;\n\n if (targetParentNode) { // already rendered once\n needsRerender = doChildrenNeedRerender(targetParentNode, newChildren);\n } else { // first render of list\n needsRerender = true;\n instanceBinding.targetNode = undefined; // placeholder node not needed anymore, free memory\n instanceBinding.targetParentNode = targetParentNode = targetNode.parentNode;\n }\n // avoid re-rendering list if the dom nodes are exactly the same before and after\n if (needsRerender) {\n replaceChildren(targetParentNode, newChildren);\n }\n}\n\nfunction patch (expressions, instanceBindings) {\n for (const instanceBinding of instanceBindings) {\n const {\n targetNode,\n currentExpression,\n binding: {\n expressionIndex,\n attributeName,\n attributeValuePre,\n attributeValuePost\n }\n } = instanceBinding;\n\n const expression = expressions[expressionIndex];\n\n if (currentExpression === expression) {\n // no need to update, same as before\n continue\n }\n\n instanceBinding.currentExpression = expression;\n\n if (attributeName) { // attribute replacement\n targetNode.setAttribute(attributeName, attributeValuePre + toString(expression) + attributeValuePost);\n } else { // text node / child element / children replacement\n let newNode;\n if (Array.isArray(expression)) { // array of DOM elements produced by tag template literals\n patchChildren(expression, instanceBinding);\n } else if (expression instanceof Element) { // html tag template returning a DOM element\n newNode = expression;\n targetNode.replaceWith(newNode);\n } else { // primitive - string, number, etc\n // nodeValue is faster than textContent supposedly https://www.youtube.com/watch?v=LY6y3HbDVmg\n // note we may be replacing the value in a placeholder text node\n targetNode.nodeValue = toString(expression);\n }\n if (newNode) {\n instanceBinding.targetNode = newNode;\n }\n }\n }\n}\n\nfunction parse (tokens) {\n let htmlString = '';\n\n let withinTag = false;\n let withinAttribute = false;\n let elementIndexCounter = -1; // depth-first traversal order\n\n const elementsToBindings = new Map();\n const elementIndexes = [];\n\n for (let i = 0, len = tokens.length; i < len; i++) {\n const token = tokens[i];\n htmlString += token;\n\n if (i === len - 1) {\n break // no need to process characters - no more expressions to be found\n }\n\n for (let j = 0; j < token.length; j++) {\n const char = token.charAt(j);\n switch (char) {\n case '<': {\n const nextChar = token.charAt(j + 1);\n if (nextChar === '/') { // closing tag\n // leaving an element\n elementIndexes.pop();\n } else { // not a closing tag\n withinTag = true;\n elementIndexes.push(++elementIndexCounter);\n }\n break\n }\n case '>': {\n withinTag = false;\n withinAttribute = false;\n break\n }\n case '=': {\n withinAttribute = true;\n break\n }\n }\n }\n\n const elementIndex = elementIndexes[elementIndexes.length - 1];\n const bindings = getFromMap(elementsToBindings, elementIndex, () => []);\n\n let attributeName;\n let attributeValuePre;\n let attributeValuePost;\n if (withinAttribute) {\n // I never use single-quotes for attribute values in HTML, so just support double-quotes or no-quotes\n const match = /(\\S+)=\"?([^\"=]*)$/.exec(token);\n attributeName = match[1];\n attributeValuePre = match[2];\n attributeValuePost = /^[^\">]*/.exec(tokens[i + 1])[0];\n }\n\n const binding = {\n attributeName,\n attributeValuePre,\n attributeValuePost,\n expressionIndex: i\n };\n\n bindings.push(binding);\n\n if (!withinTag && !withinAttribute) {\n // Add a placeholder text node, so we can find it later. Note we only support one dynamic child text node\n htmlString += ' ';\n }\n }\n\n const template = parseTemplate(htmlString);\n\n return {\n template,\n elementsToBindings\n }\n}\n\nfunction applyBindings (bindings, element, instanceBindings) {\n for (let i = 0; i < bindings.length; i++) {\n const binding = bindings[i];\n\n const targetNode = binding.attributeName\n ? element // attribute binding, just use the element itself\n : element.firstChild; // not an attribute binding, so has a placeholder text node\n\n const instanceBinding = {\n binding,\n targetNode,\n targetParentNode: undefined,\n currentExpression: undefined\n };\n\n instanceBindings.push(instanceBinding);\n }\n}\n\nfunction traverseAndSetupBindings (rootElement, elementsToBindings) {\n const instanceBindings = [];\n\n let topLevelBindings;\n if (elementsToBindings.size === 1 && (topLevelBindings = elementsToBindings.get(0))) {\n // Optimization for the common case where there's only one element and one binding\n // Skip creating a TreeWalker entirely and just handle the root DOM element\n applyBindings(topLevelBindings, rootElement, instanceBindings);\n } else {\n // traverse dom\n const treeWalker = document.createTreeWalker(rootElement, NodeFilter.SHOW_ELEMENT);\n\n let element = rootElement;\n let elementIndex = -1;\n do {\n const bindings = elementsToBindings.get(++elementIndex);\n if (bindings) {\n applyBindings(bindings, element, instanceBindings);\n }\n } while ((element = treeWalker.nextNode()))\n }\n\n return instanceBindings\n}\n\nfunction parseHtml (tokens) {\n // All templates and bound expressions are unique per tokens array\n const { template, elementsToBindings } = getFromMap(parseCache, tokens, () => parse(tokens));\n\n // When we parseHtml, we always return a fresh DOM instance ready to be updated\n const dom = template.cloneNode(true).content.firstElementChild;\n const instanceBindings = traverseAndSetupBindings(dom, elementsToBindings);\n\n return function updateDomInstance (expressions) {\n patch(expressions, instanceBindings);\n return dom\n }\n}\n\nfunction createFramework (state) {\n const domInstances = getFromMap(domInstancesCache, state, () => new Map());\n let domInstanceCacheKey = unkeyedSymbol;\n\n function html (tokens, ...expressions) {\n // Each unique lexical usage of map() is considered unique due to the html`` tagged template call it makes,\n // which has lexically unique tokens. The unkeyed symbol is just used for html`` usage outside of a map().\n const domInstancesForTokens = getFromMap(domInstances, tokens, () => new Map());\n const updateDomInstance = getFromMap(domInstancesForTokens, domInstanceCacheKey, () => parseHtml(tokens));\n\n return updateDomInstance(expressions) // update with expressions\n }\n\n function map (array, callback, keyFunction) {\n return array.map((item, index) => {\n const originalCacheKey = domInstanceCacheKey;\n domInstanceCacheKey = keyFunction(item);\n try {\n return callback(item, index)\n } finally {\n domInstanceCacheKey = originalCacheKey;\n }\n })\n }\n\n return { map, html }\n}\n\nfunction render (container, state, helpers, events, actions, refs, abortSignal, actionContext, firstRender) {\n const { labelWithSkin, titleForEmoji, unicodeWithSkin } = helpers;\n const { html, map } = createFramework(state);\n\n function emojiList (emojis, searchMode, prefix) {\n return map(emojis, (emoji, i) => {\n return html``\n // It's important for the cache key to be unique based on the prefix, because the framework caches based on the\n // unique tokens + cache key, and the same emoji may be used in the tab as well as in the fav bar\n }, emoji => `${prefix}-${emoji.id}`)\n }\n\n const section = () => {\n return html`
${state.i18n.searchDescription}
${state.i18n.skinToneDescription}
${\n map(state.skinTones, (skinTone, i) => {\n return html`
${skinTone}
`\n }, skinTone => skinTone)\n }
${\n map(state.groups, (group) => {\n return html``\n }, group => group.id)\n }
${state.message || ''}
${\n map(state.currentEmojisWithCategories, (emojiWithCategory, i) => {\n return html`
${\n state.searchMode\n ? state.i18n.searchResultsLabel\n : (\n emojiWithCategory.category\n ? emojiWithCategory.category\n : (\n state.currentEmojisWithCategories.length > 1\n ? state.i18n.categories.custom\n : state.i18n.categories[state.currentGroup.name]\n )\n )\n }
${\n emojiList(emojiWithCategory.emojis, state.searchMode, /* prefix */ 'emo')\n }
`\n }, emojiWithCategory => emojiWithCategory.category)\n }
${\n emojiList(state.currentFavorites, /* searchMode */ false, /* prefix */ 'fav')\n }
`\n };\n\n const rootDom = section();\n\n // helper for traversing the dom, finding elements by an attribute, and getting the attribute value\n const forElementWithAttribute = (attributeName, callback) => {\n for (const element of container.querySelectorAll(`[${attributeName}]`)) {\n callback(element, element.getAttribute(attributeName));\n }\n };\n\n if (firstRender) { // not a re-render\n container.appendChild(rootDom);\n\n // we only bind events/refs once - there is no need to find them again given this component structure\n\n // bind events\n for (const eventName of ['click', 'focusout', 'input', 'keydown', 'keyup']) {\n forElementWithAttribute(`data-on-${eventName}`, (element, listenerName) => {\n element.addEventListener(eventName, events[listenerName]);\n });\n }\n\n // find refs\n forElementWithAttribute('data-ref', (element, ref) => {\n refs[ref] = element;\n });\n\n // destroy/abort logic\n abortSignal.addEventListener('abort', () => {\n container.removeChild(rootDom);\n });\n }\n\n // set up actions - these are re-bound on every render\n forElementWithAttribute('data-action', (element, action) => {\n let boundActions = actionContext.get(action);\n if (!boundActions) {\n actionContext.set(action, (boundActions = new WeakSet()));\n }\n\n // avoid applying the same action to the same element multiple times\n if (!boundActions.has(element)) {\n boundActions.add(element);\n actions[action](element);\n }\n });\n}\n\n/* istanbul ignore next */\nconst qM = typeof queueMicrotask === 'function' ? queueMicrotask : callback => Promise.resolve().then(callback);\n\nfunction createState (abortSignal) {\n let destroyed = false;\n let currentObserver;\n\n const propsToObservers = new Map();\n const dirtyObservers = new Set();\n\n let queued;\n\n const flush = () => {\n if (destroyed) {\n return\n }\n const observersToRun = [...dirtyObservers];\n dirtyObservers.clear(); // clear before running to force any new updates to run in another tick of the loop\n try {\n for (const observer of observersToRun) {\n observer();\n }\n } finally {\n queued = false;\n if (dirtyObservers.size) { // new updates, queue another one\n queued = true;\n qM(flush);\n }\n }\n };\n\n const state = new Proxy({}, {\n get (target, prop) {\n if (currentObserver) {\n let observers = propsToObservers.get(prop);\n if (!observers) {\n observers = new Set();\n propsToObservers.set(prop, observers);\n }\n observers.add(currentObserver);\n }\n return target[prop]\n },\n set (target, prop, newValue) {\n if (target[prop] !== newValue) {\n target[prop] = newValue;\n const observers = propsToObservers.get(prop);\n if (observers) {\n for (const observer of observers) {\n dirtyObservers.add(observer);\n }\n if (!queued) {\n queued = true;\n qM(flush);\n }\n }\n }\n return true\n }\n });\n\n const createEffect = (callback) => {\n const runnable = () => {\n const oldObserver = currentObserver;\n currentObserver = runnable;\n try {\n return callback()\n } finally {\n currentObserver = oldObserver;\n }\n };\n return runnable()\n };\n\n // destroy logic\n abortSignal.addEventListener('abort', () => {\n destroyed = true;\n });\n\n return {\n state,\n createEffect\n }\n}\n\n// Compare two arrays, with a function called on each item in the two arrays that returns true if the items are equal\nfunction arraysAreEqualByFunction (left, right, areEqualFunc) {\n if (left.length !== right.length) {\n return false\n }\n for (let i = 0; i < left.length; i++) {\n if (!areEqualFunc(left[i], right[i])) {\n return false\n }\n }\n return true\n}\n\nconst intersectionObserverCache = new WeakMap();\n\nfunction intersectionObserverAction (node, abortSignal, listener) {\n /* istanbul ignore else */\n {\n // The scroll root is always `.tabpanel`\n const root = node.closest('.tabpanel');\n\n let observer = intersectionObserverCache.get(root);\n if (!observer) {\n // TODO: replace this with the contentvisibilityautostatechange event when all supported browsers support it.\n // For now we use IntersectionObserver because it has better cross-browser support, and it would be bad for\n // old Safari versions if they eagerly downloaded all custom emoji all at once.\n observer = new IntersectionObserver(listener, {\n root,\n // trigger if we are 1/2 scroll container height away so that the images load a bit quicker while scrolling\n rootMargin: '50% 0px 50% 0px',\n // trigger if any part of the emoji grid is intersecting\n threshold: 0\n });\n\n // avoid creating a new IntersectionObserver for every category; just use one for the whole root\n intersectionObserverCache.set(root, observer);\n\n // assume that the abortSignal is always the same for this root node; just add one event listener\n abortSignal.addEventListener('abort', () => {\n observer.disconnect();\n });\n }\n\n observer.observe(node);\n }\n}\n\n/* eslint-disable prefer-const,no-labels,no-inner-declarations */\n\n// constants\nconst EMPTY_ARRAY = [];\n\nconst { assign } = Object;\n\nfunction createRoot (shadowRoot, props) {\n const refs = {};\n const abortController = new AbortController();\n const abortSignal = abortController.signal;\n const { state, createEffect } = createState(abortSignal);\n const actionContext = new Map();\n\n // initial state\n assign(state, {\n skinToneEmoji: undefined,\n i18n: undefined,\n database: undefined,\n customEmoji: undefined,\n customCategorySorting: undefined,\n emojiVersion: undefined\n });\n\n // public props\n assign(state, props);\n\n // private props\n assign(state, {\n initialLoad: true,\n currentEmojis: [],\n currentEmojisWithCategories: [],\n rawSearchText: '',\n searchText: '',\n searchMode: false,\n activeSearchItem: -1,\n message: undefined,\n skinTonePickerExpanded: false,\n skinTonePickerExpandedAfterAnimation: false,\n currentSkinTone: 0,\n activeSkinTone: 0,\n skinToneButtonText: undefined,\n pickerStyle: undefined,\n skinToneButtonLabel: '',\n skinTones: [],\n currentFavorites: [],\n defaultFavoriteEmojis: undefined,\n numColumns: DEFAULT_NUM_COLUMNS,\n isRtl: false,\n currentGroupIndex: 0,\n groups: groups,\n databaseLoaded: false,\n activeSearchItemId: undefined\n });\n\n //\n // Update the current group based on the currentGroupIndex\n //\n createEffect(() => {\n if (state.currentGroup !== state.groups[state.currentGroupIndex]) {\n state.currentGroup = state.groups[state.currentGroupIndex];\n }\n });\n\n //\n // Utils/helpers\n //\n\n const focus = id => {\n shadowRoot.getElementById(id).focus();\n };\n\n const emojiToDomNode = emoji => shadowRoot.getElementById(`emo-${emoji.id}`);\n\n // fire a custom event that crosses the shadow boundary\n const fireEvent = (name, detail) => {\n refs.rootElement.dispatchEvent(new CustomEvent(name, {\n detail,\n bubbles: true,\n composed: true\n }));\n };\n\n //\n // Comparison utils\n //\n\n const compareEmojiArrays = (a, b) => a.id === b.id;\n\n const compareCurrentEmojisWithCategories = (a, b) => {\n const { category: aCategory, emojis: aEmojis } = a;\n const { category: bCategory, emojis: bEmojis } = b;\n\n if (aCategory !== bCategory) {\n return false\n }\n\n return arraysAreEqualByFunction(aEmojis, bEmojis, compareEmojiArrays)\n };\n\n //\n // Update utils to avoid excessive re-renders\n //\n\n // avoid excessive re-renders by checking the value before setting\n const updateCurrentEmojis = (newEmojis) => {\n if (!arraysAreEqualByFunction(state.currentEmojis, newEmojis, compareEmojiArrays)) {\n state.currentEmojis = newEmojis;\n }\n };\n\n // avoid excessive re-renders\n const updateSearchMode = (newSearchMode) => {\n if (state.searchMode !== newSearchMode) {\n state.searchMode = newSearchMode;\n }\n };\n\n // avoid excessive re-renders\n const updateCurrentEmojisWithCategories = (newEmojisWithCategories) => {\n if (!arraysAreEqualByFunction(state.currentEmojisWithCategories, newEmojisWithCategories, compareCurrentEmojisWithCategories)) {\n state.currentEmojisWithCategories = newEmojisWithCategories;\n }\n };\n\n // Helpers used by PickerTemplate\n\n const unicodeWithSkin = (emoji, currentSkinTone) => (\n (currentSkinTone && emoji.skins && emoji.skins[currentSkinTone]) || emoji.unicode\n );\n\n const labelWithSkin = (emoji, currentSkinTone) => (\n uniq([\n (emoji.name || unicodeWithSkin(emoji, currentSkinTone)),\n emoji.annotation,\n ...(emoji.shortcodes || EMPTY_ARRAY)\n ].filter(Boolean)).join(', ')\n );\n\n const titleForEmoji = (emoji) => (\n emoji.annotation || (emoji.shortcodes || EMPTY_ARRAY).join(', ')\n );\n\n const helpers = {\n labelWithSkin, titleForEmoji, unicodeWithSkin\n };\n const events = {\n onClickSkinToneButton,\n onEmojiClick,\n onNavClick,\n onNavKeydown,\n onSearchKeydown,\n onSkinToneOptionsClick,\n onSkinToneOptionsFocusOut,\n onSkinToneOptionsKeydown,\n onSkinToneOptionsKeyup,\n onSearchInput\n };\n const actions = {\n calculateEmojiGridStyle,\n updateOnIntersection\n };\n\n let firstRender = true;\n createEffect(() => {\n render(shadowRoot, state, helpers, events, actions, refs, abortSignal, actionContext, firstRender);\n firstRender = false;\n });\n\n //\n // Determine the emoji support level (in requestIdleCallback)\n //\n\n // mount logic\n if (!state.emojiVersion) {\n detectEmojiSupportLevel().then(level => {\n // Can't actually test emoji support in Jest/Vitest/JSDom, emoji never render in color in Cairo\n /* istanbul ignore next */\n if (!level) {\n state.message = state.i18n.emojiUnsupportedMessage;\n }\n });\n }\n\n //\n // Set or update the database object\n //\n\n createEffect(() => {\n // show a Loading message if it takes a long time, or show an error if there's a network/IDB error\n async function handleDatabaseLoading () {\n let showingLoadingMessage = false;\n const timeoutHandle = setTimeout(() => {\n showingLoadingMessage = true;\n state.message = state.i18n.loadingMessage;\n }, TIMEOUT_BEFORE_LOADING_MESSAGE);\n try {\n await state.database.ready();\n state.databaseLoaded = true; // eslint-disable-line no-unused-vars\n } catch (err) {\n console.error(err);\n state.message = state.i18n.networkErrorMessage;\n } finally {\n clearTimeout(timeoutHandle);\n if (showingLoadingMessage) { // Seems safer than checking the i18n string, which may change\n showingLoadingMessage = false;\n state.message = ''; // eslint-disable-line no-unused-vars\n }\n }\n }\n\n if (state.database) {\n /* no await */\n handleDatabaseLoading();\n }\n });\n\n //\n // Global styles for the entire picker\n //\n\n createEffect(() => {\n state.pickerStyle = `\n --num-groups: ${state.groups.length}; \n --indicator-opacity: ${state.searchMode ? 0 : 1}; \n --num-skintones: ${NUM_SKIN_TONES};`;\n });\n\n //\n // Set or update the customEmoji\n //\n\n createEffect(() => {\n if (state.customEmoji && state.database) {\n updateCustomEmoji(); // re-run whenever customEmoji change\n }\n });\n\n createEffect(() => {\n if (state.customEmoji && state.customEmoji.length) {\n if (state.groups !== allGroups) { // don't update unnecessarily\n state.groups = allGroups;\n }\n } else if (state.groups !== groups) {\n if (state.currentGroupIndex) {\n // If the current group is anything other than \"custom\" (which is first), decrement.\n // This fixes the odd case where you set customEmoji, then pick a category, then unset customEmoji\n state.currentGroupIndex--;\n }\n state.groups = groups;\n }\n });\n\n //\n // Set or update the preferred skin tone\n //\n\n createEffect(() => {\n async function updatePreferredSkinTone () {\n if (state.databaseLoaded) {\n state.currentSkinTone = await state.database.getPreferredSkinTone();\n }\n }\n\n /* no await */ updatePreferredSkinTone();\n });\n\n createEffect(() => {\n state.skinTones = Array(NUM_SKIN_TONES).fill().map((_, i) => applySkinTone(state.skinToneEmoji, i));\n });\n\n createEffect(() => {\n state.skinToneButtonText = state.skinTones[state.currentSkinTone];\n });\n\n createEffect(() => {\n state.skinToneButtonLabel = state.i18n.skinToneLabel.replace('{skinTone}', state.i18n.skinTones[state.currentSkinTone]);\n });\n\n //\n // Set or update the favorites emojis\n //\n\n createEffect(() => {\n async function updateDefaultFavoriteEmojis () {\n const { database } = state;\n const favs = (await Promise.all(MOST_COMMONLY_USED_EMOJI.map(unicode => (\n database.getEmojiByUnicodeOrName(unicode)\n )))).filter(Boolean); // filter because in Jest/Vitest tests we don't have all the emoji in the DB\n state.defaultFavoriteEmojis = favs;\n }\n\n if (state.databaseLoaded) {\n /* no await */ updateDefaultFavoriteEmojis();\n }\n });\n\n function updateCustomEmoji () {\n // Certain effects have an implicit dependency on customEmoji since it affects the database\n // Getting it here on the state ensures this effect re-runs when customEmoji change.\n const { customEmoji, database } = state;\n const databaseCustomEmoji = customEmoji || EMPTY_ARRAY;\n if (database.customEmoji !== databaseCustomEmoji) {\n // Avoid setting this if the customEmoji have _not_ changed, because the setter triggers a re-computation of the\n // `customEmojiIndex`. Note we don't bother with deep object changes.\n database.customEmoji = databaseCustomEmoji;\n }\n }\n\n createEffect(() => {\n async function updateFavorites () {\n updateCustomEmoji(); // re-run whenever customEmoji change\n const { database, defaultFavoriteEmojis, numColumns } = state;\n const dbFavorites = await database.getTopFavoriteEmoji(numColumns);\n const favorites = await summarizeEmojis(uniqBy([\n ...dbFavorites,\n ...defaultFavoriteEmojis\n ], _ => (_.unicode || _.name)).slice(0, numColumns));\n state.currentFavorites = favorites;\n }\n\n if (state.databaseLoaded && state.defaultFavoriteEmojis) {\n /* no await */ updateFavorites();\n }\n });\n\n //\n // Re-run whenever the emoji grid changes size, and re-calc style/layout-related state variables:\n // 1) Re-calculate the --num-columns var because it may have changed\n // 2) Re-calculate whether we're in RTL mode or not.\n //\n // The benefit of doing this in one place is to align with rAF/ResizeObserver\n // and do all the calculations in one go. RTL vs LTR is not strictly layout-related,\n // but since we're already reading the style here, and since it's already aligned with\n // the rAF loop, this is the most appropriate place to do it perf-wise.\n //\n\n function calculateEmojiGridStyle (node) {\n resizeObserverAction(node, abortSignal, () => {\n /* istanbul ignore next */\n { // jsdom throws errors for this kind of fancy stuff\n // read all the style/layout calculations we need to make\n const style = getComputedStyle(refs.rootElement);\n const newNumColumns = parseInt(style.getPropertyValue('--num-columns'), 10);\n const newIsRtl = style.getPropertyValue('direction') === 'rtl';\n\n // write to state variables\n state.numColumns = newNumColumns;\n state.isRtl = newIsRtl;\n }\n });\n }\n\n // Re-run whenever the custom emoji in a category are shown/hidden. This is an optimization that simulates\n // what we'd get from `` but without rendering an ``.\n function updateOnIntersection (node) {\n intersectionObserverAction(node, abortSignal, (entries) => {\n for (const { target, isIntersecting } of entries) {\n target.classList.toggle('onscreen', isIntersecting);\n }\n });\n }\n\n //\n // Set or update the currentEmojis. Check for invalid ZWJ renderings\n // (i.e. double emoji).\n //\n\n createEffect(() => {\n async function updateEmojis () {\n const { searchText, currentGroup, databaseLoaded, customEmoji } = state;\n if (!databaseLoaded) {\n state.currentEmojis = [];\n state.searchMode = false;\n } else if (searchText.length >= MIN_SEARCH_TEXT_LENGTH) {\n const newEmojis = await getEmojisBySearchQuery(searchText);\n if (state.searchText === searchText) { // if the situation changes asynchronously, do not update\n updateCurrentEmojis(newEmojis);\n updateSearchMode(true);\n }\n } else { // database is loaded and we're not in search mode, so we're in normal category mode\n const { id: currentGroupId } = currentGroup;\n // avoid race condition where currentGroupId is -1 and customEmoji is undefined/empty\n if (currentGroupId !== -1 || (customEmoji && customEmoji.length)) {\n const newEmojis = await getEmojisByGroup(currentGroupId);\n if (state.currentGroup.id === currentGroupId) { // if the situation changes asynchronously, do not update\n updateCurrentEmojis(newEmojis);\n updateSearchMode(false);\n }\n }\n }\n }\n\n /* no await */ updateEmojis();\n });\n\n const resetScrollTopInRaf = () => {\n rAF(() => resetScrollTopIfPossible(refs.tabpanelElement));\n };\n\n // Some emojis have their ligatures rendered as two or more consecutive emojis\n // We want to treat these the same as unsupported emojis, so we compare their\n // widths against the baseline widths and remove them as necessary\n createEffect(() => {\n const { currentEmojis, emojiVersion } = state;\n const zwjEmojisToCheck = currentEmojis\n .filter(emoji => emoji.unicode) // filter custom emoji\n .filter(emoji => hasZwj(emoji) && !supportedZwjEmojis.has(emoji.unicode));\n if (!emojiVersion && zwjEmojisToCheck.length) {\n // render now, check their length later\n updateCurrentEmojis(currentEmojis);\n rAF(() => checkZwjSupportAndUpdate(zwjEmojisToCheck));\n } else {\n const newEmojis = emojiVersion ? currentEmojis : currentEmojis.filter(isZwjSupported);\n updateCurrentEmojis(newEmojis);\n // Reset scroll top to 0 when emojis change\n resetScrollTopInRaf();\n }\n });\n\n function checkZwjSupportAndUpdate (zwjEmojisToCheck) {\n const allSupported = checkZwjSupport(zwjEmojisToCheck, refs.baselineEmoji, emojiToDomNode);\n if (allSupported) {\n // Even if all emoji are supported, we still need to reset the scroll top to 0 when emojis change\n resetScrollTopInRaf();\n } else {\n // Force update. We only do this if there are any unsupported ZWJ characters since otherwise,\n // for browsers that support all emoji, it would be an unnecessary extra re-render.\n state.currentEmojis = [...state.currentEmojis];\n }\n }\n\n function isZwjSupported (emoji) {\n return !emoji.unicode || !hasZwj(emoji) || supportedZwjEmojis.get(emoji.unicode)\n }\n\n async function filterEmojisByVersion (emojis) {\n const emojiSupportLevel = state.emojiVersion || await detectEmojiSupportLevel();\n // !version corresponds to custom emoji\n return emojis.filter(({ version }) => !version || version <= emojiSupportLevel)\n }\n\n async function summarizeEmojis (emojis) {\n return summarizeEmojisForUI(emojis, state.emojiVersion || await detectEmojiSupportLevel())\n }\n\n async function getEmojisByGroup (group) {\n // -1 is custom emoji\n const emoji = group === -1 ? state.customEmoji : await state.database.getEmojiByGroup(group);\n return summarizeEmojis(await filterEmojisByVersion(emoji))\n }\n\n async function getEmojisBySearchQuery (query) {\n return summarizeEmojis(await filterEmojisByVersion(await state.database.getEmojiBySearchQuery(query)))\n }\n\n createEffect(() => {\n });\n\n //\n // Derive currentEmojisWithCategories from currentEmojis. This is always done even if there\n // are no categories, because it's just easier to code the HTML this way.\n //\n\n createEffect(() => {\n function calculateCurrentEmojisWithCategories () {\n const { searchMode, currentEmojis } = state;\n if (searchMode) {\n return [\n {\n category: '',\n emojis: currentEmojis\n }\n ]\n }\n const categoriesToEmoji = new Map();\n for (const emoji of currentEmojis) {\n const category = emoji.category || '';\n let emojis = categoriesToEmoji.get(category);\n if (!emojis) {\n emojis = [];\n categoriesToEmoji.set(category, emojis);\n }\n emojis.push(emoji);\n }\n return [...categoriesToEmoji.entries()]\n .map(([category, emojis]) => ({ category, emojis }))\n .sort((a, b) => state.customCategorySorting(a.category, b.category))\n }\n\n const newEmojisWithCategories = calculateCurrentEmojisWithCategories();\n updateCurrentEmojisWithCategories(newEmojisWithCategories);\n });\n\n //\n // Handle active search item (i.e. pressing up or down while searching)\n //\n\n createEffect(() => {\n state.activeSearchItemId = state.activeSearchItem !== -1 && state.currentEmojis[state.activeSearchItem].id;\n });\n\n //\n // Handle user input on the search input\n //\n\n createEffect(() => {\n const { rawSearchText } = state;\n rIC(() => {\n state.searchText = (rawSearchText || '').trim(); // defer to avoid input delays, plus we can trim here\n state.activeSearchItem = -1;\n });\n });\n\n function onSearchKeydown (event) {\n if (!state.searchMode || !state.currentEmojis.length) {\n return\n }\n\n const goToNextOrPrevious = (previous) => {\n halt(event);\n state.activeSearchItem = incrementOrDecrement(previous, state.activeSearchItem, state.currentEmojis);\n };\n\n switch (event.key) {\n case 'ArrowDown':\n return goToNextOrPrevious(false)\n case 'ArrowUp':\n return goToNextOrPrevious(true)\n case 'Enter':\n if (state.activeSearchItem === -1) {\n // focus the first option in the list since the list must be non-empty at this point (it's verified above)\n state.activeSearchItem = 0;\n } else { // there is already an active search item\n halt(event);\n return clickEmoji(state.currentEmojis[state.activeSearchItem].id)\n }\n }\n }\n\n //\n // Handle user input on nav\n //\n\n function onNavClick (event) {\n const { target } = event;\n const closestTarget = target.closest('.nav-button');\n /* istanbul ignore if */\n if (!closestTarget) {\n return // This should never happen, but makes me nervous not to have it\n }\n const groupId = parseInt(closestTarget.dataset.groupId, 10);\n refs.searchElement.value = ''; // clear search box input\n state.rawSearchText = '';\n state.searchText = '';\n state.activeSearchItem = -1;\n state.currentGroupIndex = state.groups.findIndex(_ => _.id === groupId);\n }\n\n function onNavKeydown (event) {\n const { target, key } = event;\n\n const doFocus = el => {\n if (el) {\n halt(event);\n el.focus();\n }\n };\n\n switch (key) {\n case 'ArrowLeft':\n return doFocus(target.previousElementSibling)\n case 'ArrowRight':\n return doFocus(target.nextElementSibling)\n case 'Home':\n return doFocus(target.parentElement.firstElementChild)\n case 'End':\n return doFocus(target.parentElement.lastElementChild)\n }\n }\n\n //\n // Handle user input on an emoji\n //\n\n async function clickEmoji (unicodeOrName) {\n const emoji = await state.database.getEmojiByUnicodeOrName(unicodeOrName);\n const emojiSummary = [...state.currentEmojis, ...state.currentFavorites]\n .find(_ => (_.id === unicodeOrName));\n const skinTonedUnicode = emojiSummary.unicode && unicodeWithSkin(emojiSummary, state.currentSkinTone);\n await state.database.incrementFavoriteEmojiCount(unicodeOrName);\n fireEvent('emoji-click', {\n emoji,\n skinTone: state.currentSkinTone,\n ...(skinTonedUnicode && { unicode: skinTonedUnicode }),\n ...(emojiSummary.name && { name: emojiSummary.name })\n });\n }\n\n async function onEmojiClick (event) {\n const { target } = event;\n /* istanbul ignore if */\n if (!target.classList.contains('emoji')) {\n // This should never happen, but makes me nervous not to have it\n return\n }\n halt(event);\n const id = target.id.substring(4); // replace 'emo-' or 'fav-' prefix\n\n /* no await */ clickEmoji(id);\n }\n\n //\n // Handle user input on the skintone picker\n //\n\n function changeSkinTone (skinTone) {\n state.currentSkinTone = skinTone;\n state.skinTonePickerExpanded = false;\n focus('skintone-button');\n fireEvent('skin-tone-change', { skinTone });\n /* no await */ state.database.setPreferredSkinTone(skinTone);\n }\n\n function onSkinToneOptionsClick (event) {\n const { target: { id } } = event;\n const match = id && id.match(/^skintone-(\\d)/); // skintone option format\n /* istanbul ignore if */\n if (!match) { // not a skintone option\n return // This should never happen, but makes me nervous not to have it\n }\n halt(event);\n const skinTone = parseInt(match[1], 10); // remove 'skintone-' prefix\n changeSkinTone(skinTone);\n }\n\n function onClickSkinToneButton (event) {\n state.skinTonePickerExpanded = !state.skinTonePickerExpanded;\n state.activeSkinTone = state.currentSkinTone;\n // this should always be true, since the button is obscured by the listbox, so this `if` is just to be sure\n if (state.skinTonePickerExpanded) {\n halt(event);\n rAF(() => focus('skintone-list'));\n }\n }\n\n // To make the animation nicer, change the z-index of the skintone picker button\n // *after* the animation has played. This makes it appear that the picker box\n // is expanding \"below\" the button\n createEffect(() => {\n if (state.skinTonePickerExpanded) {\n refs.skinToneDropdown.addEventListener('transitionend', () => {\n state.skinTonePickerExpandedAfterAnimation = true; // eslint-disable-line no-unused-vars\n }, { once: true });\n } else {\n state.skinTonePickerExpandedAfterAnimation = false; // eslint-disable-line no-unused-vars\n }\n });\n\n function onSkinToneOptionsKeydown (event) {\n // this should never happen, but makes me nervous not to have it\n /* istanbul ignore if */\n if (!state.skinTonePickerExpanded) {\n return\n }\n const changeActiveSkinTone = async nextSkinTone => {\n halt(event);\n state.activeSkinTone = nextSkinTone;\n };\n\n switch (event.key) {\n case 'ArrowUp':\n return changeActiveSkinTone(incrementOrDecrement(true, state.activeSkinTone, state.skinTones))\n case 'ArrowDown':\n return changeActiveSkinTone(incrementOrDecrement(false, state.activeSkinTone, state.skinTones))\n case 'Home':\n return changeActiveSkinTone(0)\n case 'End':\n return changeActiveSkinTone(state.skinTones.length - 1)\n case 'Enter':\n // enter on keydown, space on keyup. this is just how browsers work for buttons\n // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html\n halt(event);\n return changeSkinTone(state.activeSkinTone)\n case 'Escape':\n halt(event);\n state.skinTonePickerExpanded = false;\n return focus('skintone-button')\n }\n }\n\n function onSkinToneOptionsKeyup (event) {\n // this should never happen, but makes me nervous not to have it\n /* istanbul ignore if */\n if (!state.skinTonePickerExpanded) {\n return\n }\n switch (event.key) {\n case ' ':\n // enter on keydown, space on keyup. this is just how browsers work for buttons\n // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html\n halt(event);\n return changeSkinTone(state.activeSkinTone)\n }\n }\n\n async function onSkinToneOptionsFocusOut (event) {\n // On blur outside of the skintone listbox, collapse the skintone picker.\n const { relatedTarget } = event;\n // The `else` should never happen, but makes me nervous not to have it\n /* istanbul ignore else */\n if (!relatedTarget || relatedTarget.id !== 'skintone-list') {\n state.skinTonePickerExpanded = false;\n }\n }\n\n function onSearchInput (event) {\n state.rawSearchText = event.target.value;\n }\n\n return {\n $set (newState) {\n assign(state, newState);\n },\n $destroy () {\n abortController.abort();\n }\n }\n}\n\nconst DEFAULT_DATA_SOURCE = 'https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json';\nconst DEFAULT_LOCALE = 'en';\n\nvar enI18n = {\n categoriesLabel: 'Categories',\n emojiUnsupportedMessage: 'Your browser does not support color emoji.',\n favoritesLabel: 'Favorites',\n loadingMessage: 'Loading…',\n networkErrorMessage: 'Could not load emoji.',\n regionLabel: 'Emoji picker',\n searchDescription: 'When search results are available, press up or down to select and enter to choose.',\n searchLabel: 'Search',\n searchResultsLabel: 'Search results',\n skinToneDescription: 'When expanded, press up or down to select and enter to choose.',\n skinToneLabel: 'Choose a skin tone (currently {skinTone})',\n skinTonesLabel: 'Skin tones',\n skinTones: [\n 'Default',\n 'Light',\n 'Medium-Light',\n 'Medium',\n 'Medium-Dark',\n 'Dark'\n ],\n categories: {\n custom: 'Custom',\n 'smileys-emotion': 'Smileys and emoticons',\n 'people-body': 'People and body',\n 'animals-nature': 'Animals and nature',\n 'food-drink': 'Food and drink',\n 'travel-places': 'Travel and places',\n activities: 'Activities',\n objects: 'Objects',\n symbols: 'Symbols',\n flags: 'Flags'\n }\n};\n\nvar baseStyles = \":host{--emoji-size:1.375rem;--emoji-padding:0.5rem;--category-emoji-size:var(--emoji-size);--category-emoji-padding:var(--emoji-padding);--indicator-height:3px;--input-border-radius:0.5rem;--input-border-size:1px;--input-font-size:1rem;--input-line-height:1.5;--input-padding:0.25rem;--num-columns:8;--outline-size:2px;--border-size:1px;--border-radius:0;--skintone-border-radius:1rem;--category-font-size:1rem;display:flex;width:min-content;height:400px}:host,:host(.light){color-scheme:light;--background:#fff;--border-color:#e0e0e0;--indicator-color:#385ac1;--input-border-color:#999;--input-font-color:#111;--input-placeholder-color:#999;--outline-color:#999;--category-font-color:#111;--button-active-background:#e6e6e6;--button-hover-background:#d9d9d9}:host(.dark){color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}@media (prefers-color-scheme:dark){:host{color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}}:host([hidden]){display:none}button{margin:0;padding:0;border:0;background:0 0;box-shadow:none;-webkit-tap-highlight-color:transparent}button::-moz-focus-inner{border:0}input{padding:0;margin:0;line-height:1.15;font-family:inherit}input[type=search]{-webkit-appearance:none}:focus{outline:var(--outline-color) solid var(--outline-size);outline-offset:calc(-1*var(--outline-size))}:host([data-js-focus-visible]) :focus:not([data-focus-visible-added]){outline:0}:focus:not(:focus-visible){outline:0}.hide-focus{outline:0}*{box-sizing:border-box}.picker{contain:content;display:flex;flex-direction:column;background:var(--background);border:var(--border-size) solid var(--border-color);border-radius:var(--border-radius);width:100%;height:100%;overflow:hidden;--total-emoji-size:calc(var(--emoji-size) + (2 * var(--emoji-padding)));--total-category-emoji-size:calc(var(--category-emoji-size) + (2 * var(--category-emoji-padding)))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.hidden{opacity:0;pointer-events:none}.abs-pos{position:absolute;left:0;top:0}.gone{display:none!important}.skintone-button-wrapper,.skintone-list{background:var(--background);z-index:3}.skintone-button-wrapper.expanded{z-index:1}.skintone-list{position:absolute;inset-inline-end:0;top:0;z-index:2;overflow:visible;border-bottom:var(--border-size) solid var(--border-color);border-radius:0 0 var(--skintone-border-radius) var(--skintone-border-radius);will-change:transform;transition:transform .2s ease-in-out;transform-origin:center 0}@media (prefers-reduced-motion:reduce){.skintone-list{transition-duration:.001s}}@supports not (inset-inline-end:0){.skintone-list{right:0}}.skintone-list.no-animate{transition:none}.tabpanel{overflow-y:auto;scrollbar-gutter:stable;-webkit-overflow-scrolling:touch;will-change:transform;min-height:0;flex:1;contain:content}.emoji-menu{display:grid;grid-template-columns:repeat(var(--num-columns),var(--total-emoji-size));justify-content:space-around;align-items:flex-start;width:100%}.emoji-menu.visibility-auto{content-visibility:auto;contain-intrinsic-size:calc(var(--num-columns)*var(--total-emoji-size)) calc(var(--num-rows)*var(--total-emoji-size))}.category{padding:var(--emoji-padding);font-size:var(--category-font-size);color:var(--category-font-color)}.emoji,button.emoji{font-size:var(--emoji-size);display:flex;align-items:center;justify-content:center;border-radius:100%;height:var(--total-emoji-size);width:var(--total-emoji-size);line-height:1;overflow:hidden;font-family:var(--emoji-font-family);cursor:pointer}@media (hover:hover) and (pointer:fine){.emoji:hover,button.emoji:hover{background:var(--button-hover-background)}}.emoji.active,.emoji:active,button.emoji.active,button.emoji:active{background:var(--button-active-background)}.onscreen .custom-emoji::after{content:\\\"\\\";width:var(--emoji-size);height:var(--emoji-size);background-repeat:no-repeat;background-position:center center;background-size:contain;background-image:var(--custom-emoji-background)}.nav,.nav-button{align-items:center}.nav{display:grid;justify-content:space-between;contain:content}.nav-button{display:flex;justify-content:center}.nav-emoji{font-size:var(--category-emoji-size);width:var(--total-category-emoji-size);height:var(--total-category-emoji-size)}.indicator-wrapper{display:flex;border-bottom:1px solid var(--border-color)}.indicator{width:calc(100%/var(--num-groups));height:var(--indicator-height);opacity:var(--indicator-opacity);background-color:var(--indicator-color);will-change:transform,opacity;transition:opacity .1s linear,transform .25s ease-in-out}@media (prefers-reduced-motion:reduce){.indicator{will-change:opacity;transition:opacity .1s linear}}.pad-top,input.search{background:var(--background);width:100%}.pad-top{height:var(--emoji-padding);z-index:3}.search-row{display:flex;align-items:center;position:relative;padding-inline-start:var(--emoji-padding);padding-bottom:var(--emoji-padding)}.search-wrapper{flex:1;min-width:0}input.search{padding:var(--input-padding);border-radius:var(--input-border-radius);border:var(--input-border-size) solid var(--input-border-color);color:var(--input-font-color);font-size:var(--input-font-size);line-height:var(--input-line-height)}input.search::placeholder{color:var(--input-placeholder-color)}.favorites{overflow-y:auto;scrollbar-gutter:stable;display:flex;flex-direction:row;border-top:var(--border-size) solid var(--border-color);contain:content}.message{padding:var(--emoji-padding)}\";\n\nconst PROPS = [\n 'customEmoji',\n 'customCategorySorting',\n 'database',\n 'dataSource',\n 'i18n',\n 'locale',\n 'skinToneEmoji',\n 'emojiVersion'\n];\n\n// Styles injected ourselves, so we can declare the FONT_FAMILY variable in one place\nconst EXTRA_STYLES = `:host{--emoji-font-family:${FONT_FAMILY}}`;\n\nclass PickerElement extends HTMLElement {\n constructor (props) {\n super();\n this.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = baseStyles + EXTRA_STYLES;\n this.shadowRoot.appendChild(style);\n this._ctx = {\n // Set defaults\n locale: DEFAULT_LOCALE,\n dataSource: DEFAULT_DATA_SOURCE,\n skinToneEmoji: DEFAULT_SKIN_TONE_EMOJI,\n customCategorySorting: DEFAULT_CATEGORY_SORTING,\n customEmoji: null,\n i18n: enI18n,\n emojiVersion: null,\n ...props\n };\n // Handle properties set before the element was upgraded\n for (const prop of PROPS) {\n if (prop !== 'database' && Object.prototype.hasOwnProperty.call(this, prop)) {\n this._ctx[prop] = this[prop];\n delete this[prop];\n }\n }\n this._dbFlush(); // wait for a flush before creating the db, in case the user calls e.g. a setter or setAttribute\n }\n\n connectedCallback () {\n // The _cmp may be defined if the component was immediately disconnected and then reconnected. In that case,\n // do nothing (preserve the state)\n if (!this._cmp) {\n this._cmp = createRoot(this.shadowRoot, this._ctx);\n }\n }\n\n disconnectedCallback () {\n // Check in a microtask if the element is still connected. If so, treat this as a \"move\" rather than a disconnect\n // Inspired by Vue: https://vuejs.org/guide/extras/web-components.html#building-custom-elements-with-vue\n qM(() => {\n // this._cmp may be defined if connect-disconnect-connect-disconnect occurs synchronously\n if (!this.isConnected && this._cmp) {\n this._cmp.$destroy();\n this._cmp = undefined;\n\n const { database } = this._ctx;\n database.close()\n // only happens if the database failed to load in the first place, so we don't care\n .catch(err => console.error(err));\n }\n });\n }\n\n static get observedAttributes () {\n return ['locale', 'data-source', 'skin-tone-emoji', 'emoji-version'] // complex objects aren't supported, also use kebab-case\n }\n\n attributeChangedCallback (attrName, oldValue, newValue) {\n this._set(\n // convert from kebab-case to camelcase\n // see https://github.com/sveltejs/svelte/issues/3852#issuecomment-665037015\n attrName.replace(/-([a-z])/g, (_, up) => up.toUpperCase()),\n // convert string attribute to float if necessary\n attrName === 'emoji-version' ? parseFloat(newValue) : newValue\n );\n }\n\n _set (prop, newValue) {\n this._ctx[prop] = newValue;\n if (this._cmp) {\n this._cmp.$set({ [prop]: newValue });\n }\n if (['locale', 'dataSource'].includes(prop)) {\n this._dbFlush();\n }\n }\n\n _dbCreate () {\n const { locale, dataSource, database } = this._ctx;\n // only create a new database if we really need to\n if (!database || database.locale !== locale || database.dataSource !== dataSource) {\n this._set('database', new Database({ locale, dataSource }));\n }\n }\n\n // Update the Database in one microtask if the locale/dataSource change. We do one microtask\n // so we don't create two Databases if e.g. both the locale and the dataSource change\n _dbFlush () {\n qM(() => (\n this._dbCreate()\n ));\n }\n}\n\nconst definitions = {};\n\nfor (const prop of PROPS) {\n definitions[prop] = {\n get () {\n if (prop === 'database') {\n // in rare cases, the microtask may not be flushed yet, so we need to instantiate the DB\n // now if the user is asking for it\n this._dbCreate();\n }\n return this._ctx[prop]\n },\n set (val) {\n if (prop === 'database') {\n throw new Error('database is read-only')\n }\n this._set(prop, val);\n }\n };\n}\n\nObject.defineProperties(PickerElement.prototype, definitions);\n\n/* istanbul ignore else */\nif (!customElements.get('emoji-picker')) { // if already defined, do nothing (e.g. same script imported twice)\n customElements.define('emoji-picker', PickerElement);\n}\n\nexport { PickerElement as default };\n","function assertNonEmptyString (str) {\n if (typeof str !== 'string' || !str) {\n throw new Error('expected a non-empty string, got: ' + str)\n }\n}\n\nfunction assertNumber (number) {\n if (typeof number !== 'number') {\n throw new Error('expected a number, got: ' + number)\n }\n}\n\nconst DB_VERSION_CURRENT = 1;\nconst DB_VERSION_INITIAL = 1;\nconst STORE_EMOJI = 'emoji';\nconst STORE_KEYVALUE = 'keyvalue';\nconst STORE_FAVORITES = 'favorites';\nconst FIELD_TOKENS = 'tokens';\nconst INDEX_TOKENS = 'tokens';\nconst FIELD_UNICODE = 'unicode';\nconst INDEX_COUNT = 'count';\nconst FIELD_GROUP = 'group';\nconst FIELD_ORDER = 'order';\nconst INDEX_GROUP_AND_ORDER = 'group-order';\nconst KEY_ETAG = 'eTag';\nconst KEY_URL = 'url';\nconst KEY_PREFERRED_SKINTONE = 'skinTone';\nconst MODE_READONLY = 'readonly';\nconst MODE_READWRITE = 'readwrite';\nconst INDEX_SKIN_UNICODE = 'skinUnicodes';\nconst FIELD_SKIN_UNICODE = 'skinUnicodes';\n\nconst DEFAULT_DATA_SOURCE = 'https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json';\nconst DEFAULT_LOCALE = 'en';\n\n// like lodash's uniqBy but much smaller\nfunction uniqBy (arr, func) {\n const set = new Set();\n const res = [];\n for (const item of arr) {\n const key = func(item);\n if (!set.has(key)) {\n set.add(key);\n res.push(item);\n }\n }\n return res\n}\n\nfunction uniqEmoji (emojis) {\n return uniqBy(emojis, _ => _.unicode)\n}\n\nfunction initialMigration (db) {\n function createObjectStore (name, keyPath, indexes) {\n const store = keyPath\n ? db.createObjectStore(name, { keyPath })\n : db.createObjectStore(name);\n if (indexes) {\n for (const [indexName, [keyPath, multiEntry]] of Object.entries(indexes)) {\n store.createIndex(indexName, keyPath, { multiEntry });\n }\n }\n return store\n }\n\n createObjectStore(STORE_KEYVALUE);\n createObjectStore(STORE_EMOJI, /* keyPath */ FIELD_UNICODE, {\n [INDEX_TOKENS]: [FIELD_TOKENS, /* multiEntry */ true],\n [INDEX_GROUP_AND_ORDER]: [[FIELD_GROUP, FIELD_ORDER]],\n [INDEX_SKIN_UNICODE]: [FIELD_SKIN_UNICODE, /* multiEntry */ true]\n });\n createObjectStore(STORE_FAVORITES, undefined, {\n [INDEX_COUNT]: ['']\n });\n}\n\nconst openIndexedDBRequests = {};\nconst databaseCache = {};\nconst onCloseListeners = {};\n\nfunction handleOpenOrDeleteReq (resolve, reject, req) {\n // These things are almost impossible to test with fakeIndexedDB sadly\n /* istanbul ignore next */\n req.onerror = () => reject(req.error);\n /* istanbul ignore next */\n req.onblocked = () => reject(new Error('IDB blocked'));\n req.onsuccess = () => resolve(req.result);\n}\n\nasync function createDatabase (dbName) {\n const db = await new Promise((resolve, reject) => {\n const req = indexedDB.open(dbName, DB_VERSION_CURRENT);\n openIndexedDBRequests[dbName] = req;\n req.onupgradeneeded = e => {\n // Technically there is only one version, so we don't need this `if` check\n // But if an old version of the JS is in another browser tab\n // and it gets upgraded in the future and we have a new DB version, well...\n // better safe than sorry.\n /* istanbul ignore else */\n if (e.oldVersion < DB_VERSION_INITIAL) {\n initialMigration(req.result);\n }\n };\n handleOpenOrDeleteReq(resolve, reject, req);\n });\n // Handle abnormal closes, e.g. \"delete database\" in chrome dev tools.\n // No need for removeEventListener, because once the DB can no longer\n // fire \"close\" events, it will auto-GC.\n // Unfortunately cannot test in fakeIndexedDB: https://github.com/dumbmatter/fakeIndexedDB/issues/50\n /* istanbul ignore next */\n db.onclose = () => closeDatabase(dbName);\n return db\n}\n\nfunction openDatabase (dbName) {\n if (!databaseCache[dbName]) {\n databaseCache[dbName] = createDatabase(dbName);\n }\n return databaseCache[dbName]\n}\n\nfunction dbPromise (db, storeName, readOnlyOrReadWrite, cb) {\n return new Promise((resolve, reject) => {\n // Use relaxed durability because neither the emoji data nor the favorites/preferred skin tone\n // are really irreplaceable data. IndexedDB is just a cache in this case.\n const txn = db.transaction(storeName, readOnlyOrReadWrite, { durability: 'relaxed' });\n const store = typeof storeName === 'string'\n ? txn.objectStore(storeName)\n : storeName.map(name => txn.objectStore(name));\n let res;\n cb(store, txn, (result) => {\n res = result;\n });\n\n txn.oncomplete = () => resolve(res);\n /* istanbul ignore next */\n txn.onerror = () => reject(txn.error);\n })\n}\n\nfunction closeDatabase (dbName) {\n // close any open requests\n const req = openIndexedDBRequests[dbName];\n const db = req && req.result;\n if (db) {\n db.close();\n const listeners = onCloseListeners[dbName];\n /* istanbul ignore else */\n if (listeners) {\n for (const listener of listeners) {\n listener();\n }\n }\n }\n delete openIndexedDBRequests[dbName];\n delete databaseCache[dbName];\n delete onCloseListeners[dbName];\n}\n\nfunction deleteDatabase (dbName) {\n return new Promise((resolve, reject) => {\n // close any open requests\n closeDatabase(dbName);\n const req = indexedDB.deleteDatabase(dbName);\n handleOpenOrDeleteReq(resolve, reject, req);\n })\n}\n\n// The \"close\" event occurs during an abnormal shutdown, e.g. a user clearing their browser data.\n// However, it doesn't occur with the normal \"close\" event, so we handle that separately.\n// https://www.w3.org/TR/IndexedDB/#close-a-database-connection\nfunction addOnCloseListener (dbName, listener) {\n let listeners = onCloseListeners[dbName];\n if (!listeners) {\n listeners = onCloseListeners[dbName] = [];\n }\n listeners.push(listener);\n}\n\n// list of emoticons that don't match a simple \\W+ regex\n// extracted using:\n// require('emoji-picker-element-data/en/emojibase/data.json').map(_ => _.emoticon).filter(Boolean).filter(_ => !/^\\W+$/.test(_))\nconst irregularEmoticons = new Set([\n ':D', 'XD', \":'D\", 'O:)',\n ':X', ':P', ';P', 'XP',\n ':L', ':Z', ':j', '8D',\n 'XO', '8)', ':B', ':O',\n ':S', \":'o\", 'Dx', 'X(',\n 'D:', ':C', '>0)', ':3',\n ' {\n if (!word.match(/\\w/) || irregularEmoticons.has(word)) {\n // for pure emoticons like :) or :-), just leave them as-is\n return word.toLowerCase()\n }\n\n return word\n .replace(/[)(:,]/g, '')\n .replace(/’/g, \"'\")\n .toLowerCase()\n }).filter(Boolean)\n}\n\nconst MIN_SEARCH_TEXT_LENGTH = 2;\n\n// This is an extra step in addition to extractTokens(). The difference here is that we expect\n// the input to have already been run through extractTokens(). This is useful for cases like\n// emoticons, where we don't want to do any tokenization (because it makes no sense to split up\n// \">:)\" by the colon) but we do want to lowercase it to have consistent search results, so that\n// the user can type ':P' or ':p' and still get the same result.\nfunction normalizeTokens (str) {\n return str\n .filter(Boolean)\n .map(_ => _.toLowerCase())\n .filter(_ => _.length >= MIN_SEARCH_TEXT_LENGTH)\n}\n\n// Transform emoji data for storage in IDB\nfunction transformEmojiData (emojiData) {\n const res = emojiData.map(({ annotation, emoticon, group, order, shortcodes, skins, tags, emoji, version }) => {\n const tokens = [...new Set(\n normalizeTokens([\n ...(shortcodes || []).map(extractTokens).flat(),\n ...(tags || []).map(extractTokens).flat(),\n ...extractTokens(annotation),\n emoticon\n ])\n )].sort();\n const res = {\n annotation,\n group,\n order,\n tags,\n tokens,\n unicode: emoji,\n version\n };\n if (emoticon) {\n res.emoticon = emoticon;\n }\n if (shortcodes) {\n res.shortcodes = shortcodes;\n }\n if (skins) {\n res.skinTones = [];\n res.skinUnicodes = [];\n res.skinVersions = [];\n for (const { tone, emoji, version } of skins) {\n res.skinTones.push(tone);\n res.skinUnicodes.push(emoji);\n res.skinVersions.push(version);\n }\n }\n return res\n });\n return res\n}\n\n// helper functions that help compress the code better\n\nfunction callStore (store, method, key, cb) {\n store[method](key).onsuccess = e => (cb && cb(e.target.result));\n}\n\nfunction getIDB (store, key, cb) {\n callStore(store, 'get', key, cb);\n}\n\nfunction getAllIDB (store, key, cb) {\n callStore(store, 'getAll', key, cb);\n}\n\nfunction commit (txn) {\n /* istanbul ignore else */\n if (txn.commit) {\n txn.commit();\n }\n}\n\n// like lodash's minBy\nfunction minBy (array, func) {\n let minItem = array[0];\n for (let i = 1; i < array.length; i++) {\n const item = array[i];\n if (func(minItem) > func(item)) {\n minItem = item;\n }\n }\n return minItem\n}\n\n// return an array of results representing all items that are found in each one of the arrays\n//\n\nfunction findCommonMembers (arrays, uniqByFunc) {\n const shortestArray = minBy(arrays, _ => _.length);\n const results = [];\n for (const item of shortestArray) {\n // if this item is included in every array in the intermediate results, add it to the final results\n if (!arrays.some(array => array.findIndex(_ => uniqByFunc(_) === uniqByFunc(item)) === -1)) {\n results.push(item);\n }\n }\n return results\n}\n\nasync function isEmpty (db) {\n return !(await get(db, STORE_KEYVALUE, KEY_URL))\n}\n\nasync function hasData (db, url, eTag) {\n const [oldETag, oldUrl] = await Promise.all([KEY_ETAG, KEY_URL]\n .map(key => get(db, STORE_KEYVALUE, key)));\n return (oldETag === eTag && oldUrl === url)\n}\n\nasync function doFullDatabaseScanForSingleResult (db, predicate) {\n // This batching algorithm is just a perf improvement over a basic\n // cursor. The BATCH_SIZE is an estimate of what would give the best\n // perf for doing a full DB scan (worst case).\n //\n // Mini-benchmark for determining the best batch size:\n //\n // PERF=1 pnpm build:rollup && pnpm test:adhoc\n //\n // (async () => {\n // performance.mark('start')\n // await $('emoji-picker').database.getEmojiByShortcode('doesnotexist')\n // performance.measure('total', 'start')\n // console.log(performance.getEntriesByName('total').slice(-1)[0].duration)\n // })()\n const BATCH_SIZE = 50; // Typically around 150ms for 6x slowdown in Chrome for above benchmark\n return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => {\n let lastKey;\n\n const processNextBatch = () => {\n emojiStore.getAll(lastKey && IDBKeyRange.lowerBound(lastKey, true), BATCH_SIZE).onsuccess = e => {\n const results = e.target.result;\n for (const result of results) {\n lastKey = result.unicode;\n if (predicate(result)) {\n return cb(result)\n }\n }\n if (results.length < BATCH_SIZE) {\n return cb()\n }\n processNextBatch();\n };\n };\n processNextBatch();\n })\n}\n\nasync function loadData (db, emojiData, url, eTag) {\n try {\n const transformedData = transformEmojiData(emojiData);\n await dbPromise(db, [STORE_EMOJI, STORE_KEYVALUE], MODE_READWRITE, ([emojiStore, metaStore], txn) => {\n let oldETag;\n let oldUrl;\n let todo = 0;\n\n function checkFetched () {\n if (++todo === 2) { // 2 requests made\n onFetched();\n }\n }\n\n function onFetched () {\n if (oldETag === eTag && oldUrl === url) {\n // check again within the transaction to guard against concurrency, e.g. multiple browser tabs\n return\n }\n // delete old data\n emojiStore.clear();\n // insert new data\n for (const data of transformedData) {\n emojiStore.put(data);\n }\n metaStore.put(eTag, KEY_ETAG);\n metaStore.put(url, KEY_URL);\n commit(txn);\n }\n\n getIDB(metaStore, KEY_ETAG, result => {\n oldETag = result;\n checkFetched();\n });\n\n getIDB(metaStore, KEY_URL, result => {\n oldUrl = result;\n checkFetched();\n });\n });\n } finally {\n }\n}\n\nasync function getEmojiByGroup (db, group) {\n return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => {\n const range = IDBKeyRange.bound([group, 0], [group + 1, 0], false, true);\n getAllIDB(emojiStore.index(INDEX_GROUP_AND_ORDER), range, cb);\n })\n}\n\nasync function getEmojiBySearchQuery (db, query) {\n const tokens = normalizeTokens(extractTokens(query));\n\n if (!tokens.length) {\n return []\n }\n\n return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => {\n // get all results that contain all tokens (i.e. an AND query)\n const intermediateResults = [];\n\n const checkDone = () => {\n if (intermediateResults.length === tokens.length) {\n onDone();\n }\n };\n\n const onDone = () => {\n const results = findCommonMembers(intermediateResults, _ => _.unicode);\n cb(results.sort((a, b) => a.order < b.order ? -1 : 1));\n };\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n const range = i === tokens.length - 1\n ? IDBKeyRange.bound(token, token + '\\uffff', false, true) // treat last token as a prefix search\n : IDBKeyRange.only(token); // treat all other tokens as an exact match\n getAllIDB(emojiStore.index(INDEX_TOKENS), range, result => {\n intermediateResults.push(result);\n checkDone();\n });\n }\n })\n}\n\n// This could have been implemented as an IDB index on shortcodes, but it seemed wasteful to do that\n// when we can already query by tokens and this will give us what we're looking for 99.9% of the time\nasync function getEmojiByShortcode (db, shortcode) {\n const emojis = await getEmojiBySearchQuery(db, shortcode);\n\n // In very rare cases (e.g. the shortcode \"v\" as in \"v for victory\"), we cannot search because\n // there are no usable tokens (too short in this case). In that case, we have to do an inefficient\n // full-database scan, which I believe is an acceptable tradeoff for not having to have an extra\n // index on shortcodes.\n\n if (!emojis.length) {\n const predicate = _ => ((_.shortcodes || []).includes(shortcode.toLowerCase()));\n return (await doFullDatabaseScanForSingleResult(db, predicate)) || null\n }\n\n return emojis.filter(_ => {\n const lowerShortcodes = (_.shortcodes || []).map(_ => _.toLowerCase());\n return lowerShortcodes.includes(shortcode.toLowerCase())\n })[0] || null\n}\n\nasync function getEmojiByUnicode (db, unicode) {\n return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => (\n getIDB(emojiStore, unicode, result => {\n if (result) {\n return cb(result)\n }\n getIDB(emojiStore.index(INDEX_SKIN_UNICODE), unicode, result => cb(result || null));\n })\n ))\n}\n\nfunction get (db, storeName, key) {\n return dbPromise(db, storeName, MODE_READONLY, (store, txn, cb) => (\n getIDB(store, key, cb)\n ))\n}\n\nfunction set (db, storeName, key, value) {\n return dbPromise(db, storeName, MODE_READWRITE, (store, txn) => {\n store.put(value, key);\n commit(txn);\n })\n}\n\nfunction incrementFavoriteEmojiCount (db, unicode) {\n return dbPromise(db, STORE_FAVORITES, MODE_READWRITE, (store, txn) => (\n getIDB(store, unicode, result => {\n store.put((result || 0) + 1, unicode);\n commit(txn);\n })\n ))\n}\n\nfunction getTopFavoriteEmoji (db, customEmojiIndex, limit) {\n if (limit === 0) {\n return []\n }\n return dbPromise(db, [STORE_FAVORITES, STORE_EMOJI], MODE_READONLY, ([favoritesStore, emojiStore], txn, cb) => {\n const results = [];\n favoritesStore.index(INDEX_COUNT).openCursor(undefined, 'prev').onsuccess = e => {\n const cursor = e.target.result;\n if (!cursor) { // no more results\n return cb(results)\n }\n\n function addResult (result) {\n results.push(result);\n if (results.length === limit) {\n return cb(results) // done, reached the limit\n }\n cursor.continue();\n }\n\n const unicodeOrName = cursor.primaryKey;\n const custom = customEmojiIndex.byName(unicodeOrName);\n if (custom) {\n return addResult(custom)\n }\n // This could be done in parallel (i.e. make the cursor and the get()s parallelized),\n // but my testing suggests it's not actually faster.\n getIDB(emojiStore, unicodeOrName, emoji => {\n if (emoji) {\n return addResult(emoji)\n }\n // emoji not found somehow, ignore (may happen if custom emoji change)\n cursor.continue();\n });\n };\n })\n}\n\n// trie data structure for prefix searches\n// loosely based on https://github.com/nolanlawson/substring-trie\n\nconst CODA_MARKER = ''; // marks the end of the string\n\nfunction trie (arr, itemToTokens) {\n const map = new Map();\n for (const item of arr) {\n const tokens = itemToTokens(item);\n for (const token of tokens) {\n let currentMap = map;\n for (let i = 0; i < token.length; i++) {\n const char = token.charAt(i);\n let nextMap = currentMap.get(char);\n if (!nextMap) {\n nextMap = new Map();\n currentMap.set(char, nextMap);\n }\n currentMap = nextMap;\n }\n let valuesAtCoda = currentMap.get(CODA_MARKER);\n if (!valuesAtCoda) {\n valuesAtCoda = [];\n currentMap.set(CODA_MARKER, valuesAtCoda);\n }\n valuesAtCoda.push(item);\n }\n }\n\n const search = (query, exact) => {\n let currentMap = map;\n for (let i = 0; i < query.length; i++) {\n const char = query.charAt(i);\n const nextMap = currentMap.get(char);\n if (nextMap) {\n currentMap = nextMap;\n } else {\n return []\n }\n }\n\n if (exact) {\n const results = currentMap.get(CODA_MARKER);\n return results || []\n }\n\n const results = [];\n // traverse\n const queue = [currentMap];\n while (queue.length) {\n const currentMap = queue.shift();\n const entriesSortedByKey = [...currentMap.entries()].sort((a, b) => a[0] < b[0] ? -1 : 1);\n for (const [key, value] of entriesSortedByKey) {\n if (key === CODA_MARKER) { // CODA_MARKER always comes first; it's the empty string\n results.push(...value);\n } else {\n queue.push(value);\n }\n }\n }\n return results\n };\n\n return search\n}\n\nconst requiredKeys$1 = [\n 'name',\n 'url'\n];\n\nfunction assertCustomEmojis (customEmojis) {\n const isArray = customEmojis && Array.isArray(customEmojis);\n const firstItemIsFaulty = isArray &&\n customEmojis.length &&\n (!customEmojis[0] || requiredKeys$1.some(key => !(key in customEmojis[0])));\n if (!isArray || firstItemIsFaulty) {\n throw new Error('Custom emojis are in the wrong format')\n }\n}\n\nfunction customEmojiIndex (customEmojis) {\n assertCustomEmojis(customEmojis);\n\n const sortByName = (a, b) => a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1;\n\n //\n // all()\n //\n const all = customEmojis.sort(sortByName);\n\n //\n // search()\n //\n const emojiToTokens = emoji => {\n const set = new Set();\n if (emoji.shortcodes) {\n for (const shortcode of emoji.shortcodes) {\n for (const token of extractTokens(shortcode)) {\n set.add(token);\n }\n }\n }\n return set\n };\n const searchTrie = trie(customEmojis, emojiToTokens);\n const searchByExactMatch = _ => searchTrie(_, true);\n const searchByPrefix = _ => searchTrie(_, false);\n\n // Search by query for custom emoji. Similar to how we do this in IDB, the last token\n // is treated as a prefix search, but every other one is treated as an exact match.\n // Then we AND the results together\n const search = query => {\n const tokens = extractTokens(query);\n const intermediateResults = tokens.map((token, i) => (\n (i < tokens.length - 1 ? searchByExactMatch : searchByPrefix)(token)\n ));\n return findCommonMembers(intermediateResults, _ => _.name).sort(sortByName)\n };\n\n //\n // byShortcode, byName\n //\n const shortcodeToEmoji = new Map();\n const nameToEmoji = new Map();\n for (const customEmoji of customEmojis) {\n nameToEmoji.set(customEmoji.name.toLowerCase(), customEmoji);\n for (const shortcode of (customEmoji.shortcodes || [])) {\n shortcodeToEmoji.set(shortcode.toLowerCase(), customEmoji);\n }\n }\n\n const byShortcode = shortcode => shortcodeToEmoji.get(shortcode.toLowerCase());\n const byName = name => nameToEmoji.get(name.toLowerCase());\n\n return {\n all,\n search,\n byShortcode,\n byName\n }\n}\n\nconst isFirefoxContentScript = typeof wrappedJSObject !== 'undefined';\n\n// remove some internal implementation details, i.e. the \"tokens\" array on the emoji object\n// essentially, convert the emoji from the version stored in IDB to the version used in-memory\nfunction cleanEmoji (emoji) {\n if (!emoji) {\n return emoji\n }\n // if inside a Firefox content script, need to clone the emoji object to prevent Firefox from complaining about\n // cross-origin object. See: https://github.com/nolanlawson/emoji-picker-element/issues/356\n /* istanbul ignore if */\n if (isFirefoxContentScript) {\n emoji = structuredClone(emoji);\n }\n delete emoji.tokens;\n if (emoji.skinTones) {\n const len = emoji.skinTones.length;\n emoji.skins = Array(len);\n for (let i = 0; i < len; i++) {\n emoji.skins[i] = {\n tone: emoji.skinTones[i],\n unicode: emoji.skinUnicodes[i],\n version: emoji.skinVersions[i]\n };\n }\n delete emoji.skinTones;\n delete emoji.skinUnicodes;\n delete emoji.skinVersions;\n }\n return emoji\n}\n\nfunction warnETag (eTag) {\n if (!eTag) {\n console.warn('emoji-picker-element is more efficient if the dataSource server exposes an ETag header.');\n }\n}\n\nconst requiredKeys = [\n 'annotation',\n 'emoji',\n 'group',\n 'order',\n 'version'\n];\n\nfunction assertEmojiData (emojiData) {\n if (!emojiData ||\n !Array.isArray(emojiData) ||\n !emojiData[0] ||\n (typeof emojiData[0] !== 'object') ||\n requiredKeys.some(key => (!(key in emojiData[0])))) {\n throw new Error('Emoji data is in the wrong format')\n }\n}\n\nfunction assertStatus (response, dataSource) {\n if (Math.floor(response.status / 100) !== 2) {\n throw new Error('Failed to fetch: ' + dataSource + ': ' + response.status)\n }\n}\n\nasync function getETag (dataSource) {\n const response = await fetch(dataSource, { method: 'HEAD' });\n assertStatus(response, dataSource);\n const eTag = response.headers.get('etag');\n warnETag(eTag);\n return eTag\n}\n\nasync function getETagAndData (dataSource) {\n const response = await fetch(dataSource);\n assertStatus(response, dataSource);\n const eTag = response.headers.get('etag');\n warnETag(eTag);\n const emojiData = await response.json();\n assertEmojiData(emojiData);\n return [eTag, emojiData]\n}\n\n// TODO: including these in blob-util.ts causes typedoc to generate docs for them,\n// even with --excludePrivate ¯\\_(ツ)_/¯\n/** @private */\n/**\n * Convert an `ArrayBuffer` to a binary string.\n *\n * Example:\n *\n * ```js\n * var myString = blobUtil.arrayBufferToBinaryString(arrayBuff)\n * ```\n *\n * @param buffer - array buffer\n * @returns binary string\n */\nfunction arrayBufferToBinaryString(buffer) {\n var binary = '';\n var bytes = new Uint8Array(buffer);\n var length = bytes.byteLength;\n var i = -1;\n while (++i < length) {\n binary += String.fromCharCode(bytes[i]);\n }\n return binary;\n}\n/**\n * Convert a binary string to an `ArrayBuffer`.\n *\n * ```js\n * var myBuffer = blobUtil.binaryStringToArrayBuffer(binaryString)\n * ```\n *\n * @param binary - binary string\n * @returns array buffer\n */\nfunction binaryStringToArrayBuffer(binary) {\n var length = binary.length;\n var buf = new ArrayBuffer(length);\n var arr = new Uint8Array(buf);\n var i = -1;\n while (++i < length) {\n arr[i] = binary.charCodeAt(i);\n }\n return buf;\n}\n\n// generate a checksum based on the stringified JSON\nasync function jsonChecksum (object) {\n const inString = JSON.stringify(object);\n let inBuffer = binaryStringToArrayBuffer(inString);\n\n // this does not need to be cryptographically secure, SHA-1 is fine\n const outBuffer = await crypto.subtle.digest('SHA-1', inBuffer);\n const outBinString = arrayBufferToBinaryString(outBuffer);\n const res = btoa(outBinString);\n return res\n}\n\nasync function checkForUpdates (db, dataSource) {\n // just do a simple HEAD request first to see if the eTags match\n let emojiData;\n let eTag = await getETag(dataSource);\n if (!eTag) { // work around lack of ETag/Access-Control-Expose-Headers\n const eTagAndData = await getETagAndData(dataSource);\n eTag = eTagAndData[0];\n emojiData = eTagAndData[1];\n if (!eTag) {\n eTag = await jsonChecksum(emojiData);\n }\n }\n if (await hasData(db, dataSource, eTag)) ; else {\n if (!emojiData) {\n const eTagAndData = await getETagAndData(dataSource);\n emojiData = eTagAndData[1];\n }\n await loadData(db, emojiData, dataSource, eTag);\n }\n}\n\nasync function loadDataForFirstTime (db, dataSource) {\n let [eTag, emojiData] = await getETagAndData(dataSource);\n if (!eTag) {\n // Handle lack of support for ETag or Access-Control-Expose-Headers\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers#Browser_compatibility\n eTag = await jsonChecksum(emojiData);\n }\n\n await loadData(db, emojiData, dataSource, eTag);\n}\n\nclass Database {\n constructor ({ dataSource = DEFAULT_DATA_SOURCE, locale = DEFAULT_LOCALE, customEmoji = [] } = {}) {\n this.dataSource = dataSource;\n this.locale = locale;\n this._dbName = `emoji-picker-element-${this.locale}`;\n this._db = undefined;\n this._lazyUpdate = undefined;\n this._custom = customEmojiIndex(customEmoji);\n\n this._clear = this._clear.bind(this);\n this._ready = this._init();\n }\n\n async _init () {\n const db = this._db = await openDatabase(this._dbName);\n\n addOnCloseListener(this._dbName, this._clear);\n const dataSource = this.dataSource;\n const empty = await isEmpty(db);\n\n if (empty) {\n await loadDataForFirstTime(db, dataSource);\n } else { // offline-first - do an update asynchronously\n this._lazyUpdate = checkForUpdates(db, dataSource);\n }\n }\n\n async ready () {\n const checkReady = async () => {\n if (!this._ready) {\n this._ready = this._init();\n }\n return this._ready\n };\n await checkReady();\n // There's a possibility of a race condition where the element gets added, removed, and then added again\n // with a particular timing, which would set the _db to undefined.\n // We *could* do a while loop here, but that seems excessive and could lead to an infinite loop.\n if (!this._db) {\n await checkReady();\n }\n }\n\n async getEmojiByGroup (group) {\n assertNumber(group);\n await this.ready();\n return uniqEmoji(await getEmojiByGroup(this._db, group)).map(cleanEmoji)\n }\n\n async getEmojiBySearchQuery (query) {\n assertNonEmptyString(query);\n await this.ready();\n const customs = this._custom.search(query);\n const natives = uniqEmoji(await getEmojiBySearchQuery(this._db, query)).map(cleanEmoji);\n return [\n ...customs,\n ...natives\n ]\n }\n\n async getEmojiByShortcode (shortcode) {\n assertNonEmptyString(shortcode);\n await this.ready();\n const custom = this._custom.byShortcode(shortcode);\n if (custom) {\n return custom\n }\n return cleanEmoji(await getEmojiByShortcode(this._db, shortcode))\n }\n\n async getEmojiByUnicodeOrName (unicodeOrName) {\n assertNonEmptyString(unicodeOrName);\n await this.ready();\n const custom = this._custom.byName(unicodeOrName);\n if (custom) {\n return custom\n }\n return cleanEmoji(await getEmojiByUnicode(this._db, unicodeOrName))\n }\n\n async getPreferredSkinTone () {\n await this.ready();\n return (await get(this._db, STORE_KEYVALUE, KEY_PREFERRED_SKINTONE)) || 0\n }\n\n async setPreferredSkinTone (skinTone) {\n assertNumber(skinTone);\n await this.ready();\n return set(this._db, STORE_KEYVALUE, KEY_PREFERRED_SKINTONE, skinTone)\n }\n\n async incrementFavoriteEmojiCount (unicodeOrName) {\n assertNonEmptyString(unicodeOrName);\n await this.ready();\n return incrementFavoriteEmojiCount(this._db, unicodeOrName)\n }\n\n async getTopFavoriteEmoji (limit) {\n assertNumber(limit);\n await this.ready();\n return (await getTopFavoriteEmoji(this._db, this._custom, limit)).map(cleanEmoji)\n }\n\n set customEmoji (customEmojis) {\n this._custom = customEmojiIndex(customEmojis);\n }\n\n get customEmoji () {\n return this._custom.all\n }\n\n async _shutdown () {\n await this.ready(); // reopen if we've already been closed/deleted\n try {\n await this._lazyUpdate; // allow any lazy updates to process before closing/deleting\n } catch (err) { /* ignore network errors (offline-first) */ }\n }\n\n // clear references to IDB, e.g. during a close event\n _clear () {\n // We don't need to call removeEventListener or remove the manual \"close\" listeners.\n // The memory leak tests prove this is unnecessary. It's because:\n // 1) IDBDatabases that can no longer fire \"close\" automatically have listeners GCed\n // 2) we clear the manual close listeners in databaseLifecycle.js.\n this._db = this._ready = this._lazyUpdate = undefined;\n }\n\n async close () {\n await this._shutdown();\n await closeDatabase(this._dbName);\n }\n\n async delete () {\n await this._shutdown();\n await deleteDatabase(this._dbName);\n }\n}\n\nexport { Database as default };\n","var browserSupportsTextareaTextNodes;\n/**\n * @param {HTMLElement} input\n * @return {boolean}\n */\n\nfunction canManipulateViaTextNodes(input) {\n if (input.nodeName !== \"TEXTAREA\") {\n return false;\n }\n\n if (typeof browserSupportsTextareaTextNodes === \"undefined\") {\n var textarea = document.createElement(\"textarea\");\n textarea.value = 1;\n browserSupportsTextareaTextNodes = !!textarea.firstChild;\n }\n\n return browserSupportsTextareaTextNodes;\n}\n/**\n * @param {HTMLTextAreaElement|HTMLInputElement} input\n * @param {string} text\n * @returns {void}\n */\n\n\nfunction index (input, text) {\n // Most of the used APIs only work with the field selected\n input.focus(); // IE 8-10\n\n if (document.selection) {\n var ieRange = document.selection.createRange();\n ieRange.text = text; // Move cursor after the inserted text\n\n ieRange.collapse(false\n /* to the end */\n );\n ieRange.select();\n return;\n } // Webkit + Edge\n\n\n var isSuccess = document.execCommand(\"insertText\", false, text);\n\n if (!isSuccess) {\n var start = input.selectionStart;\n var end = input.selectionEnd; // Firefox (non-standard method)\n\n if (typeof input.setRangeText === \"function\") {\n input.setRangeText(text);\n } else {\n // To make a change we just need a Range, not a Selection\n var range = document.createRange();\n var textNode = document.createTextNode(text);\n\n if (canManipulateViaTextNodes(input)) {\n var node = input.firstChild; // If textarea is empty, just insert the text\n\n if (!node) {\n input.appendChild(textNode);\n } else {\n // Otherwise we need to find a nodes for start and end\n var offset = 0;\n var startNode = null;\n var endNode = null;\n\n while (node && (startNode === null || endNode === null)) {\n var nodeLength = node.nodeValue.length; // if start of the selection falls into current node\n\n if (start >= offset && start <= offset + nodeLength) {\n range.setStart(startNode = node, start - offset);\n } // if end of the selection falls into current node\n\n\n if (end >= offset && end <= offset + nodeLength) {\n range.setEnd(endNode = node, end - offset);\n }\n\n offset += nodeLength;\n node = node.nextSibling;\n } // If there is some text selected, remove it as we should replace it\n\n\n if (start !== end) {\n range.deleteContents();\n }\n }\n } // If the node is a textarea and the range doesn't span outside the element\n //\n // Get the commonAncestorContainer of the selected range and test its type\n // If the node is of type `#text` it means that we're still working with text nodes within our textarea element\n // otherwise, if it's of type `#document` for example it means our selection spans outside the textarea.\n\n\n if (canManipulateViaTextNodes(input) && range.commonAncestorContainer.nodeName === \"#text\") {\n // Finally insert a new node. The browser will automatically split start and end nodes into two if necessary\n range.insertNode(textNode);\n } else {\n // If the node is not a textarea or the range spans outside a textarea the only way is to replace the whole value\n var value = input.value;\n input.value = value.slice(0, start) + text + value.slice(end);\n }\n } // Correct the cursor position to be at the end of the insertion\n\n\n input.setSelectionRange(start + text.length, start + text.length); // Notify any possible listeners of the change\n\n var e = document.createEvent(\"UIEvent\");\n e.initEvent(\"input\", true, false);\n input.dispatchEvent(e);\n }\n}\n\nexport default index;\n//# sourceMappingURL=index.esm.js.map\n","let browserSupportsTextareaTextNodes;\n\n/**\n * @param {HTMLElement} input\n * @return {boolean}\n */\nfunction canManipulateViaTextNodes(input) {\n if (input.nodeName !== \"TEXTAREA\") {\n return false;\n }\n if (typeof browserSupportsTextareaTextNodes === \"undefined\") {\n const textarea = document.createElement(\"textarea\");\n textarea.value = 1;\n browserSupportsTextareaTextNodes = !!textarea.firstChild;\n }\n return browserSupportsTextareaTextNodes;\n}\n\n/**\n * @param {HTMLTextAreaElement|HTMLInputElement} input\n * @param {string} text\n * @returns {void}\n */\nexport default function(input, text) {\n // Most of the used APIs only work with the field selected\n input.focus();\n\n // IE 8-10\n if (document.selection) {\n const ieRange = document.selection.createRange();\n ieRange.text = text;\n\n // Move cursor after the inserted text\n ieRange.collapse(false /* to the end */);\n ieRange.select();\n\n return;\n }\n\n // Webkit + Edge\n const isSuccess = document.execCommand(\"insertText\", false, text);\n if (!isSuccess) {\n const start = input.selectionStart;\n const end = input.selectionEnd;\n // Firefox (non-standard method)\n if (typeof input.setRangeText === \"function\") {\n input.setRangeText(text);\n } else {\n // To make a change we just need a Range, not a Selection\n const range = document.createRange();\n const textNode = document.createTextNode(text);\n\n if (canManipulateViaTextNodes(input)) {\n let node = input.firstChild;\n\n // If textarea is empty, just insert the text\n if (!node) {\n input.appendChild(textNode);\n } else {\n // Otherwise we need to find a nodes for start and end\n let offset = 0;\n let startNode = null;\n let endNode = null;\n\n while (node && (startNode === null || endNode === null)) {\n const nodeLength = node.nodeValue.length;\n\n // if start of the selection falls into current node\n if (start >= offset && start <= offset + nodeLength) {\n range.setStart((startNode = node), start - offset);\n }\n\n // if end of the selection falls into current node\n if (end >= offset && end <= offset + nodeLength) {\n range.setEnd((endNode = node), end - offset);\n }\n\n offset += nodeLength;\n node = node.nextSibling;\n }\n\n // If there is some text selected, remove it as we should replace it\n if (start !== end) {\n range.deleteContents();\n }\n }\n }\n\n // If the node is a textarea and the range doesn't span outside the element\n //\n // Get the commonAncestorContainer of the selected range and test its type\n // If the node is of type `#text` it means that we're still working with text nodes within our textarea element\n // otherwise, if it's of type `#document` for example it means our selection spans outside the textarea.\n if (\n canManipulateViaTextNodes(input) &&\n range.commonAncestorContainer.nodeName === \"#text\"\n ) {\n // Finally insert a new node. The browser will automatically split start and end nodes into two if necessary\n range.insertNode(textNode);\n } else {\n // If the node is not a textarea or the range spans outside a textarea the only way is to replace the whole value\n const value = input.value;\n input.value = value.slice(0, start) + text + value.slice(end);\n }\n }\n\n // Correct the cursor position to be at the end of the insertion\n input.setSelectionRange(start + text.length, start + text.length);\n\n // Notify any possible listeners of the change\n const e = document.createEvent(\"UIEvent\");\n e.initEvent(\"input\", true, false);\n input.dispatchEvent(e);\n }\n}\n","/*!\n * @georapbox/capture-photo-element\n * A custom element that implements the MediaDevices.getUserMedia() method of the MediaDevices interface to capture a photo in the browser.\n *\n * @version 5.0.0\n * @homepage https://github.com/georapbox/capture-photo-element#readme\n * @author George Raptis \n * @license MIT\n */\nvar c=(r,t,e)=>(Number.isNaN(t)&&(t=0),Number.isNaN(e)&&(e=0),Math.min(Math.max(r,Math.min(t,e)),Math.max(t,e)));var a=\"capture-photo\",d=`\n :host { display: block; box-sizing: border-box; }\n :host *, :host *::before, :host *::after { box-sizing: inherit;}\n :host([hidden]), [hidden], ::slotted([hidden]) { display: none; }\n video { display: block; }\n #output:empty { display: none; }\n`,u=document.createElement(\"template\");u.innerHTML=`\n \n \n \n
\n \n \n \n \n
\n \n
\n`;var h=class r extends HTMLElement{#a={};#t=null;#n=null;#h=null;#e=null;#r=null;#i=null;constructor(){super(),this.#a=this.getSupportedConstraints(),this.shadowRoot||this.attachShadow({mode:\"open\"}).appendChild(u.content.cloneNode(!0))}static get observedAttributes(){return[\"no-image\",\"pan\",\"tilt\",\"zoom\",\"torch\"]}attributeChangedCallback(t,e,s){if(!this.isConnected)return;let i=this.getTrackCapabilities();if(t===\"no-image\"&&e!==s&&this.#u(),t===\"pan\"&&e!==s&&\"pan\"in this.#a){let o=\"pan\"in i&&i.pan?.min&&i.pan?.max?this.pan>=i.pan.min&&this.pan<=i.pan.max:!1;typeof this.pan==\"number\"&&o&&this.#o(\"pan\",this.pan)}if(t===\"tilt\"&&e!==s&&\"tilt\"in this.#a){let o=\"tilt\"in i&&i.tilt?.min&&i.tilt?.max?this.tilt>=i.tilt.min&&this.tilt<=i.tilt.max:!1;typeof this.tilt==\"number\"&&o&&this.#o(\"tilt\",this.tilt)}if(t===\"zoom\"&&e!==s&&\"zoom\"in this.#a){let o=\"zoom\"in i&&i.zoom?.min&&i.zoom?.max?this.zoom>=i.zoom.min&&this.zoom<=i.zoom.max:!1;typeof this.zoom==\"number\"&&o&&this.#o(\"zoom\",this.zoom)}t===\"torch\"&&e!==s&&\"torch\"in this.#a&&this.#o(\"torch\",this.torch)}async connectedCallback(){if(this.#s(\"autoPlay\"),this.#s(\"noImage\"),this.#s(\"facingMode\"),this.#s(\"cameraResolution\"),this.#s(\"pan\"),this.#s(\"tilt\"),this.#s(\"zoom\"),this.#s(\"torch\"),this.#s(\"calculateFileSize\"),this.#n=this.shadowRoot?.querySelector(\"canvas\")||null,this.#h=this.shadowRoot?.getElementById(\"output\")||null,this.#e=this.shadowRoot?.querySelector(\"video\")||null,this.#r=this.shadowRoot?.querySelector('slot[name=\"capture-button\"]')||null,this.#i=this.#m(),this.#e?.addEventListener(\"loadedmetadata\",this.#c),this.#r?.addEventListener(\"slotchange\",this.#d),this.#i?.addEventListener(\"click\",this.#l),!r.isSupported())return this.dispatchEvent(new CustomEvent(`${a}:error`,{bubbles:!0,composed:!0,detail:{error:{name:\"NotSupportedError\",message:\"Not supported\"}}}));this.autoPlay&&this.startVideoStream()}disconnectedCallback(){this.stopVideoStream(),this.#i?.removeEventListener(\"click\",this.#l),this.#e?.removeEventListener(\"loadedmetadata\",this.#c),this.#r?.removeEventListener(\"slotchange\",this.#d)}get autoPlay(){return this.hasAttribute(\"auto-play\")}set autoPlay(t){this.toggleAttribute(\"auto-play\",!!t)}get noImage(){return this.hasAttribute(\"no-image\")}set noImage(t){this.toggleAttribute(\"no-image\",!!t)}get facingMode(){let t=this.getAttribute(\"facing-mode\");return t!==\"user\"?\"environment\":t}set facingMode(t){this.setAttribute(\"facing-mode\",t)}get cameraResolution(){return this.getAttribute(\"camera-resolution\")||\"\"}set cameraResolution(t){this.setAttribute(\"camera-resolution\",t)}get pan(){return Number(this.getAttribute(\"pan\"))||0}set pan(t){this.setAttribute(\"pan\",t!=null?t.toString():t)}get tilt(){return Number(this.getAttribute(\"tilt\"))||0}set tilt(t){this.setAttribute(\"tilt\",t!=null?t.toString():t)}get zoom(){return Number(this.getAttribute(\"zoom\"))||1}set zoom(t){this.setAttribute(\"zoom\",t!=null?t.toString():t)}get torch(){return this.hasAttribute(\"torch\")}set torch(t){this.toggleAttribute(\"torch\",!!t)}get calculateFileSize(){return this.hasAttribute(\"calculate-file-size\")}set calculateFileSize(t){this.toggleAttribute(\"calculate-file-size\",!!t)}get loading(){return this.hasAttribute(\"loading\")}#l=t=>{t.preventDefault(),this.capture()};#c=t=>{let e=t.target;e.play().then(()=>{this.dispatchEvent(new CustomEvent(`${a}:video-play`,{bubbles:!0,composed:!0,detail:{video:e}}))}).catch(s=>{this.dispatchEvent(new CustomEvent(`${a}:error`,{bubbles:!0,composed:!0,detail:{error:s}}))}).finally(()=>{this.removeAttribute(\"loading\")})};#u(){this.#h&&this.#h.replaceChildren()}#o(t,e){if(!this.#t)return;let[s]=this.#t.getVideoTracks(),i=this.getTrackCapabilities(),o=this.getTrackSettings(),n=t===\"pan\"||t===\"tilt\"||t===\"zoom\"?c(Number(e),i[t]?.min||1,i[t]?.max||1):e;t in o&&s.applyConstraints({advanced:[{[t]:n}]}).catch(()=>{})}#d=t=>{t.target?.name===\"capture-button\"&&(this.#i?.removeEventListener(\"click\",this.#l),this.#i=this.#m(),this.#i&&(this.#i.addEventListener(\"click\",this.#l),this.#i.nodeName!==\"BUTTON\"&&!this.#i.hasAttribute(\"role\")&&this.#i.setAttribute(\"role\",\"button\")))};#m(){return this.#r&&this.#r.assignedElements({flatten:!0}).find(t=>t.nodeName===\"BUTTON\"||t.getAttribute(\"slot\")===\"capture-button\")||null}#s(t){let e=this;if(Object.prototype.hasOwnProperty.call(e,t)){let s=e[t];delete e[t],e[t]=s}}async startVideoStream(t){if(!r.isSupported()||this.#t)return;this.setAttribute(\"loading\",\"\");let e={video:{facingMode:{ideal:this.facingMode},pan:!0,tilt:!0,zoom:!0,torch:this.torch},audio:!1};if(typeof t==\"string\"&&t.trim().length>0&&(e.video.deviceId={exact:t}),typeof this.cameraResolution==\"string\"&&this.cameraResolution.trim().length>0){let[s=0,i=0]=this.cameraResolution.split(\"x\").map(o=>Number(o));s>0&&i>0&&(e.video.width=s,e.video.height=i)}try{this.#t=await navigator.mediaDevices.getUserMedia(e),this.#e&&(this.#e.srcObject=this.#t),this.#o(\"pan\",this.pan),this.#o(\"tilt\",this.tilt),this.#o(\"zoom\",this.zoom)}catch(s){this.dispatchEvent(new CustomEvent(`${a}:error`,{bubbles:!0,composed:!0,detail:{error:s}}))}finally{this.removeAttribute(\"loading\")}}restartVideoStream(t){this.#t&&this.#e&&this.stopVideoStream(),this.startVideoStream(t)}stopVideoStream(){if(!this.#e||!this.#t)return;let[t]=this.#t.getVideoTracks();t?.stop(),this.#e.srcObject=null,this.#t=null}async capture(){if(!(this.loading||!this.#n||!this.#e))try{let t=this.#n.getContext(\"2d\"),e=this.#e.videoWidth,s=this.#e.videoHeight;this.#n.width=e,this.#n.height=s,t?.drawImage(this.#e,0,0,e,s);let i=this.#n.toDataURL(\"image/png\");if(typeof i==\"string\"&&i.includes(\"data:image\")){if(!this.noImage){let n=new Image;n.src=i,n.width=e,n.height=s,n.alt=\"Captured photo\",n.setAttribute(\"part\",\"output-image\"),this.#u(),this.#h?.appendChild(n)}let o={dataURI:i,width:e,height:s};if(this.calculateFileSize)try{let l=(await(await fetch(i)).blob()).size;l&&(o.size=l)}catch{}this.dispatchEvent(new CustomEvent(`${a}:success`,{bubbles:!0,composed:!0,detail:o}))}}catch(t){this.dispatchEvent(new CustomEvent(`${a}:error`,{bubbles:!0,composed:!0,detail:{error:t}}))}}getSupportedConstraints(){return r.isSupported()?navigator.mediaDevices.getSupportedConstraints()||{}:{}}getTrackCapabilities(){if(!this.#t)return{};let[t]=this.#t.getVideoTracks();return t&&typeof t.getCapabilities==\"function\"?t.getCapabilities()||{}:{}}getTrackSettings(){if(!this.#t)return{};let[t]=this.#t.getVideoTracks();return t&&typeof t.getSettings==\"function\"?t.getSettings()||{}:{}}static async getVideoInputDevices(){return!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices?[]:(await navigator.mediaDevices.enumerateDevices()||[]).filter(e=>e.kind===\"videoinput\"&&!!e.deviceId)}static isSupported(){return!!navigator.mediaDevices?.getUserMedia}static defineCustomElement(t=a){typeof window<\"u\"&&!window.customElements.get(t)&&window.customElements.define(t,r)}};h.defineCustomElement();export{h as CapturePhoto};\n//# sourceMappingURL=capture-photo-defined.js.map\n","// @ts-check\n\n/**\n * Clamps number within the inclusive `min` and `max` bounds,\n * making sure it does not go beyond them on either side.\n * If `min` is greater than `max` the parameters are swapped to support inverted ranges.\n *\n * @param {number} value - The number to clamp.\n * @param {number} lower - The lower bound.\n * @param {number} upper - The upper bound.\n * @throws {TypeError} - If one or more of the arguments passed is not a number.\n * @returns {number} - The clamped number.\n * @example\n *\n * clamp(10, -5, 5);\n * // => 5\n *\n * clamp(-10, -5, 5);\n * // => -5\n *\n * clamp(-15, 0, 100);\n * // => 0\n *\n * clamp(120, 0, 100);\n * // => 100\n *\n * clamp(-5, NaN, 5); // If any of lower or upper bound are `NaN`, they will be converted to `0`.\n * // => 0\n *\n * clamp(120, 100, 0); // The order of lower and upper bounds is reversed (100 > 0)\n * // => 100\n */\nexport const clamp = (value, lower, upper) => {\n if (Number.isNaN(lower)) {\n lower = 0;\n }\n\n if (Number.isNaN(upper)) {\n upper = 0;\n }\n\n return Math.min(Math.max(value, Math.min(lower, upper)), Math.max(lower, upper));\n};\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\n/**\n * @typedef {Object} ExtendedMediaTrackCapabilities\n * @property {ULongRange} [width] - The width of the video track.\n * @property {ULongRange} [height] - The height of the video track.\n * @property {ULongRange} [pan] - The pan level of the camera.\n * @property {ULongRange} [tilt] - The tilt level of the camera.\n * @property {ULongRange} [zoom] - The zoom level of the camera.\n * @property {MediaTrackCapabilities} [nativeMediaTrackCapabilities] - The native track capabilities.\n */\n\n/**\n * @typedef {Object} ExtendedMediaTrackConstraints\n * @property {MediaTrackConstraints & {pan: boolean, tilt: boolean, zoom: boolean, torch: boolean}} video - The video constraints.\n * @property {MediaTrackConstraints | boolean} audio - The audio constraints.\n */\n\nimport { clamp } from './utils/clamp.js';\n\nconst COMPONENT_NAME = 'capture-photo';\n\nconst styles = /* css */ `\n :host { display: block; box-sizing: border-box; }\n :host *, :host *::before, :host *::after { box-sizing: inherit;}\n :host([hidden]), [hidden], ::slotted([hidden]) { display: none; }\n video { display: block; }\n #output:empty { display: none; }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */ `\n \n \n \n
\n \n \n \n \n
\n \n
\n`;\n\n/**\n * @summary A custom element that implements the MediaDevices.getUserMedia() method of the MediaDevices interface to capture a photo in the browser.\n * @documentation https://github.com/georapbox/capture-photo-element\n *\n * @tagname capture-photo This is the default tag name, unless overridden by the `defineCustomElement` method.\n * @extends HTMLElement\n *\n * @property {boolean} autoPlay - Whether or not to start the video stream automatically.\n * @property {boolean} noImage - Whether or not to show the captured image.\n * @property {string} facingMode - The facing mode of the camera.\n * @property {string} cameraResolution - The resolution of the camera.\n * @property {number} pan - The pan value of the camera.\n * @property {number} tilt - The tilt value of the camera.\n * @property {number} zoom - The zoom value of the camera.\n * @property {boolean} torch - Whether or not the fill light is connected.\n * @property {boolean} calculateFileSize - Whether or not to calculate the file size of the captured image.\n * @property {boolean} loading - Whether or not the video stream is loading.\n *\n * @atttribute {boolean} auto-play - Reflects the autoPlay property.\n * @atttribute {boolean} no-image - Reflects the noImage property.\n * @atttribute {string} facing-mode - Reflects the facingMode property.\n * @atttribute {string} camera-resolution - Reflects the cameraResolution property.\n * @atttribute {number} pan - Reflects the pan property.\n * @atttribute {number} tilt - Reflects the tilt property.\n * @atttribute {number} zoom - Reflects the zoom property.\n * @atttribute {boolean} torch - Reflects the torch property.\n * @atttribute {boolean} calculate-file-size - Reflects the calculateFileSize property.\n * @atttribute {boolean} loading - Reflects the loading property.\n *\n * @slot capture-button - The capture button.\n * @slot capture-button-content - The capture button content.\n * @slot actions - The actions container.\n * @slot - A default un-named slot to add content inside the component.\n *\n * @csspart video - The video element.\n * @csspart actions-container - The actions container.\n * @csspart capture-button - The capture button.\n * @csspart output-container - The output container.\n * @csspart output-image - The output image.\n *\n * @event capture-photo:video-play - Fires when the video stream is successfully playing.\n * @event capture-photo:success - Fires when the photo is successfully captured.\n * @event capture-photo:error - Fires when an error occurs.\n *\n * @method defineCustomElement - Static method. Defines the custom element with the given name.\n * @method isSupported - Static method. Checks if the MediaDevices.getUserMedia() method is supported.\n * @method getVideoInputDevices - Static method. Gets the available video devices.\n * @method startVideoStream - Instance method. Starts the video stream.\n * @method restartVideoStream - Instance method. Restarts the video stream.\n * @method stopVideoStream - Instance method. Stops the video stream.\n * @method capture - Instance method. Captures a photo.\n * @method getSupportedConstraints - Instance method. Gets the supported constraints.\n * @method getTrackCapabilities - Instance method. Gets the track capabilities.\n * @method getTrackSettings - Instance method. Gets the track settings.\n */\nclass CapturePhoto extends HTMLElement {\n /** @type {MediaTrackSupportedConstraints | {}}*/\n #supportedConstraints = {};\n\n /** @type {Nullable} */\n #stream = null;\n\n /** @type {Nullable} */\n #canvasElement = null;\n\n /** @type {Nullable} */\n #outputElement = null;\n\n /** @type {Nullable} */\n #videoElement = null;\n\n /** @type {Nullable} */\n #captureButtonSlot = null;\n\n /** @type {Nullable} */\n #captureButton = null;\n\n constructor() {\n super();\n\n this.#supportedConstraints = this.getSupportedConstraints();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n }\n\n static get observedAttributes() {\n return ['no-image', 'pan', 'tilt', 'zoom', 'torch'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (!this.isConnected) {\n return;\n }\n\n /** @type {ExtendedMediaTrackCapabilities} */\n const trackCapabilities = this.getTrackCapabilities();\n\n if (name === 'no-image' && oldValue !== newValue) {\n this.#emptyOutputElement();\n }\n\n if (name === 'pan' && oldValue !== newValue && 'pan' in this.#supportedConstraints) {\n const panInAllowedRange =\n 'pan' in trackCapabilities && trackCapabilities.pan?.min && trackCapabilities.pan?.max\n ? this.pan >= trackCapabilities.pan.min && this.pan <= trackCapabilities.pan.max\n : false;\n\n if (typeof this.pan === 'number' && panInAllowedRange) {\n this.#applyConstraint('pan', this.pan);\n }\n }\n\n if (name === 'tilt' && oldValue !== newValue && 'tilt' in this.#supportedConstraints) {\n const tiltInAllowedRange =\n 'tilt' in trackCapabilities && trackCapabilities.tilt?.min && trackCapabilities.tilt?.max\n ? this.tilt >= trackCapabilities.tilt.min && this.tilt <= trackCapabilities.tilt.max\n : false;\n\n if (typeof this.tilt === 'number' && tiltInAllowedRange) {\n this.#applyConstraint('tilt', this.tilt);\n }\n }\n\n if (name === 'zoom' && oldValue !== newValue && 'zoom' in this.#supportedConstraints) {\n const zoomInAllowedRange =\n 'zoom' in trackCapabilities && trackCapabilities.zoom?.min && trackCapabilities.zoom?.max\n ? this.zoom >= trackCapabilities.zoom.min && this.zoom <= trackCapabilities.zoom.max\n : false;\n\n if (typeof this.zoom === 'number' && zoomInAllowedRange) {\n this.#applyConstraint('zoom', this.zoom);\n }\n }\n\n if (name === 'torch' && oldValue !== newValue && 'torch' in this.#supportedConstraints) {\n this.#applyConstraint('torch', this.torch);\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n async connectedCallback() {\n this.#upgradeProperty('autoPlay');\n this.#upgradeProperty('noImage');\n this.#upgradeProperty('facingMode');\n this.#upgradeProperty('cameraResolution');\n this.#upgradeProperty('pan');\n this.#upgradeProperty('tilt');\n this.#upgradeProperty('zoom');\n this.#upgradeProperty('torch');\n this.#upgradeProperty('calculateFileSize');\n\n this.#canvasElement = this.shadowRoot?.querySelector('canvas') || null;\n this.#outputElement = this.shadowRoot?.getElementById('output') || null;\n this.#videoElement = this.shadowRoot?.querySelector('video') || null;\n this.#captureButtonSlot = this.shadowRoot?.querySelector('slot[name=\"capture-button\"]') || null;\n this.#captureButton = this.#getCaptureButton();\n\n this.#videoElement?.addEventListener('loadedmetadata', this.#onVideoLoadedMetaData);\n this.#captureButtonSlot?.addEventListener('slotchange', this.#onCaptureButtonSlotChange);\n this.#captureButton?.addEventListener('click', this.#onCapturePhotoButtonClick);\n\n if (!CapturePhoto.isSupported()) {\n return this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: {\n name: 'NotSupportedError',\n message: 'Not supported'\n }\n }\n })\n );\n }\n\n if (this.autoPlay) {\n this.startVideoStream();\n }\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.stopVideoStream();\n this.#captureButton?.removeEventListener('click', this.#onCapturePhotoButtonClick);\n this.#videoElement?.removeEventListener('loadedmetadata', this.#onVideoLoadedMetaData);\n this.#captureButtonSlot?.removeEventListener('slotchange', this.#onCaptureButtonSlotChange);\n }\n\n /**\n * @type {boolean} autoPlay - Whether or not to start the video stream automatically.\n * @attribute auto-play - Reflects the autoPlay property.\n */\n get autoPlay() {\n return this.hasAttribute('auto-play');\n }\n\n set autoPlay(value) {\n this.toggleAttribute('auto-play', !!value);\n }\n\n /**\n * @type {boolean} noImage - Whether or not to show the captured image.\n * @attribute no-image - Reflects the noImage property.\n */\n get noImage() {\n return this.hasAttribute('no-image');\n }\n\n set noImage(value) {\n this.toggleAttribute('no-image', !!value);\n }\n\n /**\n * @type {string} facingMode - The facing mode of the camera.\n * @attribute facing-mode - Reflects the facingMode property.\n */\n get facingMode() {\n const value = this.getAttribute('facing-mode');\n\n if (value !== 'user') {\n return 'environment';\n }\n\n return value;\n }\n\n set facingMode(value) {\n this.setAttribute('facing-mode', value);\n }\n\n /**\n * @type {string} cameraResolution - The resolution of the camera.\n * @attribute camera-resolution - Reflects the cameraResolution property.\n */\n get cameraResolution() {\n return this.getAttribute('camera-resolution') || '';\n }\n\n set cameraResolution(value) {\n this.setAttribute('camera-resolution', value);\n }\n\n /**\n * @type {number} pan - The pan value of the camera.\n * @attribute pan - Reflects the pan property.\n */\n get pan() {\n return Number(this.getAttribute('pan')) || 0;\n }\n\n set pan(value) {\n this.setAttribute('pan', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} tilt - The tilt value of the camera.\n * @attribute tilt - Reflects the tilt property.\n */\n get tilt() {\n return Number(this.getAttribute('tilt')) || 0;\n }\n\n set tilt(value) {\n this.setAttribute('tilt', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} zoom - The zoom value of the camera.\n * @attribute zoom - Reflects the zoom property.\n */\n get zoom() {\n return Number(this.getAttribute('zoom')) || 1;\n }\n\n set zoom(value) {\n this.setAttribute('zoom', value != null ? value.toString() : value);\n }\n\n /**\n * @type {boolean} torch - Whether or not the fill light is connected.\n * @attribute torch - Reflects the torch property.\n */\n get torch() {\n return this.hasAttribute('torch');\n }\n\n set torch(value) {\n this.toggleAttribute('torch', !!value);\n }\n\n /**\n * @type {boolean} calculateFileSize - Whether or not to calculate the file size of the captured image.\n * @attribute calculate-file-size - Reflects the calculateFileSize property.\n */\n get calculateFileSize() {\n return this.hasAttribute('calculate-file-size');\n }\n\n set calculateFileSize(value) {\n this.toggleAttribute('calculate-file-size', !!value);\n }\n\n /**\n * @type {boolean} loading - Whether or not the video stream is loading.\n * @attribute loading - Reflects the loading property.\n */\n get loading() {\n return this.hasAttribute('loading');\n }\n\n /**\n * Handles the click event of the capture button.\n *\n * @param {*} evt - The click event.\n */\n #onCapturePhotoButtonClick = evt => {\n evt.preventDefault();\n this.capture();\n };\n\n /**\n * Handles the loadedmetadata event of the video element.\n *\n * @param {*} evt - The loadedmetadata event.\n */\n #onVideoLoadedMetaData = evt => {\n const video = evt.target;\n\n video\n .play()\n .then(() => {\n this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}:video-play`, {\n bubbles: true,\n composed: true,\n detail: { video }\n })\n );\n })\n .catch(\n /** @param {Error} error */ error => {\n this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n })\n );\n }\n )\n .finally(() => {\n this.removeAttribute('loading');\n });\n };\n\n /**\n * Removes all child nodes from the output element.\n */\n #emptyOutputElement() {\n if (!this.#outputElement) {\n return;\n }\n\n this.#outputElement.replaceChildren();\n }\n\n /**\n * Applies a constraint to the video track.\n *\n * @param {string} constraint - The name of the constraint.\n * @param {any} value - The value of the constraint.\n */\n #applyConstraint(constraint, value) {\n if (!this.#stream) {\n return;\n }\n\n const [track] = this.#stream.getVideoTracks();\n /** @type {ExtendedMediaTrackCapabilities} */\n const trackCapabilities = this.getTrackCapabilities();\n const trackSettings = this.getTrackSettings();\n\n const constraintValue =\n constraint === 'pan' || constraint === 'tilt' || constraint === 'zoom'\n ? clamp(Number(value), trackCapabilities[constraint]?.min || 1, trackCapabilities[constraint]?.max || 1)\n : value;\n\n if (constraint in trackSettings) {\n track\n .applyConstraints({\n advanced: [{ [constraint]: constraintValue }]\n })\n .catch(() => {\n // Fail silently...\n });\n }\n }\n\n /**\n * Handles the slotchange event of the capture button slot.\n *\n * @param {*} evt - The slotchange event.\n */\n #onCaptureButtonSlotChange = evt => {\n if (evt.target?.name === 'capture-button') {\n this.#captureButton?.removeEventListener('click', this.#onCapturePhotoButtonClick);\n this.#captureButton = this.#getCaptureButton();\n\n if (this.#captureButton) {\n this.#captureButton.addEventListener('click', this.#onCapturePhotoButtonClick);\n\n if (this.#captureButton.nodeName !== 'BUTTON' && !this.#captureButton.hasAttribute('role')) {\n this.#captureButton.setAttribute('role', 'button');\n }\n }\n }\n };\n\n /**\n * Returns the capture button.\n *\n * @returns {Nullable}\n */\n #getCaptureButton() {\n if (!this.#captureButtonSlot) {\n return null;\n }\n\n return (\n this.#captureButtonSlot.assignedElements({ flatten: true }).find(el => {\n return el.nodeName === 'BUTTON' || el.getAttribute('slot') === 'capture-button';\n }) || null\n );\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and\n * set a value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would\n * miss that property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'autoPlay' | 'noImage' | 'facingMode' | 'cameraResolution' | 'pan' | 'tilt' | 'zoom' | 'calculateFileSize' | 'torch'} prop\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Starts the video stream.\n *\n * @param {string} [videoInputId] - The video input device ID.\n * @returns Promise\n */\n async startVideoStream(videoInputId) {\n if (!CapturePhoto.isSupported() || this.#stream) {\n return;\n }\n\n this.setAttribute('loading', '');\n\n /** @type {ExtendedMediaTrackConstraints} */\n const constraints = {\n video: {\n facingMode: {\n ideal: this.facingMode\n },\n pan: true,\n tilt: true,\n zoom: true,\n torch: this.torch\n },\n audio: false\n };\n\n if (typeof videoInputId === 'string' && videoInputId.trim().length > 0) {\n constraints.video.deviceId = { exact: videoInputId };\n }\n\n if (typeof this.cameraResolution === 'string' && this.cameraResolution.trim().length > 0) {\n const [width = 0, height = 0] = this.cameraResolution.split('x').map(x => Number(x));\n\n if (width > 0 && height > 0) {\n constraints.video.width = width;\n constraints.video.height = height;\n }\n }\n\n try {\n this.#stream = await navigator.mediaDevices.getUserMedia(constraints);\n\n if (this.#videoElement) {\n this.#videoElement.srcObject = this.#stream;\n }\n\n this.#applyConstraint('pan', this.pan);\n this.#applyConstraint('tilt', this.tilt);\n this.#applyConstraint('zoom', this.zoom);\n } catch (error) {\n this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n })\n );\n } finally {\n this.removeAttribute('loading');\n }\n }\n\n /**\n * Restarts the video stream.\n *\n * @param {string} [videoInputId] - The video input device ID.\n */\n restartVideoStream(videoInputId) {\n if (this.#stream && this.#videoElement) {\n this.stopVideoStream();\n }\n\n this.startVideoStream(videoInputId);\n }\n\n /**\n * Stops the video stream.\n */\n stopVideoStream() {\n if (!this.#videoElement || !this.#stream) {\n return;\n }\n\n const [track] = this.#stream.getVideoTracks();\n\n track?.stop();\n this.#videoElement.srcObject = null;\n this.#stream = null;\n }\n\n /**\n * Captures a photo using the element's properties.\n *\n * @returns Promise\n */\n async capture() {\n if (this.loading || !this.#canvasElement || !this.#videoElement) {\n return;\n }\n\n try {\n const ctx = this.#canvasElement.getContext('2d');\n const width = this.#videoElement.videoWidth;\n const height = this.#videoElement.videoHeight;\n this.#canvasElement.width = width;\n this.#canvasElement.height = height;\n ctx?.drawImage(this.#videoElement, 0, 0, width, height);\n const dataURI = this.#canvasElement.toDataURL('image/png');\n\n if (typeof dataURI === 'string' && dataURI.includes('data:image')) {\n if (!this.noImage) {\n const image = new Image();\n image.src = dataURI;\n image.width = width;\n image.height = height;\n image.alt = 'Captured photo';\n image.setAttribute('part', 'output-image');\n this.#emptyOutputElement();\n this.#outputElement?.appendChild(image);\n }\n\n /** @type {{ dataURI: string, width: number, height: number, size?: number }} */\n const eventDetail = { dataURI, width, height };\n\n if (this.calculateFileSize) {\n try {\n const file = await fetch(dataURI);\n const blob = await file.blob();\n const size = blob.size;\n\n if (size) {\n eventDetail.size = size;\n }\n } catch {\n // Fail silently...\n }\n }\n\n this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}:success`, {\n bubbles: true,\n composed: true,\n detail: eventDetail\n })\n );\n }\n } catch (error) {\n this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}:error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n })\n );\n }\n }\n\n /**\n * Returns an object based on the `MediaTrackSupportedConstraints` dictionary,\n * whose member fields each specify one ofthe constrainable properties the user agent understands.\n *\n * @see https://developer.mozilla.org/docs/Web/API/MediaDevices/getSupportedConstraints\n * @returns {MediaTrackSupportedConstraints | {}}\n */\n getSupportedConstraints() {\n if (!CapturePhoto.isSupported()) {\n return {};\n }\n\n return navigator.mediaDevices.getSupportedConstraints() || {};\n }\n\n /**\n * Returns a `MediaTrackCapabilities` object which specifies the values or range of values\n * which each constrainable property, based upon the platform and user agent.\n *\n * @see https://developer.mozilla.org/docs/Web/API/MediaStreamTrack/getCapabilities\n * @returns {MediaTrackCapabilities | {}}\n */\n getTrackCapabilities() {\n if (!this.#stream) {\n return {};\n }\n\n const [track] = this.#stream.getVideoTracks();\n\n if (track && typeof track.getCapabilities === 'function') {\n return track.getCapabilities() || {};\n }\n\n return {};\n }\n\n /**\n * Returns a `MediaTrackSettings` object containing the current values of each of\n * the constrainable properties for the current MediaStreamTrack.\n *\n * @see https://developer.mozilla.org/docs/Web/API/MediaStreamTrack/getSettings\n * @returns {MediaTrackSettings | {}}\n */\n getTrackSettings() {\n if (!this.#stream) {\n return {};\n }\n\n const [track] = this.#stream.getVideoTracks();\n\n if (track && typeof track.getSettings === 'function') {\n return track.getSettings() || {};\n }\n\n return {};\n }\n\n /**\n * Returns the available video input devices.\n *\n * @returns {Promise}\n */\n static async getVideoInputDevices() {\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n return [];\n }\n\n const devices = (await navigator.mediaDevices.enumerateDevices()) || [];\n return devices.filter(device => device.kind === 'videoinput' && !!device.deviceId);\n }\n\n /**\n * Checks if the `MediaDevices.getUserMedia()` method is supported.\n *\n * @returns {boolean}\n */\n static isSupported() {\n return Boolean(navigator.mediaDevices?.getUserMedia);\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='capture-photo'] - The name of the custom element.\n * @example\n *\n * CapturePhoto.defineCustomElement('my-capture-photo');\n */\n static defineCustomElement(elementName = COMPONENT_NAME) {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, CapturePhoto);\n }\n }\n}\n\nexport { CapturePhoto };\n","import { CapturePhoto } from './capture-photo.js';\n\nCapturePhoto.defineCustomElement();\n\nexport { CapturePhoto };\n","/*!\n * @georapbox/web-share-element\n * A custom element that implements the Web Share API to share user-defined data.\n *\n * @version 3.1.1\n * @homepage https://github.com/georapbox/web-share-element#readme\n * @author George Raptis \n * @license MIT\n */\nfunction r(a){return a!==null&&typeof a==\"object\"?\"share\"in navigator&&\"canShare\"in navigator&&navigator.canShare(a):\"share\"in navigator}export{r as isWebShareSupported};\n//# sourceMappingURL=is-web-share-supported.js.map\n","// @ts-check\n\n/**\n * Check if Web Share API is supported by the platform.\n *\n * @param {import('./web-share').ShareData} [options]\n * @returns {boolean} Returns `true` if Web Share API is supported; otherwise `false`.\n */\nfunction isWebShareSupported(options) {\n if (options !== null && typeof options === 'object') {\n return 'share' in navigator && 'canShare' in navigator && navigator.canShare(options);\n }\n\n return 'share' in navigator;\n}\n\nexport { isWebShareSupported };\n","/*!\n * @georapbox/web-share-element\n * A custom element that implements the Web Share API to share user-defined data.\n *\n * @version 3.1.1\n * @homepage https://github.com/georapbox/web-share-element#readme\n * @author George Raptis \n * @license MIT\n */\nvar h=`\n :host {\n display: inline-block;\n }\n`,r=document.createElement(\"template\");r.innerHTML=`\n \n \n`;var s=class a extends HTMLElement{#e;#t;#r=[];constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\",delegatesFocus:!0}).appendChild(r.content.cloneNode(!0)),this.#e=this.shadowRoot?.querySelector('slot[name=\"button\"]')||null,this.#t=this.#h()}static get observedAttributes(){return[\"disabled\"]}attributeChangedCallback(t,e,i){t===\"disabled\"&&e!==i&&this.#t&&(this.#t.toggleAttribute(\"disabled\",this.disabled),this.#t.setAttribute(\"aria-disabled\",this.disabled.toString()),this.#t.part&&this.#t.part.contains(\"button\")&&this.#t.part.toggle(\"button--disabled\",this.disabled))}connectedCallback(){this.#s(\"shareUrl\"),this.#s(\"shareTitle\"),this.#s(\"shareText\"),this.#s(\"shareFiles\"),this.#s(\"disabled\"),this.#e?.addEventListener(\"slotchange\",this.#a),this.#t?.addEventListener(\"click\",this.#i)}disconnectedCallback(){this.#e?.removeEventListener(\"slotchange\",this.#a),this.#t?.removeEventListener(\"click\",this.#i)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){this.toggleAttribute(\"disabled\",!!t)}get shareUrl(){return this.getAttribute(\"share-url\")||\"\"}set shareUrl(t){this.setAttribute(\"share-url\",t)}get shareTitle(){return this.getAttribute(\"share-title\")||\"\"}set shareTitle(t){this.setAttribute(\"share-title\",t)}get shareText(){return this.getAttribute(\"share-text\")||\"\"}set shareText(t){this.setAttribute(\"share-text\",t)}get shareFiles(){return this.#r}set shareFiles(t){Array.isArray(t)&&t.length>0&&(this.#r=t)}async share(){if(!this.disabled)try{let t={};this.shareUrl&&(t.url=this.shareUrl),this.shareTitle&&(t.title=this.shareTitle),this.shareText&&(t.text=this.shareText),Array.isArray(this.shareFiles)&&this.shareFiles.length>0&&navigator.canShare&&navigator.canShare({files:this.shareFiles})&&(t.files=this.shareFiles),await navigator.share(t),this.dispatchEvent(new CustomEvent(\"web-share:success\",{bubbles:!0,composed:!0,detail:{shareData:t}}))}catch(t){if(t instanceof Error&&t.name===\"AbortError\"){this.dispatchEvent(new CustomEvent(\"web-share:abort\",{bubbles:!0,composed:!0,detail:{error:t}}));return}this.dispatchEvent(new CustomEvent(\"web-share:error\",{bubbles:!0,composed:!0,detail:{error:t}}))}}#i=t=>{t.preventDefault(),!this.disabled&&this.share()};#a=t=>{t.target&&t.target.name===\"button\"&&(this.#t?.removeEventListener(\"click\",this.#i),this.#t=this.#h(),this.#t&&(this.#t.addEventListener(\"click\",this.#i),this.#t.nodeName!==\"BUTTON\"&&!this.#t.hasAttribute(\"role\")&&this.#t.setAttribute(\"role\",\"button\")))};#h(){return this.#e&&this.#e.assignedElements({flatten:!0}).find(t=>t.nodeName===\"BUTTON\"||t.getAttribute(\"slot\")===\"button\")||null}#s(t){let e=this;if(Object.prototype.hasOwnProperty.call(e,t)){let i=e[t];delete e[t],e[t]=i}}static defineCustomElement(t=\"web-share\"){typeof window<\"u\"&&!window.customElements.get(t)&&window.customElements.define(t,a)}};s.defineCustomElement();export{s as WebShare};\n//# sourceMappingURL=web-share-defined.js.map\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\n/**\n * Represents the data to share.\n *\n * @typedef {Object} ShareData\n * @property {string} [url] - The URL to share.\n * @property {string} [title] - The title to share.\n * @property {string} [text] - The text to share.\n * @property {File[]} [files] - The files to share.\n */\n\nconst styles = /* css */ `\n :host {\n display: inline-block;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */ `\n \n \n`;\n\n/**\n * @summary A custom element that provides a button to share content.\n * @documentation https://github.com/georapbox/web-share-element#readme\n *\n * @tagname web-share - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {boolean} disabled - Indicates whether the button is disabled.\n * @property {string} shareUrl - The URL to share.\n * @property {string} shareTitle - The title to share.\n * @property {string} shareText - The text to share.\n * @property {File[]} shareFiles - The files to share.\n *\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {string} share-url - Reflects the shareUrl property.\n * @attribute {string} share-title - Reflects the shareTitle property.\n * @attribute {string} share-text - Reflects the shareText property.\n *\n * @slot button - The button to share content.\n * @slot button-content - The content of the button to share content.\n *\n * @csspart button - The button to share content.\n * @csspart button--disabled - The button to share content when disabled.\n *\n * @event web-share:success - Fired when the share operation is successful.\n * @event web-share:abort - Fired when the share operation is aborted.\n * @event web-share:error - Fired when the share operation fails.\n *\n * @method defineCustomElement - Static method. Defines the custom element with the given name.\n * @method share - Instance method. Shares the shareable data taken from the element's properties.\n */\nclass WebShare extends HTMLElement {\n /** @type {Nullable} */\n #buttonSlot;\n\n /** @type {Nullable} */\n #buttonEl;\n\n /** @type {File[]} */\n #files = [];\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#buttonSlot = this.shadowRoot?.querySelector('slot[name=\"button\"]') || null;\n this.#buttonEl = this.#getButton();\n }\n\n static get observedAttributes() {\n return ['disabled'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'disabled' && oldValue !== newValue && this.#buttonEl) {\n this.#buttonEl.toggleAttribute('disabled', this.disabled);\n this.#buttonEl.setAttribute('aria-disabled', this.disabled.toString());\n\n if (this.#buttonEl.part && this.#buttonEl.part.contains('button')) {\n this.#buttonEl.part.toggle('button--disabled', this.disabled);\n }\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('shareUrl');\n this.#upgradeProperty('shareTitle');\n this.#upgradeProperty('shareText');\n this.#upgradeProperty('shareFiles');\n this.#upgradeProperty('disabled');\n\n this.#buttonSlot?.addEventListener('slotchange', this.#handleSlotChange);\n this.#buttonEl?.addEventListener('click', this.#handleClick);\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#buttonSlot?.removeEventListener('slotchange', this.#handleSlotChange);\n this.#buttonEl?.removeEventListener('click', this.#handleClick);\n }\n\n /**\n * @type {boolean} - Indicates whether the button is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value) {\n this.toggleAttribute('disabled', !!value);\n }\n\n /**\n * @type {string} - The URL to share.\n * @attribute share-url - Reflects the shareUrl property.\n */\n get shareUrl() {\n return this.getAttribute('share-url') || '';\n }\n\n set shareUrl(value) {\n this.setAttribute('share-url', value);\n }\n\n /**\n * @type {string} - The title to share.\n * @attribute share-title - Reflects the shareTitle property.\n */\n get shareTitle() {\n return this.getAttribute('share-title') || '';\n }\n\n set shareTitle(value) {\n this.setAttribute('share-title', value);\n }\n\n /**\n * @type {string} - The text to share.\n * @attribute share-text - Reflects the shareText property.\n */\n get shareText() {\n return this.getAttribute('share-text') || '';\n }\n\n set shareText(value) {\n this.setAttribute('share-text', value);\n }\n\n /**\n * @type {File[]} - The files to share.\n */\n get shareFiles() {\n return this.#files;\n }\n\n set shareFiles(value) {\n if (Array.isArray(value) && value.length > 0) {\n this.#files = value;\n }\n }\n\n /**\n * Shares the shareable data taken from the element's properties.\n *\n * @returns {Promise} - A promise that resolves when the share operation is complete.\n */\n async share() {\n if (this.disabled) {\n return;\n }\n\n try {\n /** @type {ShareData} */\n const shareData = {};\n\n if (this.shareUrl) {\n shareData.url = this.shareUrl;\n }\n\n if (this.shareTitle) {\n shareData.title = this.shareTitle;\n }\n\n if (this.shareText) {\n shareData.text = this.shareText;\n }\n\n if (\n Array.isArray(this.shareFiles) &&\n this.shareFiles.length > 0 &&\n navigator.canShare &&\n navigator.canShare({ files: this.shareFiles })\n ) {\n shareData.files = this.shareFiles;\n }\n\n await navigator.share(shareData);\n\n this.dispatchEvent(\n new CustomEvent('web-share:success', {\n bubbles: true,\n composed: true,\n detail: { shareData }\n })\n );\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n this.dispatchEvent(\n new CustomEvent('web-share:abort', {\n bubbles: true,\n composed: true,\n detail: { error }\n })\n );\n\n return;\n }\n\n this.dispatchEvent(\n new CustomEvent('web-share:error', {\n bubbles: true,\n composed: true,\n detail: { error }\n })\n );\n }\n }\n\n /**\n * Handles the click event on the button.\n *\n * @param {any} evt - The event object.\n */\n #handleClick = evt => {\n evt.preventDefault();\n\n if (this.disabled) {\n return;\n }\n\n this.share();\n };\n\n /**\n * Handles the slotchange event on the button slot.\n *\n * @param {any} evt - The event object.\n */\n #handleSlotChange = evt => {\n if (evt.target && evt.target.name === 'button') {\n this.#buttonEl?.removeEventListener('click', this.#handleClick);\n this.#buttonEl = this.#getButton();\n\n if (this.#buttonEl) {\n this.#buttonEl.addEventListener('click', this.#handleClick);\n\n if (this.#buttonEl.nodeName !== 'BUTTON' && !this.#buttonEl.hasAttribute('role')) {\n this.#buttonEl.setAttribute('role', 'button');\n }\n }\n }\n };\n\n /**\n * Returns the button element from the button slot.\n *\n * @returns {Nullable} - The button element.\n */\n #getButton() {\n if (!this.#buttonSlot) {\n return null;\n }\n\n return (\n this.#buttonSlot.assignedElements({ flatten: true }).find(el => {\n return el.nodeName === 'BUTTON' || el.getAttribute('slot') === 'button';\n }) || null\n );\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'shareUrl' | 'shareTitle' | 'shareText' | 'shareFiles' | 'disabled'} prop - The property name to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='web-share'] - The name of the custom element.\n * @example\n *\n * ClipboardCopy.defineCustomElement('my-web-share');\n */\n static defineCustomElement(elementName = 'web-share') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, WebShare);\n }\n }\n}\n\nexport { WebShare };\n","import { WebShare } from './web-share.js';\n\nWebShare.defineCustomElement();\n\nexport { WebShare };\n","/*!\n * @georapbox/modal-element\n * A custom element to create a modal, using the native dialog element under the hood.\n *\n * @version 1.8.0\n * @homepage https://github.com/georapbox/modal-element#readme\n * @author George Raptis \n * @license MIT\n */\nvar n=document.createElement(\"template\"),r=`\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-color: canvastext;\n\n --me-header-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-header-color: initial;\n\n --me-body-spacing: 1rem;\n --me-body-background-color: transparent;\n --me-body-color: initial;\n --me-footer-background-color: transparent;\n --me-footer-color: initial;\n\n --me-close-padding: 0.4375rem;\n --me-close-border: none;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-close-color: inherit;\n --me-close-font-size: 1rem;\n\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n --dialog-placement-margin: calc((2em + 6px) / 2);\n\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n color: var(--me-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n /* Dialog placement */\n :host(:not([fullscreen])[placement=\"top-start\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-center\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-end\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center-start\"]) .dialog {\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center\"]) .dialog {\n margin: auto;\n }\n\n :host(:not([fullscreen])[placement=\"center-end\"]) .dialog {\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-start\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-center\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-end\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n /* Dialog animations */\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: 300ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n color: var(--me-header-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n color: var(--me-body-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: end;\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n color: var(--me-footer-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: var(--me-close-padding);\n border: var(--me-close-border);\n border-radius: var(--me-close-border-radius);\n background-color: var(--me-close-background-color);\n color: var(--me-close-color);\n font-size: var(--me-close-font-size);\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;n.innerHTML=`\n \n\n \n
\n
\n \n\n
\n \n
\n
\n\n \n\n
\n \n
\n
\n
\n`;var a=class s extends HTMLElement{#e=null;#i=null;#a=null;#o=void 0;constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\"}).appendChild(n.content.cloneNode(!0)),this.shadowRoot&&(this.#e=this.shadowRoot.querySelector(\"dialog\"),this.#i=this.shadowRoot.querySelector('slot[name=\"footer\"]'),this.#a=this.shadowRoot.querySelector('slot[name=\"close\"]'))}static get observedAttributes(){return[\"open\",\"no-header\",\"no-animations\",\"no-close-button\",\"close-label\"]}attributeChangedCallback(e,t,i){if(this.#e!==null){if(e===\"open\"&&t!==i&&(this.open?(this.#e.showModal(),this.dispatchEvent(new CustomEvent(\"me-open\",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow=\"hidden\")):this.#e.close()),e===\"no-header\"&&t!==i){let o=this.#e.querySelector(\".dialog__header\");o!==null&&(o.hidden=this.noHeader)}if(e===\"no-animations\"&&t!==i&&this.#e.classList.toggle(\"dialog--no-animations\",this.noAnimations),e===\"no-close-button\"&&t!==i){let o=this.#e.querySelector(\".dialog__close\");o!==null&&(o.hidden=this.noCloseButton)}e===\"close-label\"&&t!==i&&this.#r()}}connectedCallback(){this.#t(\"open\"),this.#t(\"staticBackdrop\"),this.#t(\"noHeader\"),this.#t(\"noAnimations\"),this.#t(\"noCloseButton\"),this.#t(\"fullscreen\"),this.#t(\"preserveOverflow\"),this.#t(\"placement\"),this.#t(\"closeLabel\"),this.#e?.addEventListener(\"click\",this.#h),this.#e?.addEventListener(\"close\",this.#l),this.#e?.addEventListener(\"cancel\",this.#d),this.#e?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\",this.#c),this.#i?.addEventListener(\"slotchange\",this.#m),this.#a?.addEventListener(\"slotchange\",this.#g)}disconnectedCallback(){this.#o&&clearTimeout(this.#o),this.#e?.addEventListener(\"click\",this.#h),this.#e?.removeEventListener(\"close\",this.#l),this.#e?.removeEventListener(\"cancel\",this.#d),this.#e?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\",this.#c),this.#i?.removeEventListener(\"slotchange\",this.#m),this.#a?.removeEventListener(\"slotchange\",this.#g)}get open(){return this.hasAttribute(\"open\")}set open(e){this.toggleAttribute(\"open\",!!e)}get staticBackdrop(){return this.hasAttribute(\"static-backdrop\")}set staticBackdrop(e){this.toggleAttribute(\"static-backdrop\",!!e)}get noHeader(){return this.hasAttribute(\"no-header\")}set noHeader(e){this.toggleAttribute(\"no-header\",!!e)}get noAnimations(){return this.hasAttribute(\"no-animations\")}set noAnimations(e){this.toggleAttribute(\"no-animations\",!!e)}get noCloseButton(){return this.hasAttribute(\"no-close-button\")}set noCloseButton(e){this.toggleAttribute(\"no-close-button\",!!e)}get fullscreen(){return this.hasAttribute(\"fullscreen\")}set fullscreen(e){this.toggleAttribute(\"fullscreen\",!!e)}get preserveOverflow(){return this.hasAttribute(\"preserve-overflow\")}set preserveOverflow(e){this.toggleAttribute(\"preserve-overflow\",!!e)}get placement(){return this.getAttribute(\"placement\")||\"center\"}set placement(e){this.setAttribute(\"placement\",e!=null?e.toString():e)}get closeLabel(){return this.getAttribute(\"close-label\")||\"Close\"}set closeLabel(e){this.setAttribute(\"close-label\",e!=null?e.toString():e)}#r(){if(this.#e===null)return;let e=this.#e.querySelector(\".dialog__close\");if(e===null)return;(this.#a?.assignedElements()||[])?.some(o=>o.textContent?.replace(/\\s/g,\"\")!==\"\")?e.removeAttribute(\"aria-label\"):e.setAttribute(\"aria-label\",this.closeLabel)}#n(){this.#o||(this.#e?.classList.add(\"dialog--pulse\"),this.#o=setTimeout(()=>{this.#e?.classList.remove(\"dialog--pulse\"),clearTimeout(this.#o),this.#o=void 0},300))}#l=()=>{this.open=!1,this.dispatchEvent(new CustomEvent(\"me-close\",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow=\"\")};#d=e=>{let t=this.#s(\"escape-key\");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),!this.noAnimations&&this.#n())};#c=e=>{let t=this.#s(\"close-button\");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),!this.noAnimations&&this.#n())};#h=e=>{let t=e.target,i=e.currentTarget;if(t===i){let o=this.#s(\"backdrop-click\");this.dispatchEvent(o),o.defaultPrevented||this.staticBackdrop?!this.noAnimations&&this.#n():this.hide()}if(t instanceof HTMLElement&&t.closest(\"[data-me-close]\")!==null){let o=this.#s(\"external-invoker\");this.dispatchEvent(o),o.defaultPrevented?!this.noAnimations&&this.#n():this.hide()}};#m=()=>{if(this.#e===null)return;let e=this.#e.querySelector(\".dialog__footer\");if(e===null)return;let t=this.#i?.assignedNodes(),i=t?t.length>0:!1;e.hidden=!i};#g=()=>{this.#r()};#s(e){return new CustomEvent(\"me-request-close\",{bubbles:!0,composed:!0,cancelable:!0,detail:{reason:e,element:this}})}#t(e){let t=this;if(Object.prototype.hasOwnProperty.call(t,e)){let i=t[e];delete t[e],t[e]=i}}show(){this.open||(this.open=!0)}hide(){this.open&&(this.open=!1)}static defineCustomElement(e=\"modal-element\"){typeof window<\"u\"&&!window.customElements.get(e)&&window.customElements.define(e,s)}};a.defineCustomElement();export{a as ModalElement};\n//# sourceMappingURL=modal-element-defined.js.map\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\n/**\n * Available values for the request close reason.\n *\n * @typedef {'close-button' | 'escape-key' | 'backdrop-click' | 'external-invoker'} CloseRequestReason\n */\n\nconst PULSE_ANIMATION_DURATION = 300; // milliseconds\nconst template = document.createElement('template');\n\nconst styles = /* css */ `\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-color: canvastext;\n\n --me-header-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-header-color: initial;\n\n --me-body-spacing: 1rem;\n --me-body-background-color: transparent;\n --me-body-color: initial;\n --me-footer-background-color: transparent;\n --me-footer-color: initial;\n\n --me-close-padding: 0.4375rem;\n --me-close-border: none;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-close-color: inherit;\n --me-close-font-size: 1rem;\n\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n --dialog-placement-margin: calc((2em + 6px) / 2);\n\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n color: var(--me-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n /* Dialog placement */\n :host(:not([fullscreen])[placement=\"top-start\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-center\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"top-end\"]) .dialog {\n margin-block-start: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center-start\"]) .dialog {\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"center\"]) .dialog {\n margin: auto;\n }\n\n :host(:not([fullscreen])[placement=\"center-end\"]) .dialog {\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-start\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-start: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-center\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n }\n\n :host(:not([fullscreen])[placement=\"bottom-end\"]) .dialog {\n margin-block-end: var(--dialog-placement-margin);\n margin-inline-end: var(--dialog-placement-margin);\n }\n\n /* Dialog animations */\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: ${PULSE_ANIMATION_DURATION}ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n color: var(--me-header-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n color: var(--me-body-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: end;\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n color: var(--me-footer-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: var(--me-close-padding);\n border: var(--me-close-border);\n border-radius: var(--me-close-border-radius);\n background-color: var(--me-close-background-color);\n color: var(--me-close-color);\n font-size: var(--me-close-font-size);\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n\ntemplate.innerHTML = /* html */ `\n \n\n \n
\n
\n \n\n
\n \n
\n
\n\n \n\n
\n \n
\n
\n
\n`;\n\n/**\n * @summary A custom element that renders a modal dialog.\n * @documentation https://github.com/georapbox/modal-element\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines whether the modal is open or not.\n * @property {boolean} staticBackdrop - Determines whether the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines whether the modal should have a header or not.\n * @property {boolean} noAnimations - Determines whether the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines whether the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines whether the modal should be fullscreen or not.\n * @property {boolean} preserveOverflow - Determines whether the overflow of the body should be preserved when the modal is open.\n * @property {string} placement - Determines the placement of the modal.\n * @property {string} closeLabel - The label of the default close button, used as the aria-label attribute of the close button.\n *\n * @attribute {boolean} open - Reflects the open property.\n * @attribute {boolean} static-backdrop - Reflects the staticBackdrop property.\n * @attribute {boolean} no-header - Reflects the noHeader property.\n * @attribute {boolean} no-animations - Reflects the noAnimations property.\n * @attribute {boolean} no-close-button - Reflects the noCloseButton property.\n * @attribute {boolean} fullscreen - Reflects the fullscreen property.\n * @attribute {boolean} preserve-overflow - Reflects the preserveOverflow property.\n * @attribute {string} placement - Reflects the placement property.\n * @attribute {string} close-label - Reflects the closeLabel property.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal.\n * @cssproperty --me-height - The height of the modal.\n * @cssproperty --me-border-color - The border color of the modal.\n * @cssproperty --me-border-style - The border style of the modal.\n * @cssproperty --me-border-width - The border width of the modal.\n * @cssproperty --me-border-radius - The border radius of the modal.\n * @cssproperty --me-box-shadow - The box shadow of the modal.\n * @cssproperty --me-background-color - The background color of the modal.\n * @cssproperty --me-color - The foreground color of the modal.\n * @cssproperty --me-header-spacing - The spacing of the header.\n * @cssproperty --me-header-background-color - The background color of the header.\n * @cssproperty --me-header-color - The foreground color of the header.\n * @cssproperty --me-body-spacing - The spacing of the body.\n * @cssproperty --me-body-background-color - The background color of the body.\n * @cssproperty --me-body-color - The foreground color of the body.\n * @cssproperty --me-footer-spacing - The spacing of the footer.\n * @cssproperty --me-footer-background-color - The background color of the footer.\n * @cssproperty --me-footer-color - The foreground color of the footer.\n * @cssproperty --me-close-padding - The padding of the close button.\n * @cssproperty --me-close-border - The border shorthand property of the close button.\n * @cssproperty --me-close-border-radius - The border radius shorthand property of the close button.\n * @cssproperty --me-close-background-color - The background color of the close button.\n * @cssproperty --me-close-color - The foreground color of the close button.\n * @cssproperty --me-close-font-size - The font size of the close button.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop.\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart close - The default close button rendered in the modal's header.\n * @csspart close-icon - The close icon of the default close button.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n */\nclass ModalElement extends HTMLElement {\n /** @type {Nullable} */\n #dialogEl = null;\n\n /** @type {Nullable} */\n #footerSlotEl = null;\n\n /** @type {Nullable} */\n #closeSlotEl = null;\n\n /** @type {ReturnType | undefined} */\n #pulseAnimationTimeout = void 0;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n if (this.shadowRoot) {\n this.#dialogEl = this.shadowRoot.querySelector('dialog');\n this.#footerSlotEl = this.shadowRoot.querySelector('slot[name=\"footer\"]');\n this.#closeSlotEl = this.shadowRoot.querySelector('slot[name=\"close\"]');\n }\n }\n\n static get observedAttributes() {\n return ['open', 'no-header', 'no-animations', 'no-close-button', 'close-label'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (this.#dialogEl === null) {\n return;\n }\n\n if (name === 'open' && oldValue !== newValue) {\n if (this.open) {\n this.#dialogEl.showModal();\n\n this.dispatchEvent(\n new CustomEvent('me-open', {\n bubbles: true,\n composed: true,\n detail: { element: this }\n })\n );\n\n if (document.body && !this.preserveOverflow) {\n document.body.style.overflow = 'hidden';\n }\n } else {\n this.#dialogEl.close();\n }\n }\n\n if (name === 'no-header' && oldValue !== newValue) {\n /** @type {Nullable} */\n const headerEl = this.#dialogEl.querySelector('.dialog__header');\n\n if (headerEl !== null) {\n headerEl.hidden = this.noHeader;\n }\n }\n\n if (name === 'no-animations' && oldValue !== newValue) {\n this.#dialogEl.classList.toggle('dialog--no-animations', this.noAnimations);\n }\n\n if (name === 'no-close-button' && oldValue !== newValue) {\n /** @type {Nullable} */\n const closeBtnEl = this.#dialogEl.querySelector('.dialog__close');\n\n if (closeBtnEl !== null) {\n closeBtnEl.hidden = this.noCloseButton;\n }\n }\n\n if (name === 'close-label' && oldValue !== newValue) {\n this.#updateCloseLabel();\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('open');\n this.#upgradeProperty('staticBackdrop');\n this.#upgradeProperty('noHeader');\n this.#upgradeProperty('noAnimations');\n this.#upgradeProperty('noCloseButton');\n this.#upgradeProperty('fullscreen');\n this.#upgradeProperty('preserveOverflow');\n this.#upgradeProperty('placement');\n this.#upgradeProperty('closeLabel');\n\n this.#dialogEl?.addEventListener('click', this.#handleDialogClick);\n this.#dialogEl?.addEventListener('close', this.#handleDialogClose);\n this.#dialogEl?.addEventListener('cancel', this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.addEventListener('submit', this.#handleCloseButtonClick);\n this.#footerSlotEl?.addEventListener('slotchange', this.#handleFooterSlotChange);\n this.#closeSlotEl?.addEventListener('slotchange', this.#handleCloseSlotChange);\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#pulseAnimationTimeout && clearTimeout(this.#pulseAnimationTimeout);\n this.#dialogEl?.addEventListener('click', this.#handleDialogClick);\n this.#dialogEl?.removeEventListener('close', this.#handleDialogClose);\n this.#dialogEl?.removeEventListener('cancel', this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.removeEventListener('submit', this.#handleCloseButtonClick);\n this.#footerSlotEl?.removeEventListener('slotchange', this.#handleFooterSlotChange);\n this.#closeSlotEl?.removeEventListener('slotchange', this.#handleCloseSlotChange);\n }\n\n /**\n * Deternimes if the modal is open or not.\n *\n * @type {boolean} - True if the modal is open, otherwise false.\n * @default false\n * @attribute open - Reflects the open property.\n */\n get open() {\n return this.hasAttribute('open');\n }\n\n set open(value) {\n this.toggleAttribute('open', !!value);\n }\n\n /**\n * Determines whether the modal should close when the backdrop is clicked.\n *\n * @type {boolean} - True if the modal should close when the backdrop is clicked, otherwise false.\n * @default false\n * @attribute static-backdrop - Reflects the staticBackdrop property.\n */\n get staticBackdrop() {\n return this.hasAttribute('static-backdrop');\n }\n\n set staticBackdrop(value) {\n this.toggleAttribute('static-backdrop', !!value);\n }\n\n /**\n * Determines whether the modal should have a header or not.\n *\n * @type {boolean} - True if the modal should have a header, otherwise false.\n * @default false\n * @attribute no-header - Reflects the noHeader property.\n */\n get noHeader() {\n return this.hasAttribute('no-header');\n }\n\n set noHeader(value) {\n this.toggleAttribute('no-header', !!value);\n }\n\n /**\n * Determines whether the modal should have animations or not when opening and closing.\n *\n * @type {boolean} - True if the modal should have animations, otherwise false.\n * @default false\n * @attribute no-animations - Reflects the noAnimations property.\n */\n get noAnimations() {\n return this.hasAttribute('no-animations');\n }\n\n set noAnimations(value) {\n this.toggleAttribute('no-animations', !!value);\n }\n\n /**\n * Determines whether the modal should have a default close button or not.\n *\n * @type {boolean} - True if the modal should have a close button, otherwise false.\n * @default false\n * @attribute no-close-button - Reflects the noCloseButton property.\n */\n get noCloseButton() {\n return this.hasAttribute('no-close-button');\n }\n\n set noCloseButton(value) {\n this.toggleAttribute('no-close-button', !!value);\n }\n\n /**\n * Determines whether the modal should be fullscreen or not.\n *\n * @type {boolean} - True if the modal should be fullscreen, otherwise false.\n * @default false\n * @attribute fullscreen - Reflects the fullscreen property.\n */\n get fullscreen() {\n return this.hasAttribute('fullscreen');\n }\n\n set fullscreen(value) {\n this.toggleAttribute('fullscreen', !!value);\n }\n\n /**\n * Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @type {boolean} - True if the overflow of the body should be preserved, otherwise false.\n * @default false\n * @attribute preserve-overflow - Reflects the preserveOverflow property.\n */\n get preserveOverflow() {\n return this.hasAttribute('preserve-overflow');\n }\n\n set preserveOverflow(value) {\n this.toggleAttribute('preserve-overflow', !!value);\n }\n\n /**\n * Determines the placement of the modal.\n * Possible values are 'top-start', 'top-center', 'top-end', 'center-start', 'center', 'center-end', 'bottom-start', 'bottom-center', 'bottom-end'.\n *\n * @type {string}\n * @default 'center'\n * @attribute placement - Reflects the placement property.\n */\n get placement() {\n return this.getAttribute('placement') || 'center';\n }\n\n set placement(value) {\n this.setAttribute('placement', value != null ? value.toString() : value);\n }\n\n /**\n * The label of the default close button, used as the aria-label attribute of the close button.\n * If user provides text content for the close button using the `close` slot, this property is ignored and the aria-label attribute is removed.\n *\n * @type {string}\n * @default 'Close'\n * @attribute close-label - Reflects the closeLabel property.\n */\n get closeLabel() {\n return this.getAttribute('close-label') || 'Close';\n }\n\n set closeLabel(value) {\n this.setAttribute('close-label', value != null ? value.toString() : value);\n }\n\n /**\n * Updates the aria-label attribute of the close button.\n * If the slot for the close button has text content, the aria-label attribute is removed to allow the text content to be used as the label.\n * Otherwise, the aria-label attribute is set to the `closeLabel` property.\n *\n * @returns\n */\n #updateCloseLabel() {\n if (this.#dialogEl === null) {\n return;\n }\n\n const closeButtonEl = this.#dialogEl.querySelector('.dialog__close');\n\n if (closeButtonEl === null) {\n return;\n }\n\n const assignedElements = this.#closeSlotEl?.assignedElements() || [];\n const hasTextContent = assignedElements?.some(el => el.textContent?.replace(/\\s/g, '') !== '');\n\n hasTextContent\n ? closeButtonEl.removeAttribute('aria-label')\n : closeButtonEl.setAttribute('aria-label', this.closeLabel);\n }\n\n /**\n * Applies a pulse effect on the dialog.\n */\n #applyPulseEffectOnDialog() {\n if (this.#pulseAnimationTimeout) {\n return;\n }\n\n this.#dialogEl?.classList.add('dialog--pulse');\n\n this.#pulseAnimationTimeout = setTimeout(() => {\n this.#dialogEl?.classList.remove('dialog--pulse');\n clearTimeout(this.#pulseAnimationTimeout);\n this.#pulseAnimationTimeout = void 0;\n }, PULSE_ANIMATION_DURATION);\n }\n\n /**\n * Handles the close event of the dialog.\n */\n #handleDialogClose = () => {\n // This is required because the dialog element does not reset\n // the open property when the dialog is closed by the user.\n this.open = false;\n\n this.dispatchEvent(\n new CustomEvent('me-close', {\n bubbles: true,\n composed: true,\n detail: { element: this }\n })\n );\n\n if (document.body && !this.preserveOverflow) {\n document.body.style.overflow = '';\n }\n };\n\n /**\n * Handles the cancel event of the dialog.\n * This event is fired when the user presses the escape key.\n *\n * @param {Event} evt - The cancel event.\n */\n #handleDialogCancel = evt => {\n const requestCloseEvent = this.#createRequestCloseEvent('escape-key');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n\n /**\n * Handles the click event of the close button.\n *\n * @param {Event} evt - The click event.\n */\n #handleCloseButtonClick = evt => {\n const requestCloseEvent = this.#createRequestCloseEvent('close-button');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n\n /**\n * Handles the click event of the dialog.\n *\n * @param {MouseEvent} evt - The click event.\n */\n #handleDialogClick = evt => {\n const target = evt.target;\n const currentTarget = evt.currentTarget;\n\n // Close the dialog when the backdrop is clicked.\n if (target === currentTarget) {\n const requestCloseEvent = this.#createRequestCloseEvent('backdrop-click');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented || this.staticBackdrop) {\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n } else {\n this.hide();\n }\n }\n\n // Close the dialog when external invoker is clicked.\n if (target instanceof HTMLElement && target.closest('[data-me-close]') !== null) {\n const requestCloseEvent = this.#createRequestCloseEvent('external-invoker');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented) {\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n } else {\n this.hide();\n }\n }\n };\n\n /**\n * Handles the slotchange event of the footer slot.\n */\n #handleFooterSlotChange = () => {\n if (this.#dialogEl === null) {\n return;\n }\n\n /** @type {Nullable} */\n const footerEl = this.#dialogEl.querySelector('.dialog__footer');\n\n if (footerEl === null) {\n return;\n }\n\n const footerSlotNodes = this.#footerSlotEl?.assignedNodes();\n const hasFooterSlotNodes = footerSlotNodes ? footerSlotNodes.length > 0 : false;\n\n footerEl.hidden = !hasFooterSlotNodes;\n };\n\n /**\n * Handles the slotchange event of the close slot.\n */\n #handleCloseSlotChange = () => {\n this.#updateCloseLabel();\n };\n\n /**\n * Creates a request close event.\n *\n * @param {CloseRequestReason} reason - The reason that the modal is about to close.\n */\n #createRequestCloseEvent(reason) {\n return new CustomEvent('me-request-close', {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: {\n reason,\n element: this\n }\n });\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'open' | 'staticBackdrop' | 'noHeader' | 'noAnimations' | 'noCloseButton' | 'fullscreen' | 'preserveOverflow' | 'placement' | 'closeLabel'} prop - The property to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Opens the modal if it is closed, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.show();\n */\n show() {\n if (this.open) {\n return;\n }\n\n this.open = true;\n }\n\n /**\n * Closes the modal if it is open, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.hide();\n */\n hide() {\n if (!this.open) {\n return;\n }\n\n this.open = false;\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='modal-element']\n * @example\n * ModalElement.defineCustomElement('my-modal');\n */\n static defineCustomElement(elementName = 'modal-element') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, ModalElement);\n }\n }\n}\n\nexport { ModalElement };\n","import { ModalElement } from './modal-element.js';\n\nModalElement.defineCustomElement();\n\nexport { ModalElement };\n","/*!\n * @georapbox/files-dropzone-element\n * A custom element that creates a drag and drop zone for files\n *\n * @version 2.0.1\n * @homepage https://github.com/georapbox/files-dropzone-element#readme\n * @author George Raptis \n * @license MIT\n */\nfunction u(o,e=\"\"){if(!e)return!0;let t=[...new Set(e.split(\",\").map(r=>r.trim()).filter(Boolean))],i=o.type,s=i.replace(/\\/.*$/,\"\");for(let r of t)if(r.charAt(0)===\".\"){if(o.name.toLowerCase().indexOf(r.toLowerCase(),o.name.length-r.length)!==-1)return!0}else if(/\\/\\*$/.test(r)){if(s===r.replace(/\\/.*$/,\"\"))return!0}else if(i===r)return!0;return!1}var x=new Map([[\"aac\",\"audio/aac\"],[\"abw\",\"application/x-abiword\"],[\"arc\",\"application/x-freearc\"],[\"avif\",\"image/avif\"],[\"avi\",\"video/x-msvideo\"],[\"azw\",\"application/vnd.amazon.ebook\"],[\"bin\",\"application/octet-stream\"],[\"bmp\",\"image/bmp\"],[\"bz\",\"application/x-bzip\"],[\"bz2\",\"application/x-bzip2\"],[\"cda\",\"application/x-cdf\"],[\"csh\",\"application/x-csh\"],[\"css\",\"text/css\"],[\"csv\",\"text/csv\"],[\"doc\",\"application/msword\"],[\"docx\",\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"],[\"eot\",\"application/vnd.ms-fontobject\"],[\"epub\",\"application/epub+zip\"],[\"gz\",\"application/gzip\"],[\"gif\",\"image/gif\"],[\"heic\",\"image/heic\"],[\"heif\",\"image/heif\"],[\"htm\",\"text/html\"],[\"html\",\"text/html\"],[\"ico\",\"image/vnd.microsoft.icon\"],[\"ics\",\"text/calendar\"],[\"jar\",\"application/java-archive\"],[\"jpeg\",\"image/jpeg\"],[\"jpg\",\"image/jpeg\"],[\"jxl\",\"image/jxl\"],[\"js\",\"text/javascript\"],[\"json\",\"application/json\"],[\"jsonld\",\"application/ld+json\"],[\"markdown\",\"text/markdown\"],[\"md\",\"text/markdown\"],[\"mid\",\"audio/midi\"],[\"midi\",\"audio/midi\"],[\"mjs\",\"text/javascript\"],[\"mp3\",\"audio/mpeg\"],[\"mp4\",\"video/mp4\"],[\"mpeg\",\"video/mpeg\"],[\"mpkg\",\"application/vnd.apple.installer+xml\"],[\"odp\",\"application/vnd.oasis.opendocument.presentation\"],[\"ods\",\"application/vnd.oasis.opendocument.spreadsheet\"],[\"odt\",\"application/vnd.oasis.opendocument.text\"],[\"oga\",\"audio/ogg\"],[\"ogv\",\"video/ogg\"],[\"ogx\",\"application/ogg\"],[\"opus\",\"audio/opus\"],[\"otf\",\"font/otf\"],[\"png\",\"image/png\"],[\"pdf\",\"application/pdf\"],[\"php\",\"application/x-httpd-php\"],[\"ppt\",\"application/vnd.ms-powerpoint\"],[\"pptx\",\"application/vnd.openxmlformats-officedocument.presentationml.presentation\"],[\"rar\",\"application/vnd.rar\"],[\"rtf\",\"application/rtf\"],[\"sh\",\"application/x-sh\"],[\"svg\",\"image/svg+xml\"],[\"swf\",\"application/x-shockwave-flash\"],[\"tar\",\"application/x-tar\"],[\"tif\",\"image/tiff\"],[\"tiff\",\"image/tiff\"],[\"ts\",\"video/mp2t\"],[\"ttf\",\"font/ttf\"],[\"txt\",\"text/plain\"],[\"vsd\",\"application/vnd.visio\"],[\"wav\",\"audio/wav\"],[\"weba\",\"audio/webm\"],[\"webm\",\"video/webm\"],[\"webp\",\"image/webp\"],[\"woff\",\"font/woff\"],[\"woff2\",\"font/woff2\"],[\"xhtml\",\"application/xhtml+xml\"],[\"xls\",\"application/vnd.ms-excel\"],[\"xlsx\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"],[\"xml\",\"application/xml\"],[\"xul\",\"application/vnd.mozilla.xul+xml\"],[\"zip\",\"application/zip\"],[\"7z\",\"application/x-7z-compressed\"],[\"mkv\",\"video/x-matroska\"],[\"mov\",\"video/quicktime\"],[\"msg\",\"application/vnd.ms-outlook\"]]),b=[\".DS_Store\",\"Thumbs.db\"],y=o=>{let{name:e}=o;if(e&&e.lastIndexOf(\".\")!==-1&&!o.type){let i=(e.split(\".\").pop()||\"\").toLowerCase(),s=x.get(i);s&&Object.defineProperty(o,\"type\",{value:s,writable:!1,configurable:!1,enumerable:!0})}return o},g=(o,e)=>{let t=y(o);if(typeof t.path!=\"string\"){let{webkitRelativePath:i}=o;Object.defineProperty(t,\"path\",{value:typeof e==\"string\"?e:i||o.name,writable:!1,configurable:!1,enumerable:!0})}return t},m=async o=>await new Promise((e,t)=>{o.readEntries(e,t)}),w=async o=>{let e=[],t=await m(o);for(;t.length>0;)e.push(...t),t=await m(o);return e},E=o=>new Promise((e,t)=>{o.file(i=>e(g(i,o.fullPath)),t)}),F=async o=>{let e=[],t=[];for(let i of o){if(i.kind!==\"file\")continue;let s=i.getAsEntry?i.getAsEntry():i.webkitGetAsEntry();t.push(s)}for(;t.length>0;){let i=t.shift();if(i)if(i.isFile){let s=await E(i);b.indexOf(s.name)===-1&&e.push(s)}else i.isDirectory&&t.push(...await w(i.createReader()));else continue}return e},f=async o=>{let e=[];for(let t of o)b.indexOf(t.name)===-1&&e.push(g(t));return e},l=async o=>o.dataTransfer?o.dataTransfer.items?await F(o.dataTransfer.items):await f(o.dataTransfer.files):await f(o.target.files);var n=\"files-dropzone\",v=\"TOO_MANY_FILES\",L=\"FILE_TOO_LARGE\",k=\"FILE_TOO_SMALL\",A=\"INVALID_MIME_TYPE\",z=document.createElement(\"template\"),S=`\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;z.innerHTML=`\n \n\n \n\n
\n Drag 'n' drop files here, or click to select files\n
\n`;var d=class o extends HTMLElement{#t=null;#e=null;constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\",delegatesFocus:!0}).appendChild(z.content.cloneNode(!0)),this.shadowRoot&&(this.#t=this.shadowRoot.getElementById(\"file-input\"),this.#e=this.shadowRoot.getElementById(\"dropzone\"))}static get observedAttributes(){return[\"accept\",\"disabled\",\"multiple\"]}attributeChangedCallback(e,t,i){e===\"accept\"&&t!==i&&this.#t&&(this.#t.accept=this.accept),e===\"disabled\"&&t!==i&&this.#t&&(this.#t.disabled=this.disabled,this.disabled?(this.#e?.removeAttribute(\"tabindex\"),this.#e?.setAttribute(\"aria-disabled\",\"true\")):(this.#e?.setAttribute(\"tabindex\",\"0\"),this.#e?.setAttribute(\"aria-disabled\",\"false\"))),e===\"multiple\"&&t!==i&&this.#t&&(this.#t.multiple=this.multiple)}connectedCallback(){this.#o(\"accept\"),this.#o(\"disabled\"),this.#o(\"maxFiles\"),this.#o(\"maxSize\"),this.#o(\"minSize\"),this.#o(\"multiple\"),this.#o(\"autoFocus\"),this.#o(\"noStyle\"),this.#t?.addEventListener(\"change\",this.#i),this.#e?.addEventListener(\"dragenter\",this.#r),this.#e?.addEventListener(\"dragover\",this.#s),this.#e?.addEventListener(\"dragleave\",this.#n),this.#e?.addEventListener(\"drop\",this.#a),this.#e?.addEventListener(\"click\",this.#d),this.#e?.addEventListener(\"keyup\",this.#l),this.autoFocus&&this.#e?.focus()}disconnectedCallback(){this.#t?.removeEventListener(\"change\",this.#i),this.#e?.removeEventListener(\"dragenter\",this.#r),this.#e?.removeEventListener(\"dragover\",this.#s),this.#e?.removeEventListener(\"dragleave\",this.#n),this.#e?.removeEventListener(\"drop\",this.#a),this.#e?.removeEventListener(\"click\",this.#d),this.#e?.removeEventListener(\"keyup\",this.#l)}get accept(){return this.getAttribute(\"accept\")||\"\"}set accept(e){this.setAttribute(\"accept\",e!=null?e.toString():e)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(e){this.toggleAttribute(\"disabled\",!!e)}get maxFiles(){let e=Number(this.getAttribute(\"max-files\"))||0;return e<=0?1/0:Math.floor(Math.abs(e))}set maxFiles(e){this.setAttribute(\"max-files\",e!=null?e.toString():e)}get maxSize(){let e=this.getAttribute(\"max-size\");if(e===null)return 1/0;let t=Number(e);return Number.isNaN(t)?1/0:t}set maxSize(e){this.setAttribute(\"max-size\",e!=null?e.toString():e)}get minSize(){let e=this.getAttribute(\"min-size\");if(e===null)return 0;let t=Number(e);return Number.isNaN(t)?0:t}set minSize(e){this.setAttribute(\"min-size\",e!=null?e.toString():e)}get multiple(){return this.hasAttribute(\"multiple\")}set multiple(e){this.toggleAttribute(\"multiple\",!!e)}get autoFocus(){return this.hasAttribute(\"auto-focus\")}set autoFocus(e){this.toggleAttribute(\"auto-focus\",!!e)}get noStyle(){return this.hasAttribute(\"no-style\")}set noStyle(e){this.toggleAttribute(\"no-style\",!!e)}#i=async e=>{try{this.#c(await l(e))}catch(t){this.dispatchEvent(new CustomEvent(`${n}-error`,{bubbles:!0,composed:!0,detail:{error:t}}))}};#r=()=>{this.disabled||this.dispatchEvent(new Event(`${n}-dragenter`,{bubbles:!0,composed:!0}))};#s=e=>{if(e.preventDefault(),this.disabled){e.dataTransfer.dropEffect=\"none\";return}e.dataTransfer.dropEffect=\"copy\",this.#e&&(this.#e.classList.add(\"dropzone--dragover\"),this.#e.part.add(\"dropzone--dragover\")),this.dispatchEvent(new Event(`${n}-dragover`,{bubbles:!0,composed:!0}))};#n=()=>{this.disabled||(this.#e&&(this.#e.classList.remove(\"dropzone--dragover\"),this.#e.part.remove(\"dropzone--dragover\")),this.dispatchEvent(new Event(`${n}-dragleave`,{bubbles:!0,composed:!0})))};#a=async e=>{if(!this.disabled){e.preventDefault(),this.#e&&(this.#e.classList.remove(\"dropzone--dragover\"),this.#e.part.remove(\"dropzone--dragover\"));try{this.#c(await l(e))}catch(t){this.dispatchEvent(new CustomEvent(`${n}-error`,{bubbles:!0,composed:!0,detail:{error:t}}))}}};#d=()=>{this.disabled||this.#t?.click()};#l=e=>{this.disabled||(e.key===\" \"||e.key===\"Enter\")&&this.#t?.click()};#c(e){if(!Array.isArray(e)||!e.length)return;let t=[],i=[],s=e.length;if(!this.multiple&&s>1)for(let r of e)i.push({file:r,errors:[{code:v,message:\"Too many files selected. Only 1 file is allowed.\"}]});else if(this.multiple&&s>this.maxFiles)for(let r of e)i.push({file:r,errors:[{code:v,message:`Too many files selected. Only ${this.maxFiles} ${this.maxFiles>1?\"files are\":\"file is\"} allowed.`}]});else for(let r of e){let c=u(r,this.accept),p=r.size>this.maxSize,h=r.size0&&this.dispatchEvent(new CustomEvent(`${n}-drop-accepted`,{bubbles:!0,composed:!0,detail:{acceptedFiles:t}})),i.length>0&&this.dispatchEvent(new CustomEvent(`${n}-drop-rejected`,{bubbles:!0,composed:!0,detail:{rejectedFiles:i}})),this.#t&&(this.#t.value=this.#t.defaultValue)}openFileDialog(){this.disabled||this.#t?.click()}#o(e){let t=this;if(Object.prototype.hasOwnProperty.call(t,e)){let i=t[e];delete t[e],t[e]=i}}static defineCustomElement(e=n){typeof window<\"u\"&&!window.customElements.get(e)&&window.customElements.define(e,o)}};d.defineCustomElement();export{d as FilesDropzone};\n//# sourceMappingURL=files-dropzone-defined.js.map\n","// @ts-check\n\n/**\n * Checks if a file is valid based on the accepted file type specifiers.\n *\n * @param {File} file - The File object to validate.\n * @param {string} [acceptedTypeSpecifiers=''] - The accepted file type specifiers.\n * @returns {boolean} - True if the file is valid, false otherwise.\n */\nexport function isValidFile(file, acceptedTypeSpecifiers = '') {\n if (!acceptedTypeSpecifiers) {\n return true;\n }\n\n const acceptedMimeTypesList = [\n ...new Set(\n acceptedTypeSpecifiers\n .split(',')\n .map(v => v.trim())\n .filter(Boolean)\n )\n ];\n\n const fileMimeType = file.type;\n const baseMimeType = fileMimeType.replace(/\\/.*$/, '');\n\n for (const validType of acceptedMimeTypesList) {\n if (validType.charAt(0) === '.') {\n if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) {\n return true;\n }\n } else if (/\\/\\*$/.test(validType)) {\n // Check for mime type that looks like \"image/*\" or similar.\n if (baseMimeType === validType.replace(/\\/.*$/, '')) {\n return true;\n }\n } else {\n if (fileMimeType === validType) {\n return true;\n }\n }\n }\n\n return false;\n}\n","// @ts-check\n\n/**\n * A map of common file extensions and their associated MIME types.\n */\nconst COMMON_MIME_TYPES = new Map([\n // https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types\n ['aac', 'audio/aac'],\n ['abw', 'application/x-abiword'],\n ['arc', 'application/x-freearc'],\n ['avif', 'image/avif'],\n ['avi', 'video/x-msvideo'],\n ['azw', 'application/vnd.amazon.ebook'],\n ['bin', 'application/octet-stream'],\n ['bmp', 'image/bmp'],\n ['bz', 'application/x-bzip'],\n ['bz2', 'application/x-bzip2'],\n ['cda', 'application/x-cdf'],\n ['csh', 'application/x-csh'],\n ['css', 'text/css'],\n ['csv', 'text/csv'],\n ['doc', 'application/msword'],\n ['docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n ['eot', 'application/vnd.ms-fontobject'],\n ['epub', 'application/epub+zip'],\n ['gz', 'application/gzip'],\n ['gif', 'image/gif'],\n ['heic', 'image/heic'],\n ['heif', 'image/heif'],\n ['htm', 'text/html'],\n ['html', 'text/html'],\n ['ico', 'image/vnd.microsoft.icon'],\n ['ics', 'text/calendar'],\n ['jar', 'application/java-archive'],\n ['jpeg', 'image/jpeg'],\n ['jpg', 'image/jpeg'],\n ['jxl', 'image/jxl'],\n ['js', 'text/javascript'],\n ['json', 'application/json'],\n ['jsonld', 'application/ld+json'],\n ['markdown', 'text/markdown'],\n ['md', 'text/markdown'],\n ['mid', 'audio/midi'],\n ['midi', 'audio/midi'],\n ['mjs', 'text/javascript'],\n ['mp3', 'audio/mpeg'],\n ['mp4', 'video/mp4'],\n ['mpeg', 'video/mpeg'],\n ['mpkg', 'application/vnd.apple.installer+xml'],\n ['odp', 'application/vnd.oasis.opendocument.presentation'],\n ['ods', 'application/vnd.oasis.opendocument.spreadsheet'],\n ['odt', 'application/vnd.oasis.opendocument.text'],\n ['oga', 'audio/ogg'],\n ['ogv', 'video/ogg'],\n ['ogx', 'application/ogg'],\n ['opus', 'audio/opus'],\n ['otf', 'font/otf'],\n ['png', 'image/png'],\n ['pdf', 'application/pdf'],\n ['php', 'application/x-httpd-php'],\n ['ppt', 'application/vnd.ms-powerpoint'],\n ['pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],\n ['rar', 'application/vnd.rar'],\n ['rtf', 'application/rtf'],\n ['sh', 'application/x-sh'],\n ['svg', 'image/svg+xml'],\n ['swf', 'application/x-shockwave-flash'],\n ['tar', 'application/x-tar'],\n ['tif', 'image/tiff'],\n ['tiff', 'image/tiff'],\n ['ts', 'video/mp2t'],\n ['ttf', 'font/ttf'],\n ['txt', 'text/plain'],\n ['vsd', 'application/vnd.visio'],\n ['wav', 'audio/wav'],\n ['weba', 'audio/webm'],\n ['webm', 'video/webm'],\n ['webp', 'image/webp'],\n ['woff', 'font/woff'],\n ['woff2', 'font/woff2'],\n ['xhtml', 'application/xhtml+xml'],\n ['xls', 'application/vnd.ms-excel'],\n ['xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],\n ['xml', 'application/xml'],\n ['xul', 'application/vnd.mozilla.xul+xml'],\n ['zip', 'application/zip'],\n ['7z', 'application/x-7z-compressed'],\n\n // Others\n ['mkv', 'video/x-matroska'],\n ['mov', 'video/quicktime'],\n ['msg', 'application/vnd.ms-outlook']\n]);\n\nconst FILES_TO_IGNORE = [\n // Thumbnail cache files for macOS and Windows\n '.DS_Store', // macOs\n 'Thumbs.db' // Windows\n];\n\n/**\n * Adds a `type` property to the file object if it doesn't have one and the file has an extension.\n * This is needed because Firefox doesn't add a type property to files dragged from the desktop.\n * @bug https://bugzilla.mozilla.org/show_bug.cgi?id=1424689\n *\n * @param {File} file - The file object to add the type property to.\n * @returns {File} - The file object with the type property added.\n */\nconst toFileWithMimeType = file => {\n const { name } = file;\n const hasExtension = name && name.lastIndexOf('.') !== -1;\n\n if (hasExtension && !file.type) {\n const extension = (name.split('.').pop() || '').toLowerCase();\n const type = COMMON_MIME_TYPES.get(extension);\n\n if (type) {\n Object.defineProperty(file, 'type', {\n value: type,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n }\n\n return file;\n};\n\n/**\n * Adds a `path` property to the file object if it doesn't have one.\n * If `path` is not provided, the `webkitRelativePath` property of the file will be used\n * or the file's name if `webkitRelativePath` is not available.\n *\n * @param {File} file - The file object to add the path property to.\n * @param {string} [path] - The path to set on the file object.\n * @returns {File} - The file object with the path property added.\n */\nconst toFileWithPath = (file, path) => {\n const fileWithMimeType = toFileWithMimeType(file);\n\n // @ts-ignore\n if (typeof fileWithMimeType.path !== 'string') {\n const { webkitRelativePath } = file;\n\n Object.defineProperty(fileWithMimeType, 'path', {\n value: typeof path === 'string' ? path : webkitRelativePath || file.name,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n\n return fileWithMimeType;\n};\n\n/**\n * Wrap `FileSystemDirectoryReader.readEntries` in a promise to make working with read entries easier.\n * https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryReader/readEntries\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */\nconst readEntriesPromise = async directoryReader => {\n return await new Promise((resolve, reject) => {\n directoryReader.readEntries(resolve, reject);\n });\n};\n\n/**\n * Read all entries in a directory or sub-directory\n * by calling `readEntries` until it returns an empty array.\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */\nconst readAllDirectoryEntries = async directoryReader => {\n const entries = [];\n let readEntries = await readEntriesPromise(directoryReader);\n\n while (readEntries.length > 0) {\n entries.push(...readEntries);\n readEntries = await readEntriesPromise(directoryReader);\n }\n\n return entries;\n};\n\n/**\n * Get a `File` object from a `FileSystemFileEntry` object.\n *\n * @param {FileSystemFileEntry} fileEntry - The file entry to get a `File` object from.\n * @returns {Promise} - A promise that resolves with a `File` object.\n */\nconst getFileFromFileEntry = fileEntry => {\n return new Promise((resolve, reject) => {\n fileEntry.file(file => resolve(toFileWithPath(file, fileEntry.fullPath)), reject);\n });\n};\n\n/**\n * Get an array of `File` objects from a `DataTransferItemList` object.\n *\n * @param {DataTransferItemList} dataTransferItemList - The item list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nconst getFilesFromDataTransferItemList = async dataTransferItemList => {\n const files = [];\n\n // Chromium browsers read only 100 files at a time as per the spec, so we need to use\n // BFS (Breadth-first search) to traverse the entire directory/file structure.\n // https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/webkitGetAsEntry#javascript_content\n const queue = [];\n\n for (const item of dataTransferItemList) {\n if (item.kind !== 'file') {\n // Ignore non-file items, such as links.\n continue;\n }\n\n // https://developer.mozilla.org/docs/Web/API/DataTransferItem/webkitGetAsEntry\n // This function is implemented as `webkitGetAsEntry()` in non-WebKit browsers\n // including Firefox at this time but it may be renamed to `getAsEntry()` in the future.\n // @ts-ignore\n const entry = item.getAsEntry ? item.getAsEntry() : item.webkitGetAsEntry();\n\n queue.push(entry);\n }\n\n while (queue.length > 0) {\n const entry = queue.shift();\n\n if (!entry) {\n continue;\n } else if (entry.isFile) {\n const file = await getFileFromFileEntry(entry);\n\n if (FILES_TO_IGNORE.indexOf(file.name) === -1) {\n files.push(file);\n }\n } else if (entry.isDirectory) {\n queue.push(...(await readAllDirectoryEntries(entry.createReader())));\n }\n }\n\n return files;\n};\n\n/**\n * Get an array of `File` objects from a `FileList` object.\n *\n * @param {FileList} fileList - The file list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nconst getFilesFromFileList = async fileList => {\n const files = [];\n\n for (const file of fileList) {\n if (FILES_TO_IGNORE.indexOf(file.name) === -1) {\n files.push(toFileWithPath(file));\n }\n }\n\n return files;\n};\n\n/**\n * Get an array of `File` objects from an event.\n * This function supports both `drop` and `change` events.\n *\n * @param {*} evt - The event to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nexport const getFilesFromEvent = async evt => {\n if (evt.dataTransfer) {\n return evt.dataTransfer.items\n ? await getFilesFromDataTransferItemList(evt.dataTransfer.items)\n : await getFilesFromFileList(evt.dataTransfer.files);\n }\n\n return await getFilesFromFileList(evt.target.files);\n};\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\nimport { isValidFile } from './utils/is-valid-file.js';\nimport { getFilesFromEvent } from './utils/files-selector.js';\n\nconst COMPONENT_NAME = 'files-dropzone';\nconst TOO_MANY_FILES = 'TOO_MANY_FILES';\nconst FILE_TOO_LARGE = 'FILE_TOO_LARGE';\nconst FILE_TOO_SMALL = 'FILE_TOO_SMALL';\nconst INVALID_MIME_TYPE = 'INVALID_MIME_TYPE';\nconst template = document.createElement('template');\n\nconst styles = /* css */ `\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n\ntemplate.innerHTML = /* html */ `\n \n\n \n\n
\n Drag 'n' drop files here, or click to select files\n
\n`;\n\n/**\n * @summary A custom element that allows users to drag and drop files into it.\n * @documentation https://github.com/georapbox/files-dropzone-element\n *\n * @tagname files-dropzone - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {string} accept - A comma-separated list of unique file type specifiers describing file types to allow.\n * @property {boolean} disabled - Determines whether the dropzone is disabled.\n * @property {number} maxFiles - The maximum number of files allowed to be dropped.\n * @property {number} maxSize - The maximum file size allowed in bytes.\n * @property {number} minSize - The minimum file size allowed in bytes.\n * @property {boolean} multiple - Allows multiple files to be dropped.\n * @property {boolean} autoFocus - Automatically focuses the dropzone when it's connected to the DOM.\n * @property {boolean} noStyle - Prevents the dropzone from applying any styling.\n *\n * @attribute {string} accept - Reflects the accept property.\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {number} max-files - Reflects the maxFiles property.\n * @attribute {number} max-size - Reflects the maxSize property.\n * @attribute {number} min-size - Reflects the minSize property.\n * @attribute {boolean} multiple - Reflects the multiple property.\n * @attribute {boolean} auto-focus - Reflects the autoFocus property.\n * @attribute {boolean} no-style - Reflects the noStyle property.\n *\n * @slot - The default slot content of the dropzone.\n *\n * @csspart dropzone - The dropzone element.\n * @csspart dropzone--dragover - The state of the dropzone when dragging over it.\n *\n * @cssproperty --dropzone-border-width - The border width of the dropzone.\n * @cssproperty --dropzone-border-style - The border style of the dropzone.\n * @cssproperty --dropzone-border-radius - The border radius of the dropzone.\n * @cssproperty --dropzone-border-color - The border color of the dropzone.\n * @cssproperty --dropzone-border-color-dragover - The border color of the dropzone when dragging over it.\n * @cssproperty --dropzone-border-color-hover - The border color of the dropzone when hovering over it.\n * @cssproperty --dropzone-background-color - The background color of the dropzone.\n * @cssproperty --dropzone-background-color-dragover - The background color of the dropzone when dragging over it.\n * @cssproperty --dropzone-background-color-hover - The background color of the dropzone when hovering over it.\n * @cssproperty --dropzone-body-color - The text color of the dropzone.\n * @cssproperty --dropzone-body-color-dragover - The text color of the dropzone when dragging over it.\n * @cssproperty --dropzone-body-color-hover - The text color of the dropzone when hovering over it.\n * @cssproperty --dropzone-focus-shadow-rgb - The RGB value of the dropzone's focus shadow.\n * @cssproperty --dropzone-focus-box-shadow - The box shadow of the dropzone when focused.\n * @cssproperty --dropzone-transition-duration - The transition's duration for the dropzone area.\n *\n * @event files-dropzone-drop - Fired when files are dropped.\n * @event files-dropzone-drop-accepted - Fired when files dropped files are accepted.\n * @event files-dropzone-drop-rejected - Fired when files dropped files are rejected.\n * @event files-dropzone-dragenter - Fired when files are dragged into the dropzone.\n * @event files-dropzone-dragover - Fired when files are dragged over the dropzone.\n * @event files-dropzone-dragleave - Fired when files are dragged out of the dropzone.\n * @event files-dropzone-error - Fired when there is any error in the process of reading dropped files or directories.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method openFileDialog - Instance method. Opens the file dialog programmatically.\n */\nclass FilesDropzone extends HTMLElement {\n /** @type {Nullable} */\n #fileInput = null;\n\n /** @type {Nullable} */\n #dropzoneEl = null;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n if (this.shadowRoot) {\n this.#fileInput = /** @type {Nullable} */ (this.shadowRoot.getElementById('file-input'));\n this.#dropzoneEl = this.shadowRoot.getElementById('dropzone');\n }\n }\n\n static get observedAttributes() {\n return ['accept', 'disabled', 'multiple'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'accept' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.accept = this.accept;\n }\n\n if (name === 'disabled' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.disabled = this.disabled;\n\n if (this.disabled) {\n this.#dropzoneEl?.removeAttribute('tabindex');\n this.#dropzoneEl?.setAttribute('aria-disabled', 'true');\n } else {\n this.#dropzoneEl?.setAttribute('tabindex', '0');\n this.#dropzoneEl?.setAttribute('aria-disabled', 'false');\n }\n }\n\n if (name === 'multiple' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.multiple = this.multiple;\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('accept');\n this.#upgradeProperty('disabled');\n this.#upgradeProperty('maxFiles');\n this.#upgradeProperty('maxSize');\n this.#upgradeProperty('minSize');\n this.#upgradeProperty('multiple');\n this.#upgradeProperty('autoFocus');\n this.#upgradeProperty('noStyle');\n\n this.#fileInput?.addEventListener('change', this.#handleFileInputChange);\n this.#dropzoneEl?.addEventListener('dragenter', this.#handleDragEnter);\n this.#dropzoneEl?.addEventListener('dragover', this.#handleDragOver);\n this.#dropzoneEl?.addEventListener('dragleave', this.#handleDragLeave);\n this.#dropzoneEl?.addEventListener('drop', this.#handleDrop);\n this.#dropzoneEl?.addEventListener('click', this.#handleClick);\n this.#dropzoneEl?.addEventListener('keyup', this.#handleKeyUp);\n\n this.autoFocus && this.#dropzoneEl?.focus();\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#fileInput?.removeEventListener('change', this.#handleFileInputChange);\n this.#dropzoneEl?.removeEventListener('dragenter', this.#handleDragEnter);\n this.#dropzoneEl?.removeEventListener('dragover', this.#handleDragOver);\n this.#dropzoneEl?.removeEventListener('dragleave', this.#handleDragLeave);\n this.#dropzoneEl?.removeEventListener('drop', this.#handleDrop);\n this.#dropzoneEl?.removeEventListener('click', this.#handleClick);\n this.#dropzoneEl?.removeEventListener('keyup', this.#handleKeyUp);\n }\n\n /**\n * @type {string} - A comma-separated list of unique file type specifiers describing file types to allow.\n * @attribute accept - Reflects the accept property.\n */\n get accept() {\n return this.getAttribute('accept') || '';\n }\n\n set accept(value) {\n this.setAttribute('accept', value != null ? value.toString() : value);\n }\n\n /**\n * @type {boolean} - Determines whether the dropzone is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value) {\n this.toggleAttribute('disabled', !!value);\n }\n\n /**\n * @type {number} - The maximum number of files allowed to be dropped.\n * @default Infinity\n * @attribute max-files - Reflects the maxFiles property.\n */\n get maxFiles() {\n const num = Number(this.getAttribute('max-files')) || 0;\n\n if (num <= 0) {\n return Infinity;\n }\n\n return Math.floor(Math.abs(num));\n }\n\n set maxFiles(value) {\n this.setAttribute('max-files', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} - The maximum file size allowed in bytes.\n * @default Infinity\n * @attribute max-size - Reflects the maxSize property.\n */\n get maxSize() {\n const value = this.getAttribute('max-size');\n\n if (value === null) {\n return Infinity;\n }\n\n const num = Number(value);\n\n return Number.isNaN(num) ? Infinity : num;\n }\n\n set maxSize(value) {\n this.setAttribute('max-size', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} - The minimum file size allowed in bytes.\n * @default 0\n * @attribute min-size - Reflects the minSize property.\n */\n get minSize() {\n const value = this.getAttribute('min-size');\n\n if (value === null) {\n return 0;\n }\n\n const num = Number(value);\n\n return Number.isNaN(num) ? 0 : num;\n }\n\n set minSize(value) {\n this.setAttribute('min-size', value != null ? value.toString() : value);\n }\n\n /**\n * @type {boolean} - Allows multiple files to be dropped.\n * @default false\n * @attribute multiple - Reflects the multiple property.\n */\n get multiple() {\n return this.hasAttribute('multiple');\n }\n\n set multiple(value) {\n this.toggleAttribute('multiple', !!value);\n }\n\n /**\n * @type {boolean} - Automatically focuses the dropzone when it's connected to the DOM.\n * @default false\n * @attribute auto-focus - Reflects the autoFocus property.\n */\n get autoFocus() {\n return this.hasAttribute('auto-focus');\n }\n\n set autoFocus(value) {\n this.toggleAttribute('auto-focus', !!value);\n }\n\n /**\n * @type {boolean} - Prevents the dropzone from applying any styling.\n * @default false\n * @attribute no-style - Reflects the noStyle property.\n */\n get noStyle() {\n return this.hasAttribute('no-style');\n }\n\n set noStyle(value) {\n this.toggleAttribute('no-style', !!value);\n }\n\n /**\n * Handles the change event of the file input.\n *\n * @param {*} evt - The event object.\n */\n #handleFileInputChange = async evt => {\n try {\n this.#handleFilesSelect(await getFilesFromEvent(evt));\n } catch (error) {\n this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n })\n );\n }\n };\n\n /**\n * Handles the dragenter event of the dropzone.\n */\n #handleDragEnter = () => {\n if (this.disabled) {\n return;\n }\n\n this.dispatchEvent(\n new Event(`${COMPONENT_NAME}-dragenter`, {\n bubbles: true,\n composed: true\n })\n );\n };\n\n /**\n * Handles the dragover event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleDragOver = evt => {\n evt.preventDefault();\n\n if (this.disabled) {\n evt.dataTransfer.dropEffect = 'none';\n return;\n }\n\n evt.dataTransfer.dropEffect = 'copy';\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.add('dropzone--dragover');\n this.#dropzoneEl.part.add('dropzone--dragover');\n }\n\n this.dispatchEvent(\n new Event(`${COMPONENT_NAME}-dragover`, {\n bubbles: true,\n composed: true\n })\n );\n };\n\n /**\n * Handles the dragleave event of the dropzone.\n */\n #handleDragLeave = () => {\n if (this.disabled) {\n return;\n }\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove('dropzone--dragover');\n this.#dropzoneEl.part.remove('dropzone--dragover');\n }\n\n this.dispatchEvent(\n new Event(`${COMPONENT_NAME}-dragleave`, {\n bubbles: true,\n composed: true\n })\n );\n };\n\n /**\n * Handles the drop event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleDrop = async evt => {\n if (this.disabled) {\n return;\n }\n\n evt.preventDefault();\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove('dropzone--dragover');\n this.#dropzoneEl.part.remove('dropzone--dragover');\n }\n\n try {\n this.#handleFilesSelect(await getFilesFromEvent(evt));\n } catch (error) {\n this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n })\n );\n }\n };\n\n /**\n * Handles the click event of the dropzone.\n */\n #handleClick = () => {\n if (this.disabled) {\n return;\n }\n\n this.#fileInput?.click();\n };\n\n /**\n * Handles the keyup event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleKeyUp = evt => {\n if (this.disabled) {\n return;\n }\n\n if (evt.key === ' ' || evt.key === 'Enter') {\n this.#fileInput?.click();\n }\n };\n\n /**\n * Handles the selection of files.\n *\n * @param {File[]} files - The files to handle.\n */\n #handleFilesSelect(files) {\n if (!Array.isArray(files) || !files.length) {\n return;\n }\n\n const acceptedFiles = [];\n const rejectedFiles = [];\n const filesLength = files.length;\n\n // If the component is not in multiple mode, reject all files.\n if (!this.multiple && filesLength > 1) {\n for (const file of files) {\n rejectedFiles.push({\n file,\n errors: [\n {\n code: TOO_MANY_FILES,\n message: `Too many files selected. Only 1 file is allowed.`\n }\n ]\n });\n }\n } else if (this.multiple && filesLength > this.maxFiles) {\n // If the component is in multiple mode, but the number of files exceeds\n // the maxFiles attribute, reject all files.\n for (const file of files) {\n rejectedFiles.push({\n file,\n errors: [\n {\n code: TOO_MANY_FILES,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? 'files are' : 'file is'} allowed.`\n }\n ]\n });\n }\n } else {\n // Validate each file. If it's valid, add it to the accepted files array,\n // otherwise add it to the rejected files array.\n for (const file of files) {\n const fileHasValidType = isValidFile(file, this.accept);\n const fileExceedsMaxSize = file.size > this.maxSize;\n const fileIsSmallerThanMinSize = file.size < this.minSize;\n\n if (fileHasValidType && !fileExceedsMaxSize && !fileIsSmallerThanMinSize) {\n acceptedFiles.push(file);\n } else {\n const errors = [];\n\n if (!fileHasValidType) {\n errors.push({\n code: INVALID_MIME_TYPE,\n message: `File type \"${file.type}\" is not accepted.`\n });\n }\n\n if (fileExceedsMaxSize) {\n errors.push({\n code: FILE_TOO_LARGE,\n message: `File size ${file.size} exceeds the maximum size of ${this.maxSize}.`\n });\n }\n\n if (fileIsSmallerThanMinSize) {\n errors.push({\n code: FILE_TOO_SMALL,\n message: `File size ${file.size} is smaller than the minimum size of ${this.minSize}.`\n });\n }\n\n rejectedFiles.push({ file, errors });\n }\n }\n }\n\n this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}-drop`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles,\n rejectedFiles\n }\n })\n );\n\n if (acceptedFiles.length > 0) {\n this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}-drop-accepted`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles\n }\n })\n );\n }\n\n if (rejectedFiles.length > 0) {\n this.dispatchEvent(\n new CustomEvent(`${COMPONENT_NAME}-drop-rejected`, {\n bubbles: true,\n composed: true,\n detail: {\n rejectedFiles\n }\n })\n );\n }\n\n if (this.#fileInput) {\n this.#fileInput.value = this.#fileInput.defaultValue;\n }\n }\n\n /**\n * Opens the file dialog programmatically.\n */\n openFileDialog() {\n if (this.disabled) {\n return;\n }\n\n this.#fileInput?.click();\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'accept' | 'disabled' | 'maxFiles' | 'maxSize' | 'minSize' | 'multiple' | 'autoFocus' | 'noStyle'} prop - The property name to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='files-dropzone'] - The name of the custom element.\n * @example\n *\n * FilesDropzone.defineCustomElement('my-dropzone');\n */\n static defineCustomElement(elementName = COMPONENT_NAME) {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, FilesDropzone);\n }\n }\n}\n\nexport { FilesDropzone };\n","import { FilesDropzone } from './files-dropzone.js';\n\nFilesDropzone.defineCustomElement();\n\nexport { FilesDropzone };\n","export const ACCEPTED_MIME_TYPES = [\n 'image/jpg',\n 'image/jpeg',\n 'image/png',\n 'image/apng',\n 'image/gif',\n 'image/webp',\n 'image/avif'\n];\nexport const MAX_SHADOW_BLUR_SIZE = 20;\nexport const MAX_STROKE_WIDTH = 20;\nexport const MAX_ROTATE = 360;\n","/**\n * Generates a unique id of the form `${prefix}-${randomString}-${suffix}`.\n *\n * @param {string} [prefix=''] - The prefix to use for the id.\n * @param {string} [suffix=''] - The suffix to use for the id.\n * @returns {string} - The unique id.\n */\nconst uid = (prefix = '', suffix = '') => {\n const prefixString = typeof prefix === 'string' && prefix !== '' ? prefix + '-' : '';\n const suffixString = typeof suffix === 'string' && suffix !== '' ? '-' + suffix : '';\n const randomString = Math.random().toString(36).substring(2, 8); // Pseudo-random string of six alphanumeric characters.\n\n return `${prefixString}${randomString}${suffixString}`;\n};\n\nexport { uid };\n","import { ACCEPTED_MIME_TYPES } from '../constants.js';\n\n/**\n * Creates a file from a given URL.\n *\n * @param {{ url: string, filename: string, mimeType: string }} options\n * @param {string} options.url - The URL of the file to fetch.\n * @param {string} options.filename - The name of the file to create.\n * @param {string} options.mimeType - The MIME type of the file to create.\n * @returns {Promise} - A promise that resolves to the file created from the given URL.\n */\nexport const fileFromUrl = async (options = {}) => {\n const res = await fetch(options.url);\n const blob = await res.blob();\n const mimeType = options.mimeType || blob.type || '';\n\n if (!ACCEPTED_MIME_TYPES.includes(mimeType)) {\n throw new Error(\n `This is not an accepted image format. Accepted MIME types are: ${ACCEPTED_MIME_TYPES.join(', ')}`\n );\n }\n\n return new File([blob], options.filename || '', blob);\n};\n","/**\n * A class representing a storage utility for managing data in `localStorage` or `sessionStorage`.\n */\nclass Storage {\n /**\n * The prefix to be added to all keys.\n *\n * @type {string}\n * @private\n */\n #keyPrefix = null;\n\n /**\n * The storage provider (`localStorage` or `sessionStorage`).\n *\n * @type {Storage}\n * @private\n */\n #provider = null;\n\n /**\n * Creates an instance of Storage.\n *\n * @param {string} prefix - The prefix to be added to all keys when storing/retrieving data.\n * @param {Storage} [provider=localStorage] - The storage provider (`localStorage` or `sessionStorage`).\n * @throws {Error} If prefix is not provided or if the provider is not supported.\n */\n constructor(prefix, provider = localStorage) {\n if (!prefix) {\n throw new Error('Storage prefix is required');\n }\n\n if (provider !== localStorage && provider !== sessionStorage) {\n throw new Error('Storage provider is not supported');\n }\n\n this.#keyPrefix = prefix;\n this.#provider = provider;\n }\n\n /**\n * Sets a key-value pair in the storage.\n *\n * @param {string} key - The key for the data.\n * @param {*} value - The value to be stored (will be converted to JSON string).\n */\n set(key, value) {\n try {\n this.#provider.setItem(`${this.#keyPrefix}${key}`, JSON.stringify(value));\n } catch (err) {\n console.error('Error saving to storage', err);\n }\n }\n\n /**\n * Retrieves the value associated with the given key from the storage.\n *\n * @param {string} key - The key to retrieve the value for.\n * @returns {*} The value associated with the key, or `null` if key is not found or an error occurs.\n */\n get(key) {\n try {\n const value = this.#provider.getItem(`${this.#keyPrefix}${key}`);\n return value ? JSON.parse(value) : null;\n } catch (err) {\n console.error('Error getting from storage', err);\n return null;\n }\n }\n}\n\nconst DEFAULT_STORAGE_PREFIX = 'meme-generator/';\nconst DEFAULT_STORAGE_PROVIDER = localStorage;\nconst storage = new Storage(DEFAULT_STORAGE_PREFIX, DEFAULT_STORAGE_PROVIDER);\n\nexport { Storage, storage };\n","export const isSolidColorSelected = selectedImage => {\n return typeof selectedImage === 'string';\n};\n","import Pressuru from 'url:../assets/fonts/Pressuru/Pressuru.ttf';\nimport OswaldRegular from 'url:../assets/fonts/Oswald/Oswald-Regular.ttf';\nimport OswaldBold from 'url:../assets/fonts/Oswald/Oswald-Bold.ttf';\nimport RobotoRegular from 'url:../assets/fonts/Roboto/Roboto-Regular.ttf';\nimport RobotoBold from 'url:../assets/fonts/Roboto/Roboto-Bold.ttf';\nimport RobotoCondensedRegular from 'url:../assets/fonts/RobotoCondensed/RobotoCondensed-Regular.ttf';\nimport RobotoCondensedBold from 'url:../assets/fonts/RobotoCondensed/RobotoCondensed-Bold.ttf';\nimport CourierPrimeRegular from 'url:../assets/fonts/CourierPrime/CourierPrime-Regular.ttf';\nimport CourierPrimeBold from 'url:../assets/fonts/CourierPrime/CourierPrime-Bold.ttf';\nimport OpenSansRegular from 'url:../assets/fonts/OpenSans/OpenSans-Regular.ttf';\nimport OpenSansBold from 'url:../assets/fonts/OpenSans/OpenSans-Bold.ttf';\n\nexport const customFonts = [\n { name: 'Pressuru', label: 'Pressuru', path: Pressuru, style: 'normal', weight: '400' },\n { name: 'Oswald-Regular', label: 'Oswald', path: OswaldRegular, style: 'normal', weight: '400' },\n { name: 'Oswald-Bold', label: 'Oswald Bold', path: OswaldBold, style: 'normal', weight: '700' },\n { name: 'Roboto-Regular', label: 'Roboto', path: RobotoRegular, style: 'normal', weight: '400' },\n { name: 'Roboto-Bold', label: 'Roboto Bold', path: RobotoBold, style: 'normal', weight: '700' },\n {\n name: 'RobotoCondensed-Regular',\n label: 'Roboto Condensed',\n path: RobotoCondensedRegular,\n style: 'normal',\n weight: '400'\n },\n {\n name: 'RobotoCondensed-Bold',\n label: 'Roboto Condensed Bold',\n path: RobotoCondensedBold,\n style: 'normal',\n weight: '700'\n },\n {\n name: 'CourierPrime-Regular',\n label: 'Courier Prime',\n path: CourierPrimeRegular,\n style: 'normal',\n weight: '400'\n },\n {\n name: 'CourierPrime-Bold',\n label: 'Courier Prime Bold',\n path: CourierPrimeBold,\n style: 'normal',\n weight: '700'\n },\n {\n name: 'OpenSans-Regular',\n label: 'Open Sans',\n path: OpenSansRegular,\n style: 'normal',\n weight: '400'\n },\n {\n name: 'OpenSans-Bold',\n label: 'Open Sans Bold',\n path: OpenSansBold,\n style: 'normal',\n weight: '400'\n }\n];\n\nexport const loadCustomFont = async (name, path, options = {}) => {\n try {\n const font = new FontFace(name, `url(${path})`, { ...options });\n await font.load();\n document.fonts.add(font);\n } catch (err) {\n console.error(err);\n }\n};\n","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"Pressuru.684952ea.ttf\";","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"Oswald-Regular.89ec7d89.ttf\";","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"Oswald-Bold.0f6a7ca6.ttf\";","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"Roboto-Regular.ca197847.ttf\";","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"Roboto-Bold.fdb9b54a.ttf\";","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"RobotoCondensed-Regular.d585f5c7.ttf\";","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"RobotoCondensed-Bold.e1f96d4b.ttf\";","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"CourierPrime-Regular.3a25a501.ttf\";","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"CourierPrime-Bold.3d6bf689.ttf\";","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"OpenSans-Regular.edf9e01b.ttf\";","module.exports = require('./helpers/bundle-url').getBundleURL('9p9yL') + \"OpenSans-Bold.8fceb72b.ttf\";","const errorsContainer = document.getElementById('errorsContainer');\n\nconst hideError = evt => {\n const target = evt.currentTarget;\n target.removeEventListener('click', hideError);\n errorsContainer.removeChild(target.parentNode);\n};\n\nexport const toastAlert = (message = '', type = 'info') => {\n const types = ['info', 'warning', 'danger'];\n\n if (!types.includes(type)) {\n type = 'info';\n }\n\n const template = /* html */ `\n ${message}\n \n `;\n\n const div = document.createElement('div');\n div.className = `alert alert-${type} alert-dismissible text-break mb-2 fade`;\n div.innerHTML = template;\n div.querySelector('button').addEventListener('click', hideError);\n errorsContainer.appendChild(div);\n setTimeout(() => div.classList.add('show'), 100);\n};\n","import { uid } from './utils/uid.js';\nimport { customFonts } from './custom-fonts.js';\nimport { MAX_SHADOW_BLUR_SIZE, MAX_STROKE_WIDTH, MAX_ROTATE } from './constants.js';\n\nconst defaultTextboxData = {\n id: '',\n text: '',\n fillColor: '#ffffff',\n strokeColor: '#000000',\n font: 'Pressuru',\n fontSize: 40,\n fontWeight: 'normal',\n textAlign: 'center',\n shadowBlur: 0,\n strokeWidth: 1.5,\n offsetY: 0,\n offsetX: 0,\n rotate: 0,\n allCaps: true\n};\n\nconst textboxes = new Map();\n\nclass Textbox {\n constructor(data) {\n const id = uid('textbox', Date.now().toString(36));\n\n this.data = data ? { ...data, id } : { ...defaultTextboxData, id };\n\n textboxes.set(id, this);\n\n document.dispatchEvent(\n new CustomEvent(`textbox-create`, {\n bubbles: true,\n composed: true,\n detail: { textbox: this }\n })\n );\n }\n\n getData() {\n return this.data;\n }\n\n static create(data) {\n return new Textbox(data);\n }\n\n static getAll() {\n return textboxes;\n }\n\n static getById(id) {\n return textboxes.get(id);\n }\n\n static remove(id) {\n textboxes.delete(id);\n\n document.dispatchEvent(\n new CustomEvent(`textbox-remove`, {\n bubbles: true,\n composed: true,\n detail: { id }\n })\n );\n }\n\n static createElement(textbox, autoFocus = true) {\n if (!(textbox instanceof Textbox)) {\n return;\n }\n\n const data = textbox.getData();\n const {\n id,\n text,\n fillColor,\n strokeColor,\n fontSize,\n shadowBlur,\n strokeWidth,\n offsetX,\n offsetY,\n rotate\n } = data;\n\n const template = /* html */ `\n
\n \n \n\n \n\n
\n \n \n\n \n \n\n \n
\n
\n\n \n `;\n\n const fragment = document.createDocumentFragment();\n const div = document.createElement('div');\n\n div.setAttribute('id', id);\n div.setAttribute('data-section', 'textbox');\n div.className = 'bg-light border shadow-sm mb-3 rounded';\n div.innerHTML = template;\n div.querySelectorAll('select').forEach(el => (el.value = data[el.dataset.input]));\n div\n .querySelectorAll('input[type=\"checkbox\"]')\n .forEach(el => (el.checked = data[el.dataset.input]));\n\n const textboxEl = fragment.appendChild(div);\n\n if (autoFocus) {\n setTimeout(() => textboxEl.querySelector('[data-input=\"text\"]').focus(), 0);\n }\n\n return textboxEl;\n }\n}\n\nexport { Textbox };\n","import { isSolidColorSelected } from './utils/is-solid-color-selected.js';\nimport { MAX_SHADOW_BLUR_SIZE, MAX_STROKE_WIDTH, MAX_ROTATE } from './constants.js';\n\nexport class Canvas {\n #canvas = null;\n #ctx = null;\n\n constructor(canvasEl) {\n this.#canvas = canvasEl;\n this.#ctx = this.#canvas.getContext('2d');\n }\n\n get width() {\n return this.#canvas.width;\n }\n\n set width(value) {\n this.#canvas.width = value;\n }\n\n get height() {\n return this.#canvas.height;\n }\n\n set height(value) {\n this.#canvas.height = value;\n }\n\n getDimensions() {\n return {\n width: this.width,\n height: this.height\n };\n }\n\n setDimensions({ width, height }) {\n this.width = width;\n this.height = height;\n return this;\n }\n\n toDataURL() {\n return this.#canvas.toDataURL();\n }\n\n draw(image, textboxes = new Map()) {\n if (image == null) {\n return;\n }\n\n const canvas = this.#canvas;\n const ctx = this.#ctx;\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n if (isSolidColorSelected(image)) {\n ctx.fillStyle = image;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n } else {\n ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n }\n\n let multiplier = 0;\n\n textboxes.forEach(textbox => {\n const { data } = textbox;\n\n multiplier += 1;\n\n ctx.save();\n\n ctx.font = `${data.fontWeight} ${(data.fontSize * canvas.width) / 1000}px ${data.font}`;\n ctx.fillStyle = data.fillColor;\n ctx.textAlign = data.textAlign;\n ctx.strokeStyle = data.strokeColor;\n\n const lineHeight = ctx.measureText('M').width + data.fontSize / 2;\n const xPos = canvas.width / 2;\n const shadowBlur = data.shadowBlur;\n const text = data.allCaps === true ? data.text.toUpperCase() : data.text;\n const textLines = text.split('\\n');\n\n if (shadowBlur !== 0) {\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n ctx.shadowBlur = Math.min(shadowBlur, MAX_SHADOW_BLUR_SIZE);\n ctx.shadowColor = data.strokeColor;\n }\n\n ctx.translate(xPos + data.offsetX, lineHeight * multiplier + data.offsetY);\n ctx.rotate((Math.min(data.rotate, MAX_ROTATE) * Math.PI) / 180);\n\n // First draw each line with shadow.\n textLines.forEach((text, index) => ctx.fillText(text, 0, index * lineHeight));\n\n // Since shadows of multiline text may be drawn over letters of neighbour lines\n // (when shadow blur is big enough), re-draw text without shadows.\n if (shadowBlur !== 0) {\n ctx.shadowBlur = 0;\n textLines.forEach((text, index) => ctx.fillText(text, 0, index * lineHeight));\n }\n\n if (data.strokeWidth > 0) {\n ctx.lineWidth = Math.min(data.strokeWidth, MAX_STROKE_WIDTH);\n textLines.forEach((text, index) => ctx.strokeText(text, 0, index * lineHeight));\n }\n\n ctx.restore();\n });\n\n return this;\n }\n\n clear() {\n this.#ctx.clearRect(0, 0, this.#canvas.width, this.#canvas.height);\n return this;\n }\n\n show() {\n this.#canvas.hidden = false;\n return this;\n }\n\n hide() {\n this.#canvas.hidden = true;\n return this;\n }\n\n static createInstance(canvasEl) {\n return new Canvas(canvasEl);\n }\n}\n"],"names":["$1e5dc5e467331cb9$var$promise","$1e5dc5e467331cb9$var$baselineEmojiWidth","$parcel$interopDefault","a","__esModule","default","$dec5faeb65064cfd$var$browserSupportsTextareaTextNodes","$parcel$global","globalThis","self","window","global","$parcel$modules","$parcel$inits","parcelRequire","$d1f26ac162b12b4a$var$assertNonEmptyString","str","Error","$d1f26ac162b12b4a$var$assertNumber","number","id","exports","init","module","call","err","code","register","$d1f26ac162b12b4a$var$STORE_EMOJI","$d1f26ac162b12b4a$var$STORE_KEYVALUE","$d1f26ac162b12b4a$var$STORE_FAVORITES","$d1f26ac162b12b4a$var$INDEX_TOKENS","$d1f26ac162b12b4a$var$INDEX_COUNT","$d1f26ac162b12b4a$var$INDEX_GROUP_AND_ORDER","$d1f26ac162b12b4a$var$KEY_ETAG","$d1f26ac162b12b4a$var$KEY_PREFERRED_SKINTONE","$d1f26ac162b12b4a$var$MODE_READONLY","$d1f26ac162b12b4a$var$MODE_READWRITE","$d1f26ac162b12b4a$var$INDEX_SKIN_UNICODE","$d1f26ac162b12b4a$var$uniqEmoji","emojis","$d1f26ac162b12b4a$var$uniqBy","arr","func","set","Set","res","item","key","has","add","push","_","unicode","$d1f26ac162b12b4a$var$openIndexedDBRequests","$d1f26ac162b12b4a$var$databaseCache","$d1f26ac162b12b4a$var$onCloseListeners","$d1f26ac162b12b4a$var$handleOpenOrDeleteReq","resolve","reject","req","onerror","error","onblocked","onsuccess","result","$d1f26ac162b12b4a$var$createDatabase","dbName","db","Promise","indexedDB","open","onupgradeneeded","e","oldVersion","$d1f26ac162b12b4a$var$initialMigration","createObjectStore","name","keyPath","indexes","store","indexName","multiEntry","Object","entries","createIndex","undefined","onclose","$d1f26ac162b12b4a$var$closeDatabase","$d1f26ac162b12b4a$var$dbPromise","storeName","readOnlyOrReadWrite","cb","txn","transaction","durability","objectStore","map","oncomplete","close","listeners","listener","$d1f26ac162b12b4a$var$irregularEmoticons","$d1f26ac162b12b4a$var$extractTokens","split","word","match","toLowerCase","replace","filter","Boolean","$d1f26ac162b12b4a$var$normalizeTokens","length","$d1f26ac162b12b4a$var$callStore","method","target","$d1f26ac162b12b4a$var$getIDB","$d1f26ac162b12b4a$var$getAllIDB","$d1f26ac162b12b4a$var$commit","commit","$d1f26ac162b12b4a$var$findCommonMembers","arrays","uniqByFunc","shortestArray","$d1f26ac162b12b4a$var$minBy","array","minItem","i","results","some","findIndex","$d1f26ac162b12b4a$var$isEmpty","$d1f26ac162b12b4a$var$get","$d1f26ac162b12b4a$var$hasData","url","eTag","oldETag","oldUrl","all","$d1f26ac162b12b4a$var$doFullDatabaseScanForSingleResult","predicate","emojiStore","lastKey","processNextBatch","getAll","IDBKeyRange","lowerBound","$d1f26ac162b12b4a$var$loadData","emojiData","transformedData","annotation","emoticon","group","order","shortcodes","skins","tags","emoji","version","tokens","flat","sort","tone","skinTones","skinUnicodes","skinVersions","metaStore","todo","checkFetched","onFetched","data","clear","put","$d1f26ac162b12b4a$var$getEmojiByGroup","range","bound","index","$d1f26ac162b12b4a$var$getEmojiBySearchQuery","query","intermediateResults","checkDone","onDone","b","token","only","$d1f26ac162b12b4a$var$getEmojiByShortcode","shortcode","lowerShortcodes","includes","$d1f26ac162b12b4a$var$getEmojiByUnicode","$d1f26ac162b12b4a$var$requiredKeys$1","$d1f26ac162b12b4a$var$customEmojiIndex","customEmojis","$d1f26ac162b12b4a$var$assertCustomEmojis","isArray","Array","firstItemIsFaulty","sortByName","searchTrie","$d1f26ac162b12b4a$var$trie","itemToTokens","Map","currentMap","char","charAt","nextMap","get","valuesAtCoda","exact","queue","value","shift","searchByExactMatch","searchByPrefix","shortcodeToEmoji","nameToEmoji","customEmoji","search","byShortcode","byName","$d1f26ac162b12b4a$var$isFirefoxContentScript","wrappedJSObject","$d1f26ac162b12b4a$var$cleanEmoji","structuredClone","len","$d1f26ac162b12b4a$var$warnETag","console","warn","$d1f26ac162b12b4a$var$requiredKeys","$d1f26ac162b12b4a$var$assertStatus","response","dataSource","Math","floor","status","$d1f26ac162b12b4a$var$getETag","fetch","headers","$d1f26ac162b12b4a$var$getETagAndData","json","$d1f26ac162b12b4a$var$assertEmojiData","$d1f26ac162b12b4a$var$jsonChecksum","object","inBuffer","$d1f26ac162b12b4a$var$binaryStringToArrayBuffer","binary","buf","ArrayBuffer","Uint8Array","charCodeAt","JSON","stringify","btoa","$d1f26ac162b12b4a$var$arrayBufferToBinaryString","buffer","bytes","byteLength","String","fromCharCode","crypto","subtle","digest","$d1f26ac162b12b4a$var$checkForUpdates","eTagAndData","$d1f26ac162b12b4a$var$loadDataForFirstTime","$d1f26ac162b12b4a$export$2e2bcd8739ae039","constructor","locale","_dbName","_db","_lazyUpdate","_custom","_clear","bind","_ready","_init","ready","checkReady","getEmojiByGroup","getEmojiBySearchQuery","getEmojiByShortcode","getEmojiByUnicodeOrName","unicodeOrName","getPreferredSkinTone","setPreferredSkinTone","skinTone","incrementFavoriteEmojiCount","getTopFavoriteEmoji","limit","customEmojiIndex","favoritesStore","openCursor","cursor","addResult","continue","primaryKey","custom","_shutdown","delete","deleteDatabase","$1e5dc5e467331cb9$var$allGroups","$1e5dc5e467331cb9$var$groups","slice","$1e5dc5e467331cb9$var$rIC","requestIdleCallback","setTimeout","$1e5dc5e467331cb9$var$hasZwj","$1e5dc5e467331cb9$var$versionsAndTestEmoji","$1e5dc5e467331cb9$var$MOST_COMMONLY_USED_EMOJI","$1e5dc5e467331cb9$var$FONT_FAMILY","$1e5dc5e467331cb9$var$DEFAULT_CATEGORY_SORTING","$1e5dc5e467331cb9$var$getTextFeature","text","color","canvas","document","createElement","width","height","ctx","getContext","willReadFrequently","textBaseline","font","fillStyle","scale","fillText","getImageData","$1e5dc5e467331cb9$var$compareFeatures","feature1","feature2","feature1Str","join","startsWith","$1e5dc5e467331cb9$var$detectEmojiSupportLevel","$1e5dc5e467331cb9$var$determineEmojiSupportLevel","$1e5dc5e467331cb9$var$testColorEmojiSupported","$1e5dc5e467331cb9$var$supportedZwjEmojis","$1e5dc5e467331cb9$var$halt","event","preventDefault","stopPropagation","$1e5dc5e467331cb9$var$incrementOrDecrement","decrement","val","$1e5dc5e467331cb9$var$uniqBy","$1e5dc5e467331cb9$var$rAF","requestAnimationFrame","$1e5dc5e467331cb9$var$resizeObserverSupported","ResizeObserver","$1e5dc5e467331cb9$var$calculateTextWidth","node","createRange","selectNode","firstChild","getBoundingClientRect","$1e5dc5e467331cb9$var$getFromMap","cache","cached","$1e5dc5e467331cb9$var$parseCache","WeakMap","$1e5dc5e467331cb9$var$domInstancesCache","$1e5dc5e467331cb9$var$unkeyedSymbol","Symbol","$1e5dc5e467331cb9$var$hasReplaceChildren","Element","prototype","$1e5dc5e467331cb9$var$applyBindings","bindings","element","instanceBindings","binding","targetNode","attributeName","instanceBinding","targetParentNode","currentExpression","$1e5dc5e467331cb9$var$qM","queueMicrotask","callback","then","$1e5dc5e467331cb9$var$arraysAreEqualByFunction","left","right","areEqualFunc","$1e5dc5e467331cb9$var$intersectionObserverCache","$1e5dc5e467331cb9$var$EMPTY_ARRAY","assign","$1e5dc5e467331cb9$var$assign","$1e5dc5e467331cb9$var$enI18n","categoriesLabel","emojiUnsupportedMessage","favoritesLabel","loadingMessage","networkErrorMessage","regionLabel","searchDescription","searchLabel","searchResultsLabel","skinToneDescription","skinToneLabel","skinTonesLabel","categories","activities","objects","symbols","flags","$1e5dc5e467331cb9$var$PROPS","$1e5dc5e467331cb9$var$EXTRA_STYLES","$1e5dc5e467331cb9$export$2e2bcd8739ae039","HTMLElement","props","attachShadow","mode","style","prop","textContent","$1e5dc5e467331cb9$var$baseStyles","shadowRoot","appendChild","_ctx","skinToneEmoji","customCategorySorting","i18n","emojiVersion","hasOwnProperty","_dbFlush","connectedCallback","_cmp","$1e5dc5e467331cb9$var$createRoot","refs","abortController","AbortController","abortSignal","signal","state","createEffect","$1e5dc5e467331cb9$var$createState","currentObserver","queued","destroyed","propsToObservers","dirtyObservers","flush","observersToRun","observer","size","Proxy","observers","newValue","addEventListener","runnable","oldObserver","actionContext","database","initialLoad","currentEmojis","currentEmojisWithCategories","rawSearchText","searchText","searchMode","activeSearchItem","message","skinTonePickerExpanded","skinTonePickerExpandedAfterAnimation","currentSkinTone","activeSkinTone","skinToneButtonText","pickerStyle","skinToneButtonLabel","currentFavorites","defaultFavoriteEmojis","numColumns","isRtl","currentGroupIndex","groups","databaseLoaded","activeSearchItemId","currentGroup","focus","getElementById","emojiToDomNode","fireEvent","detail","rootElement","dispatchEvent","CustomEvent","bubbles","composed","compareEmojiArrays","compareCurrentEmojisWithCategories","category","aCategory","aEmojis","bCategory","bEmojis","updateCurrentEmojis","newEmojis","updateSearchMode","newSearchMode","updateCurrentEmojisWithCategories","newEmojisWithCategories","unicodeWithSkin","helpers","labelWithSkin","$1e5dc5e467331cb9$var$uniq","titleForEmoji","events","onClickSkinToneButton","onEmojiClick","onNavClick","closestTarget","closest","groupId","parseInt","dataset","searchElement","onNavKeydown","doFocus","el","previousElementSibling","nextElementSibling","parentElement","firstElementChild","lastElementChild","onSearchKeydown","goToNextOrPrevious","previous","clickEmoji","onSkinToneOptionsClick","changeSkinTone","onSkinToneOptionsFocusOut","onSkinToneOptionsKeydown","changeActiveSkinTone","nextSkinTone","onSkinToneOptionsKeyup","onSearchInput","actions","calculateEmojiGridStyle","onUpdate","resizeObserver","getComputedStyle","newNumColumns","getPropertyValue","newIsRtl","observe","disconnect","updateOnIntersection","$1e5dc5e467331cb9$var$intersectionObserverAction","root","IntersectionObserver","rootMargin","threshold","isIntersecting","classList","toggle","firstRender","updateCustomEmoji","databaseCustomEmoji","$1e5dc5e467331cb9$var$render","container","html","$1e5dc5e467331cb9$var$createFramework","domInstances","domInstanceCacheKey","keyFunction","originalCacheKey","expressions","domInstancesForTokens","updateDomInstance","$1e5dc5e467331cb9$var$parseHtml","template","elementsToBindings","$1e5dc5e467331cb9$var$parse","htmlString","withinTag","withinAttribute","elementIndexCounter","elementIndexes","attributeValuePre","attributeValuePost","j","nextChar","pop","exec","expressionIndex","$1e5dc5e467331cb9$var$parseTemplate","innerHTML","dom","cloneNode","content","$1e5dc5e467331cb9$var$traverseAndSetupBindings","topLevelBindings","treeWalker","createTreeWalker","NodeFilter","SHOW_ELEMENT","elementIndex","nextNode","$1e5dc5e467331cb9$var$patch","expression","setAttribute","newNode","$1e5dc5e467331cb9$var$patchChildren","newChildren","needsRerender","$1e5dc5e467331cb9$var$doChildrenNeedRerender","parentNode","oldChild","oldChildrenCount","newChild","nextSibling","$1e5dc5e467331cb9$var$replaceChildren","replaceChildren","append","replaceWith","nodeValue","emojiList","prefix","rootDom","emojiWithCategory","ceil","forElementWithAttribute","querySelectorAll","getAttribute","eventName","listenerName","ref","removeChild","action","boundActions","WeakSet","level","handleDatabaseLoading","showingLoadingMessage","timeoutHandle","clearTimeout","updatePreferredSkinTone","fill","$1e5dc5e467331cb9$var$applySkinTone","zwjIndex","indexOf","substring","fromCodePoint","$1e5dc5e467331cb9$var$LIGHT_SKIN_TONE","endsWith","$1e5dc5e467331cb9$var$LIGHT_SKIN_TONE_MODIFIER","updateDefaultFavoriteEmojis","favs","updateFavorites","dbFavorites","favorites","summarizeEmojis","updateEmojis","getEmojisBySearchQuery","currentGroupId","getEmojisByGroup","resetScrollTopInRaf","tabpanelElement","scrollTop","isZwjSupported","filterEmojisByVersion","emojiSupportLevel","$1e5dc5e467331cb9$var$summarizeEmojisForUI","toSimpleSkinsMap","skin","emojiSummary","find","skinTonedUnicode","contains","relatedTarget","zwjEmojisToCheck","$1e5dc5e467331cb9$var$checkZwjSupport","baselineEmoji","allSupported","emojiWidth","supported","calculateCurrentEmojisWithCategories","categoriesToEmoji","trim","skinToneDropdown","once","$set","newState","$destroy","abort","disconnectedCallback","isConnected","catch","observedAttributes","attributeChangedCallback","attrName","oldValue","_set","up","toUpperCase","parseFloat","_dbCreate","$1e5dc5e467331cb9$var$definitions","$dec5faeb65064cfd$var$canManipulateViaTextNodes","input","nodeName","textarea","defineProperties","customElements","define","$dec5faeb65064cfd$export$2e2bcd8739ae039","selection","ieRange","collapse","select","execCommand","start","selectionStart","end","selectionEnd","setRangeText","textNode","createTextNode","offset","startNode","endNode","nodeLength","setStart","setEnd","deleteContents","commonAncestorContainer","insertNode","setSelectionRange","createEvent","initEvent","$636b0cf1ed0b9f88$var$c","r","t","Number","isNaN","min","max","$636b0cf1ed0b9f88$var$a","$636b0cf1ed0b9f88$var$d","$636b0cf1ed0b9f88$var$u","$636b0cf1ed0b9f88$export$cc30a98fe3890794","n","h","getSupportedConstraints","s","getTrackCapabilities","u","o","pan","tilt","zoom","torch","querySelector","m","c","d","l","isSupported","autoPlay","startVideoStream","stopVideoStream","removeEventListener","hasAttribute","toggleAttribute","noImage","facingMode","cameraResolution","toString","calculateFileSize","loading","capture","play","video","finally","removeAttribute","getVideoTracks","getTrackSettings","applyConstraints","advanced","assignedElements","flatten","ideal","audio","deviceId","navigator","mediaDevices","getUserMedia","srcObject","restartVideoStream","stop","videoWidth","videoHeight","drawImage","toDataURL","Image","src","alt","dataURI","blob","getCapabilities","getSettings","getVideoInputDevices","enumerateDevices","kind","defineCustomElement","$94933cc6427541bd$export$c37129e465f64ef0","canShare","$4f74a8126e204146$var$h","$4f74a8126e204146$var$r","$4f74a8126e204146$export$30b344bef3e55b67","delegatesFocus","disabled","part","shareUrl","shareTitle","shareText","shareFiles","share","title","files","shareData","$4da30046ce6d9325$var$n","$4da30046ce6d9325$var$r","$4da30046ce6d9325$export$32589115725b904b","showModal","body","preserveOverflow","overflow","hidden","noHeader","noAnimations","noCloseButton","g","staticBackdrop","fullscreen","placement","closeLabel","remove","defaultPrevented","currentTarget","hide","assignedNodes","cancelable","reason","show","$7aad62ebc3d6fae8$var$x","$7aad62ebc3d6fae8$var$b","$7aad62ebc3d6fae8$var$y","lastIndexOf","type","defineProperty","writable","configurable","enumerable","$7aad62ebc3d6fae8$var$g","path","webkitRelativePath","$7aad62ebc3d6fae8$var$m","readEntries","$7aad62ebc3d6fae8$var$w","$7aad62ebc3d6fae8$var$E","file","fullPath","$7aad62ebc3d6fae8$var$F","getAsEntry","webkitGetAsEntry","isFile","isDirectory","createReader","$7aad62ebc3d6fae8$var$f","$7aad62ebc3d6fae8$var$l","dataTransfer","items","$7aad62ebc3d6fae8$var$n","$7aad62ebc3d6fae8$var$v","$7aad62ebc3d6fae8$var$z","$7aad62ebc3d6fae8$var$S","$7aad62ebc3d6fae8$export$6ccd1735166caad9","accept","multiple","autoFocus","maxFiles","abs","maxSize","minSize","noStyle","Event","dropEffect","click","errors","$7aad62ebc3d6fae8$var$u","test","p","acceptedFiles","rejectedFiles","defaultValue","openFileDialog","$33dea9d9a6da4c9a$export$63e7bed68b07a85c","$21c3f3a8dccfa4fd$export$e2a22331486dcca0","suffix","randomString","random","$c3d7e05a1ce34ed5$export$6539e087749cf9d3","options","mimeType","File","filename","$f0a2ccd611c71db8$var$DEFAULT_STORAGE_PROVIDER","localStorage","$f0a2ccd611c71db8$export$ddcffe0146c8f882","keyPrefix","provider","sessionStorage","setItem","getItem","parse","$fbb55a96d78c7ba0$export$de75f46579dcf24","selectedImage","$eccf21b2da8f185e$exports","getBundleURL","$4e9367b4637ab0b3$exports","$98768b53aac35bcc$exports","$81873ad161a9f996$exports","$f1c993919e45d5c2$exports","$8f40b96e34825d38$exports","$51e3f333db254f7d$exports","$0d878777045f8608$exports","$da7f4261981c6446$exports","$553eebead4d87493$exports","$e4f4da01dd92f98a$exports","$055531bbd0af154c$export$6874249d87f2602a","label","weight","$055531bbd0af154c$export$59eceaef0c7797b2","FontFace","load","fonts","$166cfb2484b08c80$var$errorsContainer","$166cfb2484b08c80$var$hideError","evt","$166cfb2484b08c80$export$af04143326425dbd","types","div","className","$f0ee20a32c2bc385$var$defaultTextboxData","fillColor","strokeColor","fontSize","fontWeight","textAlign","shadowBlur","strokeWidth","offsetY","offsetX","rotate","allCaps","$f0ee20a32c2bc385$var$textboxes","$f0ee20a32c2bc385$export$8e3dca5fa4d5f04b","Date","now","textbox","getData","create","getById","fragment","createDocumentFragment","forEach","checked","textboxEl","$68e654e91d7a7392$export$8d01c972ee8b14a9","canvasEl","getDimensions","setDimensions","draw","image","textboxes","clearRect","fillRect","multiplier","save","strokeStyle","lineHeight","measureText","xPos","textLines","shadowOffsetX","shadowOffsetY","shadowColor","translate","PI","lineWidth","strokeText","restore","createInstance","$44ae6d9db4eaca0f$var$canvas","$44ae6d9db4eaca0f$var$videoModal","$44ae6d9db4eaca0f$var$downloadModal","$44ae6d9db4eaca0f$var$capturePhotoEl","$44ae6d9db4eaca0f$var$cameraSelect","$44ae6d9db4eaca0f$var$capturePhotoButton","$44ae6d9db4eaca0f$var$torchButton","$44ae6d9db4eaca0f$var$dropzoneEl","$44ae6d9db4eaca0f$var$instructionsEl","$44ae6d9db4eaca0f$var$imageUploadMethodSelect","$44ae6d9db4eaca0f$var$fileSelectBtn","$44ae6d9db4eaca0f$var$imageUrlForm","$44ae6d9db4eaca0f$var$addTextboxBtn","$44ae6d9db4eaca0f$var$textboxesContainer","$44ae6d9db4eaca0f$var$generateMemeBtn","$44ae6d9db4eaca0f$var$openVideoModalBtn","$44ae6d9db4eaca0f$var$downloadMemeBtn","$44ae6d9db4eaca0f$var$downloadMemePreview","$44ae6d9db4eaca0f$var$webShareComponent","$44ae6d9db4eaca0f$var$galleryEl","$44ae6d9db4eaca0f$var$gallerySearchEl","$44ae6d9db4eaca0f$var$galleryNoResultsEl","$44ae6d9db4eaca0f$var$solidColorForm","$44ae6d9db4eaca0f$var$uploadMethodEls","$44ae6d9db4eaca0f$var$removeConfirmationModal","$44ae6d9db4eaca0f$var$removeTextForm","$44ae6d9db4eaca0f$var$maxImageDimensionsForm","$44ae6d9db4eaca0f$var$maxImageDimensionsSelect","$44ae6d9db4eaca0f$var$clearCanvasBtn","$44ae6d9db4eaca0f$var$maxImageDimensionsFromStorage","$44ae6d9db4eaca0f$var$shouldFocusOnTextboxCreate","$44ae6d9db4eaca0f$var$selectedImage","$44ae6d9db4eaca0f$var$reqAnimFrame","$44ae6d9db4eaca0f$var$generateMeme","dataUrl","downloadLink","download","href","$44ae6d9db4eaca0f$var$setImageMaxDimensions","maxWidthValue","maxHeightValue","maxImageDimensionsSelect","MAX_WIDTH","MAX_HEIGHT","$44ae6d9db4eaca0f$var$afterImageSelect","$44ae6d9db4eaca0f$var$handleImageLoad","$44ae6d9db4eaca0f$var$handleFileSelect","reader","FileReader","readAsDataURL","$44ae6d9db4eaca0f$var$handleTextPropChange","textboxId","textboxData","$44ae6d9db4eaca0f$var$handleImageUploadFromURL","form","submitButton","imageUrl","$44ae6d9db4eaca0f$var$moveTextUsingArrowbuttons","direction","offsetYInput","offsetXInput","$44ae6d9db4eaca0f$var$handleGalleryClick","button","img","$44ae6d9db4eaca0f$var$toggleTorchButtonStatus","isTorchOn","iconPaths","display","$44ae6d9db4eaca0f$var$handleCapturePhotoVideoPlay","trackCapabilities","videoInputDevices","device","option","errorMessage","reset","idx","matches","textboxSettingsEl","currentTextboxEl","currentTextboxData","textboxToDelete","textboxIdInput","cancelAnimationFrame","galleryItems","videoDeviceId","$44ae6d9db4eaca0f$var$renderAcceptedImageFormats","acceptedMimeTypes","rootEl","extensions","small","browserSupportsTextareaTextNodes","canManipulateViaTextNodes","isSuccess","clamp","lower","upper","COMPONENT_NAME","styles","CapturePhoto","_CapturePhoto","#supportedConstraints","#stream","#canvasElement","#outputElement","#videoElement","#captureButtonSlot","#captureButton","#emptyOutputElement","panInAllowedRange","#applyConstraint","tiltInAllowedRange","zoomInAllowedRange","#upgradeProperty","#getCaptureButton","#onVideoLoadedMetaData","#onCaptureButtonSlotChange","#onCapturePhotoButtonClick","constraint","track","trackSettings","constraintValue","instance","videoInputId","constraints","x","eventDetail","elementName","isWebShareSupported","WebShare","_WebShare","#buttonSlot","#buttonEl","#files","#getButton","#handleSlotChange","#handleClick","ModalElement","_ModalElement","#dialogEl","#footerSlotEl","#closeSlotEl","#pulseAnimationTimeout","headerEl","closeBtnEl","#updateCloseLabel","#handleDialogClick","#handleDialogClose","#handleDialogCancel","#handleCloseButtonClick","#handleFooterSlotChange","#handleCloseSlotChange","closeButtonEl","#applyPulseEffectOnDialog","requestCloseEvent","#createRequestCloseEvent","footerEl","footerSlotNodes","hasFooterSlotNodes","isValidFile","acceptedTypeSpecifiers","acceptedMimeTypesList","v","fileMimeType","baseMimeType","validType","COMMON_MIME_TYPES","FILES_TO_IGNORE","toFileWithMimeType","extension","toFileWithPath","fileWithMimeType","readEntriesPromise","directoryReader","readAllDirectoryEntries","getFileFromFileEntry","fileEntry","getFilesFromDataTransferItemList","dataTransferItemList","entry","getFilesFromFileList","fileList","getFilesFromEvent","TOO_MANY_FILES","FILE_TOO_LARGE","FILE_TOO_SMALL","INVALID_MIME_TYPE","FilesDropzone","_FilesDropzone","#fileInput","#dropzoneEl","#handleFileInputChange","#handleDragEnter","#handleDragOver","#handleDragLeave","#handleDrop","#handleKeyUp","num","#handleFilesSelect","filesLength","fileHasValidType","fileExceedsMaxSize","fileIsSmallerThanMinSize"],"version":3,"file":"index.9a005d69.js.map"} \ No newline at end of file diff --git a/index.f1f30278.css b/index.b4cc57ad.css similarity index 97% rename from index.f1f30278.css rename to index.b4cc57ad.css index 7baf97d..3c70f3c 100644 --- a/index.f1f30278.css +++ b/index.b4cc57ad.css @@ -1,2 +1,2 @@ -:root,[data-bs-theme=light]{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-primary-text-emphasis:#052c65;--bs-secondary-text-emphasis:#2b2f32;--bs-success-text-emphasis:#0a3622;--bs-info-text-emphasis:#055160;--bs-warning-text-emphasis:#664d03;--bs-danger-text-emphasis:#58151c;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#cfe2ff;--bs-secondary-bg-subtle:#e2e3e5;--bs-success-bg-subtle:#d1e7dd;--bs-info-bg-subtle:#cff4fc;--bs-warning-bg-subtle:#fff3cd;--bs-danger-bg-subtle:#f8d7da;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#9ec5fe;--bs-secondary-border-subtle:#c4c8cb;--bs-success-border-subtle:#a3cfbb;--bs-info-border-subtle:#9eeaf9;--bs-warning-border-subtle:#ffe69c;--bs-danger-border-subtle:#f1aeb5;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg,#ffffff26,#fff0);--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33,37,41;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:#212529bf;--bs-secondary-color-rgb:33,37,41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:#21252980;--bs-tertiary-color-rgb:33,37,41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13,110,253;--bs-link-decoration:underline;--bs-link-hover-color:#0a58ca;--bs-link-hover-color-rgb:10,88,202;--bs-code-color:#d63384;--bs-highlight-color:#212529;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:#0000002d;--bs-border-radius:.375rem;--bs-border-radius-sm:.25rem;--bs-border-radius-lg:.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 .5rem 1rem #00000026;--bs-box-shadow-sm:0 .125rem .25rem #00000013;--bs-box-shadow-lg:0 1rem 3rem #0000002d;--bs-box-shadow-inset:inset 0 1px 2px #00000013;--bs-focus-ring-width:.25rem;--bs-focus-ring-opacity:.25;--bs-focus-ring-color:#0d6efd40;--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}[data-bs-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:#dee2e6bf;--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:#dee2e680;--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#6ea8fe;--bs-secondary-text-emphasis:#a7acb1;--bs-success-text-emphasis:#75b798;--bs-info-text-emphasis:#6edff6;--bs-warning-text-emphasis:#ffda6a;--bs-danger-text-emphasis:#ea868f;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#031633;--bs-secondary-bg-subtle:#161719;--bs-success-bg-subtle:#051b11;--bs-info-bg-subtle:#032830;--bs-warning-bg-subtle:#332701;--bs-danger-bg-subtle:#2c0b0e;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#084298;--bs-secondary-border-subtle:#41464b;--bs-success-border-subtle:#0f5132;--bs-info-border-subtle:#087990;--bs-warning-border-subtle:#997404;--bs-danger-border-subtle:#842029;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-color:#6ea8fe;--bs-link-hover-color:#8bb9fe;--bs-link-color-rgb:110,168,254;--bs-link-hover-color-rgb:139,185,254;--bs-code-color:#e685b5;--bs-highlight-color:#dee2e6;--bs-highlight-bg:#664d03;--bs-border-color:#495057;--bs-border-color-translucent:#ffffff26;--bs-form-valid-color:#75b798;--bs-form-valid-border-color:#75b798;--bs-form-invalid-color:#ea868f;--bs-form-invalid-border-color:#ea868f}*,:after,:before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent;margin:0}hr{color:inherit;border:0;border-top:var(--bs-border-width)solid;opacity:.25;margin:1rem 0}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:var(--bs-heading-color);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}address{font-style:normal;line-height:inherit;margin-bottom:1rem}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg);padding:.1875em}sub,sup{vertical-align:baseline;font-size:.75em;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:underline}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{margin-top:0;margin-bottom:1rem;font-size:.875em;display:block;overflow:auto}pre code{font-size:inherit;color:inherit;word-break:normal}code{color:var(--bs-code-color);word-wrap:break-word;font-size:.875em}a>code{color:inherit}kbd{color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem;padding:.1875rem .375rem;font-size:.875em}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{color:var(--bs-secondary-color);text-align:left;padding-top:.5rem;padding-bottom:.5rem}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;margin:0}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{border-style:none;padding:0}textarea{resize:vertical}fieldset{border:0;min-width:0;margin:0;padding:0}legend{float:left;font-size:calc(1.275rem + .3vw);line-height:inherit;width:100%;margin-bottom:.5rem;padding:0}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field{padding:0}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit-hour-field{padding:0}::-webkit-datetime-edit-minute{padding:0}::-webkit-datetime-edit-month-field{padding:0}::-webkit-datetime-edit-text{padding:0}::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{cursor:pointer;display:list-item}progress{vertical-align:baseline}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled,.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{text-transform:uppercase;font-size:.875em}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{color:#6c757d;margin-top:-1rem;margin-bottom:1rem;font-size:.875em}.blockquote-footer:before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{background-color:var(--bs-body-bg);border:var(--bs-border-width)solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto;padding:.25rem}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{color:var(--bs-secondary-color);font-size:.875em}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);width:100%;margin-left:auto;margin-right:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;margin-top:calc(-1*var(--bs-gutter-y));margin-right:calc(-.5*var(--bs-gutter-x));margin-left:calc(-.5*var(--bs-gutter-x));flex-wrap:wrap;display:flex}.row>*{padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-top:var(--bs-gutter-y);flex-shrink:0;width:100%;max-width:100%}.col{flex:1 0}.row-cols-auto>*{flex:none;width:auto}.row-cols-1>*{flex:none;width:100%}.row-cols-2>*{flex:none;width:50%}.row-cols-3>*{flex:none;width:33.3333%}.row-cols-4>*{flex:none;width:25%}.row-cols-5>*{flex:none;width:20%}.row-cols-6>*{flex:none;width:16.6667%}.col-auto{flex:none;width:auto}.col-1{flex:none;width:8.33333%}.col-2{flex:none;width:16.6667%}.col-3{flex:none;width:25%}.col-4{flex:none;width:33.3333%}.col-5{flex:none;width:41.6667%}.col-6{flex:none;width:50%}.col-7{flex:none;width:58.3333%}.col-8{flex:none;width:66.6667%}.col-9{flex:none;width:75%}.col-10{flex:none;width:83.3333%}.col-11{flex:none;width:91.6667%}.col-12{flex:none;width:100%}.offset-1{margin-left:8.33333%}.offset-2{margin-left:16.6667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333%}.offset-5{margin-left:41.6667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333%}.offset-8{margin-left:66.6667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333%}.offset-11{margin-left:91.6667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:.25rem}.g-1,.gy-1{--bs-gutter-y:.25rem}.g-2,.gx-2{--bs-gutter-x:.5rem}.g-2,.gy-2{--bs-gutter-y:.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0}.row-cols-sm-auto>*{flex:none;width:auto}.row-cols-sm-1>*{flex:none;width:100%}.row-cols-sm-2>*{flex:none;width:50%}.row-cols-sm-3>*{flex:none;width:33.3333%}.row-cols-sm-4>*{flex:none;width:25%}.row-cols-sm-5>*{flex:none;width:20%}.row-cols-sm-6>*{flex:none;width:16.6667%}.col-sm-auto{flex:none;width:auto}.col-sm-1{flex:none;width:8.33333%}.col-sm-2{flex:none;width:16.6667%}.col-sm-3{flex:none;width:25%}.col-sm-4{flex:none;width:33.3333%}.col-sm-5{flex:none;width:41.6667%}.col-sm-6{flex:none;width:50%}.col-sm-7{flex:none;width:58.3333%}.col-sm-8{flex:none;width:66.6667%}.col-sm-9{flex:none;width:75%}.col-sm-10{flex:none;width:83.3333%}.col-sm-11{flex:none;width:91.6667%}.col-sm-12{flex:none;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.6667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333%}.offset-sm-5{margin-left:41.6667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333%}.offset-sm-8{margin-left:66.6667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333%}.offset-sm-11{margin-left:91.6667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0}.row-cols-md-auto>*{flex:none;width:auto}.row-cols-md-1>*{flex:none;width:100%}.row-cols-md-2>*{flex:none;width:50%}.row-cols-md-3>*{flex:none;width:33.3333%}.row-cols-md-4>*{flex:none;width:25%}.row-cols-md-5>*{flex:none;width:20%}.row-cols-md-6>*{flex:none;width:16.6667%}.col-md-auto{flex:none;width:auto}.col-md-1{flex:none;width:8.33333%}.col-md-2{flex:none;width:16.6667%}.col-md-3{flex:none;width:25%}.col-md-4{flex:none;width:33.3333%}.col-md-5{flex:none;width:41.6667%}.col-md-6{flex:none;width:50%}.col-md-7{flex:none;width:58.3333%}.col-md-8{flex:none;width:66.6667%}.col-md-9{flex:none;width:75%}.col-md-10{flex:none;width:83.3333%}.col-md-11{flex:none;width:91.6667%}.col-md-12{flex:none;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.6667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333%}.offset-md-5{margin-left:41.6667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333%}.offset-md-8{margin-left:66.6667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333%}.offset-md-11{margin-left:91.6667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0}.row-cols-lg-auto>*{flex:none;width:auto}.row-cols-lg-1>*{flex:none;width:100%}.row-cols-lg-2>*{flex:none;width:50%}.row-cols-lg-3>*{flex:none;width:33.3333%}.row-cols-lg-4>*{flex:none;width:25%}.row-cols-lg-5>*{flex:none;width:20%}.row-cols-lg-6>*{flex:none;width:16.6667%}.col-lg-auto{flex:none;width:auto}.col-lg-1{flex:none;width:8.33333%}.col-lg-2{flex:none;width:16.6667%}.col-lg-3{flex:none;width:25%}.col-lg-4{flex:none;width:33.3333%}.col-lg-5{flex:none;width:41.6667%}.col-lg-6{flex:none;width:50%}.col-lg-7{flex:none;width:58.3333%}.col-lg-8{flex:none;width:66.6667%}.col-lg-9{flex:none;width:75%}.col-lg-10{flex:none;width:83.3333%}.col-lg-11{flex:none;width:91.6667%}.col-lg-12{flex:none;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.6667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333%}.offset-lg-5{margin-left:41.6667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333%}.offset-lg-8{margin-left:66.6667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333%}.offset-lg-11{margin-left:91.6667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0}.row-cols-xl-auto>*{flex:none;width:auto}.row-cols-xl-1>*{flex:none;width:100%}.row-cols-xl-2>*{flex:none;width:50%}.row-cols-xl-3>*{flex:none;width:33.3333%}.row-cols-xl-4>*{flex:none;width:25%}.row-cols-xl-5>*{flex:none;width:20%}.row-cols-xl-6>*{flex:none;width:16.6667%}.col-xl-auto{flex:none;width:auto}.col-xl-1{flex:none;width:8.33333%}.col-xl-2{flex:none;width:16.6667%}.col-xl-3{flex:none;width:25%}.col-xl-4{flex:none;width:33.3333%}.col-xl-5{flex:none;width:41.6667%}.col-xl-6{flex:none;width:50%}.col-xl-7{flex:none;width:58.3333%}.col-xl-8{flex:none;width:66.6667%}.col-xl-9{flex:none;width:75%}.col-xl-10{flex:none;width:83.3333%}.col-xl-11{flex:none;width:91.6667%}.col-xl-12{flex:none;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.6667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333%}.offset-xl-5{margin-left:41.6667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333%}.offset-xl-8{margin-left:66.6667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333%}.offset-xl-11{margin-left:91.6667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0}.row-cols-xxl-auto>*{flex:none;width:auto}.row-cols-xxl-1>*{flex:none;width:100%}.row-cols-xxl-2>*{flex:none;width:50%}.row-cols-xxl-3>*{flex:none;width:33.3333%}.row-cols-xxl-4>*{flex:none;width:25%}.row-cols-xxl-5>*{flex:none;width:20%}.row-cols-xxl-6>*{flex:none;width:16.6667%}.col-xxl-auto{flex:none;width:auto}.col-xxl-1{flex:none;width:8.33333%}.col-xxl-2{flex:none;width:16.6667%}.col-xxl-3{flex:none;width:25%}.col-xxl-4{flex:none;width:33.3333%}.col-xxl-5{flex:none;width:41.6667%}.col-xxl-6{flex:none;width:50%}.col-xxl-7{flex:none;width:58.3333%}.col-xxl-8{flex:none;width:66.6667%}.col-xxl-9{flex:none;width:75%}.col-xxl-10{flex:none;width:83.3333%}.col-xxl-11{flex:none;width:91.6667%}.col-xxl-12{flex:none;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333%}.offset-xxl-2{margin-left:16.6667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.3333%}.offset-xxl-5{margin-left:41.6667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.3333%}.offset-xxl-8{margin-left:66.6667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.3333%}.offset-xxl-11{margin-left:91.6667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color-type:initial;--bs-table-bg-type:initial;--bs-table-color-state:initial;--bs-table-bg-state:initial;--bs-table-color:var(--bs-emphasis-color);--bs-table-bg:var(--bs-body-bg);--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-emphasis-color);--bs-table-striped-bg:rgba(var(--bs-emphasis-color-rgb),.05);--bs-table-active-color:var(--bs-emphasis-color);--bs-table-active-bg:rgba(var(--bs-emphasis-color-rgb),.1);--bs-table-hover-color:var(--bs-emphasis-color);--bs-table-hover-bg:rgba(var(--bs-emphasis-color-rgb),.075);vertical-align:top;border-color:var(--bs-table-border-color);width:100%;margin-bottom:1rem}.table>:not(caption)>*>*{color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)));padding:.5rem}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width)*2)solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width)0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*,.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-active{--bs-table-color-state:var(--bs-table-active-color);--bs-table-bg-state:var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state:var(--bs-table-hover-color);--bs-table-bg-state:var(--bs-table-hover-bg)}.table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#a6b5cc;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#b5b6b7;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#a7b9b1;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#a6c3ca;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#ccc2a4;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#c6acae;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#c6c7c8;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#4d5154;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{-webkit-overflow-scrolling:touch;overflow-x:auto}@media (max-width:575.98px){.table-responsive-sm{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (max-width:767.98px){.table-responsive-md{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (max-width:991.98px){.table-responsive-lg{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (max-width:1199.98px){.table-responsive-xl{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (max-width:1399.98px){.table-responsive-xxl{-webkit-overflow-scrolling:touch;overflow-x:auto}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));font-size:inherit;margin-bottom:0;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{color:var(--bs-secondary-color);margin-top:.25rem;font-size:.875em}.form-control{color:var(--bs-body-color);appearance:none;background-color:var(--bs-body-bg);border:var(--bs-border-width)solid var(--bs-border-color);border-radius:var(--bs-border-radius);background-clip:padding-box;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;display:block}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{padding:0;display:block}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::-webkit-file-upload-button{-webkit-margin-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);margin:-.375rem -.75rem;border-radius:0;margin-inline-end:.75rem;padding:.375rem .75rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{-webkit-margin-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;margin:-.375rem -.75rem;margin-inline-end:.75rem;padding:.375rem .75rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:var(--bs-secondary-bg)}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{color:var(--bs-body-color);border:solid #0000;border-width:var(--bs-border-width)0;background-color:#0000;width:100%;margin-bottom:0;padding:.375rem 0;line-height:1.5;display:block}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-left:0;padding-right:0}.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width)*2));border-radius:var(--bs-border-radius-sm);padding:.25rem .5rem;font-size:.875rem}.form-control-sm::file-selector-button{-webkit-margin-end:.5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem;padding:.25rem .5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width)*2));border-radius:var(--bs-border-radius-lg);padding:.5rem 1rem;font-size:1.25rem}.form-control-lg::file-selector-button{-webkit-margin-end:1rem;margin:-.5rem -1rem;margin-inline-end:1rem;padding:.5rem 1rem}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width)*2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width)*2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width)*2))}.form-control-color{height:calc(1.5em + .75rem + calc(var(--bs-border-width)*2));width:3rem;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border-radius:var(--bs-border-radius);border:0!important}.form-control-color::-webkit-color-swatch{border-radius:var(--bs-border-radius);border:0!important}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width)*2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width)*2))}.form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");color:var(--bs-body-color);appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon,none);border:var(--bs-border-width)solid var(--bs-border-color);border-radius:var(--bs-border-radius);background-position:right .75rem center;background-repeat:no-repeat;background-size:16px 12px;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;display:block}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-select[multiple],.form-select[size]:not([size="1"]){background-image:none;padding-right:.75rem}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:#0000;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{border-radius:var(--bs-border-radius-sm);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{border-radius:var(--bs-border-radius-lg);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{min-height:1.5rem;margin-bottom:.125rem;padding-left:1.5em;display:block}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{text-align:right;padding-left:0;padding-right:1.5em}.form-check-reverse .form-check-input{float:right;margin-left:0;margin-right:-1.5em}.form-check-input{--bs-form-check-bg:var(--bs-body-bg);vertical-align:top;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);border:var(--bs-border-width)solid var(--bs-border-color);-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact;background-position:50%;background-repeat:no-repeat;background-size:contain;flex-shrink:0;width:1em;height:1em;margin-top:.25em}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e");background-color:#0d6efd;border-color:#0d6efd}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-image:var(--bs-form-switch-bg);background-position:0;border-radius:2em;width:2em;margin-left:-2.5em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e");background-position:100%}.form-switch.form-check-reverse{padding-left:0;padding-right:2.5em}.form-switch.form-check-reverse .form-check-input{margin-left:0;margin-right:-2.5em}.form-check-inline{margin-right:1rem;display:inline-block}.btn-check{clip:rect(0,0,0,0);pointer-events:none;position:absolute}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{appearance:none;background-color:#0000;width:100%;height:1.5rem;padding:0}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;width:1rem;height:1rem;margin-top:-.25rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{color:#0000;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:#0000;border-radius:1rem;width:100%;height:.5rem}.form-range::-moz-range-thumb{appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;width:1rem;height:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{color:#0000;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:#0000;border-radius:1rem;width:100%;height:.5rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width)*2));min-height:calc(3.5rem + calc(var(--bs-border-width)*2));line-height:1.25}.form-floating>label{z-index:2;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width)solid transparent;transform-origin:0 0;height:100%;padding:1rem .75rem;transition:opacity .1s ease-in-out,transform .1s ease-in-out;position:absolute;top:0;left:0;overflow:hidden}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::-moz-placeholder{color:#0000}.form-floating>.form-control::-moz-placeholder{color:#0000}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:#0000}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}:-webkit-any(.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:not(:placeholder-shown)){padding-top:1.625rem;padding-bottom:.625rem}:-webkit-any(.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill){padding-top:1.625rem;padding-bottom:.625rem}:-webkit-any(.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:not(:placeholder-shown)),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),:-webkit-any(.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill),.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}:is(.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:not(:placeholder-shown)),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),:is(.form-floating>.form-control-plaintext:autofill,.form-floating>.form-control:autofill),.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85)translateY(-.5rem)translate(.15rem)}.form-floating>.form-control:not(:placeholder-shown)~label:after,.form-floating>.form-control-plaintext~label:after,.form-floating>.form-control:focus~label:after,.form-floating>.form-control:not(:placeholder-shown)~label:after,.form-floating>.form-select~label:after{z-index:-1;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius);height:1.5em;position:absolute;inset:1rem .375rem}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85)translateY(-.5rem)translate(.15rem)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width)0}.form-floating>.form-control:disabled~label,.form-floating>:disabled~label{color:#6c757d}.form-floating>.form-control:disabled~label:after,.form-floating>:disabled~label:after{background-color:var(--bs-secondary-bg)}.input-group{flex-wrap:wrap;align-items:stretch;width:100%;display:flex;position:relative}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{flex:auto;width:1%;min-width:0;position:relative}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{z-index:2;position:relative}.input-group .btn:focus{z-index:5}.input-group-text{color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width)solid var(--bs-border-color);border-radius:var(--bs-border-radius);align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;display:flex}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{border-radius:var(--bs-border-radius-lg);padding:.5rem 1rem;font-size:1.25rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{border-radius:var(--bs-border-radius-sm);padding:.25rem .5rem;font-size:.875rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(var(--bs-border-width)*-1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{color:var(--bs-form-valid-color);width:100%;margin-top:.25rem;font-size:.875em;display:none}.valid-tooltip{z-index:5;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius);max-width:100%;margin-top:.1rem;padding:.25rem .5rem;font-size:.875rem;display:none;position:absolute;top:100%}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:var(--bs-form-valid-border-color);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);padding-right:calc(1.5em + .75rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{background-position:right calc(.375em + .1875rem) top calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:var(--bs-form-valid-border-color)}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,right 2.25rem center;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem);padding-right:4.125rem}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(1.5em + 3.75rem)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:var(--bs-form-valid-border-color)}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:var(--bs-form-valid-color)}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{color:var(--bs-form-invalid-color);width:100%;margin-top:.25rem;font-size:.875em;display:none}.invalid-tooltip{z-index:5;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius);max-width:100%;margin-top:.1rem;padding:.25rem .5rem;font-size:.875rem;display:none;position:absolute;top:100%}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:var(--bs-form-invalid-border-color);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);padding-right:calc(1.5em + .75rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{background-position:right calc(.375em + .1875rem) top calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:var(--bs-form-invalid-border-color)}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,right 2.25rem center;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem);padding-right:4.125rem}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(1.5em + 3.75rem)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:var(--bs-form-invalid-border-color)}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:var(--bs-form-invalid-color)}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--bs-btn-padding-x:.75rem;--bs-btn-padding-y:.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:transparent;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 #ffffff26,0 1px 1px #00000013;--bs-btn-disabled-opacity:.65;--bs-btn-focus-box-shadow:0 0 0 .25rem rgba(var(--bs-btn-focus-shadow-rgb),.5);padding:var(--bs-btn-padding-y)var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;vertical-align:middle;cursor:pointer;-webkit-user-select:none;user-select:none;border:var(--bs-btn-border-width)solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;display:inline-block}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);box-shadow:var(--bs-btn-focus-box-shadow);outline:0}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);box-shadow:var(--bs-btn-focus-box-shadow);outline:0}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn-check:checked:focus-visible+.btn{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49,132,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130,138,145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60,153,110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11,172,204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217,164,6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225,83,97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211,212,213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66,70,73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13,110,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108,117,125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25,135,84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13,202,240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255,193,7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220,53,69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248,249,250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33,37,41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212529;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:49,132,253;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:var(--bs-border-radius-lg)}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:.25rem;--bs-btn-padding-x:.5rem;--bs-btn-font-size:.875rem;--bs-btn-border-radius:var(--bs-border-radius-sm)}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;transition:height .35s;overflow:hidden}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{vertical-align:.255em;content:"";border:.3em solid #0000;border-top-color:currentColor;border-bottom:0;margin-left:.255em;display:inline-block}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:.5rem;--bs-dropdown-spacer:.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:var(--bs-body-color);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:var(--bs-border-radius);--bs-dropdown-border-width:var(--bs-border-width);--bs-dropdown-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:.5rem;--bs-dropdown-box-shadow:var(--bs-box-shadow);--bs-dropdown-link-color:var(--bs-body-color);--bs-dropdown-link-hover-color:var(--bs-body-color);--bs-dropdown-link-hover-bg:var(--bs-tertiary-bg);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:var(--bs-tertiary-color);--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:.5rem;z-index:var(--bs-dropdown-zindex);min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y)var(--bs-dropdown-padding-x);font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;background-color:var(--bs-dropdown-bg);border:var(--bs-dropdown-border-width)solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius);background-clip:padding-box;margin:0;list-style:none;display:none;position:absolute}.dropdown-menu[data-bs-popper]{margin-top:var(--bs-dropdown-spacer);top:100%;left:0}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{left:auto;right:0}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{left:auto;right:0}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{left:auto;right:0}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{left:auto;right:0}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{left:auto;right:0}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{left:auto;right:0}}.dropup .dropdown-menu[data-bs-popper]{margin-top:0;margin-bottom:var(--bs-dropdown-spacer);top:auto;bottom:100%}.dropup .dropdown-toggle:after{vertical-align:.255em;content:"";border:.3em solid #0000;border-top:0;border-bottom-color:currentColor;margin-left:.255em;display:inline-block}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{margin-top:0;margin-left:var(--bs-dropdown-spacer);top:0;left:100%;right:auto}.dropend .dropdown-toggle:after{vertical-align:.255em;content:"";border:.3em solid #0000;border-left-color:currentColor;border-right:0;margin-left:.255em;display:inline-block}.dropend .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-toggle:after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{margin-top:0;margin-right:var(--bs-dropdown-spacer);top:0;left:auto;right:100%}.dropstart .dropdown-toggle:after{vertical-align:.255em;content:"";margin-left:.255em;display:none}.dropstart .dropdown-toggle:before{vertical-align:.255em;content:"";border-top:.3em solid #0000;border-bottom:.3em solid #0000;border-right:.3em solid;margin-right:.255em;display:inline-block}.dropstart .dropdown-toggle:empty:after{margin-left:0}.dropstart .dropdown-toggle:before{vertical-align:0}.dropdown-divider{margin:var(--bs-dropdown-divider-margin-y)0;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1;height:0;overflow:hidden}.dropdown-item{padding:var(--bs-dropdown-item-padding-y)var(--bs-dropdown-item-padding-x);clear:both;color:var(--bs-dropdown-link-color);text-align:inherit;white-space:nowrap;border-radius:var(--bs-dropdown-item-border-radius,0);background-color:#0000;border:0;width:100%;font-weight:400;text-decoration:none;display:block}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);background-color:var(--bs-dropdown-link-active-bg);text-decoration:none}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:#0000}.dropdown-menu.show{display:block}.dropdown-header{padding:var(--bs-dropdown-header-padding-y)var(--bs-dropdown-header-padding-x);color:var(--bs-dropdown-header-color);white-space:nowrap;margin-bottom:0;font-size:.875rem;display:block}.dropdown-item-text{padding:var(--bs-dropdown-item-padding-y)var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color);display:block}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:#ffffff26;--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{vertical-align:middle;display:inline-flex;position:relative}.btn-group-vertical>.btn,.btn-group>.btn{flex:auto;position:relative}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{flex-wrap:wrap;justify-content:flex-start;display:flex}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--bs-border-radius)}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:calc(var(--bs-border-width)*-1)}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-left:.5625rem;padding-right:.5625rem}.dropdown-toggle-split:after,.dropend .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropstart .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-left:.375rem;padding-right:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-left:.75rem;padding-right:.75rem}.btn-group-vertical{flex-direction:column;justify-content:center;align-items:flex-start}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:calc(var(--bs-border-width)*-1)}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:var(--bs-secondary-color);flex-wrap:wrap;margin-bottom:0;padding-left:0;list-style:none;display:flex}.nav-link{padding:var(--bs-nav-link-padding-y)var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);background:0 0;border:0;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out;display:block}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:var(--bs-border-width);--bs-nav-tabs-border-color:var(--bs-border-color);--bs-nav-tabs-border-radius:var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color:var(--bs-secondary-bg)var(--bs-secondary-bg)var(--bs-border-color);--bs-nav-tabs-link-active-color:var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg:var(--bs-body-bg);--bs-nav-tabs-link-active-border-color:var(--bs-border-color)var(--bs-border-color)var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width)solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width)solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:var(--bs-border-radius);--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap:1rem;--bs-nav-underline-border-width:.125rem;--bs-nav-underline-link-active-color:var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{border-bottom:var(--bs-nav-underline-border-width)solid transparent;padding-left:0;padding-right:0}.nav-underline .nav-link:focus,.nav-underline .nav-link:hover{border-bottom-color:currentColor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentColor;font-weight:700}.nav-fill .nav-item,.nav-fill>.nav-link{text-align:center;flex:auto}.nav-justified .nav-item,.nav-justified>.nav-link{text-align:center;flex-grow:1;flex-basis:0}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:.5rem;--bs-navbar-color:rgba(var(--bs-emphasis-color-rgb),.65);--bs-navbar-hover-color:rgba(var(--bs-emphasis-color-rgb),.8);--bs-navbar-disabled-color:rgba(var(--bs-emphasis-color-rgb),.3);--bs-navbar-active-color:rgba(var(--bs-emphasis-color-rgb),1);--bs-navbar-brand-padding-y:.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(var(--bs-emphasis-color-rgb),1);--bs-navbar-brand-hover-color:rgba(var(--bs-emphasis-color-rgb),1);--bs-navbar-nav-link-padding-x:.5rem;--bs-navbar-toggler-padding-y:.25rem;--bs-navbar-toggler-padding-x:.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(var(--bs-emphasis-color-rgb),.15);--bs-navbar-toggler-border-radius:var(--bs-border-radius);--bs-navbar-toggler-focus-width:.25rem;--bs-navbar-toggler-transition:box-shadow .15s ease-in-out;padding:var(--bs-navbar-padding-y)var(--bs-navbar-padding-x);flex-wrap:wrap;justify-content:space-between;align-items:center;display:flex;position:relative}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{flex-wrap:inherit;justify-content:space-between;align-items:center;display:flex}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);white-space:nowrap;text-decoration:none}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);flex-direction:column;margin-bottom:0;padding-left:0;list-style:none;display:flex}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{color:var(--bs-navbar-color);padding-top:.5rem;padding-bottom:.5rem}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-grow:1;flex-basis:100%;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y)var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);color:var(--bs-navbar-color);border:var(--bs-border-width)solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition);background-color:#0000;line-height:1}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width);outline:0;text-decoration:none}.navbar-toggler-icon{vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-position:50%;background-repeat:no-repeat;background-size:100%;width:1.5em;height:1.5em;display:inline-block}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color:#ffffff8c;--bs-navbar-hover-color:#ffffffbf;--bs-navbar-disabled-color:#ffffff40;--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:#ffffff1a;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width:var(--bs-border-width);--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y:.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(var(--bs-body-color-rgb),.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:var(--bs-body-bg);--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:.75rem;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);border:var(--bs-card-border-width)solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius);background-clip:border-box;flex-direction:column;min-width:0;display:flex;position:relative}.card>hr{margin-left:0;margin-right:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius);border-top-width:0}.card>.list-group:last-child{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius);border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{padding:var(--bs-card-spacer-y)var(--bs-card-spacer-x);color:var(--bs-card-color);flex:auto}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5*var(--bs-card-title-spacer-y));color:var(--bs-card-subtitle-color);margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y)var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width)solid var(--bs-card-border-color);margin-bottom:0}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius)var(--bs-card-inner-border-radius)0 0}.card-footer{padding:var(--bs-card-cap-padding-y)var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width)solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius)var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5*var(--bs-card-cap-padding-x));margin-left:calc(-.5*var(--bs-card-cap-padding-x))}.card-img-overlay{padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius);position:absolute;inset:0}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width:576px){.card-group{flex-flow:wrap;display:flex}.card-group>.card{flex:1 0;margin-bottom:0}.card-group>.card+.card{border-left:0;margin-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:var(--bs-body-bg);--bs-accordion-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:var(--bs-border-width);--bs-accordion-border-radius:var(--bs-border-radius);--bs-accordion-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform .2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23052c65' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-focus-box-shadow:0 0 0 .25rem #0d6efd40;--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:var(--bs-primary-text-emphasis);--bs-accordion-active-bg:var(--bs-primary-bg-subtle)}.accordion-button{padding:var(--bs-accordion-btn-padding-y)var(--bs-accordion-btn-padding-x);color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);overflow-anchor:none;transition:var(--bs-accordion-transition);border:0;border-radius:0;align-items:center;width:100%;font-size:1rem;display:flex;position:relative}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width))0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed):after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button:after{width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition);flex-shrink:0;margin-left:auto}@media (prefers-reduced-motion:reduce){.accordion-button:after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;box-shadow:var(--bs-accordion-btn-focus-box-shadow);outline:0}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width)solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type>.accordion-header .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type>.accordion-header .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type>.accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y)var(--bs-accordion-body-padding-x)}.accordion-flush>.accordion-item{border-left:0;border-right:0;border-radius:0}.accordion-flush>.accordion-item:first-child{border-top:0}.accordion-flush>.accordion-item:last-child{border-bottom:0}.accordion-flush>.accordion-item>.accordion-header .accordion-button,.accordion-flush>.accordion-item>.accordion-header .accordion-button.collapsed,.accordion-flush>.accordion-item>.accordion-collapse{border-radius:0}[data-bs-theme=dark] .accordion-button:after{--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:var(--bs-secondary-color);--bs-breadcrumb-item-padding-x:.5rem;--bs-breadcrumb-item-active-color:var(--bs-secondary-color);padding:var(--bs-breadcrumb-padding-y)var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius);flex-wrap:wrap;list-style:none;display:flex}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider,"/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:.75rem;--bs-pagination-padding-y:.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:var(--bs-body-bg);--bs-pagination-border-width:var(--bs-border-width);--bs-pagination-border-color:var(--bs-border-color);--bs-pagination-border-radius:var(--bs-border-radius);--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:var(--bs-tertiary-bg);--bs-pagination-hover-border-color:var(--bs-border-color);--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:var(--bs-secondary-bg);--bs-pagination-focus-box-shadow:0 0 0 .25rem #0d6efd40;--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--bs-pagination-disabled-color:var(--bs-secondary-color);--bs-pagination-disabled-bg:var(--bs-secondary-bg);--bs-pagination-disabled-border-color:var(--bs-border-color);padding-left:0;list-style:none;display:flex}.page-link{padding:var(--bs-pagination-padding-y)var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width)solid var(--bs-pagination-border-color);text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;display:block;position:relative}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);box-shadow:var(--bs-pagination-focus-box-shadow);outline:0}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(var(--bs-border-width)*-1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x:.5rem;--bs-pagination-padding-y:.25rem;--bs-pagination-font-size:.875rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x:.65em;--bs-badge-padding-y:.35em;--bs-badge-font-size:.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:var(--bs-border-radius);padding:var(--bs-badge-padding-y)var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius);line-height:1;display:inline-block}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:var(--bs-border-width)solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;padding:var(--bs-alert-padding-y)var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius);position:relative}.alert-heading{color:inherit}.alert-link{color:var(--bs-alert-link-color);font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{z-index:2;padding:1.25rem 1rem;position:absolute;top:0;right:0}.alert-primary{--bs-alert-color:var(--bs-primary-text-emphasis);--bs-alert-bg:var(--bs-primary-bg-subtle);--bs-alert-border-color:var(--bs-primary-border-subtle);--bs-alert-link-color:var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color:var(--bs-secondary-text-emphasis);--bs-alert-bg:var(--bs-secondary-bg-subtle);--bs-alert-border-color:var(--bs-secondary-border-subtle);--bs-alert-link-color:var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color:var(--bs-success-text-emphasis);--bs-alert-bg:var(--bs-success-bg-subtle);--bs-alert-border-color:var(--bs-success-border-subtle);--bs-alert-link-color:var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color:var(--bs-info-text-emphasis);--bs-alert-bg:var(--bs-info-bg-subtle);--bs-alert-border-color:var(--bs-info-border-subtle);--bs-alert-link-color:var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color:var(--bs-warning-text-emphasis);--bs-alert-bg:var(--bs-warning-bg-subtle);--bs-alert-border-color:var(--bs-warning-border-subtle);--bs-alert-link-color:var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color:var(--bs-danger-text-emphasis);--bs-alert-bg:var(--bs-danger-bg-subtle);--bs-alert-border-color:var(--bs-danger-border-subtle);--bs-alert-link-color:var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color:var(--bs-light-text-emphasis);--bs-alert-bg:var(--bs-light-bg-subtle);--bs-alert-border-color:var(--bs-light-border-subtle);--bs-alert-link-color:var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color:var(--bs-dark-text-emphasis);--bs-alert-bg:var(--bs-dark-bg-subtle);--bs-alert-border-color:var(--bs-dark-border-subtle);--bs-alert-link-color:var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height:1rem;--bs-progress-font-size:.75rem;--bs-progress-bg:var(--bs-secondary-bg);--bs-progress-border-radius:var(--bs-border-radius);--bs-progress-box-shadow:var(--bs-box-shadow-inset);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#0d6efd;--bs-progress-bar-transition:width .6s ease;height:var(--bs-progress-height);font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius);display:flex;overflow:hidden}.progress-bar{color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition);flex-direction:column;justify-content:center;display:flex;overflow:hidden}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,#ffffff26 25%,#0000 25% 50%,#ffffff26 50% 75%,#0000 75%,#0000);background-size:var(--bs-progress-height)var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:var(--bs-body-color);--bs-list-group-bg:var(--bs-body-bg);--bs-list-group-border-color:var(--bs-border-color);--bs-list-group-border-width:var(--bs-border-width);--bs-list-group-border-radius:var(--bs-border-radius);--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:.5rem;--bs-list-group-action-color:var(--bs-secondary-color);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-tertiary-bg);--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-secondary-bg);--bs-list-group-disabled-color:var(--bs-secondary-color);--bs-list-group-disabled-bg:var(--bs-body-bg);--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#0d6efd;--bs-list-group-active-border-color:#0d6efd;border-radius:var(--bs-list-group-border-radius);flex-direction:column;margin-bottom:0;padding-left:0;display:flex}.list-group-numbered{counter-reset:section;list-style-type:none}.list-group-numbered>.list-group-item:before{content:counters(section,".")". ";counter-increment:section}.list-group-item-action{color:var(--bs-list-group-action-color);text-align:inherit;width:100%}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:var(--bs-list-group-action-hover-color);background-color:var(--bs-list-group-action-hover-bg);text-decoration:none}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{padding:var(--bs-list-group-item-padding-y)var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width)solid var(--bs-list-group-border-color);text-decoration:none;display:block;position:relative}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color:var(--bs-primary-text-emphasis);--bs-list-group-bg:var(--bs-primary-bg-subtle);--bs-list-group-border-color:var(--bs-primary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-primary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-primary-border-subtle);--bs-list-group-active-color:var(--bs-primary-bg-subtle);--bs-list-group-active-bg:var(--bs-primary-text-emphasis);--bs-list-group-active-border-color:var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color:var(--bs-secondary-text-emphasis);--bs-list-group-bg:var(--bs-secondary-bg-subtle);--bs-list-group-border-color:var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-secondary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-secondary-border-subtle);--bs-list-group-active-color:var(--bs-secondary-bg-subtle);--bs-list-group-active-bg:var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color:var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color:var(--bs-success-text-emphasis);--bs-list-group-bg:var(--bs-success-bg-subtle);--bs-list-group-border-color:var(--bs-success-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-success-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-success-border-subtle);--bs-list-group-active-color:var(--bs-success-bg-subtle);--bs-list-group-active-bg:var(--bs-success-text-emphasis);--bs-list-group-active-border-color:var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color:var(--bs-info-text-emphasis);--bs-list-group-bg:var(--bs-info-bg-subtle);--bs-list-group-border-color:var(--bs-info-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-info-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-info-border-subtle);--bs-list-group-active-color:var(--bs-info-bg-subtle);--bs-list-group-active-bg:var(--bs-info-text-emphasis);--bs-list-group-active-border-color:var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color:var(--bs-warning-text-emphasis);--bs-list-group-bg:var(--bs-warning-bg-subtle);--bs-list-group-border-color:var(--bs-warning-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-warning-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-warning-border-subtle);--bs-list-group-active-color:var(--bs-warning-bg-subtle);--bs-list-group-active-bg:var(--bs-warning-text-emphasis);--bs-list-group-active-border-color:var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color:var(--bs-danger-text-emphasis);--bs-list-group-bg:var(--bs-danger-bg-subtle);--bs-list-group-border-color:var(--bs-danger-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-danger-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-danger-border-subtle);--bs-list-group-active-color:var(--bs-danger-bg-subtle);--bs-list-group-active-bg:var(--bs-danger-text-emphasis);--bs-list-group-active-border-color:var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color:var(--bs-light-text-emphasis);--bs-list-group-bg:var(--bs-light-bg-subtle);--bs-list-group-border-color:var(--bs-light-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-light-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-light-border-subtle);--bs-list-group-active-color:var(--bs-light-bg-subtle);--bs-list-group-active-bg:var(--bs-light-text-emphasis);--bs-list-group-active-border-color:var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color:var(--bs-dark-text-emphasis);--bs-list-group-bg:var(--bs-dark-bg-subtle);--bs-list-group-border-color:var(--bs-dark-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-dark-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-dark-border-subtle);--bs-list-group-active-color:var(--bs-dark-bg-subtle);--bs-list-group-active-bg:var(--bs-dark-text-emphasis);--bs-list-group-active-border-color:var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity:.5;--bs-btn-close-hover-opacity:.75;--bs-btn-close-focus-shadow:0 0 0 .25rem #0d6efd40;--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:.25;--bs-btn-close-white-filter:invert(1)grayscale(100%)brightness(200%);box-sizing:content-box;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg)center/1em auto no-repeat;opacity:var(--bs-btn-close-opacity);border:0;border-radius:.375rem;width:1em;height:1em;padding:.25em}.btn-close:hover{color:var(--bs-btn-close-color);opacity:var(--bs-btn-close-hover-opacity);text-decoration:none}.btn-close:focus{box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity);outline:0}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white,[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:.75rem;--bs-toast-padding-y:.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(var(--bs-body-bg-rgb),.85);--bs-toast-border-width:var(--bs-border-width);--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:var(--bs-secondary-color);--bs-toast-header-bg:rgba(var(--bs-body-bg-rgb),.85);--bs-toast-header-border-color:var(--bs-border-color-translucent);width:var(--bs-toast-max-width);font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);border:var(--bs-toast-border-width)solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius);background-clip:padding-box;max-width:100%}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;z-index:var(--bs-toast-zindex);pointer-events:none;width:max-content;max-width:100%;position:absolute}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{padding:var(--bs-toast-padding-y)var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);border-bottom:var(--bs-toast-border-width)solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));background-clip:padding-box;align-items:center;display:flex}.toast-header .btn-close{margin-right:calc(-.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:.5rem;--bs-modal-color: ;--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:var(--bs-border-width);--bs-modal-border-radius:var(--bs-border-radius-lg);--bs-modal-box-shadow:var(--bs-box-shadow-sm);--bs-modal-inner-border-radius:calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:var(--bs-border-width);--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:var(--bs-border-width);z-index:var(--bs-modal-zindex);outline:0;width:100%;height:100%;display:none;position:fixed;top:0;left:0;overflow:hidden auto}.modal-dialog{margin:var(--bs-modal-margin);pointer-events:none;width:auto;position:relative}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translateY(-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{min-height:calc(100% - var(--bs-modal-margin)*2);align-items:center;display:flex}.modal-content{color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);border:var(--bs-modal-border-width)solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);background-clip:padding-box;outline:0;flex-direction:column;width:100%;display:flex;position:relative}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:.5;z-index:var(--bs-backdrop-zindex);background-color:var(--bs-backdrop-bg);width:100vw;height:100vh;position:fixed;top:0;left:0}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width)solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius);flex-shrink:0;align-items:center;display:flex}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5)calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-.5*var(--bs-modal-header-padding-y))calc(-.5*var(--bs-modal-header-padding-x))calc(-.5*var(--bs-modal-header-padding-y))auto}.modal-title{line-height:var(--bs-modal-title-line-height);margin-bottom:0}.modal-body{padding:var(--bs-modal-padding);flex:auto;position:relative}.modal-footer{padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width)solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius);flex-wrap:wrap;flex-shrink:0;justify-content:flex-end;align-items:center;display:flex}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:var(--bs-box-shadow)}.modal-dialog{max-width:var(--bs-modal-width);margin-left:auto;margin-right:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:.5rem;--bs-tooltip-padding-y:.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:.875rem;--bs-tooltip-color:var(--bs-body-bg);--bs-tooltip-bg:var(--bs-emphasis-color);--bs-tooltip-border-radius:var(--bs-border-radius);--bs-tooltip-opacity:.9;--bs-tooltip-arrow-width:.8rem;--bs-tooltip-arrow-height:.4rem;z-index:var(--bs-tooltip-zindex);margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);text-align:left;text-align:start;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-style:normal;font-weight:400;line-height:1.5;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0;text-decoration:none;display:block}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height);display:block}.tooltip .tooltip-arrow:before{content:"";border-style:solid;border-color:#0000;position:absolute}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before,.bs-tooltip-top .tooltip-arrow:before{border-width:var(--bs-tooltip-arrow-height)calc(var(--bs-tooltip-arrow-width)*.5)0;border-top-color:var(--bs-tooltip-bg);top:-1px}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before,.bs-tooltip-end .tooltip-arrow:before{border-width:calc(var(--bs-tooltip-arrow-width)*.5)var(--bs-tooltip-arrow-height)calc(var(--bs-tooltip-arrow-width)*.5)0;border-right-color:var(--bs-tooltip-bg);right:-1px}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before,.bs-tooltip-bottom .tooltip-arrow:before{border-width:0 calc(var(--bs-tooltip-arrow-width)*.5)var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg);bottom:-1px}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before,.bs-tooltip-start .tooltip-arrow:before{border-width:calc(var(--bs-tooltip-arrow-width)*.5)0 calc(var(--bs-tooltip-arrow-width)*.5)var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg);left:-1px}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y)var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:.875rem;--bs-popover-bg:var(--bs-body-bg);--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:var(--bs-border-radius-lg);--bs-popover-inner-border-radius:calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow:var(--bs-box-shadow);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:inherit;--bs-popover-header-bg:var(--bs-secondary-bg);--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:var(--bs-body-color);--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);text-align:left;text-align:start;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-style:normal;font-weight:400;line-height:1.5;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);border:var(--bs-popover-border-width)solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius);background-clip:padding-box;text-decoration:none;display:block}.popover .popover-arrow{width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height);display:block}.popover .popover-arrow:after,.popover .popover-arrow:before{content:"";border:0 solid #0000;display:block;position:absolute}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,.bs-popover-top>.popover-arrow:after,.bs-popover-top>.popover-arrow:before{border-width:var(--bs-popover-arrow-height)calc(var(--bs-popover-arrow-width)*.5)0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,.bs-popover-top>.popover-arrow:before{border-top-color:var(--bs-popover-arrow-border);bottom:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after,.bs-popover-top>.popover-arrow:after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,.bs-popover-end>.popover-arrow:after,.bs-popover-end>.popover-arrow:before{border-width:calc(var(--bs-popover-arrow-width)*.5)var(--bs-popover-arrow-height)calc(var(--bs-popover-arrow-width)*.5)0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,.bs-popover-end>.popover-arrow:before{border-right-color:var(--bs-popover-arrow-border);left:0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after,.bs-popover-end>.popover-arrow:after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,.bs-popover-bottom>.popover-arrow:after,.bs-popover-bottom>.popover-arrow:before{border-width:0 calc(var(--bs-popover-arrow-width)*.5)var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,.bs-popover-bottom>.popover-arrow:before{border-bottom-color:var(--bs-popover-arrow-border);top:0}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after,.bs-popover-bottom>.popover-arrow:after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{width:var(--bs-popover-arrow-width);margin-left:calc(-.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width)solid var(--bs-popover-header-bg);display:block;position:absolute;top:0;left:50%}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,.bs-popover-start>.popover-arrow:after,.bs-popover-start>.popover-arrow:before{border-width:calc(var(--bs-popover-arrow-width)*.5)0 calc(var(--bs-popover-arrow-width)*.5)var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,.bs-popover-start>.popover-arrow:before{border-left-color:var(--bs-popover-arrow-border);right:0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after,.bs-popover-start>.popover-arrow:after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y)var(--bs-popover-header-padding-x);font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width)solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius);margin-bottom:0}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y)var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{width:100%;position:relative;overflow:hidden}.carousel-inner:after{clear:both;content:"";display:block}.carousel-item{float:left;backface-visibility:hidden;width:100%;margin-right:-100%;transition:transform .6s ease-in-out;display:none;position:relative}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translate(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translate(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{z-index:1;color:#fff;text-align:center;opacity:.5;background:0 0;border:0;justify-content:center;align-items:center;width:15%;padding:0;transition:opacity .15s;display:flex;position:absolute;top:0;bottom:0}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;opacity:.9;outline:0;text-decoration:none}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{background-position:50%;background-repeat:no-repeat;background-size:100% 100%;width:2rem;height:2rem;display:inline-block}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{z-index:2;justify-content:center;margin-bottom:1rem;margin-left:15%;margin-right:15%;padding:0;display:flex;position:absolute;bottom:0;left:0;right:0}.carousel-indicators [data-bs-target]{box-sizing:content-box;text-indent:-999px;cursor:pointer;opacity:.5;background-color:#fff;background-clip:padding-box;border:10px solid #0000;border-left:0;border-right:0;flex:0 auto;width:30px;height:3px;margin-left:3px;margin-right:3px;padding:0;transition:opacity .6s}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{color:#fff;text-align:center;padding-top:1.25rem;padding-bottom:1.25rem;position:absolute;bottom:1.25rem;left:15%;right:15%}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert()grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon{filter:invert()grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-border,.spinner-grow{width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);animation:var(--bs-spinner-animation-speed)linear infinite var(--bs-spinner-animation-name);border-radius:50%;display:inline-block}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-.125em;--bs-spinner-border-width:.25em;--bs-spinner-animation-speed:.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width)solid currentcolor;border-right-color:#0000}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-.125em;--bs-spinner-animation-speed:.75s;--bs-spinner-animation-name:spinner-grow;opacity:0;background-color:currentColor}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:var(--bs-border-width);--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:var(--bs-box-shadow-sm);--bs-offcanvas-transition:transform .3s ease-in-out;--bs-offcanvas-title-line-height:1.5}@media (max-width:575.98px){.offcanvas-sm{z-index:var(--bs-offcanvas-zindex);color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;max-width:100%;display:flex;position:fixed;bottom:0}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas-sm.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas-sm.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible;background-color:#0000!important}}@media (max-width:767.98px){.offcanvas-md{z-index:var(--bs-offcanvas-zindex);color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;max-width:100%;display:flex;position:fixed;bottom:0}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas-md.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas-md.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible;background-color:#0000!important}}@media (max-width:991.98px){.offcanvas-lg{z-index:var(--bs-offcanvas-zindex);color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;max-width:100%;display:flex;position:fixed;bottom:0}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas-lg.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas-lg.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible;background-color:#0000!important}}@media (max-width:1199.98px){.offcanvas-xl{z-index:var(--bs-offcanvas-zindex);color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;max-width:100%;display:flex;position:fixed;bottom:0}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas-xl.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas-xl.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible;background-color:#0000!important}}@media (max-width:1399.98px){.offcanvas-xxl{z-index:var(--bs-offcanvas-zindex);color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;max-width:100%;display:flex;position:fixed;bottom:0}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas-xxl.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas-xxl.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible;background-color:#0000!important}}.offcanvas{z-index:var(--bs-offcanvas-zindex);color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;max-width:100%;display:flex;position:fixed;bottom:0}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{z-index:1040;background-color:#000;width:100vw;height:100vh;position:fixed;top:0;left:0}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{padding:var(--bs-offcanvas-padding-y)var(--bs-offcanvas-padding-x);align-items:center;display:flex}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5)calc(var(--bs-offcanvas-padding-x)*.5);margin:calc(-.5*var(--bs-offcanvas-padding-y))calc(-.5*var(--bs-offcanvas-padding-x))calc(-.5*var(--bs-offcanvas-padding-y))auto}.offcanvas-title{line-height:var(--bs-offcanvas-title-line-height);margin-bottom:0}.offcanvas-body{padding:var(--bs-offcanvas-padding-y)var(--bs-offcanvas-padding-x);flex-grow:1;overflow-y:auto}.placeholder{vertical-align:middle;cursor:wait;opacity:.5;background-color:currentColor;min-height:1em;display:inline-block}.placeholder.btn:before{content:"";display:inline-block}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:2s ease-in-out infinite placeholder-glow}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{animation:2s linear infinite placeholder-wave;-webkit-mask-image:linear-gradient(130deg,#000 55%,#000c 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,#000c 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%}@keyframes placeholder-wave{to{-webkit-mask-position:-200% 0;mask-position:-200% 0}}.clearfix:after{clear:both;content:"";display:block}.text-bg-primary{color:#fff!important;background-color:RGBA(var(--bs-primary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#fff!important;background-color:RGBA(var(--bs-secondary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(var(--bs-success-rgb),var(--bs-bg-opacity,1))!important}.text-bg-info{color:#000!important;background-color:RGBA(var(--bs-info-rgb),var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(var(--bs-warning-rgb),var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(var(--bs-danger-rgb),var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(var(--bs-light-rgb),var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(var(--bs-dark-rgb),var(--bs-bg-opacity,1))!important}.link-primary{color:RGBA(var(--bs-primary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important}.link-primary:focus,.link-primary:hover{color:RGBA(10,88,202,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important}.link-secondary{color:RGBA(var(--bs-secondary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important}.link-secondary:focus,.link-secondary:hover{color:RGBA(86,94,100,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important}.link-success{color:RGBA(var(--bs-success-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important}.link-success:focus,.link-success:hover{color:RGBA(20,108,67,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important}.link-info{color:RGBA(var(--bs-info-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important}.link-info:focus,.link-info:hover{color:RGBA(61,213,243,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important}.link-warning{color:RGBA(var(--bs-warning-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important}.link-warning:focus,.link-warning:hover{color:RGBA(255,205,57,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important}.link-danger{color:RGBA(var(--bs-danger-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important}.link-danger:focus,.link-danger:hover{color:RGBA(176,42,55,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important}.link-light{color:RGBA(var(--bs-light-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important}.link-light:focus,.link-light:hover{color:RGBA(249,250,251,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important}.link-dark{color:RGBA(var(--bs-dark-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important}.link-dark:focus,.link-dark:hover{color:RGBA(26,30,33,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-body-emphasis:focus,.link-body-emphasis:hover{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,.75))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,.75))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,.75))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,.75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,.75))!important}.focus-ring:focus{box-shadow:var(--bs-focus-ring-x,0)var(--bs-focus-ring-y,0)var(--bs-focus-ring-blur,0)var(--bs-focus-ring-width)var(--bs-focus-ring-color);outline:0}.icon-link{-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,.5));-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,.5));-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,.5));text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,.5));text-underline-offset:.25em;backface-visibility:hidden;align-items:center;gap:.375rem;display:inline-flex}.icon-link>.bi{fill:currentColor;flex-shrink:0;width:1em;height:1em;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.icon-link>.bi{transition:none}}.icon-link-hover:focus-visible>.bi,.icon-link-hover:hover>.bi{transform:var(--bs-icon-link-transform,translate3d(.25em,0,0))}.ratio{width:100%;position:relative}.ratio:before{padding-top:var(--bs-aspect-ratio);content:"";display:block}.ratio>*{width:100%;height:100%;position:absolute;top:0;left:0}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571%}.fixed-top{z-index:1030;position:fixed;top:0;left:0;right:0}.fixed-bottom{z-index:1030;position:fixed;bottom:0;left:0;right:0}.sticky-top{z-index:1020;position:sticky;top:0}.sticky-bottom{z-index:1020;position:sticky;bottom:0}@media (min-width:576px){.sticky-sm-top{z-index:1020;position:sticky;top:0}.sticky-sm-bottom{z-index:1020;position:sticky;bottom:0}}@media (min-width:768px){.sticky-md-top{z-index:1020;position:sticky;top:0}.sticky-md-bottom{z-index:1020;position:sticky;bottom:0}}@media (min-width:992px){.sticky-lg-top{z-index:1020;position:sticky;top:0}.sticky-lg-bottom{z-index:1020;position:sticky;bottom:0}}@media (min-width:1200px){.sticky-xl-top{z-index:1020;position:sticky;top:0}.sticky-xl-bottom{z-index:1020;position:sticky;bottom:0}}@media (min-width:1400px){.sticky-xxl-top{z-index:1020;position:sticky;top:0}.sticky-xxl-bottom{z-index:1020;position:sticky;bottom:0}}.hstack{flex-direction:row;align-self:stretch;align-items:center;display:flex}.vstack{flex-direction:column;flex:auto;align-self:stretch;display:flex}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important;width:1px!important;height:1px!important;margin:-1px!important;padding:0!important;overflow:hidden!important}.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption),.visually-hidden:not(caption){position:absolute!important}.stretched-link:after{z-index:1;content:"";position:absolute;inset:0}.text-truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.vr{width:var(--bs-border-width);opacity:.25;background-color:currentColor;align-self:stretch;min-height:1em;display:inline-block}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-none{-o-object-fit:none!important;object-fit:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:var(--bs-box-shadow)!important}.shadow-sm{box-shadow:var(--bs-box-shadow-sm)!important}.shadow-lg{box-shadow:var(--bs-box-shadow-lg)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--bs-focus-ring-color:rgba(var(--bs-primary-rgb),var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color:rgba(var(--bs-secondary-rgb),var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color:rgba(var(--bs-success-rgb),var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color:rgba(var(--bs-info-rgb),var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color:rgba(var(--bs-warning-rgb),var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color:rgba(var(--bs-danger-rgb),var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb),var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color:rgba(var(--bs-dark-rgb),var(--bs-focus-ring-opacity))}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translate(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-black{--bs-border-opacity:1;border-color:rgba(var(--bs-black-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--bs-success-border-subtle)!important}.border-info-subtle{border-color:var(--bs-info-border-subtle)!important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle)!important}.border-light-subtle{border-color:var(--bs-light-border-subtle)!important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--bs-border-opacity:.1}.border-opacity-25{--bs-border-opacity:.25}.border-opacity-50{--bs-border-opacity:.5}.border-opacity-75{--bs-border-opacity:.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-left:0!important;margin-right:0!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-3{margin-left:1rem!important;margin-right:1rem!important}.mx-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-5{margin-left:3rem!important;margin-right:3rem!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-left:0!important;padding-right:0!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-3{padding-left:1rem!important;padding-right:1rem!important}.px-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-5{padding-left:3rem!important;padding-right:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:3rem!important}.column-gap-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-1{-moz-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-2{-moz-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold{font-weight:600!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-black-50{--bs-text-opacity:1;color:#00000080!important}.text-white-50{--bs-text-opacity:1;color:#ffffff80!important}.text-body-secondary{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-body-tertiary{--bs-text-opacity:1;color:var(--bs-tertiary-color)!important}.text-body-emphasis{--bs-text-opacity:1;color:var(--bs-emphasis-color)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:.25}.text-opacity-50{--bs-text-opacity:.5}.text-opacity-75{--bs-text-opacity:.75}.text-opacity-100{--bs-text-opacity:1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--bs-success-text-emphasis)!important}.text-info-emphasis{color:var(--bs-info-text-emphasis)!important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis)!important}.text-light-emphasis{color:var(--bs-light-text-emphasis)!important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis)!important}.link-opacity-10,.link-opacity-10-hover:hover{--bs-link-opacity:.1}.link-opacity-25,.link-opacity-25-hover:hover{--bs-link-opacity:.25}.link-opacity-50,.link-opacity-50-hover:hover{--bs-link-opacity:.5}.link-opacity-75,.link-opacity-75-hover:hover{--bs-link-opacity:.75}.link-opacity-100,.link-opacity-100-hover:hover{--bs-link-opacity:1}.link-offset-1,.link-offset-1-hover:hover{text-underline-offset:.125em!important}.link-offset-2,.link-offset-2-hover:hover{text-underline-offset:.25em!important}.link-offset-3,.link-offset-3-hover:hover{text-underline-offset:.375em!important}.link-underline-primary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-secondary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-success{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important}.link-underline-info{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important}.link-underline-warning{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important}.link-underline-danger{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important}.link-underline-light{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important}.link-underline-dark{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important}.link-underline{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-underline-opacity-0,.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity:0}.link-underline-opacity-10,.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity:.1}.link-underline-opacity-25,.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity:.25}.link-underline-opacity-50,.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity:.5}.link-underline-opacity-75,.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity:.75}.link-underline-opacity-100,.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:#0000!important}.bg-body-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-bg-rgb),var(--bs-bg-opacity))!important}.bg-body-tertiary{--bs-bg-opacity:1;background-color:rgba(var(--bs-tertiary-bg-rgb),var(--bs-bg-opacity))!important}.bg-opacity-10{--bs-bg-opacity:.1}.bg-opacity-25{--bs-bg-opacity:.25}.bg-opacity-50{--bs-bg-opacity:.5}.bg-opacity-75{--bs-bg-opacity:.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle)!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm)!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg)!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl)!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill)!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm)!important;border-bottom-left-radius:var(--bs-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg)!important;border-bottom-left-radius:var(--bs-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl)!important;border-bottom-left-radius:var(--bs-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-left-radius:var(--bs-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill)!important;border-bottom-left-radius:var(--bs-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-0{border-top-left-radius:0!important;border-bottom-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-top-left-radius:var(--bs-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-top-left-radius:var(--bs-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-top-left-radius:var(--bs-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-top-left-radius:var(--bs-border-radius-xxl)!important}.rounded-start-circle{border-top-left-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-top-left-radius:var(--bs-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-sm-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-sm-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-sm-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-sm-none{-o-object-fit:none!important;object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-left:0!important;margin-right:0!important}.mx-sm-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-sm-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-sm-3{margin-left:1rem!important;margin-right:1rem!important}.mx-sm-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-sm-5{margin-left:3rem!important;margin-right:3rem!important}.mx-sm-auto{margin-left:auto!important;margin-right:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-left:0!important;padding-right:0!important}.px-sm-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-sm-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-sm-3{padding-left:1rem!important;padding-right:1rem!important}.px-sm-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-sm-5{padding-left:3rem!important;padding-right:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:3rem!important}.column-gap-sm-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-sm-1{-moz-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-sm-2{-moz-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-sm-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-sm-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-sm-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-md-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-md-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-md-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-md-none{-o-object-fit:none!important;object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-left:0!important;margin-right:0!important}.mx-md-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-md-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-md-3{margin-left:1rem!important;margin-right:1rem!important}.mx-md-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-md-5{margin-left:3rem!important;margin-right:3rem!important}.mx-md-auto{margin-left:auto!important;margin-right:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-left:0!important;padding-right:0!important}.px-md-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-md-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-md-3{padding-left:1rem!important;padding-right:1rem!important}.px-md-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-md-5{padding-left:3rem!important;padding-right:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:3rem!important}.column-gap-md-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-md-1{-moz-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-md-2{-moz-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-md-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-md-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-md-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-lg-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-lg-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-lg-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-lg-none{-o-object-fit:none!important;object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-left:0!important;margin-right:0!important}.mx-lg-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-lg-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-lg-3{margin-left:1rem!important;margin-right:1rem!important}.mx-lg-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-lg-5{margin-left:3rem!important;margin-right:3rem!important}.mx-lg-auto{margin-left:auto!important;margin-right:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-left:0!important;padding-right:0!important}.px-lg-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-lg-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-lg-3{padding-left:1rem!important;padding-right:1rem!important}.px-lg-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-lg-5{padding-left:3rem!important;padding-right:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:3rem!important}.column-gap-lg-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-lg-1{-moz-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-lg-2{-moz-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-lg-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-lg-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-lg-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xl-none{-o-object-fit:none!important;object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-left:0!important;margin-right:0!important}.mx-xl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xl-auto{margin-left:auto!important;margin-right:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-left:0!important;padding-right:0!important}.px-xl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:3rem!important}.column-gap-xl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xl-1{-moz-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-xl-2{-moz-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-xl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xxl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xxl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xxl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xxl-none{-o-object-fit:none!important;object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-left:0!important;margin-right:0!important}.mx-xxl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xxl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xxl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xxl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xxl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xxl-auto{margin-left:auto!important;margin-right:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-left:0!important;padding-right:0!important}.px-xxl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xxl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xxl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xxl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xxl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:3rem!important}.column-gap-xxl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xxl-1{-moz-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-xxl-2{-moz-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-xxl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xxl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xxl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}:root{--body-bg-color:#eae9e9;--body-color:#212529;--move-btn-width:60px;--move-btn-height:34px;--focus-ring:0 0 0 .2rem var(--bs-focus-ring-color);--focus-ring-error:0 0 0 .2rem rgba(var(--bs-danger-rgb),.4);accent-color:var(--bs-primary);font-size:14px}:not(:defined){display:none!important}body{background-color:var(--body-bg-color);overflow-x:hidden}[hidden]{display:none!important}a:focus-visible,details summary:focus-visible{border-radius:var(--bs-border-radius);box-shadow:var(--focus-ring);outline:0;transition:box-shadow .15s ease-in-out}.container{max-width:1500px}.site-header{text-align:center;flex-direction:column;align-items:center;row-gap:.5rem;margin:3rem .5rem;display:flex}.page-title{margin-bottom:0;font-weight:300}.form-control:out-of-range{border-color:var(--bs-form-invalid-border-color);color:var(--bs-form-invalid-color)}.form-control:out-of-range:focus{box-shadow:var(--focus-ring-error)}.canvas{max-width:100%;display:block}.textboxes-container input[type=color],.settings-button,.duplicate-button{cursor:pointer;width:30px;min-width:30px;height:30px;margin:0 2px;padding:0;line-height:1}.textboxes-container .meme-text{scrollbar-width:thin;field-sizing:content;min-width:0;min-height:calc(1.5em + .75rem + 2px);max-height:60px;margin:.5rem;overflow-x:hidden}#maxImageDimensionsForm select:disabled{text-indent:-9999px;opacity:.7}.settings-button{background-image:url(gear.b3b5d1a5.svg);background-position:50%;background-repeat:no-repeat;background-size:64%}.clear-canvas-button{opacity:0;visibility:hidden;justify-content:center;align-items:center;padding:.375rem;transition:opacity .15s ease-in-out,visibility .15s ease-in-out;display:inline-flex;position:absolute;top:.5rem;left:.5rem}.dropzone:hover .clear-canvas-button{opacity:1;visibility:visible}.textboxes-container{flex:1}.textboxes-container:empty{display:none}.instructions{text-align:center;text-wrap:balance;flex-direction:column;justify-content:center;align-items:center;row-gap:1rem;height:100%;min-height:200px;padding:1rem;display:flex}.errors-container{z-index:1051;pointer-events:none;width:100%;position:fixed;top:0;left:0}.errors-container .alert{pointer-events:all}details>summary{transition:margin .1s ease-out}details[open]>summary{margin-bottom:.5rem}button[data-button=duplicate-text-box],button[data-button=delete-text-box]{background-position:50%;background-repeat:no-repeat;background-size:90%;width:28px;min-width:28px;height:28px;margin-inline-start:.5rem;padding:0}button[data-button=duplicate-text-box]{background-image:url(duplicate.04d08287.svg);background-size:70%}button[data-button=delete-text-box]{background-image:url(trash.d9edab78.svg);margin-inline-start:.25rem}.gallery{scroll-behavior:smooth;gap:.5rem;min-height:112px;margin:0;padding:.25rem 0;display:flex;overflow-x:auto}.gallery>button{cursor:pointer;padding:0}.gallery>button>img{border-radius:var(--bs-border-radius);object-fit:cover;min-width:88px;height:88px;display:block}.gallery__no-results{text-align:center;flex:1;justify-content:center;align-items:center;display:flex}.move-text-actions{width:calc(var(--move-btn-width)*3);height:calc(var(--move-btn-height)*2);margin:0 auto;position:relative}.move-text-actions>button{width:var(--move-btn-width);height:var(--move-btn-height);background-position:50%;background-repeat:no-repeat;position:absolute}.move-text-actions>[aria-label=Up]{top:-1px;left:var(--move-btn-width);background-image:url(chevron-up.f532d8b6.svg)}.move-text-actions>[aria-label=Down]{top:calc(var(--move-btn-height) + 1px);left:var(--move-btn-width);background-image:url(chevron-down.ad14d981.svg)}.move-text-actions>[aria-label=Left]{top:calc(var(--move-btn-height)/2);background-image:url(chevron-left.20a2f252.svg);left:-2px}.move-text-actions>[aria-label=Right]{top:calc(var(--move-btn-height)/2);left:calc(var(--move-btn-width)*2 + 2px);background-image:url(chevron-right.1be074ac.svg)}capture-photo:not(:defined){display:none}capture-photo{overflow:hidden}capture-photo::part(video){background-color:#000;width:100%}capture-photo::part(actions-container){justify-content:center;align-items:center;gap:2rem;padding:1rem 0;display:flex}capture-photo::part(capture-button),capture-photo::part(facing-mode-button){text-indent:-9999px;cursor:pointer;appearance:none;background-position:50%;background-repeat:no-repeat;border-radius:50%;overflow:hidden;box-shadow:0 0 1rem #0000004d}capture-photo::part(capture-button){background-color:#c2c3c7;background-image:url(aperture.4bf28ce8.svg);background-size:90%;border:5px solid #fff;width:70px;height:70px}capture-photo::part(facing-mode-button){background-color:#fff;background-image:url(camera-reverse.284e8ac9.svg);background-size:60%;border:0;width:50px;height:50px;margin-right:calc(-50px - 2rem)}capture-photo[loading]::part(video){background-image:url(spinner.4452ed29.svg);background-position:50%;background-repeat:no-repeat;background-size:60px}capture-photo[loading]::part(capture-button),capture-photo[loading]::part(facing-mode-button){opacity:.6;pointer-events:none}modal-element{--me-width:fit-content;--me-border-radius:var(--bs-border-radius);--me-border-width:0;--me-box-shadow:0 0 1rem 0 #0000004d}#videoModal{--me-width:600px}#downloadModal{--me-width:900px}modal-element::part(base):focus-visible{outline:0}modal-element [slot=header]{color:var(--body-color);margin:0}modal-element::part(close){color:var(--body-color);border-radius:var(--bs-border-radius);transition:box-shadow .15s ease-in-out}modal-element::part(close):focus-visible{box-shadow:var(--focus-ring);outline:0}modal-element::part(body){padding-block:0}modal-element [slot=footer]{text-align:center;flex-wrap:wrap;justify-content:center;align-items:center;gap:.25rem;display:flex}.dropzone{--dropzone-border-color:var(--bs-secondary);--dropzone-border-color-hover:var(--bs-primary);--dropzone-border-color-dragover:var(--bs-primary);--dropzone-background-color-hover:var(--bs-light);--dropzone-background-color-dragover:var(--bs-light);--dropzone-focus-box-shadow:var(--focus-ring);height:100%;position:relative}@media screen and (min-width:768px){.dropzone{position:sticky;top:.25rem}}.dropzone:not(.dropzone--accepted){max-height:41rem}.dropzone--accepted{width:-moz-fit-content;width:fit-content;height:-moz-fit-content;height:fit-content}.dropzone::part(dropzone){height:100%;padding:0}.dropzone[disabled]::part(dropzone){opacity:1;cursor:default}.emoji-picker-details{background-color:var(--bs-gray-200);border-radius:var(--bs-border-radius);margin-bottom:.5rem}.emoji-picker-details>summary{background-color:var(--bs-gray-300);border:1px solid var(--bs-gray-300);border-radius:var(--bs-border-radius);cursor:pointer;padding:.5rem 1rem}.emoji-picker-details[open]>summary{border-bottom-right-radius:0;border-bottom-left-radius:0}emoji-picker{--border-color:var(--bs-border-color);--background:#fff;--input-border-color:var(--bs-border-color);--input-border-radius:var(--bs-border-radius);--input-padding:.375rem .75rem;--outline-color:#0d6efd40;--outline-size:4px;--indicator-color:var(--bs-primary);--button-hover-background:var(--bs-gray-300);border:0;width:100%;height:255px;padding:0 .5rem .5rem}.text-underline{text-decoration:underline} -/*# sourceMappingURL=index.f1f30278.css.map */ +:root,[data-bs-theme=light]{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-primary-text-emphasis:#052c65;--bs-secondary-text-emphasis:#2b2f32;--bs-success-text-emphasis:#0a3622;--bs-info-text-emphasis:#055160;--bs-warning-text-emphasis:#664d03;--bs-danger-text-emphasis:#58151c;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#cfe2ff;--bs-secondary-bg-subtle:#e2e3e5;--bs-success-bg-subtle:#d1e7dd;--bs-info-bg-subtle:#cff4fc;--bs-warning-bg-subtle:#fff3cd;--bs-danger-bg-subtle:#f8d7da;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#9ec5fe;--bs-secondary-border-subtle:#c4c8cb;--bs-success-border-subtle:#a3cfbb;--bs-info-border-subtle:#9eeaf9;--bs-warning-border-subtle:#ffe69c;--bs-danger-border-subtle:#f1aeb5;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg,#ffffff26,#fff0);--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33,37,41;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:#212529bf;--bs-secondary-color-rgb:33,37,41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:#21252980;--bs-tertiary-color-rgb:33,37,41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13,110,253;--bs-link-decoration:underline;--bs-link-hover-color:#0a58ca;--bs-link-hover-color-rgb:10,88,202;--bs-code-color:#d63384;--bs-highlight-color:#212529;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:#0000002d;--bs-border-radius:.375rem;--bs-border-radius-sm:.25rem;--bs-border-radius-lg:.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 .5rem 1rem #00000026;--bs-box-shadow-sm:0 .125rem .25rem #00000013;--bs-box-shadow-lg:0 1rem 3rem #0000002d;--bs-box-shadow-inset:inset 0 1px 2px #00000013;--bs-focus-ring-width:.25rem;--bs-focus-ring-opacity:.25;--bs-focus-ring-color:#0d6efd40;--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}[data-bs-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:#dee2e6bf;--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:#dee2e680;--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#6ea8fe;--bs-secondary-text-emphasis:#a7acb1;--bs-success-text-emphasis:#75b798;--bs-info-text-emphasis:#6edff6;--bs-warning-text-emphasis:#ffda6a;--bs-danger-text-emphasis:#ea868f;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#031633;--bs-secondary-bg-subtle:#161719;--bs-success-bg-subtle:#051b11;--bs-info-bg-subtle:#032830;--bs-warning-bg-subtle:#332701;--bs-danger-bg-subtle:#2c0b0e;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#084298;--bs-secondary-border-subtle:#41464b;--bs-success-border-subtle:#0f5132;--bs-info-border-subtle:#087990;--bs-warning-border-subtle:#997404;--bs-danger-border-subtle:#842029;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-color:#6ea8fe;--bs-link-hover-color:#8bb9fe;--bs-link-color-rgb:110,168,254;--bs-link-hover-color-rgb:139,185,254;--bs-code-color:#e685b5;--bs-highlight-color:#dee2e6;--bs-highlight-bg:#664d03;--bs-border-color:#495057;--bs-border-color-translucent:#ffffff26;--bs-form-valid-color:#75b798;--bs-form-valid-border-color:#75b798;--bs-form-invalid-color:#ea868f;--bs-form-invalid-border-color:#ea868f}*,:after,:before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent;margin:0}hr{color:inherit;border:0;border-top:var(--bs-border-width)solid;opacity:.25;margin:1rem 0}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:var(--bs-heading-color);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}address{font-style:normal;line-height:inherit;margin-bottom:1rem}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg);padding:.1875em}sub,sup{vertical-align:baseline;font-size:.75em;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:underline}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{margin-top:0;margin-bottom:1rem;font-size:.875em;display:block;overflow:auto}pre code{font-size:inherit;color:inherit;word-break:normal}code{color:var(--bs-code-color);word-wrap:break-word;font-size:.875em}a>code{color:inherit}kbd{color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem;padding:.1875rem .375rem;font-size:.875em}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{color:var(--bs-secondary-color);text-align:left;padding-top:.5rem;padding-bottom:.5rem}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;margin:0}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{border-style:none;padding:0}textarea{resize:vertical}fieldset{border:0;min-width:0;margin:0;padding:0}legend{float:left;font-size:calc(1.275rem + .3vw);line-height:inherit;width:100%;margin-bottom:.5rem;padding:0}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field{padding:0}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit-hour-field{padding:0}::-webkit-datetime-edit-minute{padding:0}::-webkit-datetime-edit-month-field{padding:0}::-webkit-datetime-edit-text{padding:0}::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{cursor:pointer;display:list-item}progress{vertical-align:baseline}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled,.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{text-transform:uppercase;font-size:.875em}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{color:#6c757d;margin-top:-1rem;margin-bottom:1rem;font-size:.875em}.blockquote-footer:before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{background-color:var(--bs-body-bg);border:var(--bs-border-width)solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto;padding:.25rem}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{color:var(--bs-secondary-color);font-size:.875em}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);width:100%;margin-left:auto;margin-right:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;margin-top:calc(-1*var(--bs-gutter-y));margin-right:calc(-.5*var(--bs-gutter-x));margin-left:calc(-.5*var(--bs-gutter-x));flex-wrap:wrap;display:flex}.row>*{padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-top:var(--bs-gutter-y);flex-shrink:0;width:100%;max-width:100%}.col{flex:1 0}.row-cols-auto>*{flex:none;width:auto}.row-cols-1>*{flex:none;width:100%}.row-cols-2>*{flex:none;width:50%}.row-cols-3>*{flex:none;width:33.3333%}.row-cols-4>*{flex:none;width:25%}.row-cols-5>*{flex:none;width:20%}.row-cols-6>*{flex:none;width:16.6667%}.col-auto{flex:none;width:auto}.col-1{flex:none;width:8.33333%}.col-2{flex:none;width:16.6667%}.col-3{flex:none;width:25%}.col-4{flex:none;width:33.3333%}.col-5{flex:none;width:41.6667%}.col-6{flex:none;width:50%}.col-7{flex:none;width:58.3333%}.col-8{flex:none;width:66.6667%}.col-9{flex:none;width:75%}.col-10{flex:none;width:83.3333%}.col-11{flex:none;width:91.6667%}.col-12{flex:none;width:100%}.offset-1{margin-left:8.33333%}.offset-2{margin-left:16.6667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333%}.offset-5{margin-left:41.6667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333%}.offset-8{margin-left:66.6667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333%}.offset-11{margin-left:91.6667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:.25rem}.g-1,.gy-1{--bs-gutter-y:.25rem}.g-2,.gx-2{--bs-gutter-x:.5rem}.g-2,.gy-2{--bs-gutter-y:.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0}.row-cols-sm-auto>*{flex:none;width:auto}.row-cols-sm-1>*{flex:none;width:100%}.row-cols-sm-2>*{flex:none;width:50%}.row-cols-sm-3>*{flex:none;width:33.3333%}.row-cols-sm-4>*{flex:none;width:25%}.row-cols-sm-5>*{flex:none;width:20%}.row-cols-sm-6>*{flex:none;width:16.6667%}.col-sm-auto{flex:none;width:auto}.col-sm-1{flex:none;width:8.33333%}.col-sm-2{flex:none;width:16.6667%}.col-sm-3{flex:none;width:25%}.col-sm-4{flex:none;width:33.3333%}.col-sm-5{flex:none;width:41.6667%}.col-sm-6{flex:none;width:50%}.col-sm-7{flex:none;width:58.3333%}.col-sm-8{flex:none;width:66.6667%}.col-sm-9{flex:none;width:75%}.col-sm-10{flex:none;width:83.3333%}.col-sm-11{flex:none;width:91.6667%}.col-sm-12{flex:none;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.6667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333%}.offset-sm-5{margin-left:41.6667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333%}.offset-sm-8{margin-left:66.6667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333%}.offset-sm-11{margin-left:91.6667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0}.row-cols-md-auto>*{flex:none;width:auto}.row-cols-md-1>*{flex:none;width:100%}.row-cols-md-2>*{flex:none;width:50%}.row-cols-md-3>*{flex:none;width:33.3333%}.row-cols-md-4>*{flex:none;width:25%}.row-cols-md-5>*{flex:none;width:20%}.row-cols-md-6>*{flex:none;width:16.6667%}.col-md-auto{flex:none;width:auto}.col-md-1{flex:none;width:8.33333%}.col-md-2{flex:none;width:16.6667%}.col-md-3{flex:none;width:25%}.col-md-4{flex:none;width:33.3333%}.col-md-5{flex:none;width:41.6667%}.col-md-6{flex:none;width:50%}.col-md-7{flex:none;width:58.3333%}.col-md-8{flex:none;width:66.6667%}.col-md-9{flex:none;width:75%}.col-md-10{flex:none;width:83.3333%}.col-md-11{flex:none;width:91.6667%}.col-md-12{flex:none;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.6667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333%}.offset-md-5{margin-left:41.6667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333%}.offset-md-8{margin-left:66.6667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333%}.offset-md-11{margin-left:91.6667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0}.row-cols-lg-auto>*{flex:none;width:auto}.row-cols-lg-1>*{flex:none;width:100%}.row-cols-lg-2>*{flex:none;width:50%}.row-cols-lg-3>*{flex:none;width:33.3333%}.row-cols-lg-4>*{flex:none;width:25%}.row-cols-lg-5>*{flex:none;width:20%}.row-cols-lg-6>*{flex:none;width:16.6667%}.col-lg-auto{flex:none;width:auto}.col-lg-1{flex:none;width:8.33333%}.col-lg-2{flex:none;width:16.6667%}.col-lg-3{flex:none;width:25%}.col-lg-4{flex:none;width:33.3333%}.col-lg-5{flex:none;width:41.6667%}.col-lg-6{flex:none;width:50%}.col-lg-7{flex:none;width:58.3333%}.col-lg-8{flex:none;width:66.6667%}.col-lg-9{flex:none;width:75%}.col-lg-10{flex:none;width:83.3333%}.col-lg-11{flex:none;width:91.6667%}.col-lg-12{flex:none;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.6667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333%}.offset-lg-5{margin-left:41.6667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333%}.offset-lg-8{margin-left:66.6667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333%}.offset-lg-11{margin-left:91.6667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0}.row-cols-xl-auto>*{flex:none;width:auto}.row-cols-xl-1>*{flex:none;width:100%}.row-cols-xl-2>*{flex:none;width:50%}.row-cols-xl-3>*{flex:none;width:33.3333%}.row-cols-xl-4>*{flex:none;width:25%}.row-cols-xl-5>*{flex:none;width:20%}.row-cols-xl-6>*{flex:none;width:16.6667%}.col-xl-auto{flex:none;width:auto}.col-xl-1{flex:none;width:8.33333%}.col-xl-2{flex:none;width:16.6667%}.col-xl-3{flex:none;width:25%}.col-xl-4{flex:none;width:33.3333%}.col-xl-5{flex:none;width:41.6667%}.col-xl-6{flex:none;width:50%}.col-xl-7{flex:none;width:58.3333%}.col-xl-8{flex:none;width:66.6667%}.col-xl-9{flex:none;width:75%}.col-xl-10{flex:none;width:83.3333%}.col-xl-11{flex:none;width:91.6667%}.col-xl-12{flex:none;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.6667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333%}.offset-xl-5{margin-left:41.6667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333%}.offset-xl-8{margin-left:66.6667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333%}.offset-xl-11{margin-left:91.6667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0}.row-cols-xxl-auto>*{flex:none;width:auto}.row-cols-xxl-1>*{flex:none;width:100%}.row-cols-xxl-2>*{flex:none;width:50%}.row-cols-xxl-3>*{flex:none;width:33.3333%}.row-cols-xxl-4>*{flex:none;width:25%}.row-cols-xxl-5>*{flex:none;width:20%}.row-cols-xxl-6>*{flex:none;width:16.6667%}.col-xxl-auto{flex:none;width:auto}.col-xxl-1{flex:none;width:8.33333%}.col-xxl-2{flex:none;width:16.6667%}.col-xxl-3{flex:none;width:25%}.col-xxl-4{flex:none;width:33.3333%}.col-xxl-5{flex:none;width:41.6667%}.col-xxl-6{flex:none;width:50%}.col-xxl-7{flex:none;width:58.3333%}.col-xxl-8{flex:none;width:66.6667%}.col-xxl-9{flex:none;width:75%}.col-xxl-10{flex:none;width:83.3333%}.col-xxl-11{flex:none;width:91.6667%}.col-xxl-12{flex:none;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333%}.offset-xxl-2{margin-left:16.6667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.3333%}.offset-xxl-5{margin-left:41.6667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.3333%}.offset-xxl-8{margin-left:66.6667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.3333%}.offset-xxl-11{margin-left:91.6667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color-type:initial;--bs-table-bg-type:initial;--bs-table-color-state:initial;--bs-table-bg-state:initial;--bs-table-color:var(--bs-emphasis-color);--bs-table-bg:var(--bs-body-bg);--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-emphasis-color);--bs-table-striped-bg:rgba(var(--bs-emphasis-color-rgb),.05);--bs-table-active-color:var(--bs-emphasis-color);--bs-table-active-bg:rgba(var(--bs-emphasis-color-rgb),.1);--bs-table-hover-color:var(--bs-emphasis-color);--bs-table-hover-bg:rgba(var(--bs-emphasis-color-rgb),.075);vertical-align:top;border-color:var(--bs-table-border-color);width:100%;margin-bottom:1rem}.table>:not(caption)>*>*{color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)));padding:.5rem}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width)*2)solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width)0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*,.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-active{--bs-table-color-state:var(--bs-table-active-color);--bs-table-bg-state:var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state:var(--bs-table-hover-color);--bs-table-bg-state:var(--bs-table-hover-bg)}.table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#a6b5cc;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#b5b6b7;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#a7b9b1;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#a6c3ca;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#ccc2a4;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#c6acae;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#c6c7c8;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#4d5154;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{-webkit-overflow-scrolling:touch;overflow-x:auto}@media (max-width:575.98px){.table-responsive-sm{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (max-width:767.98px){.table-responsive-md{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (max-width:991.98px){.table-responsive-lg{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (max-width:1199.98px){.table-responsive-xl{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (max-width:1399.98px){.table-responsive-xxl{-webkit-overflow-scrolling:touch;overflow-x:auto}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));font-size:inherit;margin-bottom:0;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{color:var(--bs-secondary-color);margin-top:.25rem;font-size:.875em}.form-control{color:var(--bs-body-color);appearance:none;background-color:var(--bs-body-bg);border:var(--bs-border-width)solid var(--bs-border-color);border-radius:var(--bs-border-radius);background-clip:padding-box;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;display:block}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{padding:0;display:block}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::-webkit-file-upload-button{-webkit-margin-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);margin:-.375rem -.75rem;border-radius:0;margin-inline-end:.75rem;padding:.375rem .75rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{-webkit-margin-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;margin:-.375rem -.75rem;margin-inline-end:.75rem;padding:.375rem .75rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:var(--bs-secondary-bg)}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{color:var(--bs-body-color);border:solid #0000;border-width:var(--bs-border-width)0;background-color:#0000;width:100%;margin-bottom:0;padding:.375rem 0;line-height:1.5;display:block}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-left:0;padding-right:0}.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width)*2));border-radius:var(--bs-border-radius-sm);padding:.25rem .5rem;font-size:.875rem}.form-control-sm::file-selector-button{-webkit-margin-end:.5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem;padding:.25rem .5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width)*2));border-radius:var(--bs-border-radius-lg);padding:.5rem 1rem;font-size:1.25rem}.form-control-lg::file-selector-button{-webkit-margin-end:1rem;margin:-.5rem -1rem;margin-inline-end:1rem;padding:.5rem 1rem}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width)*2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width)*2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width)*2))}.form-control-color{height:calc(1.5em + .75rem + calc(var(--bs-border-width)*2));width:3rem;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border-radius:var(--bs-border-radius);border:0!important}.form-control-color::-webkit-color-swatch{border-radius:var(--bs-border-radius);border:0!important}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width)*2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width)*2))}.form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");color:var(--bs-body-color);appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon,none);border:var(--bs-border-width)solid var(--bs-border-color);border-radius:var(--bs-border-radius);background-position:right .75rem center;background-repeat:no-repeat;background-size:16px 12px;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;display:block}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-select[multiple],.form-select[size]:not([size="1"]){background-image:none;padding-right:.75rem}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:#0000;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{border-radius:var(--bs-border-radius-sm);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{border-radius:var(--bs-border-radius-lg);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{min-height:1.5rem;margin-bottom:.125rem;padding-left:1.5em;display:block}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{text-align:right;padding-left:0;padding-right:1.5em}.form-check-reverse .form-check-input{float:right;margin-left:0;margin-right:-1.5em}.form-check-input{--bs-form-check-bg:var(--bs-body-bg);vertical-align:top;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);border:var(--bs-border-width)solid var(--bs-border-color);-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact;background-position:50%;background-repeat:no-repeat;background-size:contain;flex-shrink:0;width:1em;height:1em;margin-top:.25em}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e");background-color:#0d6efd;border-color:#0d6efd}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-image:var(--bs-form-switch-bg);background-position:0;border-radius:2em;width:2em;margin-left:-2.5em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e");background-position:100%}.form-switch.form-check-reverse{padding-left:0;padding-right:2.5em}.form-switch.form-check-reverse .form-check-input{margin-left:0;margin-right:-2.5em}.form-check-inline{margin-right:1rem;display:inline-block}.btn-check{clip:rect(0,0,0,0);pointer-events:none;position:absolute}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{appearance:none;background-color:#0000;width:100%;height:1.5rem;padding:0}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;width:1rem;height:1rem;margin-top:-.25rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{color:#0000;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:#0000;border-radius:1rem;width:100%;height:.5rem}.form-range::-moz-range-thumb{appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;width:1rem;height:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{color:#0000;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:#0000;border-radius:1rem;width:100%;height:.5rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width)*2));min-height:calc(3.5rem + calc(var(--bs-border-width)*2));line-height:1.25}.form-floating>label{z-index:2;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width)solid transparent;transform-origin:0 0;height:100%;padding:1rem .75rem;transition:opacity .1s ease-in-out,transform .1s ease-in-out;position:absolute;top:0;left:0;overflow:hidden}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::-moz-placeholder{color:#0000}.form-floating>.form-control::-moz-placeholder{color:#0000}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:#0000}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}:-webkit-any(.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:not(:placeholder-shown)){padding-top:1.625rem;padding-bottom:.625rem}:-webkit-any(.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill){padding-top:1.625rem;padding-bottom:.625rem}:-webkit-any(.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:not(:placeholder-shown)),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),:-webkit-any(.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill),.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}:is(.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:not(:placeholder-shown)),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),:is(.form-floating>.form-control-plaintext:autofill,.form-floating>.form-control:autofill),.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85)translateY(-.5rem)translate(.15rem)}.form-floating>.form-control:not(:placeholder-shown)~label:after,.form-floating>.form-control-plaintext~label:after,.form-floating>.form-control:focus~label:after,.form-floating>.form-control:not(:placeholder-shown)~label:after,.form-floating>.form-select~label:after{z-index:-1;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius);height:1.5em;position:absolute;inset:1rem .375rem}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85)translateY(-.5rem)translate(.15rem)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width)0}.form-floating>.form-control:disabled~label,.form-floating>:disabled~label{color:#6c757d}.form-floating>.form-control:disabled~label:after,.form-floating>:disabled~label:after{background-color:var(--bs-secondary-bg)}.input-group{flex-wrap:wrap;align-items:stretch;width:100%;display:flex;position:relative}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{flex:auto;width:1%;min-width:0;position:relative}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{z-index:2;position:relative}.input-group .btn:focus{z-index:5}.input-group-text{color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width)solid var(--bs-border-color);border-radius:var(--bs-border-radius);align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;display:flex}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{border-radius:var(--bs-border-radius-lg);padding:.5rem 1rem;font-size:1.25rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{border-radius:var(--bs-border-radius-sm);padding:.25rem .5rem;font-size:.875rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(var(--bs-border-width)*-1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{color:var(--bs-form-valid-color);width:100%;margin-top:.25rem;font-size:.875em;display:none}.valid-tooltip{z-index:5;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius);max-width:100%;margin-top:.1rem;padding:.25rem .5rem;font-size:.875rem;display:none;position:absolute;top:100%}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:var(--bs-form-valid-border-color);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);padding-right:calc(1.5em + .75rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{background-position:right calc(.375em + .1875rem) top calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:var(--bs-form-valid-border-color)}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,right 2.25rem center;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem);padding-right:4.125rem}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(1.5em + 3.75rem)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:var(--bs-form-valid-border-color)}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:var(--bs-form-valid-color)}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{color:var(--bs-form-invalid-color);width:100%;margin-top:.25rem;font-size:.875em;display:none}.invalid-tooltip{z-index:5;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius);max-width:100%;margin-top:.1rem;padding:.25rem .5rem;font-size:.875rem;display:none;position:absolute;top:100%}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:var(--bs-form-invalid-border-color);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);padding-right:calc(1.5em + .75rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{background-position:right calc(.375em + .1875rem) top calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:var(--bs-form-invalid-border-color)}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,right 2.25rem center;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem);padding-right:4.125rem}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(1.5em + 3.75rem)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:var(--bs-form-invalid-border-color)}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:var(--bs-form-invalid-color)}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--bs-btn-padding-x:.75rem;--bs-btn-padding-y:.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:transparent;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 #ffffff26,0 1px 1px #00000013;--bs-btn-disabled-opacity:.65;--bs-btn-focus-box-shadow:0 0 0 .25rem rgba(var(--bs-btn-focus-shadow-rgb),.5);padding:var(--bs-btn-padding-y)var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;vertical-align:middle;cursor:pointer;-webkit-user-select:none;user-select:none;border:var(--bs-btn-border-width)solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;display:inline-block}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);box-shadow:var(--bs-btn-focus-box-shadow);outline:0}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);box-shadow:var(--bs-btn-focus-box-shadow);outline:0}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn-check:checked:focus-visible+.btn{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49,132,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130,138,145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60,153,110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11,172,204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217,164,6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225,83,97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211,212,213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66,70,73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13,110,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108,117,125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25,135,84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13,202,240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255,193,7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220,53,69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248,249,250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33,37,41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212529;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:49,132,253;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:var(--bs-border-radius-lg)}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:.25rem;--bs-btn-padding-x:.5rem;--bs-btn-font-size:.875rem;--bs-btn-border-radius:var(--bs-border-radius-sm)}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;transition:height .35s;overflow:hidden}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{vertical-align:.255em;content:"";border:.3em solid #0000;border-top-color:currentColor;border-bottom:0;margin-left:.255em;display:inline-block}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:.5rem;--bs-dropdown-spacer:.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:var(--bs-body-color);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:var(--bs-border-radius);--bs-dropdown-border-width:var(--bs-border-width);--bs-dropdown-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:.5rem;--bs-dropdown-box-shadow:var(--bs-box-shadow);--bs-dropdown-link-color:var(--bs-body-color);--bs-dropdown-link-hover-color:var(--bs-body-color);--bs-dropdown-link-hover-bg:var(--bs-tertiary-bg);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:var(--bs-tertiary-color);--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:.5rem;z-index:var(--bs-dropdown-zindex);min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y)var(--bs-dropdown-padding-x);font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;background-color:var(--bs-dropdown-bg);border:var(--bs-dropdown-border-width)solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius);background-clip:padding-box;margin:0;list-style:none;display:none;position:absolute}.dropdown-menu[data-bs-popper]{margin-top:var(--bs-dropdown-spacer);top:100%;left:0}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{left:auto;right:0}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{left:auto;right:0}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{left:auto;right:0}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{left:auto;right:0}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{left:auto;right:0}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{left:auto;right:0}}.dropup .dropdown-menu[data-bs-popper]{margin-top:0;margin-bottom:var(--bs-dropdown-spacer);top:auto;bottom:100%}.dropup .dropdown-toggle:after{vertical-align:.255em;content:"";border:.3em solid #0000;border-top:0;border-bottom-color:currentColor;margin-left:.255em;display:inline-block}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{margin-top:0;margin-left:var(--bs-dropdown-spacer);top:0;left:100%;right:auto}.dropend .dropdown-toggle:after{vertical-align:.255em;content:"";border:.3em solid #0000;border-left-color:currentColor;border-right:0;margin-left:.255em;display:inline-block}.dropend .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-toggle:after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{margin-top:0;margin-right:var(--bs-dropdown-spacer);top:0;left:auto;right:100%}.dropstart .dropdown-toggle:after{vertical-align:.255em;content:"";margin-left:.255em;display:none}.dropstart .dropdown-toggle:before{vertical-align:.255em;content:"";border-top:.3em solid #0000;border-bottom:.3em solid #0000;border-right:.3em solid;margin-right:.255em;display:inline-block}.dropstart .dropdown-toggle:empty:after{margin-left:0}.dropstart .dropdown-toggle:before{vertical-align:0}.dropdown-divider{margin:var(--bs-dropdown-divider-margin-y)0;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1;height:0;overflow:hidden}.dropdown-item{padding:var(--bs-dropdown-item-padding-y)var(--bs-dropdown-item-padding-x);clear:both;color:var(--bs-dropdown-link-color);text-align:inherit;white-space:nowrap;border-radius:var(--bs-dropdown-item-border-radius,0);background-color:#0000;border:0;width:100%;font-weight:400;text-decoration:none;display:block}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);background-color:var(--bs-dropdown-link-active-bg);text-decoration:none}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:#0000}.dropdown-menu.show{display:block}.dropdown-header{padding:var(--bs-dropdown-header-padding-y)var(--bs-dropdown-header-padding-x);color:var(--bs-dropdown-header-color);white-space:nowrap;margin-bottom:0;font-size:.875rem;display:block}.dropdown-item-text{padding:var(--bs-dropdown-item-padding-y)var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color);display:block}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:#ffffff26;--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{vertical-align:middle;display:inline-flex;position:relative}.btn-group-vertical>.btn,.btn-group>.btn{flex:auto;position:relative}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{flex-wrap:wrap;justify-content:flex-start;display:flex}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--bs-border-radius)}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:calc(var(--bs-border-width)*-1)}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-left:.5625rem;padding-right:.5625rem}.dropdown-toggle-split:after,.dropend .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropstart .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-left:.375rem;padding-right:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-left:.75rem;padding-right:.75rem}.btn-group-vertical{flex-direction:column;justify-content:center;align-items:flex-start}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:calc(var(--bs-border-width)*-1)}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:var(--bs-secondary-color);flex-wrap:wrap;margin-bottom:0;padding-left:0;list-style:none;display:flex}.nav-link{padding:var(--bs-nav-link-padding-y)var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);background:0 0;border:0;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out;display:block}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:var(--bs-border-width);--bs-nav-tabs-border-color:var(--bs-border-color);--bs-nav-tabs-border-radius:var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color:var(--bs-secondary-bg)var(--bs-secondary-bg)var(--bs-border-color);--bs-nav-tabs-link-active-color:var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg:var(--bs-body-bg);--bs-nav-tabs-link-active-border-color:var(--bs-border-color)var(--bs-border-color)var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width)solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width)solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:var(--bs-border-radius);--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap:1rem;--bs-nav-underline-border-width:.125rem;--bs-nav-underline-link-active-color:var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{border-bottom:var(--bs-nav-underline-border-width)solid transparent;padding-left:0;padding-right:0}.nav-underline .nav-link:focus,.nav-underline .nav-link:hover{border-bottom-color:currentColor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentColor;font-weight:700}.nav-fill .nav-item,.nav-fill>.nav-link{text-align:center;flex:auto}.nav-justified .nav-item,.nav-justified>.nav-link{text-align:center;flex-grow:1;flex-basis:0}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:.5rem;--bs-navbar-color:rgba(var(--bs-emphasis-color-rgb),.65);--bs-navbar-hover-color:rgba(var(--bs-emphasis-color-rgb),.8);--bs-navbar-disabled-color:rgba(var(--bs-emphasis-color-rgb),.3);--bs-navbar-active-color:rgba(var(--bs-emphasis-color-rgb),1);--bs-navbar-brand-padding-y:.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(var(--bs-emphasis-color-rgb),1);--bs-navbar-brand-hover-color:rgba(var(--bs-emphasis-color-rgb),1);--bs-navbar-nav-link-padding-x:.5rem;--bs-navbar-toggler-padding-y:.25rem;--bs-navbar-toggler-padding-x:.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(var(--bs-emphasis-color-rgb),.15);--bs-navbar-toggler-border-radius:var(--bs-border-radius);--bs-navbar-toggler-focus-width:.25rem;--bs-navbar-toggler-transition:box-shadow .15s ease-in-out;padding:var(--bs-navbar-padding-y)var(--bs-navbar-padding-x);flex-wrap:wrap;justify-content:space-between;align-items:center;display:flex;position:relative}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{flex-wrap:inherit;justify-content:space-between;align-items:center;display:flex}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);white-space:nowrap;text-decoration:none}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);flex-direction:column;margin-bottom:0;padding-left:0;list-style:none;display:flex}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{color:var(--bs-navbar-color);padding-top:.5rem;padding-bottom:.5rem}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-grow:1;flex-basis:100%;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y)var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);color:var(--bs-navbar-color);border:var(--bs-border-width)solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition);background-color:#0000;line-height:1}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width);outline:0;text-decoration:none}.navbar-toggler-icon{vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-position:50%;background-repeat:no-repeat;background-size:100%;width:1.5em;height:1.5em;display:inline-block}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color:#ffffff8c;--bs-navbar-hover-color:#ffffffbf;--bs-navbar-disabled-color:#ffffff40;--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:#ffffff1a;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width:var(--bs-border-width);--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y:.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(var(--bs-body-color-rgb),.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:var(--bs-body-bg);--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:.75rem;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);border:var(--bs-card-border-width)solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius);background-clip:border-box;flex-direction:column;min-width:0;display:flex;position:relative}.card>hr{margin-left:0;margin-right:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius);border-top-width:0}.card>.list-group:last-child{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius);border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{padding:var(--bs-card-spacer-y)var(--bs-card-spacer-x);color:var(--bs-card-color);flex:auto}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5*var(--bs-card-title-spacer-y));color:var(--bs-card-subtitle-color);margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y)var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width)solid var(--bs-card-border-color);margin-bottom:0}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius)var(--bs-card-inner-border-radius)0 0}.card-footer{padding:var(--bs-card-cap-padding-y)var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width)solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius)var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5*var(--bs-card-cap-padding-x));margin-left:calc(-.5*var(--bs-card-cap-padding-x))}.card-img-overlay{padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius);position:absolute;inset:0}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width:576px){.card-group{flex-flow:wrap;display:flex}.card-group>.card{flex:1 0;margin-bottom:0}.card-group>.card+.card{border-left:0;margin-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:var(--bs-body-bg);--bs-accordion-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:var(--bs-border-width);--bs-accordion-border-radius:var(--bs-border-radius);--bs-accordion-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform .2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23052c65' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-focus-box-shadow:0 0 0 .25rem #0d6efd40;--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:var(--bs-primary-text-emphasis);--bs-accordion-active-bg:var(--bs-primary-bg-subtle)}.accordion-button{padding:var(--bs-accordion-btn-padding-y)var(--bs-accordion-btn-padding-x);color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);overflow-anchor:none;transition:var(--bs-accordion-transition);border:0;border-radius:0;align-items:center;width:100%;font-size:1rem;display:flex;position:relative}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width))0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed):after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button:after{width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition);flex-shrink:0;margin-left:auto}@media (prefers-reduced-motion:reduce){.accordion-button:after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;box-shadow:var(--bs-accordion-btn-focus-box-shadow);outline:0}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width)solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type>.accordion-header .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type>.accordion-header .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type>.accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y)var(--bs-accordion-body-padding-x)}.accordion-flush>.accordion-item{border-left:0;border-right:0;border-radius:0}.accordion-flush>.accordion-item:first-child{border-top:0}.accordion-flush>.accordion-item:last-child{border-bottom:0}.accordion-flush>.accordion-item>.accordion-header .accordion-button,.accordion-flush>.accordion-item>.accordion-header .accordion-button.collapsed,.accordion-flush>.accordion-item>.accordion-collapse{border-radius:0}[data-bs-theme=dark] .accordion-button:after{--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:var(--bs-secondary-color);--bs-breadcrumb-item-padding-x:.5rem;--bs-breadcrumb-item-active-color:var(--bs-secondary-color);padding:var(--bs-breadcrumb-padding-y)var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius);flex-wrap:wrap;list-style:none;display:flex}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider,"/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:.75rem;--bs-pagination-padding-y:.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:var(--bs-body-bg);--bs-pagination-border-width:var(--bs-border-width);--bs-pagination-border-color:var(--bs-border-color);--bs-pagination-border-radius:var(--bs-border-radius);--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:var(--bs-tertiary-bg);--bs-pagination-hover-border-color:var(--bs-border-color);--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:var(--bs-secondary-bg);--bs-pagination-focus-box-shadow:0 0 0 .25rem #0d6efd40;--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--bs-pagination-disabled-color:var(--bs-secondary-color);--bs-pagination-disabled-bg:var(--bs-secondary-bg);--bs-pagination-disabled-border-color:var(--bs-border-color);padding-left:0;list-style:none;display:flex}.page-link{padding:var(--bs-pagination-padding-y)var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width)solid var(--bs-pagination-border-color);text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;display:block;position:relative}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);box-shadow:var(--bs-pagination-focus-box-shadow);outline:0}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(var(--bs-border-width)*-1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x:.5rem;--bs-pagination-padding-y:.25rem;--bs-pagination-font-size:.875rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x:.65em;--bs-badge-padding-y:.35em;--bs-badge-font-size:.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:var(--bs-border-radius);padding:var(--bs-badge-padding-y)var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius);line-height:1;display:inline-block}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:var(--bs-border-width)solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;padding:var(--bs-alert-padding-y)var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius);position:relative}.alert-heading{color:inherit}.alert-link{color:var(--bs-alert-link-color);font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{z-index:2;padding:1.25rem 1rem;position:absolute;top:0;right:0}.alert-primary{--bs-alert-color:var(--bs-primary-text-emphasis);--bs-alert-bg:var(--bs-primary-bg-subtle);--bs-alert-border-color:var(--bs-primary-border-subtle);--bs-alert-link-color:var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color:var(--bs-secondary-text-emphasis);--bs-alert-bg:var(--bs-secondary-bg-subtle);--bs-alert-border-color:var(--bs-secondary-border-subtle);--bs-alert-link-color:var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color:var(--bs-success-text-emphasis);--bs-alert-bg:var(--bs-success-bg-subtle);--bs-alert-border-color:var(--bs-success-border-subtle);--bs-alert-link-color:var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color:var(--bs-info-text-emphasis);--bs-alert-bg:var(--bs-info-bg-subtle);--bs-alert-border-color:var(--bs-info-border-subtle);--bs-alert-link-color:var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color:var(--bs-warning-text-emphasis);--bs-alert-bg:var(--bs-warning-bg-subtle);--bs-alert-border-color:var(--bs-warning-border-subtle);--bs-alert-link-color:var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color:var(--bs-danger-text-emphasis);--bs-alert-bg:var(--bs-danger-bg-subtle);--bs-alert-border-color:var(--bs-danger-border-subtle);--bs-alert-link-color:var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color:var(--bs-light-text-emphasis);--bs-alert-bg:var(--bs-light-bg-subtle);--bs-alert-border-color:var(--bs-light-border-subtle);--bs-alert-link-color:var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color:var(--bs-dark-text-emphasis);--bs-alert-bg:var(--bs-dark-bg-subtle);--bs-alert-border-color:var(--bs-dark-border-subtle);--bs-alert-link-color:var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height:1rem;--bs-progress-font-size:.75rem;--bs-progress-bg:var(--bs-secondary-bg);--bs-progress-border-radius:var(--bs-border-radius);--bs-progress-box-shadow:var(--bs-box-shadow-inset);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#0d6efd;--bs-progress-bar-transition:width .6s ease;height:var(--bs-progress-height);font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius);display:flex;overflow:hidden}.progress-bar{color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition);flex-direction:column;justify-content:center;display:flex;overflow:hidden}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,#ffffff26 25%,#0000 25% 50%,#ffffff26 50% 75%,#0000 75%,#0000);background-size:var(--bs-progress-height)var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:var(--bs-body-color);--bs-list-group-bg:var(--bs-body-bg);--bs-list-group-border-color:var(--bs-border-color);--bs-list-group-border-width:var(--bs-border-width);--bs-list-group-border-radius:var(--bs-border-radius);--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:.5rem;--bs-list-group-action-color:var(--bs-secondary-color);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-tertiary-bg);--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-secondary-bg);--bs-list-group-disabled-color:var(--bs-secondary-color);--bs-list-group-disabled-bg:var(--bs-body-bg);--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#0d6efd;--bs-list-group-active-border-color:#0d6efd;border-radius:var(--bs-list-group-border-radius);flex-direction:column;margin-bottom:0;padding-left:0;display:flex}.list-group-numbered{counter-reset:section;list-style-type:none}.list-group-numbered>.list-group-item:before{content:counters(section,".")". ";counter-increment:section}.list-group-item-action{color:var(--bs-list-group-action-color);text-align:inherit;width:100%}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:var(--bs-list-group-action-hover-color);background-color:var(--bs-list-group-action-hover-bg);text-decoration:none}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{padding:var(--bs-list-group-item-padding-y)var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width)solid var(--bs-list-group-border-color);text-decoration:none;display:block;position:relative}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color:var(--bs-primary-text-emphasis);--bs-list-group-bg:var(--bs-primary-bg-subtle);--bs-list-group-border-color:var(--bs-primary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-primary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-primary-border-subtle);--bs-list-group-active-color:var(--bs-primary-bg-subtle);--bs-list-group-active-bg:var(--bs-primary-text-emphasis);--bs-list-group-active-border-color:var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color:var(--bs-secondary-text-emphasis);--bs-list-group-bg:var(--bs-secondary-bg-subtle);--bs-list-group-border-color:var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-secondary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-secondary-border-subtle);--bs-list-group-active-color:var(--bs-secondary-bg-subtle);--bs-list-group-active-bg:var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color:var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color:var(--bs-success-text-emphasis);--bs-list-group-bg:var(--bs-success-bg-subtle);--bs-list-group-border-color:var(--bs-success-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-success-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-success-border-subtle);--bs-list-group-active-color:var(--bs-success-bg-subtle);--bs-list-group-active-bg:var(--bs-success-text-emphasis);--bs-list-group-active-border-color:var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color:var(--bs-info-text-emphasis);--bs-list-group-bg:var(--bs-info-bg-subtle);--bs-list-group-border-color:var(--bs-info-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-info-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-info-border-subtle);--bs-list-group-active-color:var(--bs-info-bg-subtle);--bs-list-group-active-bg:var(--bs-info-text-emphasis);--bs-list-group-active-border-color:var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color:var(--bs-warning-text-emphasis);--bs-list-group-bg:var(--bs-warning-bg-subtle);--bs-list-group-border-color:var(--bs-warning-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-warning-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-warning-border-subtle);--bs-list-group-active-color:var(--bs-warning-bg-subtle);--bs-list-group-active-bg:var(--bs-warning-text-emphasis);--bs-list-group-active-border-color:var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color:var(--bs-danger-text-emphasis);--bs-list-group-bg:var(--bs-danger-bg-subtle);--bs-list-group-border-color:var(--bs-danger-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-danger-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-danger-border-subtle);--bs-list-group-active-color:var(--bs-danger-bg-subtle);--bs-list-group-active-bg:var(--bs-danger-text-emphasis);--bs-list-group-active-border-color:var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color:var(--bs-light-text-emphasis);--bs-list-group-bg:var(--bs-light-bg-subtle);--bs-list-group-border-color:var(--bs-light-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-light-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-light-border-subtle);--bs-list-group-active-color:var(--bs-light-bg-subtle);--bs-list-group-active-bg:var(--bs-light-text-emphasis);--bs-list-group-active-border-color:var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color:var(--bs-dark-text-emphasis);--bs-list-group-bg:var(--bs-dark-bg-subtle);--bs-list-group-border-color:var(--bs-dark-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-dark-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-dark-border-subtle);--bs-list-group-active-color:var(--bs-dark-bg-subtle);--bs-list-group-active-bg:var(--bs-dark-text-emphasis);--bs-list-group-active-border-color:var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity:.5;--bs-btn-close-hover-opacity:.75;--bs-btn-close-focus-shadow:0 0 0 .25rem #0d6efd40;--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:.25;--bs-btn-close-white-filter:invert(1)grayscale(100%)brightness(200%);box-sizing:content-box;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg)center/1em auto no-repeat;opacity:var(--bs-btn-close-opacity);border:0;border-radius:.375rem;width:1em;height:1em;padding:.25em}.btn-close:hover{color:var(--bs-btn-close-color);opacity:var(--bs-btn-close-hover-opacity);text-decoration:none}.btn-close:focus{box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity);outline:0}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white,[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:.75rem;--bs-toast-padding-y:.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(var(--bs-body-bg-rgb),.85);--bs-toast-border-width:var(--bs-border-width);--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:var(--bs-secondary-color);--bs-toast-header-bg:rgba(var(--bs-body-bg-rgb),.85);--bs-toast-header-border-color:var(--bs-border-color-translucent);width:var(--bs-toast-max-width);font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);border:var(--bs-toast-border-width)solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius);background-clip:padding-box;max-width:100%}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;z-index:var(--bs-toast-zindex);pointer-events:none;width:max-content;max-width:100%;position:absolute}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{padding:var(--bs-toast-padding-y)var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);border-bottom:var(--bs-toast-border-width)solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));background-clip:padding-box;align-items:center;display:flex}.toast-header .btn-close{margin-right:calc(-.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:.5rem;--bs-modal-color: ;--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:var(--bs-border-width);--bs-modal-border-radius:var(--bs-border-radius-lg);--bs-modal-box-shadow:var(--bs-box-shadow-sm);--bs-modal-inner-border-radius:calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:var(--bs-border-width);--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:var(--bs-border-width);z-index:var(--bs-modal-zindex);outline:0;width:100%;height:100%;display:none;position:fixed;top:0;left:0;overflow:hidden auto}.modal-dialog{margin:var(--bs-modal-margin);pointer-events:none;width:auto;position:relative}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translateY(-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{min-height:calc(100% - var(--bs-modal-margin)*2);align-items:center;display:flex}.modal-content{color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);border:var(--bs-modal-border-width)solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);background-clip:padding-box;outline:0;flex-direction:column;width:100%;display:flex;position:relative}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:.5;z-index:var(--bs-backdrop-zindex);background-color:var(--bs-backdrop-bg);width:100vw;height:100vh;position:fixed;top:0;left:0}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width)solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius);flex-shrink:0;align-items:center;display:flex}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5)calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-.5*var(--bs-modal-header-padding-y))calc(-.5*var(--bs-modal-header-padding-x))calc(-.5*var(--bs-modal-header-padding-y))auto}.modal-title{line-height:var(--bs-modal-title-line-height);margin-bottom:0}.modal-body{padding:var(--bs-modal-padding);flex:auto;position:relative}.modal-footer{padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width)solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius);flex-wrap:wrap;flex-shrink:0;justify-content:flex-end;align-items:center;display:flex}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:var(--bs-box-shadow)}.modal-dialog{max-width:var(--bs-modal-width);margin-left:auto;margin-right:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:.5rem;--bs-tooltip-padding-y:.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:.875rem;--bs-tooltip-color:var(--bs-body-bg);--bs-tooltip-bg:var(--bs-emphasis-color);--bs-tooltip-border-radius:var(--bs-border-radius);--bs-tooltip-opacity:.9;--bs-tooltip-arrow-width:.8rem;--bs-tooltip-arrow-height:.4rem;z-index:var(--bs-tooltip-zindex);margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);text-align:left;text-align:start;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-style:normal;font-weight:400;line-height:1.5;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0;text-decoration:none;display:block}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height);display:block}.tooltip .tooltip-arrow:before{content:"";border-style:solid;border-color:#0000;position:absolute}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before,.bs-tooltip-top .tooltip-arrow:before{border-width:var(--bs-tooltip-arrow-height)calc(var(--bs-tooltip-arrow-width)*.5)0;border-top-color:var(--bs-tooltip-bg);top:-1px}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before,.bs-tooltip-end .tooltip-arrow:before{border-width:calc(var(--bs-tooltip-arrow-width)*.5)var(--bs-tooltip-arrow-height)calc(var(--bs-tooltip-arrow-width)*.5)0;border-right-color:var(--bs-tooltip-bg);right:-1px}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before,.bs-tooltip-bottom .tooltip-arrow:before{border-width:0 calc(var(--bs-tooltip-arrow-width)*.5)var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg);bottom:-1px}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before,.bs-tooltip-start .tooltip-arrow:before{border-width:calc(var(--bs-tooltip-arrow-width)*.5)0 calc(var(--bs-tooltip-arrow-width)*.5)var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg);left:-1px}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y)var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:.875rem;--bs-popover-bg:var(--bs-body-bg);--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:var(--bs-border-radius-lg);--bs-popover-inner-border-radius:calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow:var(--bs-box-shadow);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:inherit;--bs-popover-header-bg:var(--bs-secondary-bg);--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:var(--bs-body-color);--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);text-align:left;text-align:start;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-style:normal;font-weight:400;line-height:1.5;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);border:var(--bs-popover-border-width)solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius);background-clip:padding-box;text-decoration:none;display:block}.popover .popover-arrow{width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height);display:block}.popover .popover-arrow:after,.popover .popover-arrow:before{content:"";border:0 solid #0000;display:block;position:absolute}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,.bs-popover-top>.popover-arrow:after,.bs-popover-top>.popover-arrow:before{border-width:var(--bs-popover-arrow-height)calc(var(--bs-popover-arrow-width)*.5)0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,.bs-popover-top>.popover-arrow:before{border-top-color:var(--bs-popover-arrow-border);bottom:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after,.bs-popover-top>.popover-arrow:after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,.bs-popover-end>.popover-arrow:after,.bs-popover-end>.popover-arrow:before{border-width:calc(var(--bs-popover-arrow-width)*.5)var(--bs-popover-arrow-height)calc(var(--bs-popover-arrow-width)*.5)0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,.bs-popover-end>.popover-arrow:before{border-right-color:var(--bs-popover-arrow-border);left:0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after,.bs-popover-end>.popover-arrow:after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,.bs-popover-bottom>.popover-arrow:after,.bs-popover-bottom>.popover-arrow:before{border-width:0 calc(var(--bs-popover-arrow-width)*.5)var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,.bs-popover-bottom>.popover-arrow:before{border-bottom-color:var(--bs-popover-arrow-border);top:0}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after,.bs-popover-bottom>.popover-arrow:after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{width:var(--bs-popover-arrow-width);margin-left:calc(-.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width)solid var(--bs-popover-header-bg);display:block;position:absolute;top:0;left:50%}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,.bs-popover-start>.popover-arrow:after,.bs-popover-start>.popover-arrow:before{border-width:calc(var(--bs-popover-arrow-width)*.5)0 calc(var(--bs-popover-arrow-width)*.5)var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,.bs-popover-start>.popover-arrow:before{border-left-color:var(--bs-popover-arrow-border);right:0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after,.bs-popover-start>.popover-arrow:after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y)var(--bs-popover-header-padding-x);font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width)solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius);margin-bottom:0}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y)var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{width:100%;position:relative;overflow:hidden}.carousel-inner:after{clear:both;content:"";display:block}.carousel-item{float:left;backface-visibility:hidden;width:100%;margin-right:-100%;transition:transform .6s ease-in-out;display:none;position:relative}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translate(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translate(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{z-index:1;color:#fff;text-align:center;opacity:.5;background:0 0;border:0;justify-content:center;align-items:center;width:15%;padding:0;transition:opacity .15s;display:flex;position:absolute;top:0;bottom:0}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;opacity:.9;outline:0;text-decoration:none}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{background-position:50%;background-repeat:no-repeat;background-size:100% 100%;width:2rem;height:2rem;display:inline-block}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{z-index:2;justify-content:center;margin-bottom:1rem;margin-left:15%;margin-right:15%;padding:0;display:flex;position:absolute;bottom:0;left:0;right:0}.carousel-indicators [data-bs-target]{box-sizing:content-box;text-indent:-999px;cursor:pointer;opacity:.5;background-color:#fff;background-clip:padding-box;border:10px solid #0000;border-left:0;border-right:0;flex:0 auto;width:30px;height:3px;margin-left:3px;margin-right:3px;padding:0;transition:opacity .6s}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{color:#fff;text-align:center;padding-top:1.25rem;padding-bottom:1.25rem;position:absolute;bottom:1.25rem;left:15%;right:15%}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert()grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon{filter:invert()grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-border,.spinner-grow{width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);animation:var(--bs-spinner-animation-speed)linear infinite var(--bs-spinner-animation-name);border-radius:50%;display:inline-block}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-.125em;--bs-spinner-border-width:.25em;--bs-spinner-animation-speed:.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width)solid currentcolor;border-right-color:#0000}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-.125em;--bs-spinner-animation-speed:.75s;--bs-spinner-animation-name:spinner-grow;opacity:0;background-color:currentColor}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:var(--bs-border-width);--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:var(--bs-box-shadow-sm);--bs-offcanvas-transition:transform .3s ease-in-out;--bs-offcanvas-title-line-height:1.5}@media (max-width:575.98px){.offcanvas-sm{z-index:var(--bs-offcanvas-zindex);color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;max-width:100%;display:flex;position:fixed;bottom:0}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas-sm.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas-sm.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible;background-color:#0000!important}}@media (max-width:767.98px){.offcanvas-md{z-index:var(--bs-offcanvas-zindex);color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;max-width:100%;display:flex;position:fixed;bottom:0}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas-md.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas-md.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible;background-color:#0000!important}}@media (max-width:991.98px){.offcanvas-lg{z-index:var(--bs-offcanvas-zindex);color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;max-width:100%;display:flex;position:fixed;bottom:0}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas-lg.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas-lg.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible;background-color:#0000!important}}@media (max-width:1199.98px){.offcanvas-xl{z-index:var(--bs-offcanvas-zindex);color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;max-width:100%;display:flex;position:fixed;bottom:0}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas-xl.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas-xl.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible;background-color:#0000!important}}@media (max-width:1399.98px){.offcanvas-xxl{z-index:var(--bs-offcanvas-zindex);color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;max-width:100%;display:flex;position:fixed;bottom:0}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas-xxl.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas-xxl.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible;background-color:#0000!important}}.offcanvas{z-index:var(--bs-offcanvas-zindex);color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;max-width:100%;display:flex;position:fixed;bottom:0}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{z-index:1040;background-color:#000;width:100vw;height:100vh;position:fixed;top:0;left:0}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{padding:var(--bs-offcanvas-padding-y)var(--bs-offcanvas-padding-x);align-items:center;display:flex}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5)calc(var(--bs-offcanvas-padding-x)*.5);margin:calc(-.5*var(--bs-offcanvas-padding-y))calc(-.5*var(--bs-offcanvas-padding-x))calc(-.5*var(--bs-offcanvas-padding-y))auto}.offcanvas-title{line-height:var(--bs-offcanvas-title-line-height);margin-bottom:0}.offcanvas-body{padding:var(--bs-offcanvas-padding-y)var(--bs-offcanvas-padding-x);flex-grow:1;overflow-y:auto}.placeholder{vertical-align:middle;cursor:wait;opacity:.5;background-color:currentColor;min-height:1em;display:inline-block}.placeholder.btn:before{content:"";display:inline-block}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:2s ease-in-out infinite placeholder-glow}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{animation:2s linear infinite placeholder-wave;-webkit-mask-image:linear-gradient(130deg,#000 55%,#000c 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,#000c 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%}@keyframes placeholder-wave{to{-webkit-mask-position:-200% 0;mask-position:-200% 0}}.clearfix:after{clear:both;content:"";display:block}.text-bg-primary{color:#fff!important;background-color:RGBA(var(--bs-primary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#fff!important;background-color:RGBA(var(--bs-secondary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(var(--bs-success-rgb),var(--bs-bg-opacity,1))!important}.text-bg-info{color:#000!important;background-color:RGBA(var(--bs-info-rgb),var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(var(--bs-warning-rgb),var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(var(--bs-danger-rgb),var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(var(--bs-light-rgb),var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(var(--bs-dark-rgb),var(--bs-bg-opacity,1))!important}.link-primary{color:RGBA(var(--bs-primary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important}.link-primary:focus,.link-primary:hover{color:RGBA(10,88,202,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important}.link-secondary{color:RGBA(var(--bs-secondary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important}.link-secondary:focus,.link-secondary:hover{color:RGBA(86,94,100,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important}.link-success{color:RGBA(var(--bs-success-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important}.link-success:focus,.link-success:hover{color:RGBA(20,108,67,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important}.link-info{color:RGBA(var(--bs-info-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important}.link-info:focus,.link-info:hover{color:RGBA(61,213,243,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important}.link-warning{color:RGBA(var(--bs-warning-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important}.link-warning:focus,.link-warning:hover{color:RGBA(255,205,57,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important}.link-danger{color:RGBA(var(--bs-danger-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important}.link-danger:focus,.link-danger:hover{color:RGBA(176,42,55,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important}.link-light{color:RGBA(var(--bs-light-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important}.link-light:focus,.link-light:hover{color:RGBA(249,250,251,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important}.link-dark{color:RGBA(var(--bs-dark-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important}.link-dark:focus,.link-dark:hover{color:RGBA(26,30,33,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-body-emphasis:focus,.link-body-emphasis:hover{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,.75))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,.75))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,.75))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,.75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,.75))!important}.focus-ring:focus{box-shadow:var(--bs-focus-ring-x,0)var(--bs-focus-ring-y,0)var(--bs-focus-ring-blur,0)var(--bs-focus-ring-width)var(--bs-focus-ring-color);outline:0}.icon-link{-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,.5));-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,.5));-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,.5));text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,.5));text-underline-offset:.25em;backface-visibility:hidden;align-items:center;gap:.375rem;display:inline-flex}.icon-link>.bi{fill:currentColor;flex-shrink:0;width:1em;height:1em;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.icon-link>.bi{transition:none}}.icon-link-hover:focus-visible>.bi,.icon-link-hover:hover>.bi{transform:var(--bs-icon-link-transform,translate3d(.25em,0,0))}.ratio{width:100%;position:relative}.ratio:before{padding-top:var(--bs-aspect-ratio);content:"";display:block}.ratio>*{width:100%;height:100%;position:absolute;top:0;left:0}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571%}.fixed-top{z-index:1030;position:fixed;top:0;left:0;right:0}.fixed-bottom{z-index:1030;position:fixed;bottom:0;left:0;right:0}.sticky-top{z-index:1020;position:sticky;top:0}.sticky-bottom{z-index:1020;position:sticky;bottom:0}@media (min-width:576px){.sticky-sm-top{z-index:1020;position:sticky;top:0}.sticky-sm-bottom{z-index:1020;position:sticky;bottom:0}}@media (min-width:768px){.sticky-md-top{z-index:1020;position:sticky;top:0}.sticky-md-bottom{z-index:1020;position:sticky;bottom:0}}@media (min-width:992px){.sticky-lg-top{z-index:1020;position:sticky;top:0}.sticky-lg-bottom{z-index:1020;position:sticky;bottom:0}}@media (min-width:1200px){.sticky-xl-top{z-index:1020;position:sticky;top:0}.sticky-xl-bottom{z-index:1020;position:sticky;bottom:0}}@media (min-width:1400px){.sticky-xxl-top{z-index:1020;position:sticky;top:0}.sticky-xxl-bottom{z-index:1020;position:sticky;bottom:0}}.hstack{flex-direction:row;align-self:stretch;align-items:center;display:flex}.vstack{flex-direction:column;flex:auto;align-self:stretch;display:flex}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important;width:1px!important;height:1px!important;margin:-1px!important;padding:0!important;overflow:hidden!important}.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption),.visually-hidden:not(caption){position:absolute!important}.stretched-link:after{z-index:1;content:"";position:absolute;inset:0}.text-truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.vr{width:var(--bs-border-width);opacity:.25;background-color:currentColor;align-self:stretch;min-height:1em;display:inline-block}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-none{-o-object-fit:none!important;object-fit:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:var(--bs-box-shadow)!important}.shadow-sm{box-shadow:var(--bs-box-shadow-sm)!important}.shadow-lg{box-shadow:var(--bs-box-shadow-lg)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--bs-focus-ring-color:rgba(var(--bs-primary-rgb),var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color:rgba(var(--bs-secondary-rgb),var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color:rgba(var(--bs-success-rgb),var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color:rgba(var(--bs-info-rgb),var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color:rgba(var(--bs-warning-rgb),var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color:rgba(var(--bs-danger-rgb),var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb),var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color:rgba(var(--bs-dark-rgb),var(--bs-focus-ring-opacity))}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translate(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-black{--bs-border-opacity:1;border-color:rgba(var(--bs-black-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--bs-success-border-subtle)!important}.border-info-subtle{border-color:var(--bs-info-border-subtle)!important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle)!important}.border-light-subtle{border-color:var(--bs-light-border-subtle)!important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--bs-border-opacity:.1}.border-opacity-25{--bs-border-opacity:.25}.border-opacity-50{--bs-border-opacity:.5}.border-opacity-75{--bs-border-opacity:.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-left:0!important;margin-right:0!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-3{margin-left:1rem!important;margin-right:1rem!important}.mx-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-5{margin-left:3rem!important;margin-right:3rem!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-left:0!important;padding-right:0!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-3{padding-left:1rem!important;padding-right:1rem!important}.px-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-5{padding-left:3rem!important;padding-right:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:3rem!important}.column-gap-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-1{-moz-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-2{-moz-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold{font-weight:600!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-black-50{--bs-text-opacity:1;color:#00000080!important}.text-white-50{--bs-text-opacity:1;color:#ffffff80!important}.text-body-secondary{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-body-tertiary{--bs-text-opacity:1;color:var(--bs-tertiary-color)!important}.text-body-emphasis{--bs-text-opacity:1;color:var(--bs-emphasis-color)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:.25}.text-opacity-50{--bs-text-opacity:.5}.text-opacity-75{--bs-text-opacity:.75}.text-opacity-100{--bs-text-opacity:1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--bs-success-text-emphasis)!important}.text-info-emphasis{color:var(--bs-info-text-emphasis)!important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis)!important}.text-light-emphasis{color:var(--bs-light-text-emphasis)!important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis)!important}.link-opacity-10,.link-opacity-10-hover:hover{--bs-link-opacity:.1}.link-opacity-25,.link-opacity-25-hover:hover{--bs-link-opacity:.25}.link-opacity-50,.link-opacity-50-hover:hover{--bs-link-opacity:.5}.link-opacity-75,.link-opacity-75-hover:hover{--bs-link-opacity:.75}.link-opacity-100,.link-opacity-100-hover:hover{--bs-link-opacity:1}.link-offset-1,.link-offset-1-hover:hover{text-underline-offset:.125em!important}.link-offset-2,.link-offset-2-hover:hover{text-underline-offset:.25em!important}.link-offset-3,.link-offset-3-hover:hover{text-underline-offset:.375em!important}.link-underline-primary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-secondary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-success{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important}.link-underline-info{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important}.link-underline-warning{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important}.link-underline-danger{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important}.link-underline-light{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important}.link-underline-dark{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important;-webkit-text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important}.link-underline{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-underline-opacity-0,.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity:0}.link-underline-opacity-10,.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity:.1}.link-underline-opacity-25,.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity:.25}.link-underline-opacity-50,.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity:.5}.link-underline-opacity-75,.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity:.75}.link-underline-opacity-100,.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:#0000!important}.bg-body-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-bg-rgb),var(--bs-bg-opacity))!important}.bg-body-tertiary{--bs-bg-opacity:1;background-color:rgba(var(--bs-tertiary-bg-rgb),var(--bs-bg-opacity))!important}.bg-opacity-10{--bs-bg-opacity:.1}.bg-opacity-25{--bs-bg-opacity:.25}.bg-opacity-50{--bs-bg-opacity:.5}.bg-opacity-75{--bs-bg-opacity:.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle)!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm)!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg)!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl)!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill)!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm)!important;border-bottom-left-radius:var(--bs-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg)!important;border-bottom-left-radius:var(--bs-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl)!important;border-bottom-left-radius:var(--bs-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-left-radius:var(--bs-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill)!important;border-bottom-left-radius:var(--bs-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-0{border-top-left-radius:0!important;border-bottom-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-top-left-radius:var(--bs-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-top-left-radius:var(--bs-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-top-left-radius:var(--bs-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-top-left-radius:var(--bs-border-radius-xxl)!important}.rounded-start-circle{border-top-left-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-top-left-radius:var(--bs-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-sm-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-sm-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-sm-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-sm-none{-o-object-fit:none!important;object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-left:0!important;margin-right:0!important}.mx-sm-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-sm-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-sm-3{margin-left:1rem!important;margin-right:1rem!important}.mx-sm-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-sm-5{margin-left:3rem!important;margin-right:3rem!important}.mx-sm-auto{margin-left:auto!important;margin-right:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-left:0!important;padding-right:0!important}.px-sm-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-sm-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-sm-3{padding-left:1rem!important;padding-right:1rem!important}.px-sm-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-sm-5{padding-left:3rem!important;padding-right:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:3rem!important}.column-gap-sm-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-sm-1{-moz-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-sm-2{-moz-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-sm-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-sm-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-sm-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-md-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-md-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-md-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-md-none{-o-object-fit:none!important;object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-left:0!important;margin-right:0!important}.mx-md-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-md-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-md-3{margin-left:1rem!important;margin-right:1rem!important}.mx-md-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-md-5{margin-left:3rem!important;margin-right:3rem!important}.mx-md-auto{margin-left:auto!important;margin-right:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-left:0!important;padding-right:0!important}.px-md-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-md-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-md-3{padding-left:1rem!important;padding-right:1rem!important}.px-md-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-md-5{padding-left:3rem!important;padding-right:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:3rem!important}.column-gap-md-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-md-1{-moz-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-md-2{-moz-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-md-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-md-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-md-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-lg-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-lg-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-lg-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-lg-none{-o-object-fit:none!important;object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-left:0!important;margin-right:0!important}.mx-lg-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-lg-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-lg-3{margin-left:1rem!important;margin-right:1rem!important}.mx-lg-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-lg-5{margin-left:3rem!important;margin-right:3rem!important}.mx-lg-auto{margin-left:auto!important;margin-right:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-left:0!important;padding-right:0!important}.px-lg-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-lg-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-lg-3{padding-left:1rem!important;padding-right:1rem!important}.px-lg-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-lg-5{padding-left:3rem!important;padding-right:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:3rem!important}.column-gap-lg-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-lg-1{-moz-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-lg-2{-moz-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-lg-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-lg-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-lg-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xl-none{-o-object-fit:none!important;object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-left:0!important;margin-right:0!important}.mx-xl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xl-auto{margin-left:auto!important;margin-right:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-left:0!important;padding-right:0!important}.px-xl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:3rem!important}.column-gap-xl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xl-1{-moz-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-xl-2{-moz-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-xl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xxl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xxl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xxl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xxl-none{-o-object-fit:none!important;object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-left:0!important;margin-right:0!important}.mx-xxl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xxl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xxl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xxl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xxl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xxl-auto{margin-left:auto!important;margin-right:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-left:0!important;padding-right:0!important}.px-xxl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xxl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xxl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xxl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xxl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:3rem!important}.column-gap-xxl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xxl-1{-moz-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-xxl-2{-moz-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-xxl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xxl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xxl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}:root{--body-bg-color:#eae9e9;--body-color:#212529;--move-btn-width:60px;--move-btn-height:34px;--focus-ring:0 0 0 .2rem var(--bs-focus-ring-color);--focus-ring-error:0 0 0 .2rem rgba(var(--bs-danger-rgb),.4);accent-color:var(--bs-primary);font-size:14px}:not(:defined){display:none!important}body{background-color:var(--body-bg-color);overflow-x:hidden}[hidden]{display:none!important}a:focus-visible,details summary:focus-visible{border-radius:var(--bs-border-radius);box-shadow:var(--focus-ring);outline:0;transition:box-shadow .15s ease-in-out}.container{max-width:1500px}.site-header{text-align:center;flex-direction:column;align-items:center;row-gap:.5rem;margin:3rem .5rem;display:flex}.page-title{margin-bottom:0;font-weight:300}.form-control:out-of-range{border-color:var(--bs-form-invalid-border-color);color:var(--bs-form-invalid-color)}.form-control:out-of-range:focus{box-shadow:var(--focus-ring-error)}.canvas{max-width:100%;display:block}.textboxes-container input[type=color],.settings-button,.duplicate-button{cursor:pointer;width:30px;min-width:30px;height:30px;margin:0 2px;padding:0;line-height:1}.textboxes-container .meme-text{scrollbar-width:thin;field-sizing:content;min-width:0;min-height:calc(1.5em + .75rem + 2px);max-height:60px;margin:.5rem;overflow-x:hidden}#maxImageDimensionsForm select:disabled{text-indent:-9999px;opacity:.7}.settings-button{background-image:url(gear.b3b5d1a5.svg);background-position:50%;background-repeat:no-repeat;background-size:64%}.clear-canvas-button{justify-content:center;align-items:center;padding:.375rem;transition:opacity .15s ease-in-out,visibility .15s ease-in-out;display:inline-flex;position:absolute;top:.5rem;left:.5rem}@media (hover:hover){.clear-canvas-button{opacity:0;visibility:hidden}.dropzone:hover .clear-canvas-button{opacity:1;visibility:visible}}.textboxes-container{flex:1}.textboxes-container:empty{display:none}.instructions{text-align:center;text-wrap:balance;flex-direction:column;justify-content:center;align-items:center;row-gap:1rem;height:100%;min-height:200px;padding:1rem;display:flex}.errors-container{z-index:1051;pointer-events:none;width:100%;position:fixed;top:0;left:0}.errors-container .alert{pointer-events:all}details>summary{transition:margin .1s ease-out}details[open]>summary{margin-bottom:.5rem}button[data-button=duplicate-text-box],button[data-button=delete-text-box]{background-position:50%;background-repeat:no-repeat;background-size:90%;width:28px;min-width:28px;height:28px;margin-inline-start:.5rem;padding:0}button[data-button=duplicate-text-box]{background-image:url(duplicate.04d08287.svg);background-size:70%}button[data-button=delete-text-box]{background-image:url(trash.d9edab78.svg);margin-inline-start:.25rem}.gallery{scroll-behavior:smooth;gap:.5rem;min-height:112px;margin:0;padding:.25rem 0;display:flex;overflow-x:auto}.gallery>button{cursor:pointer;padding:0}.gallery>button>img{border-radius:var(--bs-border-radius);object-fit:cover;min-width:88px;height:88px;display:block}.gallery__no-results{text-align:center;flex:1;justify-content:center;align-items:center;display:flex}.move-text-actions{width:calc(var(--move-btn-width)*3);height:calc(var(--move-btn-height)*2);margin:0 auto;position:relative}.move-text-actions>button{width:var(--move-btn-width);height:var(--move-btn-height);background-position:50%;background-repeat:no-repeat;position:absolute}.move-text-actions>[aria-label=Up]{top:-1px;left:var(--move-btn-width);background-image:url(chevron-up.f532d8b6.svg)}.move-text-actions>[aria-label=Down]{top:calc(var(--move-btn-height) + 1px);left:var(--move-btn-width);background-image:url(chevron-down.ad14d981.svg)}.move-text-actions>[aria-label=Left]{top:calc(var(--move-btn-height)/2);background-image:url(chevron-left.20a2f252.svg);left:-2px}.move-text-actions>[aria-label=Right]{top:calc(var(--move-btn-height)/2);left:calc(var(--move-btn-width)*2 + 2px);background-image:url(chevron-right.1be074ac.svg)}capture-photo{position:relative;overflow:hidden}capture-photo::part(capture-button){display:none}capture-photo::part(video){border-radius:calc(var(--bs-border-radius)/2);width:100%}capture-photo[loading]::part(video){background-color:#000;background-image:url(spinner.4452ed29.svg);background-position:50%;background-repeat:no-repeat;background-size:60px}capture-photo [slot=actions]{justify-content:space-between;gap:.5rem;width:100%;padding:.5rem;display:flex;position:absolute;top:0;left:0}capture-photo[loading] [slot=actions]{display:none!important}modal-element{--me-width:fit-content;--me-border-radius:var(--bs-border-radius);--me-border-width:0;--me-box-shadow:0 0 1rem 0 #0000004d}#videoModal{--me-width:600px}#videoModal::part(footer){padding-block:0}#videoModal:has(capture-photo[loading]) #capturePhotoButton{pointer-events:none;opacity:.7}#downloadModal{--me-width:800px}modal-element::part(base):focus-visible{outline:0}modal-element [slot=header]{color:var(--body-color);margin:0}modal-element::part(close){color:var(--body-color);border-radius:var(--bs-border-radius);transition:box-shadow .15s ease-in-out}modal-element::part(close):focus-visible{box-shadow:var(--focus-ring);outline:0}modal-element::part(body){padding-block:0}modal-element [slot=footer]{text-align:center;flex-wrap:wrap;justify-content:center;align-items:center;gap:.25rem;display:flex}.dropzone{--dropzone-border-color:var(--bs-secondary);--dropzone-border-color-hover:var(--bs-primary);--dropzone-border-color-dragover:var(--bs-primary);--dropzone-background-color-hover:var(--bs-light);--dropzone-background-color-dragover:var(--bs-light);--dropzone-focus-box-shadow:var(--focus-ring);height:100%;position:relative}@media screen and (min-width:768px){.dropzone{position:sticky;top:.25rem}}.dropzone:not(.dropzone--accepted){max-height:41rem}.dropzone--accepted{width:-moz-fit-content;width:fit-content;height:-moz-fit-content;height:fit-content}.dropzone::part(dropzone){height:100%;padding:0}.dropzone[disabled]::part(dropzone){opacity:1;cursor:default}.emoji-picker-details{background-color:var(--bs-gray-200);border-radius:var(--bs-border-radius);margin-bottom:.5rem}.emoji-picker-details>summary{background-color:var(--bs-gray-300);border:1px solid var(--bs-gray-300);border-radius:var(--bs-border-radius);cursor:pointer;padding:.5rem 1rem}.emoji-picker-details[open]>summary{border-bottom-right-radius:0;border-bottom-left-radius:0}emoji-picker{--border-color:var(--bs-border-color);--background:#fff;--input-border-color:var(--bs-border-color);--input-border-radius:var(--bs-border-radius);--input-padding:.375rem .75rem;--outline-color:#0d6efd40;--outline-size:4px;--indicator-color:var(--bs-primary);--button-hover-background:var(--bs-gray-300);border:0;width:100%;height:255px;padding:0 .5rem .5rem}.text-underline{text-decoration:underline} +/*# sourceMappingURL=index.b4cc57ad.css.map */ diff --git a/index.b4cc57ad.css.map b/index.b4cc57ad.css.map new file mode 100644 index 0000000..8ee45af --- /dev/null +++ b/index.b4cc57ad.css.map @@ -0,0 +1 @@ +{"mappings":"AEAA,g/GCeI,4uDC0KJ,uCCxJI,8CANJ,8BAqBA,+UAoBE,2FAcF,yIAUA,wCC2CI,0BD3CJ,yBAKA,uCCsCI,0BDtCJ,uBAKA,qCCiCI,0BDjCJ,0BAKA,uCC4BI,0BD5BJ,yBAKA,yBAKA,sBAYE,kCAWF,sKASA,iED2IA,wBC7HA,yCAOA,wCAQE,mBAMA,qCAOF,2BDiIA,4BC9GA,8BAOA,mGAYA,gFAQA,kBACA,cAME,0FAGA,2DAYA,+FDyGF,qECnFA,iFASE,2DAOF,sEAME,qBAKF,iIAOE,gCAYF,uBAOA,8BAUA,mDAKA,+FAaE,sDDsEF,kFClDA,2BAOA,uBAUA,2CDwDA,yGCtCA,kCAOA,6BAIA,wBAME,0BAQF,iKD4CA,0EAMA,2HC1BA,+CAOA,yBAWA,iDAYA,+GCzWI,0BDyWJ,yBASE,oBD8BF,4CAAA,iDAAA,6CAAA,yCAAA,8CAAA,uCAAA,6CCZA,wCAUA,+DAqBA,oDAMA,yCAQA,8DAOA,4BAMA,gBAQA,yCAUA,iCE3jBA,wCAOE,4EDoGE,0BCpGF,2BAAA,4EDoGE,0BCpGF,6BAAA,4EDoGE,0BCpGF,2BAAA,4EDoGE,0BCpGF,6BAAA,4EDoGE,0BCpGF,2BAAA,4EDoGE,0BCpGF,6BAwBF,2DAQA,uCAGE,sDAWF,sDAMA,iDAIE,wCAKF,sFAME,0CC/FF,sCAMA,4LAeA,6BAKA,8CAKA,iEChCE,yQCyDE,yBD5CE,0CC4CF,yBD5CE,wDC4CF,yBD5CE,sEC4CF,0BD5CE,qFC4CF,0BD5CE,oGEfN,2JAOE,gMAGE,gKC2DE,cAIA,sCArBJ,mCAAA,kCAAA,uCAAA,kCAAA,kCAAA,uCAiCI,+BAMI,gCAAA,gCAAA,2BAAA,gCAAA,gCAAA,2BAAA,gCAAA,gCAAA,2BAAA,iCAAA,iCAAA,6BAQE,+BAAA,+BAAA,0BAAA,+BAAA,+BAAA,0BAAA,+BAAA,+BAAA,0BAAA,gCAAA,gCAWJ,2BAKA,2BALA,gCAKA,gCALA,+BAKA,+BALA,8BAKA,8BALA,gCAKA,gCALA,8BAKA,8BFxDJ,yBEUE,iBAIA,yCArBJ,sCAAA,qCAAA,0CAAA,qCAAA,qCAAA,0CAiCI,kCAMI,mCAAA,mCAAA,8BAAA,mCAAA,mCAAA,8BAAA,mCAAA,mCAAA,8BAAA,oCAAA,oCAAA,gCAQE,2BAAA,kCAAA,kCAAA,6BAAA,kCAAA,kCAAA,6BAAA,kCAAA,kCAAA,6BAAA,mCAAA,mCAWJ,iCAKA,iCALA,sCAKA,sCALA,qCAKA,qCALA,oCAKA,oCALA,sCAKA,sCALA,oCAKA,qCFxDJ,yBEUE,iBAIA,yCArBJ,sCAAA,qCAAA,0CAAA,qCAAA,qCAAA,0CAiCI,kCAMI,mCAAA,mCAAA,8BAAA,mCAAA,mCAAA,8BAAA,mCAAA,mCAAA,8BAAA,oCAAA,oCAAA,gCAQE,2BAAA,kCAAA,kCAAA,6BAAA,kCAAA,kCAAA,6BAAA,kCAAA,kCAAA,6BAAA,mCAAA,mCAWJ,iCAKA,iCALA,sCAKA,sCALA,qCAKA,qCALA,oCAKA,oCALA,sCAKA,sCALA,oCAKA,qCFxDJ,yBEUE,iBAIA,yCArBJ,sCAAA,qCAAA,0CAAA,qCAAA,qCAAA,0CAiCI,kCAMI,mCAAA,mCAAA,8BAAA,mCAAA,mCAAA,8BAAA,mCAAA,mCAAA,8BAAA,oCAAA,oCAAA,gCAQE,2BAAA,kCAAA,kCAAA,6BAAA,kCAAA,kCAAA,6BAAA,kCAAA,kCAAA,6BAAA,mCAAA,mCAWJ,iCAKA,iCALA,sCAKA,sCALA,qCAKA,qCALA,oCAKA,oCALA,sCAKA,sCALA,oCAKA,qCFxDJ,0BEUE,iBAIA,yCArBJ,sCAAA,qCAAA,0CAAA,qCAAA,qCAAA,0CAiCI,kCAMI,mCAAA,mCAAA,8BAAA,mCAAA,mCAAA,8BAAA,mCAAA,mCAAA,8BAAA,oCAAA,oCAAA,gCAQE,2BAAA,kCAAA,kCAAA,6BAAA,kCAAA,kCAAA,6BAAA,kCAAA,kCAAA,6BAAA,mCAAA,mCAWJ,iCAKA,iCALA,sCAKA,sCALA,qCAKA,qCALA,oCAKA,oCALA,sCAKA,sCALA,oCAKA,qCFxDJ,0BEUE,kBAIA,0CArBJ,uCAAA,sCAAA,2CAAA,sCAAA,sCAAA,2CAiCI,mCAMI,oCAAA,oCAAA,+BAAA,oCAAA,oCAAA,+BAAA,oCAAA,oCAAA,+BAAA,qCAAA,qCAAA,iCAQE,4BAAA,mCAAA,mCAAA,8BAAA,mCAAA,mCAAA,8BAAA,mCAAA,mCAAA,8BAAA,oCAAA,oCAWJ,mCAKA,mCALA,wCAKA,wCALA,uCAKA,uCALA,sCAKA,sCALA,wCAKA,wCALA,sCAKA,uCCnHR,urBA4BE,kTASA,oCAIA,mCAKF,iFAQA,8BAWE,2CAgBA,qEAIE,wEAQF,0DAIA,wDAWA,oMAkBF,gHAUE,8HC1IA,+UAAA,iVAAA,+UAAA,4UAAA,+UAAA,8UAAA,6UAAA,4UDmKE,mEHzFA,4BGyFA,uEHzFA,4BGyFA,uEHzFA,4BGyFA,uEHzFA,6BGyFA,uEHzFA,6BGyFA,wEEjKJ,gCAUA,2KAWA,0IAMA,4IC3BA,8ECAA,4XCgBM,uCDhBN,+BAoBE,yCAGE,uEAMF,mJAaA,gFAsBA,6DAMA,qEAWA,yEASA,sdAAA,gdC1EI,uCD0EJ,qDAeA,uHAAA,iHAUF,6MAWE,wCAIA,+GAcF,iKAME,mIAOF,8JAME,6HAWA,uFAIA,yFAIA,wFAMF,4GAKE,kEAIA,gGAKA,mGAKA,gGACA,+FE/MF,sxBDeM,uCCfN,8BAsBE,oFAWA,qGAMA,8DAOA,+EAMF,uIAQA,oIAUI,0RCvEJ,qFAME,4DAMF,wEAKE,oFAOF,ybAkBE,qDAIA,gDAKA,gDAIA,yFAMA,wEAIE,gSAQA,qMASF,8UAWA,sEAUE,qHAgBJ,gCAGE,yWF1GI,uCE0GJ,gDAUE,kMAIA,0NAWF,mEAIE,oFAOJ,0DAKA,oEAOI,+FAUA,+PClLJ,sFAOE,4BAKE,yFACA,qFAGF,uCAIA,wPHNI,uCGMJ,mDAWE,kEAKF,4KAWA,iOHjCI,uCGiCJ,+CAUE,8DAKF,+JAWA,yCAGE,sFAIA,kFCtFJ,iCAGE,+NAQA,8TJSI,uCITJ,sCAiBA,wFAIE,qEAAA,2DlByiFJ,0GkBriFI,4QAAA,8KAAA,gKAAA,kgBAAA,geAqBA,+UAIE,6ZAaF,qJAOA,kFlBsjFJ,yFAIA,+HmBvoFA,0FAOE,kIAUA,oHASA,8CAIE,kCAYJ,+TnB+oFA,gMASA,kMmBjnFA,6EnB6nFA,wtBmBxlFE,2OAKA,4KCrGA,4GASA,4NpB+tFF,4IoB5vFI,whBA+DE,6KA/DF,2LAAA,uGA0FI,ynBASF,2KAnGF,kGAAA,iHA2HE,8HAIA,sIAIA,uIAMF,sEAzIA,4VAoBF,gHASA,6NpByzFF,4JoBt1FI,+mBA+DE,kLA/DF,+LAAA,6GA0FI,ktBASF,gLAnGF,sGAAA,uHA2HE,oIAIA,yIAIA,6IAMF,wEAzIA,wWCFJ,sqCPgBM,uCOhBN,sBAsCE,iIAOA,0HAOA,6LAaA,gIAWA,4NAYE,yPAmBF,6OAoBA,6bAAA,gcAAA,6bAAA,0bAAA,4bAAA,2bAAA,4bAAA,wbA0BA,8cAAA,idAAA,6cAAA,2cAAA,6cAAA,4cAAA,6cAAA,ycAYF,4dAwBE,kDAIA,gDAYF,yJAIA,2JCrNA,qCRoBM,uCQpBN,uBAGE,2BAOA,kCAKF,4DRKM,uCQLN,6BAKE,0ERAI,uCQAJ,iDtBszGF,wFuBh0GA,oCCyBI,sKA4BA,2CD7CJ,kjDA8CE,oFA2BE,yCAGE,uDAMF,qCAGE,qDjBxCF,yBiB4BA,4CAGE,0DAMF,wCAGE,yDjBxCF,yBiB4BA,4CAGE,0DAMF,wCAGE,yDjBxCF,yBiB4BA,4CAGE,0DAMF,wCAGE,yDjBxCF,0BiB4BA,4CAGE,0DAMF,wCAGE,yDjBxCF,0BiB4BA,6CAGE,2DAMF,yCAGE,0DAYJ,iHChFE,8KA4BA,mDDiEF,sHC7FE,+KA4BA,oDD2EA,iDAOF,yHC9GE,mGAmBE,gMASF,sDD4FA,oDAQJ,oJAWA,mUAcE,sIAOA,+JAOA,wIAUF,kCAKA,yMAUA,iJAOA,geEzOA,2FzB2oHA,qEAUA,4XyB7nHA,oEAKE,qCAKF,iDzByoHA,iIAKA,4MAMA,kKyB7mHA,oEAIE,sHAMA,wDAKF,oHAKA,kHAsBA,wFAKE,mEzBkmHF,uIAIA,8KAKA,uI0B/tHA,4TAkBA,yVZHM,uCYGN,2BAWE,qEAMA,oEAMA,iHAYF,2iBAaE,oPAKE,8H1B6tHJ,qN0B9sHE,gIAaF,4IAOE,qEAIA,uJAYF,iLASE,4HAKE,+FAMF,gK1BqsHF,oEAMA,6F0B3qHE,4EAWA,oCAGA,mCC5LF,6zCAmCE,2OAwBF,gRASE,iFAYF,iVAkBI,4FAMF,2CAUF,iFAKE,6FAgBF,gEASA,yXbjIM,uCaiIN,iCAUE,2CAIA,2GASF,oNAWA,2ErBxHI,yBqBsIA,8DAKI,iDAGE,+DAIA,2IAMF,sDAIA,0EAKA,+CAIA,2OAeE,4DAIA,oGrBxLN,yBqBsIA,8DAKI,iDAGE,+DAIA,2IAMF,sDAIA,0EAKA,+CAIA,2OAeE,4DAIA,oGrBxLN,yBqBsIA,8DAKI,iDAGE,+DAIA,2IAMF,sDAIA,0EAKA,+CAIA,2OAeE,4DAIA,oGrBxLN,0BqBsIA,8DAKI,iDAGE,+DAIA,2IAMF,sDAIA,0EAKA,+CAIA,2OAeE,4DAIA,oGrBxLN,0BqBsIA,+DAKI,kDAGE,gEAIA,4IAMF,uDAIA,2EAKA,gDAIA,4OAeE,6DAIA,qGAlDN,2DAKI,8CAGE,4DAIA,wIAMF,mDAIA,uEAKA,4CAIA,wOAeE,yDAIA,gGAqBV,miBAgBI,wTCxRJ,m9BAoCE,sCAKA,2DAIE,sKAKA,8KAQF,2EAMF,uGAQA,yFAKA,sHAMA,sCASE,0DASF,+OAOE,+GAKF,4NAME,+GAUF,6LAME,4GAMF,0HAMA,wIAUA,oDAMA,6IAKA,sJAaE,4DtB1HE,yBsBuHJ,wCAYI,2CAKE,oDAOE,0F5BmvIN,2HAIA,iI4BxuIM,yF5BgvIN,4HAIA,mI6B78IF,0/CA0BA,iWfVM,uCeUN,mCAeE,uNAKE,8IAOF,qUfrCI,uCeqCJ,yCAYA,kCAIA,gGAOF,kCAIA,sKAKE,iJAGE,iMAKF,iDAKA,sJAII,gNAKF,0KAMJ,6FAUE,8EAKE,0DACA,4DAIE,yNAeF,ooBCxJJ,0lBAyBE,mFAGE,wLAQF,qECpCF,g+BA4BA,scjBRM,uCiBQN,4BAWE,sKAQA,4KAQA,6LAQA,iNAUA,oFAMI,yJAMA,0JAiBN,4KAIA,2KCrGA,yeAuBE,0BAMF,uCC9BA,6kBAuBA,6BAMA,6DAUA,sCAIE,6FAaA,wNAAA,kOAAA,wNAAA,yMAAA,wNAAA,mNAAA,8MAAA,yMCxDA,+DAMF,sgBAsBA,wPpBZM,uCoBYN,+BAYA,+LAKA,6CAIA,qDAKE,yEAII,uCAJJ,uCCtDF,u6BA8BA,gEAIE,yGAYF,8FAME,+LAQA,qIAUF,+SASE,4FAIA,iGAIA,oKAQA,gLAQA,qDAGE,kJAeA,0CAII,4JAKA,4JAKA,4DAIA,gIAIE,2K7BpFN,yB6B8DA,6CAII,+JAKA,+JAKA,+DAIA,mIAIE,+K7BpFN,yB6B8DA,6CAII,+JAKA,+JAKA,+DAIA,mIAIE,+K7BpFN,yB6B8DA,6CAII,+JAKA,+JAKA,+DAIA,mIAIE,+K7BpFN,0B6B8DA,6CAII,+JAKA,+JAKA,+DAIA,mIAIE,+K7BpFN,0B6B8DA,8CAII,gKAKA,gKAKA,gEAIA,oIAIE,gLAgBV,kCAGE,sFAGE,oEAcF,4mBAAA,8nBAAA,4mBAAA,ilBAAA,4mBAAA,mmBAAA,0lBAAA,ilBClLF,m1BAuBE,gHAMA,iHAMA,mJAYF,yFCpDA,k7BA8BE,yBAIA,+BAKF,8IASE,yEAKF,4dAUE,gHAMF,mEC5DA,+8BA2CA,6FAQE,wFxBxCI,uCwBwCJ,2CAIA,yCAKA,wDAKF,sEAGE,wEAKA,qDAKF,wGAOA,2TAkBA,uNCrGE,+BACA,wDDgHF,qTAQE,8PAOF,2EAOA,wEASA,0aAcE,2DhC1GE,yBgCiHF,4EAMA,iFAMA,kChC7HE,yBgCmIF,4ChCnIE,0BgC0IF,mCAWE,kEAME,sEtC6zKN,gFsClzKM,8ChCzJF,4BgCwIA,0EAME,8EtCi1KJ,gGsCt0KI,uDhCzJF,4BgCwIA,0EAME,8EtCq2KJ,gGsC11KI,uDhCzJF,4BgCwIA,0EAME,8EtCy3KJ,gGsC92KI,uDhCzJF,6BgCwIA,0EAME,8EtC64KJ,gGsCl4KI,uDhCzJF,6BgCwIA,2EAME,+EtCi6KJ,kGsCt5KI,wDEpON,6yBA4BE,gDAEA,gHAKE,kGASJ,0IAGE,2OAQF,oNAKE,uRASF,6IAGE,wPAQF,sNAKE,uRAyBF,wPC/GA,w6CAuCE,gHAKE,6HAaF,6KAGE,mSAKA,kKAKA,mLASF,uPAKE,6UAKA,oKAKA,qLAUF,gLAGE,gTAKA,wKAKA,yLAOF,iVAcA,yPAKE,gVAKA,qKAKA,sLAyBJ,wbASE,mCAKF,0HCnLA,4BAIA,2CAIA,6DCnBE,0DD0BF,uJ5BRM,uC4BQN,gC1C44LA,4EAMA,kGAKA,mG0Cv3LE,mF1Ci4LF,qKAMA,kIc/6LM,uCds7LJ,qGAMF,4Pc57LM,uCd+8LJ,+DAMF,yK0Cv3LA,8BAIA,+B1Cm4LA,kL0Cn3LA,qSAGA,sSASA,2KAcE,qT5B5II,uC4B4IJ,uDAoBA,uCAUF,8I1Cg4LA,oH0C72LE,2EAIA,4C1Co3LF,wQ0Cx3LE,+JAIA,4G1Cg4LF,+Q4CrkMA,uDAKA,mSAcA,mGAaA,4EAWA,sNAaA,kEAME,uCACE,iEC7EJ,0iBvC0EI,4BuC5CF,sS/BZI,gE+BYJ,+BvC4CE,4BuC5BE,0LAQA,uLAQA,oNAUA,6MASA,qEAKA,kFvCzBF,yBuC/BF,wGAqEM,6CAIA,sHvC7BJ,4BuC5CF,sS/BZI,gE+BYJ,+BvC4CE,4BuC5BE,0LAQA,uLAQA,oNAUA,6MASA,qEAKA,kFvCzBF,yBuC/BF,wGAqEM,6CAIA,sHvC7BJ,4BuC5CF,sS/BZI,gE+BYJ,+BvC4CE,4BuC5BE,0LAQA,uLAQA,oNAUA,6MASA,qEAKA,kFvCzBF,yBuC/BF,wGAqEM,6CAIA,sHvC7BJ,6BuC5CF,sS/BZI,iE+BYJ,+BvC4CE,6BuC5BE,0LAQA,uLAQA,oNAUA,6MASA,qEAKA,kFvCzBF,0BuC/BF,wGAqEM,6CAIA,sHvC7BJ,6BuC5CF,uS/BZI,iE+BYJ,gCvC4CE,6BuC5BE,2LAQA,wLAQA,qNAUA,8MASA,uEAKA,qFvCzBF,0BuC/BF,yGAqEM,8CAIA,uHAzEN,kS/BZI,uC+BYJ,4BAgBI,uLAQA,oLAQA,iNAUA,0MASA,+DAKA,wEA8BN,4GN3GE,mCACA,oCM8GF,qHAKE,mPAMF,mFAKA,+GC1IA,4HAQE,wDAOF,gCAIA,gCAIA,iCAME,kFAKF,4CAMA,sPAMA,oFH5CE,oDIAA,oHAAA,wHAAA,oHAAA,8GAAA,oHAAA,kHAAA,gHAAA,8GCAA,ueAKI,qcALJ,mfAKI,ycALJ,ueAKI,qcALJ,qdAKI,ocALJ,ueAKI,0cALJ,ieAKI,mcALJ,2dAKI,2cALJ,qdAKI,0bAWN,ghBAKI,0jBCvBJ,uKCAA,ycAQE,yGpCYI,uCoCZJ,gCAYE,6HClBJ,oCAIE,0EAMA,+DAUA,kCAAA,iCAAA,qCAAA,uCCpBF,4DAQA,kEAaI,+CAMA,qD9CkCA,yB8CxCA,kDAMA,yD9CkCA,yB8CxCA,kDAMA,yD9CkCA,yB8CxCA,kDAMA,yD9CkCA,0B8CxCA,kDAMA,yD9CkCA,0B8CxCA,mDAMA,0DC5BJ,8EAOA,wECJA,qQtDigOA,iIuDhgOE,qECDF,yECJA,kICkEQ,kDAAA,wCAAA,8CAAA,8CAAA,wDAAA,kDAAA,kCAAA,iCAAA,iCAAA,iFAAA,2EAAA,wEAAA,qFAAA,wEAAA,+BAAA,kCAAA,iCAAA,kCAAA,iCAAA,uCAAA,2CAAA,6CAAA,2CAAA,2CAAA,+CAAA,iDAAA,+CAAA,2CAAA,+CAAA,iDAAA,+CAAA,mCAAA,+CAAA,iCAAA,+BAAA,6CAAA,iCAAA,yCAAA,2CAAA,+BAAA,6CAAA,+BAAA,kDAAA,wDAAA,wDAAA,uCAVA,mGAAA,uGAAA,mGAAA,6FAAA,mGAAA,iGAAA,+FAAA,6FAUA,2CAAA,+CAAA,+CAAA,yCAAA,2CAAA,uBAAA,0BAAA,4BAAA,6BAAA,gCAAA,kCAAA,0BAAA,6BAAA,+BAAA,yBAAA,4BAAA,8BAAA,2DAAA,wDAAA,yDAAA,4FAAA,6BAAA,oGAAA,qCAAA,sGAAA,uCAAA,0GAAA,2CAAA,uGAAA,wCAAA,kHAAA,sHAAA,kHAAA,4GAAA,kHAAA,gHAAA,8GAAA,4GAAA,8GAAA,8GAAA,8EAAA,kFAAA,8EAAA,wEAAA,8EAAA,4EAAA,0EAAA,wEAAA,qCAAA,qCAAA,qCAAA,qCAAA,qCAVA,0CAAA,2CAAA,0CAAA,2CAAA,0CAUA,0BAAA,0BAAA,0BAAA,4BAAA,6BAAA,iCAAA,8BAAA,sCAAA,2BAAA,2BAAA,2BAAA,6BAAA,8BAAA,kCAAA,+BAAA,uCAAA,+BAAA,uCAAA,6CAAA,uDAAA,6DAAA,mCAAA,mCAAA,uCAAA,uCAAA,oCAAA,wCAAA,oDAAA,4DAAA,wDAAA,yDAAA,iEAAA,+DAAA,+DAAA,oDAAA,gDAAA,iDAAA,qDAAA,mDAAA,wDAAA,oDAAA,qDAAA,6DAAA,2DAAA,uDAAA,2CAAA,kDAAA,8CAAA,+CAAA,mDAAA,iDAAA,gCAAA,2BAAA,2BAAA,2BAAA,2BAAA,2BAAA,2BAAA,8BAAA,wBAAA,6BAAA,4BAAA,2BAAA,6BAAA,2BAAA,8BAAA,uDAAA,iEAAA,+DAAA,6DAAA,iEAAA,6DAAA,gEAAA,uDAAA,iEAAA,+DAAA,6DAAA,iEAAA,6DAAA,gEAAA,6BAAA,kCAAA,iCAAA,gCAAA,kCAAA,gCAAA,mCAAA,+BAAA,oCAAA,mCAAA,kCAAA,oCAAA,kCAAA,qCAAA,gCAAA,qCAAA,oCAAA,mCAAA,qCAAA,mCAAA,sCAAA,8BAAA,mCAAA,kCAAA,iCAAA,mCAAA,iCAAA,oCAAA,yBAAA,8BAAA,6BAAA,4BAAA,8BAAA,4BAAA,yDAAA,mEAAA,iEAAA,+DAAA,mEAAA,+DAAA,yDAAA,mEAAA,iEAAA,+DAAA,mEAAA,+DAAA,8BAAA,mCAAA,kCAAA,iCAAA,mCAAA,iCAAA,gCAAA,qCAAA,oCAAA,mCAAA,qCAAA,mCAAA,iCAAA,sCAAA,qCAAA,oCAAA,sCAAA,oCAAA,+BAAA,oCAAA,mCAAA,kCAAA,oCAAA,kCAAA,uBAAA,4BAAA,2BAAA,0BAAA,4BAAA,0BAAA,+BAAA,oCAAA,mCAAA,kCAAA,oCAAA,kCAAA,iEAAA,2EAAA,yEAAA,uEAAA,2EAAA,uEAAA,+DAAA,iDAAA,gDAAA,8CAAA,gDAAA,kCAAA,+BAAA,wCAAA,wCAAA,0CAAA,oCAAA,qCAAA,qCAAA,uCAAA,mCAAA,wCAAA,8BAAA,kCAAA,mCAAA,+BAAA,sCAAA,qCAAA,yCAAA,qDAAA,+DAAA,qEAAA,mDAAA,mDAAA,qDAAA,wCAAA,0CAAA,2EAAA,qGAAA,yGAAA,qGAAA,+FAAA,qGAAA,mGAAA,iGAAA,+FAAA,iGAAA,iGAAA,qGAAA,0EAAA,6DAAA,6DAAA,mFAAA,iFAAA,iFAAA,wDAVA,uCAAA,sCAAA,uCAAA,sCAUA,uEAAA,2EAAA,uEAAA,iEAAA,uEAAA,qEAAA,mEAAA,iEAVA,mEAAA,oEAAA,mEAAA,oEAAA,oEAUA,iFAAA,gFAAA,iFAAA,kcAAA,4cAAA,kcAAA,mbAAA,kcAAA,6bAAA,wbAAA,mbAAA,8cAVA,8FAAA,iGAAA,kGAAA,iGAAA,kGAAA,kGAUA,0GAAA,8GAAA,0GAAA,oGAAA,0GAAA,wGAAA,sGAAA,oGAAA,sGAAA,sGAAA,uGAAA,mEAAA,sHAAA,oHAVA,kCAAA,mCAAA,kCAAA,mCAAA,kCAUA,0EAAA,8EAAA,0EAAA,oEAAA,0EAAA,wEAAA,sEAAA,oEAAA,2DAAA,6EAAA,gFAAA,gFAAA,uCAAA,uCAAA,yDAAA,qCAAA,8DAAA,2DAAA,8DAAA,8DAAA,+DAAA,4CAAA,mEAAA,gIAAA,sFAAA,wIAAA,kIAAA,wIAAA,wIAAA,0IAAA,+FAAA,+IAAA,oIAAA,0FAAA,4IAAA,sIAAA,4IAAA,4IAAA,8IAAA,mGAAA,mJAAA,yIAAA,+FAAA,iJAAA,2IAAA,iJAAA,iJAAA,mJAAA,wGAAA,wJAAA,oIAAA,0FAAA,4IAAA,sIAAA,4IAAA,4IAAA,8IAAA,mGAAA,mJAAA,sCAAA,uCAAA,2BAAA,yBAAA,yBAAA,yBAAA,yBpDHJ,yBoDGI,qCAAA,oCAAA,oCAAA,oFAAA,8EAAA,2EAAA,wFAAA,2EAAA,sCAAA,kDAAA,oCAAA,kCAAA,gDAAA,oCAAA,4CAAA,8CAAA,kCAAA,gDAAA,kCAAA,kCAAA,0CAAA,gDAAA,0DAAA,gEAAA,sCAAA,sCAAA,0CAAA,0CAAA,uCAAA,2CAAA,uDAAA,+DAAA,2DAAA,4DAAA,oEAAA,kEAAA,kEAAA,uDAAA,mDAAA,oDAAA,wDAAA,sDAAA,2DAAA,uDAAA,wDAAA,gEAAA,8DAAA,0DAAA,8CAAA,qDAAA,iDAAA,kDAAA,sDAAA,oDAAA,mCAAA,8BAAA,8BAAA,8BAAA,8BAAA,8BAAA,8BAAA,iCAAA,2BAAA,gCAAA,+BAAA,8BAAA,gCAAA,8BAAA,iCAAA,0DAAA,oEAAA,kEAAA,gEAAA,oEAAA,gEAAA,mEAAA,0DAAA,oEAAA,kEAAA,gEAAA,oEAAA,gEAAA,mEAAA,gCAAA,qCAAA,oCAAA,mCAAA,qCAAA,mCAAA,sCAAA,kCAAA,uCAAA,sCAAA,qCAAA,uCAAA,qCAAA,wCAAA,mCAAA,wCAAA,uCAAA,sCAAA,wCAAA,sCAAA,yCAAA,iCAAA,sCAAA,qCAAA,oCAAA,sCAAA,oCAAA,uCAAA,4BAAA,iCAAA,gCAAA,+BAAA,iCAAA,+BAAA,4DAAA,sEAAA,oEAAA,kEAAA,sEAAA,kEAAA,4DAAA,sEAAA,oEAAA,kEAAA,sEAAA,kEAAA,iCAAA,sCAAA,qCAAA,oCAAA,sCAAA,oCAAA,mCAAA,wCAAA,uCAAA,sCAAA,wCAAA,sCAAA,oCAAA,yCAAA,wCAAA,uCAAA,yCAAA,uCAAA,kCAAA,uCAAA,sCAAA,qCAAA,uCAAA,qCAAA,0BAAA,+BAAA,8BAAA,6BAAA,+BAAA,6BAAA,kCAAA,uCAAA,sCAAA,qCAAA,uCAAA,qCAAA,oEAAA,8EAAA,4EAAA,0EAAA,8EAAA,0EAAA,yCAAA,wCAAA,6CpDHJ,yBoDGI,qCAAA,oCAAA,oCAAA,oFAAA,8EAAA,2EAAA,wFAAA,2EAAA,sCAAA,kDAAA,oCAAA,kCAAA,gDAAA,oCAAA,4CAAA,8CAAA,kCAAA,gDAAA,kCAAA,kCAAA,0CAAA,gDAAA,0DAAA,gEAAA,sCAAA,sCAAA,0CAAA,0CAAA,uCAAA,2CAAA,uDAAA,+DAAA,2DAAA,4DAAA,oEAAA,kEAAA,kEAAA,uDAAA,mDAAA,oDAAA,wDAAA,sDAAA,2DAAA,uDAAA,wDAAA,gEAAA,8DAAA,0DAAA,8CAAA,qDAAA,iDAAA,kDAAA,sDAAA,oDAAA,mCAAA,8BAAA,8BAAA,8BAAA,8BAAA,8BAAA,8BAAA,iCAAA,2BAAA,gCAAA,+BAAA,8BAAA,gCAAA,8BAAA,iCAAA,0DAAA,oEAAA,kEAAA,gEAAA,oEAAA,gEAAA,mEAAA,0DAAA,oEAAA,kEAAA,gEAAA,oEAAA,gEAAA,mEAAA,gCAAA,qCAAA,oCAAA,mCAAA,qCAAA,mCAAA,sCAAA,kCAAA,uCAAA,sCAAA,qCAAA,uCAAA,qCAAA,wCAAA,mCAAA,wCAAA,uCAAA,sCAAA,wCAAA,sCAAA,yCAAA,iCAAA,sCAAA,qCAAA,oCAAA,sCAAA,oCAAA,uCAAA,4BAAA,iCAAA,gCAAA,+BAAA,iCAAA,+BAAA,4DAAA,sEAAA,oEAAA,kEAAA,sEAAA,kEAAA,4DAAA,sEAAA,oEAAA,kEAAA,sEAAA,kEAAA,iCAAA,sCAAA,qCAAA,oCAAA,sCAAA,oCAAA,mCAAA,wCAAA,uCAAA,sCAAA,wCAAA,sCAAA,oCAAA,yCAAA,wCAAA,uCAAA,yCAAA,uCAAA,kCAAA,uCAAA,sCAAA,qCAAA,uCAAA,qCAAA,0BAAA,+BAAA,8BAAA,6BAAA,+BAAA,6BAAA,kCAAA,uCAAA,sCAAA,qCAAA,uCAAA,qCAAA,oEAAA,8EAAA,4EAAA,0EAAA,8EAAA,0EAAA,yCAAA,wCAAA,6CpDHJ,yBoDGI,qCAAA,oCAAA,oCAAA,oFAAA,8EAAA,2EAAA,wFAAA,2EAAA,sCAAA,kDAAA,oCAAA,kCAAA,gDAAA,oCAAA,4CAAA,8CAAA,kCAAA,gDAAA,kCAAA,kCAAA,0CAAA,gDAAA,0DAAA,gEAAA,sCAAA,sCAAA,0CAAA,0CAAA,uCAAA,2CAAA,uDAAA,+DAAA,2DAAA,4DAAA,oEAAA,kEAAA,kEAAA,uDAAA,mDAAA,oDAAA,wDAAA,sDAAA,2DAAA,uDAAA,wDAAA,gEAAA,8DAAA,0DAAA,8CAAA,qDAAA,iDAAA,kDAAA,sDAAA,oDAAA,mCAAA,8BAAA,8BAAA,8BAAA,8BAAA,8BAAA,8BAAA,iCAAA,2BAAA,gCAAA,+BAAA,8BAAA,gCAAA,8BAAA,iCAAA,0DAAA,oEAAA,kEAAA,gEAAA,oEAAA,gEAAA,mEAAA,0DAAA,oEAAA,kEAAA,gEAAA,oEAAA,gEAAA,mEAAA,gCAAA,qCAAA,oCAAA,mCAAA,qCAAA,mCAAA,sCAAA,kCAAA,uCAAA,sCAAA,qCAAA,uCAAA,qCAAA,wCAAA,mCAAA,wCAAA,uCAAA,sCAAA,wCAAA,sCAAA,yCAAA,iCAAA,sCAAA,qCAAA,oCAAA,sCAAA,oCAAA,uCAAA,4BAAA,iCAAA,gCAAA,+BAAA,iCAAA,+BAAA,4DAAA,sEAAA,oEAAA,kEAAA,sEAAA,kEAAA,4DAAA,sEAAA,oEAAA,kEAAA,sEAAA,kEAAA,iCAAA,sCAAA,qCAAA,oCAAA,sCAAA,oCAAA,mCAAA,wCAAA,uCAAA,sCAAA,wCAAA,sCAAA,oCAAA,yCAAA,wCAAA,uCAAA,yCAAA,uCAAA,kCAAA,uCAAA,sCAAA,qCAAA,uCAAA,qCAAA,0BAAA,+BAAA,8BAAA,6BAAA,+BAAA,6BAAA,kCAAA,uCAAA,sCAAA,qCAAA,uCAAA,qCAAA,oEAAA,8EAAA,4EAAA,0EAAA,8EAAA,0EAAA,yCAAA,wCAAA,6CpDHJ,0BoDGI,qCAAA,oCAAA,oCAAA,oFAAA,8EAAA,2EAAA,wFAAA,2EAAA,sCAAA,kDAAA,oCAAA,kCAAA,gDAAA,oCAAA,4CAAA,8CAAA,kCAAA,gDAAA,kCAAA,kCAAA,0CAAA,gDAAA,0DAAA,gEAAA,sCAAA,sCAAA,0CAAA,0CAAA,uCAAA,2CAAA,uDAAA,+DAAA,2DAAA,4DAAA,oEAAA,kEAAA,kEAAA,uDAAA,mDAAA,oDAAA,wDAAA,sDAAA,2DAAA,uDAAA,wDAAA,gEAAA,8DAAA,0DAAA,8CAAA,qDAAA,iDAAA,kDAAA,sDAAA,oDAAA,mCAAA,8BAAA,8BAAA,8BAAA,8BAAA,8BAAA,8BAAA,iCAAA,2BAAA,gCAAA,+BAAA,8BAAA,gCAAA,8BAAA,iCAAA,0DAAA,oEAAA,kEAAA,gEAAA,oEAAA,gEAAA,mEAAA,0DAAA,oEAAA,kEAAA,gEAAA,oEAAA,gEAAA,mEAAA,gCAAA,qCAAA,oCAAA,mCAAA,qCAAA,mCAAA,sCAAA,kCAAA,uCAAA,sCAAA,qCAAA,uCAAA,qCAAA,wCAAA,mCAAA,wCAAA,uCAAA,sCAAA,wCAAA,sCAAA,yCAAA,iCAAA,sCAAA,qCAAA,oCAAA,sCAAA,oCAAA,uCAAA,4BAAA,iCAAA,gCAAA,+BAAA,iCAAA,+BAAA,4DAAA,sEAAA,oEAAA,kEAAA,sEAAA,kEAAA,4DAAA,sEAAA,oEAAA,kEAAA,sEAAA,kEAAA,iCAAA,sCAAA,qCAAA,oCAAA,sCAAA,oCAAA,mCAAA,wCAAA,uCAAA,sCAAA,wCAAA,sCAAA,oCAAA,yCAAA,wCAAA,uCAAA,yCAAA,uCAAA,kCAAA,uCAAA,sCAAA,qCAAA,uCAAA,qCAAA,0BAAA,+BAAA,8BAAA,6BAAA,+BAAA,6BAAA,kCAAA,uCAAA,sCAAA,qCAAA,uCAAA,qCAAA,oEAAA,8EAAA,4EAAA,0EAAA,8EAAA,0EAAA,yCAAA,wCAAA,6CpDHJ,0BoDGI,sCAAA,qCAAA,qCAAA,qFAAA,+EAAA,4EAAA,yFAAA,4EAAA,uCAAA,mDAAA,qCAAA,mCAAA,iDAAA,qCAAA,6CAAA,+CAAA,mCAAA,iDAAA,mCAAA,mCAAA,2CAAA,iDAAA,2DAAA,iEAAA,uCAAA,uCAAA,2CAAA,2CAAA,wCAAA,4CAAA,wDAAA,gEAAA,4DAAA,6DAAA,qEAAA,mEAAA,mEAAA,wDAAA,oDAAA,qDAAA,yDAAA,uDAAA,4DAAA,wDAAA,yDAAA,iEAAA,+DAAA,2DAAA,+CAAA,sDAAA,kDAAA,mDAAA,uDAAA,qDAAA,oCAAA,+BAAA,+BAAA,+BAAA,+BAAA,+BAAA,+BAAA,kCAAA,4BAAA,iCAAA,gCAAA,+BAAA,iCAAA,+BAAA,kCAAA,2DAAA,qEAAA,mEAAA,iEAAA,qEAAA,iEAAA,oEAAA,2DAAA,qEAAA,mEAAA,iEAAA,qEAAA,iEAAA,oEAAA,iCAAA,sCAAA,qCAAA,oCAAA,sCAAA,oCAAA,uCAAA,mCAAA,wCAAA,uCAAA,sCAAA,wCAAA,sCAAA,yCAAA,oCAAA,yCAAA,wCAAA,uCAAA,yCAAA,uCAAA,0CAAA,kCAAA,uCAAA,sCAAA,qCAAA,uCAAA,qCAAA,wCAAA,6BAAA,kCAAA,iCAAA,gCAAA,kCAAA,gCAAA,6DAAA,uEAAA,qEAAA,mEAAA,uEAAA,mEAAA,6DAAA,uEAAA,qEAAA,mEAAA,uEAAA,mEAAA,kCAAA,uCAAA,sCAAA,qCAAA,uCAAA,qCAAA,oCAAA,yCAAA,wCAAA,uCAAA,yCAAA,uCAAA,qCAAA,0CAAA,yCAAA,wCAAA,0CAAA,wCAAA,mCAAA,wCAAA,uCAAA,sCAAA,wCAAA,sCAAA,2BAAA,gCAAA,+BAAA,8BAAA,gCAAA,8BAAA,mCAAA,wCAAA,uCAAA,sCAAA,wCAAA,sCAAA,qEAAA,+EAAA,6EAAA,2EAAA,+EAAA,2EAAA,0CAAA,yCAAA,8CC/CR,0BD+CQ,iCAAA,+BAAA,kCAAA,kCC5BR,aD4BQ,yCAAA,qDAAA,uCAAA,qCAAA,mDAAA,uCAAA,+CAAA,iDAAA,qCAAA,mDAAA,sCElER,+PAYA,sCAIA,6DAKA,gCAIA,kKAQA,4BAIA,qHASA,4CAKA,+GAKA,oEAKA,qCAMA,oKAYA,2KAUA,uEAMA,kJAOA,0MAWA,qBACE,iDAKA,mEAOF,4BAIA,wCAIA,sLAaA,0FASA,4CAIA,+CAIA,0CAIA,6NAYA,yHAKA,yHAMA,kHAUA,yCAKA,oHAQA,qGASA,6HAOA,0JASA,sIAOA,wKAOA,mJAOA,oLAQA,gDAKA,iDAIA,oFAKA,+LAQA,0IAWA,6DAMA,yIAOA,6BAIA,0CAIA,2FAKA,gCAIA,kDAIA,6DAKA,gIAMA,gFAKA,0CAIA,+HAUA,4UAYA,oCACE,sCAMF,oDAIA,wGAKA,gDAKA,6DAMA,oHAMA,8KAQA,6FAKA,mXAmBA","sources":["index.b4cc57ad.css","e170c49e5d7bb354","node_modules/bootstrap/scss/_root.scss","node_modules/bootstrap/scss/mixins/_color-mode.scss","node_modules/bootstrap/dist/css/dist/css/bootstrap.css","node_modules/bootstrap/scss/_reboot.scss","node_modules/bootstrap/scss/vendor/_rfs.scss","node_modules/bootstrap/scss/_type.scss","node_modules/bootstrap/scss/_images.scss","node_modules/bootstrap/scss/_containers.scss","node_modules/bootstrap/scss/mixins/_breakpoints.scss","node_modules/bootstrap/scss/_grid.scss","node_modules/bootstrap/scss/mixins/_grid.scss","node_modules/bootstrap/scss/_tables.scss","node_modules/bootstrap/scss/mixins/_table-variants.scss","node_modules/bootstrap/scss/forms/_labels.scss","node_modules/bootstrap/scss/forms/_form-text.scss","node_modules/bootstrap/scss/forms/_form-control.scss","node_modules/bootstrap/scss/mixins/_transition.scss","node_modules/bootstrap/scss/forms/_form-select.scss","node_modules/bootstrap/scss/forms/_form-check.scss","node_modules/bootstrap/scss/forms/_form-range.scss","node_modules/bootstrap/scss/forms/_floating-labels.scss","node_modules/bootstrap/scss/forms/_input-group.scss","node_modules/bootstrap/scss/mixins/_forms.scss","node_modules/bootstrap/scss/_buttons.scss","node_modules/bootstrap/scss/_transitions.scss","node_modules/bootstrap/scss/_dropdown.scss","node_modules/bootstrap/scss/mixins/_caret.scss","node_modules/bootstrap/scss/_button-group.scss","node_modules/bootstrap/scss/_nav.scss","node_modules/bootstrap/scss/_navbar.scss","node_modules/bootstrap/scss/_card.scss","node_modules/bootstrap/scss/_accordion.scss","node_modules/bootstrap/scss/_breadcrumb.scss","node_modules/bootstrap/scss/_pagination.scss","node_modules/bootstrap/scss/_badge.scss","node_modules/bootstrap/scss/_alert.scss","node_modules/bootstrap/scss/_progress.scss","node_modules/bootstrap/scss/_list-group.scss","node_modules/bootstrap/scss/_close.scss","node_modules/bootstrap/scss/_toasts.scss","node_modules/bootstrap/scss/_modal.scss","node_modules/bootstrap/scss/mixins/_backdrop.scss","node_modules/bootstrap/scss/_tooltip.scss","node_modules/bootstrap/scss/_popover.scss","node_modules/bootstrap/scss/_carousel.scss","node_modules/bootstrap/scss/mixins/_clearfix.scss","node_modules/bootstrap/scss/_spinners.scss","node_modules/bootstrap/scss/_offcanvas.scss","node_modules/bootstrap/scss/_placeholders.scss","node_modules/bootstrap/scss/helpers/_color-bg.scss","node_modules/bootstrap/scss/helpers/_colored-links.scss","node_modules/bootstrap/scss/helpers/_focus-ring.scss","node_modules/bootstrap/scss/helpers/_icon-link.scss","node_modules/bootstrap/scss/helpers/_ratio.scss","node_modules/bootstrap/scss/helpers/_position.scss","node_modules/bootstrap/scss/helpers/_stacks.scss","node_modules/bootstrap/scss/helpers/_visually-hidden.scss","node_modules/bootstrap/scss/helpers/_stretched-link.scss","node_modules/bootstrap/scss/helpers/_text-truncation.scss","node_modules/bootstrap/scss/helpers/_vr.scss","node_modules/bootstrap/scss/mixins/_utilities.scss","node_modules/bootstrap/scss/utilities/_api.scss","src/css/main.css"],"sourcesContent":[":root, [data-bs-theme=\"light\"] {\n --bs-blue: #0d6efd;\n --bs-indigo: #6610f2;\n --bs-purple: #6f42c1;\n --bs-pink: #d63384;\n --bs-red: #dc3545;\n --bs-orange: #fd7e14;\n --bs-yellow: #ffc107;\n --bs-green: #198754;\n --bs-teal: #20c997;\n --bs-cyan: #0dcaf0;\n --bs-black: #000;\n --bs-white: #fff;\n --bs-gray: #6c757d;\n --bs-gray-dark: #343a40;\n --bs-gray-100: #f8f9fa;\n --bs-gray-200: #e9ecef;\n --bs-gray-300: #dee2e6;\n --bs-gray-400: #ced4da;\n --bs-gray-500: #adb5bd;\n --bs-gray-600: #6c757d;\n --bs-gray-700: #495057;\n --bs-gray-800: #343a40;\n --bs-gray-900: #212529;\n --bs-primary: #0d6efd;\n --bs-secondary: #6c757d;\n --bs-success: #198754;\n --bs-info: #0dcaf0;\n --bs-warning: #ffc107;\n --bs-danger: #dc3545;\n --bs-light: #f8f9fa;\n --bs-dark: #212529;\n --bs-primary-rgb: 13, 110, 253;\n --bs-secondary-rgb: 108, 117, 125;\n --bs-success-rgb: 25, 135, 84;\n --bs-info-rgb: 13, 202, 240;\n --bs-warning-rgb: 255, 193, 7;\n --bs-danger-rgb: 220, 53, 69;\n --bs-light-rgb: 248, 249, 250;\n --bs-dark-rgb: 33, 37, 41;\n --bs-primary-text-emphasis: #052c65;\n --bs-secondary-text-emphasis: #2b2f32;\n --bs-success-text-emphasis: #0a3622;\n --bs-info-text-emphasis: #055160;\n --bs-warning-text-emphasis: #664d03;\n --bs-danger-text-emphasis: #58151c;\n --bs-light-text-emphasis: #495057;\n --bs-dark-text-emphasis: #495057;\n --bs-primary-bg-subtle: #cfe2ff;\n --bs-secondary-bg-subtle: #e2e3e5;\n --bs-success-bg-subtle: #d1e7dd;\n --bs-info-bg-subtle: #cff4fc;\n --bs-warning-bg-subtle: #fff3cd;\n --bs-danger-bg-subtle: #f8d7da;\n --bs-light-bg-subtle: #fcfcfd;\n --bs-dark-bg-subtle: #ced4da;\n --bs-primary-border-subtle: #9ec5fe;\n --bs-secondary-border-subtle: #c4c8cb;\n --bs-success-border-subtle: #a3cfbb;\n --bs-info-border-subtle: #9eeaf9;\n --bs-warning-border-subtle: #ffe69c;\n --bs-danger-border-subtle: #f1aeb5;\n --bs-light-border-subtle: #e9ecef;\n --bs-dark-border-subtle: #adb5bd;\n --bs-white-rgb: 255, 255, 255;\n --bs-black-rgb: 0, 0, 0;\n --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n --bs-gradient: linear-gradient(180deg, #ffffff26, #fff0);\n --bs-body-font-family: var(--bs-font-sans-serif);\n --bs-body-font-size: 1rem;\n --bs-body-font-weight: 400;\n --bs-body-line-height: 1.5;\n --bs-body-color: #212529;\n --bs-body-color-rgb: 33, 37, 41;\n --bs-body-bg: #fff;\n --bs-body-bg-rgb: 255, 255, 255;\n --bs-emphasis-color: #000;\n --bs-emphasis-color-rgb: 0, 0, 0;\n --bs-secondary-color: #212529bf;\n --bs-secondary-color-rgb: 33, 37, 41;\n --bs-secondary-bg: #e9ecef;\n --bs-secondary-bg-rgb: 233, 236, 239;\n --bs-tertiary-color: #21252980;\n --bs-tertiary-color-rgb: 33, 37, 41;\n --bs-tertiary-bg: #f8f9fa;\n --bs-tertiary-bg-rgb: 248, 249, 250;\n --bs-heading-color: inherit;\n --bs-link-color: #0d6efd;\n --bs-link-color-rgb: 13, 110, 253;\n --bs-link-decoration: underline;\n --bs-link-hover-color: #0a58ca;\n --bs-link-hover-color-rgb: 10, 88, 202;\n --bs-code-color: #d63384;\n --bs-highlight-color: #212529;\n --bs-highlight-bg: #fff3cd;\n --bs-border-width: 1px;\n --bs-border-style: solid;\n --bs-border-color: #dee2e6;\n --bs-border-color-translucent: #0000002d;\n --bs-border-radius: .375rem;\n --bs-border-radius-sm: .25rem;\n --bs-border-radius-lg: .5rem;\n --bs-border-radius-xl: 1rem;\n --bs-border-radius-xxl: 2rem;\n --bs-border-radius-2xl: var(--bs-border-radius-xxl);\n --bs-border-radius-pill: 50rem;\n --bs-box-shadow: 0 .5rem 1rem #00000026;\n --bs-box-shadow-sm: 0 .125rem .25rem #00000013;\n --bs-box-shadow-lg: 0 1rem 3rem #0000002d;\n --bs-box-shadow-inset: inset 0 1px 2px #00000013;\n --bs-focus-ring-width: .25rem;\n --bs-focus-ring-opacity: .25;\n --bs-focus-ring-color: #0d6efd40;\n --bs-form-valid-color: #198754;\n --bs-form-valid-border-color: #198754;\n --bs-form-invalid-color: #dc3545;\n --bs-form-invalid-border-color: #dc3545;\n}\n\n[data-bs-theme=\"dark\"] {\n --lightningcss-light: ;\n --lightningcss-dark: initial;\n color-scheme: dark;\n --bs-body-color: #dee2e6;\n --bs-body-color-rgb: 222, 226, 230;\n --bs-body-bg: #212529;\n --bs-body-bg-rgb: 33, 37, 41;\n --bs-emphasis-color: #fff;\n --bs-emphasis-color-rgb: 255, 255, 255;\n --bs-secondary-color: #dee2e6bf;\n --bs-secondary-color-rgb: 222, 226, 230;\n --bs-secondary-bg: #343a40;\n --bs-secondary-bg-rgb: 52, 58, 64;\n --bs-tertiary-color: #dee2e680;\n --bs-tertiary-color-rgb: 222, 226, 230;\n --bs-tertiary-bg: #2b3035;\n --bs-tertiary-bg-rgb: 43, 48, 53;\n --bs-primary-text-emphasis: #6ea8fe;\n --bs-secondary-text-emphasis: #a7acb1;\n --bs-success-text-emphasis: #75b798;\n --bs-info-text-emphasis: #6edff6;\n --bs-warning-text-emphasis: #ffda6a;\n --bs-danger-text-emphasis: #ea868f;\n --bs-light-text-emphasis: #f8f9fa;\n --bs-dark-text-emphasis: #dee2e6;\n --bs-primary-bg-subtle: #031633;\n --bs-secondary-bg-subtle: #161719;\n --bs-success-bg-subtle: #051b11;\n --bs-info-bg-subtle: #032830;\n --bs-warning-bg-subtle: #332701;\n --bs-danger-bg-subtle: #2c0b0e;\n --bs-light-bg-subtle: #343a40;\n --bs-dark-bg-subtle: #1a1d20;\n --bs-primary-border-subtle: #084298;\n --bs-secondary-border-subtle: #41464b;\n --bs-success-border-subtle: #0f5132;\n --bs-info-border-subtle: #087990;\n --bs-warning-border-subtle: #997404;\n --bs-danger-border-subtle: #842029;\n --bs-light-border-subtle: #495057;\n --bs-dark-border-subtle: #343a40;\n --bs-heading-color: inherit;\n --bs-link-color: #6ea8fe;\n --bs-link-hover-color: #8bb9fe;\n --bs-link-color-rgb: 110, 168, 254;\n --bs-link-hover-color-rgb: 139, 185, 254;\n --bs-code-color: #e685b5;\n --bs-highlight-color: #dee2e6;\n --bs-highlight-bg: #664d03;\n --bs-border-color: #495057;\n --bs-border-color-translucent: #ffffff26;\n --bs-form-valid-color: #75b798;\n --bs-form-valid-border-color: #75b798;\n --bs-form-invalid-color: #ea868f;\n --bs-form-invalid-border-color: #ea868f;\n}\n\n*, :after, :before {\n box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n :root {\n scroll-behavior: smooth;\n }\n}\n\nbody {\n font-family: var(--bs-body-font-family);\n font-size: var(--bs-body-font-size);\n font-weight: var(--bs-body-font-weight);\n line-height: var(--bs-body-line-height);\n color: var(--bs-body-color);\n text-align: var(--bs-body-text-align);\n background-color: var(--bs-body-bg);\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: transparent;\n margin: 0;\n}\n\nhr {\n color: inherit;\n border: 0;\n border-top: var(--bs-border-width) solid;\n opacity: .25;\n margin: 1rem 0;\n}\n\n.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 {\n color: var(--bs-heading-color);\n margin-top: 0;\n margin-bottom: .5rem;\n font-weight: 500;\n line-height: 1.2;\n}\n\n.h1, h1 {\n font-size: calc(1.375rem + 1.5vw);\n}\n\n@media (width >= 1200px) {\n .h1, h1 {\n font-size: 2.5rem;\n }\n}\n\n.h2, h2 {\n font-size: calc(1.325rem + .9vw);\n}\n\n@media (width >= 1200px) {\n .h2, h2 {\n font-size: 2rem;\n }\n}\n\n.h3, h3 {\n font-size: calc(1.3rem + .6vw);\n}\n\n@media (width >= 1200px) {\n .h3, h3 {\n font-size: 1.75rem;\n }\n}\n\n.h4, h4 {\n font-size: calc(1.275rem + .3vw);\n}\n\n@media (width >= 1200px) {\n .h4, h4 {\n font-size: 1.5rem;\n }\n}\n\n.h5, h5 {\n font-size: 1.25rem;\n}\n\n.h6, h6 {\n font-size: 1rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title] {\n cursor: help;\n -webkit-text-decoration-skip-ink: none;\n text-decoration-skip-ink: none;\n text-decoration: underline dotted;\n}\n\naddress {\n font-style: normal;\n line-height: inherit;\n margin-bottom: 1rem;\n}\n\nol, ul {\n padding-left: 2rem;\n}\n\ndl, ol, ul {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol, ol ul, ul ol, ul ul {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb, strong {\n font-weight: bolder;\n}\n\n.small, small {\n font-size: .875em;\n}\n\n.mark, mark {\n color: var(--bs-highlight-color);\n background-color: var(--bs-highlight-bg);\n padding: .1875em;\n}\n\nsub, sup {\n vertical-align: baseline;\n font-size: .75em;\n line-height: 0;\n position: relative;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));\n text-decoration: underline;\n}\n\na:hover {\n --bs-link-color-rgb: var(--bs-link-hover-color-rgb);\n}\n\na:not([href]):not([class]), a:not([href]):not([class]):hover {\n color: inherit;\n text-decoration: none;\n}\n\ncode, kbd, pre, samp {\n font-family: var(--bs-font-monospace);\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n font-size: .875em;\n display: block;\n overflow: auto;\n}\n\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\ncode {\n color: var(--bs-code-color);\n word-wrap: break-word;\n font-size: .875em;\n}\n\na > code {\n color: inherit;\n}\n\nkbd {\n color: var(--bs-body-bg);\n background-color: var(--bs-body-color);\n border-radius: .25rem;\n padding: .1875rem .375rem;\n font-size: .875em;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 1em;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg, svg {\n vertical-align: middle;\n}\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n color: var(--bs-secondary-color);\n text-align: left;\n padding-top: .5rem;\n padding-bottom: .5rem;\n}\n\nth {\n text-align: inherit;\n text-align: -webkit-match-parent;\n}\n\ntbody, td, tfoot, th, thead, tr {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\nlabel {\n display: inline-block;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\nbutton, input, optgroup, select, textarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n margin: 0;\n}\n\nbutton, select {\n text-transform: none;\n}\n\n[role=\"button\"] {\n cursor: pointer;\n}\n\nselect {\n word-wrap: normal;\n}\n\nselect:disabled {\n opacity: 1;\n}\n\n[list]:not([type=\"date\"]):not([type=\"datetime-local\"]):not([type=\"month\"]):not([type=\"week\"]):not([type=\"time\"])::-webkit-calendar-picker-indicator {\n display: none !important;\n}\n\n[type=\"button\"], [type=\"reset\"], [type=\"submit\"], button {\n -webkit-appearance: button;\n}\n\n[type=\"button\"]:not(:disabled), [type=\"reset\"]:not(:disabled), [type=\"submit\"]:not(:disabled), button:not(:disabled) {\n cursor: pointer;\n}\n\n::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\ntextarea {\n resize: vertical;\n}\n\nfieldset {\n border: 0;\n min-width: 0;\n margin: 0;\n padding: 0;\n}\n\nlegend {\n float: left;\n font-size: calc(1.275rem + .3vw);\n line-height: inherit;\n width: 100%;\n margin-bottom: .5rem;\n padding: 0;\n}\n\n@media (width >= 1200px) {\n legend {\n font-size: 1.5rem;\n }\n}\n\nlegend + * {\n clear: left;\n}\n\n::-webkit-datetime-edit-day-field {\n padding: 0;\n}\n\n::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n}\n\n::-webkit-datetime-edit-hour-field {\n padding: 0;\n}\n\n::-webkit-datetime-edit-minute {\n padding: 0;\n}\n\n::-webkit-datetime-edit-month-field {\n padding: 0;\n}\n\n::-webkit-datetime-edit-text {\n padding: 0;\n}\n\n::-webkit-datetime-edit-year-field {\n padding: 0;\n}\n\n::-webkit-inner-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n -webkit-appearance: textfield;\n outline-offset: -2px;\n}\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-color-swatch-wrapper {\n padding: 0;\n}\n\n::file-selector-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\niframe {\n border: 0;\n}\n\nsummary {\n cursor: pointer;\n display: list-item;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: calc(1.625rem + 4.5vw);\n font-weight: 300;\n line-height: 1.2;\n}\n\n@media (width >= 1200px) {\n .display-1 {\n font-size: 5rem;\n }\n}\n\n.display-2 {\n font-size: calc(1.575rem + 3.9vw);\n font-weight: 300;\n line-height: 1.2;\n}\n\n@media (width >= 1200px) {\n .display-2 {\n font-size: 4.5rem;\n }\n}\n\n.display-3 {\n font-size: calc(1.525rem + 3.3vw);\n font-weight: 300;\n line-height: 1.2;\n}\n\n@media (width >= 1200px) {\n .display-3 {\n font-size: 4rem;\n }\n}\n\n.display-4 {\n font-size: calc(1.475rem + 2.7vw);\n font-weight: 300;\n line-height: 1.2;\n}\n\n@media (width >= 1200px) {\n .display-4 {\n font-size: 3.5rem;\n }\n}\n\n.display-5 {\n font-size: calc(1.425rem + 2.1vw);\n font-weight: 300;\n line-height: 1.2;\n}\n\n@media (width >= 1200px) {\n .display-5 {\n font-size: 3rem;\n }\n}\n\n.display-6 {\n font-size: calc(1.375rem + 1.5vw);\n font-weight: 300;\n line-height: 1.2;\n}\n\n@media (width >= 1200px) {\n .display-6 {\n font-size: 2.5rem;\n }\n}\n\n.list-unstyled, .list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: .5rem;\n}\n\n.initialism {\n text-transform: uppercase;\n font-size: .875em;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.blockquote > :last-child {\n margin-bottom: 0;\n}\n\n.blockquote-footer {\n color: #6c757d;\n margin-top: -1rem;\n margin-bottom: 1rem;\n font-size: .875em;\n}\n\n.blockquote-footer:before {\n content: \"— \";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n background-color: var(--bs-body-bg);\n border: var(--bs-border-width) solid var(--bs-border-color);\n border-radius: var(--bs-border-radius);\n max-width: 100%;\n height: auto;\n padding: .25rem;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: .5rem;\n line-height: 1;\n}\n\n.figure-caption {\n color: var(--bs-secondary-color);\n font-size: .875em;\n}\n\n.container, .container-fluid, .container-lg, .container-md, .container-sm, .container-xl, .container-xxl {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n padding-right: calc(var(--bs-gutter-x) * .5);\n padding-left: calc(var(--bs-gutter-x) * .5);\n width: 100%;\n margin-left: auto;\n margin-right: auto;\n}\n\n@media (width >= 576px) {\n .container, .container-sm {\n max-width: 540px;\n }\n}\n\n@media (width >= 768px) {\n .container, .container-md, .container-sm {\n max-width: 720px;\n }\n}\n\n@media (width >= 992px) {\n .container, .container-lg, .container-md, .container-sm {\n max-width: 960px;\n }\n}\n\n@media (width >= 1200px) {\n .container, .container-lg, .container-md, .container-sm, .container-xl {\n max-width: 1140px;\n }\n}\n\n@media (width >= 1400px) {\n .container, .container-lg, .container-md, .container-sm, .container-xl, .container-xxl {\n max-width: 1320px;\n }\n}\n\n:root {\n --bs-breakpoint-xs: 0;\n --bs-breakpoint-sm: 576px;\n --bs-breakpoint-md: 768px;\n --bs-breakpoint-lg: 992px;\n --bs-breakpoint-xl: 1200px;\n --bs-breakpoint-xxl: 1400px;\n}\n\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-right: calc(-.5 * var(--bs-gutter-x));\n margin-left: calc(-.5 * var(--bs-gutter-x));\n flex-wrap: wrap;\n display: flex;\n}\n\n.row > * {\n padding-right: calc(var(--bs-gutter-x) * .5);\n padding-left: calc(var(--bs-gutter-x) * .5);\n margin-top: var(--bs-gutter-y);\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n}\n\n.col {\n flex: 1 0;\n}\n\n.row-cols-auto > * {\n flex: none;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: none;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: none;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: none;\n width: 33.3333%;\n}\n\n.row-cols-4 > * {\n flex: none;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: none;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: none;\n width: 16.6667%;\n}\n\n.col-auto {\n flex: none;\n width: auto;\n}\n\n.col-1 {\n flex: none;\n width: 8.33333%;\n}\n\n.col-2 {\n flex: none;\n width: 16.6667%;\n}\n\n.col-3 {\n flex: none;\n width: 25%;\n}\n\n.col-4 {\n flex: none;\n width: 33.3333%;\n}\n\n.col-5 {\n flex: none;\n width: 41.6667%;\n}\n\n.col-6 {\n flex: none;\n width: 50%;\n}\n\n.col-7 {\n flex: none;\n width: 58.3333%;\n}\n\n.col-8 {\n flex: none;\n width: 66.6667%;\n}\n\n.col-9 {\n flex: none;\n width: 75%;\n}\n\n.col-10 {\n flex: none;\n width: 83.3333%;\n}\n\n.col-11 {\n flex: none;\n width: 91.6667%;\n}\n\n.col-12 {\n flex: none;\n width: 100%;\n}\n\n.offset-1 {\n margin-left: 8.33333%;\n}\n\n.offset-2 {\n margin-left: 16.6667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.3333%;\n}\n\n.offset-5 {\n margin-left: 41.6667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.3333%;\n}\n\n.offset-8 {\n margin-left: 66.6667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.3333%;\n}\n\n.offset-11 {\n margin-left: 91.6667%;\n}\n\n.g-0, .gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0, .gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1, .gx-1 {\n --bs-gutter-x: .25rem;\n}\n\n.g-1, .gy-1 {\n --bs-gutter-y: .25rem;\n}\n\n.g-2, .gx-2 {\n --bs-gutter-x: .5rem;\n}\n\n.g-2, .gy-2 {\n --bs-gutter-y: .5rem;\n}\n\n.g-3, .gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3, .gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4, .gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4, .gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5, .gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5, .gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (width >= 576px) {\n .col-sm {\n flex: 1 0;\n }\n\n .row-cols-sm-auto > * {\n flex: none;\n width: auto;\n }\n\n .row-cols-sm-1 > * {\n flex: none;\n width: 100%;\n }\n\n .row-cols-sm-2 > * {\n flex: none;\n width: 50%;\n }\n\n .row-cols-sm-3 > * {\n flex: none;\n width: 33.3333%;\n }\n\n .row-cols-sm-4 > * {\n flex: none;\n width: 25%;\n }\n\n .row-cols-sm-5 > * {\n flex: none;\n width: 20%;\n }\n\n .row-cols-sm-6 > * {\n flex: none;\n width: 16.6667%;\n }\n\n .col-sm-auto {\n flex: none;\n width: auto;\n }\n\n .col-sm-1 {\n flex: none;\n width: 8.33333%;\n }\n\n .col-sm-2 {\n flex: none;\n width: 16.6667%;\n }\n\n .col-sm-3 {\n flex: none;\n width: 25%;\n }\n\n .col-sm-4 {\n flex: none;\n width: 33.3333%;\n }\n\n .col-sm-5 {\n flex: none;\n width: 41.6667%;\n }\n\n .col-sm-6 {\n flex: none;\n width: 50%;\n }\n\n .col-sm-7 {\n flex: none;\n width: 58.3333%;\n }\n\n .col-sm-8 {\n flex: none;\n width: 66.6667%;\n }\n\n .col-sm-9 {\n flex: none;\n width: 75%;\n }\n\n .col-sm-10 {\n flex: none;\n width: 83.3333%;\n }\n\n .col-sm-11 {\n flex: none;\n width: 91.6667%;\n }\n\n .col-sm-12 {\n flex: none;\n width: 100%;\n }\n\n .offset-sm-0 {\n margin-left: 0;\n }\n\n .offset-sm-1 {\n margin-left: 8.33333%;\n }\n\n .offset-sm-2 {\n margin-left: 16.6667%;\n }\n\n .offset-sm-3 {\n margin-left: 25%;\n }\n\n .offset-sm-4 {\n margin-left: 33.3333%;\n }\n\n .offset-sm-5 {\n margin-left: 41.6667%;\n }\n\n .offset-sm-6 {\n margin-left: 50%;\n }\n\n .offset-sm-7 {\n margin-left: 58.3333%;\n }\n\n .offset-sm-8 {\n margin-left: 66.6667%;\n }\n\n .offset-sm-9 {\n margin-left: 75%;\n }\n\n .offset-sm-10 {\n margin-left: 83.3333%;\n }\n\n .offset-sm-11 {\n margin-left: 91.6667%;\n }\n\n .g-sm-0, .gx-sm-0 {\n --bs-gutter-x: 0;\n }\n\n .g-sm-0, .gy-sm-0 {\n --bs-gutter-y: 0;\n }\n\n .g-sm-1, .gx-sm-1 {\n --bs-gutter-x: .25rem;\n }\n\n .g-sm-1, .gy-sm-1 {\n --bs-gutter-y: .25rem;\n }\n\n .g-sm-2, .gx-sm-2 {\n --bs-gutter-x: .5rem;\n }\n\n .g-sm-2, .gy-sm-2 {\n --bs-gutter-y: .5rem;\n }\n\n .g-sm-3, .gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n\n .g-sm-3, .gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n\n .g-sm-4, .gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n\n .g-sm-4, .gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n\n .g-sm-5, .gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n\n .g-sm-5, .gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n\n@media (width >= 768px) {\n .col-md {\n flex: 1 0;\n }\n\n .row-cols-md-auto > * {\n flex: none;\n width: auto;\n }\n\n .row-cols-md-1 > * {\n flex: none;\n width: 100%;\n }\n\n .row-cols-md-2 > * {\n flex: none;\n width: 50%;\n }\n\n .row-cols-md-3 > * {\n flex: none;\n width: 33.3333%;\n }\n\n .row-cols-md-4 > * {\n flex: none;\n width: 25%;\n }\n\n .row-cols-md-5 > * {\n flex: none;\n width: 20%;\n }\n\n .row-cols-md-6 > * {\n flex: none;\n width: 16.6667%;\n }\n\n .col-md-auto {\n flex: none;\n width: auto;\n }\n\n .col-md-1 {\n flex: none;\n width: 8.33333%;\n }\n\n .col-md-2 {\n flex: none;\n width: 16.6667%;\n }\n\n .col-md-3 {\n flex: none;\n width: 25%;\n }\n\n .col-md-4 {\n flex: none;\n width: 33.3333%;\n }\n\n .col-md-5 {\n flex: none;\n width: 41.6667%;\n }\n\n .col-md-6 {\n flex: none;\n width: 50%;\n }\n\n .col-md-7 {\n flex: none;\n width: 58.3333%;\n }\n\n .col-md-8 {\n flex: none;\n width: 66.6667%;\n }\n\n .col-md-9 {\n flex: none;\n width: 75%;\n }\n\n .col-md-10 {\n flex: none;\n width: 83.3333%;\n }\n\n .col-md-11 {\n flex: none;\n width: 91.6667%;\n }\n\n .col-md-12 {\n flex: none;\n width: 100%;\n }\n\n .offset-md-0 {\n margin-left: 0;\n }\n\n .offset-md-1 {\n margin-left: 8.33333%;\n }\n\n .offset-md-2 {\n margin-left: 16.6667%;\n }\n\n .offset-md-3 {\n margin-left: 25%;\n }\n\n .offset-md-4 {\n margin-left: 33.3333%;\n }\n\n .offset-md-5 {\n margin-left: 41.6667%;\n }\n\n .offset-md-6 {\n margin-left: 50%;\n }\n\n .offset-md-7 {\n margin-left: 58.3333%;\n }\n\n .offset-md-8 {\n margin-left: 66.6667%;\n }\n\n .offset-md-9 {\n margin-left: 75%;\n }\n\n .offset-md-10 {\n margin-left: 83.3333%;\n }\n\n .offset-md-11 {\n margin-left: 91.6667%;\n }\n\n .g-md-0, .gx-md-0 {\n --bs-gutter-x: 0;\n }\n\n .g-md-0, .gy-md-0 {\n --bs-gutter-y: 0;\n }\n\n .g-md-1, .gx-md-1 {\n --bs-gutter-x: .25rem;\n }\n\n .g-md-1, .gy-md-1 {\n --bs-gutter-y: .25rem;\n }\n\n .g-md-2, .gx-md-2 {\n --bs-gutter-x: .5rem;\n }\n\n .g-md-2, .gy-md-2 {\n --bs-gutter-y: .5rem;\n }\n\n .g-md-3, .gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n\n .g-md-3, .gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n\n .g-md-4, .gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n\n .g-md-4, .gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n\n .g-md-5, .gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n\n .g-md-5, .gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n\n@media (width >= 992px) {\n .col-lg {\n flex: 1 0;\n }\n\n .row-cols-lg-auto > * {\n flex: none;\n width: auto;\n }\n\n .row-cols-lg-1 > * {\n flex: none;\n width: 100%;\n }\n\n .row-cols-lg-2 > * {\n flex: none;\n width: 50%;\n }\n\n .row-cols-lg-3 > * {\n flex: none;\n width: 33.3333%;\n }\n\n .row-cols-lg-4 > * {\n flex: none;\n width: 25%;\n }\n\n .row-cols-lg-5 > * {\n flex: none;\n width: 20%;\n }\n\n .row-cols-lg-6 > * {\n flex: none;\n width: 16.6667%;\n }\n\n .col-lg-auto {\n flex: none;\n width: auto;\n }\n\n .col-lg-1 {\n flex: none;\n width: 8.33333%;\n }\n\n .col-lg-2 {\n flex: none;\n width: 16.6667%;\n }\n\n .col-lg-3 {\n flex: none;\n width: 25%;\n }\n\n .col-lg-4 {\n flex: none;\n width: 33.3333%;\n }\n\n .col-lg-5 {\n flex: none;\n width: 41.6667%;\n }\n\n .col-lg-6 {\n flex: none;\n width: 50%;\n }\n\n .col-lg-7 {\n flex: none;\n width: 58.3333%;\n }\n\n .col-lg-8 {\n flex: none;\n width: 66.6667%;\n }\n\n .col-lg-9 {\n flex: none;\n width: 75%;\n }\n\n .col-lg-10 {\n flex: none;\n width: 83.3333%;\n }\n\n .col-lg-11 {\n flex: none;\n width: 91.6667%;\n }\n\n .col-lg-12 {\n flex: none;\n width: 100%;\n }\n\n .offset-lg-0 {\n margin-left: 0;\n }\n\n .offset-lg-1 {\n margin-left: 8.33333%;\n }\n\n .offset-lg-2 {\n margin-left: 16.6667%;\n }\n\n .offset-lg-3 {\n margin-left: 25%;\n }\n\n .offset-lg-4 {\n margin-left: 33.3333%;\n }\n\n .offset-lg-5 {\n margin-left: 41.6667%;\n }\n\n .offset-lg-6 {\n margin-left: 50%;\n }\n\n .offset-lg-7 {\n margin-left: 58.3333%;\n }\n\n .offset-lg-8 {\n margin-left: 66.6667%;\n }\n\n .offset-lg-9 {\n margin-left: 75%;\n }\n\n .offset-lg-10 {\n margin-left: 83.3333%;\n }\n\n .offset-lg-11 {\n margin-left: 91.6667%;\n }\n\n .g-lg-0, .gx-lg-0 {\n --bs-gutter-x: 0;\n }\n\n .g-lg-0, .gy-lg-0 {\n --bs-gutter-y: 0;\n }\n\n .g-lg-1, .gx-lg-1 {\n --bs-gutter-x: .25rem;\n }\n\n .g-lg-1, .gy-lg-1 {\n --bs-gutter-y: .25rem;\n }\n\n .g-lg-2, .gx-lg-2 {\n --bs-gutter-x: .5rem;\n }\n\n .g-lg-2, .gy-lg-2 {\n --bs-gutter-y: .5rem;\n }\n\n .g-lg-3, .gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n\n .g-lg-3, .gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n\n .g-lg-4, .gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n\n .g-lg-4, .gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n\n .g-lg-5, .gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n\n .g-lg-5, .gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n\n@media (width >= 1200px) {\n .col-xl {\n flex: 1 0;\n }\n\n .row-cols-xl-auto > * {\n flex: none;\n width: auto;\n }\n\n .row-cols-xl-1 > * {\n flex: none;\n width: 100%;\n }\n\n .row-cols-xl-2 > * {\n flex: none;\n width: 50%;\n }\n\n .row-cols-xl-3 > * {\n flex: none;\n width: 33.3333%;\n }\n\n .row-cols-xl-4 > * {\n flex: none;\n width: 25%;\n }\n\n .row-cols-xl-5 > * {\n flex: none;\n width: 20%;\n }\n\n .row-cols-xl-6 > * {\n flex: none;\n width: 16.6667%;\n }\n\n .col-xl-auto {\n flex: none;\n width: auto;\n }\n\n .col-xl-1 {\n flex: none;\n width: 8.33333%;\n }\n\n .col-xl-2 {\n flex: none;\n width: 16.6667%;\n }\n\n .col-xl-3 {\n flex: none;\n width: 25%;\n }\n\n .col-xl-4 {\n flex: none;\n width: 33.3333%;\n }\n\n .col-xl-5 {\n flex: none;\n width: 41.6667%;\n }\n\n .col-xl-6 {\n flex: none;\n width: 50%;\n }\n\n .col-xl-7 {\n flex: none;\n width: 58.3333%;\n }\n\n .col-xl-8 {\n flex: none;\n width: 66.6667%;\n }\n\n .col-xl-9 {\n flex: none;\n width: 75%;\n }\n\n .col-xl-10 {\n flex: none;\n width: 83.3333%;\n }\n\n .col-xl-11 {\n flex: none;\n width: 91.6667%;\n }\n\n .col-xl-12 {\n flex: none;\n width: 100%;\n }\n\n .offset-xl-0 {\n margin-left: 0;\n }\n\n .offset-xl-1 {\n margin-left: 8.33333%;\n }\n\n .offset-xl-2 {\n margin-left: 16.6667%;\n }\n\n .offset-xl-3 {\n margin-left: 25%;\n }\n\n .offset-xl-4 {\n margin-left: 33.3333%;\n }\n\n .offset-xl-5 {\n margin-left: 41.6667%;\n }\n\n .offset-xl-6 {\n margin-left: 50%;\n }\n\n .offset-xl-7 {\n margin-left: 58.3333%;\n }\n\n .offset-xl-8 {\n margin-left: 66.6667%;\n }\n\n .offset-xl-9 {\n margin-left: 75%;\n }\n\n .offset-xl-10 {\n margin-left: 83.3333%;\n }\n\n .offset-xl-11 {\n margin-left: 91.6667%;\n }\n\n .g-xl-0, .gx-xl-0 {\n --bs-gutter-x: 0;\n }\n\n .g-xl-0, .gy-xl-0 {\n --bs-gutter-y: 0;\n }\n\n .g-xl-1, .gx-xl-1 {\n --bs-gutter-x: .25rem;\n }\n\n .g-xl-1, .gy-xl-1 {\n --bs-gutter-y: .25rem;\n }\n\n .g-xl-2, .gx-xl-2 {\n --bs-gutter-x: .5rem;\n }\n\n .g-xl-2, .gy-xl-2 {\n --bs-gutter-y: .5rem;\n }\n\n .g-xl-3, .gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n\n .g-xl-3, .gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n\n .g-xl-4, .gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n\n .g-xl-4, .gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n\n .g-xl-5, .gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n\n .g-xl-5, .gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n\n@media (width >= 1400px) {\n .col-xxl {\n flex: 1 0;\n }\n\n .row-cols-xxl-auto > * {\n flex: none;\n width: auto;\n }\n\n .row-cols-xxl-1 > * {\n flex: none;\n width: 100%;\n }\n\n .row-cols-xxl-2 > * {\n flex: none;\n width: 50%;\n }\n\n .row-cols-xxl-3 > * {\n flex: none;\n width: 33.3333%;\n }\n\n .row-cols-xxl-4 > * {\n flex: none;\n width: 25%;\n }\n\n .row-cols-xxl-5 > * {\n flex: none;\n width: 20%;\n }\n\n .row-cols-xxl-6 > * {\n flex: none;\n width: 16.6667%;\n }\n\n .col-xxl-auto {\n flex: none;\n width: auto;\n }\n\n .col-xxl-1 {\n flex: none;\n width: 8.33333%;\n }\n\n .col-xxl-2 {\n flex: none;\n width: 16.6667%;\n }\n\n .col-xxl-3 {\n flex: none;\n width: 25%;\n }\n\n .col-xxl-4 {\n flex: none;\n width: 33.3333%;\n }\n\n .col-xxl-5 {\n flex: none;\n width: 41.6667%;\n }\n\n .col-xxl-6 {\n flex: none;\n width: 50%;\n }\n\n .col-xxl-7 {\n flex: none;\n width: 58.3333%;\n }\n\n .col-xxl-8 {\n flex: none;\n width: 66.6667%;\n }\n\n .col-xxl-9 {\n flex: none;\n width: 75%;\n }\n\n .col-xxl-10 {\n flex: none;\n width: 83.3333%;\n }\n\n .col-xxl-11 {\n flex: none;\n width: 91.6667%;\n }\n\n .col-xxl-12 {\n flex: none;\n width: 100%;\n }\n\n .offset-xxl-0 {\n margin-left: 0;\n }\n\n .offset-xxl-1 {\n margin-left: 8.33333%;\n }\n\n .offset-xxl-2 {\n margin-left: 16.6667%;\n }\n\n .offset-xxl-3 {\n margin-left: 25%;\n }\n\n .offset-xxl-4 {\n margin-left: 33.3333%;\n }\n\n .offset-xxl-5 {\n margin-left: 41.6667%;\n }\n\n .offset-xxl-6 {\n margin-left: 50%;\n }\n\n .offset-xxl-7 {\n margin-left: 58.3333%;\n }\n\n .offset-xxl-8 {\n margin-left: 66.6667%;\n }\n\n .offset-xxl-9 {\n margin-left: 75%;\n }\n\n .offset-xxl-10 {\n margin-left: 83.3333%;\n }\n\n .offset-xxl-11 {\n margin-left: 91.6667%;\n }\n\n .g-xxl-0, .gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n\n .g-xxl-0, .gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n\n .g-xxl-1, .gx-xxl-1 {\n --bs-gutter-x: .25rem;\n }\n\n .g-xxl-1, .gy-xxl-1 {\n --bs-gutter-y: .25rem;\n }\n\n .g-xxl-2, .gx-xxl-2 {\n --bs-gutter-x: .5rem;\n }\n\n .g-xxl-2, .gy-xxl-2 {\n --bs-gutter-y: .5rem;\n }\n\n .g-xxl-3, .gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n\n .g-xxl-3, .gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n\n .g-xxl-4, .gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n\n .g-xxl-4, .gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n\n .g-xxl-5, .gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n\n .g-xxl-5, .gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n\n.table {\n --bs-table-color-type: initial;\n --bs-table-bg-type: initial;\n --bs-table-color-state: initial;\n --bs-table-bg-state: initial;\n --bs-table-color: var(--bs-emphasis-color);\n --bs-table-bg: var(--bs-body-bg);\n --bs-table-border-color: var(--bs-border-color);\n --bs-table-accent-bg: transparent;\n --bs-table-striped-color: var(--bs-emphasis-color);\n --bs-table-striped-bg: rgba(var(--bs-emphasis-color-rgb), .05);\n --bs-table-active-color: var(--bs-emphasis-color);\n --bs-table-active-bg: rgba(var(--bs-emphasis-color-rgb), .1);\n --bs-table-hover-color: var(--bs-emphasis-color);\n --bs-table-hover-bg: rgba(var(--bs-emphasis-color-rgb), .075);\n vertical-align: top;\n border-color: var(--bs-table-border-color);\n width: 100%;\n margin-bottom: 1rem;\n}\n\n.table > :not(caption) > * > * {\n color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));\n background-color: var(--bs-table-bg);\n border-bottom-width: var(--bs-border-width);\n box-shadow: inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)));\n padding: .5rem;\n}\n\n.table > tbody {\n vertical-align: inherit;\n}\n\n.table > thead {\n vertical-align: bottom;\n}\n\n.table-group-divider {\n border-top: calc(var(--bs-border-width) * 2) solid currentcolor;\n}\n\n.caption-top {\n caption-side: top;\n}\n\n.table-sm > :not(caption) > * > * {\n padding: .25rem;\n}\n\n.table-bordered > :not(caption) > * {\n border-width: var(--bs-border-width) 0;\n}\n\n.table-bordered > :not(caption) > * > * {\n border-width: 0 var(--bs-border-width);\n}\n\n.table-borderless > :not(caption) > * > * {\n border-bottom-width: 0;\n}\n\n.table-borderless > :not(:first-child) {\n border-top-width: 0;\n}\n\n.table-striped > tbody > tr:nth-of-type(odd) > *, .table-striped-columns > :not(caption) > tr > :nth-child(2n) {\n --bs-table-color-type: var(--bs-table-striped-color);\n --bs-table-bg-type: var(--bs-table-striped-bg);\n}\n\n.table-active {\n --bs-table-color-state: var(--bs-table-active-color);\n --bs-table-bg-state: var(--bs-table-active-bg);\n}\n\n.table-hover > tbody > tr:hover > * {\n --bs-table-color-state: var(--bs-table-hover-color);\n --bs-table-bg-state: var(--bs-table-hover-bg);\n}\n\n.table-primary {\n --bs-table-color: #000;\n --bs-table-bg: #cfe2ff;\n --bs-table-border-color: #a6b5cc;\n --bs-table-striped-bg: #c5d7f2;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #bacbe6;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #bfd1ec;\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-secondary {\n --bs-table-color: #000;\n --bs-table-bg: #e2e3e5;\n --bs-table-border-color: #b5b6b7;\n --bs-table-striped-bg: #d7d8da;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #cbccce;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #d1d2d4;\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-success {\n --bs-table-color: #000;\n --bs-table-bg: #d1e7dd;\n --bs-table-border-color: #a7b9b1;\n --bs-table-striped-bg: #c7dbd2;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #bcd0c7;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #c1d6cc;\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-info {\n --bs-table-color: #000;\n --bs-table-bg: #cff4fc;\n --bs-table-border-color: #a6c3ca;\n --bs-table-striped-bg: #c5e8ef;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #badce3;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #bfe2e9;\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-warning {\n --bs-table-color: #000;\n --bs-table-bg: #fff3cd;\n --bs-table-border-color: #ccc2a4;\n --bs-table-striped-bg: #f2e7c3;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #e6dbb9;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #ece1be;\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-danger {\n --bs-table-color: #000;\n --bs-table-bg: #f8d7da;\n --bs-table-border-color: #c6acae;\n --bs-table-striped-bg: #eccccf;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #dfc2c4;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #e5c7ca;\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-light {\n --bs-table-color: #000;\n --bs-table-bg: #f8f9fa;\n --bs-table-border-color: #c6c7c8;\n --bs-table-striped-bg: #ecedee;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #dfe0e1;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #e5e6e7;\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-dark {\n --bs-table-color: #fff;\n --bs-table-bg: #212529;\n --bs-table-border-color: #4d5154;\n --bs-table-striped-bg: #2c3034;\n --bs-table-striped-color: #fff;\n --bs-table-active-bg: #373b3e;\n --bs-table-active-color: #fff;\n --bs-table-hover-bg: #323539;\n --bs-table-hover-color: #fff;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-responsive {\n -webkit-overflow-scrolling: touch;\n overflow-x: auto;\n}\n\n@media (width <= 575.98px) {\n .table-responsive-sm {\n -webkit-overflow-scrolling: touch;\n overflow-x: auto;\n }\n}\n\n@media (width <= 767.98px) {\n .table-responsive-md {\n -webkit-overflow-scrolling: touch;\n overflow-x: auto;\n }\n}\n\n@media (width <= 991.98px) {\n .table-responsive-lg {\n -webkit-overflow-scrolling: touch;\n overflow-x: auto;\n }\n}\n\n@media (width <= 1199.98px) {\n .table-responsive-xl {\n -webkit-overflow-scrolling: touch;\n overflow-x: auto;\n }\n}\n\n@media (width <= 1399.98px) {\n .table-responsive-xxl {\n -webkit-overflow-scrolling: touch;\n overflow-x: auto;\n }\n}\n\n.form-label {\n margin-bottom: .5rem;\n}\n\n.col-form-label {\n padding-top: calc(.375rem + var(--bs-border-width));\n padding-bottom: calc(.375rem + var(--bs-border-width));\n font-size: inherit;\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.col-form-label-lg {\n padding-top: calc(.5rem + var(--bs-border-width));\n padding-bottom: calc(.5rem + var(--bs-border-width));\n font-size: 1.25rem;\n}\n\n.col-form-label-sm {\n padding-top: calc(.25rem + var(--bs-border-width));\n padding-bottom: calc(.25rem + var(--bs-border-width));\n font-size: .875rem;\n}\n\n.form-text {\n color: var(--bs-secondary-color);\n margin-top: .25rem;\n font-size: .875em;\n}\n\n.form-control {\n color: var(--bs-body-color);\n appearance: none;\n background-color: var(--bs-body-bg);\n border: var(--bs-border-width) solid var(--bs-border-color);\n border-radius: var(--bs-border-radius);\n background-clip: padding-box;\n width: 100%;\n padding: .375rem .75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out;\n display: block;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n\n.form-control[type=\"file\"] {\n overflow: hidden;\n}\n\n.form-control[type=\"file\"]:not(:disabled):not([readonly]) {\n cursor: pointer;\n}\n\n.form-control:focus {\n color: var(--bs-body-color);\n background-color: var(--bs-body-bg);\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 .25rem #0d6efd40;\n}\n\n.form-control::-webkit-date-and-time-value {\n min-width: 85px;\n height: 1.5em;\n margin: 0;\n}\n\n.form-control::-webkit-datetime-edit {\n padding: 0;\n display: block;\n}\n\n.form-control::placeholder {\n color: var(--bs-secondary-color);\n opacity: 1;\n}\n\n.form-control:disabled {\n background-color: var(--bs-secondary-bg);\n opacity: 1;\n}\n\n.form-control::-webkit-file-upload-button {\n -webkit-margin-end: .75rem;\n color: var(--bs-body-color);\n background-color: var(--bs-tertiary-bg);\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: var(--bs-border-width);\n margin: -.375rem -.75rem;\n border-radius: 0;\n margin-inline-end: .75rem;\n padding: .375rem .75rem;\n transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;\n}\n\n.form-control::file-selector-button {\n -webkit-margin-end: .75rem;\n color: var(--bs-body-color);\n background-color: var(--bs-tertiary-bg);\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: var(--bs-border-width);\n border-radius: 0;\n margin: -.375rem -.75rem;\n margin-inline-end: .75rem;\n padding: .375rem .75rem;\n transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-control::file-selector-button {\n transition: none;\n }\n}\n\n.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {\n background-color: var(--bs-secondary-bg);\n}\n\n.form-control:hover:not(:disabled):not([readonly])::file-selector-button {\n background-color: var(--bs-secondary-bg);\n}\n\n.form-control-plaintext {\n color: var(--bs-body-color);\n border: solid #0000;\n border-width: var(--bs-border-width) 0;\n background-color: #0000;\n width: 100%;\n margin-bottom: 0;\n padding: .375rem 0;\n line-height: 1.5;\n display: block;\n}\n\n.form-control-plaintext:focus {\n outline: 0;\n}\n\n.form-control-plaintext.form-control-lg, .form-control-plaintext.form-control-sm {\n padding-left: 0;\n padding-right: 0;\n}\n\n.form-control-sm {\n min-height: calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));\n border-radius: var(--bs-border-radius-sm);\n padding: .25rem .5rem;\n font-size: .875rem;\n}\n\n.form-control-sm::file-selector-button {\n -webkit-margin-end: .5rem;\n margin: -.25rem -.5rem;\n margin-inline-end: .5rem;\n padding: .25rem .5rem;\n}\n\n.form-control-lg {\n min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));\n border-radius: var(--bs-border-radius-lg);\n padding: .5rem 1rem;\n font-size: 1.25rem;\n}\n\n.form-control-lg::file-selector-button {\n -webkit-margin-end: 1rem;\n margin: -.5rem -1rem;\n margin-inline-end: 1rem;\n padding: .5rem 1rem;\n}\n\ntextarea.form-control {\n min-height: calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));\n}\n\ntextarea.form-control-sm {\n min-height: calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));\n}\n\ntextarea.form-control-lg {\n min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));\n}\n\n.form-control-color {\n height: calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));\n width: 3rem;\n padding: .375rem;\n}\n\n.form-control-color:not(:disabled):not([readonly]) {\n cursor: pointer;\n}\n\n.form-control-color::-moz-color-swatch {\n border-radius: var(--bs-border-radius);\n border: 0 !important;\n}\n\n.form-control-color::-webkit-color-swatch {\n border-radius: var(--bs-border-radius);\n border: 0 !important;\n}\n\n.form-control-color.form-control-sm {\n height: calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));\n}\n\n.form-control-color.form-control-lg {\n height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));\n}\n\n.form-select {\n --bs-form-select-bg-img: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");\n color: var(--bs-body-color);\n appearance: none;\n background-color: var(--bs-body-bg);\n background-image: var(--bs-form-select-bg-img), var(--bs-form-select-bg-icon, none);\n border: var(--bs-border-width) solid var(--bs-border-color);\n border-radius: var(--bs-border-radius);\n background-position: right .75rem center;\n background-repeat: no-repeat;\n background-size: 16px 12px;\n width: 100%;\n padding: .375rem 2.25rem .375rem .75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out;\n display: block;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-select {\n transition: none;\n }\n}\n\n.form-select:focus {\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 .25rem #0d6efd40;\n}\n\n.form-select[multiple], .form-select[size]:not([size=\"1\"]) {\n background-image: none;\n padding-right: .75rem;\n}\n\n.form-select:disabled {\n background-color: var(--bs-secondary-bg);\n}\n\n.form-select:-moz-focusring {\n color: #0000;\n text-shadow: 0 0 0 var(--bs-body-color);\n}\n\n.form-select-sm {\n border-radius: var(--bs-border-radius-sm);\n padding-top: .25rem;\n padding-bottom: .25rem;\n padding-left: .5rem;\n font-size: .875rem;\n}\n\n.form-select-lg {\n border-radius: var(--bs-border-radius-lg);\n padding-top: .5rem;\n padding-bottom: .5rem;\n padding-left: 1rem;\n font-size: 1.25rem;\n}\n\n[data-bs-theme=\"dark\"] .form-select {\n --bs-form-select-bg-img: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");\n}\n\n.form-check {\n min-height: 1.5rem;\n margin-bottom: .125rem;\n padding-left: 1.5em;\n display: block;\n}\n\n.form-check .form-check-input {\n float: left;\n margin-left: -1.5em;\n}\n\n.form-check-reverse {\n text-align: right;\n padding-left: 0;\n padding-right: 1.5em;\n}\n\n.form-check-reverse .form-check-input {\n float: right;\n margin-left: 0;\n margin-right: -1.5em;\n}\n\n.form-check-input {\n --bs-form-check-bg: var(--bs-body-bg);\n vertical-align: top;\n appearance: none;\n background-color: var(--bs-form-check-bg);\n background-image: var(--bs-form-check-bg-image);\n border: var(--bs-border-width) solid var(--bs-border-color);\n -webkit-print-color-adjust: exact;\n color-adjust: exact;\n print-color-adjust: exact;\n background-position: center;\n background-repeat: no-repeat;\n background-size: contain;\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n margin-top: .25em;\n}\n\n.form-check-input[type=\"checkbox\"] {\n border-radius: .25em;\n}\n\n.form-check-input[type=\"radio\"] {\n border-radius: 50%;\n}\n\n.form-check-input:active {\n filter: brightness(90%);\n}\n\n.form-check-input:focus {\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 .25rem #0d6efd40;\n}\n\n.form-check-input:checked {\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n\n.form-check-input:checked[type=\"checkbox\"] {\n --bs-form-check-bg-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e\");\n}\n\n.form-check-input:checked[type=\"radio\"] {\n --bs-form-check-bg-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.form-check-input[type=\"checkbox\"]:indeterminate {\n --bs-form-check-bg-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e\");\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n\n.form-check-input:disabled {\n pointer-events: none;\n filter: none;\n opacity: .5;\n}\n\n.form-check-input:disabled ~ .form-check-label, .form-check-input[disabled] ~ .form-check-label {\n cursor: default;\n opacity: .5;\n}\n\n.form-switch {\n padding-left: 2.5em;\n}\n\n.form-switch .form-check-input {\n --bs-form-switch-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e\");\n background-image: var(--bs-form-switch-bg);\n background-position: 0;\n border-radius: 2em;\n width: 2em;\n margin-left: -2.5em;\n transition: background-position .15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-switch .form-check-input {\n transition: none;\n }\n}\n\n.form-switch .form-check-input:focus {\n --bs-form-switch-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e\");\n}\n\n.form-switch .form-check-input:checked {\n --bs-form-switch-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n background-position: 100%;\n}\n\n.form-switch.form-check-reverse {\n padding-left: 0;\n padding-right: 2.5em;\n}\n\n.form-switch.form-check-reverse .form-check-input {\n margin-left: 0;\n margin-right: -2.5em;\n}\n\n.form-check-inline {\n margin-right: 1rem;\n display: inline-block;\n}\n\n.btn-check {\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n position: absolute;\n}\n\n.btn-check:disabled + .btn, .btn-check[disabled] + .btn {\n pointer-events: none;\n filter: none;\n opacity: .65;\n}\n\n[data-bs-theme=\"dark\"] .form-switch .form-check-input:not(:checked):not(:focus) {\n --bs-form-switch-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e\");\n}\n\n.form-range {\n appearance: none;\n background-color: #0000;\n width: 100%;\n height: 1.5rem;\n padding: 0;\n}\n\n.form-range:focus {\n outline: 0;\n}\n\n.form-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 .25rem #0d6efd40;\n}\n\n.form-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 .25rem #0d6efd40;\n}\n\n.form-range::-moz-focus-outer {\n border: 0;\n}\n\n.form-range::-webkit-slider-thumb {\n appearance: none;\n background-color: #0d6efd;\n border: 0;\n border-radius: 1rem;\n width: 1rem;\n height: 1rem;\n margin-top: -.25rem;\n transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-range::-webkit-slider-thumb {\n transition: none;\n }\n}\n\n.form-range::-webkit-slider-thumb:active {\n background-color: #b6d4fe;\n}\n\n.form-range::-webkit-slider-runnable-track {\n color: #0000;\n cursor: pointer;\n background-color: var(--bs-secondary-bg);\n border-color: #0000;\n border-radius: 1rem;\n width: 100%;\n height: .5rem;\n}\n\n.form-range::-moz-range-thumb {\n appearance: none;\n background-color: #0d6efd;\n border: 0;\n border-radius: 1rem;\n width: 1rem;\n height: 1rem;\n transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-range::-moz-range-thumb {\n transition: none;\n }\n}\n\n.form-range::-moz-range-thumb:active {\n background-color: #b6d4fe;\n}\n\n.form-range::-moz-range-track {\n color: #0000;\n cursor: pointer;\n background-color: var(--bs-secondary-bg);\n border-color: #0000;\n border-radius: 1rem;\n width: 100%;\n height: .5rem;\n}\n\n.form-range:disabled {\n pointer-events: none;\n}\n\n.form-range:disabled::-webkit-slider-thumb {\n background-color: var(--bs-secondary-color);\n}\n\n.form-range:disabled::-moz-range-thumb {\n background-color: var(--bs-secondary-color);\n}\n\n.form-floating {\n position: relative;\n}\n\n.form-floating > .form-control, .form-floating > .form-control-plaintext, .form-floating > .form-select {\n height: calc(3.5rem + calc(var(--bs-border-width) * 2));\n min-height: calc(3.5rem + calc(var(--bs-border-width) * 2));\n line-height: 1.25;\n}\n\n.form-floating > label {\n z-index: 2;\n text-align: start;\n text-overflow: ellipsis;\n white-space: nowrap;\n pointer-events: none;\n border: var(--bs-border-width) solid transparent;\n transform-origin: 0 0;\n height: 100%;\n padding: 1rem .75rem;\n transition: opacity .1s ease-in-out, transform .1s ease-in-out;\n position: absolute;\n top: 0;\n left: 0;\n overflow: hidden;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-floating > label {\n transition: none;\n }\n}\n\n.form-floating > .form-control, .form-floating > .form-control-plaintext {\n padding: 1rem .75rem;\n}\n\n.form-floating > .form-control-plaintext::-moz-placeholder {\n color: #0000;\n}\n\n.form-floating > .form-control::-moz-placeholder {\n color: #0000;\n}\n\n.form-floating > .form-control-plaintext::placeholder, .form-floating > .form-control::placeholder {\n color: #0000;\n}\n\n:-webkit-any(.form-floating > .form-control-plaintext:not(:placeholder-shown), .form-floating > .form-control:not(:placeholder-shown)), .form-floating > .form-control-plaintext:focus, .form-floating > .form-control-plaintext:not(:placeholder-shown), .form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown), :-webkit-any(.form-floating > .form-control-plaintext:-webkit-autofill, .form-floating > .form-control:-webkit-autofill), .form-floating > .form-select {\n padding-top: 1.625rem;\n padding-bottom: .625rem;\n}\n\n:is(.form-floating > .form-control-plaintext:not(:placeholder-shown), .form-floating > .form-control:not(:placeholder-shown)), .form-floating > .form-control-plaintext:focus, .form-floating > .form-control-plaintext:not(:placeholder-shown), .form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown), :is(.form-floating > .form-control-plaintext:autofill, .form-floating > .form-control:autofill), .form-floating > .form-select {\n padding-top: 1.625rem;\n padding-bottom: .625rem;\n}\n\n.form-floating > .form-control:not(:placeholder-shown) ~ label {\n color: rgba(var(--bs-body-color-rgb), .65);\n transform: scale(.85)translateY(-.5rem)translateX(.15rem);\n}\n\n.form-floating > .form-control-plaintext ~ label, .form-floating > .form-control:focus ~ label, .form-floating > .form-control:not(:placeholder-shown) ~ label, .form-floating > .form-select ~ label {\n color: rgba(var(--bs-body-color-rgb), .65);\n transform: scale(.85)translateY(-.5rem)translateX(.15rem);\n}\n\n.form-floating > .form-control:not(:placeholder-shown) ~ label:after {\n z-index: -1;\n content: \"\";\n background-color: var(--bs-body-bg);\n border-radius: var(--bs-border-radius);\n height: 1.5em;\n position: absolute;\n inset: 1rem .375rem;\n}\n\n.form-floating > .form-control-plaintext ~ label:after, .form-floating > .form-control:focus ~ label:after, .form-floating > .form-control:not(:placeholder-shown) ~ label:after, .form-floating > .form-select ~ label:after {\n z-index: -1;\n content: \"\";\n background-color: var(--bs-body-bg);\n border-radius: var(--bs-border-radius);\n height: 1.5em;\n position: absolute;\n inset: 1rem .375rem;\n}\n\n.form-floating > .form-control:-webkit-autofill ~ label {\n color: rgba(var(--bs-body-color-rgb), .65);\n transform: scale(.85)translateY(-.5rem)translateX(.15rem);\n}\n\n.form-floating > .form-control-plaintext ~ label {\n border-width: var(--bs-border-width) 0;\n}\n\n.form-floating > .form-control:disabled ~ label, .form-floating > :disabled ~ label {\n color: #6c757d;\n}\n\n.form-floating > .form-control:disabled ~ label:after, .form-floating > :disabled ~ label:after {\n background-color: var(--bs-secondary-bg);\n}\n\n.input-group {\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%;\n display: flex;\n position: relative;\n}\n\n.input-group > .form-control, .input-group > .form-floating, .input-group > .form-select {\n flex: auto;\n width: 1%;\n min-width: 0;\n position: relative;\n}\n\n.input-group > .form-control:focus, .input-group > .form-floating:focus-within, .input-group > .form-select:focus {\n z-index: 5;\n}\n\n.input-group .btn {\n z-index: 2;\n position: relative;\n}\n\n.input-group .btn:focus {\n z-index: 5;\n}\n\n.input-group-text {\n color: var(--bs-body-color);\n text-align: center;\n white-space: nowrap;\n background-color: var(--bs-tertiary-bg);\n border: var(--bs-border-width) solid var(--bs-border-color);\n border-radius: var(--bs-border-radius);\n align-items: center;\n padding: .375rem .75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n display: flex;\n}\n\n.input-group-lg > .btn, .input-group-lg > .form-control, .input-group-lg > .form-select, .input-group-lg > .input-group-text {\n border-radius: var(--bs-border-radius-lg);\n padding: .5rem 1rem;\n font-size: 1.25rem;\n}\n\n.input-group-sm > .btn, .input-group-sm > .form-control, .input-group-sm > .form-select, .input-group-sm > .input-group-text {\n border-radius: var(--bs-border-radius-sm);\n padding: .25rem .5rem;\n font-size: .875rem;\n}\n\n.input-group-lg > .form-select, .input-group-sm > .form-select {\n padding-right: 3rem;\n}\n\n.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3), .input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control, .input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select, .input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), .input-group.has-validation > .dropdown-toggle:nth-last-child(n+4), .input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control, .input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select, .input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) {\n margin-left: calc(var(--bs-border-width) * -1);\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group > .form-floating:not(:first-child) > .form-control, .input-group > .form-floating:not(:first-child) > .form-select {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.valid-feedback {\n color: var(--bs-form-valid-color);\n width: 100%;\n margin-top: .25rem;\n font-size: .875em;\n display: none;\n}\n\n.valid-tooltip {\n z-index: 5;\n color: #fff;\n background-color: var(--bs-success);\n border-radius: var(--bs-border-radius);\n max-width: 100%;\n margin-top: .1rem;\n padding: .25rem .5rem;\n font-size: .875rem;\n display: none;\n position: absolute;\n top: 100%;\n}\n\n.is-valid ~ .valid-feedback, .is-valid ~ .valid-tooltip, .was-validated :valid ~ .valid-feedback, .was-validated :valid ~ .valid-tooltip {\n display: block;\n}\n\n.form-control.is-valid, .was-validated .form-control:valid {\n border-color: var(--bs-form-valid-border-color);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n background-position: right calc(.375em + .1875rem) center;\n background-repeat: no-repeat;\n background-size: calc(.75em + .375rem) calc(.75em + .375rem);\n padding-right: calc(1.5em + .75rem);\n}\n\n.form-control.is-valid:focus, .was-validated .form-control:valid:focus {\n border-color: var(--bs-form-valid-border-color);\n box-shadow: 0 0 0 .25rem rgba(var(--bs-success-rgb), .25);\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n background-position: right calc(.375em + .1875rem) top calc(.375em + .1875rem);\n padding-right: calc(1.5em + .75rem);\n}\n\n.form-select.is-valid, .was-validated .form-select:valid {\n border-color: var(--bs-form-valid-border-color);\n}\n\n.form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size=\"1\"], .was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size=\"1\"] {\n --bs-form-select-bg-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n background-position: right .75rem center, right 2.25rem center;\n background-size: 16px 12px, calc(.75em + .375rem) calc(.75em + .375rem);\n padding-right: 4.125rem;\n}\n\n.form-select.is-valid:focus, .was-validated .form-select:valid:focus {\n border-color: var(--bs-form-valid-border-color);\n box-shadow: 0 0 0 .25rem rgba(var(--bs-success-rgb), .25);\n}\n\n.form-control-color.is-valid, .was-validated .form-control-color:valid {\n width: calc(1.5em + 3.75rem);\n}\n\n.form-check-input.is-valid, .was-validated .form-check-input:valid {\n border-color: var(--bs-form-valid-border-color);\n}\n\n.form-check-input.is-valid:checked, .was-validated .form-check-input:valid:checked {\n background-color: var(--bs-form-valid-color);\n}\n\n.form-check-input.is-valid:focus, .was-validated .form-check-input:valid:focus {\n box-shadow: 0 0 0 .25rem rgba(var(--bs-success-rgb), .25);\n}\n\n.form-check-input.is-valid ~ .form-check-label, .was-validated .form-check-input:valid ~ .form-check-label {\n color: var(--bs-form-valid-color);\n}\n\n.form-check-inline .form-check-input ~ .valid-feedback {\n margin-left: .5em;\n}\n\n.input-group > .form-control:not(:focus).is-valid, .input-group > .form-floating:not(:focus-within).is-valid, .input-group > .form-select:not(:focus).is-valid, .was-validated .input-group > .form-control:not(:focus):valid, .was-validated .input-group > .form-floating:not(:focus-within):valid, .was-validated .input-group > .form-select:not(:focus):valid {\n z-index: 3;\n}\n\n.invalid-feedback {\n color: var(--bs-form-invalid-color);\n width: 100%;\n margin-top: .25rem;\n font-size: .875em;\n display: none;\n}\n\n.invalid-tooltip {\n z-index: 5;\n color: #fff;\n background-color: var(--bs-danger);\n border-radius: var(--bs-border-radius);\n max-width: 100%;\n margin-top: .1rem;\n padding: .25rem .5rem;\n font-size: .875rem;\n display: none;\n position: absolute;\n top: 100%;\n}\n\n.is-invalid ~ .invalid-feedback, .is-invalid ~ .invalid-tooltip, .was-validated :invalid ~ .invalid-feedback, .was-validated :invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.form-control.is-invalid, .was-validated .form-control:invalid {\n border-color: var(--bs-form-invalid-border-color);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\");\n background-position: right calc(.375em + .1875rem) center;\n background-repeat: no-repeat;\n background-size: calc(.75em + .375rem) calc(.75em + .375rem);\n padding-right: calc(1.5em + .75rem);\n}\n\n.form-control.is-invalid:focus, .was-validated .form-control:invalid:focus {\n border-color: var(--bs-form-invalid-border-color);\n box-shadow: 0 0 0 .25rem rgba(var(--bs-danger-rgb), .25);\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n background-position: right calc(.375em + .1875rem) top calc(.375em + .1875rem);\n padding-right: calc(1.5em + .75rem);\n}\n\n.form-select.is-invalid, .was-validated .form-select:invalid {\n border-color: var(--bs-form-invalid-border-color);\n}\n\n.form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size=\"1\"], .was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size=\"1\"] {\n --bs-form-select-bg-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\");\n background-position: right .75rem center, right 2.25rem center;\n background-size: 16px 12px, calc(.75em + .375rem) calc(.75em + .375rem);\n padding-right: 4.125rem;\n}\n\n.form-select.is-invalid:focus, .was-validated .form-select:invalid:focus {\n border-color: var(--bs-form-invalid-border-color);\n box-shadow: 0 0 0 .25rem rgba(var(--bs-danger-rgb), .25);\n}\n\n.form-control-color.is-invalid, .was-validated .form-control-color:invalid {\n width: calc(1.5em + 3.75rem);\n}\n\n.form-check-input.is-invalid, .was-validated .form-check-input:invalid {\n border-color: var(--bs-form-invalid-border-color);\n}\n\n.form-check-input.is-invalid:checked, .was-validated .form-check-input:invalid:checked {\n background-color: var(--bs-form-invalid-color);\n}\n\n.form-check-input.is-invalid:focus, .was-validated .form-check-input:invalid:focus {\n box-shadow: 0 0 0 .25rem rgba(var(--bs-danger-rgb), .25);\n}\n\n.form-check-input.is-invalid ~ .form-check-label, .was-validated .form-check-input:invalid ~ .form-check-label {\n color: var(--bs-form-invalid-color);\n}\n\n.form-check-inline .form-check-input ~ .invalid-feedback {\n margin-left: .5em;\n}\n\n.input-group > .form-control:not(:focus).is-invalid, .input-group > .form-floating:not(:focus-within).is-invalid, .input-group > .form-select:not(:focus).is-invalid, .was-validated .input-group > .form-control:not(:focus):invalid, .was-validated .input-group > .form-floating:not(:focus-within):invalid, .was-validated .input-group > .form-select:not(:focus):invalid {\n z-index: 4;\n}\n\n.btn {\n --bs-btn-padding-x: .75rem;\n --bs-btn-padding-y: .375rem;\n --bs-btn-font-family: ;\n --bs-btn-font-size: 1rem;\n --bs-btn-font-weight: 400;\n --bs-btn-line-height: 1.5;\n --bs-btn-color: var(--bs-body-color);\n --bs-btn-bg: transparent;\n --bs-btn-border-width: var(--bs-border-width);\n --bs-btn-border-color: transparent;\n --bs-btn-border-radius: var(--bs-border-radius);\n --bs-btn-hover-border-color: transparent;\n --bs-btn-box-shadow: inset 0 1px 0 #ffffff26, 0 1px 1px #00000013;\n --bs-btn-disabled-opacity: .65;\n --bs-btn-focus-box-shadow: 0 0 0 .25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);\n padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x);\n font-family: var(--bs-btn-font-family);\n font-size: var(--bs-btn-font-size);\n font-weight: var(--bs-btn-font-weight);\n line-height: var(--bs-btn-line-height);\n color: var(--bs-btn-color);\n text-align: center;\n vertical-align: middle;\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n border: var(--bs-btn-border-width) solid var(--bs-btn-border-color);\n border-radius: var(--bs-btn-border-radius);\n background-color: var(--bs-btn-bg);\n text-decoration: none;\n transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;\n display: inline-block;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n\n.btn:hover {\n color: var(--bs-btn-hover-color);\n background-color: var(--bs-btn-hover-bg);\n border-color: var(--bs-btn-hover-border-color);\n}\n\n.btn-check + .btn:hover {\n color: var(--bs-btn-color);\n background-color: var(--bs-btn-bg);\n border-color: var(--bs-btn-border-color);\n}\n\n.btn:focus-visible {\n color: var(--bs-btn-hover-color);\n background-color: var(--bs-btn-hover-bg);\n border-color: var(--bs-btn-hover-border-color);\n box-shadow: var(--bs-btn-focus-box-shadow);\n outline: 0;\n}\n\n.btn-check:focus-visible + .btn {\n border-color: var(--bs-btn-hover-border-color);\n box-shadow: var(--bs-btn-focus-box-shadow);\n outline: 0;\n}\n\n.btn-check:checked + .btn, .btn.active, .btn.show, .btn:first-child:active, :not(.btn-check) + .btn:active {\n color: var(--bs-btn-active-color);\n background-color: var(--bs-btn-active-bg);\n border-color: var(--bs-btn-active-border-color);\n}\n\n.btn-check:checked + .btn:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible, .btn:first-child:active:focus-visible, :not(.btn-check) + .btn:active:focus-visible, .btn-check:checked:focus-visible + .btn {\n box-shadow: var(--bs-btn-focus-box-shadow);\n}\n\n.btn.disabled, .btn:disabled, fieldset:disabled .btn {\n color: var(--bs-btn-disabled-color);\n pointer-events: none;\n background-color: var(--bs-btn-disabled-bg);\n border-color: var(--bs-btn-disabled-border-color);\n opacity: var(--bs-btn-disabled-opacity);\n}\n\n.btn-primary {\n --bs-btn-color: #fff;\n --bs-btn-bg: #0d6efd;\n --bs-btn-border-color: #0d6efd;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #0b5ed7;\n --bs-btn-hover-border-color: #0a58ca;\n --bs-btn-focus-shadow-rgb: 49, 132, 253;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #0a58ca;\n --bs-btn-active-border-color: #0a53be;\n --bs-btn-active-shadow: inset 0 3px 5px #00000020;\n --bs-btn-disabled-color: #fff;\n --bs-btn-disabled-bg: #0d6efd;\n --bs-btn-disabled-border-color: #0d6efd;\n}\n\n.btn-secondary {\n --bs-btn-color: #fff;\n --bs-btn-bg: #6c757d;\n --bs-btn-border-color: #6c757d;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #5c636a;\n --bs-btn-hover-border-color: #565e64;\n --bs-btn-focus-shadow-rgb: 130, 138, 145;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #565e64;\n --bs-btn-active-border-color: #51585e;\n --bs-btn-active-shadow: inset 0 3px 5px #00000020;\n --bs-btn-disabled-color: #fff;\n --bs-btn-disabled-bg: #6c757d;\n --bs-btn-disabled-border-color: #6c757d;\n}\n\n.btn-success {\n --bs-btn-color: #fff;\n --bs-btn-bg: #198754;\n --bs-btn-border-color: #198754;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #157347;\n --bs-btn-hover-border-color: #146c43;\n --bs-btn-focus-shadow-rgb: 60, 153, 110;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #146c43;\n --bs-btn-active-border-color: #13653f;\n --bs-btn-active-shadow: inset 0 3px 5px #00000020;\n --bs-btn-disabled-color: #fff;\n --bs-btn-disabled-bg: #198754;\n --bs-btn-disabled-border-color: #198754;\n}\n\n.btn-info {\n --bs-btn-color: #000;\n --bs-btn-bg: #0dcaf0;\n --bs-btn-border-color: #0dcaf0;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: #31d2f2;\n --bs-btn-hover-border-color: #25cff2;\n --bs-btn-focus-shadow-rgb: 11, 172, 204;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: #3dd5f3;\n --bs-btn-active-border-color: #25cff2;\n --bs-btn-active-shadow: inset 0 3px 5px #00000020;\n --bs-btn-disabled-color: #000;\n --bs-btn-disabled-bg: #0dcaf0;\n --bs-btn-disabled-border-color: #0dcaf0;\n}\n\n.btn-warning {\n --bs-btn-color: #000;\n --bs-btn-bg: #ffc107;\n --bs-btn-border-color: #ffc107;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: #ffca2c;\n --bs-btn-hover-border-color: #ffc720;\n --bs-btn-focus-shadow-rgb: 217, 164, 6;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: #ffcd39;\n --bs-btn-active-border-color: #ffc720;\n --bs-btn-active-shadow: inset 0 3px 5px #00000020;\n --bs-btn-disabled-color: #000;\n --bs-btn-disabled-bg: #ffc107;\n --bs-btn-disabled-border-color: #ffc107;\n}\n\n.btn-danger {\n --bs-btn-color: #fff;\n --bs-btn-bg: #dc3545;\n --bs-btn-border-color: #dc3545;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #bb2d3b;\n --bs-btn-hover-border-color: #b02a37;\n --bs-btn-focus-shadow-rgb: 225, 83, 97;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #b02a37;\n --bs-btn-active-border-color: #a52834;\n --bs-btn-active-shadow: inset 0 3px 5px #00000020;\n --bs-btn-disabled-color: #fff;\n --bs-btn-disabled-bg: #dc3545;\n --bs-btn-disabled-border-color: #dc3545;\n}\n\n.btn-light {\n --bs-btn-color: #000;\n --bs-btn-bg: #f8f9fa;\n --bs-btn-border-color: #f8f9fa;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: #d3d4d5;\n --bs-btn-hover-border-color: #c6c7c8;\n --bs-btn-focus-shadow-rgb: 211, 212, 213;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: #c6c7c8;\n --bs-btn-active-border-color: #babbbc;\n --bs-btn-active-shadow: inset 0 3px 5px #00000020;\n --bs-btn-disabled-color: #000;\n --bs-btn-disabled-bg: #f8f9fa;\n --bs-btn-disabled-border-color: #f8f9fa;\n}\n\n.btn-dark {\n --bs-btn-color: #fff;\n --bs-btn-bg: #212529;\n --bs-btn-border-color: #212529;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #424649;\n --bs-btn-hover-border-color: #373b3e;\n --bs-btn-focus-shadow-rgb: 66, 70, 73;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #4d5154;\n --bs-btn-active-border-color: #373b3e;\n --bs-btn-active-shadow: inset 0 3px 5px #00000020;\n --bs-btn-disabled-color: #fff;\n --bs-btn-disabled-bg: #212529;\n --bs-btn-disabled-border-color: #212529;\n}\n\n.btn-outline-primary {\n --bs-btn-color: #0d6efd;\n --bs-btn-border-color: #0d6efd;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #0d6efd;\n --bs-btn-hover-border-color: #0d6efd;\n --bs-btn-focus-shadow-rgb: 13, 110, 253;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #0d6efd;\n --bs-btn-active-border-color: #0d6efd;\n --bs-btn-active-shadow: inset 0 3px 5px #00000020;\n --bs-btn-disabled-color: #0d6efd;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #0d6efd;\n --bs-gradient: none;\n}\n\n.btn-outline-secondary {\n --bs-btn-color: #6c757d;\n --bs-btn-border-color: #6c757d;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #6c757d;\n --bs-btn-hover-border-color: #6c757d;\n --bs-btn-focus-shadow-rgb: 108, 117, 125;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #6c757d;\n --bs-btn-active-border-color: #6c757d;\n --bs-btn-active-shadow: inset 0 3px 5px #00000020;\n --bs-btn-disabled-color: #6c757d;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #6c757d;\n --bs-gradient: none;\n}\n\n.btn-outline-success {\n --bs-btn-color: #198754;\n --bs-btn-border-color: #198754;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #198754;\n --bs-btn-hover-border-color: #198754;\n --bs-btn-focus-shadow-rgb: 25, 135, 84;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #198754;\n --bs-btn-active-border-color: #198754;\n --bs-btn-active-shadow: inset 0 3px 5px #00000020;\n --bs-btn-disabled-color: #198754;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #198754;\n --bs-gradient: none;\n}\n\n.btn-outline-info {\n --bs-btn-color: #0dcaf0;\n --bs-btn-border-color: #0dcaf0;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: #0dcaf0;\n --bs-btn-hover-border-color: #0dcaf0;\n --bs-btn-focus-shadow-rgb: 13, 202, 240;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: #0dcaf0;\n --bs-btn-active-border-color: #0dcaf0;\n --bs-btn-active-shadow: inset 0 3px 5px #00000020;\n --bs-btn-disabled-color: #0dcaf0;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #0dcaf0;\n --bs-gradient: none;\n}\n\n.btn-outline-warning {\n --bs-btn-color: #ffc107;\n --bs-btn-border-color: #ffc107;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: #ffc107;\n --bs-btn-hover-border-color: #ffc107;\n --bs-btn-focus-shadow-rgb: 255, 193, 7;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: #ffc107;\n --bs-btn-active-border-color: #ffc107;\n --bs-btn-active-shadow: inset 0 3px 5px #00000020;\n --bs-btn-disabled-color: #ffc107;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #ffc107;\n --bs-gradient: none;\n}\n\n.btn-outline-danger {\n --bs-btn-color: #dc3545;\n --bs-btn-border-color: #dc3545;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #dc3545;\n --bs-btn-hover-border-color: #dc3545;\n --bs-btn-focus-shadow-rgb: 220, 53, 69;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #dc3545;\n --bs-btn-active-border-color: #dc3545;\n --bs-btn-active-shadow: inset 0 3px 5px #00000020;\n --bs-btn-disabled-color: #dc3545;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #dc3545;\n --bs-gradient: none;\n}\n\n.btn-outline-light {\n --bs-btn-color: #f8f9fa;\n --bs-btn-border-color: #f8f9fa;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: #f8f9fa;\n --bs-btn-hover-border-color: #f8f9fa;\n --bs-btn-focus-shadow-rgb: 248, 249, 250;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: #f8f9fa;\n --bs-btn-active-border-color: #f8f9fa;\n --bs-btn-active-shadow: inset 0 3px 5px #00000020;\n --bs-btn-disabled-color: #f8f9fa;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #f8f9fa;\n --bs-gradient: none;\n}\n\n.btn-outline-dark {\n --bs-btn-color: #212529;\n --bs-btn-border-color: #212529;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #212529;\n --bs-btn-hover-border-color: #212529;\n --bs-btn-focus-shadow-rgb: 33, 37, 41;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #212529;\n --bs-btn-active-border-color: #212529;\n --bs-btn-active-shadow: inset 0 3px 5px #00000020;\n --bs-btn-disabled-color: #212529;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #212529;\n --bs-gradient: none;\n}\n\n.btn-link {\n --bs-btn-font-weight: 400;\n --bs-btn-color: var(--bs-link-color);\n --bs-btn-bg: transparent;\n --bs-btn-border-color: transparent;\n --bs-btn-hover-color: var(--bs-link-hover-color);\n --bs-btn-hover-border-color: transparent;\n --bs-btn-active-color: var(--bs-link-hover-color);\n --bs-btn-active-border-color: transparent;\n --bs-btn-disabled-color: #6c757d;\n --bs-btn-disabled-border-color: transparent;\n --bs-btn-box-shadow: 0 0 0 #000;\n --bs-btn-focus-shadow-rgb: 49, 132, 253;\n text-decoration: underline;\n}\n\n.btn-link:focus-visible {\n color: var(--bs-btn-color);\n}\n\n.btn-link:hover {\n color: var(--bs-btn-hover-color);\n}\n\n.btn-group-lg > .btn, .btn-lg {\n --bs-btn-padding-y: .5rem;\n --bs-btn-padding-x: 1rem;\n --bs-btn-font-size: 1.25rem;\n --bs-btn-border-radius: var(--bs-border-radius-lg);\n}\n\n.btn-group-sm > .btn, .btn-sm {\n --bs-btn-padding-y: .25rem;\n --bs-btn-padding-x: .5rem;\n --bs-btn-font-size: .875rem;\n --bs-btn-border-radius: var(--bs-border-radius-sm);\n}\n\n.fade {\n transition: opacity .15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n height: 0;\n transition: height .35s;\n overflow: hidden;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n\n.collapsing.collapse-horizontal {\n width: 0;\n height: auto;\n transition: width .35s;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .collapsing.collapse-horizontal {\n transition: none;\n }\n}\n\n.dropdown, .dropdown-center, .dropend, .dropstart, .dropup, .dropup-center {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n\n.dropdown-toggle:after {\n vertical-align: .255em;\n content: \"\";\n border: .3em solid #0000;\n border-top-color: currentColor;\n border-bottom: 0;\n margin-left: .255em;\n display: inline-block;\n}\n\n.dropdown-toggle:empty:after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n --bs-dropdown-zindex: 1000;\n --bs-dropdown-min-width: 10rem;\n --bs-dropdown-padding-x: 0;\n --bs-dropdown-padding-y: .5rem;\n --bs-dropdown-spacer: .125rem;\n --bs-dropdown-font-size: 1rem;\n --bs-dropdown-color: var(--bs-body-color);\n --bs-dropdown-bg: var(--bs-body-bg);\n --bs-dropdown-border-color: var(--bs-border-color-translucent);\n --bs-dropdown-border-radius: var(--bs-border-radius);\n --bs-dropdown-border-width: var(--bs-border-width);\n --bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width));\n --bs-dropdown-divider-bg: var(--bs-border-color-translucent);\n --bs-dropdown-divider-margin-y: .5rem;\n --bs-dropdown-box-shadow: var(--bs-box-shadow);\n --bs-dropdown-link-color: var(--bs-body-color);\n --bs-dropdown-link-hover-color: var(--bs-body-color);\n --bs-dropdown-link-hover-bg: var(--bs-tertiary-bg);\n --bs-dropdown-link-active-color: #fff;\n --bs-dropdown-link-active-bg: #0d6efd;\n --bs-dropdown-link-disabled-color: var(--bs-tertiary-color);\n --bs-dropdown-item-padding-x: 1rem;\n --bs-dropdown-item-padding-y: .25rem;\n --bs-dropdown-header-color: #6c757d;\n --bs-dropdown-header-padding-x: 1rem;\n --bs-dropdown-header-padding-y: .5rem;\n z-index: var(--bs-dropdown-zindex);\n min-width: var(--bs-dropdown-min-width);\n padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);\n font-size: var(--bs-dropdown-font-size);\n color: var(--bs-dropdown-color);\n text-align: left;\n background-color: var(--bs-dropdown-bg);\n border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);\n border-radius: var(--bs-dropdown-border-radius);\n background-clip: padding-box;\n margin: 0;\n list-style: none;\n display: none;\n position: absolute;\n}\n\n.dropdown-menu[data-bs-popper] {\n margin-top: var(--bs-dropdown-spacer);\n top: 100%;\n left: 0;\n}\n\n.dropdown-menu-start {\n --bs-position: start;\n}\n\n.dropdown-menu-start[data-bs-popper] {\n left: 0;\n right: auto;\n}\n\n.dropdown-menu-end {\n --bs-position: end;\n}\n\n.dropdown-menu-end[data-bs-popper] {\n left: auto;\n right: 0;\n}\n\n@media (width >= 576px) {\n .dropdown-menu-sm-start {\n --bs-position: start;\n }\n\n .dropdown-menu-sm-start[data-bs-popper] {\n left: 0;\n right: auto;\n }\n\n .dropdown-menu-sm-end {\n --bs-position: end;\n }\n\n .dropdown-menu-sm-end[data-bs-popper] {\n left: auto;\n right: 0;\n }\n}\n\n@media (width >= 768px) {\n .dropdown-menu-md-start {\n --bs-position: start;\n }\n\n .dropdown-menu-md-start[data-bs-popper] {\n left: 0;\n right: auto;\n }\n\n .dropdown-menu-md-end {\n --bs-position: end;\n }\n\n .dropdown-menu-md-end[data-bs-popper] {\n left: auto;\n right: 0;\n }\n}\n\n@media (width >= 992px) {\n .dropdown-menu-lg-start {\n --bs-position: start;\n }\n\n .dropdown-menu-lg-start[data-bs-popper] {\n left: 0;\n right: auto;\n }\n\n .dropdown-menu-lg-end {\n --bs-position: end;\n }\n\n .dropdown-menu-lg-end[data-bs-popper] {\n left: auto;\n right: 0;\n }\n}\n\n@media (width >= 1200px) {\n .dropdown-menu-xl-start {\n --bs-position: start;\n }\n\n .dropdown-menu-xl-start[data-bs-popper] {\n left: 0;\n right: auto;\n }\n\n .dropdown-menu-xl-end {\n --bs-position: end;\n }\n\n .dropdown-menu-xl-end[data-bs-popper] {\n left: auto;\n right: 0;\n }\n}\n\n@media (width >= 1400px) {\n .dropdown-menu-xxl-start {\n --bs-position: start;\n }\n\n .dropdown-menu-xxl-start[data-bs-popper] {\n left: 0;\n right: auto;\n }\n\n .dropdown-menu-xxl-end {\n --bs-position: end;\n }\n\n .dropdown-menu-xxl-end[data-bs-popper] {\n left: auto;\n right: 0;\n }\n}\n\n.dropup .dropdown-menu[data-bs-popper] {\n margin-top: 0;\n margin-bottom: var(--bs-dropdown-spacer);\n top: auto;\n bottom: 100%;\n}\n\n.dropup .dropdown-toggle:after {\n vertical-align: .255em;\n content: \"\";\n border: .3em solid #0000;\n border-top: 0;\n border-bottom-color: currentColor;\n margin-left: .255em;\n display: inline-block;\n}\n\n.dropup .dropdown-toggle:empty:after {\n margin-left: 0;\n}\n\n.dropend .dropdown-menu[data-bs-popper] {\n margin-top: 0;\n margin-left: var(--bs-dropdown-spacer);\n top: 0;\n left: 100%;\n right: auto;\n}\n\n.dropend .dropdown-toggle:after {\n vertical-align: .255em;\n content: \"\";\n border: .3em solid #0000;\n border-left-color: currentColor;\n border-right: 0;\n margin-left: .255em;\n display: inline-block;\n}\n\n.dropend .dropdown-toggle:empty:after {\n margin-left: 0;\n}\n\n.dropend .dropdown-toggle:after {\n vertical-align: 0;\n}\n\n.dropstart .dropdown-menu[data-bs-popper] {\n margin-top: 0;\n margin-right: var(--bs-dropdown-spacer);\n top: 0;\n left: auto;\n right: 100%;\n}\n\n.dropstart .dropdown-toggle:after {\n vertical-align: .255em;\n content: \"\";\n margin-left: .255em;\n display: none;\n}\n\n.dropstart .dropdown-toggle:before {\n vertical-align: .255em;\n content: \"\";\n border-top: .3em solid #0000;\n border-bottom: .3em solid #0000;\n border-right: .3em solid;\n margin-right: .255em;\n display: inline-block;\n}\n\n.dropstart .dropdown-toggle:empty:after {\n margin-left: 0;\n}\n\n.dropstart .dropdown-toggle:before {\n vertical-align: 0;\n}\n\n.dropdown-divider {\n margin: var(--bs-dropdown-divider-margin-y) 0;\n border-top: 1px solid var(--bs-dropdown-divider-bg);\n opacity: 1;\n height: 0;\n overflow: hidden;\n}\n\n.dropdown-item {\n padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);\n clear: both;\n color: var(--bs-dropdown-link-color);\n text-align: inherit;\n white-space: nowrap;\n border-radius: var(--bs-dropdown-item-border-radius, 0);\n background-color: #0000;\n border: 0;\n width: 100%;\n font-weight: 400;\n text-decoration: none;\n display: block;\n}\n\n.dropdown-item:focus, .dropdown-item:hover {\n color: var(--bs-dropdown-link-hover-color);\n background-color: var(--bs-dropdown-link-hover-bg);\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: var(--bs-dropdown-link-active-color);\n background-color: var(--bs-dropdown-link-active-bg);\n text-decoration: none;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: var(--bs-dropdown-link-disabled-color);\n pointer-events: none;\n background-color: #0000;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);\n color: var(--bs-dropdown-header-color);\n white-space: nowrap;\n margin-bottom: 0;\n font-size: .875rem;\n display: block;\n}\n\n.dropdown-item-text {\n padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);\n color: var(--bs-dropdown-link-color);\n display: block;\n}\n\n.dropdown-menu-dark {\n --bs-dropdown-color: #dee2e6;\n --bs-dropdown-bg: #343a40;\n --bs-dropdown-border-color: var(--bs-border-color-translucent);\n --bs-dropdown-box-shadow: ;\n --bs-dropdown-link-color: #dee2e6;\n --bs-dropdown-link-hover-color: #fff;\n --bs-dropdown-divider-bg: var(--bs-border-color-translucent);\n --bs-dropdown-link-hover-bg: #ffffff26;\n --bs-dropdown-link-active-color: #fff;\n --bs-dropdown-link-active-bg: #0d6efd;\n --bs-dropdown-link-disabled-color: #adb5bd;\n --bs-dropdown-header-color: #adb5bd;\n}\n\n.btn-group, .btn-group-vertical {\n vertical-align: middle;\n display: inline-flex;\n position: relative;\n}\n\n.btn-group-vertical > .btn, .btn-group > .btn {\n flex: auto;\n position: relative;\n}\n\n.btn-group-vertical > .btn-check:checked + .btn, .btn-group-vertical > .btn-check:focus + .btn, .btn-group-vertical > .btn.active, .btn-group-vertical > .btn:active, .btn-group-vertical > .btn:focus, .btn-group-vertical > .btn:hover, .btn-group > .btn-check:checked + .btn, .btn-group > .btn-check:focus + .btn, .btn-group > .btn.active, .btn-group > .btn:active, .btn-group > .btn:focus, .btn-group > .btn:hover {\n z-index: 1;\n}\n\n.btn-toolbar {\n flex-wrap: wrap;\n justify-content: flex-start;\n display: flex;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group {\n border-radius: var(--bs-border-radius);\n}\n\n.btn-group > .btn-group:not(:first-child), .btn-group > :not(.btn-check:first-child) + .btn {\n margin-left: calc(var(--bs-border-width) * -1);\n}\n\n.btn-group > .btn-group:not(:last-child) > .btn, .btn-group > .btn.dropdown-toggle-split:first-child, .btn-group > .btn:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn-group:not(:first-child) > .btn, .btn-group > .btn:nth-child(n+3), .btn-group > :not(.btn-check) + .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n padding-left: .5625rem;\n padding-right: .5625rem;\n}\n\n.dropdown-toggle-split:after, .dropend .dropdown-toggle-split:after, .dropup .dropdown-toggle-split:after {\n margin-left: 0;\n}\n\n.dropstart .dropdown-toggle-split:before {\n margin-right: 0;\n}\n\n.btn-group-sm > .btn + .dropdown-toggle-split, .btn-sm + .dropdown-toggle-split {\n padding-left: .375rem;\n padding-right: .375rem;\n}\n\n.btn-group-lg > .btn + .dropdown-toggle-split, .btn-lg + .dropdown-toggle-split {\n padding-left: .75rem;\n padding-right: .75rem;\n}\n\n.btn-group-vertical {\n flex-direction: column;\n justify-content: center;\n align-items: flex-start;\n}\n\n.btn-group-vertical > .btn, .btn-group-vertical > .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child), .btn-group-vertical > .btn:not(:first-child) {\n margin-top: calc(var(--bs-border-width) * -1);\n}\n\n.btn-group-vertical > .btn-group:not(:last-child) > .btn, .btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child) > .btn, .btn-group-vertical > .btn ~ .btn {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav {\n --bs-nav-link-padding-x: 1rem;\n --bs-nav-link-padding-y: .5rem;\n --bs-nav-link-font-weight: ;\n --bs-nav-link-color: var(--bs-link-color);\n --bs-nav-link-hover-color: var(--bs-link-hover-color);\n --bs-nav-link-disabled-color: var(--bs-secondary-color);\n flex-wrap: wrap;\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n display: flex;\n}\n\n.nav-link {\n padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);\n font-size: var(--bs-nav-link-font-size);\n font-weight: var(--bs-nav-link-font-weight);\n color: var(--bs-nav-link-color);\n background: none;\n border: 0;\n text-decoration: none;\n transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out;\n display: block;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .nav-link {\n transition: none;\n }\n}\n\n.nav-link:focus, .nav-link:hover {\n color: var(--bs-nav-link-hover-color);\n}\n\n.nav-link:focus-visible {\n outline: 0;\n box-shadow: 0 0 0 .25rem #0d6efd40;\n}\n\n.nav-link.disabled, .nav-link:disabled {\n color: var(--bs-nav-link-disabled-color);\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n --bs-nav-tabs-border-width: var(--bs-border-width);\n --bs-nav-tabs-border-color: var(--bs-border-color);\n --bs-nav-tabs-border-radius: var(--bs-border-radius);\n --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);\n --bs-nav-tabs-link-active-color: var(--bs-emphasis-color);\n --bs-nav-tabs-link-active-bg: var(--bs-body-bg);\n --bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);\n border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color);\n}\n\n.nav-tabs .nav-link {\n margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width));\n border: var(--bs-nav-tabs-border-width) solid transparent;\n border-top-left-radius: var(--bs-nav-tabs-border-radius);\n border-top-right-radius: var(--bs-nav-tabs-border-radius);\n}\n\n.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover {\n isolation: isolate;\n border-color: var(--bs-nav-tabs-link-hover-border-color);\n}\n\n.nav-tabs .nav-item.show .nav-link, .nav-tabs .nav-link.active {\n color: var(--bs-nav-tabs-link-active-color);\n background-color: var(--bs-nav-tabs-link-active-bg);\n border-color: var(--bs-nav-tabs-link-active-border-color);\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: calc(-1 * var(--bs-nav-tabs-border-width));\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills {\n --bs-nav-pills-border-radius: var(--bs-border-radius);\n --bs-nav-pills-link-active-color: #fff;\n --bs-nav-pills-link-active-bg: #0d6efd;\n}\n\n.nav-pills .nav-link {\n border-radius: var(--bs-nav-pills-border-radius);\n}\n\n.nav-pills .nav-link.active, .nav-pills .show > .nav-link {\n color: var(--bs-nav-pills-link-active-color);\n background-color: var(--bs-nav-pills-link-active-bg);\n}\n\n.nav-underline {\n --bs-nav-underline-gap: 1rem;\n --bs-nav-underline-border-width: .125rem;\n --bs-nav-underline-link-active-color: var(--bs-emphasis-color);\n gap: var(--bs-nav-underline-gap);\n}\n\n.nav-underline .nav-link {\n border-bottom: var(--bs-nav-underline-border-width) solid transparent;\n padding-left: 0;\n padding-right: 0;\n}\n\n.nav-underline .nav-link:focus, .nav-underline .nav-link:hover {\n border-bottom-color: currentColor;\n}\n\n.nav-underline .nav-link.active, .nav-underline .show > .nav-link {\n color: var(--bs-nav-underline-link-active-color);\n border-bottom-color: currentColor;\n font-weight: 700;\n}\n\n.nav-fill .nav-item, .nav-fill > .nav-link {\n text-align: center;\n flex: auto;\n}\n\n.nav-justified .nav-item, .nav-justified > .nav-link {\n text-align: center;\n flex-grow: 1;\n flex-basis: 0;\n}\n\n.nav-fill .nav-item .nav-link, .nav-justified .nav-item .nav-link {\n width: 100%;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n --bs-navbar-padding-x: 0;\n --bs-navbar-padding-y: .5rem;\n --bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), .65);\n --bs-navbar-hover-color: rgba(var(--bs-emphasis-color-rgb), .8);\n --bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), .3);\n --bs-navbar-active-color: rgba(var(--bs-emphasis-color-rgb), 1);\n --bs-navbar-brand-padding-y: .3125rem;\n --bs-navbar-brand-margin-end: 1rem;\n --bs-navbar-brand-font-size: 1.25rem;\n --bs-navbar-brand-color: rgba(var(--bs-emphasis-color-rgb), 1);\n --bs-navbar-brand-hover-color: rgba(var(--bs-emphasis-color-rgb), 1);\n --bs-navbar-nav-link-padding-x: .5rem;\n --bs-navbar-toggler-padding-y: .25rem;\n --bs-navbar-toggler-padding-x: .75rem;\n --bs-navbar-toggler-font-size: 1.25rem;\n --bs-navbar-toggler-icon-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n --bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), .15);\n --bs-navbar-toggler-border-radius: var(--bs-border-radius);\n --bs-navbar-toggler-focus-width: .25rem;\n --bs-navbar-toggler-transition: box-shadow .15s ease-in-out;\n padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x);\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: center;\n display: flex;\n position: relative;\n}\n\n.navbar > .container, .navbar > .container-fluid, .navbar > .container-lg, .navbar > .container-md, .navbar > .container-sm, .navbar > .container-xl, .navbar > .container-xxl {\n flex-wrap: inherit;\n justify-content: space-between;\n align-items: center;\n display: flex;\n}\n\n.navbar-brand {\n padding-top: var(--bs-navbar-brand-padding-y);\n padding-bottom: var(--bs-navbar-brand-padding-y);\n margin-right: var(--bs-navbar-brand-margin-end);\n font-size: var(--bs-navbar-brand-font-size);\n color: var(--bs-navbar-brand-color);\n white-space: nowrap;\n text-decoration: none;\n}\n\n.navbar-brand:focus, .navbar-brand:hover {\n color: var(--bs-navbar-brand-hover-color);\n}\n\n.navbar-nav {\n --bs-nav-link-padding-x: 0;\n --bs-nav-link-padding-y: .5rem;\n --bs-nav-link-font-weight: ;\n --bs-nav-link-color: var(--bs-navbar-color);\n --bs-nav-link-hover-color: var(--bs-navbar-hover-color);\n --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);\n flex-direction: column;\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n display: flex;\n}\n\n.navbar-nav .nav-link.active, .navbar-nav .nav-link.show {\n color: var(--bs-navbar-active-color);\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n}\n\n.navbar-text {\n color: var(--bs-navbar-color);\n padding-top: .5rem;\n padding-bottom: .5rem;\n}\n\n.navbar-text a, .navbar-text a:focus, .navbar-text a:hover {\n color: var(--bs-navbar-active-color);\n}\n\n.navbar-collapse {\n flex-grow: 1;\n flex-basis: 100%;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);\n font-size: var(--bs-navbar-toggler-font-size);\n color: var(--bs-navbar-color);\n border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);\n border-radius: var(--bs-navbar-toggler-border-radius);\n transition: var(--bs-navbar-toggler-transition);\n background-color: #0000;\n line-height: 1;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .navbar-toggler {\n transition: none;\n }\n}\n\n.navbar-toggler:hover {\n text-decoration: none;\n}\n\n.navbar-toggler:focus {\n box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width);\n outline: 0;\n text-decoration: none;\n}\n\n.navbar-toggler-icon {\n vertical-align: middle;\n background-image: var(--bs-navbar-toggler-icon-bg);\n background-position: center;\n background-repeat: no-repeat;\n background-size: 100%;\n width: 1.5em;\n height: 1.5em;\n display: inline-block;\n}\n\n.navbar-nav-scroll {\n max-height: var(--bs-scroll-height, 75vh);\n overflow-y: auto;\n}\n\n@media (width >= 576px) {\n .navbar-expand-sm {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n }\n\n .navbar-expand-sm .navbar-nav-scroll {\n overflow: visible;\n }\n\n .navbar-expand-sm .navbar-collapse {\n flex-basis: auto;\n display: flex !important;\n }\n\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n\n .navbar-expand-sm .offcanvas {\n z-index: auto;\n flex-grow: 1;\n transition: none;\n position: static;\n visibility: visible !important;\n background-color: #0000 !important;\n border: 0 !important;\n width: auto !important;\n height: auto !important;\n transform: none !important;\n }\n\n .navbar-expand-sm .offcanvas .offcanvas-header {\n display: none;\n }\n\n .navbar-expand-sm .offcanvas .offcanvas-body {\n flex-grow: 0;\n padding: 0;\n display: flex;\n overflow-y: visible;\n }\n}\n\n@media (width >= 768px) {\n .navbar-expand-md {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n }\n\n .navbar-expand-md .navbar-nav-scroll {\n overflow: visible;\n }\n\n .navbar-expand-md .navbar-collapse {\n flex-basis: auto;\n display: flex !important;\n }\n\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n\n .navbar-expand-md .offcanvas {\n z-index: auto;\n flex-grow: 1;\n transition: none;\n position: static;\n visibility: visible !important;\n background-color: #0000 !important;\n border: 0 !important;\n width: auto !important;\n height: auto !important;\n transform: none !important;\n }\n\n .navbar-expand-md .offcanvas .offcanvas-header {\n display: none;\n }\n\n .navbar-expand-md .offcanvas .offcanvas-body {\n flex-grow: 0;\n padding: 0;\n display: flex;\n overflow-y: visible;\n }\n}\n\n@media (width >= 992px) {\n .navbar-expand-lg {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n }\n\n .navbar-expand-lg .navbar-nav-scroll {\n overflow: visible;\n }\n\n .navbar-expand-lg .navbar-collapse {\n flex-basis: auto;\n display: flex !important;\n }\n\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n\n .navbar-expand-lg .offcanvas {\n z-index: auto;\n flex-grow: 1;\n transition: none;\n position: static;\n visibility: visible !important;\n background-color: #0000 !important;\n border: 0 !important;\n width: auto !important;\n height: auto !important;\n transform: none !important;\n }\n\n .navbar-expand-lg .offcanvas .offcanvas-header {\n display: none;\n }\n\n .navbar-expand-lg .offcanvas .offcanvas-body {\n flex-grow: 0;\n padding: 0;\n display: flex;\n overflow-y: visible;\n }\n}\n\n@media (width >= 1200px) {\n .navbar-expand-xl {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n }\n\n .navbar-expand-xl .navbar-nav-scroll {\n overflow: visible;\n }\n\n .navbar-expand-xl .navbar-collapse {\n flex-basis: auto;\n display: flex !important;\n }\n\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n\n .navbar-expand-xl .offcanvas {\n z-index: auto;\n flex-grow: 1;\n transition: none;\n position: static;\n visibility: visible !important;\n background-color: #0000 !important;\n border: 0 !important;\n width: auto !important;\n height: auto !important;\n transform: none !important;\n }\n\n .navbar-expand-xl .offcanvas .offcanvas-header {\n display: none;\n }\n\n .navbar-expand-xl .offcanvas .offcanvas-body {\n flex-grow: 0;\n padding: 0;\n display: flex;\n overflow-y: visible;\n }\n}\n\n@media (width >= 1400px) {\n .navbar-expand-xxl {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n\n .navbar-expand-xxl .navbar-nav {\n flex-direction: row;\n }\n\n .navbar-expand-xxl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n\n .navbar-expand-xxl .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n }\n\n .navbar-expand-xxl .navbar-nav-scroll {\n overflow: visible;\n }\n\n .navbar-expand-xxl .navbar-collapse {\n flex-basis: auto;\n display: flex !important;\n }\n\n .navbar-expand-xxl .navbar-toggler {\n display: none;\n }\n\n .navbar-expand-xxl .offcanvas {\n z-index: auto;\n flex-grow: 1;\n transition: none;\n position: static;\n visibility: visible !important;\n background-color: #0000 !important;\n border: 0 !important;\n width: auto !important;\n height: auto !important;\n transform: none !important;\n }\n\n .navbar-expand-xxl .offcanvas .offcanvas-header {\n display: none;\n }\n\n .navbar-expand-xxl .offcanvas .offcanvas-body {\n flex-grow: 0;\n padding: 0;\n display: flex;\n overflow-y: visible;\n }\n}\n\n.navbar-expand {\n flex-wrap: nowrap;\n justify-content: flex-start;\n}\n\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n}\n\n.navbar-expand .navbar-nav-scroll {\n overflow: visible;\n}\n\n.navbar-expand .navbar-collapse {\n flex-basis: auto;\n display: flex !important;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-expand .offcanvas {\n z-index: auto;\n flex-grow: 1;\n transition: none;\n position: static;\n visibility: visible !important;\n background-color: #0000 !important;\n border: 0 !important;\n width: auto !important;\n height: auto !important;\n transform: none !important;\n}\n\n.navbar-expand .offcanvas .offcanvas-header {\n display: none;\n}\n\n.navbar-expand .offcanvas .offcanvas-body {\n flex-grow: 0;\n padding: 0;\n display: flex;\n overflow-y: visible;\n}\n\n.navbar-dark, .navbar[data-bs-theme=\"dark\"] {\n --bs-navbar-color: #ffffff8c;\n --bs-navbar-hover-color: #ffffffbf;\n --bs-navbar-disabled-color: #ffffff40;\n --bs-navbar-active-color: #fff;\n --bs-navbar-brand-color: #fff;\n --bs-navbar-brand-hover-color: #fff;\n --bs-navbar-toggler-border-color: #ffffff1a;\n --bs-navbar-toggler-icon-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n[data-bs-theme=\"dark\"] .navbar-toggler-icon {\n --bs-navbar-toggler-icon-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.card {\n --bs-card-spacer-y: 1rem;\n --bs-card-spacer-x: 1rem;\n --bs-card-title-spacer-y: .5rem;\n --bs-card-title-color: ;\n --bs-card-subtitle-color: ;\n --bs-card-border-width: var(--bs-border-width);\n --bs-card-border-color: var(--bs-border-color-translucent);\n --bs-card-border-radius: var(--bs-border-radius);\n --bs-card-box-shadow: ;\n --bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));\n --bs-card-cap-padding-y: .5rem;\n --bs-card-cap-padding-x: 1rem;\n --bs-card-cap-bg: rgba(var(--bs-body-color-rgb), .03);\n --bs-card-cap-color: ;\n --bs-card-height: ;\n --bs-card-color: ;\n --bs-card-bg: var(--bs-body-bg);\n --bs-card-img-overlay-padding: 1rem;\n --bs-card-group-margin: .75rem;\n height: var(--bs-card-height);\n color: var(--bs-body-color);\n word-wrap: break-word;\n background-color: var(--bs-card-bg);\n border: var(--bs-card-border-width) solid var(--bs-card-border-color);\n border-radius: var(--bs-card-border-radius);\n background-clip: border-box;\n flex-direction: column;\n min-width: 0;\n display: flex;\n position: relative;\n}\n\n.card > hr {\n margin-left: 0;\n margin-right: 0;\n}\n\n.card > .list-group {\n border-top: inherit;\n border-bottom: inherit;\n}\n\n.card > .list-group:first-child {\n border-top-left-radius: var(--bs-card-inner-border-radius);\n border-top-right-radius: var(--bs-card-inner-border-radius);\n border-top-width: 0;\n}\n\n.card > .list-group:last-child {\n border-bottom-right-radius: var(--bs-card-inner-border-radius);\n border-bottom-left-radius: var(--bs-card-inner-border-radius);\n border-bottom-width: 0;\n}\n\n.card > .card-header + .list-group, .card > .list-group + .card-footer {\n border-top: 0;\n}\n\n.card-body {\n padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x);\n color: var(--bs-card-color);\n flex: auto;\n}\n\n.card-title {\n margin-bottom: var(--bs-card-title-spacer-y);\n color: var(--bs-card-title-color);\n}\n\n.card-subtitle {\n margin-top: calc(-.5 * var(--bs-card-title-spacer-y));\n color: var(--bs-card-subtitle-color);\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link + .card-link {\n margin-left: var(--bs-card-spacer-x);\n}\n\n.card-header {\n padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);\n color: var(--bs-card-cap-color);\n background-color: var(--bs-card-cap-bg);\n border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color);\n margin-bottom: 0;\n}\n\n.card-header:first-child {\n border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0;\n}\n\n.card-footer {\n padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);\n color: var(--bs-card-cap-color);\n background-color: var(--bs-card-cap-bg);\n border-top: var(--bs-card-border-width) solid var(--bs-card-border-color);\n}\n\n.card-footer:last-child {\n border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius);\n}\n\n.card-header-tabs {\n margin-right: calc(-.5 * var(--bs-card-cap-padding-x));\n margin-bottom: calc(-1 * var(--bs-card-cap-padding-y));\n margin-left: calc(-.5 * var(--bs-card-cap-padding-x));\n border-bottom: 0;\n}\n\n.card-header-tabs .nav-link.active {\n background-color: var(--bs-card-bg);\n border-bottom-color: var(--bs-card-bg);\n}\n\n.card-header-pills {\n margin-right: calc(-.5 * var(--bs-card-cap-padding-x));\n margin-left: calc(-.5 * var(--bs-card-cap-padding-x));\n}\n\n.card-img-overlay {\n padding: var(--bs-card-img-overlay-padding);\n border-radius: var(--bs-card-inner-border-radius);\n position: absolute;\n inset: 0;\n}\n\n.card-img, .card-img-bottom, .card-img-top {\n width: 100%;\n}\n\n.card-img, .card-img-top {\n border-top-left-radius: var(--bs-card-inner-border-radius);\n border-top-right-radius: var(--bs-card-inner-border-radius);\n}\n\n.card-img, .card-img-bottom {\n border-bottom-right-radius: var(--bs-card-inner-border-radius);\n border-bottom-left-radius: var(--bs-card-inner-border-radius);\n}\n\n.card-group > .card {\n margin-bottom: var(--bs-card-group-margin);\n}\n\n@media (width >= 576px) {\n .card-group {\n flex-flow: wrap;\n display: flex;\n }\n\n .card-group > .card {\n flex: 1 0;\n margin-bottom: 0;\n }\n\n .card-group > .card + .card {\n border-left: 0;\n margin-left: 0;\n }\n\n .card-group > .card:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n .card-group > .card:not(:last-child) .card-header, .card-group > .card:not(:last-child) .card-img-top {\n border-top-right-radius: 0;\n }\n\n .card-group > .card:not(:last-child) .card-footer, .card-group > .card:not(:last-child) .card-img-bottom {\n border-bottom-right-radius: 0;\n }\n\n .card-group > .card:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n\n .card-group > .card:not(:first-child) .card-header, .card-group > .card:not(:first-child) .card-img-top {\n border-top-left-radius: 0;\n }\n\n .card-group > .card:not(:first-child) .card-footer, .card-group > .card:not(:first-child) .card-img-bottom {\n border-bottom-left-radius: 0;\n }\n}\n\n.accordion {\n --bs-accordion-color: var(--bs-body-color);\n --bs-accordion-bg: var(--bs-body-bg);\n --bs-accordion-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, border-radius .15s ease;\n --bs-accordion-border-color: var(--bs-border-color);\n --bs-accordion-border-width: var(--bs-border-width);\n --bs-accordion-border-radius: var(--bs-border-radius);\n --bs-accordion-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));\n --bs-accordion-btn-padding-x: 1.25rem;\n --bs-accordion-btn-padding-y: 1rem;\n --bs-accordion-btn-color: var(--bs-body-color);\n --bs-accordion-btn-bg: var(--bs-accordion-bg);\n --bs-accordion-btn-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e\");\n --bs-accordion-btn-icon-width: 1.25rem;\n --bs-accordion-btn-icon-transform: rotate(-180deg);\n --bs-accordion-btn-icon-transition: transform .2s ease-in-out;\n --bs-accordion-btn-active-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23052c65' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e\");\n --bs-accordion-btn-focus-box-shadow: 0 0 0 .25rem #0d6efd40;\n --bs-accordion-body-padding-x: 1.25rem;\n --bs-accordion-body-padding-y: 1rem;\n --bs-accordion-active-color: var(--bs-primary-text-emphasis);\n --bs-accordion-active-bg: var(--bs-primary-bg-subtle);\n}\n\n.accordion-button {\n padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);\n color: var(--bs-accordion-btn-color);\n text-align: left;\n background-color: var(--bs-accordion-btn-bg);\n overflow-anchor: none;\n transition: var(--bs-accordion-transition);\n border: 0;\n border-radius: 0;\n align-items: center;\n width: 100%;\n font-size: 1rem;\n display: flex;\n position: relative;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .accordion-button {\n transition: none;\n }\n}\n\n.accordion-button:not(.collapsed) {\n color: var(--bs-accordion-active-color);\n background-color: var(--bs-accordion-active-bg);\n box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color);\n}\n\n.accordion-button:not(.collapsed):after {\n background-image: var(--bs-accordion-btn-active-icon);\n transform: var(--bs-accordion-btn-icon-transform);\n}\n\n.accordion-button:after {\n width: var(--bs-accordion-btn-icon-width);\n height: var(--bs-accordion-btn-icon-width);\n content: \"\";\n background-image: var(--bs-accordion-btn-icon);\n background-repeat: no-repeat;\n background-size: var(--bs-accordion-btn-icon-width);\n transition: var(--bs-accordion-btn-icon-transition);\n flex-shrink: 0;\n margin-left: auto;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .accordion-button:after {\n transition: none;\n }\n}\n\n.accordion-button:hover {\n z-index: 2;\n}\n\n.accordion-button:focus {\n z-index: 3;\n box-shadow: var(--bs-accordion-btn-focus-box-shadow);\n outline: 0;\n}\n\n.accordion-header {\n margin-bottom: 0;\n}\n\n.accordion-item {\n color: var(--bs-accordion-color);\n background-color: var(--bs-accordion-bg);\n border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color);\n}\n\n.accordion-item:first-of-type {\n border-top-left-radius: var(--bs-accordion-border-radius);\n border-top-right-radius: var(--bs-accordion-border-radius);\n}\n\n.accordion-item:first-of-type > .accordion-header .accordion-button {\n border-top-left-radius: var(--bs-accordion-inner-border-radius);\n border-top-right-radius: var(--bs-accordion-inner-border-radius);\n}\n\n.accordion-item:not(:first-of-type) {\n border-top: 0;\n}\n\n.accordion-item:last-of-type {\n border-bottom-right-radius: var(--bs-accordion-border-radius);\n border-bottom-left-radius: var(--bs-accordion-border-radius);\n}\n\n.accordion-item:last-of-type > .accordion-header .accordion-button.collapsed {\n border-bottom-right-radius: var(--bs-accordion-inner-border-radius);\n border-bottom-left-radius: var(--bs-accordion-inner-border-radius);\n}\n\n.accordion-item:last-of-type > .accordion-collapse {\n border-bottom-right-radius: var(--bs-accordion-border-radius);\n border-bottom-left-radius: var(--bs-accordion-border-radius);\n}\n\n.accordion-body {\n padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x);\n}\n\n.accordion-flush > .accordion-item {\n border-left: 0;\n border-right: 0;\n border-radius: 0;\n}\n\n.accordion-flush > .accordion-item:first-child {\n border-top: 0;\n}\n\n.accordion-flush > .accordion-item:last-child {\n border-bottom: 0;\n}\n\n.accordion-flush > .accordion-item > .accordion-header .accordion-button, .accordion-flush > .accordion-item > .accordion-header .accordion-button.collapsed, .accordion-flush > .accordion-item > .accordion-collapse {\n border-radius: 0;\n}\n\n[data-bs-theme=\"dark\"] .accordion-button:after {\n --bs-accordion-btn-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e\");\n --bs-accordion-btn-active-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e\");\n}\n\n.breadcrumb {\n --bs-breadcrumb-padding-x: 0;\n --bs-breadcrumb-padding-y: 0;\n --bs-breadcrumb-margin-bottom: 1rem;\n --bs-breadcrumb-bg: ;\n --bs-breadcrumb-border-radius: ;\n --bs-breadcrumb-divider-color: var(--bs-secondary-color);\n --bs-breadcrumb-item-padding-x: .5rem;\n --bs-breadcrumb-item-active-color: var(--bs-secondary-color);\n padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);\n margin-bottom: var(--bs-breadcrumb-margin-bottom);\n font-size: var(--bs-breadcrumb-font-size);\n background-color: var(--bs-breadcrumb-bg);\n border-radius: var(--bs-breadcrumb-border-radius);\n flex-wrap: wrap;\n list-style: none;\n display: flex;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n padding-left: var(--bs-breadcrumb-item-padding-x);\n}\n\n.breadcrumb-item + .breadcrumb-item:before {\n float: left;\n padding-right: var(--bs-breadcrumb-item-padding-x);\n color: var(--bs-breadcrumb-divider-color);\n content: var(--bs-breadcrumb-divider, \"/\");\n}\n\n.breadcrumb-item.active {\n color: var(--bs-breadcrumb-item-active-color);\n}\n\n.pagination {\n --bs-pagination-padding-x: .75rem;\n --bs-pagination-padding-y: .375rem;\n --bs-pagination-font-size: 1rem;\n --bs-pagination-color: var(--bs-link-color);\n --bs-pagination-bg: var(--bs-body-bg);\n --bs-pagination-border-width: var(--bs-border-width);\n --bs-pagination-border-color: var(--bs-border-color);\n --bs-pagination-border-radius: var(--bs-border-radius);\n --bs-pagination-hover-color: var(--bs-link-hover-color);\n --bs-pagination-hover-bg: var(--bs-tertiary-bg);\n --bs-pagination-hover-border-color: var(--bs-border-color);\n --bs-pagination-focus-color: var(--bs-link-hover-color);\n --bs-pagination-focus-bg: var(--bs-secondary-bg);\n --bs-pagination-focus-box-shadow: 0 0 0 .25rem #0d6efd40;\n --bs-pagination-active-color: #fff;\n --bs-pagination-active-bg: #0d6efd;\n --bs-pagination-active-border-color: #0d6efd;\n --bs-pagination-disabled-color: var(--bs-secondary-color);\n --bs-pagination-disabled-bg: var(--bs-secondary-bg);\n --bs-pagination-disabled-border-color: var(--bs-border-color);\n padding-left: 0;\n list-style: none;\n display: flex;\n}\n\n.page-link {\n padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);\n font-size: var(--bs-pagination-font-size);\n color: var(--bs-pagination-color);\n background-color: var(--bs-pagination-bg);\n border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);\n text-decoration: none;\n transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;\n display: block;\n position: relative;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .page-link {\n transition: none;\n }\n}\n\n.page-link:hover {\n z-index: 2;\n color: var(--bs-pagination-hover-color);\n background-color: var(--bs-pagination-hover-bg);\n border-color: var(--bs-pagination-hover-border-color);\n}\n\n.page-link:focus {\n z-index: 3;\n color: var(--bs-pagination-focus-color);\n background-color: var(--bs-pagination-focus-bg);\n box-shadow: var(--bs-pagination-focus-box-shadow);\n outline: 0;\n}\n\n.active > .page-link, .page-link.active {\n z-index: 3;\n color: var(--bs-pagination-active-color);\n background-color: var(--bs-pagination-active-bg);\n border-color: var(--bs-pagination-active-border-color);\n}\n\n.disabled > .page-link, .page-link.disabled {\n color: var(--bs-pagination-disabled-color);\n pointer-events: none;\n background-color: var(--bs-pagination-disabled-bg);\n border-color: var(--bs-pagination-disabled-border-color);\n}\n\n.page-item:not(:first-child) .page-link {\n margin-left: calc(var(--bs-border-width) * -1);\n}\n\n.page-item:first-child .page-link {\n border-top-left-radius: var(--bs-pagination-border-radius);\n border-bottom-left-radius: var(--bs-pagination-border-radius);\n}\n\n.page-item:last-child .page-link {\n border-top-right-radius: var(--bs-pagination-border-radius);\n border-bottom-right-radius: var(--bs-pagination-border-radius);\n}\n\n.pagination-lg {\n --bs-pagination-padding-x: 1.5rem;\n --bs-pagination-padding-y: .75rem;\n --bs-pagination-font-size: 1.25rem;\n --bs-pagination-border-radius: var(--bs-border-radius-lg);\n}\n\n.pagination-sm {\n --bs-pagination-padding-x: .5rem;\n --bs-pagination-padding-y: .25rem;\n --bs-pagination-font-size: .875rem;\n --bs-pagination-border-radius: var(--bs-border-radius-sm);\n}\n\n.badge {\n --bs-badge-padding-x: .65em;\n --bs-badge-padding-y: .35em;\n --bs-badge-font-size: .75em;\n --bs-badge-font-weight: 700;\n --bs-badge-color: #fff;\n --bs-badge-border-radius: var(--bs-border-radius);\n padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x);\n font-size: var(--bs-badge-font-size);\n font-weight: var(--bs-badge-font-weight);\n color: var(--bs-badge-color);\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: var(--bs-badge-border-radius);\n line-height: 1;\n display: inline-block;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.alert {\n --bs-alert-bg: transparent;\n --bs-alert-padding-x: 1rem;\n --bs-alert-padding-y: 1rem;\n --bs-alert-margin-bottom: 1rem;\n --bs-alert-color: inherit;\n --bs-alert-border-color: transparent;\n --bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color);\n --bs-alert-border-radius: var(--bs-border-radius);\n --bs-alert-link-color: inherit;\n padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x);\n margin-bottom: var(--bs-alert-margin-bottom);\n color: var(--bs-alert-color);\n background-color: var(--bs-alert-bg);\n border: var(--bs-alert-border);\n border-radius: var(--bs-alert-border-radius);\n position: relative;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n color: var(--bs-alert-link-color);\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 3rem;\n}\n\n.alert-dismissible .btn-close {\n z-index: 2;\n padding: 1.25rem 1rem;\n position: absolute;\n top: 0;\n right: 0;\n}\n\n.alert-primary {\n --bs-alert-color: var(--bs-primary-text-emphasis);\n --bs-alert-bg: var(--bs-primary-bg-subtle);\n --bs-alert-border-color: var(--bs-primary-border-subtle);\n --bs-alert-link-color: var(--bs-primary-text-emphasis);\n}\n\n.alert-secondary {\n --bs-alert-color: var(--bs-secondary-text-emphasis);\n --bs-alert-bg: var(--bs-secondary-bg-subtle);\n --bs-alert-border-color: var(--bs-secondary-border-subtle);\n --bs-alert-link-color: var(--bs-secondary-text-emphasis);\n}\n\n.alert-success {\n --bs-alert-color: var(--bs-success-text-emphasis);\n --bs-alert-bg: var(--bs-success-bg-subtle);\n --bs-alert-border-color: var(--bs-success-border-subtle);\n --bs-alert-link-color: var(--bs-success-text-emphasis);\n}\n\n.alert-info {\n --bs-alert-color: var(--bs-info-text-emphasis);\n --bs-alert-bg: var(--bs-info-bg-subtle);\n --bs-alert-border-color: var(--bs-info-border-subtle);\n --bs-alert-link-color: var(--bs-info-text-emphasis);\n}\n\n.alert-warning {\n --bs-alert-color: var(--bs-warning-text-emphasis);\n --bs-alert-bg: var(--bs-warning-bg-subtle);\n --bs-alert-border-color: var(--bs-warning-border-subtle);\n --bs-alert-link-color: var(--bs-warning-text-emphasis);\n}\n\n.alert-danger {\n --bs-alert-color: var(--bs-danger-text-emphasis);\n --bs-alert-bg: var(--bs-danger-bg-subtle);\n --bs-alert-border-color: var(--bs-danger-border-subtle);\n --bs-alert-link-color: var(--bs-danger-text-emphasis);\n}\n\n.alert-light {\n --bs-alert-color: var(--bs-light-text-emphasis);\n --bs-alert-bg: var(--bs-light-bg-subtle);\n --bs-alert-border-color: var(--bs-light-border-subtle);\n --bs-alert-link-color: var(--bs-light-text-emphasis);\n}\n\n.alert-dark {\n --bs-alert-color: var(--bs-dark-text-emphasis);\n --bs-alert-bg: var(--bs-dark-bg-subtle);\n --bs-alert-border-color: var(--bs-dark-border-subtle);\n --bs-alert-link-color: var(--bs-dark-text-emphasis);\n}\n\n@keyframes progress-bar-stripes {\n 0% {\n background-position-x: 1rem;\n }\n}\n\n.progress, .progress-stacked {\n --bs-progress-height: 1rem;\n --bs-progress-font-size: .75rem;\n --bs-progress-bg: var(--bs-secondary-bg);\n --bs-progress-border-radius: var(--bs-border-radius);\n --bs-progress-box-shadow: var(--bs-box-shadow-inset);\n --bs-progress-bar-color: #fff;\n --bs-progress-bar-bg: #0d6efd;\n --bs-progress-bar-transition: width .6s ease;\n height: var(--bs-progress-height);\n font-size: var(--bs-progress-font-size);\n background-color: var(--bs-progress-bg);\n border-radius: var(--bs-progress-border-radius);\n display: flex;\n overflow: hidden;\n}\n\n.progress-bar {\n color: var(--bs-progress-bar-color);\n text-align: center;\n white-space: nowrap;\n background-color: var(--bs-progress-bar-bg);\n transition: var(--bs-progress-bar-transition);\n flex-direction: column;\n justify-content: center;\n display: flex;\n overflow: hidden;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, #ffffff26 25%, #0000 25% 50%, #ffffff26 50% 75%, #0000 75%, #0000);\n background-size: var(--bs-progress-height) var(--bs-progress-height);\n}\n\n.progress-stacked > .progress {\n overflow: visible;\n}\n\n.progress-stacked > .progress > .progress-bar {\n width: 100%;\n}\n\n.progress-bar-animated {\n animation: 1s linear infinite progress-bar-stripes;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n animation: none;\n }\n}\n\n.list-group {\n --bs-list-group-color: var(--bs-body-color);\n --bs-list-group-bg: var(--bs-body-bg);\n --bs-list-group-border-color: var(--bs-border-color);\n --bs-list-group-border-width: var(--bs-border-width);\n --bs-list-group-border-radius: var(--bs-border-radius);\n --bs-list-group-item-padding-x: 1rem;\n --bs-list-group-item-padding-y: .5rem;\n --bs-list-group-action-color: var(--bs-secondary-color);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-tertiary-bg);\n --bs-list-group-action-active-color: var(--bs-body-color);\n --bs-list-group-action-active-bg: var(--bs-secondary-bg);\n --bs-list-group-disabled-color: var(--bs-secondary-color);\n --bs-list-group-disabled-bg: var(--bs-body-bg);\n --bs-list-group-active-color: #fff;\n --bs-list-group-active-bg: #0d6efd;\n --bs-list-group-active-border-color: #0d6efd;\n border-radius: var(--bs-list-group-border-radius);\n flex-direction: column;\n margin-bottom: 0;\n padding-left: 0;\n display: flex;\n}\n\n.list-group-numbered {\n counter-reset: section;\n list-style-type: none;\n}\n\n.list-group-numbered > .list-group-item:before {\n content: counters(section, \".\") \". \";\n counter-increment: section;\n}\n\n.list-group-item-action {\n color: var(--bs-list-group-action-color);\n text-align: inherit;\n width: 100%;\n}\n\n.list-group-item-action:focus, .list-group-item-action:hover {\n z-index: 1;\n color: var(--bs-list-group-action-hover-color);\n background-color: var(--bs-list-group-action-hover-bg);\n text-decoration: none;\n}\n\n.list-group-item-action:active {\n color: var(--bs-list-group-action-active-color);\n background-color: var(--bs-list-group-action-active-bg);\n}\n\n.list-group-item {\n padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);\n color: var(--bs-list-group-color);\n background-color: var(--bs-list-group-bg);\n border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color);\n text-decoration: none;\n display: block;\n position: relative;\n}\n\n.list-group-item:first-child {\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n\n.list-group-item:last-child {\n border-bottom-right-radius: inherit;\n border-bottom-left-radius: inherit;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: var(--bs-list-group-disabled-color);\n pointer-events: none;\n background-color: var(--bs-list-group-disabled-bg);\n}\n\n.list-group-item.active {\n z-index: 2;\n color: var(--bs-list-group-active-color);\n background-color: var(--bs-list-group-active-bg);\n border-color: var(--bs-list-group-active-border-color);\n}\n\n.list-group-item + .list-group-item {\n border-top-width: 0;\n}\n\n.list-group-item + .list-group-item.active {\n margin-top: calc(-1 * var(--bs-list-group-border-width));\n border-top-width: var(--bs-list-group-border-width);\n}\n\n.list-group-horizontal {\n flex-direction: row;\n}\n\n.list-group-horizontal > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n}\n\n.list-group-horizontal > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n}\n\n.list-group-horizontal > .list-group-item.active {\n margin-top: 0;\n}\n\n.list-group-horizontal > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n}\n\n.list-group-horizontal > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n}\n\n@media (width >= 576px) {\n .list-group-horizontal-sm {\n flex-direction: row;\n }\n\n .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n }\n\n .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n }\n\n .list-group-horizontal-sm > .list-group-item.active {\n margin-top: 0;\n }\n\n .list-group-horizontal-sm > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n }\n\n .list-group-horizontal-sm > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n }\n}\n\n@media (width >= 768px) {\n .list-group-horizontal-md {\n flex-direction: row;\n }\n\n .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n }\n\n .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n }\n\n .list-group-horizontal-md > .list-group-item.active {\n margin-top: 0;\n }\n\n .list-group-horizontal-md > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n }\n\n .list-group-horizontal-md > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n }\n}\n\n@media (width >= 992px) {\n .list-group-horizontal-lg {\n flex-direction: row;\n }\n\n .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n }\n\n .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n }\n\n .list-group-horizontal-lg > .list-group-item.active {\n margin-top: 0;\n }\n\n .list-group-horizontal-lg > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n }\n\n .list-group-horizontal-lg > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n }\n}\n\n@media (width >= 1200px) {\n .list-group-horizontal-xl {\n flex-direction: row;\n }\n\n .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n }\n\n .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n }\n\n .list-group-horizontal-xl > .list-group-item.active {\n margin-top: 0;\n }\n\n .list-group-horizontal-xl > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n }\n\n .list-group-horizontal-xl > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n }\n}\n\n@media (width >= 1400px) {\n .list-group-horizontal-xxl {\n flex-direction: row;\n }\n\n .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n }\n\n .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n }\n\n .list-group-horizontal-xxl > .list-group-item.active {\n margin-top: 0;\n }\n\n .list-group-horizontal-xxl > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n }\n\n .list-group-horizontal-xxl > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n }\n}\n\n.list-group-flush {\n border-radius: 0;\n}\n\n.list-group-flush > .list-group-item {\n border-width: 0 0 var(--bs-list-group-border-width);\n}\n\n.list-group-flush > .list-group-item:last-child {\n border-bottom-width: 0;\n}\n\n.list-group-item-primary {\n --bs-list-group-color: var(--bs-primary-text-emphasis);\n --bs-list-group-bg: var(--bs-primary-bg-subtle);\n --bs-list-group-border-color: var(--bs-primary-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-primary-border-subtle);\n --bs-list-group-active-color: var(--bs-primary-bg-subtle);\n --bs-list-group-active-bg: var(--bs-primary-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-primary-text-emphasis);\n}\n\n.list-group-item-secondary {\n --bs-list-group-color: var(--bs-secondary-text-emphasis);\n --bs-list-group-bg: var(--bs-secondary-bg-subtle);\n --bs-list-group-border-color: var(--bs-secondary-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);\n --bs-list-group-active-color: var(--bs-secondary-bg-subtle);\n --bs-list-group-active-bg: var(--bs-secondary-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-secondary-text-emphasis);\n}\n\n.list-group-item-success {\n --bs-list-group-color: var(--bs-success-text-emphasis);\n --bs-list-group-bg: var(--bs-success-bg-subtle);\n --bs-list-group-border-color: var(--bs-success-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-success-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-success-border-subtle);\n --bs-list-group-active-color: var(--bs-success-bg-subtle);\n --bs-list-group-active-bg: var(--bs-success-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-success-text-emphasis);\n}\n\n.list-group-item-info {\n --bs-list-group-color: var(--bs-info-text-emphasis);\n --bs-list-group-bg: var(--bs-info-bg-subtle);\n --bs-list-group-border-color: var(--bs-info-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-info-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-info-border-subtle);\n --bs-list-group-active-color: var(--bs-info-bg-subtle);\n --bs-list-group-active-bg: var(--bs-info-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-info-text-emphasis);\n}\n\n.list-group-item-warning {\n --bs-list-group-color: var(--bs-warning-text-emphasis);\n --bs-list-group-bg: var(--bs-warning-bg-subtle);\n --bs-list-group-border-color: var(--bs-warning-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-warning-border-subtle);\n --bs-list-group-active-color: var(--bs-warning-bg-subtle);\n --bs-list-group-active-bg: var(--bs-warning-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-warning-text-emphasis);\n}\n\n.list-group-item-danger {\n --bs-list-group-color: var(--bs-danger-text-emphasis);\n --bs-list-group-bg: var(--bs-danger-bg-subtle);\n --bs-list-group-border-color: var(--bs-danger-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-danger-border-subtle);\n --bs-list-group-active-color: var(--bs-danger-bg-subtle);\n --bs-list-group-active-bg: var(--bs-danger-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-danger-text-emphasis);\n}\n\n.list-group-item-light {\n --bs-list-group-color: var(--bs-light-text-emphasis);\n --bs-list-group-bg: var(--bs-light-bg-subtle);\n --bs-list-group-border-color: var(--bs-light-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-light-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-light-border-subtle);\n --bs-list-group-active-color: var(--bs-light-bg-subtle);\n --bs-list-group-active-bg: var(--bs-light-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-light-text-emphasis);\n}\n\n.list-group-item-dark {\n --bs-list-group-color: var(--bs-dark-text-emphasis);\n --bs-list-group-bg: var(--bs-dark-bg-subtle);\n --bs-list-group-border-color: var(--bs-dark-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-dark-border-subtle);\n --bs-list-group-active-color: var(--bs-dark-bg-subtle);\n --bs-list-group-active-bg: var(--bs-dark-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-dark-text-emphasis);\n}\n\n.btn-close {\n --bs-btn-close-color: #000;\n --bs-btn-close-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e\");\n --bs-btn-close-opacity: .5;\n --bs-btn-close-hover-opacity: .75;\n --bs-btn-close-focus-shadow: 0 0 0 .25rem #0d6efd40;\n --bs-btn-close-focus-opacity: 1;\n --bs-btn-close-disabled-opacity: .25;\n --bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);\n box-sizing: content-box;\n color: var(--bs-btn-close-color);\n background: transparent var(--bs-btn-close-bg) center / 1em auto no-repeat;\n opacity: var(--bs-btn-close-opacity);\n border: 0;\n border-radius: .375rem;\n width: 1em;\n height: 1em;\n padding: .25em;\n}\n\n.btn-close:hover {\n color: var(--bs-btn-close-color);\n opacity: var(--bs-btn-close-hover-opacity);\n text-decoration: none;\n}\n\n.btn-close:focus {\n box-shadow: var(--bs-btn-close-focus-shadow);\n opacity: var(--bs-btn-close-focus-opacity);\n outline: 0;\n}\n\n.btn-close.disabled, .btn-close:disabled {\n pointer-events: none;\n -webkit-user-select: none;\n user-select: none;\n opacity: var(--bs-btn-close-disabled-opacity);\n}\n\n.btn-close-white, [data-bs-theme=\"dark\"] .btn-close {\n filter: var(--bs-btn-close-white-filter);\n}\n\n.toast {\n --bs-toast-zindex: 1090;\n --bs-toast-padding-x: .75rem;\n --bs-toast-padding-y: .5rem;\n --bs-toast-spacing: 1.5rem;\n --bs-toast-max-width: 350px;\n --bs-toast-font-size: .875rem;\n --bs-toast-color: ;\n --bs-toast-bg: rgba(var(--bs-body-bg-rgb), .85);\n --bs-toast-border-width: var(--bs-border-width);\n --bs-toast-border-color: var(--bs-border-color-translucent);\n --bs-toast-border-radius: var(--bs-border-radius);\n --bs-toast-box-shadow: var(--bs-box-shadow);\n --bs-toast-header-color: var(--bs-secondary-color);\n --bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), .85);\n --bs-toast-header-border-color: var(--bs-border-color-translucent);\n width: var(--bs-toast-max-width);\n font-size: var(--bs-toast-font-size);\n color: var(--bs-toast-color);\n pointer-events: auto;\n background-color: var(--bs-toast-bg);\n border: var(--bs-toast-border-width) solid var(--bs-toast-border-color);\n box-shadow: var(--bs-toast-box-shadow);\n border-radius: var(--bs-toast-border-radius);\n background-clip: padding-box;\n max-width: 100%;\n}\n\n.toast.showing {\n opacity: 0;\n}\n\n.toast:not(.show) {\n display: none;\n}\n\n.toast-container {\n --bs-toast-zindex: 1090;\n z-index: var(--bs-toast-zindex);\n pointer-events: none;\n width: max-content;\n max-width: 100%;\n position: absolute;\n}\n\n.toast-container > :not(:last-child) {\n margin-bottom: var(--bs-toast-spacing);\n}\n\n.toast-header {\n padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x);\n color: var(--bs-toast-header-color);\n background-color: var(--bs-toast-header-bg);\n border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);\n border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));\n border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));\n background-clip: padding-box;\n align-items: center;\n display: flex;\n}\n\n.toast-header .btn-close {\n margin-right: calc(-.5 * var(--bs-toast-padding-x));\n margin-left: var(--bs-toast-padding-x);\n}\n\n.toast-body {\n padding: var(--bs-toast-padding-x);\n word-wrap: break-word;\n}\n\n.modal {\n --bs-modal-zindex: 1055;\n --bs-modal-width: 500px;\n --bs-modal-padding: 1rem;\n --bs-modal-margin: .5rem;\n --bs-modal-color: ;\n --bs-modal-bg: var(--bs-body-bg);\n --bs-modal-border-color: var(--bs-border-color-translucent);\n --bs-modal-border-width: var(--bs-border-width);\n --bs-modal-border-radius: var(--bs-border-radius-lg);\n --bs-modal-box-shadow: var(--bs-box-shadow-sm);\n --bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));\n --bs-modal-header-padding-x: 1rem;\n --bs-modal-header-padding-y: 1rem;\n --bs-modal-header-padding: 1rem 1rem;\n --bs-modal-header-border-color: var(--bs-border-color);\n --bs-modal-header-border-width: var(--bs-border-width);\n --bs-modal-title-line-height: 1.5;\n --bs-modal-footer-gap: .5rem;\n --bs-modal-footer-bg: ;\n --bs-modal-footer-border-color: var(--bs-border-color);\n --bs-modal-footer-border-width: var(--bs-border-width);\n z-index: var(--bs-modal-zindex);\n outline: 0;\n width: 100%;\n height: 100%;\n display: none;\n position: fixed;\n top: 0;\n left: 0;\n overflow: hidden auto;\n}\n\n.modal-dialog {\n margin: var(--bs-modal-margin);\n pointer-events: none;\n width: auto;\n position: relative;\n}\n\n.modal.fade .modal-dialog {\n transition: transform .3s ease-out;\n transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n\n.modal.show .modal-dialog {\n transform: none;\n}\n\n.modal.modal-static .modal-dialog {\n transform: scale(1.02);\n}\n\n.modal-dialog-scrollable {\n height: calc(100% - var(--bs-modal-margin) * 2);\n}\n\n.modal-dialog-scrollable .modal-content {\n max-height: 100%;\n overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n min-height: calc(100% - var(--bs-modal-margin) * 2);\n align-items: center;\n display: flex;\n}\n\n.modal-content {\n color: var(--bs-modal-color);\n pointer-events: auto;\n background-color: var(--bs-modal-bg);\n border: var(--bs-modal-border-width) solid var(--bs-modal-border-color);\n border-radius: var(--bs-modal-border-radius);\n background-clip: padding-box;\n outline: 0;\n flex-direction: column;\n width: 100%;\n display: flex;\n position: relative;\n}\n\n.modal-backdrop {\n --bs-backdrop-zindex: 1050;\n --bs-backdrop-bg: #000;\n --bs-backdrop-opacity: .5;\n z-index: var(--bs-backdrop-zindex);\n background-color: var(--bs-backdrop-bg);\n width: 100vw;\n height: 100vh;\n position: fixed;\n top: 0;\n left: 0;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: var(--bs-backdrop-opacity);\n}\n\n.modal-header {\n padding: var(--bs-modal-header-padding);\n border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);\n border-top-left-radius: var(--bs-modal-inner-border-radius);\n border-top-right-radius: var(--bs-modal-inner-border-radius);\n flex-shrink: 0;\n align-items: center;\n display: flex;\n}\n\n.modal-header .btn-close {\n padding: calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);\n margin: calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto;\n}\n\n.modal-title {\n line-height: var(--bs-modal-title-line-height);\n margin-bottom: 0;\n}\n\n.modal-body {\n padding: var(--bs-modal-padding);\n flex: auto;\n position: relative;\n}\n\n.modal-footer {\n padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);\n background-color: var(--bs-modal-footer-bg);\n border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);\n border-bottom-right-radius: var(--bs-modal-inner-border-radius);\n border-bottom-left-radius: var(--bs-modal-inner-border-radius);\n flex-wrap: wrap;\n flex-shrink: 0;\n justify-content: flex-end;\n align-items: center;\n display: flex;\n}\n\n.modal-footer > * {\n margin: calc(var(--bs-modal-footer-gap) * .5);\n}\n\n@media (width >= 576px) {\n .modal {\n --bs-modal-margin: 1.75rem;\n --bs-modal-box-shadow: var(--bs-box-shadow);\n }\n\n .modal-dialog {\n max-width: var(--bs-modal-width);\n margin-left: auto;\n margin-right: auto;\n }\n\n .modal-sm {\n --bs-modal-width: 300px;\n }\n}\n\n@media (width >= 992px) {\n .modal-lg, .modal-xl {\n --bs-modal-width: 800px;\n }\n}\n\n@media (width >= 1200px) {\n .modal-xl {\n --bs-modal-width: 1140px;\n }\n}\n\n.modal-fullscreen {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n}\n\n.modal-fullscreen .modal-content {\n border: 0;\n border-radius: 0;\n height: 100%;\n}\n\n.modal-fullscreen .modal-footer, .modal-fullscreen .modal-header {\n border-radius: 0;\n}\n\n.modal-fullscreen .modal-body {\n overflow-y: auto;\n}\n\n@media (width <= 575.98px) {\n .modal-fullscreen-sm-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n\n .modal-fullscreen-sm-down .modal-content {\n border: 0;\n border-radius: 0;\n height: 100%;\n }\n\n .modal-fullscreen-sm-down .modal-footer, .modal-fullscreen-sm-down .modal-header {\n border-radius: 0;\n }\n\n .modal-fullscreen-sm-down .modal-body {\n overflow-y: auto;\n }\n}\n\n@media (width <= 767.98px) {\n .modal-fullscreen-md-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n\n .modal-fullscreen-md-down .modal-content {\n border: 0;\n border-radius: 0;\n height: 100%;\n }\n\n .modal-fullscreen-md-down .modal-footer, .modal-fullscreen-md-down .modal-header {\n border-radius: 0;\n }\n\n .modal-fullscreen-md-down .modal-body {\n overflow-y: auto;\n }\n}\n\n@media (width <= 991.98px) {\n .modal-fullscreen-lg-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n\n .modal-fullscreen-lg-down .modal-content {\n border: 0;\n border-radius: 0;\n height: 100%;\n }\n\n .modal-fullscreen-lg-down .modal-footer, .modal-fullscreen-lg-down .modal-header {\n border-radius: 0;\n }\n\n .modal-fullscreen-lg-down .modal-body {\n overflow-y: auto;\n }\n}\n\n@media (width <= 1199.98px) {\n .modal-fullscreen-xl-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n\n .modal-fullscreen-xl-down .modal-content {\n border: 0;\n border-radius: 0;\n height: 100%;\n }\n\n .modal-fullscreen-xl-down .modal-footer, .modal-fullscreen-xl-down .modal-header {\n border-radius: 0;\n }\n\n .modal-fullscreen-xl-down .modal-body {\n overflow-y: auto;\n }\n}\n\n@media (width <= 1399.98px) {\n .modal-fullscreen-xxl-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n\n .modal-fullscreen-xxl-down .modal-content {\n border: 0;\n border-radius: 0;\n height: 100%;\n }\n\n .modal-fullscreen-xxl-down .modal-footer, .modal-fullscreen-xxl-down .modal-header {\n border-radius: 0;\n }\n\n .modal-fullscreen-xxl-down .modal-body {\n overflow-y: auto;\n }\n}\n\n.tooltip {\n --bs-tooltip-zindex: 1080;\n --bs-tooltip-max-width: 200px;\n --bs-tooltip-padding-x: .5rem;\n --bs-tooltip-padding-y: .25rem;\n --bs-tooltip-margin: ;\n --bs-tooltip-font-size: .875rem;\n --bs-tooltip-color: var(--bs-body-bg);\n --bs-tooltip-bg: var(--bs-emphasis-color);\n --bs-tooltip-border-radius: var(--bs-border-radius);\n --bs-tooltip-opacity: .9;\n --bs-tooltip-arrow-width: .8rem;\n --bs-tooltip-arrow-height: .4rem;\n z-index: var(--bs-tooltip-zindex);\n margin: var(--bs-tooltip-margin);\n font-family: var(--bs-font-sans-serif);\n text-align: left;\n text-align: start;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n white-space: normal;\n word-spacing: normal;\n line-break: auto;\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n font-size: var(--bs-tooltip-font-size);\n word-wrap: break-word;\n opacity: 0;\n text-decoration: none;\n display: block;\n}\n\n.tooltip.show {\n opacity: var(--bs-tooltip-opacity);\n}\n\n.tooltip .tooltip-arrow {\n width: var(--bs-tooltip-arrow-width);\n height: var(--bs-tooltip-arrow-height);\n display: block;\n}\n\n.tooltip .tooltip-arrow:before {\n content: \"\";\n border-style: solid;\n border-color: #0000;\n position: absolute;\n}\n\n.bs-tooltip-auto[data-popper-placement^=\"top\"] .tooltip-arrow, .bs-tooltip-top .tooltip-arrow {\n bottom: calc(-1 * var(--bs-tooltip-arrow-height));\n}\n\n.bs-tooltip-auto[data-popper-placement^=\"top\"] .tooltip-arrow:before, .bs-tooltip-top .tooltip-arrow:before {\n border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;\n border-top-color: var(--bs-tooltip-bg);\n top: -1px;\n}\n\n.bs-tooltip-auto[data-popper-placement^=\"right\"] .tooltip-arrow, .bs-tooltip-end .tooltip-arrow {\n left: calc(-1 * var(--bs-tooltip-arrow-height));\n width: var(--bs-tooltip-arrow-height);\n height: var(--bs-tooltip-arrow-width);\n}\n\n.bs-tooltip-auto[data-popper-placement^=\"right\"] .tooltip-arrow:before, .bs-tooltip-end .tooltip-arrow:before {\n border-width: calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;\n border-right-color: var(--bs-tooltip-bg);\n right: -1px;\n}\n\n.bs-tooltip-auto[data-popper-placement^=\"bottom\"] .tooltip-arrow, .bs-tooltip-bottom .tooltip-arrow {\n top: calc(-1 * var(--bs-tooltip-arrow-height));\n}\n\n.bs-tooltip-auto[data-popper-placement^=\"bottom\"] .tooltip-arrow:before, .bs-tooltip-bottom .tooltip-arrow:before {\n border-width: 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);\n border-bottom-color: var(--bs-tooltip-bg);\n bottom: -1px;\n}\n\n.bs-tooltip-auto[data-popper-placement^=\"left\"] .tooltip-arrow, .bs-tooltip-start .tooltip-arrow {\n right: calc(-1 * var(--bs-tooltip-arrow-height));\n width: var(--bs-tooltip-arrow-height);\n height: var(--bs-tooltip-arrow-width);\n}\n\n.bs-tooltip-auto[data-popper-placement^=\"left\"] .tooltip-arrow:before, .bs-tooltip-start .tooltip-arrow:before {\n border-width: calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);\n border-left-color: var(--bs-tooltip-bg);\n left: -1px;\n}\n\n.tooltip-inner {\n max-width: var(--bs-tooltip-max-width);\n padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);\n color: var(--bs-tooltip-color);\n text-align: center;\n background-color: var(--bs-tooltip-bg);\n border-radius: var(--bs-tooltip-border-radius);\n}\n\n.popover {\n --bs-popover-zindex: 1070;\n --bs-popover-max-width: 276px;\n --bs-popover-font-size: .875rem;\n --bs-popover-bg: var(--bs-body-bg);\n --bs-popover-border-width: var(--bs-border-width);\n --bs-popover-border-color: var(--bs-border-color-translucent);\n --bs-popover-border-radius: var(--bs-border-radius-lg);\n --bs-popover-inner-border-radius: calc(var(--bs-border-radius-lg) - var(--bs-border-width));\n --bs-popover-box-shadow: var(--bs-box-shadow);\n --bs-popover-header-padding-x: 1rem;\n --bs-popover-header-padding-y: .5rem;\n --bs-popover-header-font-size: 1rem;\n --bs-popover-header-color: inherit;\n --bs-popover-header-bg: var(--bs-secondary-bg);\n --bs-popover-body-padding-x: 1rem;\n --bs-popover-body-padding-y: 1rem;\n --bs-popover-body-color: var(--bs-body-color);\n --bs-popover-arrow-width: 1rem;\n --bs-popover-arrow-height: .5rem;\n --bs-popover-arrow-border: var(--bs-popover-border-color);\n z-index: var(--bs-popover-zindex);\n max-width: var(--bs-popover-max-width);\n font-family: var(--bs-font-sans-serif);\n text-align: left;\n text-align: start;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n white-space: normal;\n word-spacing: normal;\n line-break: auto;\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n font-size: var(--bs-popover-font-size);\n word-wrap: break-word;\n background-color: var(--bs-popover-bg);\n border: var(--bs-popover-border-width) solid var(--bs-popover-border-color);\n border-radius: var(--bs-popover-border-radius);\n background-clip: padding-box;\n text-decoration: none;\n display: block;\n}\n\n.popover .popover-arrow {\n width: var(--bs-popover-arrow-width);\n height: var(--bs-popover-arrow-height);\n display: block;\n}\n\n.popover .popover-arrow:after, .popover .popover-arrow:before {\n content: \"\";\n border: 0 solid #0000;\n display: block;\n position: absolute;\n}\n\n.bs-popover-auto[data-popper-placement^=\"top\"] > .popover-arrow, .bs-popover-top > .popover-arrow {\n bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n}\n\n.bs-popover-auto[data-popper-placement^=\"top\"] > .popover-arrow:after, .bs-popover-auto[data-popper-placement^=\"top\"] > .popover-arrow:before, .bs-popover-top > .popover-arrow:after, .bs-popover-top > .popover-arrow:before {\n border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0;\n}\n\n.bs-popover-auto[data-popper-placement^=\"top\"] > .popover-arrow:before, .bs-popover-top > .popover-arrow:before {\n border-top-color: var(--bs-popover-arrow-border);\n bottom: 0;\n}\n\n.bs-popover-auto[data-popper-placement^=\"top\"] > .popover-arrow:after, .bs-popover-top > .popover-arrow:after {\n bottom: var(--bs-popover-border-width);\n border-top-color: var(--bs-popover-bg);\n}\n\n.bs-popover-auto[data-popper-placement^=\"right\"] > .popover-arrow, .bs-popover-end > .popover-arrow {\n left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n width: var(--bs-popover-arrow-height);\n height: var(--bs-popover-arrow-width);\n}\n\n.bs-popover-auto[data-popper-placement^=\"right\"] > .popover-arrow:after, .bs-popover-auto[data-popper-placement^=\"right\"] > .popover-arrow:before, .bs-popover-end > .popover-arrow:after, .bs-popover-end > .popover-arrow:before {\n border-width: calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0;\n}\n\n.bs-popover-auto[data-popper-placement^=\"right\"] > .popover-arrow:before, .bs-popover-end > .popover-arrow:before {\n border-right-color: var(--bs-popover-arrow-border);\n left: 0;\n}\n\n.bs-popover-auto[data-popper-placement^=\"right\"] > .popover-arrow:after, .bs-popover-end > .popover-arrow:after {\n left: var(--bs-popover-border-width);\n border-right-color: var(--bs-popover-bg);\n}\n\n.bs-popover-auto[data-popper-placement^=\"bottom\"] > .popover-arrow, .bs-popover-bottom > .popover-arrow {\n top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n}\n\n.bs-popover-auto[data-popper-placement^=\"bottom\"] > .popover-arrow:after, .bs-popover-auto[data-popper-placement^=\"bottom\"] > .popover-arrow:before, .bs-popover-bottom > .popover-arrow:after, .bs-popover-bottom > .popover-arrow:before {\n border-width: 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height);\n}\n\n.bs-popover-auto[data-popper-placement^=\"bottom\"] > .popover-arrow:before, .bs-popover-bottom > .popover-arrow:before {\n border-bottom-color: var(--bs-popover-arrow-border);\n top: 0;\n}\n\n.bs-popover-auto[data-popper-placement^=\"bottom\"] > .popover-arrow:after, .bs-popover-bottom > .popover-arrow:after {\n top: var(--bs-popover-border-width);\n border-bottom-color: var(--bs-popover-bg);\n}\n\n.bs-popover-auto[data-popper-placement^=\"bottom\"] .popover-header:before, .bs-popover-bottom .popover-header:before {\n width: var(--bs-popover-arrow-width);\n margin-left: calc(-.5 * var(--bs-popover-arrow-width));\n content: \"\";\n border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg);\n display: block;\n position: absolute;\n top: 0;\n left: 50%;\n}\n\n.bs-popover-auto[data-popper-placement^=\"left\"] > .popover-arrow, .bs-popover-start > .popover-arrow {\n right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n width: var(--bs-popover-arrow-height);\n height: var(--bs-popover-arrow-width);\n}\n\n.bs-popover-auto[data-popper-placement^=\"left\"] > .popover-arrow:after, .bs-popover-auto[data-popper-placement^=\"left\"] > .popover-arrow:before, .bs-popover-start > .popover-arrow:after, .bs-popover-start > .popover-arrow:before {\n border-width: calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height);\n}\n\n.bs-popover-auto[data-popper-placement^=\"left\"] > .popover-arrow:before, .bs-popover-start > .popover-arrow:before {\n border-left-color: var(--bs-popover-arrow-border);\n right: 0;\n}\n\n.bs-popover-auto[data-popper-placement^=\"left\"] > .popover-arrow:after, .bs-popover-start > .popover-arrow:after {\n right: var(--bs-popover-border-width);\n border-left-color: var(--bs-popover-bg);\n}\n\n.popover-header {\n padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);\n font-size: var(--bs-popover-header-font-size);\n color: var(--bs-popover-header-color);\n background-color: var(--bs-popover-header-bg);\n border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color);\n border-top-left-radius: var(--bs-popover-inner-border-radius);\n border-top-right-radius: var(--bs-popover-inner-border-radius);\n margin-bottom: 0;\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);\n color: var(--bs-popover-body-color);\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n width: 100%;\n position: relative;\n overflow: hidden;\n}\n\n.carousel-inner:after {\n clear: both;\n content: \"\";\n display: block;\n}\n\n.carousel-item {\n float: left;\n backface-visibility: hidden;\n width: 100%;\n margin-right: -100%;\n transition: transform .6s ease-in-out;\n display: none;\n position: relative;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item-next, .carousel-item-prev, .carousel-item.active {\n display: block;\n}\n\n.active.carousel-item-end, .carousel-item-next:not(.carousel-item-start) {\n transform: translateX(100%);\n}\n\n.active.carousel-item-start, .carousel-item-prev:not(.carousel-item-end) {\n transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n}\n\n.carousel-fade .carousel-item-next.carousel-item-start, .carousel-fade .carousel-item-prev.carousel-item-end, .carousel-fade .carousel-item.active {\n z-index: 1;\n opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-end, .carousel-fade .active.carousel-item-start {\n z-index: 0;\n opacity: 0;\n transition: opacity 0s .6s;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-end, .carousel-fade .active.carousel-item-start {\n transition: none;\n }\n}\n\n.carousel-control-next, .carousel-control-prev {\n z-index: 1;\n color: #fff;\n text-align: center;\n opacity: .5;\n background: none;\n border: 0;\n justify-content: center;\n align-items: center;\n width: 15%;\n padding: 0;\n transition: opacity .15s;\n display: flex;\n position: absolute;\n top: 0;\n bottom: 0;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-next, .carousel-control-prev {\n transition: none;\n }\n}\n\n.carousel-control-next:focus, .carousel-control-next:hover, .carousel-control-prev:focus, .carousel-control-prev:hover {\n color: #fff;\n opacity: .9;\n outline: 0;\n text-decoration: none;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-next-icon, .carousel-control-prev-icon {\n background-position: 50%;\n background-repeat: no-repeat;\n background-size: 100% 100%;\n width: 2rem;\n height: 2rem;\n display: inline-block;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n z-index: 2;\n justify-content: center;\n margin-bottom: 1rem;\n margin-left: 15%;\n margin-right: 15%;\n padding: 0;\n display: flex;\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n}\n\n.carousel-indicators [data-bs-target] {\n box-sizing: content-box;\n text-indent: -999px;\n cursor: pointer;\n opacity: .5;\n background-color: #fff;\n background-clip: padding-box;\n border: 10px solid #0000;\n border-left: 0;\n border-right: 0;\n flex: 0 auto;\n width: 30px;\n height: 3px;\n margin-left: 3px;\n margin-right: 3px;\n padding: 0;\n transition: opacity .6s;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators [data-bs-target] {\n transition: none;\n }\n}\n\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n color: #fff;\n text-align: center;\n padding-top: 1.25rem;\n padding-bottom: 1.25rem;\n position: absolute;\n bottom: 1.25rem;\n left: 15%;\n right: 15%;\n}\n\n.carousel-dark .carousel-control-next-icon, .carousel-dark .carousel-control-prev-icon {\n filter: invert() grayscale(100);\n}\n\n.carousel-dark .carousel-indicators [data-bs-target] {\n background-color: #000;\n}\n\n.carousel-dark .carousel-caption {\n color: #000;\n}\n\n[data-bs-theme=\"dark\"] .carousel .carousel-control-next-icon, [data-bs-theme=\"dark\"] .carousel .carousel-control-prev-icon, [data-bs-theme=\"dark\"].carousel .carousel-control-next-icon, [data-bs-theme=\"dark\"].carousel .carousel-control-prev-icon {\n filter: invert() grayscale(100);\n}\n\n[data-bs-theme=\"dark\"] .carousel .carousel-indicators [data-bs-target], [data-bs-theme=\"dark\"].carousel .carousel-indicators [data-bs-target] {\n background-color: #000;\n}\n\n[data-bs-theme=\"dark\"] .carousel .carousel-caption, [data-bs-theme=\"dark\"].carousel .carousel-caption {\n color: #000;\n}\n\n.spinner-border, .spinner-grow {\n width: var(--bs-spinner-width);\n height: var(--bs-spinner-height);\n vertical-align: var(--bs-spinner-vertical-align);\n animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);\n border-radius: 50%;\n display: inline-block;\n}\n\n@keyframes spinner-border {\n to {\n transform: rotate(360deg);\n }\n}\n\n.spinner-border {\n --bs-spinner-width: 2rem;\n --bs-spinner-height: 2rem;\n --bs-spinner-vertical-align: -.125em;\n --bs-spinner-border-width: .25em;\n --bs-spinner-animation-speed: .75s;\n --bs-spinner-animation-name: spinner-border;\n border: var(--bs-spinner-border-width) solid currentcolor;\n border-right-color: #0000;\n}\n\n.spinner-border-sm {\n --bs-spinner-width: 1rem;\n --bs-spinner-height: 1rem;\n --bs-spinner-border-width: .2em;\n}\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n\n 50% {\n opacity: 1;\n transform: none;\n }\n}\n\n.spinner-grow {\n --bs-spinner-width: 2rem;\n --bs-spinner-height: 2rem;\n --bs-spinner-vertical-align: -.125em;\n --bs-spinner-animation-speed: .75s;\n --bs-spinner-animation-name: spinner-grow;\n opacity: 0;\n background-color: currentColor;\n}\n\n.spinner-grow-sm {\n --bs-spinner-width: 1rem;\n --bs-spinner-height: 1rem;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .spinner-border, .spinner-grow {\n --bs-spinner-animation-speed: 1.5s;\n }\n}\n\n.offcanvas, .offcanvas-lg, .offcanvas-md, .offcanvas-sm, .offcanvas-xl, .offcanvas-xxl {\n --bs-offcanvas-zindex: 1045;\n --bs-offcanvas-width: 400px;\n --bs-offcanvas-height: 30vh;\n --bs-offcanvas-padding-x: 1rem;\n --bs-offcanvas-padding-y: 1rem;\n --bs-offcanvas-color: var(--bs-body-color);\n --bs-offcanvas-bg: var(--bs-body-bg);\n --bs-offcanvas-border-width: var(--bs-border-width);\n --bs-offcanvas-border-color: var(--bs-border-color-translucent);\n --bs-offcanvas-box-shadow: var(--bs-box-shadow-sm);\n --bs-offcanvas-transition: transform .3s ease-in-out;\n --bs-offcanvas-title-line-height: 1.5;\n}\n\n@media (width <= 575.98px) {\n .offcanvas-sm {\n z-index: var(--bs-offcanvas-zindex);\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n transition: var(--bs-offcanvas-transition);\n background-clip: padding-box;\n outline: 0;\n flex-direction: column;\n max-width: 100%;\n display: flex;\n position: fixed;\n bottom: 0;\n }\n}\n\n@media (width <= 575.98px) and (prefers-reduced-motion: reduce) {\n .offcanvas-sm {\n transition: none;\n }\n}\n\n@media (width <= 575.98px) {\n .offcanvas-sm.offcanvas-start {\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n top: 0;\n left: 0;\n transform: translateX(-100%);\n }\n\n .offcanvas-sm.offcanvas-end {\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n top: 0;\n right: 0;\n transform: translateX(100%);\n }\n\n .offcanvas-sm.offcanvas-top {\n height: var(--bs-offcanvas-height);\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n max-height: 100%;\n top: 0;\n left: 0;\n right: 0;\n transform: translateY(-100%);\n }\n\n .offcanvas-sm.offcanvas-bottom {\n height: var(--bs-offcanvas-height);\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n max-height: 100%;\n left: 0;\n right: 0;\n transform: translateY(100%);\n }\n\n .offcanvas-sm.show:not(.hiding), .offcanvas-sm.showing {\n transform: none;\n }\n\n .offcanvas-sm.hiding, .offcanvas-sm.show, .offcanvas-sm.showing {\n visibility: visible;\n }\n}\n\n@media (width >= 576px) {\n .offcanvas-sm {\n --bs-offcanvas-height: auto;\n --bs-offcanvas-border-width: 0;\n background-color: #0000 !important;\n }\n\n .offcanvas-sm .offcanvas-header {\n display: none;\n }\n\n .offcanvas-sm .offcanvas-body {\n flex-grow: 0;\n padding: 0;\n display: flex;\n overflow-y: visible;\n background-color: #0000 !important;\n }\n}\n\n@media (width <= 767.98px) {\n .offcanvas-md {\n z-index: var(--bs-offcanvas-zindex);\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n transition: var(--bs-offcanvas-transition);\n background-clip: padding-box;\n outline: 0;\n flex-direction: column;\n max-width: 100%;\n display: flex;\n position: fixed;\n bottom: 0;\n }\n}\n\n@media (width <= 767.98px) and (prefers-reduced-motion: reduce) {\n .offcanvas-md {\n transition: none;\n }\n}\n\n@media (width <= 767.98px) {\n .offcanvas-md.offcanvas-start {\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n top: 0;\n left: 0;\n transform: translateX(-100%);\n }\n\n .offcanvas-md.offcanvas-end {\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n top: 0;\n right: 0;\n transform: translateX(100%);\n }\n\n .offcanvas-md.offcanvas-top {\n height: var(--bs-offcanvas-height);\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n max-height: 100%;\n top: 0;\n left: 0;\n right: 0;\n transform: translateY(-100%);\n }\n\n .offcanvas-md.offcanvas-bottom {\n height: var(--bs-offcanvas-height);\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n max-height: 100%;\n left: 0;\n right: 0;\n transform: translateY(100%);\n }\n\n .offcanvas-md.show:not(.hiding), .offcanvas-md.showing {\n transform: none;\n }\n\n .offcanvas-md.hiding, .offcanvas-md.show, .offcanvas-md.showing {\n visibility: visible;\n }\n}\n\n@media (width >= 768px) {\n .offcanvas-md {\n --bs-offcanvas-height: auto;\n --bs-offcanvas-border-width: 0;\n background-color: #0000 !important;\n }\n\n .offcanvas-md .offcanvas-header {\n display: none;\n }\n\n .offcanvas-md .offcanvas-body {\n flex-grow: 0;\n padding: 0;\n display: flex;\n overflow-y: visible;\n background-color: #0000 !important;\n }\n}\n\n@media (width <= 991.98px) {\n .offcanvas-lg {\n z-index: var(--bs-offcanvas-zindex);\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n transition: var(--bs-offcanvas-transition);\n background-clip: padding-box;\n outline: 0;\n flex-direction: column;\n max-width: 100%;\n display: flex;\n position: fixed;\n bottom: 0;\n }\n}\n\n@media (width <= 991.98px) and (prefers-reduced-motion: reduce) {\n .offcanvas-lg {\n transition: none;\n }\n}\n\n@media (width <= 991.98px) {\n .offcanvas-lg.offcanvas-start {\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n top: 0;\n left: 0;\n transform: translateX(-100%);\n }\n\n .offcanvas-lg.offcanvas-end {\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n top: 0;\n right: 0;\n transform: translateX(100%);\n }\n\n .offcanvas-lg.offcanvas-top {\n height: var(--bs-offcanvas-height);\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n max-height: 100%;\n top: 0;\n left: 0;\n right: 0;\n transform: translateY(-100%);\n }\n\n .offcanvas-lg.offcanvas-bottom {\n height: var(--bs-offcanvas-height);\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n max-height: 100%;\n left: 0;\n right: 0;\n transform: translateY(100%);\n }\n\n .offcanvas-lg.show:not(.hiding), .offcanvas-lg.showing {\n transform: none;\n }\n\n .offcanvas-lg.hiding, .offcanvas-lg.show, .offcanvas-lg.showing {\n visibility: visible;\n }\n}\n\n@media (width >= 992px) {\n .offcanvas-lg {\n --bs-offcanvas-height: auto;\n --bs-offcanvas-border-width: 0;\n background-color: #0000 !important;\n }\n\n .offcanvas-lg .offcanvas-header {\n display: none;\n }\n\n .offcanvas-lg .offcanvas-body {\n flex-grow: 0;\n padding: 0;\n display: flex;\n overflow-y: visible;\n background-color: #0000 !important;\n }\n}\n\n@media (width <= 1199.98px) {\n .offcanvas-xl {\n z-index: var(--bs-offcanvas-zindex);\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n transition: var(--bs-offcanvas-transition);\n background-clip: padding-box;\n outline: 0;\n flex-direction: column;\n max-width: 100%;\n display: flex;\n position: fixed;\n bottom: 0;\n }\n}\n\n@media (width <= 1199.98px) and (prefers-reduced-motion: reduce) {\n .offcanvas-xl {\n transition: none;\n }\n}\n\n@media (width <= 1199.98px) {\n .offcanvas-xl.offcanvas-start {\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n top: 0;\n left: 0;\n transform: translateX(-100%);\n }\n\n .offcanvas-xl.offcanvas-end {\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n top: 0;\n right: 0;\n transform: translateX(100%);\n }\n\n .offcanvas-xl.offcanvas-top {\n height: var(--bs-offcanvas-height);\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n max-height: 100%;\n top: 0;\n left: 0;\n right: 0;\n transform: translateY(-100%);\n }\n\n .offcanvas-xl.offcanvas-bottom {\n height: var(--bs-offcanvas-height);\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n max-height: 100%;\n left: 0;\n right: 0;\n transform: translateY(100%);\n }\n\n .offcanvas-xl.show:not(.hiding), .offcanvas-xl.showing {\n transform: none;\n }\n\n .offcanvas-xl.hiding, .offcanvas-xl.show, .offcanvas-xl.showing {\n visibility: visible;\n }\n}\n\n@media (width >= 1200px) {\n .offcanvas-xl {\n --bs-offcanvas-height: auto;\n --bs-offcanvas-border-width: 0;\n background-color: #0000 !important;\n }\n\n .offcanvas-xl .offcanvas-header {\n display: none;\n }\n\n .offcanvas-xl .offcanvas-body {\n flex-grow: 0;\n padding: 0;\n display: flex;\n overflow-y: visible;\n background-color: #0000 !important;\n }\n}\n\n@media (width <= 1399.98px) {\n .offcanvas-xxl {\n z-index: var(--bs-offcanvas-zindex);\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n transition: var(--bs-offcanvas-transition);\n background-clip: padding-box;\n outline: 0;\n flex-direction: column;\n max-width: 100%;\n display: flex;\n position: fixed;\n bottom: 0;\n }\n}\n\n@media (width <= 1399.98px) and (prefers-reduced-motion: reduce) {\n .offcanvas-xxl {\n transition: none;\n }\n}\n\n@media (width <= 1399.98px) {\n .offcanvas-xxl.offcanvas-start {\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n top: 0;\n left: 0;\n transform: translateX(-100%);\n }\n\n .offcanvas-xxl.offcanvas-end {\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n top: 0;\n right: 0;\n transform: translateX(100%);\n }\n\n .offcanvas-xxl.offcanvas-top {\n height: var(--bs-offcanvas-height);\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n max-height: 100%;\n top: 0;\n left: 0;\n right: 0;\n transform: translateY(-100%);\n }\n\n .offcanvas-xxl.offcanvas-bottom {\n height: var(--bs-offcanvas-height);\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n max-height: 100%;\n left: 0;\n right: 0;\n transform: translateY(100%);\n }\n\n .offcanvas-xxl.show:not(.hiding), .offcanvas-xxl.showing {\n transform: none;\n }\n\n .offcanvas-xxl.hiding, .offcanvas-xxl.show, .offcanvas-xxl.showing {\n visibility: visible;\n }\n}\n\n@media (width >= 1400px) {\n .offcanvas-xxl {\n --bs-offcanvas-height: auto;\n --bs-offcanvas-border-width: 0;\n background-color: #0000 !important;\n }\n\n .offcanvas-xxl .offcanvas-header {\n display: none;\n }\n\n .offcanvas-xxl .offcanvas-body {\n flex-grow: 0;\n padding: 0;\n display: flex;\n overflow-y: visible;\n background-color: #0000 !important;\n }\n}\n\n.offcanvas {\n z-index: var(--bs-offcanvas-zindex);\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n transition: var(--bs-offcanvas-transition);\n background-clip: padding-box;\n outline: 0;\n flex-direction: column;\n max-width: 100%;\n display: flex;\n position: fixed;\n bottom: 0;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .offcanvas {\n transition: none;\n }\n}\n\n.offcanvas.offcanvas-start {\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n top: 0;\n left: 0;\n transform: translateX(-100%);\n}\n\n.offcanvas.offcanvas-end {\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n top: 0;\n right: 0;\n transform: translateX(100%);\n}\n\n.offcanvas.offcanvas-top {\n height: var(--bs-offcanvas-height);\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n max-height: 100%;\n top: 0;\n left: 0;\n right: 0;\n transform: translateY(-100%);\n}\n\n.offcanvas.offcanvas-bottom {\n height: var(--bs-offcanvas-height);\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n max-height: 100%;\n left: 0;\n right: 0;\n transform: translateY(100%);\n}\n\n.offcanvas.show:not(.hiding), .offcanvas.showing {\n transform: none;\n}\n\n.offcanvas.hiding, .offcanvas.show, .offcanvas.showing {\n visibility: visible;\n}\n\n.offcanvas-backdrop {\n z-index: 1040;\n background-color: #000;\n width: 100vw;\n height: 100vh;\n position: fixed;\n top: 0;\n left: 0;\n}\n\n.offcanvas-backdrop.fade {\n opacity: 0;\n}\n\n.offcanvas-backdrop.show {\n opacity: .5;\n}\n\n.offcanvas-header {\n padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);\n align-items: center;\n display: flex;\n}\n\n.offcanvas-header .btn-close {\n padding: calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);\n margin: calc(-.5 * var(--bs-offcanvas-padding-y)) calc(-.5 * var(--bs-offcanvas-padding-x)) calc(-.5 * var(--bs-offcanvas-padding-y)) auto;\n}\n\n.offcanvas-title {\n line-height: var(--bs-offcanvas-title-line-height);\n margin-bottom: 0;\n}\n\n.offcanvas-body {\n padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);\n flex-grow: 1;\n overflow-y: auto;\n}\n\n.placeholder {\n vertical-align: middle;\n cursor: wait;\n opacity: .5;\n background-color: currentColor;\n min-height: 1em;\n display: inline-block;\n}\n\n.placeholder.btn:before {\n content: \"\";\n display: inline-block;\n}\n\n.placeholder-xs {\n min-height: .6em;\n}\n\n.placeholder-sm {\n min-height: .8em;\n}\n\n.placeholder-lg {\n min-height: 1.2em;\n}\n\n.placeholder-glow .placeholder {\n animation: 2s ease-in-out infinite placeholder-glow;\n}\n\n@keyframes placeholder-glow {\n 50% {\n opacity: .2;\n }\n}\n\n.placeholder-wave {\n animation: 2s linear infinite placeholder-wave;\n -webkit-mask-image: linear-gradient(130deg, #000 55%, #000c 75%, #000 95%);\n mask-image: linear-gradient(130deg, #000 55%, #000c 75%, #000 95%);\n -webkit-mask-size: 200% 100%;\n mask-size: 200% 100%;\n}\n\n@keyframes placeholder-wave {\n 100% {\n -webkit-mask-position: -200% 0;\n mask-position: -200% 0;\n }\n}\n\n.clearfix:after {\n clear: both;\n content: \"\";\n display: block;\n}\n\n.text-bg-primary {\n color: #fff !important;\n background-color: RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-secondary {\n color: #fff !important;\n background-color: RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-success {\n color: #fff !important;\n background-color: RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-info {\n color: #000 !important;\n background-color: RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-warning {\n color: #000 !important;\n background-color: RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-danger {\n color: #fff !important;\n background-color: RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-light {\n color: #000 !important;\n background-color: RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-dark {\n color: #fff !important;\n background-color: RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.link-primary {\n color: RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-primary:focus, .link-primary:hover {\n color: RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-secondary {\n color: RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-secondary:focus, .link-secondary:hover {\n color: RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-success {\n color: RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-success:focus, .link-success:hover {\n color: RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-info {\n color: RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-info:focus, .link-info:hover {\n color: RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-warning {\n color: RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-warning:focus, .link-warning:hover {\n color: RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-danger {\n color: RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-danger:focus, .link-danger:hover {\n color: RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-light {\n color: RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-light:focus, .link-light:hover {\n color: RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-dark {\n color: RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-dark:focus, .link-dark:hover {\n color: RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-body-emphasis {\n color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-body-emphasis:focus, .link-body-emphasis:hover {\n color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, .75)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, .75)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, .75)) !important;\n text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, .75)) !important;\n}\n\n.focus-ring:focus {\n box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color);\n outline: 0;\n}\n\n.icon-link {\n -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, .5));\n -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, .5));\n text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, .5));\n text-underline-offset: .25em;\n backface-visibility: hidden;\n align-items: center;\n gap: .375rem;\n display: inline-flex;\n}\n\n.icon-link > .bi {\n fill: currentColor;\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n transition: transform .2s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .icon-link > .bi {\n transition: none;\n }\n}\n\n.icon-link-hover:focus-visible > .bi, .icon-link-hover:hover > .bi {\n transform: var(--bs-icon-link-transform, translate3d(.25em, 0, 0));\n}\n\n.ratio {\n width: 100%;\n position: relative;\n}\n\n.ratio:before {\n padding-top: var(--bs-aspect-ratio);\n content: \"\";\n display: block;\n}\n\n.ratio > * {\n width: 100%;\n height: 100%;\n position: absolute;\n top: 0;\n left: 0;\n}\n\n.ratio-1x1 {\n --bs-aspect-ratio: 100%;\n}\n\n.ratio-4x3 {\n --bs-aspect-ratio: 75%;\n}\n\n.ratio-16x9 {\n --bs-aspect-ratio: 56.25%;\n}\n\n.ratio-21x9 {\n --bs-aspect-ratio: 42.8571%;\n}\n\n.fixed-top {\n z-index: 1030;\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n}\n\n.fixed-bottom {\n z-index: 1030;\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n}\n\n.sticky-top {\n z-index: 1020;\n position: sticky;\n top: 0;\n}\n\n.sticky-bottom {\n z-index: 1020;\n position: sticky;\n bottom: 0;\n}\n\n@media (width >= 576px) {\n .sticky-sm-top {\n z-index: 1020;\n position: sticky;\n top: 0;\n }\n\n .sticky-sm-bottom {\n z-index: 1020;\n position: sticky;\n bottom: 0;\n }\n}\n\n@media (width >= 768px) {\n .sticky-md-top {\n z-index: 1020;\n position: sticky;\n top: 0;\n }\n\n .sticky-md-bottom {\n z-index: 1020;\n position: sticky;\n bottom: 0;\n }\n}\n\n@media (width >= 992px) {\n .sticky-lg-top {\n z-index: 1020;\n position: sticky;\n top: 0;\n }\n\n .sticky-lg-bottom {\n z-index: 1020;\n position: sticky;\n bottom: 0;\n }\n}\n\n@media (width >= 1200px) {\n .sticky-xl-top {\n z-index: 1020;\n position: sticky;\n top: 0;\n }\n\n .sticky-xl-bottom {\n z-index: 1020;\n position: sticky;\n bottom: 0;\n }\n}\n\n@media (width >= 1400px) {\n .sticky-xxl-top {\n z-index: 1020;\n position: sticky;\n top: 0;\n }\n\n .sticky-xxl-bottom {\n z-index: 1020;\n position: sticky;\n bottom: 0;\n }\n}\n\n.hstack {\n flex-direction: row;\n align-self: stretch;\n align-items: center;\n display: flex;\n}\n\n.vstack {\n flex-direction: column;\n flex: auto;\n align-self: stretch;\n display: flex;\n}\n\n.visually-hidden, .visually-hidden-focusable:not(:focus):not(:focus-within) {\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n width: 1px !important;\n height: 1px !important;\n margin: -1px !important;\n padding: 0 !important;\n overflow: hidden !important;\n}\n\n.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption), .visually-hidden:not(caption) {\n position: absolute !important;\n}\n\n.stretched-link:after {\n z-index: 1;\n content: \"\";\n position: absolute;\n inset: 0;\n}\n\n.text-truncate {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n}\n\n.vr {\n width: var(--bs-border-width);\n opacity: .25;\n background-color: currentColor;\n align-self: stretch;\n min-height: 1em;\n display: inline-block;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.float-start {\n float: left !important;\n}\n\n.float-end {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n.object-fit-contain {\n -o-object-fit: contain !important;\n object-fit: contain !important;\n}\n\n.object-fit-cover {\n -o-object-fit: cover !important;\n object-fit: cover !important;\n}\n\n.object-fit-fill {\n -o-object-fit: fill !important;\n object-fit: fill !important;\n}\n\n.object-fit-scale {\n -o-object-fit: scale-down !important;\n object-fit: scale-down !important;\n}\n\n.object-fit-none {\n -o-object-fit: none !important;\n object-fit: none !important;\n}\n\n.opacity-0 {\n opacity: 0 !important;\n}\n\n.opacity-25 {\n opacity: .25 !important;\n}\n\n.opacity-50 {\n opacity: .5 !important;\n}\n\n.opacity-75 {\n opacity: .75 !important;\n}\n\n.opacity-100 {\n opacity: 1 !important;\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.overflow-visible {\n overflow: visible !important;\n}\n\n.overflow-scroll {\n overflow: scroll !important;\n}\n\n.overflow-x-auto {\n overflow-x: auto !important;\n}\n\n.overflow-x-hidden {\n overflow-x: hidden !important;\n}\n\n.overflow-x-visible {\n overflow-x: visible !important;\n}\n\n.overflow-x-scroll {\n overflow-x: scroll !important;\n}\n\n.overflow-y-auto {\n overflow-y: auto !important;\n}\n\n.overflow-y-hidden {\n overflow-y: hidden !important;\n}\n\n.overflow-y-visible {\n overflow-y: visible !important;\n}\n\n.overflow-y-scroll {\n overflow-y: scroll !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-inline-grid {\n display: inline-grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.shadow {\n box-shadow: var(--bs-box-shadow) !important;\n}\n\n.shadow-sm {\n box-shadow: var(--bs-box-shadow-sm) !important;\n}\n\n.shadow-lg {\n box-shadow: var(--bs-box-shadow-lg) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.focus-ring-primary {\n --bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-secondary {\n --bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-success {\n --bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-info {\n --bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-warning {\n --bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-danger {\n --bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-light {\n --bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-dark {\n --bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity));\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: sticky !important;\n}\n\n.top-0 {\n top: 0 !important;\n}\n\n.top-50 {\n top: 50% !important;\n}\n\n.top-100 {\n top: 100% !important;\n}\n\n.bottom-0 {\n bottom: 0 !important;\n}\n\n.bottom-50 {\n bottom: 50% !important;\n}\n\n.bottom-100 {\n bottom: 100% !important;\n}\n\n.start-0 {\n left: 0 !important;\n}\n\n.start-50 {\n left: 50% !important;\n}\n\n.start-100 {\n left: 100% !important;\n}\n\n.end-0 {\n right: 0 !important;\n}\n\n.end-50 {\n right: 50% !important;\n}\n\n.end-100 {\n right: 100% !important;\n}\n\n.translate-middle {\n transform: translate(-50%, -50%) !important;\n}\n\n.translate-middle-x {\n transform: translateX(-50%) !important;\n}\n\n.translate-middle-y {\n transform: translateY(-50%) !important;\n}\n\n.border {\n border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top {\n border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-end {\n border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-end-0 {\n border-right: 0 !important;\n}\n\n.border-bottom {\n border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-start {\n border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-start-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-secondary {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-success {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-info {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-warning {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-danger {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-light {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-dark {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-black {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-white {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-primary-subtle {\n border-color: var(--bs-primary-border-subtle) !important;\n}\n\n.border-secondary-subtle {\n border-color: var(--bs-secondary-border-subtle) !important;\n}\n\n.border-success-subtle {\n border-color: var(--bs-success-border-subtle) !important;\n}\n\n.border-info-subtle {\n border-color: var(--bs-info-border-subtle) !important;\n}\n\n.border-warning-subtle {\n border-color: var(--bs-warning-border-subtle) !important;\n}\n\n.border-danger-subtle {\n border-color: var(--bs-danger-border-subtle) !important;\n}\n\n.border-light-subtle {\n border-color: var(--bs-light-border-subtle) !important;\n}\n\n.border-dark-subtle {\n border-color: var(--bs-dark-border-subtle) !important;\n}\n\n.border-1 {\n border-width: 1px !important;\n}\n\n.border-2 {\n border-width: 2px !important;\n}\n\n.border-3 {\n border-width: 3px !important;\n}\n\n.border-4 {\n border-width: 4px !important;\n}\n\n.border-5 {\n border-width: 5px !important;\n}\n\n.border-opacity-10 {\n --bs-border-opacity: .1;\n}\n\n.border-opacity-25 {\n --bs-border-opacity: .25;\n}\n\n.border-opacity-50 {\n --bs-border-opacity: .5;\n}\n\n.border-opacity-75 {\n --bs-border-opacity: .75;\n}\n\n.border-opacity-100 {\n --bs-border-opacity: 1;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.flex-fill {\n flex: auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: .25rem !important;\n}\n\n.m-2 {\n margin: .5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n}\n\n.mx-1 {\n margin-left: .25rem !important;\n margin-right: .25rem !important;\n}\n\n.mx-2 {\n margin-left: .5rem !important;\n margin-right: .5rem !important;\n}\n\n.mx-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n}\n\n.mx-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n}\n\n.mx-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n}\n\n.mx-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: .25rem !important;\n margin-bottom: .25rem !important;\n}\n\n.my-2 {\n margin-top: .5rem !important;\n margin-bottom: .5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: .25rem !important;\n}\n\n.mt-2 {\n margin-top: .5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-right: 0 !important;\n}\n\n.me-1 {\n margin-right: .25rem !important;\n}\n\n.me-2 {\n margin-right: .5rem !important;\n}\n\n.me-3 {\n margin-right: 1rem !important;\n}\n\n.me-4 {\n margin-right: 1.5rem !important;\n}\n\n.me-5 {\n margin-right: 3rem !important;\n}\n\n.me-auto {\n margin-right: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: .25rem !important;\n}\n\n.mb-2 {\n margin-bottom: .5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-left: 0 !important;\n}\n\n.ms-1 {\n margin-left: .25rem !important;\n}\n\n.ms-2 {\n margin-left: .5rem !important;\n}\n\n.ms-3 {\n margin-left: 1rem !important;\n}\n\n.ms-4 {\n margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n margin-left: 3rem !important;\n}\n\n.ms-auto {\n margin-left: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: .25rem !important;\n}\n\n.p-2 {\n padding: .5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n}\n\n.px-1 {\n padding-left: .25rem !important;\n padding-right: .25rem !important;\n}\n\n.px-2 {\n padding-left: .5rem !important;\n padding-right: .5rem !important;\n}\n\n.px-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n}\n\n.px-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n}\n\n.px-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: .25rem !important;\n padding-bottom: .25rem !important;\n}\n\n.py-2 {\n padding-top: .5rem !important;\n padding-bottom: .5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: .25rem !important;\n}\n\n.pt-2 {\n padding-top: .5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-right: 0 !important;\n}\n\n.pe-1 {\n padding-right: .25rem !important;\n}\n\n.pe-2 {\n padding-right: .5rem !important;\n}\n\n.pe-3 {\n padding-right: 1rem !important;\n}\n\n.pe-4 {\n padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n padding-right: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: .25rem !important;\n}\n\n.pb-2 {\n padding-bottom: .5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-left: 0 !important;\n}\n\n.ps-1 {\n padding-left: .25rem !important;\n}\n\n.ps-2 {\n padding-left: .5rem !important;\n}\n\n.ps-3 {\n padding-left: 1rem !important;\n}\n\n.ps-4 {\n padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n padding-left: 3rem !important;\n}\n\n.gap-0 {\n gap: 0 !important;\n}\n\n.gap-1 {\n gap: .25rem !important;\n}\n\n.gap-2 {\n gap: .5rem !important;\n}\n\n.gap-3 {\n gap: 1rem !important;\n}\n\n.gap-4 {\n gap: 1.5rem !important;\n}\n\n.gap-5 {\n gap: 3rem !important;\n}\n\n.row-gap-0 {\n row-gap: 0 !important;\n}\n\n.row-gap-1 {\n row-gap: .25rem !important;\n}\n\n.row-gap-2 {\n row-gap: .5rem !important;\n}\n\n.row-gap-3 {\n row-gap: 1rem !important;\n}\n\n.row-gap-4 {\n row-gap: 1.5rem !important;\n}\n\n.row-gap-5 {\n row-gap: 3rem !important;\n}\n\n.column-gap-0 {\n -moz-column-gap: 0 !important;\n column-gap: 0 !important;\n}\n\n.column-gap-1 {\n -moz-column-gap: .25rem !important;\n column-gap: .25rem !important;\n}\n\n.column-gap-2 {\n -moz-column-gap: .5rem !important;\n column-gap: .5rem !important;\n}\n\n.column-gap-3 {\n -moz-column-gap: 1rem !important;\n column-gap: 1rem !important;\n}\n\n.column-gap-4 {\n -moz-column-gap: 1.5rem !important;\n column-gap: 1.5rem !important;\n}\n\n.column-gap-5 {\n -moz-column-gap: 3rem !important;\n column-gap: 3rem !important;\n}\n\n.font-monospace {\n font-family: var(--bs-font-monospace) !important;\n}\n\n.fs-1 {\n font-size: calc(1.375rem + 1.5vw) !important;\n}\n\n.fs-2 {\n font-size: calc(1.325rem + .9vw) !important;\n}\n\n.fs-3 {\n font-size: calc(1.3rem + .6vw) !important;\n}\n\n.fs-4 {\n font-size: calc(1.275rem + .3vw) !important;\n}\n\n.fs-5 {\n font-size: 1.25rem !important;\n}\n\n.fs-6 {\n font-size: 1rem !important;\n}\n\n.fst-italic {\n font-style: italic !important;\n}\n\n.fst-normal {\n font-style: normal !important;\n}\n\n.fw-lighter {\n font-weight: lighter !important;\n}\n\n.fw-light {\n font-weight: 300 !important;\n}\n\n.fw-normal {\n font-weight: 400 !important;\n}\n\n.fw-medium {\n font-weight: 500 !important;\n}\n\n.fw-semibold {\n font-weight: 600 !important;\n}\n\n.fw-bold {\n font-weight: 700 !important;\n}\n\n.fw-bolder {\n font-weight: bolder !important;\n}\n\n.lh-1 {\n line-height: 1 !important;\n}\n\n.lh-sm {\n line-height: 1.25 !important;\n}\n\n.lh-base {\n line-height: 1.5 !important;\n}\n\n.lh-lg {\n line-height: 2 !important;\n}\n\n.text-start {\n text-align: left !important;\n}\n\n.text-end {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-decoration-underline {\n text-decoration: underline !important;\n}\n\n.text-decoration-line-through {\n text-decoration: line-through !important;\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-break {\n word-wrap: break-word !important;\n word-break: break-word !important;\n}\n\n.text-primary {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-secondary {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-success {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-info {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-warning {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-danger {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-light {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-dark {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-black {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-white {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-body {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-muted {\n --bs-text-opacity: 1;\n color: var(--bs-secondary-color) !important;\n}\n\n.text-black-50 {\n --bs-text-opacity: 1;\n color: #00000080 !important;\n}\n\n.text-white-50 {\n --bs-text-opacity: 1;\n color: #ffffff80 !important;\n}\n\n.text-body-secondary {\n --bs-text-opacity: 1;\n color: var(--bs-secondary-color) !important;\n}\n\n.text-body-tertiary {\n --bs-text-opacity: 1;\n color: var(--bs-tertiary-color) !important;\n}\n\n.text-body-emphasis {\n --bs-text-opacity: 1;\n color: var(--bs-emphasis-color) !important;\n}\n\n.text-reset {\n --bs-text-opacity: 1;\n color: inherit !important;\n}\n\n.text-opacity-25 {\n --bs-text-opacity: .25;\n}\n\n.text-opacity-50 {\n --bs-text-opacity: .5;\n}\n\n.text-opacity-75 {\n --bs-text-opacity: .75;\n}\n\n.text-opacity-100 {\n --bs-text-opacity: 1;\n}\n\n.text-primary-emphasis {\n color: var(--bs-primary-text-emphasis) !important;\n}\n\n.text-secondary-emphasis {\n color: var(--bs-secondary-text-emphasis) !important;\n}\n\n.text-success-emphasis {\n color: var(--bs-success-text-emphasis) !important;\n}\n\n.text-info-emphasis {\n color: var(--bs-info-text-emphasis) !important;\n}\n\n.text-warning-emphasis {\n color: var(--bs-warning-text-emphasis) !important;\n}\n\n.text-danger-emphasis {\n color: var(--bs-danger-text-emphasis) !important;\n}\n\n.text-light-emphasis {\n color: var(--bs-light-text-emphasis) !important;\n}\n\n.text-dark-emphasis {\n color: var(--bs-dark-text-emphasis) !important;\n}\n\n.link-opacity-10, .link-opacity-10-hover:hover {\n --bs-link-opacity: .1;\n}\n\n.link-opacity-25, .link-opacity-25-hover:hover {\n --bs-link-opacity: .25;\n}\n\n.link-opacity-50, .link-opacity-50-hover:hover {\n --bs-link-opacity: .5;\n}\n\n.link-opacity-75, .link-opacity-75-hover:hover {\n --bs-link-opacity: .75;\n}\n\n.link-opacity-100, .link-opacity-100-hover:hover {\n --bs-link-opacity: 1;\n}\n\n.link-offset-1, .link-offset-1-hover:hover {\n text-underline-offset: .125em !important;\n}\n\n.link-offset-2, .link-offset-2-hover:hover {\n text-underline-offset: .25em !important;\n}\n\n.link-offset-3, .link-offset-3-hover:hover {\n text-underline-offset: .375em !important;\n}\n\n.link-underline-primary {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important;\n -webkit-text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-secondary {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important;\n -webkit-text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-success {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important;\n -webkit-text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-info {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important;\n -webkit-text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-warning {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important;\n -webkit-text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-danger {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important;\n -webkit-text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-light {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important;\n -webkit-text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-dark {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important;\n -webkit-text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-underline-opacity-0, .link-underline-opacity-0-hover:hover {\n --bs-link-underline-opacity: 0;\n}\n\n.link-underline-opacity-10, .link-underline-opacity-10-hover:hover {\n --bs-link-underline-opacity: .1;\n}\n\n.link-underline-opacity-25, .link-underline-opacity-25-hover:hover {\n --bs-link-underline-opacity: .25;\n}\n\n.link-underline-opacity-50, .link-underline-opacity-50-hover:hover {\n --bs-link-underline-opacity: .5;\n}\n\n.link-underline-opacity-75, .link-underline-opacity-75-hover:hover {\n --bs-link-underline-opacity: .75;\n}\n\n.link-underline-opacity-100, .link-underline-opacity-100-hover:hover {\n --bs-link-underline-opacity: 1;\n}\n\n.bg-primary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-secondary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-success {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-info {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-warning {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-danger {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-light {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-dark {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-black {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-white {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-transparent {\n --bs-bg-opacity: 1;\n background-color: #0000 !important;\n}\n\n.bg-body-secondary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body-tertiary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-opacity-10 {\n --bs-bg-opacity: .1;\n}\n\n.bg-opacity-25 {\n --bs-bg-opacity: .25;\n}\n\n.bg-opacity-50 {\n --bs-bg-opacity: .5;\n}\n\n.bg-opacity-75 {\n --bs-bg-opacity: .75;\n}\n\n.bg-opacity-100 {\n --bs-bg-opacity: 1;\n}\n\n.bg-primary-subtle {\n background-color: var(--bs-primary-bg-subtle) !important;\n}\n\n.bg-secondary-subtle {\n background-color: var(--bs-secondary-bg-subtle) !important;\n}\n\n.bg-success-subtle {\n background-color: var(--bs-success-bg-subtle) !important;\n}\n\n.bg-info-subtle {\n background-color: var(--bs-info-bg-subtle) !important;\n}\n\n.bg-warning-subtle {\n background-color: var(--bs-warning-bg-subtle) !important;\n}\n\n.bg-danger-subtle {\n background-color: var(--bs-danger-bg-subtle) !important;\n}\n\n.bg-light-subtle {\n background-color: var(--bs-light-bg-subtle) !important;\n}\n\n.bg-dark-subtle {\n background-color: var(--bs-dark-bg-subtle) !important;\n}\n\n.bg-gradient {\n background-image: var(--bs-gradient) !important;\n}\n\n.user-select-all {\n -webkit-user-select: all !important;\n user-select: all !important;\n}\n\n.user-select-auto {\n -webkit-user-select: auto !important;\n user-select: auto !important;\n}\n\n.user-select-none {\n -webkit-user-select: none !important;\n user-select: none !important;\n}\n\n.pe-none {\n pointer-events: none !important;\n}\n\n.pe-auto {\n pointer-events: auto !important;\n}\n\n.rounded {\n border-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.rounded-1 {\n border-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-2 {\n border-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-3 {\n border-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-4 {\n border-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-5 {\n border-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-top {\n border-top-left-radius: var(--bs-border-radius) !important;\n border-top-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-top-0 {\n border-top-left-radius: 0 !important;\n border-top-right-radius: 0 !important;\n}\n\n.rounded-top-1 {\n border-top-left-radius: var(--bs-border-radius-sm) !important;\n border-top-right-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-top-2 {\n border-top-left-radius: var(--bs-border-radius) !important;\n border-top-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-top-3 {\n border-top-left-radius: var(--bs-border-radius-lg) !important;\n border-top-right-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-top-4 {\n border-top-left-radius: var(--bs-border-radius-xl) !important;\n border-top-right-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-top-5 {\n border-top-left-radius: var(--bs-border-radius-xxl) !important;\n border-top-right-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-top-circle {\n border-top-left-radius: 50% !important;\n border-top-right-radius: 50% !important;\n}\n\n.rounded-top-pill {\n border-top-left-radius: var(--bs-border-radius-pill) !important;\n border-top-right-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-end {\n border-top-right-radius: var(--bs-border-radius) !important;\n border-bottom-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-end-0 {\n border-top-right-radius: 0 !important;\n border-bottom-right-radius: 0 !important;\n}\n\n.rounded-end-1 {\n border-top-right-radius: var(--bs-border-radius-sm) !important;\n border-bottom-right-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-end-2 {\n border-top-right-radius: var(--bs-border-radius) !important;\n border-bottom-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-end-3 {\n border-top-right-radius: var(--bs-border-radius-lg) !important;\n border-bottom-right-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-end-4 {\n border-top-right-radius: var(--bs-border-radius-xl) !important;\n border-bottom-right-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-end-5 {\n border-top-right-radius: var(--bs-border-radius-xxl) !important;\n border-bottom-right-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-end-circle {\n border-top-right-radius: 50% !important;\n border-bottom-right-radius: 50% !important;\n}\n\n.rounded-end-pill {\n border-top-right-radius: var(--bs-border-radius-pill) !important;\n border-bottom-right-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: var(--bs-border-radius) !important;\n border-bottom-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-bottom-0 {\n border-bottom-right-radius: 0 !important;\n border-bottom-left-radius: 0 !important;\n}\n\n.rounded-bottom-1 {\n border-bottom-right-radius: var(--bs-border-radius-sm) !important;\n border-bottom-left-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-bottom-2 {\n border-bottom-right-radius: var(--bs-border-radius) !important;\n border-bottom-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-bottom-3 {\n border-bottom-right-radius: var(--bs-border-radius-lg) !important;\n border-bottom-left-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-bottom-4 {\n border-bottom-right-radius: var(--bs-border-radius-xl) !important;\n border-bottom-left-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-bottom-5 {\n border-bottom-right-radius: var(--bs-border-radius-xxl) !important;\n border-bottom-left-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-bottom-circle {\n border-bottom-right-radius: 50% !important;\n border-bottom-left-radius: 50% !important;\n}\n\n.rounded-bottom-pill {\n border-bottom-right-radius: var(--bs-border-radius-pill) !important;\n border-bottom-left-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-start {\n border-bottom-left-radius: var(--bs-border-radius) !important;\n border-top-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-start-0 {\n border-top-left-radius: 0 !important;\n border-bottom-left-radius: 0 !important;\n}\n\n.rounded-start-1 {\n border-bottom-left-radius: var(--bs-border-radius-sm) !important;\n border-top-left-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-start-2 {\n border-bottom-left-radius: var(--bs-border-radius) !important;\n border-top-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-start-3 {\n border-bottom-left-radius: var(--bs-border-radius-lg) !important;\n border-top-left-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-start-4 {\n border-bottom-left-radius: var(--bs-border-radius-xl) !important;\n border-top-left-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-start-5 {\n border-bottom-left-radius: var(--bs-border-radius-xxl) !important;\n border-top-left-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-start-circle {\n border-top-left-radius: 50% !important;\n border-bottom-left-radius: 50% !important;\n}\n\n.rounded-start-pill {\n border-bottom-left-radius: var(--bs-border-radius-pill) !important;\n border-top-left-radius: var(--bs-border-radius-pill) !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n.z-n1 {\n z-index: -1 !important;\n}\n\n.z-0 {\n z-index: 0 !important;\n}\n\n.z-1 {\n z-index: 1 !important;\n}\n\n.z-2 {\n z-index: 2 !important;\n}\n\n.z-3 {\n z-index: 3 !important;\n}\n\n@media (width >= 576px) {\n .float-sm-start {\n float: left !important;\n }\n\n .float-sm-end {\n float: right !important;\n }\n\n .float-sm-none {\n float: none !important;\n }\n\n .object-fit-sm-contain {\n -o-object-fit: contain !important;\n object-fit: contain !important;\n }\n\n .object-fit-sm-cover {\n -o-object-fit: cover !important;\n object-fit: cover !important;\n }\n\n .object-fit-sm-fill {\n -o-object-fit: fill !important;\n object-fit: fill !important;\n }\n\n .object-fit-sm-scale {\n -o-object-fit: scale-down !important;\n object-fit: scale-down !important;\n }\n\n .object-fit-sm-none {\n -o-object-fit: none !important;\n object-fit: none !important;\n }\n\n .d-sm-inline {\n display: inline !important;\n }\n\n .d-sm-inline-block {\n display: inline-block !important;\n }\n\n .d-sm-block {\n display: block !important;\n }\n\n .d-sm-grid {\n display: grid !important;\n }\n\n .d-sm-inline-grid {\n display: inline-grid !important;\n }\n\n .d-sm-table {\n display: table !important;\n }\n\n .d-sm-table-row {\n display: table-row !important;\n }\n\n .d-sm-table-cell {\n display: table-cell !important;\n }\n\n .d-sm-flex {\n display: flex !important;\n }\n\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n\n .d-sm-none {\n display: none !important;\n }\n\n .flex-sm-fill {\n flex: auto !important;\n }\n\n .flex-sm-row {\n flex-direction: row !important;\n }\n\n .flex-sm-column {\n flex-direction: column !important;\n }\n\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n\n .justify-content-sm-center {\n justify-content: center !important;\n }\n\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n\n .align-items-sm-center {\n align-items: center !important;\n }\n\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n\n .align-content-sm-center {\n align-content: center !important;\n }\n\n .align-content-sm-between {\n align-content: space-between !important;\n }\n\n .align-content-sm-around {\n align-content: space-around !important;\n }\n\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n\n .align-self-sm-auto {\n align-self: auto !important;\n }\n\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n\n .align-self-sm-center {\n align-self: center !important;\n }\n\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n\n .order-sm-first {\n order: -1 !important;\n }\n\n .order-sm-0 {\n order: 0 !important;\n }\n\n .order-sm-1 {\n order: 1 !important;\n }\n\n .order-sm-2 {\n order: 2 !important;\n }\n\n .order-sm-3 {\n order: 3 !important;\n }\n\n .order-sm-4 {\n order: 4 !important;\n }\n\n .order-sm-5 {\n order: 5 !important;\n }\n\n .order-sm-last {\n order: 6 !important;\n }\n\n .m-sm-0 {\n margin: 0 !important;\n }\n\n .m-sm-1 {\n margin: .25rem !important;\n }\n\n .m-sm-2 {\n margin: .5rem !important;\n }\n\n .m-sm-3 {\n margin: 1rem !important;\n }\n\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n\n .m-sm-5 {\n margin: 3rem !important;\n }\n\n .m-sm-auto {\n margin: auto !important;\n }\n\n .mx-sm-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n\n .mx-sm-1 {\n margin-left: .25rem !important;\n margin-right: .25rem !important;\n }\n\n .mx-sm-2 {\n margin-left: .5rem !important;\n margin-right: .5rem !important;\n }\n\n .mx-sm-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n\n .mx-sm-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n\n .mx-sm-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n\n .my-sm-1 {\n margin-top: .25rem !important;\n margin-bottom: .25rem !important;\n }\n\n .my-sm-2 {\n margin-top: .5rem !important;\n margin-bottom: .5rem !important;\n }\n\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n\n .mt-sm-1 {\n margin-top: .25rem !important;\n }\n\n .mt-sm-2 {\n margin-top: .5rem !important;\n }\n\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n\n .mt-sm-auto {\n margin-top: auto !important;\n }\n\n .me-sm-0 {\n margin-right: 0 !important;\n }\n\n .me-sm-1 {\n margin-right: .25rem !important;\n }\n\n .me-sm-2 {\n margin-right: .5rem !important;\n }\n\n .me-sm-3 {\n margin-right: 1rem !important;\n }\n\n .me-sm-4 {\n margin-right: 1.5rem !important;\n }\n\n .me-sm-5 {\n margin-right: 3rem !important;\n }\n\n .me-sm-auto {\n margin-right: auto !important;\n }\n\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n\n .mb-sm-1 {\n margin-bottom: .25rem !important;\n }\n\n .mb-sm-2 {\n margin-bottom: .5rem !important;\n }\n\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n\n .ms-sm-0 {\n margin-left: 0 !important;\n }\n\n .ms-sm-1 {\n margin-left: .25rem !important;\n }\n\n .ms-sm-2 {\n margin-left: .5rem !important;\n }\n\n .ms-sm-3 {\n margin-left: 1rem !important;\n }\n\n .ms-sm-4 {\n margin-left: 1.5rem !important;\n }\n\n .ms-sm-5 {\n margin-left: 3rem !important;\n }\n\n .ms-sm-auto {\n margin-left: auto !important;\n }\n\n .p-sm-0 {\n padding: 0 !important;\n }\n\n .p-sm-1 {\n padding: .25rem !important;\n }\n\n .p-sm-2 {\n padding: .5rem !important;\n }\n\n .p-sm-3 {\n padding: 1rem !important;\n }\n\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n\n .p-sm-5 {\n padding: 3rem !important;\n }\n\n .px-sm-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n\n .px-sm-1 {\n padding-left: .25rem !important;\n padding-right: .25rem !important;\n }\n\n .px-sm-2 {\n padding-left: .5rem !important;\n padding-right: .5rem !important;\n }\n\n .px-sm-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n\n .px-sm-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n\n .px-sm-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .py-sm-1 {\n padding-top: .25rem !important;\n padding-bottom: .25rem !important;\n }\n\n .py-sm-2 {\n padding-top: .5rem !important;\n padding-bottom: .5rem !important;\n }\n\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n\n .pt-sm-1 {\n padding-top: .25rem !important;\n }\n\n .pt-sm-2 {\n padding-top: .5rem !important;\n }\n\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n\n .pe-sm-0 {\n padding-right: 0 !important;\n }\n\n .pe-sm-1 {\n padding-right: .25rem !important;\n }\n\n .pe-sm-2 {\n padding-right: .5rem !important;\n }\n\n .pe-sm-3 {\n padding-right: 1rem !important;\n }\n\n .pe-sm-4 {\n padding-right: 1.5rem !important;\n }\n\n .pe-sm-5 {\n padding-right: 3rem !important;\n }\n\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n\n .pb-sm-1 {\n padding-bottom: .25rem !important;\n }\n\n .pb-sm-2 {\n padding-bottom: .5rem !important;\n }\n\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n\n .ps-sm-0 {\n padding-left: 0 !important;\n }\n\n .ps-sm-1 {\n padding-left: .25rem !important;\n }\n\n .ps-sm-2 {\n padding-left: .5rem !important;\n }\n\n .ps-sm-3 {\n padding-left: 1rem !important;\n }\n\n .ps-sm-4 {\n padding-left: 1.5rem !important;\n }\n\n .ps-sm-5 {\n padding-left: 3rem !important;\n }\n\n .gap-sm-0 {\n gap: 0 !important;\n }\n\n .gap-sm-1 {\n gap: .25rem !important;\n }\n\n .gap-sm-2 {\n gap: .5rem !important;\n }\n\n .gap-sm-3 {\n gap: 1rem !important;\n }\n\n .gap-sm-4 {\n gap: 1.5rem !important;\n }\n\n .gap-sm-5 {\n gap: 3rem !important;\n }\n\n .row-gap-sm-0 {\n row-gap: 0 !important;\n }\n\n .row-gap-sm-1 {\n row-gap: .25rem !important;\n }\n\n .row-gap-sm-2 {\n row-gap: .5rem !important;\n }\n\n .row-gap-sm-3 {\n row-gap: 1rem !important;\n }\n\n .row-gap-sm-4 {\n row-gap: 1.5rem !important;\n }\n\n .row-gap-sm-5 {\n row-gap: 3rem !important;\n }\n\n .column-gap-sm-0 {\n -moz-column-gap: 0 !important;\n column-gap: 0 !important;\n }\n\n .column-gap-sm-1 {\n -moz-column-gap: .25rem !important;\n column-gap: .25rem !important;\n }\n\n .column-gap-sm-2 {\n -moz-column-gap: .5rem !important;\n column-gap: .5rem !important;\n }\n\n .column-gap-sm-3 {\n -moz-column-gap: 1rem !important;\n column-gap: 1rem !important;\n }\n\n .column-gap-sm-4 {\n -moz-column-gap: 1.5rem !important;\n column-gap: 1.5rem !important;\n }\n\n .column-gap-sm-5 {\n -moz-column-gap: 3rem !important;\n column-gap: 3rem !important;\n }\n\n .text-sm-start {\n text-align: left !important;\n }\n\n .text-sm-end {\n text-align: right !important;\n }\n\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (width >= 768px) {\n .float-md-start {\n float: left !important;\n }\n\n .float-md-end {\n float: right !important;\n }\n\n .float-md-none {\n float: none !important;\n }\n\n .object-fit-md-contain {\n -o-object-fit: contain !important;\n object-fit: contain !important;\n }\n\n .object-fit-md-cover {\n -o-object-fit: cover !important;\n object-fit: cover !important;\n }\n\n .object-fit-md-fill {\n -o-object-fit: fill !important;\n object-fit: fill !important;\n }\n\n .object-fit-md-scale {\n -o-object-fit: scale-down !important;\n object-fit: scale-down !important;\n }\n\n .object-fit-md-none {\n -o-object-fit: none !important;\n object-fit: none !important;\n }\n\n .d-md-inline {\n display: inline !important;\n }\n\n .d-md-inline-block {\n display: inline-block !important;\n }\n\n .d-md-block {\n display: block !important;\n }\n\n .d-md-grid {\n display: grid !important;\n }\n\n .d-md-inline-grid {\n display: inline-grid !important;\n }\n\n .d-md-table {\n display: table !important;\n }\n\n .d-md-table-row {\n display: table-row !important;\n }\n\n .d-md-table-cell {\n display: table-cell !important;\n }\n\n .d-md-flex {\n display: flex !important;\n }\n\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n\n .d-md-none {\n display: none !important;\n }\n\n .flex-md-fill {\n flex: auto !important;\n }\n\n .flex-md-row {\n flex-direction: row !important;\n }\n\n .flex-md-column {\n flex-direction: column !important;\n }\n\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n\n .justify-content-md-center {\n justify-content: center !important;\n }\n\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n\n .align-items-md-start {\n align-items: flex-start !important;\n }\n\n .align-items-md-end {\n align-items: flex-end !important;\n }\n\n .align-items-md-center {\n align-items: center !important;\n }\n\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n\n .align-content-md-start {\n align-content: flex-start !important;\n }\n\n .align-content-md-end {\n align-content: flex-end !important;\n }\n\n .align-content-md-center {\n align-content: center !important;\n }\n\n .align-content-md-between {\n align-content: space-between !important;\n }\n\n .align-content-md-around {\n align-content: space-around !important;\n }\n\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n\n .align-self-md-auto {\n align-self: auto !important;\n }\n\n .align-self-md-start {\n align-self: flex-start !important;\n }\n\n .align-self-md-end {\n align-self: flex-end !important;\n }\n\n .align-self-md-center {\n align-self: center !important;\n }\n\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n\n .order-md-first {\n order: -1 !important;\n }\n\n .order-md-0 {\n order: 0 !important;\n }\n\n .order-md-1 {\n order: 1 !important;\n }\n\n .order-md-2 {\n order: 2 !important;\n }\n\n .order-md-3 {\n order: 3 !important;\n }\n\n .order-md-4 {\n order: 4 !important;\n }\n\n .order-md-5 {\n order: 5 !important;\n }\n\n .order-md-last {\n order: 6 !important;\n }\n\n .m-md-0 {\n margin: 0 !important;\n }\n\n .m-md-1 {\n margin: .25rem !important;\n }\n\n .m-md-2 {\n margin: .5rem !important;\n }\n\n .m-md-3 {\n margin: 1rem !important;\n }\n\n .m-md-4 {\n margin: 1.5rem !important;\n }\n\n .m-md-5 {\n margin: 3rem !important;\n }\n\n .m-md-auto {\n margin: auto !important;\n }\n\n .mx-md-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n\n .mx-md-1 {\n margin-left: .25rem !important;\n margin-right: .25rem !important;\n }\n\n .mx-md-2 {\n margin-left: .5rem !important;\n margin-right: .5rem !important;\n }\n\n .mx-md-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n\n .mx-md-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n\n .mx-md-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n\n .mx-md-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n\n .my-md-1 {\n margin-top: .25rem !important;\n margin-bottom: .25rem !important;\n }\n\n .my-md-2 {\n margin-top: .5rem !important;\n margin-bottom: .5rem !important;\n }\n\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n\n .mt-md-0 {\n margin-top: 0 !important;\n }\n\n .mt-md-1 {\n margin-top: .25rem !important;\n }\n\n .mt-md-2 {\n margin-top: .5rem !important;\n }\n\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n\n .mt-md-auto {\n margin-top: auto !important;\n }\n\n .me-md-0 {\n margin-right: 0 !important;\n }\n\n .me-md-1 {\n margin-right: .25rem !important;\n }\n\n .me-md-2 {\n margin-right: .5rem !important;\n }\n\n .me-md-3 {\n margin-right: 1rem !important;\n }\n\n .me-md-4 {\n margin-right: 1.5rem !important;\n }\n\n .me-md-5 {\n margin-right: 3rem !important;\n }\n\n .me-md-auto {\n margin-right: auto !important;\n }\n\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n\n .mb-md-1 {\n margin-bottom: .25rem !important;\n }\n\n .mb-md-2 {\n margin-bottom: .5rem !important;\n }\n\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n\n .ms-md-0 {\n margin-left: 0 !important;\n }\n\n .ms-md-1 {\n margin-left: .25rem !important;\n }\n\n .ms-md-2 {\n margin-left: .5rem !important;\n }\n\n .ms-md-3 {\n margin-left: 1rem !important;\n }\n\n .ms-md-4 {\n margin-left: 1.5rem !important;\n }\n\n .ms-md-5 {\n margin-left: 3rem !important;\n }\n\n .ms-md-auto {\n margin-left: auto !important;\n }\n\n .p-md-0 {\n padding: 0 !important;\n }\n\n .p-md-1 {\n padding: .25rem !important;\n }\n\n .p-md-2 {\n padding: .5rem !important;\n }\n\n .p-md-3 {\n padding: 1rem !important;\n }\n\n .p-md-4 {\n padding: 1.5rem !important;\n }\n\n .p-md-5 {\n padding: 3rem !important;\n }\n\n .px-md-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n\n .px-md-1 {\n padding-left: .25rem !important;\n padding-right: .25rem !important;\n }\n\n .px-md-2 {\n padding-left: .5rem !important;\n padding-right: .5rem !important;\n }\n\n .px-md-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n\n .px-md-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n\n .px-md-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .py-md-1 {\n padding-top: .25rem !important;\n padding-bottom: .25rem !important;\n }\n\n .py-md-2 {\n padding-top: .5rem !important;\n padding-bottom: .5rem !important;\n }\n\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n\n .pt-md-0 {\n padding-top: 0 !important;\n }\n\n .pt-md-1 {\n padding-top: .25rem !important;\n }\n\n .pt-md-2 {\n padding-top: .5rem !important;\n }\n\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n\n .pe-md-0 {\n padding-right: 0 !important;\n }\n\n .pe-md-1 {\n padding-right: .25rem !important;\n }\n\n .pe-md-2 {\n padding-right: .5rem !important;\n }\n\n .pe-md-3 {\n padding-right: 1rem !important;\n }\n\n .pe-md-4 {\n padding-right: 1.5rem !important;\n }\n\n .pe-md-5 {\n padding-right: 3rem !important;\n }\n\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n\n .pb-md-1 {\n padding-bottom: .25rem !important;\n }\n\n .pb-md-2 {\n padding-bottom: .5rem !important;\n }\n\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n\n .ps-md-0 {\n padding-left: 0 !important;\n }\n\n .ps-md-1 {\n padding-left: .25rem !important;\n }\n\n .ps-md-2 {\n padding-left: .5rem !important;\n }\n\n .ps-md-3 {\n padding-left: 1rem !important;\n }\n\n .ps-md-4 {\n padding-left: 1.5rem !important;\n }\n\n .ps-md-5 {\n padding-left: 3rem !important;\n }\n\n .gap-md-0 {\n gap: 0 !important;\n }\n\n .gap-md-1 {\n gap: .25rem !important;\n }\n\n .gap-md-2 {\n gap: .5rem !important;\n }\n\n .gap-md-3 {\n gap: 1rem !important;\n }\n\n .gap-md-4 {\n gap: 1.5rem !important;\n }\n\n .gap-md-5 {\n gap: 3rem !important;\n }\n\n .row-gap-md-0 {\n row-gap: 0 !important;\n }\n\n .row-gap-md-1 {\n row-gap: .25rem !important;\n }\n\n .row-gap-md-2 {\n row-gap: .5rem !important;\n }\n\n .row-gap-md-3 {\n row-gap: 1rem !important;\n }\n\n .row-gap-md-4 {\n row-gap: 1.5rem !important;\n }\n\n .row-gap-md-5 {\n row-gap: 3rem !important;\n }\n\n .column-gap-md-0 {\n -moz-column-gap: 0 !important;\n column-gap: 0 !important;\n }\n\n .column-gap-md-1 {\n -moz-column-gap: .25rem !important;\n column-gap: .25rem !important;\n }\n\n .column-gap-md-2 {\n -moz-column-gap: .5rem !important;\n column-gap: .5rem !important;\n }\n\n .column-gap-md-3 {\n -moz-column-gap: 1rem !important;\n column-gap: 1rem !important;\n }\n\n .column-gap-md-4 {\n -moz-column-gap: 1.5rem !important;\n column-gap: 1.5rem !important;\n }\n\n .column-gap-md-5 {\n -moz-column-gap: 3rem !important;\n column-gap: 3rem !important;\n }\n\n .text-md-start {\n text-align: left !important;\n }\n\n .text-md-end {\n text-align: right !important;\n }\n\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (width >= 992px) {\n .float-lg-start {\n float: left !important;\n }\n\n .float-lg-end {\n float: right !important;\n }\n\n .float-lg-none {\n float: none !important;\n }\n\n .object-fit-lg-contain {\n -o-object-fit: contain !important;\n object-fit: contain !important;\n }\n\n .object-fit-lg-cover {\n -o-object-fit: cover !important;\n object-fit: cover !important;\n }\n\n .object-fit-lg-fill {\n -o-object-fit: fill !important;\n object-fit: fill !important;\n }\n\n .object-fit-lg-scale {\n -o-object-fit: scale-down !important;\n object-fit: scale-down !important;\n }\n\n .object-fit-lg-none {\n -o-object-fit: none !important;\n object-fit: none !important;\n }\n\n .d-lg-inline {\n display: inline !important;\n }\n\n .d-lg-inline-block {\n display: inline-block !important;\n }\n\n .d-lg-block {\n display: block !important;\n }\n\n .d-lg-grid {\n display: grid !important;\n }\n\n .d-lg-inline-grid {\n display: inline-grid !important;\n }\n\n .d-lg-table {\n display: table !important;\n }\n\n .d-lg-table-row {\n display: table-row !important;\n }\n\n .d-lg-table-cell {\n display: table-cell !important;\n }\n\n .d-lg-flex {\n display: flex !important;\n }\n\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n\n .d-lg-none {\n display: none !important;\n }\n\n .flex-lg-fill {\n flex: auto !important;\n }\n\n .flex-lg-row {\n flex-direction: row !important;\n }\n\n .flex-lg-column {\n flex-direction: column !important;\n }\n\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n\n .justify-content-lg-center {\n justify-content: center !important;\n }\n\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n\n .align-items-lg-center {\n align-items: center !important;\n }\n\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n\n .align-content-lg-center {\n align-content: center !important;\n }\n\n .align-content-lg-between {\n align-content: space-between !important;\n }\n\n .align-content-lg-around {\n align-content: space-around !important;\n }\n\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n\n .align-self-lg-auto {\n align-self: auto !important;\n }\n\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n\n .align-self-lg-center {\n align-self: center !important;\n }\n\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n\n .order-lg-first {\n order: -1 !important;\n }\n\n .order-lg-0 {\n order: 0 !important;\n }\n\n .order-lg-1 {\n order: 1 !important;\n }\n\n .order-lg-2 {\n order: 2 !important;\n }\n\n .order-lg-3 {\n order: 3 !important;\n }\n\n .order-lg-4 {\n order: 4 !important;\n }\n\n .order-lg-5 {\n order: 5 !important;\n }\n\n .order-lg-last {\n order: 6 !important;\n }\n\n .m-lg-0 {\n margin: 0 !important;\n }\n\n .m-lg-1 {\n margin: .25rem !important;\n }\n\n .m-lg-2 {\n margin: .5rem !important;\n }\n\n .m-lg-3 {\n margin: 1rem !important;\n }\n\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n\n .m-lg-5 {\n margin: 3rem !important;\n }\n\n .m-lg-auto {\n margin: auto !important;\n }\n\n .mx-lg-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n\n .mx-lg-1 {\n margin-left: .25rem !important;\n margin-right: .25rem !important;\n }\n\n .mx-lg-2 {\n margin-left: .5rem !important;\n margin-right: .5rem !important;\n }\n\n .mx-lg-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n\n .mx-lg-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n\n .mx-lg-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n\n .my-lg-1 {\n margin-top: .25rem !important;\n margin-bottom: .25rem !important;\n }\n\n .my-lg-2 {\n margin-top: .5rem !important;\n margin-bottom: .5rem !important;\n }\n\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n\n .mt-lg-1 {\n margin-top: .25rem !important;\n }\n\n .mt-lg-2 {\n margin-top: .5rem !important;\n }\n\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n\n .mt-lg-auto {\n margin-top: auto !important;\n }\n\n .me-lg-0 {\n margin-right: 0 !important;\n }\n\n .me-lg-1 {\n margin-right: .25rem !important;\n }\n\n .me-lg-2 {\n margin-right: .5rem !important;\n }\n\n .me-lg-3 {\n margin-right: 1rem !important;\n }\n\n .me-lg-4 {\n margin-right: 1.5rem !important;\n }\n\n .me-lg-5 {\n margin-right: 3rem !important;\n }\n\n .me-lg-auto {\n margin-right: auto !important;\n }\n\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n\n .mb-lg-1 {\n margin-bottom: .25rem !important;\n }\n\n .mb-lg-2 {\n margin-bottom: .5rem !important;\n }\n\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n\n .ms-lg-0 {\n margin-left: 0 !important;\n }\n\n .ms-lg-1 {\n margin-left: .25rem !important;\n }\n\n .ms-lg-2 {\n margin-left: .5rem !important;\n }\n\n .ms-lg-3 {\n margin-left: 1rem !important;\n }\n\n .ms-lg-4 {\n margin-left: 1.5rem !important;\n }\n\n .ms-lg-5 {\n margin-left: 3rem !important;\n }\n\n .ms-lg-auto {\n margin-left: auto !important;\n }\n\n .p-lg-0 {\n padding: 0 !important;\n }\n\n .p-lg-1 {\n padding: .25rem !important;\n }\n\n .p-lg-2 {\n padding: .5rem !important;\n }\n\n .p-lg-3 {\n padding: 1rem !important;\n }\n\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n\n .p-lg-5 {\n padding: 3rem !important;\n }\n\n .px-lg-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n\n .px-lg-1 {\n padding-left: .25rem !important;\n padding-right: .25rem !important;\n }\n\n .px-lg-2 {\n padding-left: .5rem !important;\n padding-right: .5rem !important;\n }\n\n .px-lg-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n\n .px-lg-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n\n .px-lg-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .py-lg-1 {\n padding-top: .25rem !important;\n padding-bottom: .25rem !important;\n }\n\n .py-lg-2 {\n padding-top: .5rem !important;\n padding-bottom: .5rem !important;\n }\n\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n\n .pt-lg-1 {\n padding-top: .25rem !important;\n }\n\n .pt-lg-2 {\n padding-top: .5rem !important;\n }\n\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n\n .pe-lg-0 {\n padding-right: 0 !important;\n }\n\n .pe-lg-1 {\n padding-right: .25rem !important;\n }\n\n .pe-lg-2 {\n padding-right: .5rem !important;\n }\n\n .pe-lg-3 {\n padding-right: 1rem !important;\n }\n\n .pe-lg-4 {\n padding-right: 1.5rem !important;\n }\n\n .pe-lg-5 {\n padding-right: 3rem !important;\n }\n\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n\n .pb-lg-1 {\n padding-bottom: .25rem !important;\n }\n\n .pb-lg-2 {\n padding-bottom: .5rem !important;\n }\n\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n\n .ps-lg-0 {\n padding-left: 0 !important;\n }\n\n .ps-lg-1 {\n padding-left: .25rem !important;\n }\n\n .ps-lg-2 {\n padding-left: .5rem !important;\n }\n\n .ps-lg-3 {\n padding-left: 1rem !important;\n }\n\n .ps-lg-4 {\n padding-left: 1.5rem !important;\n }\n\n .ps-lg-5 {\n padding-left: 3rem !important;\n }\n\n .gap-lg-0 {\n gap: 0 !important;\n }\n\n .gap-lg-1 {\n gap: .25rem !important;\n }\n\n .gap-lg-2 {\n gap: .5rem !important;\n }\n\n .gap-lg-3 {\n gap: 1rem !important;\n }\n\n .gap-lg-4 {\n gap: 1.5rem !important;\n }\n\n .gap-lg-5 {\n gap: 3rem !important;\n }\n\n .row-gap-lg-0 {\n row-gap: 0 !important;\n }\n\n .row-gap-lg-1 {\n row-gap: .25rem !important;\n }\n\n .row-gap-lg-2 {\n row-gap: .5rem !important;\n }\n\n .row-gap-lg-3 {\n row-gap: 1rem !important;\n }\n\n .row-gap-lg-4 {\n row-gap: 1.5rem !important;\n }\n\n .row-gap-lg-5 {\n row-gap: 3rem !important;\n }\n\n .column-gap-lg-0 {\n -moz-column-gap: 0 !important;\n column-gap: 0 !important;\n }\n\n .column-gap-lg-1 {\n -moz-column-gap: .25rem !important;\n column-gap: .25rem !important;\n }\n\n .column-gap-lg-2 {\n -moz-column-gap: .5rem !important;\n column-gap: .5rem !important;\n }\n\n .column-gap-lg-3 {\n -moz-column-gap: 1rem !important;\n column-gap: 1rem !important;\n }\n\n .column-gap-lg-4 {\n -moz-column-gap: 1.5rem !important;\n column-gap: 1.5rem !important;\n }\n\n .column-gap-lg-5 {\n -moz-column-gap: 3rem !important;\n column-gap: 3rem !important;\n }\n\n .text-lg-start {\n text-align: left !important;\n }\n\n .text-lg-end {\n text-align: right !important;\n }\n\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (width >= 1200px) {\n .float-xl-start {\n float: left !important;\n }\n\n .float-xl-end {\n float: right !important;\n }\n\n .float-xl-none {\n float: none !important;\n }\n\n .object-fit-xl-contain {\n -o-object-fit: contain !important;\n object-fit: contain !important;\n }\n\n .object-fit-xl-cover {\n -o-object-fit: cover !important;\n object-fit: cover !important;\n }\n\n .object-fit-xl-fill {\n -o-object-fit: fill !important;\n object-fit: fill !important;\n }\n\n .object-fit-xl-scale {\n -o-object-fit: scale-down !important;\n object-fit: scale-down !important;\n }\n\n .object-fit-xl-none {\n -o-object-fit: none !important;\n object-fit: none !important;\n }\n\n .d-xl-inline {\n display: inline !important;\n }\n\n .d-xl-inline-block {\n display: inline-block !important;\n }\n\n .d-xl-block {\n display: block !important;\n }\n\n .d-xl-grid {\n display: grid !important;\n }\n\n .d-xl-inline-grid {\n display: inline-grid !important;\n }\n\n .d-xl-table {\n display: table !important;\n }\n\n .d-xl-table-row {\n display: table-row !important;\n }\n\n .d-xl-table-cell {\n display: table-cell !important;\n }\n\n .d-xl-flex {\n display: flex !important;\n }\n\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n\n .d-xl-none {\n display: none !important;\n }\n\n .flex-xl-fill {\n flex: auto !important;\n }\n\n .flex-xl-row {\n flex-direction: row !important;\n }\n\n .flex-xl-column {\n flex-direction: column !important;\n }\n\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n\n .justify-content-xl-center {\n justify-content: center !important;\n }\n\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n\n .align-items-xl-center {\n align-items: center !important;\n }\n\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n\n .align-content-xl-center {\n align-content: center !important;\n }\n\n .align-content-xl-between {\n align-content: space-between !important;\n }\n\n .align-content-xl-around {\n align-content: space-around !important;\n }\n\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n\n .align-self-xl-auto {\n align-self: auto !important;\n }\n\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n\n .align-self-xl-center {\n align-self: center !important;\n }\n\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n\n .order-xl-first {\n order: -1 !important;\n }\n\n .order-xl-0 {\n order: 0 !important;\n }\n\n .order-xl-1 {\n order: 1 !important;\n }\n\n .order-xl-2 {\n order: 2 !important;\n }\n\n .order-xl-3 {\n order: 3 !important;\n }\n\n .order-xl-4 {\n order: 4 !important;\n }\n\n .order-xl-5 {\n order: 5 !important;\n }\n\n .order-xl-last {\n order: 6 !important;\n }\n\n .m-xl-0 {\n margin: 0 !important;\n }\n\n .m-xl-1 {\n margin: .25rem !important;\n }\n\n .m-xl-2 {\n margin: .5rem !important;\n }\n\n .m-xl-3 {\n margin: 1rem !important;\n }\n\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n\n .m-xl-5 {\n margin: 3rem !important;\n }\n\n .m-xl-auto {\n margin: auto !important;\n }\n\n .mx-xl-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n\n .mx-xl-1 {\n margin-left: .25rem !important;\n margin-right: .25rem !important;\n }\n\n .mx-xl-2 {\n margin-left: .5rem !important;\n margin-right: .5rem !important;\n }\n\n .mx-xl-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n\n .mx-xl-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n\n .mx-xl-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n\n .my-xl-1 {\n margin-top: .25rem !important;\n margin-bottom: .25rem !important;\n }\n\n .my-xl-2 {\n margin-top: .5rem !important;\n margin-bottom: .5rem !important;\n }\n\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n\n .mt-xl-1 {\n margin-top: .25rem !important;\n }\n\n .mt-xl-2 {\n margin-top: .5rem !important;\n }\n\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n\n .mt-xl-auto {\n margin-top: auto !important;\n }\n\n .me-xl-0 {\n margin-right: 0 !important;\n }\n\n .me-xl-1 {\n margin-right: .25rem !important;\n }\n\n .me-xl-2 {\n margin-right: .5rem !important;\n }\n\n .me-xl-3 {\n margin-right: 1rem !important;\n }\n\n .me-xl-4 {\n margin-right: 1.5rem !important;\n }\n\n .me-xl-5 {\n margin-right: 3rem !important;\n }\n\n .me-xl-auto {\n margin-right: auto !important;\n }\n\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n\n .mb-xl-1 {\n margin-bottom: .25rem !important;\n }\n\n .mb-xl-2 {\n margin-bottom: .5rem !important;\n }\n\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n\n .ms-xl-0 {\n margin-left: 0 !important;\n }\n\n .ms-xl-1 {\n margin-left: .25rem !important;\n }\n\n .ms-xl-2 {\n margin-left: .5rem !important;\n }\n\n .ms-xl-3 {\n margin-left: 1rem !important;\n }\n\n .ms-xl-4 {\n margin-left: 1.5rem !important;\n }\n\n .ms-xl-5 {\n margin-left: 3rem !important;\n }\n\n .ms-xl-auto {\n margin-left: auto !important;\n }\n\n .p-xl-0 {\n padding: 0 !important;\n }\n\n .p-xl-1 {\n padding: .25rem !important;\n }\n\n .p-xl-2 {\n padding: .5rem !important;\n }\n\n .p-xl-3 {\n padding: 1rem !important;\n }\n\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n\n .p-xl-5 {\n padding: 3rem !important;\n }\n\n .px-xl-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n\n .px-xl-1 {\n padding-left: .25rem !important;\n padding-right: .25rem !important;\n }\n\n .px-xl-2 {\n padding-left: .5rem !important;\n padding-right: .5rem !important;\n }\n\n .px-xl-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n\n .px-xl-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n\n .px-xl-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .py-xl-1 {\n padding-top: .25rem !important;\n padding-bottom: .25rem !important;\n }\n\n .py-xl-2 {\n padding-top: .5rem !important;\n padding-bottom: .5rem !important;\n }\n\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n\n .pt-xl-1 {\n padding-top: .25rem !important;\n }\n\n .pt-xl-2 {\n padding-top: .5rem !important;\n }\n\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n\n .pe-xl-0 {\n padding-right: 0 !important;\n }\n\n .pe-xl-1 {\n padding-right: .25rem !important;\n }\n\n .pe-xl-2 {\n padding-right: .5rem !important;\n }\n\n .pe-xl-3 {\n padding-right: 1rem !important;\n }\n\n .pe-xl-4 {\n padding-right: 1.5rem !important;\n }\n\n .pe-xl-5 {\n padding-right: 3rem !important;\n }\n\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n\n .pb-xl-1 {\n padding-bottom: .25rem !important;\n }\n\n .pb-xl-2 {\n padding-bottom: .5rem !important;\n }\n\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n\n .ps-xl-0 {\n padding-left: 0 !important;\n }\n\n .ps-xl-1 {\n padding-left: .25rem !important;\n }\n\n .ps-xl-2 {\n padding-left: .5rem !important;\n }\n\n .ps-xl-3 {\n padding-left: 1rem !important;\n }\n\n .ps-xl-4 {\n padding-left: 1.5rem !important;\n }\n\n .ps-xl-5 {\n padding-left: 3rem !important;\n }\n\n .gap-xl-0 {\n gap: 0 !important;\n }\n\n .gap-xl-1 {\n gap: .25rem !important;\n }\n\n .gap-xl-2 {\n gap: .5rem !important;\n }\n\n .gap-xl-3 {\n gap: 1rem !important;\n }\n\n .gap-xl-4 {\n gap: 1.5rem !important;\n }\n\n .gap-xl-5 {\n gap: 3rem !important;\n }\n\n .row-gap-xl-0 {\n row-gap: 0 !important;\n }\n\n .row-gap-xl-1 {\n row-gap: .25rem !important;\n }\n\n .row-gap-xl-2 {\n row-gap: .5rem !important;\n }\n\n .row-gap-xl-3 {\n row-gap: 1rem !important;\n }\n\n .row-gap-xl-4 {\n row-gap: 1.5rem !important;\n }\n\n .row-gap-xl-5 {\n row-gap: 3rem !important;\n }\n\n .column-gap-xl-0 {\n -moz-column-gap: 0 !important;\n column-gap: 0 !important;\n }\n\n .column-gap-xl-1 {\n -moz-column-gap: .25rem !important;\n column-gap: .25rem !important;\n }\n\n .column-gap-xl-2 {\n -moz-column-gap: .5rem !important;\n column-gap: .5rem !important;\n }\n\n .column-gap-xl-3 {\n -moz-column-gap: 1rem !important;\n column-gap: 1rem !important;\n }\n\n .column-gap-xl-4 {\n -moz-column-gap: 1.5rem !important;\n column-gap: 1.5rem !important;\n }\n\n .column-gap-xl-5 {\n -moz-column-gap: 3rem !important;\n column-gap: 3rem !important;\n }\n\n .text-xl-start {\n text-align: left !important;\n }\n\n .text-xl-end {\n text-align: right !important;\n }\n\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n@media (width >= 1400px) {\n .float-xxl-start {\n float: left !important;\n }\n\n .float-xxl-end {\n float: right !important;\n }\n\n .float-xxl-none {\n float: none !important;\n }\n\n .object-fit-xxl-contain {\n -o-object-fit: contain !important;\n object-fit: contain !important;\n }\n\n .object-fit-xxl-cover {\n -o-object-fit: cover !important;\n object-fit: cover !important;\n }\n\n .object-fit-xxl-fill {\n -o-object-fit: fill !important;\n object-fit: fill !important;\n }\n\n .object-fit-xxl-scale {\n -o-object-fit: scale-down !important;\n object-fit: scale-down !important;\n }\n\n .object-fit-xxl-none {\n -o-object-fit: none !important;\n object-fit: none !important;\n }\n\n .d-xxl-inline {\n display: inline !important;\n }\n\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n\n .d-xxl-block {\n display: block !important;\n }\n\n .d-xxl-grid {\n display: grid !important;\n }\n\n .d-xxl-inline-grid {\n display: inline-grid !important;\n }\n\n .d-xxl-table {\n display: table !important;\n }\n\n .d-xxl-table-row {\n display: table-row !important;\n }\n\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n\n .d-xxl-flex {\n display: flex !important;\n }\n\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n\n .d-xxl-none {\n display: none !important;\n }\n\n .flex-xxl-fill {\n flex: auto !important;\n }\n\n .flex-xxl-row {\n flex-direction: row !important;\n }\n\n .flex-xxl-column {\n flex-direction: column !important;\n }\n\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n\n .align-items-xxl-center {\n align-items: center !important;\n }\n\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n\n .align-content-xxl-center {\n align-content: center !important;\n }\n\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n\n .align-self-xxl-center {\n align-self: center !important;\n }\n\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n\n .order-xxl-first {\n order: -1 !important;\n }\n\n .order-xxl-0 {\n order: 0 !important;\n }\n\n .order-xxl-1 {\n order: 1 !important;\n }\n\n .order-xxl-2 {\n order: 2 !important;\n }\n\n .order-xxl-3 {\n order: 3 !important;\n }\n\n .order-xxl-4 {\n order: 4 !important;\n }\n\n .order-xxl-5 {\n order: 5 !important;\n }\n\n .order-xxl-last {\n order: 6 !important;\n }\n\n .m-xxl-0 {\n margin: 0 !important;\n }\n\n .m-xxl-1 {\n margin: .25rem !important;\n }\n\n .m-xxl-2 {\n margin: .5rem !important;\n }\n\n .m-xxl-3 {\n margin: 1rem !important;\n }\n\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n\n .m-xxl-5 {\n margin: 3rem !important;\n }\n\n .m-xxl-auto {\n margin: auto !important;\n }\n\n .mx-xxl-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n\n .mx-xxl-1 {\n margin-left: .25rem !important;\n margin-right: .25rem !important;\n }\n\n .mx-xxl-2 {\n margin-left: .5rem !important;\n margin-right: .5rem !important;\n }\n\n .mx-xxl-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n\n .mx-xxl-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n\n .mx-xxl-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n\n .mx-xxl-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n\n .my-xxl-1 {\n margin-top: .25rem !important;\n margin-bottom: .25rem !important;\n }\n\n .my-xxl-2 {\n margin-top: .5rem !important;\n margin-bottom: .5rem !important;\n }\n\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n\n .mt-xxl-1 {\n margin-top: .25rem !important;\n }\n\n .mt-xxl-2 {\n margin-top: .5rem !important;\n }\n\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n\n .me-xxl-0 {\n margin-right: 0 !important;\n }\n\n .me-xxl-1 {\n margin-right: .25rem !important;\n }\n\n .me-xxl-2 {\n margin-right: .5rem !important;\n }\n\n .me-xxl-3 {\n margin-right: 1rem !important;\n }\n\n .me-xxl-4 {\n margin-right: 1.5rem !important;\n }\n\n .me-xxl-5 {\n margin-right: 3rem !important;\n }\n\n .me-xxl-auto {\n margin-right: auto !important;\n }\n\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n\n .mb-xxl-1 {\n margin-bottom: .25rem !important;\n }\n\n .mb-xxl-2 {\n margin-bottom: .5rem !important;\n }\n\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n\n .ms-xxl-0 {\n margin-left: 0 !important;\n }\n\n .ms-xxl-1 {\n margin-left: .25rem !important;\n }\n\n .ms-xxl-2 {\n margin-left: .5rem !important;\n }\n\n .ms-xxl-3 {\n margin-left: 1rem !important;\n }\n\n .ms-xxl-4 {\n margin-left: 1.5rem !important;\n }\n\n .ms-xxl-5 {\n margin-left: 3rem !important;\n }\n\n .ms-xxl-auto {\n margin-left: auto !important;\n }\n\n .p-xxl-0 {\n padding: 0 !important;\n }\n\n .p-xxl-1 {\n padding: .25rem !important;\n }\n\n .p-xxl-2 {\n padding: .5rem !important;\n }\n\n .p-xxl-3 {\n padding: 1rem !important;\n }\n\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n\n .p-xxl-5 {\n padding: 3rem !important;\n }\n\n .px-xxl-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n\n .px-xxl-1 {\n padding-left: .25rem !important;\n padding-right: .25rem !important;\n }\n\n .px-xxl-2 {\n padding-left: .5rem !important;\n padding-right: .5rem !important;\n }\n\n .px-xxl-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n\n .px-xxl-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n\n .px-xxl-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .py-xxl-1 {\n padding-top: .25rem !important;\n padding-bottom: .25rem !important;\n }\n\n .py-xxl-2 {\n padding-top: .5rem !important;\n padding-bottom: .5rem !important;\n }\n\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n\n .pt-xxl-1 {\n padding-top: .25rem !important;\n }\n\n .pt-xxl-2 {\n padding-top: .5rem !important;\n }\n\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n\n .pe-xxl-0 {\n padding-right: 0 !important;\n }\n\n .pe-xxl-1 {\n padding-right: .25rem !important;\n }\n\n .pe-xxl-2 {\n padding-right: .5rem !important;\n }\n\n .pe-xxl-3 {\n padding-right: 1rem !important;\n }\n\n .pe-xxl-4 {\n padding-right: 1.5rem !important;\n }\n\n .pe-xxl-5 {\n padding-right: 3rem !important;\n }\n\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n\n .pb-xxl-1 {\n padding-bottom: .25rem !important;\n }\n\n .pb-xxl-2 {\n padding-bottom: .5rem !important;\n }\n\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n\n .ps-xxl-0 {\n padding-left: 0 !important;\n }\n\n .ps-xxl-1 {\n padding-left: .25rem !important;\n }\n\n .ps-xxl-2 {\n padding-left: .5rem !important;\n }\n\n .ps-xxl-3 {\n padding-left: 1rem !important;\n }\n\n .ps-xxl-4 {\n padding-left: 1.5rem !important;\n }\n\n .ps-xxl-5 {\n padding-left: 3rem !important;\n }\n\n .gap-xxl-0 {\n gap: 0 !important;\n }\n\n .gap-xxl-1 {\n gap: .25rem !important;\n }\n\n .gap-xxl-2 {\n gap: .5rem !important;\n }\n\n .gap-xxl-3 {\n gap: 1rem !important;\n }\n\n .gap-xxl-4 {\n gap: 1.5rem !important;\n }\n\n .gap-xxl-5 {\n gap: 3rem !important;\n }\n\n .row-gap-xxl-0 {\n row-gap: 0 !important;\n }\n\n .row-gap-xxl-1 {\n row-gap: .25rem !important;\n }\n\n .row-gap-xxl-2 {\n row-gap: .5rem !important;\n }\n\n .row-gap-xxl-3 {\n row-gap: 1rem !important;\n }\n\n .row-gap-xxl-4 {\n row-gap: 1.5rem !important;\n }\n\n .row-gap-xxl-5 {\n row-gap: 3rem !important;\n }\n\n .column-gap-xxl-0 {\n -moz-column-gap: 0 !important;\n column-gap: 0 !important;\n }\n\n .column-gap-xxl-1 {\n -moz-column-gap: .25rem !important;\n column-gap: .25rem !important;\n }\n\n .column-gap-xxl-2 {\n -moz-column-gap: .5rem !important;\n column-gap: .5rem !important;\n }\n\n .column-gap-xxl-3 {\n -moz-column-gap: 1rem !important;\n column-gap: 1rem !important;\n }\n\n .column-gap-xxl-4 {\n -moz-column-gap: 1.5rem !important;\n column-gap: 1.5rem !important;\n }\n\n .column-gap-xxl-5 {\n -moz-column-gap: 3rem !important;\n column-gap: 3rem !important;\n }\n\n .text-xxl-start {\n text-align: left !important;\n }\n\n .text-xxl-end {\n text-align: right !important;\n }\n\n .text-xxl-center {\n text-align: center !important;\n }\n}\n\n@media (width >= 1200px) {\n .fs-1 {\n font-size: 2.5rem !important;\n }\n\n .fs-2 {\n font-size: 2rem !important;\n }\n\n .fs-3 {\n font-size: 1.75rem !important;\n }\n\n .fs-4 {\n font-size: 1.5rem !important;\n }\n}\n\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n\n .d-print-inline-block {\n display: inline-block !important;\n }\n\n .d-print-block {\n display: block !important;\n }\n\n .d-print-grid {\n display: grid !important;\n }\n\n .d-print-inline-grid {\n display: inline-grid !important;\n }\n\n .d-print-table {\n display: table !important;\n }\n\n .d-print-table-row {\n display: table-row !important;\n }\n\n .d-print-table-cell {\n display: table-cell !important;\n }\n\n .d-print-flex {\n display: flex !important;\n }\n\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n\n .d-print-none {\n display: none !important;\n }\n}\n\n:root {\n --body-bg-color: #eae9e9;\n --body-color: #212529;\n --move-btn-width: 60px;\n --move-btn-height: 34px;\n --focus-ring: 0 0 0 .2rem var(--bs-focus-ring-color);\n --focus-ring-error: 0 0 0 .2rem rgba(var(--bs-danger-rgb), .4);\n accent-color: var(--bs-primary);\n font-size: 14px;\n}\n\n:not(:defined) {\n display: none !important;\n}\n\nbody {\n background-color: var(--body-bg-color);\n overflow-x: hidden;\n}\n\n[hidden] {\n display: none !important;\n}\n\na:focus-visible, details summary:focus-visible {\n border-radius: var(--bs-border-radius);\n box-shadow: var(--focus-ring);\n outline: 0;\n transition: box-shadow .15s ease-in-out;\n}\n\n.container {\n max-width: 1500px;\n}\n\n.site-header {\n text-align: center;\n flex-direction: column;\n align-items: center;\n row-gap: .5rem;\n margin: 3rem .5rem;\n display: flex;\n}\n\n.page-title {\n margin-bottom: 0;\n font-weight: 300;\n}\n\n.form-control:out-of-range {\n border-color: var(--bs-form-invalid-border-color);\n color: var(--bs-form-invalid-color);\n}\n\n.form-control:out-of-range:focus {\n box-shadow: var(--focus-ring-error);\n}\n\n.canvas {\n max-width: 100%;\n display: block;\n}\n\n.textboxes-container input[type=\"color\"], .settings-button, .duplicate-button {\n cursor: pointer;\n width: 30px;\n min-width: 30px;\n height: 30px;\n margin: 0 2px;\n padding: 0;\n line-height: 1;\n}\n\n.textboxes-container .meme-text {\n scrollbar-width: thin;\n field-sizing: content;\n min-width: 0;\n min-height: calc(1.5em + .75rem + 2px);\n max-height: 60px;\n margin: .5rem;\n overflow-x: hidden;\n}\n\n#maxImageDimensionsForm select:disabled {\n text-indent: -9999px;\n opacity: .7;\n}\n\n.settings-button {\n background-image: url(\"gear.b3b5d1a5.svg\");\n background-position: center;\n background-repeat: no-repeat;\n background-size: 64%;\n}\n\n.clear-canvas-button {\n justify-content: center;\n align-items: center;\n padding: .375rem;\n transition: opacity .15s ease-in-out, visibility .15s ease-in-out;\n display: inline-flex;\n position: absolute;\n top: .5rem;\n left: .5rem;\n}\n\n@media (hover: hover) {\n .clear-canvas-button {\n opacity: 0;\n visibility: hidden;\n }\n\n .dropzone:hover .clear-canvas-button {\n opacity: 1;\n visibility: visible;\n }\n}\n\n.textboxes-container {\n flex: 1;\n}\n\n.textboxes-container:empty {\n display: none;\n}\n\n.instructions {\n text-align: center;\n text-wrap: balance;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n row-gap: 1rem;\n height: 100%;\n min-height: 200px;\n padding: 1rem;\n display: flex;\n}\n\n.errors-container {\n z-index: 1051;\n pointer-events: none;\n width: 100%;\n position: fixed;\n top: 0;\n left: 0;\n}\n\n.errors-container .alert {\n pointer-events: all;\n}\n\ndetails > summary {\n transition: margin .1s ease-out;\n}\n\ndetails[open] > summary {\n margin-bottom: .5rem;\n}\n\nbutton[data-button=\"duplicate-text-box\"], button[data-button=\"delete-text-box\"] {\n background-position: center;\n background-repeat: no-repeat;\n background-size: 90%;\n width: 28px;\n min-width: 28px;\n height: 28px;\n margin-inline-start: .5rem;\n padding: 0;\n}\n\nbutton[data-button=\"duplicate-text-box\"] {\n background-image: url(\"duplicate.04d08287.svg\");\n background-size: 70%;\n}\n\nbutton[data-button=\"delete-text-box\"] {\n background-image: url(\"trash.d9edab78.svg\");\n margin-inline-start: .25rem;\n}\n\n.gallery {\n scroll-behavior: smooth;\n gap: .5rem;\n min-height: 112px;\n margin: 0;\n padding: .25rem 0;\n display: flex;\n overflow-x: auto;\n}\n\n.gallery > button {\n cursor: pointer;\n padding: 0;\n}\n\n.gallery > button > img {\n border-radius: var(--bs-border-radius);\n object-fit: cover;\n min-width: 88px;\n height: 88px;\n display: block;\n}\n\n.gallery__no-results {\n text-align: center;\n flex: 1;\n justify-content: center;\n align-items: center;\n display: flex;\n}\n\n.move-text-actions {\n width: calc(var(--move-btn-width) * 3);\n height: calc(var(--move-btn-height) * 2);\n margin: 0 auto;\n position: relative;\n}\n\n.move-text-actions > button {\n width: var(--move-btn-width);\n height: var(--move-btn-height);\n background-position: center;\n background-repeat: no-repeat;\n position: absolute;\n}\n\n.move-text-actions > [aria-label=\"Up\"] {\n top: -1px;\n left: var(--move-btn-width);\n background-image: url(\"chevron-up.f532d8b6.svg\");\n}\n\n.move-text-actions > [aria-label=\"Down\"] {\n top: calc(var(--move-btn-height) + 1px);\n left: var(--move-btn-width);\n background-image: url(\"chevron-down.ad14d981.svg\");\n}\n\n.move-text-actions > [aria-label=\"Left\"] {\n top: calc(var(--move-btn-height) / 2);\n background-image: url(\"chevron-left.20a2f252.svg\");\n left: -2px;\n}\n\n.move-text-actions > [aria-label=\"Right\"] {\n top: calc(var(--move-btn-height) / 2);\n left: calc(var(--move-btn-width) * 2 + 2px);\n background-image: url(\"chevron-right.1be074ac.svg\");\n}\n\ncapture-photo {\n position: relative;\n overflow: hidden;\n}\n\ncapture-photo::part(capture-button) {\n display: none;\n}\n\ncapture-photo::part(video) {\n border-radius: calc(var(--bs-border-radius) / 2);\n width: 100%;\n}\n\ncapture-photo[loading]::part(video) {\n background-color: #000;\n background-image: url(\"spinner.4452ed29.svg\");\n background-position: center;\n background-repeat: no-repeat;\n background-size: 60px;\n}\n\ncapture-photo [slot=\"actions\"] {\n justify-content: space-between;\n gap: .5rem;\n width: 100%;\n padding: .5rem;\n display: flex;\n position: absolute;\n top: 0;\n left: 0;\n}\n\ncapture-photo[loading] [slot=\"actions\"] {\n display: none !important;\n}\n\nmodal-element {\n --me-width: fit-content;\n --me-border-radius: var(--bs-border-radius);\n --me-border-width: 0;\n --me-box-shadow: 0 0 1rem 0 #0000004d;\n}\n\n#videoModal {\n --me-width: 600px;\n}\n\n#videoModal::part(footer) {\n padding-block: 0;\n}\n\n#videoModal:has(capture-photo[loading]) #capturePhotoButton {\n pointer-events: none;\n opacity: .7;\n}\n\n#downloadModal {\n --me-width: 800px;\n}\n\nmodal-element::part(base):focus-visible {\n outline: 0;\n}\n\nmodal-element [slot=\"header\"] {\n color: var(--body-color);\n margin: 0;\n}\n\nmodal-element::part(close) {\n color: var(--body-color);\n border-radius: var(--bs-border-radius);\n transition: box-shadow .15s ease-in-out;\n}\n\nmodal-element::part(close):focus-visible {\n box-shadow: var(--focus-ring);\n outline: 0;\n}\n\nmodal-element::part(body) {\n padding-block: 0;\n}\n\nmodal-element [slot=\"footer\"] {\n text-align: center;\n flex-wrap: wrap;\n justify-content: center;\n align-items: center;\n gap: .25rem;\n display: flex;\n}\n\n.dropzone {\n --dropzone-border-color: var(--bs-secondary);\n --dropzone-border-color-hover: var(--bs-primary);\n --dropzone-border-color-dragover: var(--bs-primary);\n --dropzone-background-color-hover: var(--bs-light);\n --dropzone-background-color-dragover: var(--bs-light);\n --dropzone-focus-box-shadow: var(--focus-ring);\n height: 100%;\n position: relative;\n}\n\n@media screen and (width >= 768px) {\n .dropzone {\n position: sticky;\n top: .25rem;\n }\n}\n\n.dropzone:not(.dropzone--accepted) {\n max-height: 41rem;\n}\n\n.dropzone--accepted {\n width: fit-content;\n height: fit-content;\n}\n\n.dropzone::part(dropzone) {\n height: 100%;\n padding: 0;\n}\n\n.dropzone[disabled]::part(dropzone) {\n opacity: 1;\n cursor: default;\n}\n\n.emoji-picker-details {\n background-color: var(--bs-gray-200);\n border-radius: var(--bs-border-radius);\n margin-bottom: .5rem;\n}\n\n.emoji-picker-details > summary {\n background-color: var(--bs-gray-300);\n border: 1px solid var(--bs-gray-300);\n border-radius: var(--bs-border-radius);\n cursor: pointer;\n padding: .5rem 1rem;\n}\n\n.emoji-picker-details[open] > summary {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\nemoji-picker {\n --border-color: var(--bs-border-color);\n --background: #fff;\n --input-border-color: var(--bs-border-color);\n --input-border-radius: var(--bs-border-radius);\n --input-padding: .375rem .75rem;\n --outline-color: #0d6efd40;\n --outline-size: 4px;\n --indicator-color: var(--bs-primary);\n --button-hover-background: var(--bs-gray-300);\n border: 0;\n width: 100%;\n height: 255px;\n padding: 0 .5rem .5rem;\n}\n\n.text-underline {\n text-decoration: underline;\n}\n/*# sourceMappingURL=index.b4cc57ad.css.map */\n","@import \"21a514f06f6a8680\";\n@import \"3a1924335aad49b3\";\n",":root,\n[data-bs-theme=\"light\"] {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n @each $color, $value in $theme-colors-text {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{inspect($font-family-base)};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n\n --#{$prefix}body-color: #{$body-color};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg: #{$body-bg};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg)};\n // scss-docs-end root-body-variables\n\n --#{$prefix}heading-color: #{$headings-color};\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color)};\n --#{$prefix}link-decoration: #{$link-decoration};\n\n --#{$prefix}link-hover-color: #{$link-hover-color};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color)};\n\n @if $link-hover-decoration != null {\n --#{$prefix}link-hover-decoration: #{$link-hover-decoration};\n }\n\n --#{$prefix}code-color: #{$code-color};\n --#{$prefix}highlight-color: #{$mark-color};\n --#{$prefix}highlight-bg: #{$mark-bg};\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-xxl: #{$border-radius-xxl};\n --#{$prefix}border-radius-2xl: var(--#{$prefix}border-radius-xxl); // Deprecated in v5.3.0 for consistency\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}box-shadow: #{$box-shadow};\n --#{$prefix}box-shadow-sm: #{$box-shadow-sm};\n --#{$prefix}box-shadow-lg: #{$box-shadow-lg};\n --#{$prefix}box-shadow-inset: #{$box-shadow-inset};\n\n // Focus styles\n // scss-docs-start root-focus-variables\n --#{$prefix}focus-ring-width: #{$focus-ring-width};\n --#{$prefix}focus-ring-opacity: #{$focus-ring-opacity};\n --#{$prefix}focus-ring-color: #{$focus-ring-color};\n // scss-docs-end root-focus-variables\n\n // scss-docs-start root-form-validation-variables\n --#{$prefix}form-valid-color: #{$form-valid-color};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color};\n --#{$prefix}form-invalid-color: #{$form-invalid-color};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color};\n // scss-docs-end root-form-validation-variables\n}\n\n@if $enable-dark-mode {\n @include color-mode(dark, true) {\n color-scheme: dark;\n\n // scss-docs-start root-dark-mode-vars\n --#{$prefix}body-color: #{$body-color-dark};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color-dark)};\n --#{$prefix}body-bg: #{$body-bg-dark};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg-dark)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color-dark};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color-dark)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color-dark};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color-dark)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg-dark};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg-dark)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color-dark};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg-dark};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)};\n\n @each $color, $value in $theme-colors-text-dark {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle-dark {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle-dark {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}heading-color: #{$headings-color-dark};\n\n --#{$prefix}link-color: #{$link-color-dark};\n --#{$prefix}link-hover-color: #{$link-hover-color-dark};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color-dark)};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color-dark)};\n\n --#{$prefix}code-color: #{$code-color-dark};\n --#{$prefix}highlight-color: #{$mark-color-dark};\n --#{$prefix}highlight-bg: #{$mark-bg-dark};\n\n --#{$prefix}border-color: #{$border-color-dark};\n --#{$prefix}border-color-translucent: #{$border-color-translucent-dark};\n\n --#{$prefix}form-valid-color: #{$form-valid-color-dark};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color-dark};\n --#{$prefix}form-invalid-color: #{$form-invalid-color-dark};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color-dark};\n // scss-docs-end root-dark-mode-vars\n }\n}\n","// scss-docs-start color-mode-mixin\n@mixin color-mode($mode: light, $root: false) {\n @if $color-mode-type == \"media-query\" {\n @if $root == true {\n @media (prefers-color-scheme: $mode) {\n :root {\n @content;\n }\n }\n } @else {\n @media (prefers-color-scheme: $mode) {\n @content;\n }\n }\n } @else {\n [data-bs-theme=\"#{$mode}\"] {\n @content;\n }\n }\n}\n// scss-docs-end color-mode-mixin\n","@charset \"UTF-8\";\n/*!\n * Bootstrap v5.3.3 (https://getbootstrap.com/)\n * Copyright 2011-2024 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root,\n[data-bs-theme=light] {\n --bs-blue: #0d6efd;\n --bs-indigo: #6610f2;\n --bs-purple: #6f42c1;\n --bs-pink: #d63384;\n --bs-red: #dc3545;\n --bs-orange: #fd7e14;\n --bs-yellow: #ffc107;\n --bs-green: #198754;\n --bs-teal: #20c997;\n --bs-cyan: #0dcaf0;\n --bs-black: #000;\n --bs-white: #fff;\n --bs-gray: #6c757d;\n --bs-gray-dark: #343a40;\n --bs-gray-100: #f8f9fa;\n --bs-gray-200: #e9ecef;\n --bs-gray-300: #dee2e6;\n --bs-gray-400: #ced4da;\n --bs-gray-500: #adb5bd;\n --bs-gray-600: #6c757d;\n --bs-gray-700: #495057;\n --bs-gray-800: #343a40;\n --bs-gray-900: #212529;\n --bs-primary: #0d6efd;\n --bs-secondary: #6c757d;\n --bs-success: #198754;\n --bs-info: #0dcaf0;\n --bs-warning: #ffc107;\n --bs-danger: #dc3545;\n --bs-light: #f8f9fa;\n --bs-dark: #212529;\n --bs-primary-rgb: 13, 110, 253;\n --bs-secondary-rgb: 108, 117, 125;\n --bs-success-rgb: 25, 135, 84;\n --bs-info-rgb: 13, 202, 240;\n --bs-warning-rgb: 255, 193, 7;\n --bs-danger-rgb: 220, 53, 69;\n --bs-light-rgb: 248, 249, 250;\n --bs-dark-rgb: 33, 37, 41;\n --bs-primary-text-emphasis: #052c65;\n --bs-secondary-text-emphasis: #2b2f32;\n --bs-success-text-emphasis: #0a3622;\n --bs-info-text-emphasis: #055160;\n --bs-warning-text-emphasis: #664d03;\n --bs-danger-text-emphasis: #58151c;\n --bs-light-text-emphasis: #495057;\n --bs-dark-text-emphasis: #495057;\n --bs-primary-bg-subtle: #cfe2ff;\n --bs-secondary-bg-subtle: #e2e3e5;\n --bs-success-bg-subtle: #d1e7dd;\n --bs-info-bg-subtle: #cff4fc;\n --bs-warning-bg-subtle: #fff3cd;\n --bs-danger-bg-subtle: #f8d7da;\n --bs-light-bg-subtle: #fcfcfd;\n --bs-dark-bg-subtle: #ced4da;\n --bs-primary-border-subtle: #9ec5fe;\n --bs-secondary-border-subtle: #c4c8cb;\n --bs-success-border-subtle: #a3cfbb;\n --bs-info-border-subtle: #9eeaf9;\n --bs-warning-border-subtle: #ffe69c;\n --bs-danger-border-subtle: #f1aeb5;\n --bs-light-border-subtle: #e9ecef;\n --bs-dark-border-subtle: #adb5bd;\n --bs-white-rgb: 255, 255, 255;\n --bs-black-rgb: 0, 0, 0;\n --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n --bs-body-font-family: var(--bs-font-sans-serif);\n --bs-body-font-size: 1rem;\n --bs-body-font-weight: 400;\n --bs-body-line-height: 1.5;\n --bs-body-color: #212529;\n --bs-body-color-rgb: 33, 37, 41;\n --bs-body-bg: #fff;\n --bs-body-bg-rgb: 255, 255, 255;\n --bs-emphasis-color: #000;\n --bs-emphasis-color-rgb: 0, 0, 0;\n --bs-secondary-color: rgba(33, 37, 41, 0.75);\n --bs-secondary-color-rgb: 33, 37, 41;\n --bs-secondary-bg: #e9ecef;\n --bs-secondary-bg-rgb: 233, 236, 239;\n --bs-tertiary-color: rgba(33, 37, 41, 0.5);\n --bs-tertiary-color-rgb: 33, 37, 41;\n --bs-tertiary-bg: #f8f9fa;\n --bs-tertiary-bg-rgb: 248, 249, 250;\n --bs-heading-color: inherit;\n --bs-link-color: #0d6efd;\n --bs-link-color-rgb: 13, 110, 253;\n --bs-link-decoration: underline;\n --bs-link-hover-color: #0a58ca;\n --bs-link-hover-color-rgb: 10, 88, 202;\n --bs-code-color: #d63384;\n --bs-highlight-color: #212529;\n --bs-highlight-bg: #fff3cd;\n --bs-border-width: 1px;\n --bs-border-style: solid;\n --bs-border-color: #dee2e6;\n --bs-border-color-translucent: rgba(0, 0, 0, 0.175);\n --bs-border-radius: 0.375rem;\n --bs-border-radius-sm: 0.25rem;\n --bs-border-radius-lg: 0.5rem;\n --bs-border-radius-xl: 1rem;\n --bs-border-radius-xxl: 2rem;\n --bs-border-radius-2xl: var(--bs-border-radius-xxl);\n --bs-border-radius-pill: 50rem;\n --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);\n --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);\n --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);\n --bs-focus-ring-width: 0.25rem;\n --bs-focus-ring-opacity: 0.25;\n --bs-focus-ring-color: rgba(13, 110, 253, 0.25);\n --bs-form-valid-color: #198754;\n --bs-form-valid-border-color: #198754;\n --bs-form-invalid-color: #dc3545;\n --bs-form-invalid-border-color: #dc3545;\n}\n\n[data-bs-theme=dark] {\n color-scheme: dark;\n --bs-body-color: #dee2e6;\n --bs-body-color-rgb: 222, 226, 230;\n --bs-body-bg: #212529;\n --bs-body-bg-rgb: 33, 37, 41;\n --bs-emphasis-color: #fff;\n --bs-emphasis-color-rgb: 255, 255, 255;\n --bs-secondary-color: rgba(222, 226, 230, 0.75);\n --bs-secondary-color-rgb: 222, 226, 230;\n --bs-secondary-bg: #343a40;\n --bs-secondary-bg-rgb: 52, 58, 64;\n --bs-tertiary-color: rgba(222, 226, 230, 0.5);\n --bs-tertiary-color-rgb: 222, 226, 230;\n --bs-tertiary-bg: #2b3035;\n --bs-tertiary-bg-rgb: 43, 48, 53;\n --bs-primary-text-emphasis: #6ea8fe;\n --bs-secondary-text-emphasis: #a7acb1;\n --bs-success-text-emphasis: #75b798;\n --bs-info-text-emphasis: #6edff6;\n --bs-warning-text-emphasis: #ffda6a;\n --bs-danger-text-emphasis: #ea868f;\n --bs-light-text-emphasis: #f8f9fa;\n --bs-dark-text-emphasis: #dee2e6;\n --bs-primary-bg-subtle: #031633;\n --bs-secondary-bg-subtle: #161719;\n --bs-success-bg-subtle: #051b11;\n --bs-info-bg-subtle: #032830;\n --bs-warning-bg-subtle: #332701;\n --bs-danger-bg-subtle: #2c0b0e;\n --bs-light-bg-subtle: #343a40;\n --bs-dark-bg-subtle: #1a1d20;\n --bs-primary-border-subtle: #084298;\n --bs-secondary-border-subtle: #41464b;\n --bs-success-border-subtle: #0f5132;\n --bs-info-border-subtle: #087990;\n --bs-warning-border-subtle: #997404;\n --bs-danger-border-subtle: #842029;\n --bs-light-border-subtle: #495057;\n --bs-dark-border-subtle: #343a40;\n --bs-heading-color: inherit;\n --bs-link-color: #6ea8fe;\n --bs-link-hover-color: #8bb9fe;\n --bs-link-color-rgb: 110, 168, 254;\n --bs-link-hover-color-rgb: 139, 185, 254;\n --bs-code-color: #e685b5;\n --bs-highlight-color: #dee2e6;\n --bs-highlight-bg: #664d03;\n --bs-border-color: #495057;\n --bs-border-color-translucent: rgba(255, 255, 255, 0.15);\n --bs-form-valid-color: #75b798;\n --bs-form-valid-border-color: #75b798;\n --bs-form-invalid-color: #ea868f;\n --bs-form-invalid-border-color: #ea868f;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n :root {\n scroll-behavior: smooth;\n }\n}\n\nbody {\n margin: 0;\n font-family: var(--bs-body-font-family);\n font-size: var(--bs-body-font-size);\n font-weight: var(--bs-body-font-weight);\n line-height: var(--bs-body-line-height);\n color: var(--bs-body-color);\n text-align: var(--bs-body-text-align);\n background-color: var(--bs-body-bg);\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nhr {\n margin: 1rem 0;\n color: inherit;\n border: 0;\n border-top: var(--bs-border-width) solid;\n opacity: 0.25;\n}\n\nh6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2;\n color: var(--bs-heading-color);\n}\n\nh1, .h1 {\n font-size: calc(1.375rem + 1.5vw);\n}\n@media (min-width: 1200px) {\n h1, .h1 {\n font-size: 2.5rem;\n }\n}\n\nh2, .h2 {\n font-size: calc(1.325rem + 0.9vw);\n}\n@media (min-width: 1200px) {\n h2, .h2 {\n font-size: 2rem;\n }\n}\n\nh3, .h3 {\n font-size: calc(1.3rem + 0.6vw);\n}\n@media (min-width: 1200px) {\n h3, .h3 {\n font-size: 1.75rem;\n }\n}\n\nh4, .h4 {\n font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n h4, .h4 {\n font-size: 1.5rem;\n }\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title] {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n -webkit-text-decoration-skip-ink: none;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: 0.5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall, .small {\n font-size: 0.875em;\n}\n\nmark, .mark {\n padding: 0.1875em;\n color: var(--bs-highlight-color);\n background-color: var(--bs-highlight-bg);\n}\n\nsub,\nsup {\n position: relative;\n font-size: 0.75em;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\na {\n color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));\n text-decoration: underline;\n}\na:hover {\n --bs-link-color-rgb: var(--bs-link-hover-color-rgb);\n}\n\na:not([href]):not([class]), a:not([href]):not([class]):hover {\n color: inherit;\n text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: var(--bs-font-monospace);\n font-size: 1em;\n}\n\npre {\n display: block;\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n font-size: 0.875em;\n}\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\ncode {\n font-size: 0.875em;\n color: var(--bs-code-color);\n word-wrap: break-word;\n}\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.1875rem 0.375rem;\n font-size: 0.875em;\n color: var(--bs-body-bg);\n background-color: var(--bs-body-color);\n border-radius: 0.25rem;\n}\nkbd kbd {\n padding: 0;\n font-size: 1em;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n color: var(--bs-secondary-color);\n text-align: left;\n}\n\nth {\n text-align: inherit;\n text-align: -webkit-match-parent;\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\nlabel {\n display: inline-block;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\n[role=button] {\n cursor: pointer;\n}\n\nselect {\n word-wrap: normal;\n}\nselect:disabled {\n opacity: 1;\n}\n\n[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {\n display: none !important;\n}\n\nbutton,\n[type=button],\n[type=reset],\n[type=submit] {\n -webkit-appearance: button;\n}\nbutton:not(:disabled),\n[type=button]:not(:disabled),\n[type=reset]:not(:disabled),\n[type=submit]:not(:disabled) {\n cursor: pointer;\n}\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ntextarea {\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n float: left;\n width: 100%;\n padding: 0;\n margin-bottom: 0.5rem;\n font-size: calc(1.275rem + 0.3vw);\n line-height: inherit;\n}\n@media (min-width: 1200px) {\n legend {\n font-size: 1.5rem;\n }\n}\nlegend + * {\n clear: left;\n}\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n padding: 0;\n}\n\n::-webkit-inner-spin-button {\n height: auto;\n}\n\n[type=search] {\n -webkit-appearance: textfield;\n outline-offset: -2px;\n}\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n direction: ltr;\n}\n*/\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-color-swatch-wrapper {\n padding: 0;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\n::file-selector-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\niframe {\n border: 0;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[hidden] {\n display: none !important;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: calc(1.625rem + 4.5vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-1 {\n font-size: 5rem;\n }\n}\n\n.display-2 {\n font-size: calc(1.575rem + 3.9vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-2 {\n font-size: 4.5rem;\n }\n}\n\n.display-3 {\n font-size: calc(1.525rem + 3.3vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-3 {\n font-size: 4rem;\n }\n}\n\n.display-4 {\n font-size: calc(1.475rem + 2.7vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-4 {\n font-size: 3.5rem;\n }\n}\n\n.display-5 {\n font-size: calc(1.425rem + 2.1vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-5 {\n font-size: 3rem;\n }\n}\n\n.display-6 {\n font-size: calc(1.375rem + 1.5vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-6 {\n font-size: 2.5rem;\n }\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n.list-inline-item:not(:last-child) {\n margin-right: 0.5rem;\n}\n\n.initialism {\n font-size: 0.875em;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n.blockquote > :last-child {\n margin-bottom: 0;\n}\n\n.blockquote-footer {\n margin-top: -1rem;\n margin-bottom: 1rem;\n font-size: 0.875em;\n color: #6c757d;\n}\n.blockquote-footer::before {\n content: \"— \";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: var(--bs-body-bg);\n border: var(--bs-border-width) solid var(--bs-border-color);\n border-radius: var(--bs-border-radius);\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 0.875em;\n color: var(--bs-secondary-color);\n}\n\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n:root {\n --bs-breakpoint-xs: 0;\n --bs-breakpoint-sm: 576px;\n --bs-breakpoint-md: 768px;\n --bs-breakpoint-lg: 992px;\n --bs-breakpoint-xl: 1200px;\n --bs-breakpoint-xxl: 1400px;\n}\n\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-left: 8.33333333%;\n}\n\n.offset-2 {\n margin-left: 16.66666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.33333333%;\n}\n\n.offset-5 {\n margin-left: 41.66666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.33333333%;\n}\n\n.offset-8 {\n margin-left: 66.66666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.33333333%;\n}\n\n.offset-11 {\n margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%;\n }\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.33333333%;\n }\n .offset-sm-2 {\n margin-left: 16.66666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.33333333%;\n }\n .offset-sm-5 {\n margin-left: 41.66666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.33333333%;\n }\n .offset-sm-8 {\n margin-left: 66.66666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.33333333%;\n }\n .offset-sm-11 {\n margin-left: 91.66666667%;\n }\n .g-sm-0,\n .gx-sm-0 {\n --bs-gutter-x: 0;\n }\n .g-sm-0,\n .gy-sm-0 {\n --bs-gutter-y: 0;\n }\n .g-sm-1,\n .gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-sm-1,\n .gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-sm-2,\n .gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-sm-2,\n .gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-sm-3,\n .gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n .g-sm-3,\n .gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n .g-sm-4,\n .gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-sm-4,\n .gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-sm-5,\n .gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n .g-sm-5,\n .gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%;\n }\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.33333333%;\n }\n .offset-md-2 {\n margin-left: 16.66666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.33333333%;\n }\n .offset-md-5 {\n margin-left: 41.66666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.33333333%;\n }\n .offset-md-8 {\n margin-left: 66.66666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.33333333%;\n }\n .offset-md-11 {\n margin-left: 91.66666667%;\n }\n .g-md-0,\n .gx-md-0 {\n --bs-gutter-x: 0;\n }\n .g-md-0,\n .gy-md-0 {\n --bs-gutter-y: 0;\n }\n .g-md-1,\n .gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-md-1,\n .gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-md-2,\n .gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-md-2,\n .gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-md-3,\n .gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n .g-md-3,\n .gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n .g-md-4,\n .gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-md-4,\n .gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-md-5,\n .gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n .g-md-5,\n .gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%;\n }\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.33333333%;\n }\n .offset-lg-2 {\n margin-left: 16.66666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.33333333%;\n }\n .offset-lg-5 {\n margin-left: 41.66666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.33333333%;\n }\n .offset-lg-8 {\n margin-left: 66.66666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.33333333%;\n }\n .offset-lg-11 {\n margin-left: 91.66666667%;\n }\n .g-lg-0,\n .gx-lg-0 {\n --bs-gutter-x: 0;\n }\n .g-lg-0,\n .gy-lg-0 {\n --bs-gutter-y: 0;\n }\n .g-lg-1,\n .gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-lg-1,\n .gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-lg-2,\n .gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-lg-2,\n .gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-lg-3,\n .gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n .g-lg-3,\n .gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n .g-lg-4,\n .gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-lg-4,\n .gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-lg-5,\n .gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n .g-lg-5,\n .gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%;\n }\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xl-11 {\n margin-left: 91.66666667%;\n }\n .g-xl-0,\n .gx-xl-0 {\n --bs-gutter-x: 0;\n }\n .g-xl-0,\n .gy-xl-0 {\n --bs-gutter-y: 0;\n }\n .g-xl-1,\n .gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xl-1,\n .gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xl-2,\n .gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xl-2,\n .gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xl-3,\n .gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xl-3,\n .gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xl-4,\n .gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xl-4,\n .gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xl-5,\n .gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xl-5,\n .gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%;\n }\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.66666667%;\n }\n .g-xxl-0,\n .gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n .g-xxl-0,\n .gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n .g-xxl-1,\n .gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xxl-1,\n .gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xxl-2,\n .gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xxl-2,\n .gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xxl-3,\n .gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xxl-3,\n .gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xxl-4,\n .gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xxl-4,\n .gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xxl-5,\n .gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xxl-5,\n .gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.table {\n --bs-table-color-type: initial;\n --bs-table-bg-type: initial;\n --bs-table-color-state: initial;\n --bs-table-bg-state: initial;\n --bs-table-color: var(--bs-emphasis-color);\n --bs-table-bg: var(--bs-body-bg);\n --bs-table-border-color: var(--bs-border-color);\n --bs-table-accent-bg: transparent;\n --bs-table-striped-color: var(--bs-emphasis-color);\n --bs-table-striped-bg: rgba(var(--bs-emphasis-color-rgb), 0.05);\n --bs-table-active-color: var(--bs-emphasis-color);\n --bs-table-active-bg: rgba(var(--bs-emphasis-color-rgb), 0.1);\n --bs-table-hover-color: var(--bs-emphasis-color);\n --bs-table-hover-bg: rgba(var(--bs-emphasis-color-rgb), 0.075);\n width: 100%;\n margin-bottom: 1rem;\n vertical-align: top;\n border-color: var(--bs-table-border-color);\n}\n.table > :not(caption) > * > * {\n padding: 0.5rem 0.5rem;\n color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));\n background-color: var(--bs-table-bg);\n border-bottom-width: var(--bs-border-width);\n box-shadow: inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)));\n}\n.table > tbody {\n vertical-align: inherit;\n}\n.table > thead {\n vertical-align: bottom;\n}\n\n.table-group-divider {\n border-top: calc(var(--bs-border-width) * 2) solid currentcolor;\n}\n\n.caption-top {\n caption-side: top;\n}\n\n.table-sm > :not(caption) > * > * {\n padding: 0.25rem 0.25rem;\n}\n\n.table-bordered > :not(caption) > * {\n border-width: var(--bs-border-width) 0;\n}\n.table-bordered > :not(caption) > * > * {\n border-width: 0 var(--bs-border-width);\n}\n\n.table-borderless > :not(caption) > * > * {\n border-bottom-width: 0;\n}\n.table-borderless > :not(:first-child) {\n border-top-width: 0;\n}\n\n.table-striped > tbody > tr:nth-of-type(odd) > * {\n --bs-table-color-type: var(--bs-table-striped-color);\n --bs-table-bg-type: var(--bs-table-striped-bg);\n}\n\n.table-striped-columns > :not(caption) > tr > :nth-child(even) {\n --bs-table-color-type: var(--bs-table-striped-color);\n --bs-table-bg-type: var(--bs-table-striped-bg);\n}\n\n.table-active {\n --bs-table-color-state: var(--bs-table-active-color);\n --bs-table-bg-state: var(--bs-table-active-bg);\n}\n\n.table-hover > tbody > tr:hover > * {\n --bs-table-color-state: var(--bs-table-hover-color);\n --bs-table-bg-state: var(--bs-table-hover-bg);\n}\n\n.table-primary {\n --bs-table-color: #000;\n --bs-table-bg: #cfe2ff;\n --bs-table-border-color: #a6b5cc;\n --bs-table-striped-bg: #c5d7f2;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #bacbe6;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #bfd1ec;\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-secondary {\n --bs-table-color: #000;\n --bs-table-bg: #e2e3e5;\n --bs-table-border-color: #b5b6b7;\n --bs-table-striped-bg: #d7d8da;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #cbccce;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #d1d2d4;\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-success {\n --bs-table-color: #000;\n --bs-table-bg: #d1e7dd;\n --bs-table-border-color: #a7b9b1;\n --bs-table-striped-bg: #c7dbd2;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #bcd0c7;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #c1d6cc;\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-info {\n --bs-table-color: #000;\n --bs-table-bg: #cff4fc;\n --bs-table-border-color: #a6c3ca;\n --bs-table-striped-bg: #c5e8ef;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #badce3;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #bfe2e9;\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-warning {\n --bs-table-color: #000;\n --bs-table-bg: #fff3cd;\n --bs-table-border-color: #ccc2a4;\n --bs-table-striped-bg: #f2e7c3;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #e6dbb9;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #ece1be;\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-danger {\n --bs-table-color: #000;\n --bs-table-bg: #f8d7da;\n --bs-table-border-color: #c6acae;\n --bs-table-striped-bg: #eccccf;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #dfc2c4;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #e5c7ca;\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-light {\n --bs-table-color: #000;\n --bs-table-bg: #f8f9fa;\n --bs-table-border-color: #c6c7c8;\n --bs-table-striped-bg: #ecedee;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #dfe0e1;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #e5e6e7;\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-dark {\n --bs-table-color: #fff;\n --bs-table-bg: #212529;\n --bs-table-border-color: #4d5154;\n --bs-table-striped-bg: #2c3034;\n --bs-table-striped-color: #fff;\n --bs-table-active-bg: #373b3e;\n --bs-table-active-color: #fff;\n --bs-table-hover-bg: #323539;\n --bs-table-hover-color: #fff;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-responsive {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n@media (max-width: 575.98px) {\n .table-responsive-sm {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 767.98px) {\n .table-responsive-md {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 991.98px) {\n .table-responsive-lg {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 1199.98px) {\n .table-responsive-xl {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 1399.98px) {\n .table-responsive-xxl {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n.form-label {\n margin-bottom: 0.5rem;\n}\n\n.col-form-label {\n padding-top: calc(0.375rem + var(--bs-border-width));\n padding-bottom: calc(0.375rem + var(--bs-border-width));\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.5;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem + var(--bs-border-width));\n padding-bottom: calc(0.5rem + var(--bs-border-width));\n font-size: 1.25rem;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem + var(--bs-border-width));\n padding-bottom: calc(0.25rem + var(--bs-border-width));\n font-size: 0.875rem;\n}\n\n.form-text {\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: var(--bs-secondary-color);\n}\n\n.form-control {\n display: block;\n width: 100%;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: var(--bs-body-color);\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n background-color: var(--bs-body-bg);\n background-clip: padding-box;\n border: var(--bs-border-width) solid var(--bs-border-color);\n border-radius: var(--bs-border-radius);\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n.form-control[type=file] {\n overflow: hidden;\n}\n.form-control[type=file]:not(:disabled):not([readonly]) {\n cursor: pointer;\n}\n.form-control:focus {\n color: var(--bs-body-color);\n background-color: var(--bs-body-bg);\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-control::-webkit-date-and-time-value {\n min-width: 85px;\n height: 1.5em;\n margin: 0;\n}\n.form-control::-webkit-datetime-edit {\n display: block;\n padding: 0;\n}\n.form-control::-moz-placeholder {\n color: var(--bs-secondary-color);\n opacity: 1;\n}\n.form-control::placeholder {\n color: var(--bs-secondary-color);\n opacity: 1;\n}\n.form-control:disabled {\n background-color: var(--bs-secondary-bg);\n opacity: 1;\n}\n.form-control::-webkit-file-upload-button {\n padding: 0.375rem 0.75rem;\n margin: -0.375rem -0.75rem;\n -webkit-margin-end: 0.75rem;\n margin-inline-end: 0.75rem;\n color: var(--bs-body-color);\n background-color: var(--bs-tertiary-bg);\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: var(--bs-border-width);\n border-radius: 0;\n -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n.form-control::file-selector-button {\n padding: 0.375rem 0.75rem;\n margin: -0.375rem -0.75rem;\n -webkit-margin-end: 0.75rem;\n margin-inline-end: 0.75rem;\n color: var(--bs-body-color);\n background-color: var(--bs-tertiary-bg);\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: var(--bs-border-width);\n border-radius: 0;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-control::-webkit-file-upload-button {\n -webkit-transition: none;\n transition: none;\n }\n .form-control::file-selector-button {\n transition: none;\n }\n}\n.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {\n background-color: var(--bs-secondary-bg);\n}\n.form-control:hover:not(:disabled):not([readonly])::file-selector-button {\n background-color: var(--bs-secondary-bg);\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding: 0.375rem 0;\n margin-bottom: 0;\n line-height: 1.5;\n color: var(--bs-body-color);\n background-color: transparent;\n border: solid transparent;\n border-width: var(--bs-border-width) 0;\n}\n.form-control-plaintext:focus {\n outline: 0;\n}\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n border-radius: var(--bs-border-radius-sm);\n}\n.form-control-sm::-webkit-file-upload-button {\n padding: 0.25rem 0.5rem;\n margin: -0.25rem -0.5rem;\n -webkit-margin-end: 0.5rem;\n margin-inline-end: 0.5rem;\n}\n.form-control-sm::file-selector-button {\n padding: 0.25rem 0.5rem;\n margin: -0.25rem -0.5rem;\n -webkit-margin-end: 0.5rem;\n margin-inline-end: 0.5rem;\n}\n\n.form-control-lg {\n min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n border-radius: var(--bs-border-radius-lg);\n}\n.form-control-lg::-webkit-file-upload-button {\n padding: 0.5rem 1rem;\n margin: -0.5rem -1rem;\n -webkit-margin-end: 1rem;\n margin-inline-end: 1rem;\n}\n.form-control-lg::file-selector-button {\n padding: 0.5rem 1rem;\n margin: -0.5rem -1rem;\n -webkit-margin-end: 1rem;\n margin-inline-end: 1rem;\n}\n\ntextarea.form-control {\n min-height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2));\n}\ntextarea.form-control-sm {\n min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));\n}\ntextarea.form-control-lg {\n min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));\n}\n\n.form-control-color {\n width: 3rem;\n height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2));\n padding: 0.375rem;\n}\n.form-control-color:not(:disabled):not([readonly]) {\n cursor: pointer;\n}\n.form-control-color::-moz-color-swatch {\n border: 0 !important;\n border-radius: var(--bs-border-radius);\n}\n.form-control-color::-webkit-color-swatch {\n border: 0 !important;\n border-radius: var(--bs-border-radius);\n}\n.form-control-color.form-control-sm {\n height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));\n}\n.form-control-color.form-control-lg {\n height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));\n}\n\n.form-select {\n --bs-form-select-bg-img: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");\n display: block;\n width: 100%;\n padding: 0.375rem 2.25rem 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: var(--bs-body-color);\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n background-color: var(--bs-body-bg);\n background-image: var(--bs-form-select-bg-img), var(--bs-form-select-bg-icon, none);\n background-repeat: no-repeat;\n background-position: right 0.75rem center;\n background-size: 16px 12px;\n border: var(--bs-border-width) solid var(--bs-border-color);\n border-radius: var(--bs-border-radius);\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-select {\n transition: none;\n }\n}\n.form-select:focus {\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-select[multiple], .form-select[size]:not([size=\"1\"]) {\n padding-right: 0.75rem;\n background-image: none;\n}\n.form-select:disabled {\n background-color: var(--bs-secondary-bg);\n}\n.form-select:-moz-focusring {\n color: transparent;\n text-shadow: 0 0 0 var(--bs-body-color);\n}\n\n.form-select-sm {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n padding-left: 0.5rem;\n font-size: 0.875rem;\n border-radius: var(--bs-border-radius-sm);\n}\n\n.form-select-lg {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n font-size: 1.25rem;\n border-radius: var(--bs-border-radius-lg);\n}\n\n[data-bs-theme=dark] .form-select {\n --bs-form-select-bg-img: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");\n}\n\n.form-check {\n display: block;\n min-height: 1.5rem;\n padding-left: 1.5em;\n margin-bottom: 0.125rem;\n}\n.form-check .form-check-input {\n float: left;\n margin-left: -1.5em;\n}\n\n.form-check-reverse {\n padding-right: 1.5em;\n padding-left: 0;\n text-align: right;\n}\n.form-check-reverse .form-check-input {\n float: right;\n margin-right: -1.5em;\n margin-left: 0;\n}\n\n.form-check-input {\n --bs-form-check-bg: var(--bs-body-bg);\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n margin-top: 0.25em;\n vertical-align: top;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n background-color: var(--bs-form-check-bg);\n background-image: var(--bs-form-check-bg-image);\n background-repeat: no-repeat;\n background-position: center;\n background-size: contain;\n border: var(--bs-border-width) solid var(--bs-border-color);\n -webkit-print-color-adjust: exact;\n color-adjust: exact;\n print-color-adjust: exact;\n}\n.form-check-input[type=checkbox] {\n border-radius: 0.25em;\n}\n.form-check-input[type=radio] {\n border-radius: 50%;\n}\n.form-check-input:active {\n filter: brightness(90%);\n}\n.form-check-input:focus {\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-check-input:checked {\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n.form-check-input:checked[type=checkbox] {\n --bs-form-check-bg-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e\");\n}\n.form-check-input:checked[type=radio] {\n --bs-form-check-bg-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e\");\n}\n.form-check-input[type=checkbox]:indeterminate {\n background-color: #0d6efd;\n border-color: #0d6efd;\n --bs-form-check-bg-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e\");\n}\n.form-check-input:disabled {\n pointer-events: none;\n filter: none;\n opacity: 0.5;\n}\n.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label {\n cursor: default;\n opacity: 0.5;\n}\n\n.form-switch {\n padding-left: 2.5em;\n}\n.form-switch .form-check-input {\n --bs-form-switch-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e\");\n width: 2em;\n margin-left: -2.5em;\n background-image: var(--bs-form-switch-bg);\n background-position: left center;\n border-radius: 2em;\n transition: background-position 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-switch .form-check-input {\n transition: none;\n }\n}\n.form-switch .form-check-input:focus {\n --bs-form-switch-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e\");\n}\n.form-switch .form-check-input:checked {\n background-position: right center;\n --bs-form-switch-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n}\n.form-switch.form-check-reverse {\n padding-right: 2.5em;\n padding-left: 0;\n}\n.form-switch.form-check-reverse .form-check-input {\n margin-right: -2.5em;\n margin-left: 0;\n}\n\n.form-check-inline {\n display: inline-block;\n margin-right: 1rem;\n}\n\n.btn-check {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.btn-check[disabled] + .btn, .btn-check:disabled + .btn {\n pointer-events: none;\n filter: none;\n opacity: 0.65;\n}\n\n[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus) {\n --bs-form-switch-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e\");\n}\n\n.form-range {\n width: 100%;\n height: 1.5rem;\n padding: 0;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n background-color: transparent;\n}\n.form-range:focus {\n outline: 0;\n}\n.form-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-range::-moz-focus-outer {\n border: 0;\n}\n.form-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n -webkit-appearance: none;\n appearance: none;\n background-color: #0d6efd;\n border: 0;\n border-radius: 1rem;\n -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-range::-webkit-slider-thumb {\n -webkit-transition: none;\n transition: none;\n }\n}\n.form-range::-webkit-slider-thumb:active {\n background-color: #b6d4fe;\n}\n.form-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: var(--bs-secondary-bg);\n border-color: transparent;\n border-radius: 1rem;\n}\n.form-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n -moz-appearance: none;\n appearance: none;\n background-color: #0d6efd;\n border: 0;\n border-radius: 1rem;\n -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-range::-moz-range-thumb {\n -moz-transition: none;\n transition: none;\n }\n}\n.form-range::-moz-range-thumb:active {\n background-color: #b6d4fe;\n}\n.form-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: var(--bs-secondary-bg);\n border-color: transparent;\n border-radius: 1rem;\n}\n.form-range:disabled {\n pointer-events: none;\n}\n.form-range:disabled::-webkit-slider-thumb {\n background-color: var(--bs-secondary-color);\n}\n.form-range:disabled::-moz-range-thumb {\n background-color: var(--bs-secondary-color);\n}\n\n.form-floating {\n position: relative;\n}\n.form-floating > .form-control,\n.form-floating > .form-control-plaintext,\n.form-floating > .form-select {\n height: calc(3.5rem + calc(var(--bs-border-width) * 2));\n min-height: calc(3.5rem + calc(var(--bs-border-width) * 2));\n line-height: 1.25;\n}\n.form-floating > label {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 2;\n height: 100%;\n padding: 1rem 0.75rem;\n overflow: hidden;\n text-align: start;\n text-overflow: ellipsis;\n white-space: nowrap;\n pointer-events: none;\n border: var(--bs-border-width) solid transparent;\n transform-origin: 0 0;\n transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-floating > label {\n transition: none;\n }\n}\n.form-floating > .form-control,\n.form-floating > .form-control-plaintext {\n padding: 1rem 0.75rem;\n}\n.form-floating > .form-control::-moz-placeholder, .form-floating > .form-control-plaintext::-moz-placeholder {\n color: transparent;\n}\n.form-floating > .form-control::placeholder,\n.form-floating > .form-control-plaintext::placeholder {\n color: transparent;\n}\n.form-floating > .form-control:not(:-moz-placeholder-shown), .form-floating > .form-control-plaintext:not(:-moz-placeholder-shown) {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown),\n.form-floating > .form-control-plaintext:focus,\n.form-floating > .form-control-plaintext:not(:placeholder-shown) {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:-webkit-autofill,\n.form-floating > .form-control-plaintext:-webkit-autofill {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-select {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label {\n color: rgba(var(--bs-body-color-rgb), 0.65);\n transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n.form-floating > .form-control:focus ~ label,\n.form-floating > .form-control:not(:placeholder-shown) ~ label,\n.form-floating > .form-control-plaintext ~ label,\n.form-floating > .form-select ~ label {\n color: rgba(var(--bs-body-color-rgb), 0.65);\n transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label::after {\n position: absolute;\n inset: 1rem 0.375rem;\n z-index: -1;\n height: 1.5em;\n content: \"\";\n background-color: var(--bs-body-bg);\n border-radius: var(--bs-border-radius);\n}\n.form-floating > .form-control:focus ~ label::after,\n.form-floating > .form-control:not(:placeholder-shown) ~ label::after,\n.form-floating > .form-control-plaintext ~ label::after,\n.form-floating > .form-select ~ label::after {\n position: absolute;\n inset: 1rem 0.375rem;\n z-index: -1;\n height: 1.5em;\n content: \"\";\n background-color: var(--bs-body-bg);\n border-radius: var(--bs-border-radius);\n}\n.form-floating > .form-control:-webkit-autofill ~ label {\n color: rgba(var(--bs-body-color-rgb), 0.65);\n transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n.form-floating > .form-control-plaintext ~ label {\n border-width: var(--bs-border-width) 0;\n}\n.form-floating > :disabled ~ label,\n.form-floating > .form-control:disabled ~ label {\n color: #6c757d;\n}\n.form-floating > :disabled ~ label::after,\n.form-floating > .form-control:disabled ~ label::after {\n background-color: var(--bs-secondary-bg);\n}\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%;\n}\n.input-group > .form-control,\n.input-group > .form-select,\n.input-group > .form-floating {\n position: relative;\n flex: 1 1 auto;\n width: 1%;\n min-width: 0;\n}\n.input-group > .form-control:focus,\n.input-group > .form-select:focus,\n.input-group > .form-floating:focus-within {\n z-index: 5;\n}\n.input-group .btn {\n position: relative;\n z-index: 2;\n}\n.input-group .btn:focus {\n z-index: 5;\n}\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: var(--bs-body-color);\n text-align: center;\n white-space: nowrap;\n background-color: var(--bs-tertiary-bg);\n border: var(--bs-border-width) solid var(--bs-border-color);\n border-radius: var(--bs-border-radius);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .form-select,\n.input-group-lg > .input-group-text,\n.input-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n border-radius: var(--bs-border-radius-lg);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .form-select,\n.input-group-sm > .input-group-text,\n.input-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n border-radius: var(--bs-border-radius-sm);\n}\n\n.input-group-lg > .form-select,\n.input-group-sm > .form-select {\n padding-right: 3rem;\n}\n\n.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),\n.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3),\n.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control,\n.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),\n.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4),\n.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control,\n.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) {\n margin-left: calc(var(--bs-border-width) * -1);\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group > .form-floating:not(:first-child) > .form-control,\n.input-group > .form-floating:not(:first-child) > .form-select {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: var(--bs-form-valid-color);\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: 0.1rem;\n font-size: 0.875rem;\n color: #fff;\n background-color: var(--bs-success);\n border-radius: var(--bs-border-radius);\n}\n\n.was-validated :valid ~ .valid-feedback,\n.was-validated :valid ~ .valid-tooltip,\n.is-valid ~ .valid-feedback,\n.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: var(--bs-form-valid-border-color);\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: right calc(0.375em + 0.1875rem) center;\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: var(--bs-form-valid-border-color);\n box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25);\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .form-select:valid, .form-select.is-valid {\n border-color: var(--bs-form-valid-border-color);\n}\n.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size=\"1\"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size=\"1\"] {\n --bs-form-select-bg-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n padding-right: 4.125rem;\n background-position: right 0.75rem center, center right 2.25rem;\n background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-select:valid:focus, .form-select.is-valid:focus {\n border-color: var(--bs-form-valid-border-color);\n box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25);\n}\n\n.was-validated .form-control-color:valid, .form-control-color.is-valid {\n width: calc(3rem + calc(1.5em + 0.75rem));\n}\n\n.was-validated .form-check-input:valid, .form-check-input.is-valid {\n border-color: var(--bs-form-valid-border-color);\n}\n.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked {\n background-color: var(--bs-form-valid-color);\n}\n.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus {\n box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25);\n}\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: var(--bs-form-valid-color);\n}\n\n.form-check-inline .form-check-input ~ .valid-feedback {\n margin-left: 0.5em;\n}\n\n.was-validated .input-group > .form-control:not(:focus):valid, .input-group > .form-control:not(:focus).is-valid,\n.was-validated .input-group > .form-select:not(:focus):valid,\n.input-group > .form-select:not(:focus).is-valid,\n.was-validated .input-group > .form-floating:not(:focus-within):valid,\n.input-group > .form-floating:not(:focus-within).is-valid {\n z-index: 3;\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: var(--bs-form-invalid-color);\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: 0.1rem;\n font-size: 0.875rem;\n color: #fff;\n background-color: var(--bs-danger);\n border-radius: var(--bs-border-radius);\n}\n\n.was-validated :invalid ~ .invalid-feedback,\n.was-validated :invalid ~ .invalid-tooltip,\n.is-invalid ~ .invalid-feedback,\n.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: var(--bs-form-invalid-border-color);\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: right calc(0.375em + 0.1875rem) center;\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: var(--bs-form-invalid-border-color);\n box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25);\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .form-select:invalid, .form-select.is-invalid {\n border-color: var(--bs-form-invalid-border-color);\n}\n.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size=\"1\"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size=\"1\"] {\n --bs-form-select-bg-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\");\n padding-right: 4.125rem;\n background-position: right 0.75rem center, center right 2.25rem;\n background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus {\n border-color: var(--bs-form-invalid-border-color);\n box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25);\n}\n\n.was-validated .form-control-color:invalid, .form-control-color.is-invalid {\n width: calc(3rem + calc(1.5em + 0.75rem));\n}\n\n.was-validated .form-check-input:invalid, .form-check-input.is-invalid {\n border-color: var(--bs-form-invalid-border-color);\n}\n.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked {\n background-color: var(--bs-form-invalid-color);\n}\n.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus {\n box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25);\n}\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: var(--bs-form-invalid-color);\n}\n\n.form-check-inline .form-check-input ~ .invalid-feedback {\n margin-left: 0.5em;\n}\n\n.was-validated .input-group > .form-control:not(:focus):invalid, .input-group > .form-control:not(:focus).is-invalid,\n.was-validated .input-group > .form-select:not(:focus):invalid,\n.input-group > .form-select:not(:focus).is-invalid,\n.was-validated .input-group > .form-floating:not(:focus-within):invalid,\n.input-group > .form-floating:not(:focus-within).is-invalid {\n z-index: 4;\n}\n\n.btn {\n --bs-btn-padding-x: 0.75rem;\n --bs-btn-padding-y: 0.375rem;\n --bs-btn-font-family: ;\n --bs-btn-font-size: 1rem;\n --bs-btn-font-weight: 400;\n --bs-btn-line-height: 1.5;\n --bs-btn-color: var(--bs-body-color);\n --bs-btn-bg: transparent;\n --bs-btn-border-width: var(--bs-border-width);\n --bs-btn-border-color: transparent;\n --bs-btn-border-radius: var(--bs-border-radius);\n --bs-btn-hover-border-color: transparent;\n --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n --bs-btn-disabled-opacity: 0.65;\n --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);\n display: inline-block;\n padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x);\n font-family: var(--bs-btn-font-family);\n font-size: var(--bs-btn-font-size);\n font-weight: var(--bs-btn-font-weight);\n line-height: var(--bs-btn-line-height);\n color: var(--bs-btn-color);\n text-align: center;\n text-decoration: none;\n vertical-align: middle;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n border: var(--bs-btn-border-width) solid var(--bs-btn-border-color);\n border-radius: var(--bs-btn-border-radius);\n background-color: var(--bs-btn-bg);\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n.btn:hover {\n color: var(--bs-btn-hover-color);\n background-color: var(--bs-btn-hover-bg);\n border-color: var(--bs-btn-hover-border-color);\n}\n.btn-check + .btn:hover {\n color: var(--bs-btn-color);\n background-color: var(--bs-btn-bg);\n border-color: var(--bs-btn-border-color);\n}\n.btn:focus-visible {\n color: var(--bs-btn-hover-color);\n background-color: var(--bs-btn-hover-bg);\n border-color: var(--bs-btn-hover-border-color);\n outline: 0;\n box-shadow: var(--bs-btn-focus-box-shadow);\n}\n.btn-check:focus-visible + .btn {\n border-color: var(--bs-btn-hover-border-color);\n outline: 0;\n box-shadow: var(--bs-btn-focus-box-shadow);\n}\n.btn-check:checked + .btn, :not(.btn-check) + .btn:active, .btn:first-child:active, .btn.active, .btn.show {\n color: var(--bs-btn-active-color);\n background-color: var(--bs-btn-active-bg);\n border-color: var(--bs-btn-active-border-color);\n}\n.btn-check:checked + .btn:focus-visible, :not(.btn-check) + .btn:active:focus-visible, .btn:first-child:active:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible {\n box-shadow: var(--bs-btn-focus-box-shadow);\n}\n.btn-check:checked:focus-visible + .btn {\n box-shadow: var(--bs-btn-focus-box-shadow);\n}\n.btn:disabled, .btn.disabled, fieldset:disabled .btn {\n color: var(--bs-btn-disabled-color);\n pointer-events: none;\n background-color: var(--bs-btn-disabled-bg);\n border-color: var(--bs-btn-disabled-border-color);\n opacity: var(--bs-btn-disabled-opacity);\n}\n\n.btn-primary {\n --bs-btn-color: #fff;\n --bs-btn-bg: #0d6efd;\n --bs-btn-border-color: #0d6efd;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #0b5ed7;\n --bs-btn-hover-border-color: #0a58ca;\n --bs-btn-focus-shadow-rgb: 49, 132, 253;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #0a58ca;\n --bs-btn-active-border-color: #0a53be;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #fff;\n --bs-btn-disabled-bg: #0d6efd;\n --bs-btn-disabled-border-color: #0d6efd;\n}\n\n.btn-secondary {\n --bs-btn-color: #fff;\n --bs-btn-bg: #6c757d;\n --bs-btn-border-color: #6c757d;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #5c636a;\n --bs-btn-hover-border-color: #565e64;\n --bs-btn-focus-shadow-rgb: 130, 138, 145;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #565e64;\n --bs-btn-active-border-color: #51585e;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #fff;\n --bs-btn-disabled-bg: #6c757d;\n --bs-btn-disabled-border-color: #6c757d;\n}\n\n.btn-success {\n --bs-btn-color: #fff;\n --bs-btn-bg: #198754;\n --bs-btn-border-color: #198754;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #157347;\n --bs-btn-hover-border-color: #146c43;\n --bs-btn-focus-shadow-rgb: 60, 153, 110;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #146c43;\n --bs-btn-active-border-color: #13653f;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #fff;\n --bs-btn-disabled-bg: #198754;\n --bs-btn-disabled-border-color: #198754;\n}\n\n.btn-info {\n --bs-btn-color: #000;\n --bs-btn-bg: #0dcaf0;\n --bs-btn-border-color: #0dcaf0;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: #31d2f2;\n --bs-btn-hover-border-color: #25cff2;\n --bs-btn-focus-shadow-rgb: 11, 172, 204;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: #3dd5f3;\n --bs-btn-active-border-color: #25cff2;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #000;\n --bs-btn-disabled-bg: #0dcaf0;\n --bs-btn-disabled-border-color: #0dcaf0;\n}\n\n.btn-warning {\n --bs-btn-color: #000;\n --bs-btn-bg: #ffc107;\n --bs-btn-border-color: #ffc107;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: #ffca2c;\n --bs-btn-hover-border-color: #ffc720;\n --bs-btn-focus-shadow-rgb: 217, 164, 6;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: #ffcd39;\n --bs-btn-active-border-color: #ffc720;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #000;\n --bs-btn-disabled-bg: #ffc107;\n --bs-btn-disabled-border-color: #ffc107;\n}\n\n.btn-danger {\n --bs-btn-color: #fff;\n --bs-btn-bg: #dc3545;\n --bs-btn-border-color: #dc3545;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #bb2d3b;\n --bs-btn-hover-border-color: #b02a37;\n --bs-btn-focus-shadow-rgb: 225, 83, 97;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #b02a37;\n --bs-btn-active-border-color: #a52834;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #fff;\n --bs-btn-disabled-bg: #dc3545;\n --bs-btn-disabled-border-color: #dc3545;\n}\n\n.btn-light {\n --bs-btn-color: #000;\n --bs-btn-bg: #f8f9fa;\n --bs-btn-border-color: #f8f9fa;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: #d3d4d5;\n --bs-btn-hover-border-color: #c6c7c8;\n --bs-btn-focus-shadow-rgb: 211, 212, 213;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: #c6c7c8;\n --bs-btn-active-border-color: #babbbc;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #000;\n --bs-btn-disabled-bg: #f8f9fa;\n --bs-btn-disabled-border-color: #f8f9fa;\n}\n\n.btn-dark {\n --bs-btn-color: #fff;\n --bs-btn-bg: #212529;\n --bs-btn-border-color: #212529;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #424649;\n --bs-btn-hover-border-color: #373b3e;\n --bs-btn-focus-shadow-rgb: 66, 70, 73;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #4d5154;\n --bs-btn-active-border-color: #373b3e;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #fff;\n --bs-btn-disabled-bg: #212529;\n --bs-btn-disabled-border-color: #212529;\n}\n\n.btn-outline-primary {\n --bs-btn-color: #0d6efd;\n --bs-btn-border-color: #0d6efd;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #0d6efd;\n --bs-btn-hover-border-color: #0d6efd;\n --bs-btn-focus-shadow-rgb: 13, 110, 253;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #0d6efd;\n --bs-btn-active-border-color: #0d6efd;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #0d6efd;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #0d6efd;\n --bs-gradient: none;\n}\n\n.btn-outline-secondary {\n --bs-btn-color: #6c757d;\n --bs-btn-border-color: #6c757d;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #6c757d;\n --bs-btn-hover-border-color: #6c757d;\n --bs-btn-focus-shadow-rgb: 108, 117, 125;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #6c757d;\n --bs-btn-active-border-color: #6c757d;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #6c757d;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #6c757d;\n --bs-gradient: none;\n}\n\n.btn-outline-success {\n --bs-btn-color: #198754;\n --bs-btn-border-color: #198754;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #198754;\n --bs-btn-hover-border-color: #198754;\n --bs-btn-focus-shadow-rgb: 25, 135, 84;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #198754;\n --bs-btn-active-border-color: #198754;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #198754;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #198754;\n --bs-gradient: none;\n}\n\n.btn-outline-info {\n --bs-btn-color: #0dcaf0;\n --bs-btn-border-color: #0dcaf0;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: #0dcaf0;\n --bs-btn-hover-border-color: #0dcaf0;\n --bs-btn-focus-shadow-rgb: 13, 202, 240;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: #0dcaf0;\n --bs-btn-active-border-color: #0dcaf0;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #0dcaf0;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #0dcaf0;\n --bs-gradient: none;\n}\n\n.btn-outline-warning {\n --bs-btn-color: #ffc107;\n --bs-btn-border-color: #ffc107;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: #ffc107;\n --bs-btn-hover-border-color: #ffc107;\n --bs-btn-focus-shadow-rgb: 255, 193, 7;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: #ffc107;\n --bs-btn-active-border-color: #ffc107;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #ffc107;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #ffc107;\n --bs-gradient: none;\n}\n\n.btn-outline-danger {\n --bs-btn-color: #dc3545;\n --bs-btn-border-color: #dc3545;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #dc3545;\n --bs-btn-hover-border-color: #dc3545;\n --bs-btn-focus-shadow-rgb: 220, 53, 69;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #dc3545;\n --bs-btn-active-border-color: #dc3545;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #dc3545;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #dc3545;\n --bs-gradient: none;\n}\n\n.btn-outline-light {\n --bs-btn-color: #f8f9fa;\n --bs-btn-border-color: #f8f9fa;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: #f8f9fa;\n --bs-btn-hover-border-color: #f8f9fa;\n --bs-btn-focus-shadow-rgb: 248, 249, 250;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: #f8f9fa;\n --bs-btn-active-border-color: #f8f9fa;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #f8f9fa;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #f8f9fa;\n --bs-gradient: none;\n}\n\n.btn-outline-dark {\n --bs-btn-color: #212529;\n --bs-btn-border-color: #212529;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #212529;\n --bs-btn-hover-border-color: #212529;\n --bs-btn-focus-shadow-rgb: 33, 37, 41;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #212529;\n --bs-btn-active-border-color: #212529;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #212529;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #212529;\n --bs-gradient: none;\n}\n\n.btn-link {\n --bs-btn-font-weight: 400;\n --bs-btn-color: var(--bs-link-color);\n --bs-btn-bg: transparent;\n --bs-btn-border-color: transparent;\n --bs-btn-hover-color: var(--bs-link-hover-color);\n --bs-btn-hover-border-color: transparent;\n --bs-btn-active-color: var(--bs-link-hover-color);\n --bs-btn-active-border-color: transparent;\n --bs-btn-disabled-color: #6c757d;\n --bs-btn-disabled-border-color: transparent;\n --bs-btn-box-shadow: 0 0 0 #000;\n --bs-btn-focus-shadow-rgb: 49, 132, 253;\n text-decoration: underline;\n}\n.btn-link:focus-visible {\n color: var(--bs-btn-color);\n}\n.btn-link:hover {\n color: var(--bs-btn-hover-color);\n}\n\n.btn-lg, .btn-group-lg > .btn {\n --bs-btn-padding-y: 0.5rem;\n --bs-btn-padding-x: 1rem;\n --bs-btn-font-size: 1.25rem;\n --bs-btn-border-radius: var(--bs-border-radius-lg);\n}\n\n.btn-sm, .btn-group-sm > .btn {\n --bs-btn-padding-y: 0.25rem;\n --bs-btn-padding-x: 0.5rem;\n --bs-btn-font-size: 0.875rem;\n --bs-btn-border-radius: var(--bs-border-radius-sm);\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n.collapsing.collapse-horizontal {\n width: 0;\n height: auto;\n transition: width 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .collapsing.collapse-horizontal {\n transition: none;\n }\n}\n\n.dropup,\n.dropend,\n.dropdown,\n.dropstart,\n.dropup-center,\n.dropdown-center {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-bottom: 0;\n border-left: 0.3em solid transparent;\n}\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n --bs-dropdown-zindex: 1000;\n --bs-dropdown-min-width: 10rem;\n --bs-dropdown-padding-x: 0;\n --bs-dropdown-padding-y: 0.5rem;\n --bs-dropdown-spacer: 0.125rem;\n --bs-dropdown-font-size: 1rem;\n --bs-dropdown-color: var(--bs-body-color);\n --bs-dropdown-bg: var(--bs-body-bg);\n --bs-dropdown-border-color: var(--bs-border-color-translucent);\n --bs-dropdown-border-radius: var(--bs-border-radius);\n --bs-dropdown-border-width: var(--bs-border-width);\n --bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width));\n --bs-dropdown-divider-bg: var(--bs-border-color-translucent);\n --bs-dropdown-divider-margin-y: 0.5rem;\n --bs-dropdown-box-shadow: var(--bs-box-shadow);\n --bs-dropdown-link-color: var(--bs-body-color);\n --bs-dropdown-link-hover-color: var(--bs-body-color);\n --bs-dropdown-link-hover-bg: var(--bs-tertiary-bg);\n --bs-dropdown-link-active-color: #fff;\n --bs-dropdown-link-active-bg: #0d6efd;\n --bs-dropdown-link-disabled-color: var(--bs-tertiary-color);\n --bs-dropdown-item-padding-x: 1rem;\n --bs-dropdown-item-padding-y: 0.25rem;\n --bs-dropdown-header-color: #6c757d;\n --bs-dropdown-header-padding-x: 1rem;\n --bs-dropdown-header-padding-y: 0.5rem;\n position: absolute;\n z-index: var(--bs-dropdown-zindex);\n display: none;\n min-width: var(--bs-dropdown-min-width);\n padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);\n margin: 0;\n font-size: var(--bs-dropdown-font-size);\n color: var(--bs-dropdown-color);\n text-align: left;\n list-style: none;\n background-color: var(--bs-dropdown-bg);\n background-clip: padding-box;\n border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);\n border-radius: var(--bs-dropdown-border-radius);\n}\n.dropdown-menu[data-bs-popper] {\n top: 100%;\n left: 0;\n margin-top: var(--bs-dropdown-spacer);\n}\n\n.dropdown-menu-start {\n --bs-position: start;\n}\n.dropdown-menu-start[data-bs-popper] {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-end {\n --bs-position: end;\n}\n.dropdown-menu-end[data-bs-popper] {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 576px) {\n .dropdown-menu-sm-start {\n --bs-position: start;\n }\n .dropdown-menu-sm-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n .dropdown-menu-sm-end {\n --bs-position: end;\n }\n .dropdown-menu-sm-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 768px) {\n .dropdown-menu-md-start {\n --bs-position: start;\n }\n .dropdown-menu-md-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n .dropdown-menu-md-end {\n --bs-position: end;\n }\n .dropdown-menu-md-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 992px) {\n .dropdown-menu-lg-start {\n --bs-position: start;\n }\n .dropdown-menu-lg-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n .dropdown-menu-lg-end {\n --bs-position: end;\n }\n .dropdown-menu-lg-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 1200px) {\n .dropdown-menu-xl-start {\n --bs-position: start;\n }\n .dropdown-menu-xl-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xl-end {\n --bs-position: end;\n }\n .dropdown-menu-xl-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 1400px) {\n .dropdown-menu-xxl-start {\n --bs-position: start;\n }\n .dropdown-menu-xxl-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xxl-end {\n --bs-position: end;\n }\n .dropdown-menu-xxl-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n.dropup .dropdown-menu[data-bs-popper] {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: var(--bs-dropdown-spacer);\n}\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0;\n border-right: 0.3em solid transparent;\n border-bottom: 0.3em solid;\n border-left: 0.3em solid transparent;\n}\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropend .dropdown-menu[data-bs-popper] {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: var(--bs-dropdown-spacer);\n}\n.dropend .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0;\n border-bottom: 0.3em solid transparent;\n border-left: 0.3em solid;\n}\n.dropend .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n.dropend .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropstart .dropdown-menu[data-bs-popper] {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: var(--bs-dropdown-spacer);\n}\n.dropstart .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n}\n.dropstart .dropdown-toggle::after {\n display: none;\n}\n.dropstart .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0.3em solid;\n border-bottom: 0.3em solid transparent;\n}\n.dropstart .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n.dropstart .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-divider {\n height: 0;\n margin: var(--bs-dropdown-divider-margin-y) 0;\n overflow: hidden;\n border-top: 1px solid var(--bs-dropdown-divider-bg);\n opacity: 1;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);\n clear: both;\n font-weight: 400;\n color: var(--bs-dropdown-link-color);\n text-align: inherit;\n text-decoration: none;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n border-radius: var(--bs-dropdown-item-border-radius, 0);\n}\n.dropdown-item:hover, .dropdown-item:focus {\n color: var(--bs-dropdown-link-hover-color);\n background-color: var(--bs-dropdown-link-hover-bg);\n}\n.dropdown-item.active, .dropdown-item:active {\n color: var(--bs-dropdown-link-active-color);\n text-decoration: none;\n background-color: var(--bs-dropdown-link-active-bg);\n}\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: var(--bs-dropdown-link-disabled-color);\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);\n margin-bottom: 0;\n font-size: 0.875rem;\n color: var(--bs-dropdown-header-color);\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);\n color: var(--bs-dropdown-link-color);\n}\n\n.dropdown-menu-dark {\n --bs-dropdown-color: #dee2e6;\n --bs-dropdown-bg: #343a40;\n --bs-dropdown-border-color: var(--bs-border-color-translucent);\n --bs-dropdown-box-shadow: ;\n --bs-dropdown-link-color: #dee2e6;\n --bs-dropdown-link-hover-color: #fff;\n --bs-dropdown-divider-bg: var(--bs-border-color-translucent);\n --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);\n --bs-dropdown-link-active-color: #fff;\n --bs-dropdown-link-active-bg: #0d6efd;\n --bs-dropdown-link-disabled-color: #adb5bd;\n --bs-dropdown-header-color: #adb5bd;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 1 1 auto;\n}\n.btn-group > .btn-check:checked + .btn,\n.btn-group > .btn-check:focus + .btn,\n.btn-group > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn-check:checked + .btn,\n.btn-group-vertical > .btn-check:focus + .btn,\n.btn-group-vertical > .btn:hover,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group {\n border-radius: var(--bs-border-radius);\n}\n.btn-group > :not(.btn-check:first-child) + .btn,\n.btn-group > .btn-group:not(:first-child) {\n margin-left: calc(var(--bs-border-width) * -1);\n}\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn.dropdown-toggle-split:first-child,\n.btn-group > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:nth-child(n+3),\n.btn-group > :not(.btn-check) + .btn,\n.btn-group > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after {\n margin-left: 0;\n}\n.dropstart .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: calc(var(--bs-border-width) * -1);\n}\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn ~ .btn,\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav {\n --bs-nav-link-padding-x: 1rem;\n --bs-nav-link-padding-y: 0.5rem;\n --bs-nav-link-font-weight: ;\n --bs-nav-link-color: var(--bs-link-color);\n --bs-nav-link-hover-color: var(--bs-link-hover-color);\n --bs-nav-link-disabled-color: var(--bs-secondary-color);\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);\n font-size: var(--bs-nav-link-font-size);\n font-weight: var(--bs-nav-link-font-weight);\n color: var(--bs-nav-link-color);\n text-decoration: none;\n background: none;\n border: 0;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .nav-link {\n transition: none;\n }\n}\n.nav-link:hover, .nav-link:focus {\n color: var(--bs-nav-link-hover-color);\n}\n.nav-link:focus-visible {\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.nav-link.disabled, .nav-link:disabled {\n color: var(--bs-nav-link-disabled-color);\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n --bs-nav-tabs-border-width: var(--bs-border-width);\n --bs-nav-tabs-border-color: var(--bs-border-color);\n --bs-nav-tabs-border-radius: var(--bs-border-radius);\n --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);\n --bs-nav-tabs-link-active-color: var(--bs-emphasis-color);\n --bs-nav-tabs-link-active-bg: var(--bs-body-bg);\n --bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);\n border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color);\n}\n.nav-tabs .nav-link {\n margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width));\n border: var(--bs-nav-tabs-border-width) solid transparent;\n border-top-left-radius: var(--bs-nav-tabs-border-radius);\n border-top-right-radius: var(--bs-nav-tabs-border-radius);\n}\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n isolation: isolate;\n border-color: var(--bs-nav-tabs-link-hover-border-color);\n}\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: var(--bs-nav-tabs-link-active-color);\n background-color: var(--bs-nav-tabs-link-active-bg);\n border-color: var(--bs-nav-tabs-link-active-border-color);\n}\n.nav-tabs .dropdown-menu {\n margin-top: calc(-1 * var(--bs-nav-tabs-border-width));\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills {\n --bs-nav-pills-border-radius: var(--bs-border-radius);\n --bs-nav-pills-link-active-color: #fff;\n --bs-nav-pills-link-active-bg: #0d6efd;\n}\n.nav-pills .nav-link {\n border-radius: var(--bs-nav-pills-border-radius);\n}\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: var(--bs-nav-pills-link-active-color);\n background-color: var(--bs-nav-pills-link-active-bg);\n}\n\n.nav-underline {\n --bs-nav-underline-gap: 1rem;\n --bs-nav-underline-border-width: 0.125rem;\n --bs-nav-underline-link-active-color: var(--bs-emphasis-color);\n gap: var(--bs-nav-underline-gap);\n}\n.nav-underline .nav-link {\n padding-right: 0;\n padding-left: 0;\n border-bottom: var(--bs-nav-underline-border-width) solid transparent;\n}\n.nav-underline .nav-link:hover, .nav-underline .nav-link:focus {\n border-bottom-color: currentcolor;\n}\n.nav-underline .nav-link.active,\n.nav-underline .show > .nav-link {\n font-weight: 700;\n color: var(--bs-nav-underline-link-active-color);\n border-bottom-color: currentcolor;\n}\n\n.nav-fill > .nav-link,\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified > .nav-link,\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.nav-fill .nav-item .nav-link,\n.nav-justified .nav-item .nav-link {\n width: 100%;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n --bs-navbar-padding-x: 0;\n --bs-navbar-padding-y: 0.5rem;\n --bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), 0.65);\n --bs-navbar-hover-color: rgba(var(--bs-emphasis-color-rgb), 0.8);\n --bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), 0.3);\n --bs-navbar-active-color: rgba(var(--bs-emphasis-color-rgb), 1);\n --bs-navbar-brand-padding-y: 0.3125rem;\n --bs-navbar-brand-margin-end: 1rem;\n --bs-navbar-brand-font-size: 1.25rem;\n --bs-navbar-brand-color: rgba(var(--bs-emphasis-color-rgb), 1);\n --bs-navbar-brand-hover-color: rgba(var(--bs-emphasis-color-rgb), 1);\n --bs-navbar-nav-link-padding-x: 0.5rem;\n --bs-navbar-toggler-padding-y: 0.25rem;\n --bs-navbar-toggler-padding-x: 0.75rem;\n --bs-navbar-toggler-font-size: 1.25rem;\n --bs-navbar-toggler-icon-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n --bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), 0.15);\n --bs-navbar-toggler-border-radius: var(--bs-border-radius);\n --bs-navbar-toggler-focus-width: 0.25rem;\n --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x);\n}\n.navbar > .container,\n.navbar > .container-fluid,\n.navbar > .container-sm,\n.navbar > .container-md,\n.navbar > .container-lg,\n.navbar > .container-xl,\n.navbar > .container-xxl {\n display: flex;\n flex-wrap: inherit;\n align-items: center;\n justify-content: space-between;\n}\n.navbar-brand {\n padding-top: var(--bs-navbar-brand-padding-y);\n padding-bottom: var(--bs-navbar-brand-padding-y);\n margin-right: var(--bs-navbar-brand-margin-end);\n font-size: var(--bs-navbar-brand-font-size);\n color: var(--bs-navbar-brand-color);\n text-decoration: none;\n white-space: nowrap;\n}\n.navbar-brand:hover, .navbar-brand:focus {\n color: var(--bs-navbar-brand-hover-color);\n}\n\n.navbar-nav {\n --bs-nav-link-padding-x: 0;\n --bs-nav-link-padding-y: 0.5rem;\n --bs-nav-link-font-weight: ;\n --bs-nav-link-color: var(--bs-navbar-color);\n --bs-nav-link-hover-color: var(--bs-navbar-hover-color);\n --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.navbar-nav .nav-link.active, .navbar-nav .nav-link.show {\n color: var(--bs-navbar-active-color);\n}\n.navbar-nav .dropdown-menu {\n position: static;\n}\n\n.navbar-text {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n color: var(--bs-navbar-color);\n}\n.navbar-text a,\n.navbar-text a:hover,\n.navbar-text a:focus {\n color: var(--bs-navbar-active-color);\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);\n font-size: var(--bs-navbar-toggler-font-size);\n line-height: 1;\n color: var(--bs-navbar-color);\n background-color: transparent;\n border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);\n border-radius: var(--bs-navbar-toggler-border-radius);\n transition: var(--bs-navbar-toggler-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n .navbar-toggler {\n transition: none;\n }\n}\n.navbar-toggler:hover {\n text-decoration: none;\n}\n.navbar-toggler:focus {\n text-decoration: none;\n outline: 0;\n box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width);\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n background-image: var(--bs-navbar-toggler-icon-bg);\n background-repeat: no-repeat;\n background-position: center;\n background-size: 100%;\n}\n\n.navbar-nav-scroll {\n max-height: var(--bs-scroll-height, 75vh);\n overflow-y: auto;\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n }\n .navbar-expand-sm .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n .navbar-expand-sm .offcanvas {\n position: static;\n z-index: auto;\n flex-grow: 1;\n width: auto !important;\n height: auto !important;\n visibility: visible !important;\n background-color: transparent !important;\n border: 0 !important;\n transform: none !important;\n transition: none;\n }\n .navbar-expand-sm .offcanvas .offcanvas-header {\n display: none;\n }\n .navbar-expand-sm .offcanvas .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n }\n .navbar-expand-md .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n .navbar-expand-md .offcanvas {\n position: static;\n z-index: auto;\n flex-grow: 1;\n width: auto !important;\n height: auto !important;\n visibility: visible !important;\n background-color: transparent !important;\n border: 0 !important;\n transform: none !important;\n transition: none;\n }\n .navbar-expand-md .offcanvas .offcanvas-header {\n display: none;\n }\n .navbar-expand-md .offcanvas .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 992px) {\n .navbar-expand-lg {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n }\n .navbar-expand-lg .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n .navbar-expand-lg .offcanvas {\n position: static;\n z-index: auto;\n flex-grow: 1;\n width: auto !important;\n height: auto !important;\n visibility: visible !important;\n background-color: transparent !important;\n border: 0 !important;\n transform: none !important;\n transition: none;\n }\n .navbar-expand-lg .offcanvas .offcanvas-header {\n display: none;\n }\n .navbar-expand-lg .offcanvas .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n }\n .navbar-expand-xl .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n .navbar-expand-xl .offcanvas {\n position: static;\n z-index: auto;\n flex-grow: 1;\n width: auto !important;\n height: auto !important;\n visibility: visible !important;\n background-color: transparent !important;\n border: 0 !important;\n transform: none !important;\n transition: none;\n }\n .navbar-expand-xl .offcanvas .offcanvas-header {\n display: none;\n }\n .navbar-expand-xl .offcanvas .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 1400px) {\n .navbar-expand-xxl {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xxl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xxl .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n }\n .navbar-expand-xxl .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-xxl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xxl .navbar-toggler {\n display: none;\n }\n .navbar-expand-xxl .offcanvas {\n position: static;\n z-index: auto;\n flex-grow: 1;\n width: auto !important;\n height: auto !important;\n visibility: visible !important;\n background-color: transparent !important;\n border: 0 !important;\n transform: none !important;\n transition: none;\n }\n .navbar-expand-xxl .offcanvas .offcanvas-header {\n display: none;\n }\n .navbar-expand-xxl .offcanvas .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n.navbar-expand {\n flex-wrap: nowrap;\n justify-content: flex-start;\n}\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n.navbar-expand .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n}\n.navbar-expand .navbar-nav-scroll {\n overflow: visible;\n}\n.navbar-expand .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n}\n.navbar-expand .navbar-toggler {\n display: none;\n}\n.navbar-expand .offcanvas {\n position: static;\n z-index: auto;\n flex-grow: 1;\n width: auto !important;\n height: auto !important;\n visibility: visible !important;\n background-color: transparent !important;\n border: 0 !important;\n transform: none !important;\n transition: none;\n}\n.navbar-expand .offcanvas .offcanvas-header {\n display: none;\n}\n.navbar-expand .offcanvas .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n}\n\n.navbar-dark,\n.navbar[data-bs-theme=dark] {\n --bs-navbar-color: rgba(255, 255, 255, 0.55);\n --bs-navbar-hover-color: rgba(255, 255, 255, 0.75);\n --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25);\n --bs-navbar-active-color: #fff;\n --bs-navbar-brand-color: #fff;\n --bs-navbar-brand-hover-color: #fff;\n --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1);\n --bs-navbar-toggler-icon-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n[data-bs-theme=dark] .navbar-toggler-icon {\n --bs-navbar-toggler-icon-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.card {\n --bs-card-spacer-y: 1rem;\n --bs-card-spacer-x: 1rem;\n --bs-card-title-spacer-y: 0.5rem;\n --bs-card-title-color: ;\n --bs-card-subtitle-color: ;\n --bs-card-border-width: var(--bs-border-width);\n --bs-card-border-color: var(--bs-border-color-translucent);\n --bs-card-border-radius: var(--bs-border-radius);\n --bs-card-box-shadow: ;\n --bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));\n --bs-card-cap-padding-y: 0.5rem;\n --bs-card-cap-padding-x: 1rem;\n --bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03);\n --bs-card-cap-color: ;\n --bs-card-height: ;\n --bs-card-color: ;\n --bs-card-bg: var(--bs-body-bg);\n --bs-card-img-overlay-padding: 1rem;\n --bs-card-group-margin: 0.75rem;\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n height: var(--bs-card-height);\n color: var(--bs-body-color);\n word-wrap: break-word;\n background-color: var(--bs-card-bg);\n background-clip: border-box;\n border: var(--bs-card-border-width) solid var(--bs-card-border-color);\n border-radius: var(--bs-card-border-radius);\n}\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n.card > .list-group {\n border-top: inherit;\n border-bottom: inherit;\n}\n.card > .list-group:first-child {\n border-top-width: 0;\n border-top-left-radius: var(--bs-card-inner-border-radius);\n border-top-right-radius: var(--bs-card-inner-border-radius);\n}\n.card > .list-group:last-child {\n border-bottom-width: 0;\n border-bottom-right-radius: var(--bs-card-inner-border-radius);\n border-bottom-left-radius: var(--bs-card-inner-border-radius);\n}\n.card > .card-header + .list-group,\n.card > .list-group + .card-footer {\n border-top: 0;\n}\n\n.card-body {\n flex: 1 1 auto;\n padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x);\n color: var(--bs-card-color);\n}\n\n.card-title {\n margin-bottom: var(--bs-card-title-spacer-y);\n color: var(--bs-card-title-color);\n}\n\n.card-subtitle {\n margin-top: calc(-0.5 * var(--bs-card-title-spacer-y));\n margin-bottom: 0;\n color: var(--bs-card-subtitle-color);\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link + .card-link {\n margin-left: var(--bs-card-spacer-x);\n}\n\n.card-header {\n padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);\n margin-bottom: 0;\n color: var(--bs-card-cap-color);\n background-color: var(--bs-card-cap-bg);\n border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color);\n}\n.card-header:first-child {\n border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0;\n}\n\n.card-footer {\n padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);\n color: var(--bs-card-cap-color);\n background-color: var(--bs-card-cap-bg);\n border-top: var(--bs-card-border-width) solid var(--bs-card-border-color);\n}\n.card-footer:last-child {\n border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius);\n}\n\n.card-header-tabs {\n margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));\n margin-bottom: calc(-1 * var(--bs-card-cap-padding-y));\n margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));\n border-bottom: 0;\n}\n.card-header-tabs .nav-link.active {\n background-color: var(--bs-card-bg);\n border-bottom-color: var(--bs-card-bg);\n}\n\n.card-header-pills {\n margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));\n margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: var(--bs-card-img-overlay-padding);\n border-radius: var(--bs-card-inner-border-radius);\n}\n\n.card-img,\n.card-img-top,\n.card-img-bottom {\n width: 100%;\n}\n\n.card-img,\n.card-img-top {\n border-top-left-radius: var(--bs-card-inner-border-radius);\n border-top-right-radius: var(--bs-card-inner-border-radius);\n}\n\n.card-img,\n.card-img-bottom {\n border-bottom-right-radius: var(--bs-card-inner-border-radius);\n border-bottom-left-radius: var(--bs-card-inner-border-radius);\n}\n\n.card-group > .card {\n margin-bottom: var(--bs-card-group-margin);\n}\n@media (min-width: 576px) {\n .card-group {\n display: flex;\n flex-flow: row wrap;\n }\n .card-group > .card {\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group > .card:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-top,\n .card-group > .card:not(:last-child) .card-header {\n border-top-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-bottom,\n .card-group > .card:not(:last-child) .card-footer {\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-top,\n .card-group > .card:not(:first-child) .card-header {\n border-top-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-bottom,\n .card-group > .card:not(:first-child) .card-footer {\n border-bottom-left-radius: 0;\n }\n}\n\n.accordion {\n --bs-accordion-color: var(--bs-body-color);\n --bs-accordion-bg: var(--bs-body-bg);\n --bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;\n --bs-accordion-border-color: var(--bs-border-color);\n --bs-accordion-border-width: var(--bs-border-width);\n --bs-accordion-border-radius: var(--bs-border-radius);\n --bs-accordion-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));\n --bs-accordion-btn-padding-x: 1.25rem;\n --bs-accordion-btn-padding-y: 1rem;\n --bs-accordion-btn-color: var(--bs-body-color);\n --bs-accordion-btn-bg: var(--bs-accordion-bg);\n --bs-accordion-btn-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e\");\n --bs-accordion-btn-icon-width: 1.25rem;\n --bs-accordion-btn-icon-transform: rotate(-180deg);\n --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;\n --bs-accordion-btn-active-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23052c65' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e\");\n --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n --bs-accordion-body-padding-x: 1.25rem;\n --bs-accordion-body-padding-y: 1rem;\n --bs-accordion-active-color: var(--bs-primary-text-emphasis);\n --bs-accordion-active-bg: var(--bs-primary-bg-subtle);\n}\n\n.accordion-button {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);\n font-size: 1rem;\n color: var(--bs-accordion-btn-color);\n text-align: left;\n background-color: var(--bs-accordion-btn-bg);\n border: 0;\n border-radius: 0;\n overflow-anchor: none;\n transition: var(--bs-accordion-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n .accordion-button {\n transition: none;\n }\n}\n.accordion-button:not(.collapsed) {\n color: var(--bs-accordion-active-color);\n background-color: var(--bs-accordion-active-bg);\n box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color);\n}\n.accordion-button:not(.collapsed)::after {\n background-image: var(--bs-accordion-btn-active-icon);\n transform: var(--bs-accordion-btn-icon-transform);\n}\n.accordion-button::after {\n flex-shrink: 0;\n width: var(--bs-accordion-btn-icon-width);\n height: var(--bs-accordion-btn-icon-width);\n margin-left: auto;\n content: \"\";\n background-image: var(--bs-accordion-btn-icon);\n background-repeat: no-repeat;\n background-size: var(--bs-accordion-btn-icon-width);\n transition: var(--bs-accordion-btn-icon-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n .accordion-button::after {\n transition: none;\n }\n}\n.accordion-button:hover {\n z-index: 2;\n}\n.accordion-button:focus {\n z-index: 3;\n outline: 0;\n box-shadow: var(--bs-accordion-btn-focus-box-shadow);\n}\n\n.accordion-header {\n margin-bottom: 0;\n}\n\n.accordion-item {\n color: var(--bs-accordion-color);\n background-color: var(--bs-accordion-bg);\n border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color);\n}\n.accordion-item:first-of-type {\n border-top-left-radius: var(--bs-accordion-border-radius);\n border-top-right-radius: var(--bs-accordion-border-radius);\n}\n.accordion-item:first-of-type > .accordion-header .accordion-button {\n border-top-left-radius: var(--bs-accordion-inner-border-radius);\n border-top-right-radius: var(--bs-accordion-inner-border-radius);\n}\n.accordion-item:not(:first-of-type) {\n border-top: 0;\n}\n.accordion-item:last-of-type {\n border-bottom-right-radius: var(--bs-accordion-border-radius);\n border-bottom-left-radius: var(--bs-accordion-border-radius);\n}\n.accordion-item:last-of-type > .accordion-header .accordion-button.collapsed {\n border-bottom-right-radius: var(--bs-accordion-inner-border-radius);\n border-bottom-left-radius: var(--bs-accordion-inner-border-radius);\n}\n.accordion-item:last-of-type > .accordion-collapse {\n border-bottom-right-radius: var(--bs-accordion-border-radius);\n border-bottom-left-radius: var(--bs-accordion-border-radius);\n}\n\n.accordion-body {\n padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x);\n}\n\n.accordion-flush > .accordion-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n.accordion-flush > .accordion-item:first-child {\n border-top: 0;\n}\n.accordion-flush > .accordion-item:last-child {\n border-bottom: 0;\n}\n.accordion-flush > .accordion-item > .accordion-header .accordion-button, .accordion-flush > .accordion-item > .accordion-header .accordion-button.collapsed {\n border-radius: 0;\n}\n.accordion-flush > .accordion-item > .accordion-collapse {\n border-radius: 0;\n}\n\n[data-bs-theme=dark] .accordion-button::after {\n --bs-accordion-btn-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e\");\n --bs-accordion-btn-active-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e\");\n}\n\n.breadcrumb {\n --bs-breadcrumb-padding-x: 0;\n --bs-breadcrumb-padding-y: 0;\n --bs-breadcrumb-margin-bottom: 1rem;\n --bs-breadcrumb-bg: ;\n --bs-breadcrumb-border-radius: ;\n --bs-breadcrumb-divider-color: var(--bs-secondary-color);\n --bs-breadcrumb-item-padding-x: 0.5rem;\n --bs-breadcrumb-item-active-color: var(--bs-secondary-color);\n display: flex;\n flex-wrap: wrap;\n padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);\n margin-bottom: var(--bs-breadcrumb-margin-bottom);\n font-size: var(--bs-breadcrumb-font-size);\n list-style: none;\n background-color: var(--bs-breadcrumb-bg);\n border-radius: var(--bs-breadcrumb-border-radius);\n}\n\n.breadcrumb-item + .breadcrumb-item {\n padding-left: var(--bs-breadcrumb-item-padding-x);\n}\n.breadcrumb-item + .breadcrumb-item::before {\n float: left;\n padding-right: var(--bs-breadcrumb-item-padding-x);\n color: var(--bs-breadcrumb-divider-color);\n content: var(--bs-breadcrumb-divider, \"/\") /* rtl: var(--bs-breadcrumb-divider, \"/\") */;\n}\n.breadcrumb-item.active {\n color: var(--bs-breadcrumb-item-active-color);\n}\n\n.pagination {\n --bs-pagination-padding-x: 0.75rem;\n --bs-pagination-padding-y: 0.375rem;\n --bs-pagination-font-size: 1rem;\n --bs-pagination-color: var(--bs-link-color);\n --bs-pagination-bg: var(--bs-body-bg);\n --bs-pagination-border-width: var(--bs-border-width);\n --bs-pagination-border-color: var(--bs-border-color);\n --bs-pagination-border-radius: var(--bs-border-radius);\n --bs-pagination-hover-color: var(--bs-link-hover-color);\n --bs-pagination-hover-bg: var(--bs-tertiary-bg);\n --bs-pagination-hover-border-color: var(--bs-border-color);\n --bs-pagination-focus-color: var(--bs-link-hover-color);\n --bs-pagination-focus-bg: var(--bs-secondary-bg);\n --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n --bs-pagination-active-color: #fff;\n --bs-pagination-active-bg: #0d6efd;\n --bs-pagination-active-border-color: #0d6efd;\n --bs-pagination-disabled-color: var(--bs-secondary-color);\n --bs-pagination-disabled-bg: var(--bs-secondary-bg);\n --bs-pagination-disabled-border-color: var(--bs-border-color);\n display: flex;\n padding-left: 0;\n list-style: none;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);\n font-size: var(--bs-pagination-font-size);\n color: var(--bs-pagination-color);\n text-decoration: none;\n background-color: var(--bs-pagination-bg);\n border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .page-link {\n transition: none;\n }\n}\n.page-link:hover {\n z-index: 2;\n color: var(--bs-pagination-hover-color);\n background-color: var(--bs-pagination-hover-bg);\n border-color: var(--bs-pagination-hover-border-color);\n}\n.page-link:focus {\n z-index: 3;\n color: var(--bs-pagination-focus-color);\n background-color: var(--bs-pagination-focus-bg);\n outline: 0;\n box-shadow: var(--bs-pagination-focus-box-shadow);\n}\n.page-link.active, .active > .page-link {\n z-index: 3;\n color: var(--bs-pagination-active-color);\n background-color: var(--bs-pagination-active-bg);\n border-color: var(--bs-pagination-active-border-color);\n}\n.page-link.disabled, .disabled > .page-link {\n color: var(--bs-pagination-disabled-color);\n pointer-events: none;\n background-color: var(--bs-pagination-disabled-bg);\n border-color: var(--bs-pagination-disabled-border-color);\n}\n\n.page-item:not(:first-child) .page-link {\n margin-left: calc(var(--bs-border-width) * -1);\n}\n.page-item:first-child .page-link {\n border-top-left-radius: var(--bs-pagination-border-radius);\n border-bottom-left-radius: var(--bs-pagination-border-radius);\n}\n.page-item:last-child .page-link {\n border-top-right-radius: var(--bs-pagination-border-radius);\n border-bottom-right-radius: var(--bs-pagination-border-radius);\n}\n\n.pagination-lg {\n --bs-pagination-padding-x: 1.5rem;\n --bs-pagination-padding-y: 0.75rem;\n --bs-pagination-font-size: 1.25rem;\n --bs-pagination-border-radius: var(--bs-border-radius-lg);\n}\n\n.pagination-sm {\n --bs-pagination-padding-x: 0.5rem;\n --bs-pagination-padding-y: 0.25rem;\n --bs-pagination-font-size: 0.875rem;\n --bs-pagination-border-radius: var(--bs-border-radius-sm);\n}\n\n.badge {\n --bs-badge-padding-x: 0.65em;\n --bs-badge-padding-y: 0.35em;\n --bs-badge-font-size: 0.75em;\n --bs-badge-font-weight: 700;\n --bs-badge-color: #fff;\n --bs-badge-border-radius: var(--bs-border-radius);\n display: inline-block;\n padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x);\n font-size: var(--bs-badge-font-size);\n font-weight: var(--bs-badge-font-weight);\n line-height: 1;\n color: var(--bs-badge-color);\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: var(--bs-badge-border-radius);\n}\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.alert {\n --bs-alert-bg: transparent;\n --bs-alert-padding-x: 1rem;\n --bs-alert-padding-y: 1rem;\n --bs-alert-margin-bottom: 1rem;\n --bs-alert-color: inherit;\n --bs-alert-border-color: transparent;\n --bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color);\n --bs-alert-border-radius: var(--bs-border-radius);\n --bs-alert-link-color: inherit;\n position: relative;\n padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x);\n margin-bottom: var(--bs-alert-margin-bottom);\n color: var(--bs-alert-color);\n background-color: var(--bs-alert-bg);\n border: var(--bs-alert-border);\n border-radius: var(--bs-alert-border-radius);\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n color: var(--bs-alert-link-color);\n}\n\n.alert-dismissible {\n padding-right: 3rem;\n}\n.alert-dismissible .btn-close {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n padding: 1.25rem 1rem;\n}\n\n.alert-primary {\n --bs-alert-color: var(--bs-primary-text-emphasis);\n --bs-alert-bg: var(--bs-primary-bg-subtle);\n --bs-alert-border-color: var(--bs-primary-border-subtle);\n --bs-alert-link-color: var(--bs-primary-text-emphasis);\n}\n\n.alert-secondary {\n --bs-alert-color: var(--bs-secondary-text-emphasis);\n --bs-alert-bg: var(--bs-secondary-bg-subtle);\n --bs-alert-border-color: var(--bs-secondary-border-subtle);\n --bs-alert-link-color: var(--bs-secondary-text-emphasis);\n}\n\n.alert-success {\n --bs-alert-color: var(--bs-success-text-emphasis);\n --bs-alert-bg: var(--bs-success-bg-subtle);\n --bs-alert-border-color: var(--bs-success-border-subtle);\n --bs-alert-link-color: var(--bs-success-text-emphasis);\n}\n\n.alert-info {\n --bs-alert-color: var(--bs-info-text-emphasis);\n --bs-alert-bg: var(--bs-info-bg-subtle);\n --bs-alert-border-color: var(--bs-info-border-subtle);\n --bs-alert-link-color: var(--bs-info-text-emphasis);\n}\n\n.alert-warning {\n --bs-alert-color: var(--bs-warning-text-emphasis);\n --bs-alert-bg: var(--bs-warning-bg-subtle);\n --bs-alert-border-color: var(--bs-warning-border-subtle);\n --bs-alert-link-color: var(--bs-warning-text-emphasis);\n}\n\n.alert-danger {\n --bs-alert-color: var(--bs-danger-text-emphasis);\n --bs-alert-bg: var(--bs-danger-bg-subtle);\n --bs-alert-border-color: var(--bs-danger-border-subtle);\n --bs-alert-link-color: var(--bs-danger-text-emphasis);\n}\n\n.alert-light {\n --bs-alert-color: var(--bs-light-text-emphasis);\n --bs-alert-bg: var(--bs-light-bg-subtle);\n --bs-alert-border-color: var(--bs-light-border-subtle);\n --bs-alert-link-color: var(--bs-light-text-emphasis);\n}\n\n.alert-dark {\n --bs-alert-color: var(--bs-dark-text-emphasis);\n --bs-alert-bg: var(--bs-dark-bg-subtle);\n --bs-alert-border-color: var(--bs-dark-border-subtle);\n --bs-alert-link-color: var(--bs-dark-text-emphasis);\n}\n\n@keyframes progress-bar-stripes {\n 0% {\n background-position-x: 1rem;\n }\n}\n.progress,\n.progress-stacked {\n --bs-progress-height: 1rem;\n --bs-progress-font-size: 0.75rem;\n --bs-progress-bg: var(--bs-secondary-bg);\n --bs-progress-border-radius: var(--bs-border-radius);\n --bs-progress-box-shadow: var(--bs-box-shadow-inset);\n --bs-progress-bar-color: #fff;\n --bs-progress-bar-bg: #0d6efd;\n --bs-progress-bar-transition: width 0.6s ease;\n display: flex;\n height: var(--bs-progress-height);\n overflow: hidden;\n font-size: var(--bs-progress-font-size);\n background-color: var(--bs-progress-bg);\n border-radius: var(--bs-progress-border-radius);\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n overflow: hidden;\n color: var(--bs-progress-bar-color);\n text-align: center;\n white-space: nowrap;\n background-color: var(--bs-progress-bar-bg);\n transition: var(--bs-progress-bar-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: var(--bs-progress-height) var(--bs-progress-height);\n}\n\n.progress-stacked > .progress {\n overflow: visible;\n}\n\n.progress-stacked > .progress > .progress-bar {\n width: 100%;\n}\n\n.progress-bar-animated {\n animation: 1s linear infinite progress-bar-stripes;\n}\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n animation: none;\n }\n}\n\n.list-group {\n --bs-list-group-color: var(--bs-body-color);\n --bs-list-group-bg: var(--bs-body-bg);\n --bs-list-group-border-color: var(--bs-border-color);\n --bs-list-group-border-width: var(--bs-border-width);\n --bs-list-group-border-radius: var(--bs-border-radius);\n --bs-list-group-item-padding-x: 1rem;\n --bs-list-group-item-padding-y: 0.5rem;\n --bs-list-group-action-color: var(--bs-secondary-color);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-tertiary-bg);\n --bs-list-group-action-active-color: var(--bs-body-color);\n --bs-list-group-action-active-bg: var(--bs-secondary-bg);\n --bs-list-group-disabled-color: var(--bs-secondary-color);\n --bs-list-group-disabled-bg: var(--bs-body-bg);\n --bs-list-group-active-color: #fff;\n --bs-list-group-active-bg: #0d6efd;\n --bs-list-group-active-border-color: #0d6efd;\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n border-radius: var(--bs-list-group-border-radius);\n}\n\n.list-group-numbered {\n list-style-type: none;\n counter-reset: section;\n}\n.list-group-numbered > .list-group-item::before {\n content: counters(section, \".\") \". \";\n counter-increment: section;\n}\n\n.list-group-item-action {\n width: 100%;\n color: var(--bs-list-group-action-color);\n text-align: inherit;\n}\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: var(--bs-list-group-action-hover-color);\n text-decoration: none;\n background-color: var(--bs-list-group-action-hover-bg);\n}\n.list-group-item-action:active {\n color: var(--bs-list-group-action-active-color);\n background-color: var(--bs-list-group-action-active-bg);\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);\n color: var(--bs-list-group-color);\n text-decoration: none;\n background-color: var(--bs-list-group-bg);\n border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color);\n}\n.list-group-item:first-child {\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n.list-group-item:last-child {\n border-bottom-right-radius: inherit;\n border-bottom-left-radius: inherit;\n}\n.list-group-item.disabled, .list-group-item:disabled {\n color: var(--bs-list-group-disabled-color);\n pointer-events: none;\n background-color: var(--bs-list-group-disabled-bg);\n}\n.list-group-item.active {\n z-index: 2;\n color: var(--bs-list-group-active-color);\n background-color: var(--bs-list-group-active-bg);\n border-color: var(--bs-list-group-active-border-color);\n}\n.list-group-item + .list-group-item {\n border-top-width: 0;\n}\n.list-group-item + .list-group-item.active {\n margin-top: calc(-1 * var(--bs-list-group-border-width));\n border-top-width: var(--bs-list-group-border-width);\n}\n\n.list-group-horizontal {\n flex-direction: row;\n}\n.list-group-horizontal > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n}\n.list-group-horizontal > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n}\n.list-group-horizontal > .list-group-item.active {\n margin-top: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n}\n\n@media (min-width: 576px) {\n .list-group-horizontal-sm {\n flex-direction: row;\n }\n .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n }\n .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-sm > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-sm > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n }\n .list-group-horizontal-sm > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n }\n}\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n flex-direction: row;\n }\n .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n }\n .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-md > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-md > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n }\n .list-group-horizontal-md > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n }\n}\n@media (min-width: 992px) {\n .list-group-horizontal-lg {\n flex-direction: row;\n }\n .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n }\n .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-lg > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-lg > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n }\n .list-group-horizontal-lg > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n }\n}\n@media (min-width: 1200px) {\n .list-group-horizontal-xl {\n flex-direction: row;\n }\n .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-xl > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-xl > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n }\n .list-group-horizontal-xl > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n }\n}\n@media (min-width: 1400px) {\n .list-group-horizontal-xxl {\n flex-direction: row;\n }\n .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-xxl > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-xxl > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n }\n .list-group-horizontal-xxl > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n }\n}\n.list-group-flush {\n border-radius: 0;\n}\n.list-group-flush > .list-group-item {\n border-width: 0 0 var(--bs-list-group-border-width);\n}\n.list-group-flush > .list-group-item:last-child {\n border-bottom-width: 0;\n}\n\n.list-group-item-primary {\n --bs-list-group-color: var(--bs-primary-text-emphasis);\n --bs-list-group-bg: var(--bs-primary-bg-subtle);\n --bs-list-group-border-color: var(--bs-primary-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-primary-border-subtle);\n --bs-list-group-active-color: var(--bs-primary-bg-subtle);\n --bs-list-group-active-bg: var(--bs-primary-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-primary-text-emphasis);\n}\n\n.list-group-item-secondary {\n --bs-list-group-color: var(--bs-secondary-text-emphasis);\n --bs-list-group-bg: var(--bs-secondary-bg-subtle);\n --bs-list-group-border-color: var(--bs-secondary-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);\n --bs-list-group-active-color: var(--bs-secondary-bg-subtle);\n --bs-list-group-active-bg: var(--bs-secondary-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-secondary-text-emphasis);\n}\n\n.list-group-item-success {\n --bs-list-group-color: var(--bs-success-text-emphasis);\n --bs-list-group-bg: var(--bs-success-bg-subtle);\n --bs-list-group-border-color: var(--bs-success-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-success-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-success-border-subtle);\n --bs-list-group-active-color: var(--bs-success-bg-subtle);\n --bs-list-group-active-bg: var(--bs-success-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-success-text-emphasis);\n}\n\n.list-group-item-info {\n --bs-list-group-color: var(--bs-info-text-emphasis);\n --bs-list-group-bg: var(--bs-info-bg-subtle);\n --bs-list-group-border-color: var(--bs-info-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-info-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-info-border-subtle);\n --bs-list-group-active-color: var(--bs-info-bg-subtle);\n --bs-list-group-active-bg: var(--bs-info-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-info-text-emphasis);\n}\n\n.list-group-item-warning {\n --bs-list-group-color: var(--bs-warning-text-emphasis);\n --bs-list-group-bg: var(--bs-warning-bg-subtle);\n --bs-list-group-border-color: var(--bs-warning-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-warning-border-subtle);\n --bs-list-group-active-color: var(--bs-warning-bg-subtle);\n --bs-list-group-active-bg: var(--bs-warning-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-warning-text-emphasis);\n}\n\n.list-group-item-danger {\n --bs-list-group-color: var(--bs-danger-text-emphasis);\n --bs-list-group-bg: var(--bs-danger-bg-subtle);\n --bs-list-group-border-color: var(--bs-danger-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-danger-border-subtle);\n --bs-list-group-active-color: var(--bs-danger-bg-subtle);\n --bs-list-group-active-bg: var(--bs-danger-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-danger-text-emphasis);\n}\n\n.list-group-item-light {\n --bs-list-group-color: var(--bs-light-text-emphasis);\n --bs-list-group-bg: var(--bs-light-bg-subtle);\n --bs-list-group-border-color: var(--bs-light-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-light-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-light-border-subtle);\n --bs-list-group-active-color: var(--bs-light-bg-subtle);\n --bs-list-group-active-bg: var(--bs-light-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-light-text-emphasis);\n}\n\n.list-group-item-dark {\n --bs-list-group-color: var(--bs-dark-text-emphasis);\n --bs-list-group-bg: var(--bs-dark-bg-subtle);\n --bs-list-group-border-color: var(--bs-dark-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-dark-border-subtle);\n --bs-list-group-active-color: var(--bs-dark-bg-subtle);\n --bs-list-group-active-bg: var(--bs-dark-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-dark-text-emphasis);\n}\n\n.btn-close {\n --bs-btn-close-color: #000;\n --bs-btn-close-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e\");\n --bs-btn-close-opacity: 0.5;\n --bs-btn-close-hover-opacity: 0.75;\n --bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n --bs-btn-close-focus-opacity: 1;\n --bs-btn-close-disabled-opacity: 0.25;\n --bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);\n box-sizing: content-box;\n width: 1em;\n height: 1em;\n padding: 0.25em 0.25em;\n color: var(--bs-btn-close-color);\n background: transparent var(--bs-btn-close-bg) center/1em auto no-repeat;\n border: 0;\n border-radius: 0.375rem;\n opacity: var(--bs-btn-close-opacity);\n}\n.btn-close:hover {\n color: var(--bs-btn-close-color);\n text-decoration: none;\n opacity: var(--bs-btn-close-hover-opacity);\n}\n.btn-close:focus {\n outline: 0;\n box-shadow: var(--bs-btn-close-focus-shadow);\n opacity: var(--bs-btn-close-focus-opacity);\n}\n.btn-close:disabled, .btn-close.disabled {\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n opacity: var(--bs-btn-close-disabled-opacity);\n}\n\n.btn-close-white {\n filter: var(--bs-btn-close-white-filter);\n}\n\n[data-bs-theme=dark] .btn-close {\n filter: var(--bs-btn-close-white-filter);\n}\n\n.toast {\n --bs-toast-zindex: 1090;\n --bs-toast-padding-x: 0.75rem;\n --bs-toast-padding-y: 0.5rem;\n --bs-toast-spacing: 1.5rem;\n --bs-toast-max-width: 350px;\n --bs-toast-font-size: 0.875rem;\n --bs-toast-color: ;\n --bs-toast-bg: rgba(var(--bs-body-bg-rgb), 0.85);\n --bs-toast-border-width: var(--bs-border-width);\n --bs-toast-border-color: var(--bs-border-color-translucent);\n --bs-toast-border-radius: var(--bs-border-radius);\n --bs-toast-box-shadow: var(--bs-box-shadow);\n --bs-toast-header-color: var(--bs-secondary-color);\n --bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), 0.85);\n --bs-toast-header-border-color: var(--bs-border-color-translucent);\n width: var(--bs-toast-max-width);\n max-width: 100%;\n font-size: var(--bs-toast-font-size);\n color: var(--bs-toast-color);\n pointer-events: auto;\n background-color: var(--bs-toast-bg);\n background-clip: padding-box;\n border: var(--bs-toast-border-width) solid var(--bs-toast-border-color);\n box-shadow: var(--bs-toast-box-shadow);\n border-radius: var(--bs-toast-border-radius);\n}\n.toast.showing {\n opacity: 0;\n}\n.toast:not(.show) {\n display: none;\n}\n\n.toast-container {\n --bs-toast-zindex: 1090;\n position: absolute;\n z-index: var(--bs-toast-zindex);\n width: -webkit-max-content;\n width: -moz-max-content;\n width: max-content;\n max-width: 100%;\n pointer-events: none;\n}\n.toast-container > :not(:last-child) {\n margin-bottom: var(--bs-toast-spacing);\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x);\n color: var(--bs-toast-header-color);\n background-color: var(--bs-toast-header-bg);\n background-clip: padding-box;\n border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);\n border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));\n border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));\n}\n.toast-header .btn-close {\n margin-right: calc(-0.5 * var(--bs-toast-padding-x));\n margin-left: var(--bs-toast-padding-x);\n}\n\n.toast-body {\n padding: var(--bs-toast-padding-x);\n word-wrap: break-word;\n}\n\n.modal {\n --bs-modal-zindex: 1055;\n --bs-modal-width: 500px;\n --bs-modal-padding: 1rem;\n --bs-modal-margin: 0.5rem;\n --bs-modal-color: ;\n --bs-modal-bg: var(--bs-body-bg);\n --bs-modal-border-color: var(--bs-border-color-translucent);\n --bs-modal-border-width: var(--bs-border-width);\n --bs-modal-border-radius: var(--bs-border-radius-lg);\n --bs-modal-box-shadow: var(--bs-box-shadow-sm);\n --bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));\n --bs-modal-header-padding-x: 1rem;\n --bs-modal-header-padding-y: 1rem;\n --bs-modal-header-padding: 1rem 1rem;\n --bs-modal-header-border-color: var(--bs-border-color);\n --bs-modal-header-border-width: var(--bs-border-width);\n --bs-modal-title-line-height: 1.5;\n --bs-modal-footer-gap: 0.5rem;\n --bs-modal-footer-bg: ;\n --bs-modal-footer-border-color: var(--bs-border-color);\n --bs-modal-footer-border-width: var(--bs-border-width);\n position: fixed;\n top: 0;\n left: 0;\n z-index: var(--bs-modal-zindex);\n display: none;\n width: 100%;\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: var(--bs-modal-margin);\n pointer-events: none;\n}\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -50px);\n}\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n.modal.show .modal-dialog {\n transform: none;\n}\n.modal.modal-static .modal-dialog {\n transform: scale(1.02);\n}\n\n.modal-dialog-scrollable {\n height: calc(100% - var(--bs-modal-margin) * 2);\n}\n.modal-dialog-scrollable .modal-content {\n max-height: 100%;\n overflow: hidden;\n}\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - var(--bs-modal-margin) * 2);\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n color: var(--bs-modal-color);\n pointer-events: auto;\n background-color: var(--bs-modal-bg);\n background-clip: padding-box;\n border: var(--bs-modal-border-width) solid var(--bs-modal-border-color);\n border-radius: var(--bs-modal-border-radius);\n outline: 0;\n}\n\n.modal-backdrop {\n --bs-backdrop-zindex: 1050;\n --bs-backdrop-bg: #000;\n --bs-backdrop-opacity: 0.5;\n position: fixed;\n top: 0;\n left: 0;\n z-index: var(--bs-backdrop-zindex);\n width: 100vw;\n height: 100vh;\n background-color: var(--bs-backdrop-bg);\n}\n.modal-backdrop.fade {\n opacity: 0;\n}\n.modal-backdrop.show {\n opacity: var(--bs-backdrop-opacity);\n}\n\n.modal-header {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n padding: var(--bs-modal-header-padding);\n border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);\n border-top-left-radius: var(--bs-modal-inner-border-radius);\n border-top-right-radius: var(--bs-modal-inner-border-radius);\n}\n.modal-header .btn-close {\n padding: calc(var(--bs-modal-header-padding-y) * 0.5) calc(var(--bs-modal-header-padding-x) * 0.5);\n margin: calc(-0.5 * var(--bs-modal-header-padding-y)) calc(-0.5 * var(--bs-modal-header-padding-x)) calc(-0.5 * var(--bs-modal-header-padding-y)) auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: var(--bs-modal-title-line-height);\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: var(--bs-modal-padding);\n}\n\n.modal-footer {\n display: flex;\n flex-shrink: 0;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5);\n background-color: var(--bs-modal-footer-bg);\n border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);\n border-bottom-right-radius: var(--bs-modal-inner-border-radius);\n border-bottom-left-radius: var(--bs-modal-inner-border-radius);\n}\n.modal-footer > * {\n margin: calc(var(--bs-modal-footer-gap) * 0.5);\n}\n\n@media (min-width: 576px) {\n .modal {\n --bs-modal-margin: 1.75rem;\n --bs-modal-box-shadow: var(--bs-box-shadow);\n }\n .modal-dialog {\n max-width: var(--bs-modal-width);\n margin-right: auto;\n margin-left: auto;\n }\n .modal-sm {\n --bs-modal-width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg,\n .modal-xl {\n --bs-modal-width: 800px;\n }\n}\n@media (min-width: 1200px) {\n .modal-xl {\n --bs-modal-width: 1140px;\n }\n}\n.modal-fullscreen {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n}\n.modal-fullscreen .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n}\n.modal-fullscreen .modal-header,\n.modal-fullscreen .modal-footer {\n border-radius: 0;\n}\n.modal-fullscreen .modal-body {\n overflow-y: auto;\n}\n\n@media (max-width: 575.98px) {\n .modal-fullscreen-sm-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-sm-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-sm-down .modal-header,\n .modal-fullscreen-sm-down .modal-footer {\n border-radius: 0;\n }\n .modal-fullscreen-sm-down .modal-body {\n overflow-y: auto;\n }\n}\n@media (max-width: 767.98px) {\n .modal-fullscreen-md-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-md-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-md-down .modal-header,\n .modal-fullscreen-md-down .modal-footer {\n border-radius: 0;\n }\n .modal-fullscreen-md-down .modal-body {\n overflow-y: auto;\n }\n}\n@media (max-width: 991.98px) {\n .modal-fullscreen-lg-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-lg-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-lg-down .modal-header,\n .modal-fullscreen-lg-down .modal-footer {\n border-radius: 0;\n }\n .modal-fullscreen-lg-down .modal-body {\n overflow-y: auto;\n }\n}\n@media (max-width: 1199.98px) {\n .modal-fullscreen-xl-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-xl-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-xl-down .modal-header,\n .modal-fullscreen-xl-down .modal-footer {\n border-radius: 0;\n }\n .modal-fullscreen-xl-down .modal-body {\n overflow-y: auto;\n }\n}\n@media (max-width: 1399.98px) {\n .modal-fullscreen-xxl-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-xxl-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-xxl-down .modal-header,\n .modal-fullscreen-xxl-down .modal-footer {\n border-radius: 0;\n }\n .modal-fullscreen-xxl-down .modal-body {\n overflow-y: auto;\n }\n}\n.tooltip {\n --bs-tooltip-zindex: 1080;\n --bs-tooltip-max-width: 200px;\n --bs-tooltip-padding-x: 0.5rem;\n --bs-tooltip-padding-y: 0.25rem;\n --bs-tooltip-margin: ;\n --bs-tooltip-font-size: 0.875rem;\n --bs-tooltip-color: var(--bs-body-bg);\n --bs-tooltip-bg: var(--bs-emphasis-color);\n --bs-tooltip-border-radius: var(--bs-border-radius);\n --bs-tooltip-opacity: 0.9;\n --bs-tooltip-arrow-width: 0.8rem;\n --bs-tooltip-arrow-height: 0.4rem;\n z-index: var(--bs-tooltip-zindex);\n display: block;\n margin: var(--bs-tooltip-margin);\n font-family: var(--bs-font-sans-serif);\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n white-space: normal;\n word-spacing: normal;\n line-break: auto;\n font-size: var(--bs-tooltip-font-size);\n word-wrap: break-word;\n opacity: 0;\n}\n.tooltip.show {\n opacity: var(--bs-tooltip-opacity);\n}\n.tooltip .tooltip-arrow {\n display: block;\n width: var(--bs-tooltip-arrow-width);\n height: var(--bs-tooltip-arrow-height);\n}\n.tooltip .tooltip-arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow {\n bottom: calc(-1 * var(--bs-tooltip-arrow-height));\n}\n.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before {\n top: -1px;\n border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;\n border-top-color: var(--bs-tooltip-bg);\n}\n\n/* rtl:begin:ignore */\n.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow {\n left: calc(-1 * var(--bs-tooltip-arrow-height));\n width: var(--bs-tooltip-arrow-height);\n height: var(--bs-tooltip-arrow-width);\n}\n.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before {\n right: -1px;\n border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;\n border-right-color: var(--bs-tooltip-bg);\n}\n\n/* rtl:end:ignore */\n.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow {\n top: calc(-1 * var(--bs-tooltip-arrow-height));\n}\n.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before {\n bottom: -1px;\n border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);\n border-bottom-color: var(--bs-tooltip-bg);\n}\n\n/* rtl:begin:ignore */\n.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow {\n right: calc(-1 * var(--bs-tooltip-arrow-height));\n width: var(--bs-tooltip-arrow-height);\n height: var(--bs-tooltip-arrow-width);\n}\n.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before {\n left: -1px;\n border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);\n border-left-color: var(--bs-tooltip-bg);\n}\n\n/* rtl:end:ignore */\n.tooltip-inner {\n max-width: var(--bs-tooltip-max-width);\n padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);\n color: var(--bs-tooltip-color);\n text-align: center;\n background-color: var(--bs-tooltip-bg);\n border-radius: var(--bs-tooltip-border-radius);\n}\n\n.popover {\n --bs-popover-zindex: 1070;\n --bs-popover-max-width: 276px;\n --bs-popover-font-size: 0.875rem;\n --bs-popover-bg: var(--bs-body-bg);\n --bs-popover-border-width: var(--bs-border-width);\n --bs-popover-border-color: var(--bs-border-color-translucent);\n --bs-popover-border-radius: var(--bs-border-radius-lg);\n --bs-popover-inner-border-radius: calc(var(--bs-border-radius-lg) - var(--bs-border-width));\n --bs-popover-box-shadow: var(--bs-box-shadow);\n --bs-popover-header-padding-x: 1rem;\n --bs-popover-header-padding-y: 0.5rem;\n --bs-popover-header-font-size: 1rem;\n --bs-popover-header-color: inherit;\n --bs-popover-header-bg: var(--bs-secondary-bg);\n --bs-popover-body-padding-x: 1rem;\n --bs-popover-body-padding-y: 1rem;\n --bs-popover-body-color: var(--bs-body-color);\n --bs-popover-arrow-width: 1rem;\n --bs-popover-arrow-height: 0.5rem;\n --bs-popover-arrow-border: var(--bs-popover-border-color);\n z-index: var(--bs-popover-zindex);\n display: block;\n max-width: var(--bs-popover-max-width);\n font-family: var(--bs-font-sans-serif);\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n white-space: normal;\n word-spacing: normal;\n line-break: auto;\n font-size: var(--bs-popover-font-size);\n word-wrap: break-word;\n background-color: var(--bs-popover-bg);\n background-clip: padding-box;\n border: var(--bs-popover-border-width) solid var(--bs-popover-border-color);\n border-radius: var(--bs-popover-border-radius);\n}\n.popover .popover-arrow {\n display: block;\n width: var(--bs-popover-arrow-width);\n height: var(--bs-popover-arrow-height);\n}\n.popover .popover-arrow::before, .popover .popover-arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n border-width: 0;\n}\n\n.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow {\n bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n}\n.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {\n border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;\n}\n.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before {\n bottom: 0;\n border-top-color: var(--bs-popover-arrow-border);\n}\n.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {\n bottom: var(--bs-popover-border-width);\n border-top-color: var(--bs-popover-bg);\n}\n\n/* rtl:begin:ignore */\n.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow {\n left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n width: var(--bs-popover-arrow-height);\n height: var(--bs-popover-arrow-width);\n}\n.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {\n border-width: calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;\n}\n.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before {\n left: 0;\n border-right-color: var(--bs-popover-arrow-border);\n}\n.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {\n left: var(--bs-popover-border-width);\n border-right-color: var(--bs-popover-bg);\n}\n\n/* rtl:end:ignore */\n.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow {\n top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n}\n.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {\n border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);\n}\n.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before {\n top: 0;\n border-bottom-color: var(--bs-popover-arrow-border);\n}\n.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {\n top: var(--bs-popover-border-width);\n border-bottom-color: var(--bs-popover-bg);\n}\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: var(--bs-popover-arrow-width);\n margin-left: calc(-0.5 * var(--bs-popover-arrow-width));\n content: \"\";\n border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg);\n}\n\n/* rtl:begin:ignore */\n.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow {\n right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n width: var(--bs-popover-arrow-height);\n height: var(--bs-popover-arrow-width);\n}\n.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {\n border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);\n}\n.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before {\n right: 0;\n border-left-color: var(--bs-popover-arrow-border);\n}\n.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {\n right: var(--bs-popover-border-width);\n border-left-color: var(--bs-popover-bg);\n}\n\n/* rtl:end:ignore */\n.popover-header {\n padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);\n margin-bottom: 0;\n font-size: var(--bs-popover-header-font-size);\n color: var(--bs-popover-header-color);\n background-color: var(--bs-popover-header-bg);\n border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color);\n border-top-left-radius: var(--bs-popover-inner-border-radius);\n border-top-right-radius: var(--bs-popover-inner-border-radius);\n}\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);\n color: var(--bs-popover-body-color);\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n transition: transform 0.6s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-start),\n.active.carousel-item-end {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-end),\n.active.carousel-item-start {\n transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n}\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-start,\n.carousel-fade .carousel-item-prev.carousel-item-end {\n z-index: 1;\n opacity: 1;\n}\n.carousel-fade .active.carousel-item-start,\n.carousel-fade .active.carousel-item-end {\n z-index: 0;\n opacity: 0;\n transition: opacity 0s 0.6s;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-start,\n .carousel-fade .active.carousel-item-end {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 15%;\n padding: 0;\n color: #fff;\n text-align: center;\n background: none;\n border: 0;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n background-repeat: no-repeat;\n background-position: 50%;\n background-size: 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e\") /*rtl:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e\")*/;\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e\") /*rtl:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e\")*/;\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 2;\n display: flex;\n justify-content: center;\n padding: 0;\n margin-right: 15%;\n margin-bottom: 1rem;\n margin-left: 15%;\n}\n.carousel-indicators [data-bs-target] {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n padding: 0;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #fff;\n background-clip: padding-box;\n border: 0;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: 0.5;\n transition: opacity 0.6s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators [data-bs-target] {\n transition: none;\n }\n}\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 1.25rem;\n left: 15%;\n padding-top: 1.25rem;\n padding-bottom: 1.25rem;\n color: #fff;\n text-align: center;\n}\n\n.carousel-dark .carousel-control-prev-icon,\n.carousel-dark .carousel-control-next-icon {\n filter: invert(1) grayscale(100);\n}\n.carousel-dark .carousel-indicators [data-bs-target] {\n background-color: #000;\n}\n.carousel-dark .carousel-caption {\n color: #000;\n}\n\n[data-bs-theme=dark] .carousel .carousel-control-prev-icon,\n[data-bs-theme=dark] .carousel .carousel-control-next-icon, [data-bs-theme=dark].carousel .carousel-control-prev-icon,\n[data-bs-theme=dark].carousel .carousel-control-next-icon {\n filter: invert(1) grayscale(100);\n}\n[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target], [data-bs-theme=dark].carousel .carousel-indicators [data-bs-target] {\n background-color: #000;\n}\n[data-bs-theme=dark] .carousel .carousel-caption, [data-bs-theme=dark].carousel .carousel-caption {\n color: #000;\n}\n\n.spinner-grow,\n.spinner-border {\n display: inline-block;\n width: var(--bs-spinner-width);\n height: var(--bs-spinner-height);\n vertical-align: var(--bs-spinner-vertical-align);\n border-radius: 50%;\n animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);\n}\n\n@keyframes spinner-border {\n to {\n transform: rotate(360deg) /* rtl:ignore */;\n }\n}\n.spinner-border {\n --bs-spinner-width: 2rem;\n --bs-spinner-height: 2rem;\n --bs-spinner-vertical-align: -0.125em;\n --bs-spinner-border-width: 0.25em;\n --bs-spinner-animation-speed: 0.75s;\n --bs-spinner-animation-name: spinner-border;\n border: var(--bs-spinner-border-width) solid currentcolor;\n border-right-color: transparent;\n}\n\n.spinner-border-sm {\n --bs-spinner-width: 1rem;\n --bs-spinner-height: 1rem;\n --bs-spinner-border-width: 0.2em;\n}\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n transform: none;\n }\n}\n.spinner-grow {\n --bs-spinner-width: 2rem;\n --bs-spinner-height: 2rem;\n --bs-spinner-vertical-align: -0.125em;\n --bs-spinner-animation-speed: 0.75s;\n --bs-spinner-animation-name: spinner-grow;\n background-color: currentcolor;\n opacity: 0;\n}\n\n.spinner-grow-sm {\n --bs-spinner-width: 1rem;\n --bs-spinner-height: 1rem;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .spinner-border,\n .spinner-grow {\n --bs-spinner-animation-speed: 1.5s;\n }\n}\n.offcanvas, .offcanvas-xxl, .offcanvas-xl, .offcanvas-lg, .offcanvas-md, .offcanvas-sm {\n --bs-offcanvas-zindex: 1045;\n --bs-offcanvas-width: 400px;\n --bs-offcanvas-height: 30vh;\n --bs-offcanvas-padding-x: 1rem;\n --bs-offcanvas-padding-y: 1rem;\n --bs-offcanvas-color: var(--bs-body-color);\n --bs-offcanvas-bg: var(--bs-body-bg);\n --bs-offcanvas-border-width: var(--bs-border-width);\n --bs-offcanvas-border-color: var(--bs-border-color-translucent);\n --bs-offcanvas-box-shadow: var(--bs-box-shadow-sm);\n --bs-offcanvas-transition: transform 0.3s ease-in-out;\n --bs-offcanvas-title-line-height: 1.5;\n}\n\n@media (max-width: 575.98px) {\n .offcanvas-sm {\n position: fixed;\n bottom: 0;\n z-index: var(--bs-offcanvas-zindex);\n display: flex;\n flex-direction: column;\n max-width: 100%;\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n background-clip: padding-box;\n outline: 0;\n transition: var(--bs-offcanvas-transition);\n }\n}\n@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) {\n .offcanvas-sm {\n transition: none;\n }\n}\n@media (max-width: 575.98px) {\n .offcanvas-sm.offcanvas-start {\n top: 0;\n left: 0;\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(-100%);\n }\n .offcanvas-sm.offcanvas-end {\n top: 0;\n right: 0;\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(100%);\n }\n .offcanvas-sm.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(-100%);\n }\n .offcanvas-sm.offcanvas-bottom {\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(100%);\n }\n .offcanvas-sm.showing, .offcanvas-sm.show:not(.hiding) {\n transform: none;\n }\n .offcanvas-sm.showing, .offcanvas-sm.hiding, .offcanvas-sm.show {\n visibility: visible;\n }\n}\n@media (min-width: 576px) {\n .offcanvas-sm {\n --bs-offcanvas-height: auto;\n --bs-offcanvas-border-width: 0;\n background-color: transparent !important;\n }\n .offcanvas-sm .offcanvas-header {\n display: none;\n }\n .offcanvas-sm .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n background-color: transparent !important;\n }\n}\n\n@media (max-width: 767.98px) {\n .offcanvas-md {\n position: fixed;\n bottom: 0;\n z-index: var(--bs-offcanvas-zindex);\n display: flex;\n flex-direction: column;\n max-width: 100%;\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n background-clip: padding-box;\n outline: 0;\n transition: var(--bs-offcanvas-transition);\n }\n}\n@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) {\n .offcanvas-md {\n transition: none;\n }\n}\n@media (max-width: 767.98px) {\n .offcanvas-md.offcanvas-start {\n top: 0;\n left: 0;\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(-100%);\n }\n .offcanvas-md.offcanvas-end {\n top: 0;\n right: 0;\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(100%);\n }\n .offcanvas-md.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(-100%);\n }\n .offcanvas-md.offcanvas-bottom {\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(100%);\n }\n .offcanvas-md.showing, .offcanvas-md.show:not(.hiding) {\n transform: none;\n }\n .offcanvas-md.showing, .offcanvas-md.hiding, .offcanvas-md.show {\n visibility: visible;\n }\n}\n@media (min-width: 768px) {\n .offcanvas-md {\n --bs-offcanvas-height: auto;\n --bs-offcanvas-border-width: 0;\n background-color: transparent !important;\n }\n .offcanvas-md .offcanvas-header {\n display: none;\n }\n .offcanvas-md .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n background-color: transparent !important;\n }\n}\n\n@media (max-width: 991.98px) {\n .offcanvas-lg {\n position: fixed;\n bottom: 0;\n z-index: var(--bs-offcanvas-zindex);\n display: flex;\n flex-direction: column;\n max-width: 100%;\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n background-clip: padding-box;\n outline: 0;\n transition: var(--bs-offcanvas-transition);\n }\n}\n@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) {\n .offcanvas-lg {\n transition: none;\n }\n}\n@media (max-width: 991.98px) {\n .offcanvas-lg.offcanvas-start {\n top: 0;\n left: 0;\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(-100%);\n }\n .offcanvas-lg.offcanvas-end {\n top: 0;\n right: 0;\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(100%);\n }\n .offcanvas-lg.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(-100%);\n }\n .offcanvas-lg.offcanvas-bottom {\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(100%);\n }\n .offcanvas-lg.showing, .offcanvas-lg.show:not(.hiding) {\n transform: none;\n }\n .offcanvas-lg.showing, .offcanvas-lg.hiding, .offcanvas-lg.show {\n visibility: visible;\n }\n}\n@media (min-width: 992px) {\n .offcanvas-lg {\n --bs-offcanvas-height: auto;\n --bs-offcanvas-border-width: 0;\n background-color: transparent !important;\n }\n .offcanvas-lg .offcanvas-header {\n display: none;\n }\n .offcanvas-lg .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n background-color: transparent !important;\n }\n}\n\n@media (max-width: 1199.98px) {\n .offcanvas-xl {\n position: fixed;\n bottom: 0;\n z-index: var(--bs-offcanvas-zindex);\n display: flex;\n flex-direction: column;\n max-width: 100%;\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n background-clip: padding-box;\n outline: 0;\n transition: var(--bs-offcanvas-transition);\n }\n}\n@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) {\n .offcanvas-xl {\n transition: none;\n }\n}\n@media (max-width: 1199.98px) {\n .offcanvas-xl.offcanvas-start {\n top: 0;\n left: 0;\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(-100%);\n }\n .offcanvas-xl.offcanvas-end {\n top: 0;\n right: 0;\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(100%);\n }\n .offcanvas-xl.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(-100%);\n }\n .offcanvas-xl.offcanvas-bottom {\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(100%);\n }\n .offcanvas-xl.showing, .offcanvas-xl.show:not(.hiding) {\n transform: none;\n }\n .offcanvas-xl.showing, .offcanvas-xl.hiding, .offcanvas-xl.show {\n visibility: visible;\n }\n}\n@media (min-width: 1200px) {\n .offcanvas-xl {\n --bs-offcanvas-height: auto;\n --bs-offcanvas-border-width: 0;\n background-color: transparent !important;\n }\n .offcanvas-xl .offcanvas-header {\n display: none;\n }\n .offcanvas-xl .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n background-color: transparent !important;\n }\n}\n\n@media (max-width: 1399.98px) {\n .offcanvas-xxl {\n position: fixed;\n bottom: 0;\n z-index: var(--bs-offcanvas-zindex);\n display: flex;\n flex-direction: column;\n max-width: 100%;\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n background-clip: padding-box;\n outline: 0;\n transition: var(--bs-offcanvas-transition);\n }\n}\n@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) {\n .offcanvas-xxl {\n transition: none;\n }\n}\n@media (max-width: 1399.98px) {\n .offcanvas-xxl.offcanvas-start {\n top: 0;\n left: 0;\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(-100%);\n }\n .offcanvas-xxl.offcanvas-end {\n top: 0;\n right: 0;\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(100%);\n }\n .offcanvas-xxl.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(-100%);\n }\n .offcanvas-xxl.offcanvas-bottom {\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(100%);\n }\n .offcanvas-xxl.showing, .offcanvas-xxl.show:not(.hiding) {\n transform: none;\n }\n .offcanvas-xxl.showing, .offcanvas-xxl.hiding, .offcanvas-xxl.show {\n visibility: visible;\n }\n}\n@media (min-width: 1400px) {\n .offcanvas-xxl {\n --bs-offcanvas-height: auto;\n --bs-offcanvas-border-width: 0;\n background-color: transparent !important;\n }\n .offcanvas-xxl .offcanvas-header {\n display: none;\n }\n .offcanvas-xxl .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n background-color: transparent !important;\n }\n}\n\n.offcanvas {\n position: fixed;\n bottom: 0;\n z-index: var(--bs-offcanvas-zindex);\n display: flex;\n flex-direction: column;\n max-width: 100%;\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n background-clip: padding-box;\n outline: 0;\n transition: var(--bs-offcanvas-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n .offcanvas {\n transition: none;\n }\n}\n.offcanvas.offcanvas-start {\n top: 0;\n left: 0;\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(-100%);\n}\n.offcanvas.offcanvas-end {\n top: 0;\n right: 0;\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(100%);\n}\n.offcanvas.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(-100%);\n}\n.offcanvas.offcanvas-bottom {\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(100%);\n}\n.offcanvas.showing, .offcanvas.show:not(.hiding) {\n transform: none;\n}\n.offcanvas.showing, .offcanvas.hiding, .offcanvas.show {\n visibility: visible;\n}\n\n.offcanvas-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #000;\n}\n.offcanvas-backdrop.fade {\n opacity: 0;\n}\n.offcanvas-backdrop.show {\n opacity: 0.5;\n}\n\n.offcanvas-header {\n display: flex;\n align-items: center;\n padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);\n}\n.offcanvas-header .btn-close {\n padding: calc(var(--bs-offcanvas-padding-y) * 0.5) calc(var(--bs-offcanvas-padding-x) * 0.5);\n margin: calc(-0.5 * var(--bs-offcanvas-padding-y)) calc(-0.5 * var(--bs-offcanvas-padding-x)) calc(-0.5 * var(--bs-offcanvas-padding-y)) auto;\n}\n\n.offcanvas-title {\n margin-bottom: 0;\n line-height: var(--bs-offcanvas-title-line-height);\n}\n\n.offcanvas-body {\n flex-grow: 1;\n padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);\n overflow-y: auto;\n}\n\n.placeholder {\n display: inline-block;\n min-height: 1em;\n vertical-align: middle;\n cursor: wait;\n background-color: currentcolor;\n opacity: 0.5;\n}\n.placeholder.btn::before {\n display: inline-block;\n content: \"\";\n}\n\n.placeholder-xs {\n min-height: 0.6em;\n}\n\n.placeholder-sm {\n min-height: 0.8em;\n}\n\n.placeholder-lg {\n min-height: 1.2em;\n}\n\n.placeholder-glow .placeholder {\n animation: placeholder-glow 2s ease-in-out infinite;\n}\n\n@keyframes placeholder-glow {\n 50% {\n opacity: 0.2;\n }\n}\n.placeholder-wave {\n -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);\n mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);\n -webkit-mask-size: 200% 100%;\n mask-size: 200% 100%;\n animation: placeholder-wave 2s linear infinite;\n}\n\n@keyframes placeholder-wave {\n 100% {\n -webkit-mask-position: -200% 0%;\n mask-position: -200% 0%;\n }\n}\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.text-bg-primary {\n color: #fff !important;\n background-color: RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-secondary {\n color: #fff !important;\n background-color: RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-success {\n color: #fff !important;\n background-color: RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-info {\n color: #000 !important;\n background-color: RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-warning {\n color: #000 !important;\n background-color: RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-danger {\n color: #fff !important;\n background-color: RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-light {\n color: #000 !important;\n background-color: RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-dark {\n color: #fff !important;\n background-color: RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.link-primary {\n color: RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-primary:hover, .link-primary:focus {\n color: RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-secondary {\n color: RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-secondary:hover, .link-secondary:focus {\n color: RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-success {\n color: RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-success:hover, .link-success:focus {\n color: RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-info {\n color: RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-info:hover, .link-info:focus {\n color: RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-warning {\n color: RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-warning:hover, .link-warning:focus {\n color: RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-danger {\n color: RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-danger:hover, .link-danger:focus {\n color: RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-light {\n color: RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-light:hover, .link-light:focus {\n color: RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-dark {\n color: RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-dark:hover, .link-dark:focus {\n color: RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-body-emphasis {\n color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-body-emphasis:hover, .link-body-emphasis:focus {\n color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important;\n text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important;\n}\n\n.focus-ring:focus {\n outline: 0;\n box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color);\n}\n\n.icon-link {\n display: inline-flex;\n gap: 0.375rem;\n align-items: center;\n -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));\n text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));\n text-underline-offset: 0.25em;\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n}\n.icon-link > .bi {\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n fill: currentcolor;\n transition: 0.2s ease-in-out transform;\n}\n@media (prefers-reduced-motion: reduce) {\n .icon-link > .bi {\n transition: none;\n }\n}\n\n.icon-link-hover:hover > .bi, .icon-link-hover:focus-visible > .bi {\n transform: var(--bs-icon-link-transform, translate3d(0.25em, 0, 0));\n}\n\n.ratio {\n position: relative;\n width: 100%;\n}\n.ratio::before {\n display: block;\n padding-top: var(--bs-aspect-ratio);\n content: \"\";\n}\n.ratio > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n.ratio-1x1 {\n --bs-aspect-ratio: 100%;\n}\n\n.ratio-4x3 {\n --bs-aspect-ratio: 75%;\n}\n\n.ratio-16x9 {\n --bs-aspect-ratio: 56.25%;\n}\n\n.ratio-21x9 {\n --bs-aspect-ratio: 42.8571428571%;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n.sticky-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n}\n\n.sticky-bottom {\n position: -webkit-sticky;\n position: sticky;\n bottom: 0;\n z-index: 1020;\n}\n\n@media (min-width: 576px) {\n .sticky-sm-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n .sticky-sm-bottom {\n position: -webkit-sticky;\n position: sticky;\n bottom: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 768px) {\n .sticky-md-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n .sticky-md-bottom {\n position: -webkit-sticky;\n position: sticky;\n bottom: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 992px) {\n .sticky-lg-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n .sticky-lg-bottom {\n position: -webkit-sticky;\n position: sticky;\n bottom: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 1200px) {\n .sticky-xl-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n .sticky-xl-bottom {\n position: -webkit-sticky;\n position: sticky;\n bottom: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 1400px) {\n .sticky-xxl-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n .sticky-xxl-bottom {\n position: -webkit-sticky;\n position: sticky;\n bottom: 0;\n z-index: 1020;\n }\n}\n.hstack {\n display: flex;\n flex-direction: row;\n align-items: center;\n align-self: stretch;\n}\n\n.vstack {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-self: stretch;\n}\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important;\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n}\n.visually-hidden:not(caption),\n.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption) {\n position: absolute !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n content: \"\";\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.vr {\n display: inline-block;\n align-self: stretch;\n width: var(--bs-border-width);\n min-height: 1em;\n background-color: currentcolor;\n opacity: 0.25;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.float-start {\n float: left !important;\n}\n\n.float-end {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n.object-fit-contain {\n -o-object-fit: contain !important;\n object-fit: contain !important;\n}\n\n.object-fit-cover {\n -o-object-fit: cover !important;\n object-fit: cover !important;\n}\n\n.object-fit-fill {\n -o-object-fit: fill !important;\n object-fit: fill !important;\n}\n\n.object-fit-scale {\n -o-object-fit: scale-down !important;\n object-fit: scale-down !important;\n}\n\n.object-fit-none {\n -o-object-fit: none !important;\n object-fit: none !important;\n}\n\n.opacity-0 {\n opacity: 0 !important;\n}\n\n.opacity-25 {\n opacity: 0.25 !important;\n}\n\n.opacity-50 {\n opacity: 0.5 !important;\n}\n\n.opacity-75 {\n opacity: 0.75 !important;\n}\n\n.opacity-100 {\n opacity: 1 !important;\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.overflow-visible {\n overflow: visible !important;\n}\n\n.overflow-scroll {\n overflow: scroll !important;\n}\n\n.overflow-x-auto {\n overflow-x: auto !important;\n}\n\n.overflow-x-hidden {\n overflow-x: hidden !important;\n}\n\n.overflow-x-visible {\n overflow-x: visible !important;\n}\n\n.overflow-x-scroll {\n overflow-x: scroll !important;\n}\n\n.overflow-y-auto {\n overflow-y: auto !important;\n}\n\n.overflow-y-hidden {\n overflow-y: hidden !important;\n}\n\n.overflow-y-visible {\n overflow-y: visible !important;\n}\n\n.overflow-y-scroll {\n overflow-y: scroll !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-inline-grid {\n display: inline-grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.shadow {\n box-shadow: var(--bs-box-shadow) !important;\n}\n\n.shadow-sm {\n box-shadow: var(--bs-box-shadow-sm) !important;\n}\n\n.shadow-lg {\n box-shadow: var(--bs-box-shadow-lg) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.focus-ring-primary {\n --bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-secondary {\n --bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-success {\n --bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-info {\n --bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-warning {\n --bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-danger {\n --bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-light {\n --bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-dark {\n --bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity));\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: -webkit-sticky !important;\n position: sticky !important;\n}\n\n.top-0 {\n top: 0 !important;\n}\n\n.top-50 {\n top: 50% !important;\n}\n\n.top-100 {\n top: 100% !important;\n}\n\n.bottom-0 {\n bottom: 0 !important;\n}\n\n.bottom-50 {\n bottom: 50% !important;\n}\n\n.bottom-100 {\n bottom: 100% !important;\n}\n\n.start-0 {\n left: 0 !important;\n}\n\n.start-50 {\n left: 50% !important;\n}\n\n.start-100 {\n left: 100% !important;\n}\n\n.end-0 {\n right: 0 !important;\n}\n\n.end-50 {\n right: 50% !important;\n}\n\n.end-100 {\n right: 100% !important;\n}\n\n.translate-middle {\n transform: translate(-50%, -50%) !important;\n}\n\n.translate-middle-x {\n transform: translateX(-50%) !important;\n}\n\n.translate-middle-y {\n transform: translateY(-50%) !important;\n}\n\n.border {\n border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top {\n border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-end {\n border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-end-0 {\n border-right: 0 !important;\n}\n\n.border-bottom {\n border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-start {\n border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-start-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-secondary {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-success {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-info {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-warning {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-danger {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-light {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-dark {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-black {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-white {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-primary-subtle {\n border-color: var(--bs-primary-border-subtle) !important;\n}\n\n.border-secondary-subtle {\n border-color: var(--bs-secondary-border-subtle) !important;\n}\n\n.border-success-subtle {\n border-color: var(--bs-success-border-subtle) !important;\n}\n\n.border-info-subtle {\n border-color: var(--bs-info-border-subtle) !important;\n}\n\n.border-warning-subtle {\n border-color: var(--bs-warning-border-subtle) !important;\n}\n\n.border-danger-subtle {\n border-color: var(--bs-danger-border-subtle) !important;\n}\n\n.border-light-subtle {\n border-color: var(--bs-light-border-subtle) !important;\n}\n\n.border-dark-subtle {\n border-color: var(--bs-dark-border-subtle) !important;\n}\n\n.border-1 {\n border-width: 1px !important;\n}\n\n.border-2 {\n border-width: 2px !important;\n}\n\n.border-3 {\n border-width: 3px !important;\n}\n\n.border-4 {\n border-width: 4px !important;\n}\n\n.border-5 {\n border-width: 5px !important;\n}\n\n.border-opacity-10 {\n --bs-border-opacity: 0.1;\n}\n\n.border-opacity-25 {\n --bs-border-opacity: 0.25;\n}\n\n.border-opacity-50 {\n --bs-border-opacity: 0.5;\n}\n\n.border-opacity-75 {\n --bs-border-opacity: 0.75;\n}\n\n.border-opacity-100 {\n --bs-border-opacity: 1;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-right: 0 !important;\n}\n\n.me-1 {\n margin-right: 0.25rem !important;\n}\n\n.me-2 {\n margin-right: 0.5rem !important;\n}\n\n.me-3 {\n margin-right: 1rem !important;\n}\n\n.me-4 {\n margin-right: 1.5rem !important;\n}\n\n.me-5 {\n margin-right: 3rem !important;\n}\n\n.me-auto {\n margin-right: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-left: 0 !important;\n}\n\n.ms-1 {\n margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n margin-left: 1rem !important;\n}\n\n.ms-4 {\n margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n margin-left: 3rem !important;\n}\n\n.ms-auto {\n margin-left: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-right: 0 !important;\n}\n\n.pe-1 {\n padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n padding-right: 1rem !important;\n}\n\n.pe-4 {\n padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n padding-right: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-left: 0 !important;\n}\n\n.ps-1 {\n padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n padding-left: 1rem !important;\n}\n\n.ps-4 {\n padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n padding-left: 3rem !important;\n}\n\n.gap-0 {\n gap: 0 !important;\n}\n\n.gap-1 {\n gap: 0.25rem !important;\n}\n\n.gap-2 {\n gap: 0.5rem !important;\n}\n\n.gap-3 {\n gap: 1rem !important;\n}\n\n.gap-4 {\n gap: 1.5rem !important;\n}\n\n.gap-5 {\n gap: 3rem !important;\n}\n\n.row-gap-0 {\n row-gap: 0 !important;\n}\n\n.row-gap-1 {\n row-gap: 0.25rem !important;\n}\n\n.row-gap-2 {\n row-gap: 0.5rem !important;\n}\n\n.row-gap-3 {\n row-gap: 1rem !important;\n}\n\n.row-gap-4 {\n row-gap: 1.5rem !important;\n}\n\n.row-gap-5 {\n row-gap: 3rem !important;\n}\n\n.column-gap-0 {\n -moz-column-gap: 0 !important;\n column-gap: 0 !important;\n}\n\n.column-gap-1 {\n -moz-column-gap: 0.25rem !important;\n column-gap: 0.25rem !important;\n}\n\n.column-gap-2 {\n -moz-column-gap: 0.5rem !important;\n column-gap: 0.5rem !important;\n}\n\n.column-gap-3 {\n -moz-column-gap: 1rem !important;\n column-gap: 1rem !important;\n}\n\n.column-gap-4 {\n -moz-column-gap: 1.5rem !important;\n column-gap: 1.5rem !important;\n}\n\n.column-gap-5 {\n -moz-column-gap: 3rem !important;\n column-gap: 3rem !important;\n}\n\n.font-monospace {\n font-family: var(--bs-font-monospace) !important;\n}\n\n.fs-1 {\n font-size: calc(1.375rem + 1.5vw) !important;\n}\n\n.fs-2 {\n font-size: calc(1.325rem + 0.9vw) !important;\n}\n\n.fs-3 {\n font-size: calc(1.3rem + 0.6vw) !important;\n}\n\n.fs-4 {\n font-size: calc(1.275rem + 0.3vw) !important;\n}\n\n.fs-5 {\n font-size: 1.25rem !important;\n}\n\n.fs-6 {\n font-size: 1rem !important;\n}\n\n.fst-italic {\n font-style: italic !important;\n}\n\n.fst-normal {\n font-style: normal !important;\n}\n\n.fw-lighter {\n font-weight: lighter !important;\n}\n\n.fw-light {\n font-weight: 300 !important;\n}\n\n.fw-normal {\n font-weight: 400 !important;\n}\n\n.fw-medium {\n font-weight: 500 !important;\n}\n\n.fw-semibold {\n font-weight: 600 !important;\n}\n\n.fw-bold {\n font-weight: 700 !important;\n}\n\n.fw-bolder {\n font-weight: bolder !important;\n}\n\n.lh-1 {\n line-height: 1 !important;\n}\n\n.lh-sm {\n line-height: 1.25 !important;\n}\n\n.lh-base {\n line-height: 1.5 !important;\n}\n\n.lh-lg {\n line-height: 2 !important;\n}\n\n.text-start {\n text-align: left !important;\n}\n\n.text-end {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-decoration-underline {\n text-decoration: underline !important;\n}\n\n.text-decoration-line-through {\n text-decoration: line-through !important;\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n/* rtl:begin:remove */\n.text-break {\n word-wrap: break-word !important;\n word-break: break-word !important;\n}\n\n/* rtl:end:remove */\n.text-primary {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-secondary {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-success {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-info {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-warning {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-danger {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-light {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-dark {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-black {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-white {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-body {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-muted {\n --bs-text-opacity: 1;\n color: var(--bs-secondary-color) !important;\n}\n\n.text-black-50 {\n --bs-text-opacity: 1;\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n --bs-text-opacity: 1;\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-body-secondary {\n --bs-text-opacity: 1;\n color: var(--bs-secondary-color) !important;\n}\n\n.text-body-tertiary {\n --bs-text-opacity: 1;\n color: var(--bs-tertiary-color) !important;\n}\n\n.text-body-emphasis {\n --bs-text-opacity: 1;\n color: var(--bs-emphasis-color) !important;\n}\n\n.text-reset {\n --bs-text-opacity: 1;\n color: inherit !important;\n}\n\n.text-opacity-25 {\n --bs-text-opacity: 0.25;\n}\n\n.text-opacity-50 {\n --bs-text-opacity: 0.5;\n}\n\n.text-opacity-75 {\n --bs-text-opacity: 0.75;\n}\n\n.text-opacity-100 {\n --bs-text-opacity: 1;\n}\n\n.text-primary-emphasis {\n color: var(--bs-primary-text-emphasis) !important;\n}\n\n.text-secondary-emphasis {\n color: var(--bs-secondary-text-emphasis) !important;\n}\n\n.text-success-emphasis {\n color: var(--bs-success-text-emphasis) !important;\n}\n\n.text-info-emphasis {\n color: var(--bs-info-text-emphasis) !important;\n}\n\n.text-warning-emphasis {\n color: var(--bs-warning-text-emphasis) !important;\n}\n\n.text-danger-emphasis {\n color: var(--bs-danger-text-emphasis) !important;\n}\n\n.text-light-emphasis {\n color: var(--bs-light-text-emphasis) !important;\n}\n\n.text-dark-emphasis {\n color: var(--bs-dark-text-emphasis) !important;\n}\n\n.link-opacity-10 {\n --bs-link-opacity: 0.1;\n}\n\n.link-opacity-10-hover:hover {\n --bs-link-opacity: 0.1;\n}\n\n.link-opacity-25 {\n --bs-link-opacity: 0.25;\n}\n\n.link-opacity-25-hover:hover {\n --bs-link-opacity: 0.25;\n}\n\n.link-opacity-50 {\n --bs-link-opacity: 0.5;\n}\n\n.link-opacity-50-hover:hover {\n --bs-link-opacity: 0.5;\n}\n\n.link-opacity-75 {\n --bs-link-opacity: 0.75;\n}\n\n.link-opacity-75-hover:hover {\n --bs-link-opacity: 0.75;\n}\n\n.link-opacity-100 {\n --bs-link-opacity: 1;\n}\n\n.link-opacity-100-hover:hover {\n --bs-link-opacity: 1;\n}\n\n.link-offset-1 {\n text-underline-offset: 0.125em !important;\n}\n\n.link-offset-1-hover:hover {\n text-underline-offset: 0.125em !important;\n}\n\n.link-offset-2 {\n text-underline-offset: 0.25em !important;\n}\n\n.link-offset-2-hover:hover {\n text-underline-offset: 0.25em !important;\n}\n\n.link-offset-3 {\n text-underline-offset: 0.375em !important;\n}\n\n.link-offset-3-hover:hover {\n text-underline-offset: 0.375em !important;\n}\n\n.link-underline-primary {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-secondary {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-success {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-info {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-warning {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-danger {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-light {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-dark {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-underline-opacity-0 {\n --bs-link-underline-opacity: 0;\n}\n\n.link-underline-opacity-0-hover:hover {\n --bs-link-underline-opacity: 0;\n}\n\n.link-underline-opacity-10 {\n --bs-link-underline-opacity: 0.1;\n}\n\n.link-underline-opacity-10-hover:hover {\n --bs-link-underline-opacity: 0.1;\n}\n\n.link-underline-opacity-25 {\n --bs-link-underline-opacity: 0.25;\n}\n\n.link-underline-opacity-25-hover:hover {\n --bs-link-underline-opacity: 0.25;\n}\n\n.link-underline-opacity-50 {\n --bs-link-underline-opacity: 0.5;\n}\n\n.link-underline-opacity-50-hover:hover {\n --bs-link-underline-opacity: 0.5;\n}\n\n.link-underline-opacity-75 {\n --bs-link-underline-opacity: 0.75;\n}\n\n.link-underline-opacity-75-hover:hover {\n --bs-link-underline-opacity: 0.75;\n}\n\n.link-underline-opacity-100 {\n --bs-link-underline-opacity: 1;\n}\n\n.link-underline-opacity-100-hover:hover {\n --bs-link-underline-opacity: 1;\n}\n\n.bg-primary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-secondary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-success {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-info {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-warning {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-danger {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-light {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-dark {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-black {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-white {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-transparent {\n --bs-bg-opacity: 1;\n background-color: transparent !important;\n}\n\n.bg-body-secondary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body-tertiary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-opacity-10 {\n --bs-bg-opacity: 0.1;\n}\n\n.bg-opacity-25 {\n --bs-bg-opacity: 0.25;\n}\n\n.bg-opacity-50 {\n --bs-bg-opacity: 0.5;\n}\n\n.bg-opacity-75 {\n --bs-bg-opacity: 0.75;\n}\n\n.bg-opacity-100 {\n --bs-bg-opacity: 1;\n}\n\n.bg-primary-subtle {\n background-color: var(--bs-primary-bg-subtle) !important;\n}\n\n.bg-secondary-subtle {\n background-color: var(--bs-secondary-bg-subtle) !important;\n}\n\n.bg-success-subtle {\n background-color: var(--bs-success-bg-subtle) !important;\n}\n\n.bg-info-subtle {\n background-color: var(--bs-info-bg-subtle) !important;\n}\n\n.bg-warning-subtle {\n background-color: var(--bs-warning-bg-subtle) !important;\n}\n\n.bg-danger-subtle {\n background-color: var(--bs-danger-bg-subtle) !important;\n}\n\n.bg-light-subtle {\n background-color: var(--bs-light-bg-subtle) !important;\n}\n\n.bg-dark-subtle {\n background-color: var(--bs-dark-bg-subtle) !important;\n}\n\n.bg-gradient {\n background-image: var(--bs-gradient) !important;\n}\n\n.user-select-all {\n -webkit-user-select: all !important;\n -moz-user-select: all !important;\n user-select: all !important;\n}\n\n.user-select-auto {\n -webkit-user-select: auto !important;\n -moz-user-select: auto !important;\n user-select: auto !important;\n}\n\n.user-select-none {\n -webkit-user-select: none !important;\n -moz-user-select: none !important;\n user-select: none !important;\n}\n\n.pe-none {\n pointer-events: none !important;\n}\n\n.pe-auto {\n pointer-events: auto !important;\n}\n\n.rounded {\n border-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.rounded-1 {\n border-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-2 {\n border-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-3 {\n border-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-4 {\n border-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-5 {\n border-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-top {\n border-top-left-radius: var(--bs-border-radius) !important;\n border-top-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-top-0 {\n border-top-left-radius: 0 !important;\n border-top-right-radius: 0 !important;\n}\n\n.rounded-top-1 {\n border-top-left-radius: var(--bs-border-radius-sm) !important;\n border-top-right-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-top-2 {\n border-top-left-radius: var(--bs-border-radius) !important;\n border-top-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-top-3 {\n border-top-left-radius: var(--bs-border-radius-lg) !important;\n border-top-right-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-top-4 {\n border-top-left-radius: var(--bs-border-radius-xl) !important;\n border-top-right-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-top-5 {\n border-top-left-radius: var(--bs-border-radius-xxl) !important;\n border-top-right-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-top-circle {\n border-top-left-radius: 50% !important;\n border-top-right-radius: 50% !important;\n}\n\n.rounded-top-pill {\n border-top-left-radius: var(--bs-border-radius-pill) !important;\n border-top-right-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-end {\n border-top-right-radius: var(--bs-border-radius) !important;\n border-bottom-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-end-0 {\n border-top-right-radius: 0 !important;\n border-bottom-right-radius: 0 !important;\n}\n\n.rounded-end-1 {\n border-top-right-radius: var(--bs-border-radius-sm) !important;\n border-bottom-right-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-end-2 {\n border-top-right-radius: var(--bs-border-radius) !important;\n border-bottom-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-end-3 {\n border-top-right-radius: var(--bs-border-radius-lg) !important;\n border-bottom-right-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-end-4 {\n border-top-right-radius: var(--bs-border-radius-xl) !important;\n border-bottom-right-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-end-5 {\n border-top-right-radius: var(--bs-border-radius-xxl) !important;\n border-bottom-right-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-end-circle {\n border-top-right-radius: 50% !important;\n border-bottom-right-radius: 50% !important;\n}\n\n.rounded-end-pill {\n border-top-right-radius: var(--bs-border-radius-pill) !important;\n border-bottom-right-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: var(--bs-border-radius) !important;\n border-bottom-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-bottom-0 {\n border-bottom-right-radius: 0 !important;\n border-bottom-left-radius: 0 !important;\n}\n\n.rounded-bottom-1 {\n border-bottom-right-radius: var(--bs-border-radius-sm) !important;\n border-bottom-left-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-bottom-2 {\n border-bottom-right-radius: var(--bs-border-radius) !important;\n border-bottom-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-bottom-3 {\n border-bottom-right-radius: var(--bs-border-radius-lg) !important;\n border-bottom-left-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-bottom-4 {\n border-bottom-right-radius: var(--bs-border-radius-xl) !important;\n border-bottom-left-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-bottom-5 {\n border-bottom-right-radius: var(--bs-border-radius-xxl) !important;\n border-bottom-left-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-bottom-circle {\n border-bottom-right-radius: 50% !important;\n border-bottom-left-radius: 50% !important;\n}\n\n.rounded-bottom-pill {\n border-bottom-right-radius: var(--bs-border-radius-pill) !important;\n border-bottom-left-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-start {\n border-bottom-left-radius: var(--bs-border-radius) !important;\n border-top-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-start-0 {\n border-bottom-left-radius: 0 !important;\n border-top-left-radius: 0 !important;\n}\n\n.rounded-start-1 {\n border-bottom-left-radius: var(--bs-border-radius-sm) !important;\n border-top-left-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-start-2 {\n border-bottom-left-radius: var(--bs-border-radius) !important;\n border-top-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-start-3 {\n border-bottom-left-radius: var(--bs-border-radius-lg) !important;\n border-top-left-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-start-4 {\n border-bottom-left-radius: var(--bs-border-radius-xl) !important;\n border-top-left-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-start-5 {\n border-bottom-left-radius: var(--bs-border-radius-xxl) !important;\n border-top-left-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-start-circle {\n border-bottom-left-radius: 50% !important;\n border-top-left-radius: 50% !important;\n}\n\n.rounded-start-pill {\n border-bottom-left-radius: var(--bs-border-radius-pill) !important;\n border-top-left-radius: var(--bs-border-radius-pill) !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n.z-n1 {\n z-index: -1 !important;\n}\n\n.z-0 {\n z-index: 0 !important;\n}\n\n.z-1 {\n z-index: 1 !important;\n}\n\n.z-2 {\n z-index: 2 !important;\n}\n\n.z-3 {\n z-index: 3 !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-start {\n float: left !important;\n }\n .float-sm-end {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n .object-fit-sm-contain {\n -o-object-fit: contain !important;\n object-fit: contain !important;\n }\n .object-fit-sm-cover {\n -o-object-fit: cover !important;\n object-fit: cover !important;\n }\n .object-fit-sm-fill {\n -o-object-fit: fill !important;\n object-fit: fill !important;\n }\n .object-fit-sm-scale {\n -o-object-fit: scale-down !important;\n object-fit: scale-down !important;\n }\n .object-fit-sm-none {\n -o-object-fit: none !important;\n object-fit: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-grid {\n display: grid !important;\n }\n .d-sm-inline-grid {\n display: inline-grid !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n .d-sm-none {\n display: none !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n .order-sm-first {\n order: -1 !important;\n }\n .order-sm-0 {\n order: 0 !important;\n }\n .order-sm-1 {\n order: 1 !important;\n }\n .order-sm-2 {\n order: 2 !important;\n }\n .order-sm-3 {\n order: 3 !important;\n }\n .order-sm-4 {\n order: 4 !important;\n }\n .order-sm-5 {\n order: 5 !important;\n }\n .order-sm-last {\n order: 6 !important;\n }\n .m-sm-0 {\n margin: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .me-sm-0 {\n margin-right: 0 !important;\n }\n .me-sm-1 {\n margin-right: 0.25rem !important;\n }\n .me-sm-2 {\n margin-right: 0.5rem !important;\n }\n .me-sm-3 {\n margin-right: 1rem !important;\n }\n .me-sm-4 {\n margin-right: 1.5rem !important;\n }\n .me-sm-5 {\n margin-right: 3rem !important;\n }\n .me-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ms-sm-0 {\n margin-left: 0 !important;\n }\n .ms-sm-1 {\n margin-left: 0.25rem !important;\n }\n .ms-sm-2 {\n margin-left: 0.5rem !important;\n }\n .ms-sm-3 {\n margin-left: 1rem !important;\n }\n .ms-sm-4 {\n margin-left: 1.5rem !important;\n }\n .ms-sm-5 {\n margin-left: 3rem !important;\n }\n .ms-sm-auto {\n margin-left: auto !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pe-sm-0 {\n padding-right: 0 !important;\n }\n .pe-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pe-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pe-sm-3 {\n padding-right: 1rem !important;\n }\n .pe-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pe-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .ps-sm-0 {\n padding-left: 0 !important;\n }\n .ps-sm-1 {\n padding-left: 0.25rem !important;\n }\n .ps-sm-2 {\n padding-left: 0.5rem !important;\n }\n .ps-sm-3 {\n padding-left: 1rem !important;\n }\n .ps-sm-4 {\n padding-left: 1.5rem !important;\n }\n .ps-sm-5 {\n padding-left: 3rem !important;\n }\n .gap-sm-0 {\n gap: 0 !important;\n }\n .gap-sm-1 {\n gap: 0.25rem !important;\n }\n .gap-sm-2 {\n gap: 0.5rem !important;\n }\n .gap-sm-3 {\n gap: 1rem !important;\n }\n .gap-sm-4 {\n gap: 1.5rem !important;\n }\n .gap-sm-5 {\n gap: 3rem !important;\n }\n .row-gap-sm-0 {\n row-gap: 0 !important;\n }\n .row-gap-sm-1 {\n row-gap: 0.25rem !important;\n }\n .row-gap-sm-2 {\n row-gap: 0.5rem !important;\n }\n .row-gap-sm-3 {\n row-gap: 1rem !important;\n }\n .row-gap-sm-4 {\n row-gap: 1.5rem !important;\n }\n .row-gap-sm-5 {\n row-gap: 3rem !important;\n }\n .column-gap-sm-0 {\n -moz-column-gap: 0 !important;\n column-gap: 0 !important;\n }\n .column-gap-sm-1 {\n -moz-column-gap: 0.25rem !important;\n column-gap: 0.25rem !important;\n }\n .column-gap-sm-2 {\n -moz-column-gap: 0.5rem !important;\n column-gap: 0.5rem !important;\n }\n .column-gap-sm-3 {\n -moz-column-gap: 1rem !important;\n column-gap: 1rem !important;\n }\n .column-gap-sm-4 {\n -moz-column-gap: 1.5rem !important;\n column-gap: 1.5rem !important;\n }\n .column-gap-sm-5 {\n -moz-column-gap: 3rem !important;\n column-gap: 3rem !important;\n }\n .text-sm-start {\n text-align: left !important;\n }\n .text-sm-end {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n@media (min-width: 768px) {\n .float-md-start {\n float: left !important;\n }\n .float-md-end {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n .object-fit-md-contain {\n -o-object-fit: contain !important;\n object-fit: contain !important;\n }\n .object-fit-md-cover {\n -o-object-fit: cover !important;\n object-fit: cover !important;\n }\n .object-fit-md-fill {\n -o-object-fit: fill !important;\n object-fit: fill !important;\n }\n .object-fit-md-scale {\n -o-object-fit: scale-down !important;\n object-fit: scale-down !important;\n }\n .object-fit-md-none {\n -o-object-fit: none !important;\n object-fit: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-grid {\n display: grid !important;\n }\n .d-md-inline-grid {\n display: inline-grid !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n .d-md-none {\n display: none !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n .order-md-first {\n order: -1 !important;\n }\n .order-md-0 {\n order: 0 !important;\n }\n .order-md-1 {\n order: 1 !important;\n }\n .order-md-2 {\n order: 2 !important;\n }\n .order-md-3 {\n order: 3 !important;\n }\n .order-md-4 {\n order: 4 !important;\n }\n .order-md-5 {\n order: 5 !important;\n }\n .order-md-last {\n order: 6 !important;\n }\n .m-md-0 {\n margin: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .me-md-0 {\n margin-right: 0 !important;\n }\n .me-md-1 {\n margin-right: 0.25rem !important;\n }\n .me-md-2 {\n margin-right: 0.5rem !important;\n }\n .me-md-3 {\n margin-right: 1rem !important;\n }\n .me-md-4 {\n margin-right: 1.5rem !important;\n }\n .me-md-5 {\n margin-right: 3rem !important;\n }\n .me-md-auto {\n margin-right: auto !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ms-md-0 {\n margin-left: 0 !important;\n }\n .ms-md-1 {\n margin-left: 0.25rem !important;\n }\n .ms-md-2 {\n margin-left: 0.5rem !important;\n }\n .ms-md-3 {\n margin-left: 1rem !important;\n }\n .ms-md-4 {\n margin-left: 1.5rem !important;\n }\n .ms-md-5 {\n margin-left: 3rem !important;\n }\n .ms-md-auto {\n margin-left: auto !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pe-md-0 {\n padding-right: 0 !important;\n }\n .pe-md-1 {\n padding-right: 0.25rem !important;\n }\n .pe-md-2 {\n padding-right: 0.5rem !important;\n }\n .pe-md-3 {\n padding-right: 1rem !important;\n }\n .pe-md-4 {\n padding-right: 1.5rem !important;\n }\n .pe-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .ps-md-0 {\n padding-left: 0 !important;\n }\n .ps-md-1 {\n padding-left: 0.25rem !important;\n }\n .ps-md-2 {\n padding-left: 0.5rem !important;\n }\n .ps-md-3 {\n padding-left: 1rem !important;\n }\n .ps-md-4 {\n padding-left: 1.5rem !important;\n }\n .ps-md-5 {\n padding-left: 3rem !important;\n }\n .gap-md-0 {\n gap: 0 !important;\n }\n .gap-md-1 {\n gap: 0.25rem !important;\n }\n .gap-md-2 {\n gap: 0.5rem !important;\n }\n .gap-md-3 {\n gap: 1rem !important;\n }\n .gap-md-4 {\n gap: 1.5rem !important;\n }\n .gap-md-5 {\n gap: 3rem !important;\n }\n .row-gap-md-0 {\n row-gap: 0 !important;\n }\n .row-gap-md-1 {\n row-gap: 0.25rem !important;\n }\n .row-gap-md-2 {\n row-gap: 0.5rem !important;\n }\n .row-gap-md-3 {\n row-gap: 1rem !important;\n }\n .row-gap-md-4 {\n row-gap: 1.5rem !important;\n }\n .row-gap-md-5 {\n row-gap: 3rem !important;\n }\n .column-gap-md-0 {\n -moz-column-gap: 0 !important;\n column-gap: 0 !important;\n }\n .column-gap-md-1 {\n -moz-column-gap: 0.25rem !important;\n column-gap: 0.25rem !important;\n }\n .column-gap-md-2 {\n -moz-column-gap: 0.5rem !important;\n column-gap: 0.5rem !important;\n }\n .column-gap-md-3 {\n -moz-column-gap: 1rem !important;\n column-gap: 1rem !important;\n }\n .column-gap-md-4 {\n -moz-column-gap: 1.5rem !important;\n column-gap: 1.5rem !important;\n }\n .column-gap-md-5 {\n -moz-column-gap: 3rem !important;\n column-gap: 3rem !important;\n }\n .text-md-start {\n text-align: left !important;\n }\n .text-md-end {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n@media (min-width: 992px) {\n .float-lg-start {\n float: left !important;\n }\n .float-lg-end {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n .object-fit-lg-contain {\n -o-object-fit: contain !important;\n object-fit: contain !important;\n }\n .object-fit-lg-cover {\n -o-object-fit: cover !important;\n object-fit: cover !important;\n }\n .object-fit-lg-fill {\n -o-object-fit: fill !important;\n object-fit: fill !important;\n }\n .object-fit-lg-scale {\n -o-object-fit: scale-down !important;\n object-fit: scale-down !important;\n }\n .object-fit-lg-none {\n -o-object-fit: none !important;\n object-fit: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-grid {\n display: grid !important;\n }\n .d-lg-inline-grid {\n display: inline-grid !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n .d-lg-none {\n display: none !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n .order-lg-first {\n order: -1 !important;\n }\n .order-lg-0 {\n order: 0 !important;\n }\n .order-lg-1 {\n order: 1 !important;\n }\n .order-lg-2 {\n order: 2 !important;\n }\n .order-lg-3 {\n order: 3 !important;\n }\n .order-lg-4 {\n order: 4 !important;\n }\n .order-lg-5 {\n order: 5 !important;\n }\n .order-lg-last {\n order: 6 !important;\n }\n .m-lg-0 {\n margin: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .me-lg-0 {\n margin-right: 0 !important;\n }\n .me-lg-1 {\n margin-right: 0.25rem !important;\n }\n .me-lg-2 {\n margin-right: 0.5rem !important;\n }\n .me-lg-3 {\n margin-right: 1rem !important;\n }\n .me-lg-4 {\n margin-right: 1.5rem !important;\n }\n .me-lg-5 {\n margin-right: 3rem !important;\n }\n .me-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ms-lg-0 {\n margin-left: 0 !important;\n }\n .ms-lg-1 {\n margin-left: 0.25rem !important;\n }\n .ms-lg-2 {\n margin-left: 0.5rem !important;\n }\n .ms-lg-3 {\n margin-left: 1rem !important;\n }\n .ms-lg-4 {\n margin-left: 1.5rem !important;\n }\n .ms-lg-5 {\n margin-left: 3rem !important;\n }\n .ms-lg-auto {\n margin-left: auto !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pe-lg-0 {\n padding-right: 0 !important;\n }\n .pe-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pe-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pe-lg-3 {\n padding-right: 1rem !important;\n }\n .pe-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pe-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .ps-lg-0 {\n padding-left: 0 !important;\n }\n .ps-lg-1 {\n padding-left: 0.25rem !important;\n }\n .ps-lg-2 {\n padding-left: 0.5rem !important;\n }\n .ps-lg-3 {\n padding-left: 1rem !important;\n }\n .ps-lg-4 {\n padding-left: 1.5rem !important;\n }\n .ps-lg-5 {\n padding-left: 3rem !important;\n }\n .gap-lg-0 {\n gap: 0 !important;\n }\n .gap-lg-1 {\n gap: 0.25rem !important;\n }\n .gap-lg-2 {\n gap: 0.5rem !important;\n }\n .gap-lg-3 {\n gap: 1rem !important;\n }\n .gap-lg-4 {\n gap: 1.5rem !important;\n }\n .gap-lg-5 {\n gap: 3rem !important;\n }\n .row-gap-lg-0 {\n row-gap: 0 !important;\n }\n .row-gap-lg-1 {\n row-gap: 0.25rem !important;\n }\n .row-gap-lg-2 {\n row-gap: 0.5rem !important;\n }\n .row-gap-lg-3 {\n row-gap: 1rem !important;\n }\n .row-gap-lg-4 {\n row-gap: 1.5rem !important;\n }\n .row-gap-lg-5 {\n row-gap: 3rem !important;\n }\n .column-gap-lg-0 {\n -moz-column-gap: 0 !important;\n column-gap: 0 !important;\n }\n .column-gap-lg-1 {\n -moz-column-gap: 0.25rem !important;\n column-gap: 0.25rem !important;\n }\n .column-gap-lg-2 {\n -moz-column-gap: 0.5rem !important;\n column-gap: 0.5rem !important;\n }\n .column-gap-lg-3 {\n -moz-column-gap: 1rem !important;\n column-gap: 1rem !important;\n }\n .column-gap-lg-4 {\n -moz-column-gap: 1.5rem !important;\n column-gap: 1.5rem !important;\n }\n .column-gap-lg-5 {\n -moz-column-gap: 3rem !important;\n column-gap: 3rem !important;\n }\n .text-lg-start {\n text-align: left !important;\n }\n .text-lg-end {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n@media (min-width: 1200px) {\n .float-xl-start {\n float: left !important;\n }\n .float-xl-end {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n .object-fit-xl-contain {\n -o-object-fit: contain !important;\n object-fit: contain !important;\n }\n .object-fit-xl-cover {\n -o-object-fit: cover !important;\n object-fit: cover !important;\n }\n .object-fit-xl-fill {\n -o-object-fit: fill !important;\n object-fit: fill !important;\n }\n .object-fit-xl-scale {\n -o-object-fit: scale-down !important;\n object-fit: scale-down !important;\n }\n .object-fit-xl-none {\n -o-object-fit: none !important;\n object-fit: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-grid {\n display: grid !important;\n }\n .d-xl-inline-grid {\n display: inline-grid !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n .d-xl-none {\n display: none !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n .order-xl-first {\n order: -1 !important;\n }\n .order-xl-0 {\n order: 0 !important;\n }\n .order-xl-1 {\n order: 1 !important;\n }\n .order-xl-2 {\n order: 2 !important;\n }\n .order-xl-3 {\n order: 3 !important;\n }\n .order-xl-4 {\n order: 4 !important;\n }\n .order-xl-5 {\n order: 5 !important;\n }\n .order-xl-last {\n order: 6 !important;\n }\n .m-xl-0 {\n margin: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .me-xl-0 {\n margin-right: 0 !important;\n }\n .me-xl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xl-3 {\n margin-right: 1rem !important;\n }\n .me-xl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xl-5 {\n margin-right: 3rem !important;\n }\n .me-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ms-xl-0 {\n margin-left: 0 !important;\n }\n .ms-xl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xl-3 {\n margin-left: 1rem !important;\n }\n .ms-xl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xl-5 {\n margin-left: 3rem !important;\n }\n .ms-xl-auto {\n margin-left: auto !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pe-xl-0 {\n padding-right: 0 !important;\n }\n .pe-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xl-3 {\n padding-right: 1rem !important;\n }\n .pe-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xl-0 {\n padding-left: 0 !important;\n }\n .ps-xl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xl-3 {\n padding-left: 1rem !important;\n }\n .ps-xl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xl-5 {\n padding-left: 3rem !important;\n }\n .gap-xl-0 {\n gap: 0 !important;\n }\n .gap-xl-1 {\n gap: 0.25rem !important;\n }\n .gap-xl-2 {\n gap: 0.5rem !important;\n }\n .gap-xl-3 {\n gap: 1rem !important;\n }\n .gap-xl-4 {\n gap: 1.5rem !important;\n }\n .gap-xl-5 {\n gap: 3rem !important;\n }\n .row-gap-xl-0 {\n row-gap: 0 !important;\n }\n .row-gap-xl-1 {\n row-gap: 0.25rem !important;\n }\n .row-gap-xl-2 {\n row-gap: 0.5rem !important;\n }\n .row-gap-xl-3 {\n row-gap: 1rem !important;\n }\n .row-gap-xl-4 {\n row-gap: 1.5rem !important;\n }\n .row-gap-xl-5 {\n row-gap: 3rem !important;\n }\n .column-gap-xl-0 {\n -moz-column-gap: 0 !important;\n column-gap: 0 !important;\n }\n .column-gap-xl-1 {\n -moz-column-gap: 0.25rem !important;\n column-gap: 0.25rem !important;\n }\n .column-gap-xl-2 {\n -moz-column-gap: 0.5rem !important;\n column-gap: 0.5rem !important;\n }\n .column-gap-xl-3 {\n -moz-column-gap: 1rem !important;\n column-gap: 1rem !important;\n }\n .column-gap-xl-4 {\n -moz-column-gap: 1.5rem !important;\n column-gap: 1.5rem !important;\n }\n .column-gap-xl-5 {\n -moz-column-gap: 3rem !important;\n column-gap: 3rem !important;\n }\n .text-xl-start {\n text-align: left !important;\n }\n .text-xl-end {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n@media (min-width: 1400px) {\n .float-xxl-start {\n float: left !important;\n }\n .float-xxl-end {\n float: right !important;\n }\n .float-xxl-none {\n float: none !important;\n }\n .object-fit-xxl-contain {\n -o-object-fit: contain !important;\n object-fit: contain !important;\n }\n .object-fit-xxl-cover {\n -o-object-fit: cover !important;\n object-fit: cover !important;\n }\n .object-fit-xxl-fill {\n -o-object-fit: fill !important;\n object-fit: fill !important;\n }\n .object-fit-xxl-scale {\n -o-object-fit: scale-down !important;\n object-fit: scale-down !important;\n }\n .object-fit-xxl-none {\n -o-object-fit: none !important;\n object-fit: none !important;\n }\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-grid {\n display: grid !important;\n }\n .d-xxl-inline-grid {\n display: inline-grid !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n .d-xxl-none {\n display: none !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n .order-xxl-first {\n order: -1 !important;\n }\n .order-xxl-0 {\n order: 0 !important;\n }\n .order-xxl-1 {\n order: 1 !important;\n }\n .order-xxl-2 {\n order: 2 !important;\n }\n .order-xxl-3 {\n order: 3 !important;\n }\n .order-xxl-4 {\n order: 4 !important;\n }\n .order-xxl-5 {\n order: 5 !important;\n }\n .order-xxl-last {\n order: 6 !important;\n }\n .m-xxl-0 {\n margin: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n .m-xxl-3 {\n margin: 1rem !important;\n }\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n .m-xxl-5 {\n margin: 3rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mx-xxl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xxl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xxl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xxl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xxl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xxl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xxl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n .me-xxl-0 {\n margin-right: 0 !important;\n }\n .me-xxl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xxl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xxl-3 {\n margin-right: 1rem !important;\n }\n .me-xxl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xxl-5 {\n margin-right: 3rem !important;\n }\n .me-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n .ms-xxl-0 {\n margin-left: 0 !important;\n }\n .ms-xxl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xxl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xxl-3 {\n margin-left: 1rem !important;\n }\n .ms-xxl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xxl-5 {\n margin-left: 3rem !important;\n }\n .ms-xxl-auto {\n margin-left: auto !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n .p-xxl-3 {\n padding: 1rem !important;\n }\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n .p-xxl-5 {\n padding: 3rem !important;\n }\n .px-xxl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xxl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xxl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xxl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xxl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xxl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n .pe-xxl-0 {\n padding-right: 0 !important;\n }\n .pe-xxl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xxl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xxl-3 {\n padding-right: 1rem !important;\n }\n .pe-xxl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xxl-5 {\n padding-right: 3rem !important;\n }\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xxl-0 {\n padding-left: 0 !important;\n }\n .ps-xxl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xxl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xxl-3 {\n padding-left: 1rem !important;\n }\n .ps-xxl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xxl-5 {\n padding-left: 3rem !important;\n }\n .gap-xxl-0 {\n gap: 0 !important;\n }\n .gap-xxl-1 {\n gap: 0.25rem !important;\n }\n .gap-xxl-2 {\n gap: 0.5rem !important;\n }\n .gap-xxl-3 {\n gap: 1rem !important;\n }\n .gap-xxl-4 {\n gap: 1.5rem !important;\n }\n .gap-xxl-5 {\n gap: 3rem !important;\n }\n .row-gap-xxl-0 {\n row-gap: 0 !important;\n }\n .row-gap-xxl-1 {\n row-gap: 0.25rem !important;\n }\n .row-gap-xxl-2 {\n row-gap: 0.5rem !important;\n }\n .row-gap-xxl-3 {\n row-gap: 1rem !important;\n }\n .row-gap-xxl-4 {\n row-gap: 1.5rem !important;\n }\n .row-gap-xxl-5 {\n row-gap: 3rem !important;\n }\n .column-gap-xxl-0 {\n -moz-column-gap: 0 !important;\n column-gap: 0 !important;\n }\n .column-gap-xxl-1 {\n -moz-column-gap: 0.25rem !important;\n column-gap: 0.25rem !important;\n }\n .column-gap-xxl-2 {\n -moz-column-gap: 0.5rem !important;\n column-gap: 0.5rem !important;\n }\n .column-gap-xxl-3 {\n -moz-column-gap: 1rem !important;\n column-gap: 1rem !important;\n }\n .column-gap-xxl-4 {\n -moz-column-gap: 1.5rem !important;\n column-gap: 1.5rem !important;\n }\n .column-gap-xxl-5 {\n -moz-column-gap: 3rem !important;\n column-gap: 3rem !important;\n }\n .text-xxl-start {\n text-align: left !important;\n }\n .text-xxl-end {\n text-align: right !important;\n }\n .text-xxl-center {\n text-align: center !important;\n }\n}\n@media (min-width: 1200px) {\n .fs-1 {\n font-size: 2.5rem !important;\n }\n .fs-2 {\n font-size: 2rem !important;\n }\n .fs-3 {\n font-size: 1.75rem !important;\n }\n .fs-4 {\n font-size: 1.5rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-grid {\n display: grid !important;\n }\n .d-print-inline-grid {\n display: inline-grid !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n .d-print-none {\n display: none !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap.css.map */","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n @include font-size(var(--#{$prefix}root-font-size));\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$prefix}body-font-family);\n @include font-size(var(--#{$prefix}body-font-size));\n font-weight: var(--#{$prefix}body-font-weight);\n line-height: var(--#{$prefix}body-line-height);\n color: var(--#{$prefix}body-color);\n text-align: var(--#{$prefix}body-text-align);\n background-color: var(--#{$prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n opacity: $hr-opacity;\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: var(--#{$prefix}heading-color);\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 2. Add explicit cursor to indicate changed behavior.\n// 3. Prevent the text-decoration to be skipped.\n\nabbr[title] {\n text-decoration: underline dotted; // 1\n cursor: help; // 2\n text-decoration-skip-ink: none; // 3\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n color: var(--#{$prefix}highlight-color);\n background-color: var(--#{$prefix}highlight-bg);\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, 1));\n text-decoration: $link-decoration;\n\n &:hover {\n --#{$prefix}link-color-rgb: var(--#{$prefix}link-hover-color-rgb);\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: var(--#{$prefix}code-color);\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`

Drag & Drop an image here or click to select an image from your device.

All uploaded images are processed locally in your browser. No data is sent to any server.

Image selection options
Text options
Licensed under The MIT License (MIT)
Capture image
Download Meme
meme preview
Remove text

Are you sure you want to remove this text box?

\ No newline at end of file +Meme Generator

Drag & Drop an image here or click to select an image from your device.

All uploaded images are processed locally in your browser. No data is sent to any server.

Image selection options
Text options
Licensed under The MIT License (MIT)
Capture image
Download Meme
meme preview
Remove text

Are you sure you want to remove this text box?

\ No newline at end of file diff --git a/index.runtime.34c3c44d.js b/index.runtime.ddd227ef.js similarity index 91% rename from index.runtime.34c3c44d.js rename to index.runtime.ddd227ef.js index 89c2f66..07e976f 100644 --- a/index.runtime.34c3c44d.js +++ b/index.runtime.ddd227ef.js @@ -1,2 +1,2 @@ -var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},t={},r={},o=e.parcelRequire5078;null==o&&((o=function(e){if(e in t)return t[e].exports;if(e in r){var o=r[e];delete r[e];var a={id:e,exports:{}};return t[e]=a,o.call(a.exports,a,a.exports),a.exports}var n=Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}).register=function(e,t){r[e]=t},e.parcelRequire5078=o),(0,o.register)("kyEFX",function(e,t){Object.defineProperty(e.exports,"register",{get:function(){return r},set:function(e){return r=e},enumerable:!0,configurable:!0});var r,o=new Map;r=function(e,t){for(var r=0;r","node_modules/@parcel/runtime-js/lib/helpers/bundle-manifest.js","node_modules/@parcel/runtime-js/lib/runtime-ffee2af87b603459.js"],"sourcesContent":["\nfunction $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\n\n var $parcel$global =\n typeof globalThis !== 'undefined'\n ? globalThis\n : typeof self !== 'undefined'\n ? self\n : typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : {};\n \nvar $parcel$modules = {};\nvar $parcel$inits = {};\n\nvar parcelRequire = $parcel$global[\"parcelRequire5078\"];\n\nif (parcelRequire == null) {\n parcelRequire = function(id) {\n if (id in $parcel$modules) {\n return $parcel$modules[id].exports;\n }\n if (id in $parcel$inits) {\n var init = $parcel$inits[id];\n delete $parcel$inits[id];\n var module = {id: id, exports: {}};\n $parcel$modules[id] = module;\n init.call(module.exports, module, module.exports);\n return module.exports;\n }\n var err = new Error(\"Cannot find module '\" + id + \"'\");\n err.code = 'MODULE_NOT_FOUND';\n throw err;\n };\n\n parcelRequire.register = function register(id, init) {\n $parcel$inits[id] = init;\n };\n\n $parcel$global[\"parcelRequire5078\"] = parcelRequire;\n}\n\nvar parcelRegister = parcelRequire.register;\nparcelRegister(\"kyEFX\", function(module, exports) {\n\n$parcel$export(module.exports, \"register\", function () { return $ef7689007096c8a0$export$6503ec6e8aabbaf; }, function (v) { return $ef7689007096c8a0$export$6503ec6e8aabbaf = v; });\nvar $ef7689007096c8a0$export$6503ec6e8aabbaf;\nvar $ef7689007096c8a0$export$f7ad0328861e2f03;\n\"use strict\";\nvar $ef7689007096c8a0$var$mapping = new Map();\nfunction $ef7689007096c8a0$var$register(baseUrl, manifest) {\n for(var i = 0; i < manifest.length - 1; i += 2)$ef7689007096c8a0$var$mapping.set(manifest[i], {\n baseUrl: baseUrl,\n path: manifest[i + 1]\n });\n}\nfunction $ef7689007096c8a0$var$resolve(id) {\n var resolved = $ef7689007096c8a0$var$mapping.get(id);\n if (resolved == null) throw new Error(\"Could not resolve bundle with id \" + id);\n return new URL(resolved.path, resolved.baseUrl).toString();\n}\n$ef7689007096c8a0$export$6503ec6e8aabbaf = $ef7689007096c8a0$var$register;\n$ef7689007096c8a0$export$f7ad0328861e2f03 = $ef7689007096c8a0$var$resolve;\n\n});\n\nvar $ad1a6b4fe7dee277$exports = {};\n\n(parcelRequire(\"kyEFX\")).register(new URL(\"\", import.meta.url).toString(), JSON.parse('[\"7bk21\",\"index.09064714.js\",\"lRBOd\",\"Pressuru.684952ea.ttf\",\"hOimC\",\"Oswald-Regular.89ec7d89.ttf\",\"c5nso\",\"Oswald-Bold.0f6a7ca6.ttf\",\"917SN\",\"Roboto-Regular.ca197847.ttf\",\"kCRYk\",\"Roboto-Bold.fdb9b54a.ttf\",\"7mTjM\",\"RobotoCondensed-Regular.d585f5c7.ttf\",\"bNJU7\",\"RobotoCondensed-Bold.e1f96d4b.ttf\",\"2zTNP\",\"CourierPrime-Regular.3a25a501.ttf\",\"6U5us\",\"CourierPrime-Bold.3d6bf689.ttf\",\"jadM2\",\"OpenSans-Regular.edf9e01b.ttf\",\"4rZHV\",\"OpenSans-Bold.8fceb72b.ttf\"]'));\n\n\n//# sourceMappingURL=index.runtime.34c3c44d.js.map\n","\"use strict\";\n\nvar mapping = new Map();\nfunction register(baseUrl, manifest) {\n for (var i = 0; i < manifest.length - 1; i += 2) {\n mapping.set(manifest[i], {\n baseUrl: baseUrl,\n path: manifest[i + 1]\n });\n }\n}\nfunction resolve(id) {\n var resolved = mapping.get(id);\n if (resolved == null) {\n throw new Error('Could not resolve bundle with id ' + id);\n }\n return new URL(resolved.path, resolved.baseUrl).toString();\n}\nmodule.exports.register = register;\nmodule.exports.resolve = resolve;","require('./helpers/bundle-manifest').register(new __parcel__URL__(\"\").toString(),JSON.parse(\"[\\\"7bk21\\\",\\\"index.09064714.js\\\",\\\"lRBOd\\\",\\\"Pressuru.684952ea.ttf\\\",\\\"hOimC\\\",\\\"Oswald-Regular.89ec7d89.ttf\\\",\\\"c5nso\\\",\\\"Oswald-Bold.0f6a7ca6.ttf\\\",\\\"917SN\\\",\\\"Roboto-Regular.ca197847.ttf\\\",\\\"kCRYk\\\",\\\"Roboto-Bold.fdb9b54a.ttf\\\",\\\"7mTjM\\\",\\\"RobotoCondensed-Regular.d585f5c7.ttf\\\",\\\"bNJU7\\\",\\\"RobotoCondensed-Bold.e1f96d4b.ttf\\\",\\\"2zTNP\\\",\\\"CourierPrime-Regular.3a25a501.ttf\\\",\\\"6U5us\\\",\\\"CourierPrime-Bold.3d6bf689.ttf\\\",\\\"jadM2\\\",\\\"OpenSans-Regular.edf9e01b.ttf\\\",\\\"4rZHV\\\",\\\"OpenSans-Bold.8fceb72b.ttf\\\"]\"));"],"names":["$parcel$global","globalThis","self","window","global","$parcel$modules","$parcel$inits","parcelRequire","id","exports","init","module","call","err","Error","code","register","parcelRegister","Object","defineProperty","get","$ef7689007096c8a0$export$6503ec6e8aabbaf","set","v","enumerable","configurable","$ef7689007096c8a0$var$mapping","Map","baseUrl","manifest","i","length","path","URL","url","toString","JSON","parse"],"version":3,"file":"index.runtime.34c3c44d.js.map"} \ No newline at end of file +{"mappings":"A,I,E,A,a,O,W,W,A,a,O,K,K,A,a,O,O,O,A,a,O,O,O,C,E,E,C,E,E,C,E,E,E,iB,A,O,I,A,C,E,S,C,E,G,K,E,O,C,C,E,C,O,C,G,K,E,C,I,E,C,C,E,A,Q,C,C,E,C,I,E,C,G,E,Q,C,C,E,O,C,C,E,C,E,E,I,C,E,O,C,E,E,O,E,E,O,A,C,I,E,A,M,uB,E,I,O,E,I,C,mB,C,C,E,Q,C,S,C,C,C,E,C,C,E,C,C,E,E,iB,C,G,A,C,E,E,Q,A,E,Q,S,C,C,C,E,O,c,C,E,O,C,W,C,I,W,O,C,E,I,S,C,E,O,E,C,E,W,C,E,a,C,C,GCEA,IAgBA,EAhBI,EAAU,IAAI,IAgBlB,EAfA,SAAkB,CAAO,CAAE,CAAQ,EACjC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAS,MAAM,CAAG,EAAG,GAAK,EAC5C,EAAQ,GAAG,CAAC,CAAQ,CAAC,EAAE,CAAE,CACvB,QAAS,EACT,KAAM,CAAQ,CAAC,EAAI,EAAE,AACvB,EAEJ,C,GCVA,AAAA,EAAA,SAAA,QAAA,CAA8C,IAAA,IAAoB,GAAA,YAAA,GAAA,EAAI,QAAQ,GAAG,KAAK,KAAK,CAAC","sources":["","node_modules/@parcel/runtime-js/lib/helpers/bundle-manifest.js","node_modules/@parcel/runtime-js/lib/runtime-ffee2af87b603459.js"],"sourcesContent":["\nfunction $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\n\n var $parcel$global =\n typeof globalThis !== 'undefined'\n ? globalThis\n : typeof self !== 'undefined'\n ? self\n : typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : {};\n \nvar $parcel$modules = {};\nvar $parcel$inits = {};\n\nvar parcelRequire = $parcel$global[\"parcelRequire5078\"];\n\nif (parcelRequire == null) {\n parcelRequire = function(id) {\n if (id in $parcel$modules) {\n return $parcel$modules[id].exports;\n }\n if (id in $parcel$inits) {\n var init = $parcel$inits[id];\n delete $parcel$inits[id];\n var module = {id: id, exports: {}};\n $parcel$modules[id] = module;\n init.call(module.exports, module, module.exports);\n return module.exports;\n }\n var err = new Error(\"Cannot find module '\" + id + \"'\");\n err.code = 'MODULE_NOT_FOUND';\n throw err;\n };\n\n parcelRequire.register = function register(id, init) {\n $parcel$inits[id] = init;\n };\n\n $parcel$global[\"parcelRequire5078\"] = parcelRequire;\n}\n\nvar parcelRegister = parcelRequire.register;\nparcelRegister(\"kyEFX\", function(module, exports) {\n\n$parcel$export(module.exports, \"register\", function () { return $ef7689007096c8a0$export$6503ec6e8aabbaf; }, function (v) { return $ef7689007096c8a0$export$6503ec6e8aabbaf = v; });\nvar $ef7689007096c8a0$export$6503ec6e8aabbaf;\nvar $ef7689007096c8a0$export$f7ad0328861e2f03;\n\"use strict\";\nvar $ef7689007096c8a0$var$mapping = new Map();\nfunction $ef7689007096c8a0$var$register(baseUrl, manifest) {\n for(var i = 0; i < manifest.length - 1; i += 2)$ef7689007096c8a0$var$mapping.set(manifest[i], {\n baseUrl: baseUrl,\n path: manifest[i + 1]\n });\n}\nfunction $ef7689007096c8a0$var$resolve(id) {\n var resolved = $ef7689007096c8a0$var$mapping.get(id);\n if (resolved == null) throw new Error(\"Could not resolve bundle with id \" + id);\n return new URL(resolved.path, resolved.baseUrl).toString();\n}\n$ef7689007096c8a0$export$6503ec6e8aabbaf = $ef7689007096c8a0$var$register;\n$ef7689007096c8a0$export$f7ad0328861e2f03 = $ef7689007096c8a0$var$resolve;\n\n});\n\nvar $ad1a6b4fe7dee277$exports = {};\n\n(parcelRequire(\"kyEFX\")).register(new URL(\"\", import.meta.url).toString(), JSON.parse('[\"7bk21\",\"index.4434df8a.js\",\"lRBOd\",\"Pressuru.684952ea.ttf\",\"hOimC\",\"Oswald-Regular.89ec7d89.ttf\",\"c5nso\",\"Oswald-Bold.0f6a7ca6.ttf\",\"917SN\",\"Roboto-Regular.ca197847.ttf\",\"kCRYk\",\"Roboto-Bold.fdb9b54a.ttf\",\"7mTjM\",\"RobotoCondensed-Regular.d585f5c7.ttf\",\"bNJU7\",\"RobotoCondensed-Bold.e1f96d4b.ttf\",\"2zTNP\",\"CourierPrime-Regular.3a25a501.ttf\",\"6U5us\",\"CourierPrime-Bold.3d6bf689.ttf\",\"jadM2\",\"OpenSans-Regular.edf9e01b.ttf\",\"4rZHV\",\"OpenSans-Bold.8fceb72b.ttf\"]'));\n\n\n//# sourceMappingURL=index.runtime.ddd227ef.js.map\n","\"use strict\";\n\nvar mapping = new Map();\nfunction register(baseUrl, manifest) {\n for (var i = 0; i < manifest.length - 1; i += 2) {\n mapping.set(manifest[i], {\n baseUrl: baseUrl,\n path: manifest[i + 1]\n });\n }\n}\nfunction resolve(id) {\n var resolved = mapping.get(id);\n if (resolved == null) {\n throw new Error('Could not resolve bundle with id ' + id);\n }\n return new URL(resolved.path, resolved.baseUrl).toString();\n}\nmodule.exports.register = register;\nmodule.exports.resolve = resolve;","require('./helpers/bundle-manifest').register(new __parcel__URL__(\"\").toString(),JSON.parse(\"[\\\"7bk21\\\",\\\"index.4434df8a.js\\\",\\\"lRBOd\\\",\\\"Pressuru.684952ea.ttf\\\",\\\"hOimC\\\",\\\"Oswald-Regular.89ec7d89.ttf\\\",\\\"c5nso\\\",\\\"Oswald-Bold.0f6a7ca6.ttf\\\",\\\"917SN\\\",\\\"Roboto-Regular.ca197847.ttf\\\",\\\"kCRYk\\\",\\\"Roboto-Bold.fdb9b54a.ttf\\\",\\\"7mTjM\\\",\\\"RobotoCondensed-Regular.d585f5c7.ttf\\\",\\\"bNJU7\\\",\\\"RobotoCondensed-Bold.e1f96d4b.ttf\\\",\\\"2zTNP\\\",\\\"CourierPrime-Regular.3a25a501.ttf\\\",\\\"6U5us\\\",\\\"CourierPrime-Bold.3d6bf689.ttf\\\",\\\"jadM2\\\",\\\"OpenSans-Regular.edf9e01b.ttf\\\",\\\"4rZHV\\\",\\\"OpenSans-Bold.8fceb72b.ttf\\\"]\"));"],"names":["$parcel$global","globalThis","self","window","global","$parcel$modules","$parcel$inits","parcelRequire","id","exports","init","module","call","err","Error","code","register","parcelRegister","Object","defineProperty","get","$ef7689007096c8a0$export$6503ec6e8aabbaf","set","v","enumerable","configurable","$ef7689007096c8a0$var$mapping","Map","baseUrl","manifest","i","length","path","URL","url","toString","JSON","parse"],"version":3,"file":"index.runtime.ddd227ef.js.map"} \ No newline at end of file diff --git a/index.runtime.491ea605.js b/index.runtime.fd3a20bd.js similarity index 91% rename from index.runtime.491ea605.js rename to index.runtime.fd3a20bd.js index dbdb18b..a58b3d8 100644 --- a/index.runtime.491ea605.js +++ b/index.runtime.fd3a20bd.js @@ -1,2 +1,2 @@ -!function(){function e(e,t,r,n){Object.defineProperty(e,t,{get:r,set:n,enumerable:!0,configurable:!0})}var t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},r={},n={},o=t.parcelRequire5078;null==o&&((o=function(e){if(e in r)return r[e].exports;if(e in n){var t=n[e];delete n[e];var o={id:e,exports:{}};return r[e]=o,t.call(o.exports,o,o.exports),o.exports}var f=Error("Cannot find module '"+e+"'");throw f.code="MODULE_NOT_FOUND",f}).register=function(e,t){n[e]=t},t.parcelRequire5078=o);var f=o.register;f("iE7OH",function(t,r){e(t.exports,"register",function(){return n},function(e){return n=e});var n,o=new Map;n=function(e,t){for(var r=0;r","node_modules/@parcel/runtime-js/lib/helpers/bundle-manifest.js","node_modules/@parcel/runtime-js/lib/helpers/bundle-url.js","node_modules/@parcel/runtime-js/lib/runtime-665ca6fee027a65a.js"],"sourcesContent":["(function () {\n\nfunction $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\n\n var $parcel$global =\n typeof globalThis !== 'undefined'\n ? globalThis\n : typeof self !== 'undefined'\n ? self\n : typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : {};\n \nvar $parcel$modules = {};\nvar $parcel$inits = {};\n\nvar parcelRequire = $parcel$global[\"parcelRequire5078\"];\n\nif (parcelRequire == null) {\n parcelRequire = function(id) {\n if (id in $parcel$modules) {\n return $parcel$modules[id].exports;\n }\n if (id in $parcel$inits) {\n var init = $parcel$inits[id];\n delete $parcel$inits[id];\n var module = {id: id, exports: {}};\n $parcel$modules[id] = module;\n init.call(module.exports, module, module.exports);\n return module.exports;\n }\n var err = new Error(\"Cannot find module '\" + id + \"'\");\n err.code = 'MODULE_NOT_FOUND';\n throw err;\n };\n\n parcelRequire.register = function register(id, init) {\n $parcel$inits[id] = init;\n };\n\n $parcel$global[\"parcelRequire5078\"] = parcelRequire;\n}\n\nvar parcelRegister = parcelRequire.register;\nparcelRegister(\"iE7OH\", function(module, exports) {\n\n$parcel$export(module.exports, \"register\", function () { return $0380ce8f1f064ccc$export$6503ec6e8aabbaf; }, function (v) { return $0380ce8f1f064ccc$export$6503ec6e8aabbaf = v; });\nvar $0380ce8f1f064ccc$export$6503ec6e8aabbaf;\nvar $0380ce8f1f064ccc$export$f7ad0328861e2f03;\n\"use strict\";\nvar $0380ce8f1f064ccc$var$mapping = new Map();\nfunction $0380ce8f1f064ccc$var$register(baseUrl, manifest) {\n for(var i = 0; i < manifest.length - 1; i += 2)$0380ce8f1f064ccc$var$mapping.set(manifest[i], {\n baseUrl: baseUrl,\n path: manifest[i + 1]\n });\n}\nfunction $0380ce8f1f064ccc$var$resolve(id) {\n var resolved = $0380ce8f1f064ccc$var$mapping.get(id);\n if (resolved == null) throw new Error(\"Could not resolve bundle with id \" + id);\n return new URL(resolved.path, resolved.baseUrl).toString();\n}\n$0380ce8f1f064ccc$export$6503ec6e8aabbaf = $0380ce8f1f064ccc$var$register;\n$0380ce8f1f064ccc$export$f7ad0328861e2f03 = $0380ce8f1f064ccc$var$resolve;\n\n});\n\nparcelRegister(\"aNJCr\", function(module, exports) {\n\n$parcel$export(module.exports, \"getBundleURL\", function () { return $7dd1ddf6834435ca$export$bdfd709ae4826697; }, function (v) { return $7dd1ddf6834435ca$export$bdfd709ae4826697 = v; });\nvar $7dd1ddf6834435ca$export$bdfd709ae4826697;\nvar $7dd1ddf6834435ca$export$c9e73fbda7da57b6;\nvar $7dd1ddf6834435ca$export$5a759dc7a1cfb72a;\n\"use strict\";\nvar $7dd1ddf6834435ca$var$bundleURL = {};\nfunction $7dd1ddf6834435ca$var$getBundleURLCached(id) {\n var value = $7dd1ddf6834435ca$var$bundleURL[id];\n if (!value) {\n value = $7dd1ddf6834435ca$var$getBundleURL();\n $7dd1ddf6834435ca$var$bundleURL[id] = value;\n }\n return value;\n}\nfunction $7dd1ddf6834435ca$var$getBundleURL() {\n try {\n throw new Error();\n } catch (err) {\n var matches = (\"\" + err.stack).match(/(https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/[^)\\n]+/g);\n if (matches) // The first two stack frames will be this function and getBundleURLCached.\n // Use the 3rd one, which will be a runtime in the original bundle.\n return $7dd1ddf6834435ca$var$getBaseURL(matches[2]);\n }\n return \"/\";\n}\nfunction $7dd1ddf6834435ca$var$getBaseURL(url) {\n return (\"\" + url).replace(/^((?:https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/.+)\\/[^/]+$/, \"$1\") + \"/\";\n}\n// TODO: Replace uses with `new URL(url).origin` when ie11 is no longer supported.\nfunction $7dd1ddf6834435ca$var$getOrigin(url) {\n var matches = (\"\" + url).match(/(https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/[^/]+/);\n if (!matches) throw new Error(\"Origin not found\");\n return matches[0];\n}\n$7dd1ddf6834435ca$export$bdfd709ae4826697 = $7dd1ddf6834435ca$var$getBundleURLCached;\n$7dd1ddf6834435ca$export$c9e73fbda7da57b6 = $7dd1ddf6834435ca$var$getBaseURL;\n$7dd1ddf6834435ca$export$5a759dc7a1cfb72a = $7dd1ddf6834435ca$var$getOrigin;\n\n});\n\nvar $fcfb86b9e6ae5544$exports = {};\n\n\n(parcelRequire(\"iE7OH\")).register((parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\"), JSON.parse('[\"9p9yL\",\"index.6d86f4dd.js\",\"EzZtK\",\"Pressuru.684952ea.ttf\",\"60MKY\",\"Oswald-Regular.89ec7d89.ttf\",\"6eP3Z\",\"Oswald-Bold.0f6a7ca6.ttf\",\"2o0AT\",\"Roboto-Regular.ca197847.ttf\",\"4xbeZ\",\"Roboto-Bold.fdb9b54a.ttf\",\"33Gxj\",\"RobotoCondensed-Regular.d585f5c7.ttf\",\"jWeQN\",\"RobotoCondensed-Bold.e1f96d4b.ttf\",\"d49QV\",\"CourierPrime-Regular.3a25a501.ttf\",\"6LGb0\",\"CourierPrime-Bold.3d6bf689.ttf\",\"3GM8h\",\"OpenSans-Regular.edf9e01b.ttf\",\"imsJw\",\"OpenSans-Bold.8fceb72b.ttf\",\"jm0TH\",\"index.f1f30278.css\"]'));\n\n})();\n//# sourceMappingURL=index.runtime.491ea605.js.map\n","\"use strict\";\n\nvar mapping = new Map();\nfunction register(baseUrl, manifest) {\n for (var i = 0; i < manifest.length - 1; i += 2) {\n mapping.set(manifest[i], {\n baseUrl: baseUrl,\n path: manifest[i + 1]\n });\n }\n}\nfunction resolve(id) {\n var resolved = mapping.get(id);\n if (resolved == null) {\n throw new Error('Could not resolve bundle with id ' + id);\n }\n return new URL(resolved.path, resolved.baseUrl).toString();\n}\nmodule.exports.register = register;\nmodule.exports.resolve = resolve;","\"use strict\";\n\nvar bundleURL = {};\nfunction getBundleURLCached(id) {\n var value = bundleURL[id];\n if (!value) {\n value = getBundleURL();\n bundleURL[id] = value;\n }\n return value;\n}\nfunction getBundleURL() {\n try {\n throw new Error();\n } catch (err) {\n var matches = ('' + err.stack).match(/(https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/[^)\\n]+/g);\n if (matches) {\n // The first two stack frames will be this function and getBundleURLCached.\n // Use the 3rd one, which will be a runtime in the original bundle.\n return getBaseURL(matches[2]);\n }\n }\n return '/';\n}\nfunction getBaseURL(url) {\n return ('' + url).replace(/^((?:https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/.+)\\/[^/]+$/, '$1') + '/';\n}\n\n// TODO: Replace uses with `new URL(url).origin` when ie11 is no longer supported.\nfunction getOrigin(url) {\n var matches = ('' + url).match(/(https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/[^/]+/);\n if (!matches) {\n throw new Error('Origin not found');\n }\n return matches[0];\n}\nexports.getBundleURL = getBundleURLCached;\nexports.getBaseURL = getBaseURL;\nexports.getOrigin = getOrigin;","require('./helpers/bundle-manifest').register(require('./helpers/bundle-url').getBundleURL('9p9yL'),JSON.parse(\"[\\\"9p9yL\\\",\\\"index.6d86f4dd.js\\\",\\\"EzZtK\\\",\\\"Pressuru.684952ea.ttf\\\",\\\"60MKY\\\",\\\"Oswald-Regular.89ec7d89.ttf\\\",\\\"6eP3Z\\\",\\\"Oswald-Bold.0f6a7ca6.ttf\\\",\\\"2o0AT\\\",\\\"Roboto-Regular.ca197847.ttf\\\",\\\"4xbeZ\\\",\\\"Roboto-Bold.fdb9b54a.ttf\\\",\\\"33Gxj\\\",\\\"RobotoCondensed-Regular.d585f5c7.ttf\\\",\\\"jWeQN\\\",\\\"RobotoCondensed-Bold.e1f96d4b.ttf\\\",\\\"d49QV\\\",\\\"CourierPrime-Regular.3a25a501.ttf\\\",\\\"6LGb0\\\",\\\"CourierPrime-Bold.3d6bf689.ttf\\\",\\\"3GM8h\\\",\\\"OpenSans-Regular.edf9e01b.ttf\\\",\\\"imsJw\\\",\\\"OpenSans-Bold.8fceb72b.ttf\\\",\\\"jm0TH\\\",\\\"index.f1f30278.css\\\"]\"));"],"names":["$parcel$export","e","n","v","s","Object","defineProperty","get","set","enumerable","configurable","$parcel$global","globalThis","self","window","global","$parcel$modules","$parcel$inits","parcelRequire","id","exports","init","module","call","err","Error","code","register","parcelRegister","$0380ce8f1f064ccc$export$6503ec6e8aabbaf","$0380ce8f1f064ccc$var$mapping","Map","baseUrl","manifest","i","length","path","$7dd1ddf6834435ca$export$bdfd709ae4826697","$7dd1ddf6834435ca$var$bundleURL","value","$7dd1ddf6834435ca$var$getBundleURL","matches","stack","match","replace","getBundleURL","JSON","parse"],"version":3,"file":"index.runtime.491ea605.js.map"} \ No newline at end of file +{"mappings":"C,A,W,S,E,C,C,C,C,C,C,C,E,O,c,C,E,E,C,I,E,I,E,W,C,E,a,C,C,E,C,I,E,A,a,O,W,W,A,a,O,K,K,A,a,O,O,O,A,a,O,O,O,C,E,E,C,E,E,C,E,E,E,iB,A,O,I,A,C,E,S,C,E,G,K,E,O,C,C,E,C,O,C,G,K,E,C,I,E,C,C,E,A,Q,C,C,E,C,I,E,C,G,E,Q,C,C,E,O,C,C,E,C,E,E,I,C,E,O,C,E,E,O,E,E,O,A,C,I,E,A,M,uB,E,I,O,E,I,C,mB,C,C,E,Q,C,S,C,C,C,E,C,C,E,C,C,E,E,iB,C,G,I,E,E,Q,C,E,Q,S,C,C,C,E,E,E,O,C,W,W,O,C,E,S,C,E,O,E,C,GCEA,IAgBA,EAhBI,EAAU,IAAI,IAgBlB,EAfA,SAAkB,CAAO,CAAE,CAAQ,EACjC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAS,MAAM,CAAG,EAAG,GAAK,EAC5C,EAAQ,GAAG,CAAC,CAAQ,CAAC,EAAE,CAAE,CACvB,QAAS,EACT,KAAM,CAAQ,CAAC,EAAI,EAAE,AACvB,EAEJ,C,G,E,Q,S,C,C,C,E,E,E,O,C,e,W,O,C,E,S,C,E,O,E,C,GCRA,IAkCA,EAlCI,EAAY,CAAC,EAkCjB,EAjCA,SAA4B,CAAE,EAC5B,IAAI,EAAQ,CAAS,CAAC,EAAG,CAKzB,OAJK,IACH,EAAQ,AAKZ,WACE,GAAI,CACF,MAAM,AAAI,OACZ,CAAE,MAAO,EAAK,CACZ,IAAI,EAAW,AAAA,CAAA,GAAK,EAAI,KAAI,AAAJ,EAAO,KAAK,CAAC,oEACrC,GAAI,EAGF,MAMI,AAAA,CAAA,GANc,CAAO,CAAC,EAAE,AAMnB,EAAK,OAAO,CAAC,0EAA2E,MAAQ,GAJ7G,CACA,MAAO,GACT,IAhBI,CAAS,CAAC,EAAG,CAAG,GAEX,CACT,C,GCVA,AAAA,EAAA,SAAA,QAAA,CAA8C,AAAA,EAAA,SAAA,YAAA,CAA6C,SAAS,KAAK,KAAK,CAAC,0sB","sources":["","node_modules/@parcel/runtime-js/lib/helpers/bundle-manifest.js","node_modules/@parcel/runtime-js/lib/helpers/bundle-url.js","node_modules/@parcel/runtime-js/lib/runtime-665ca6fee027a65a.js"],"sourcesContent":["(function () {\n\nfunction $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\n\n var $parcel$global =\n typeof globalThis !== 'undefined'\n ? globalThis\n : typeof self !== 'undefined'\n ? self\n : typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : {};\n \nvar $parcel$modules = {};\nvar $parcel$inits = {};\n\nvar parcelRequire = $parcel$global[\"parcelRequire5078\"];\n\nif (parcelRequire == null) {\n parcelRequire = function(id) {\n if (id in $parcel$modules) {\n return $parcel$modules[id].exports;\n }\n if (id in $parcel$inits) {\n var init = $parcel$inits[id];\n delete $parcel$inits[id];\n var module = {id: id, exports: {}};\n $parcel$modules[id] = module;\n init.call(module.exports, module, module.exports);\n return module.exports;\n }\n var err = new Error(\"Cannot find module '\" + id + \"'\");\n err.code = 'MODULE_NOT_FOUND';\n throw err;\n };\n\n parcelRequire.register = function register(id, init) {\n $parcel$inits[id] = init;\n };\n\n $parcel$global[\"parcelRequire5078\"] = parcelRequire;\n}\n\nvar parcelRegister = parcelRequire.register;\nparcelRegister(\"iE7OH\", function(module, exports) {\n\n$parcel$export(module.exports, \"register\", function () { return $0380ce8f1f064ccc$export$6503ec6e8aabbaf; }, function (v) { return $0380ce8f1f064ccc$export$6503ec6e8aabbaf = v; });\nvar $0380ce8f1f064ccc$export$6503ec6e8aabbaf;\nvar $0380ce8f1f064ccc$export$f7ad0328861e2f03;\n\"use strict\";\nvar $0380ce8f1f064ccc$var$mapping = new Map();\nfunction $0380ce8f1f064ccc$var$register(baseUrl, manifest) {\n for(var i = 0; i < manifest.length - 1; i += 2)$0380ce8f1f064ccc$var$mapping.set(manifest[i], {\n baseUrl: baseUrl,\n path: manifest[i + 1]\n });\n}\nfunction $0380ce8f1f064ccc$var$resolve(id) {\n var resolved = $0380ce8f1f064ccc$var$mapping.get(id);\n if (resolved == null) throw new Error(\"Could not resolve bundle with id \" + id);\n return new URL(resolved.path, resolved.baseUrl).toString();\n}\n$0380ce8f1f064ccc$export$6503ec6e8aabbaf = $0380ce8f1f064ccc$var$register;\n$0380ce8f1f064ccc$export$f7ad0328861e2f03 = $0380ce8f1f064ccc$var$resolve;\n\n});\n\nparcelRegister(\"aNJCr\", function(module, exports) {\n\n$parcel$export(module.exports, \"getBundleURL\", function () { return $7dd1ddf6834435ca$export$bdfd709ae4826697; }, function (v) { return $7dd1ddf6834435ca$export$bdfd709ae4826697 = v; });\nvar $7dd1ddf6834435ca$export$bdfd709ae4826697;\nvar $7dd1ddf6834435ca$export$c9e73fbda7da57b6;\nvar $7dd1ddf6834435ca$export$5a759dc7a1cfb72a;\n\"use strict\";\nvar $7dd1ddf6834435ca$var$bundleURL = {};\nfunction $7dd1ddf6834435ca$var$getBundleURLCached(id) {\n var value = $7dd1ddf6834435ca$var$bundleURL[id];\n if (!value) {\n value = $7dd1ddf6834435ca$var$getBundleURL();\n $7dd1ddf6834435ca$var$bundleURL[id] = value;\n }\n return value;\n}\nfunction $7dd1ddf6834435ca$var$getBundleURL() {\n try {\n throw new Error();\n } catch (err) {\n var matches = (\"\" + err.stack).match(/(https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/[^)\\n]+/g);\n if (matches) // The first two stack frames will be this function and getBundleURLCached.\n // Use the 3rd one, which will be a runtime in the original bundle.\n return $7dd1ddf6834435ca$var$getBaseURL(matches[2]);\n }\n return \"/\";\n}\nfunction $7dd1ddf6834435ca$var$getBaseURL(url) {\n return (\"\" + url).replace(/^((?:https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/.+)\\/[^/]+$/, \"$1\") + \"/\";\n}\n// TODO: Replace uses with `new URL(url).origin` when ie11 is no longer supported.\nfunction $7dd1ddf6834435ca$var$getOrigin(url) {\n var matches = (\"\" + url).match(/(https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/[^/]+/);\n if (!matches) throw new Error(\"Origin not found\");\n return matches[0];\n}\n$7dd1ddf6834435ca$export$bdfd709ae4826697 = $7dd1ddf6834435ca$var$getBundleURLCached;\n$7dd1ddf6834435ca$export$c9e73fbda7da57b6 = $7dd1ddf6834435ca$var$getBaseURL;\n$7dd1ddf6834435ca$export$5a759dc7a1cfb72a = $7dd1ddf6834435ca$var$getOrigin;\n\n});\n\nvar $fcfb86b9e6ae5544$exports = {};\n\n\n(parcelRequire(\"iE7OH\")).register((parcelRequire(\"aNJCr\")).getBundleURL(\"9p9yL\"), JSON.parse('[\"9p9yL\",\"index.9a005d69.js\",\"EzZtK\",\"Pressuru.684952ea.ttf\",\"60MKY\",\"Oswald-Regular.89ec7d89.ttf\",\"6eP3Z\",\"Oswald-Bold.0f6a7ca6.ttf\",\"2o0AT\",\"Roboto-Regular.ca197847.ttf\",\"4xbeZ\",\"Roboto-Bold.fdb9b54a.ttf\",\"33Gxj\",\"RobotoCondensed-Regular.d585f5c7.ttf\",\"jWeQN\",\"RobotoCondensed-Bold.e1f96d4b.ttf\",\"d49QV\",\"CourierPrime-Regular.3a25a501.ttf\",\"6LGb0\",\"CourierPrime-Bold.3d6bf689.ttf\",\"3GM8h\",\"OpenSans-Regular.edf9e01b.ttf\",\"imsJw\",\"OpenSans-Bold.8fceb72b.ttf\",\"jm0TH\",\"index.b4cc57ad.css\"]'));\n\n})();\n//# sourceMappingURL=index.runtime.fd3a20bd.js.map\n","\"use strict\";\n\nvar mapping = new Map();\nfunction register(baseUrl, manifest) {\n for (var i = 0; i < manifest.length - 1; i += 2) {\n mapping.set(manifest[i], {\n baseUrl: baseUrl,\n path: manifest[i + 1]\n });\n }\n}\nfunction resolve(id) {\n var resolved = mapping.get(id);\n if (resolved == null) {\n throw new Error('Could not resolve bundle with id ' + id);\n }\n return new URL(resolved.path, resolved.baseUrl).toString();\n}\nmodule.exports.register = register;\nmodule.exports.resolve = resolve;","\"use strict\";\n\nvar bundleURL = {};\nfunction getBundleURLCached(id) {\n var value = bundleURL[id];\n if (!value) {\n value = getBundleURL();\n bundleURL[id] = value;\n }\n return value;\n}\nfunction getBundleURL() {\n try {\n throw new Error();\n } catch (err) {\n var matches = ('' + err.stack).match(/(https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/[^)\\n]+/g);\n if (matches) {\n // The first two stack frames will be this function and getBundleURLCached.\n // Use the 3rd one, which will be a runtime in the original bundle.\n return getBaseURL(matches[2]);\n }\n }\n return '/';\n}\nfunction getBaseURL(url) {\n return ('' + url).replace(/^((?:https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/.+)\\/[^/]+$/, '$1') + '/';\n}\n\n// TODO: Replace uses with `new URL(url).origin` when ie11 is no longer supported.\nfunction getOrigin(url) {\n var matches = ('' + url).match(/(https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/[^/]+/);\n if (!matches) {\n throw new Error('Origin not found');\n }\n return matches[0];\n}\nexports.getBundleURL = getBundleURLCached;\nexports.getBaseURL = getBaseURL;\nexports.getOrigin = getOrigin;","require('./helpers/bundle-manifest').register(require('./helpers/bundle-url').getBundleURL('9p9yL'),JSON.parse(\"[\\\"9p9yL\\\",\\\"index.9a005d69.js\\\",\\\"EzZtK\\\",\\\"Pressuru.684952ea.ttf\\\",\\\"60MKY\\\",\\\"Oswald-Regular.89ec7d89.ttf\\\",\\\"6eP3Z\\\",\\\"Oswald-Bold.0f6a7ca6.ttf\\\",\\\"2o0AT\\\",\\\"Roboto-Regular.ca197847.ttf\\\",\\\"4xbeZ\\\",\\\"Roboto-Bold.fdb9b54a.ttf\\\",\\\"33Gxj\\\",\\\"RobotoCondensed-Regular.d585f5c7.ttf\\\",\\\"jWeQN\\\",\\\"RobotoCondensed-Bold.e1f96d4b.ttf\\\",\\\"d49QV\\\",\\\"CourierPrime-Regular.3a25a501.ttf\\\",\\\"6LGb0\\\",\\\"CourierPrime-Bold.3d6bf689.ttf\\\",\\\"3GM8h\\\",\\\"OpenSans-Regular.edf9e01b.ttf\\\",\\\"imsJw\\\",\\\"OpenSans-Bold.8fceb72b.ttf\\\",\\\"jm0TH\\\",\\\"index.b4cc57ad.css\\\"]\"));"],"names":["$parcel$export","e","n","v","s","Object","defineProperty","get","set","enumerable","configurable","$parcel$global","globalThis","self","window","global","$parcel$modules","$parcel$inits","parcelRequire","id","exports","init","module","call","err","Error","code","register","parcelRegister","$0380ce8f1f064ccc$export$6503ec6e8aabbaf","$0380ce8f1f064ccc$var$mapping","Map","baseUrl","manifest","i","length","path","$7dd1ddf6834435ca$export$bdfd709ae4826697","$7dd1ddf6834435ca$var$bundleURL","value","$7dd1ddf6834435ca$var$getBundleURL","matches","stack","match","replace","getBundleURL","JSON","parse"],"version":3,"file":"index.runtime.fd3a20bd.js.map"} \ No newline at end of file diff --git a/service-worker.js b/service-worker.js index aa76311..766fc2a 100644 --- a/service-worker.js +++ b/service-worker.js @@ -1,2 +1,2 @@ -if(!self.define){let e,a={};const d=(d,i)=>(d=new URL(d+".js",i).href,a[d]||new Promise((a=>{if("document"in self){const e=document.createElement("script");e.src=d,e.onload=a,document.head.appendChild(e)}else e=d,importScripts(d),a()})).then((()=>{let e=a[d];if(!e)throw new Error(`Module ${d} didn’t register its module`);return e})));self.define=(i,r)=>{const c=e||("document"in self?document.currentScript.src:"")||location.href;if(a[c])return;let b={};const f=e=>d(e,c),n={module:{uri:c},exports:b,require:f};a[c]=Promise.all(i.map((e=>n[e]||f(e)))).then((e=>(r(...e),b)))}}define(["./workbox-1c3383c2"],(function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"180.ad1ffa6f.png",revision:"e500d9d7377de6d701630c6345a20b99"},{url:"192.02439c4c.png",revision:"799182a75ab5b10e8b2088a717f0eff2"},{url:"384.3d08a4a6.png",revision:"3eb04d3a80b60e082d7f79e1614070fe"},{url:"512.00f88ae0.png",revision:"511ad055b1865aa9bda7886cb0b9e336"},{url:"add-image.bd815785.svg",revision:"8c00e51567cbd039981fffb87c61dab1"},{url:"afraid-to-ask-andy.2454e98b.jpg",revision:"5020cc5c4d4710296e8af54dfc5517df"},{url:"always-has-been.08a66422.jpg",revision:"d1b6401abd9cb8d382b7246bdb8ce0b5"},{url:"anakin-padme.03c6b194.jpg",revision:"baa00e8faccb9c63073f1db59274bd0d"},{url:"aperture.4bf28ce8.svg",revision:"1a6a5d3b06ba8aaa3e96658810752663"},{url:"are-you-sleeping-brain.973dd336.jpg",revision:"b9faa2c765251ba187c47706ad4162d5"},{url:"austin-powers-doctor-evil.55956b85.jpg",revision:"b4d4c37882914f3b7d7ed34483382453"},{url:"bad-luck-brian.8b018588.jpg",revision:"2bb70408a0ab18038a376d80da91d336"},{url:"batman-slapping-robin.aa8b8054.jpg",revision:"6695faabd1eb772936f31ff0af36111d"},{url:"be-honest.c8b465b5.jpg",revision:"09042974e2fb1edce4a05dacafa84c44"},{url:"bell-curve.1167fe19.jpg",revision:"e26dac38583f6f98ea8ef98e4dab71e1"},{url:"ben-affleck-smoking.17cc6114.jpg",revision:"512c246cb818579340a6dc8dddea4f87"},{url:"bernie.ec67393e.jpg",revision:"111d58f32112b92017c04f4a97070b68"},{url:"bill-murray-groundhog-day.35d04f25.jpg",revision:"859c5fb09ef45a22100519064955fa77"},{url:"camera-reverse.284e8ac9.svg",revision:"86e592b72bb2472bbacd0c823b3a3c78"},{url:"camera.ed7aa43f.svg",revision:"46f0c02466282ec5c4bf26141624316e"},{url:"captain-picard-facepalm.7690614a.jpg",revision:"926eecb6292d72fe2f99fd3113444c0b"},{url:"car-drift.9255750c.jpg",revision:"55b3735095d73c764704bccdda6f2bc1"},{url:"change-my-mind.35bc0d99.jpg",revision:"7537efe4cd5ddcf44de4dccacc1871e8"},{url:"chevron-down.ad14d981.svg",revision:"5635cc35f04030576a62d2d649824495"},{url:"chevron-left.20a2f252.svg",revision:"a8334bfa7ef65b1095bfd54557d69beb"},{url:"chevron-right.1be074ac.svg",revision:"3d72992183afc0c2f0b6bf010dadc2a1"},{url:"chevron-up.f532d8b6.svg",revision:"e1bd8bbacf48b185c4b3deb18b9e0f2d"},{url:"CourierPrime-Bold.3d6bf689.ttf",revision:"4acfa45d29d240044e0075a8e58f0862"},{url:"CourierPrime-Regular.3a25a501.ttf",revision:"fba4686ed1d1b4ef05ab14db78805dbe"},{url:"disappointed-guy.471a5a63.jpg",revision:"61980e7a343462d3bc7621d0d0cb8168"},{url:"disaster-girl.536b1af4.jpg",revision:"07542c2e7ea315f6a7b7311d2a88d074"},{url:"distracted-boyfriend.22708891.jpg",revision:"4ee61cd7c20689e2c8b7fa2dbffbdbc4"},{url:"drake-hotline-bling.99013af7.jpg",revision:"edce37df305e1b9c78d0a41ade363e29"},{url:"drowning-kid-in-the-pool.37435682.jpg",revision:"99e976a664709f7fe0b7141e2661a42b"},{url:"duplicate.04d08287.svg",revision:"e803d39c63ea0e2e910b1a989a059050"},{url:"favicon-192.02439c4c.png",revision:"799182a75ab5b10e8b2088a717f0eff2"},{url:"finding-neverland.25f9c4f0.jpg",revision:"4557c9d30b0e3114953f9cc8e981c622"},{url:"gear.b3b5d1a5.svg",revision:"5e0b2045d7dc4768b1ceb199d83ab6f0"},{url:"gibson-jesus.1224d195.jpg",revision:"b26e0d89414371dfbf7a1e1bbada7e15"},{url:"girls-gossiping.e83a2c6d.jpg",revision:"4af5d7b070e1af70cbd7670a7f37d045"},{url:"godfather.ad422d54.jpg",revision:"ea7a369994d3aa5eb79aa2add7c7a735"},{url:"grant-gustin-over-grave.b84c7e44.jpg",revision:"c26eab6a208dbddc8dfa9ef4a76b3aa4"},{url:"greta-thunberg-how-dare-you.d40eabd9.jpg",revision:"f0c3381dd2360c92719fb2474cd8c4b1"},{url:"grinning-girl.9a1a3b6a.jpg",revision:"133c4124813f1dfeff00a9e0a735b5c3"},{url:"group-therapy.c82c3502.jpg",revision:"a79a27311d3969bf370b8846bea1789c"},{url:"hack-the-planet.29b5550a.jpg",revision:"207de9c3f83de707d99ea7255f743fc1"},{url:"harakiri.bf59635f.jpg",revision:"728d8cdb4a1c2e80a344c9e11708e248"},{url:"hide-the-pain-harold.dc41d0f5.jpg",revision:"af3a4d69c625740558a9adc66967797c"},{url:"i-bet-hes-thinking-about-other-women.c80f1ce0.jpg",revision:"df6904f1480a0210525311a594cd51b7"},{url:"i-dont-always.f2b397fb.jpg",revision:"8c850789b4e8088af3151498a1345ab7"},{url:"i-see-dead-people.cd3367e9.jpg",revision:"4662e0f8717a50d678ae8d7672bd1d75"},{url:"i-want-you-uncle-sam.8a3e6190.jpg",revision:"9dbcf0318bd73fb07d5675c6e23e38f5"},{url:"index.09064714.js",revision:"cc492f00bdda037698631b3d7f08aec1"},{url:"index.09064714.js.map",revision:"30e9806782280a3a4e324900bbc3ab26"},{url:"index.6d86f4dd.js",revision:"b0b99e30ab5828ef42557868e55c7317"},{url:"index.6d86f4dd.js.map",revision:"cbdaed1288ab6c8c6dc802023709c815"},{url:"index.98a7b582.js",revision:"3fa2ad8d96c4c904414f858a549cdb14"},{url:"index.98a7b582.js.map",revision:"075a517ce0210c3eb84f9da7e2f21645"},{url:"index.bb1ce697.js",revision:"82f689cbc7405307d1eb42c297e81360"},{url:"index.bb1ce697.js.map",revision:"a581e787ac4468ce653d4028ea2d6f76"},{url:"index.f1f30278.css",revision:"0ddc16dc091fa93dced568dcfbe4a2a0"},{url:"index.f1f30278.css.map",revision:"d26b604d5937928dd890f7227cf67e91"},{url:"index.html",revision:"f901929c829a17fa565dac385844e00f"},{url:"index.runtime.34c3c44d.js",revision:"f831e06b20100fcd5d7bef99f622997c"},{url:"index.runtime.34c3c44d.js.map",revision:"2fb4d6b592aebf0e4d716dfdef467afa"},{url:"index.runtime.491ea605.js",revision:"02faca548f38ac5f39ce3ddd11920d42"},{url:"index.runtime.491ea605.js.map",revision:"bc7bf5ba5cd6a7b8e263cca5099011d1"},{url:"john-wick-consequences.af167bfa.jpg",revision:"acac506e0e5b25e36dd11d2e926fe5aa"},{url:"jurassic-park-no-one-cares.4b16d8e3.jpg",revision:"5971adaaec085b176061d7d98577a089"},{url:"keep-calm-and-carry-on.645c8ecf.jpg",revision:"e1ba8ca2f6dae9176120175de79d14e0"},{url:"knight-with-arrow-in-helmet.70d7b8ea.jpg",revision:"2d51aa7ceccfacf6e1fae33cf5279abb"},{url:"laughing-leo.17727081.jpg",revision:"9345f8e77580ffb9b607e9246bccc1c6"},{url:"leonardo-dicaprio-cheers.66fb2170.jpg",revision:"86fd400076c5f2c13c17b1626241b21d"},{url:"logo.02439c4c.png",revision:"799182a75ab5b10e8b2088a717f0eff2"},{url:"look-of-superiority.c83e6263.jpg",revision:"5a08b1ecc67813ed5632aab5b4dd6031"},{url:"manifest.webmanifest",revision:"97a0108d66cb5ab16c0aaee1fce306c2"},{url:"matrix-morpheus.2a17fef0.jpg",revision:"4306d531845e95029b5219f178ce546c"},{url:"milk-girls.0d40047b.jpg",revision:"c6f8242ddba1defa1ba8ff843fe083cf"},{url:"monk-temptation.9fa9b52f.jpg",revision:"f993e88e46226fb560559b5c8392ba6e"},{url:"monkey_puppet.a1128702.jpg",revision:"e3dd1d281e372a02ca2955eb62ce7dbb"},{url:"mr-bean-waiting.57faee7d.jpg",revision:"09bb12bfcf9f8b6eeef75d836453eccd"},{url:"nervous.ecca1da9.jpg",revision:"f9500924e2154f15ff3249573963e867"},{url:"obama-medal.c199d73a.jpg",revision:"847adc65d274cbf6d8c874e43cada9d7"},{url:"office-congrats.f658c72e.jpg",revision:"5e5823dd68191151a2313a3ec158e9cf"},{url:"one-does-not-simply.bd73a129.jpg",revision:"94eaa0e921189e88fe35ba1954988564"},{url:"OpenSans-Bold.8fceb72b.ttf",revision:"8ff9b5735ccb338267f0034d83fe8214"},{url:"OpenSans-Regular.edf9e01b.ttf",revision:"22ab03a6b890f2f142a137a38bf1d4ae"},{url:"Oswald-Bold.0f6a7ca6.ttf",revision:"452bfeb5bf78e71cc3cd6e720ac24bd4"},{url:"Oswald-Regular.89ec7d89.ttf",revision:"a7ccbd3cd9a9ff21ec41086dcc23ebe6"},{url:"photo.0328c485.svg",revision:"6b3fccb8598a897d641cc1dc75ed3592"},{url:"plague-hackers.01c70709.jpg",revision:"70712ddea9f2dd86ec34c1ffedffb3d0"},{url:"Pressuru.684952ea.ttf",revision:"60b45237c258b8e8f5d2fba5b304064e"},{url:"Roboto-Bold.fdb9b54a.ttf",revision:"b8e42971dec8d49207a8c8e2b919a6ac"},{url:"Roboto-Regular.ca197847.ttf",revision:"8a36205bd9b83e03af0591a004bc97f4"},{url:"RobotoCondensed-Bold.e1f96d4b.ttf",revision:"e38804ae070b58fbf4fdd88fd6853929"},{url:"RobotoCondensed-Regular.d585f5c7.ttf",revision:"0134dd8fe6fe708de73909a71d842780"},{url:"sad-pablo-escobar.48ee550d.jpg",revision:"1a49f6decc10da3ee849a1f94132c794"},{url:"save.46fbf12f.svg",revision:"3e1d90c414fadfd6727cc77f150e79e5"},{url:"say-that-again-i-dare-you.0c8b53b9.jpg",revision:"948be03975e613eaa08ac7f284491b40"},{url:"scooby-doo-mask-reveal.429e97d4.jpg",revision:"25e1ffa6609634b650196cb2f30b5756"},{url:"screenshot.e380cc9a.png",revision:"a6d9aa64d9f9d1d9c7fcb1cac0d6d3f2"},{url:"shame.4e42bd73.jpg",revision:"c90fda8e678c2e9a430ca63ad97360b1"},{url:"share.0fccb277.svg",revision:"19d01499fa1fe8707366653db087ebac"},{url:"shirley-temple-laugh.8125357d.png",revision:"c2e13fffe87a3a1ff91d5a955a280fe1"},{url:"shut-up-and-take-my-money.5b48e614.jpg",revision:"47906c671c509ae04afd176561bcebb9"},{url:"sparta-leonidas.b8e9ae19.jpg",revision:"ad12847005cce58fbb64794c1d1b51fe"},{url:"spiderman-pointing-at-spiderman.22c79d03.jpg",revision:"8a53889740d784ee63ebf2714f9732c1"},{url:"spinner.4452ed29.svg",revision:"609c6274c68c19f6badaf5488b6aeef2"},{url:"star-wars-yoda.c7579c93.jpg",revision:"951e4ee52db27001190248f449651c4b"},{url:"success-kid.5d6212f8.jpg",revision:"b58ffaf338ffc8f4f06ef45478365c13"},{url:"sweating-bullets.f3c2d84f.jpg",revision:"3c9c50281665c688cacdd0d1da8f8f7d"},{url:"tabasco-eye-drops.18e60f1c.jpg",revision:"5ed5959892c678ffa64bf03711a91bbb"},{url:"tell-me-the-truth-I-am-ready-to-hear-it.34eb1bcc.png",revision:"ecd53156061e4fdabf386c5f802035cf"},{url:"terminator-hasta-la-vista-baby.49d77e16.jpg",revision:"da766789007a8287073bf40415e79deb"},{url:"the-rock-driving.974ab6d7.jpg",revision:"4ed5e7160472acc31465523fd0c7dbe3"},{url:"think-about-it.f4fc185d.jpg",revision:"f70b62834ba3ec34a2c9f2a80a5068b9"},{url:"this-is-fine.95eb1510.jpg",revision:"b4d60cf8b2635b97c75683af8628d233"},{url:"toilet_guy.812f73a4.jpg",revision:"3f488def302d190dca09eb12c878d228"},{url:"trash.d9edab78.svg",revision:"db8971c7dab936bbe799ede7c1b9ac4b"},{url:"two-buttons.4ebc7b15.jpg",revision:"40a2fed25fcd71196b281ba5ddd36b2c"},{url:"undertaker.ffd700ab.jpg",revision:"04d42f19f46955888ccf08da3016a48f"},{url:"uno-draw-25-cards.d97aebe6.jpg",revision:"d55141fa895537d135f8327eed5ea8d8"},{url:"unsheathing-sword.ebe4b2d2.jpg",revision:"cc93af70f270ffa5a1bc5a28696ba9d0"},{url:"waiting-skeleton.be84023d.jpg",revision:"02009cc1a6cb2716a66b1a661142e523"},{url:"water-tank-leaking-fix.772173b9.png",revision:"3ebfc2b2c42be514ec35fd3b9948686a"},{url:"whisper-and-goosebumps.2bc61488.jpg",revision:"962ccff862d6c9d416a330c8be901be9"},{url:"x-x-everywhere.4732733a.jpg",revision:"ca16fab0846148556e776aec3ff00739"},{url:"xkcd-dependency.aadbdfb5.jpg",revision:"6102cea55ca6628fb4c2abe1145f32f7"},{url:"you-guys-are-getting-paid.ba5678cc.png",revision:"feb2da8a1fae966adae92bd1f8318153"},{url:"zero-days-since-last.30088c00.jpg",revision:"7c45b24c6db290150b90eced84d6a31b"}],{})})); +if(!self.define){let e,a={};const d=(d,i)=>(d=new URL(d+".js",i).href,a[d]||new Promise((a=>{if("document"in self){const e=document.createElement("script");e.src=d,e.onload=a,document.head.appendChild(e)}else e=d,importScripts(d),a()})).then((()=>{let e=a[d];if(!e)throw new Error(`Module ${d} didn’t register its module`);return e})));self.define=(i,r)=>{const c=e||("document"in self?document.currentScript.src:"")||location.href;if(a[c])return;let b={};const f=e=>d(e,c),n={module:{uri:c},exports:b,require:f};a[c]=Promise.all(i.map((e=>n[e]||f(e)))).then((e=>(r(...e),b)))}}define(["./workbox-1c3383c2"],(function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"180.ad1ffa6f.png",revision:"e500d9d7377de6d701630c6345a20b99"},{url:"192.02439c4c.png",revision:"799182a75ab5b10e8b2088a717f0eff2"},{url:"384.3d08a4a6.png",revision:"3eb04d3a80b60e082d7f79e1614070fe"},{url:"512.00f88ae0.png",revision:"511ad055b1865aa9bda7886cb0b9e336"},{url:"add-image.bd815785.svg",revision:"8c00e51567cbd039981fffb87c61dab1"},{url:"afraid-to-ask-andy.2454e98b.jpg",revision:"5020cc5c4d4710296e8af54dfc5517df"},{url:"always-has-been.08a66422.jpg",revision:"d1b6401abd9cb8d382b7246bdb8ce0b5"},{url:"anakin-padme.03c6b194.jpg",revision:"baa00e8faccb9c63073f1db59274bd0d"},{url:"are-you-sleeping-brain.973dd336.jpg",revision:"b9faa2c765251ba187c47706ad4162d5"},{url:"austin-powers-doctor-evil.55956b85.jpg",revision:"b4d4c37882914f3b7d7ed34483382453"},{url:"bad-luck-brian.8b018588.jpg",revision:"2bb70408a0ab18038a376d80da91d336"},{url:"batman-slapping-robin.aa8b8054.jpg",revision:"6695faabd1eb772936f31ff0af36111d"},{url:"be-honest.c8b465b5.jpg",revision:"09042974e2fb1edce4a05dacafa84c44"},{url:"bell-curve.1167fe19.jpg",revision:"e26dac38583f6f98ea8ef98e4dab71e1"},{url:"ben-affleck-smoking.17cc6114.jpg",revision:"512c246cb818579340a6dc8dddea4f87"},{url:"bernie.ec67393e.jpg",revision:"111d58f32112b92017c04f4a97070b68"},{url:"bill-murray-groundhog-day.35d04f25.jpg",revision:"859c5fb09ef45a22100519064955fa77"},{url:"camera.ed7aa43f.svg",revision:"46f0c02466282ec5c4bf26141624316e"},{url:"captain-picard-facepalm.7690614a.jpg",revision:"926eecb6292d72fe2f99fd3113444c0b"},{url:"car-drift.9255750c.jpg",revision:"55b3735095d73c764704bccdda6f2bc1"},{url:"change-my-mind.35bc0d99.jpg",revision:"7537efe4cd5ddcf44de4dccacc1871e8"},{url:"chevron-down.ad14d981.svg",revision:"5635cc35f04030576a62d2d649824495"},{url:"chevron-left.20a2f252.svg",revision:"a8334bfa7ef65b1095bfd54557d69beb"},{url:"chevron-right.1be074ac.svg",revision:"3d72992183afc0c2f0b6bf010dadc2a1"},{url:"chevron-up.f532d8b6.svg",revision:"e1bd8bbacf48b185c4b3deb18b9e0f2d"},{url:"CourierPrime-Bold.3d6bf689.ttf",revision:"4acfa45d29d240044e0075a8e58f0862"},{url:"CourierPrime-Regular.3a25a501.ttf",revision:"fba4686ed1d1b4ef05ab14db78805dbe"},{url:"disappointed-guy.471a5a63.jpg",revision:"61980e7a343462d3bc7621d0d0cb8168"},{url:"disaster-girl.536b1af4.jpg",revision:"07542c2e7ea315f6a7b7311d2a88d074"},{url:"distracted-boyfriend.22708891.jpg",revision:"4ee61cd7c20689e2c8b7fa2dbffbdbc4"},{url:"drake-hotline-bling.99013af7.jpg",revision:"edce37df305e1b9c78d0a41ade363e29"},{url:"drowning-kid-in-the-pool.37435682.jpg",revision:"99e976a664709f7fe0b7141e2661a42b"},{url:"duplicate.04d08287.svg",revision:"e803d39c63ea0e2e910b1a989a059050"},{url:"favicon-192.02439c4c.png",revision:"799182a75ab5b10e8b2088a717f0eff2"},{url:"finding-neverland.25f9c4f0.jpg",revision:"4557c9d30b0e3114953f9cc8e981c622"},{url:"gear.b3b5d1a5.svg",revision:"5e0b2045d7dc4768b1ceb199d83ab6f0"},{url:"gibson-jesus.1224d195.jpg",revision:"b26e0d89414371dfbf7a1e1bbada7e15"},{url:"girls-gossiping.e83a2c6d.jpg",revision:"4af5d7b070e1af70cbd7670a7f37d045"},{url:"godfather.ad422d54.jpg",revision:"ea7a369994d3aa5eb79aa2add7c7a735"},{url:"grant-gustin-over-grave.b84c7e44.jpg",revision:"c26eab6a208dbddc8dfa9ef4a76b3aa4"},{url:"greta-thunberg-how-dare-you.d40eabd9.jpg",revision:"f0c3381dd2360c92719fb2474cd8c4b1"},{url:"grinning-girl.9a1a3b6a.jpg",revision:"133c4124813f1dfeff00a9e0a735b5c3"},{url:"group-therapy.c82c3502.jpg",revision:"a79a27311d3969bf370b8846bea1789c"},{url:"hack-the-planet.29b5550a.jpg",revision:"207de9c3f83de707d99ea7255f743fc1"},{url:"harakiri.bf59635f.jpg",revision:"728d8cdb4a1c2e80a344c9e11708e248"},{url:"hide-the-pain-harold.dc41d0f5.jpg",revision:"af3a4d69c625740558a9adc66967797c"},{url:"i-bet-hes-thinking-about-other-women.c80f1ce0.jpg",revision:"df6904f1480a0210525311a594cd51b7"},{url:"i-dont-always.f2b397fb.jpg",revision:"8c850789b4e8088af3151498a1345ab7"},{url:"i-see-dead-people.cd3367e9.jpg",revision:"4662e0f8717a50d678ae8d7672bd1d75"},{url:"i-want-you-uncle-sam.8a3e6190.jpg",revision:"9dbcf0318bd73fb07d5675c6e23e38f5"},{url:"index.4434df8a.js",revision:"4c647005367922a590630690e497a555"},{url:"index.4434df8a.js.map",revision:"27078cc67bb2cf9adc700891d496ea84"},{url:"index.98a7b582.js",revision:"3fa2ad8d96c4c904414f858a549cdb14"},{url:"index.98a7b582.js.map",revision:"075a517ce0210c3eb84f9da7e2f21645"},{url:"index.9a005d69.js",revision:"df30c454221f03fb0aa3b02941342631"},{url:"index.9a005d69.js.map",revision:"e7ab562411fcf7f8d8eba1e8796a7759"},{url:"index.b4cc57ad.css",revision:"1bbbf7eb9f6454f93ca2298d3e7f7119"},{url:"index.b4cc57ad.css.map",revision:"46ceea07c9da7972b629a56178e7e0b0"},{url:"index.bb1ce697.js",revision:"82f689cbc7405307d1eb42c297e81360"},{url:"index.bb1ce697.js.map",revision:"a581e787ac4468ce653d4028ea2d6f76"},{url:"index.html",revision:"b652c0877e02354971028376742feb34"},{url:"index.runtime.ddd227ef.js",revision:"b96dd248d562b5148caaef05f580be81"},{url:"index.runtime.ddd227ef.js.map",revision:"e856dca9042903a717b022c4675e80a3"},{url:"index.runtime.fd3a20bd.js",revision:"9a4b332a13ebe163baabb66759cff80f"},{url:"index.runtime.fd3a20bd.js.map",revision:"673c38a90f3da2f8e399e0546baea591"},{url:"john-wick-consequences.af167bfa.jpg",revision:"acac506e0e5b25e36dd11d2e926fe5aa"},{url:"jurassic-park-no-one-cares.4b16d8e3.jpg",revision:"5971adaaec085b176061d7d98577a089"},{url:"keep-calm-and-carry-on.645c8ecf.jpg",revision:"e1ba8ca2f6dae9176120175de79d14e0"},{url:"knight-with-arrow-in-helmet.70d7b8ea.jpg",revision:"2d51aa7ceccfacf6e1fae33cf5279abb"},{url:"laughing-leo.17727081.jpg",revision:"9345f8e77580ffb9b607e9246bccc1c6"},{url:"leonardo-dicaprio-cheers.66fb2170.jpg",revision:"86fd400076c5f2c13c17b1626241b21d"},{url:"logo.02439c4c.png",revision:"799182a75ab5b10e8b2088a717f0eff2"},{url:"look-of-superiority.c83e6263.jpg",revision:"5a08b1ecc67813ed5632aab5b4dd6031"},{url:"manifest.webmanifest",revision:"97a0108d66cb5ab16c0aaee1fce306c2"},{url:"matrix-morpheus.2a17fef0.jpg",revision:"4306d531845e95029b5219f178ce546c"},{url:"milk-girls.0d40047b.jpg",revision:"c6f8242ddba1defa1ba8ff843fe083cf"},{url:"monk-temptation.9fa9b52f.jpg",revision:"f993e88e46226fb560559b5c8392ba6e"},{url:"monkey_puppet.a1128702.jpg",revision:"e3dd1d281e372a02ca2955eb62ce7dbb"},{url:"mr-bean-waiting.57faee7d.jpg",revision:"09bb12bfcf9f8b6eeef75d836453eccd"},{url:"nervous.ecca1da9.jpg",revision:"f9500924e2154f15ff3249573963e867"},{url:"obama-medal.c199d73a.jpg",revision:"847adc65d274cbf6d8c874e43cada9d7"},{url:"office-congrats.f658c72e.jpg",revision:"5e5823dd68191151a2313a3ec158e9cf"},{url:"one-does-not-simply.bd73a129.jpg",revision:"94eaa0e921189e88fe35ba1954988564"},{url:"OpenSans-Bold.8fceb72b.ttf",revision:"8ff9b5735ccb338267f0034d83fe8214"},{url:"OpenSans-Regular.edf9e01b.ttf",revision:"22ab03a6b890f2f142a137a38bf1d4ae"},{url:"Oswald-Bold.0f6a7ca6.ttf",revision:"452bfeb5bf78e71cc3cd6e720ac24bd4"},{url:"Oswald-Regular.89ec7d89.ttf",revision:"a7ccbd3cd9a9ff21ec41086dcc23ebe6"},{url:"photo.0328c485.svg",revision:"6b3fccb8598a897d641cc1dc75ed3592"},{url:"plague-hackers.01c70709.jpg",revision:"70712ddea9f2dd86ec34c1ffedffb3d0"},{url:"Pressuru.684952ea.ttf",revision:"60b45237c258b8e8f5d2fba5b304064e"},{url:"Roboto-Bold.fdb9b54a.ttf",revision:"b8e42971dec8d49207a8c8e2b919a6ac"},{url:"Roboto-Regular.ca197847.ttf",revision:"8a36205bd9b83e03af0591a004bc97f4"},{url:"RobotoCondensed-Bold.e1f96d4b.ttf",revision:"e38804ae070b58fbf4fdd88fd6853929"},{url:"RobotoCondensed-Regular.d585f5c7.ttf",revision:"0134dd8fe6fe708de73909a71d842780"},{url:"sad-pablo-escobar.48ee550d.jpg",revision:"1a49f6decc10da3ee849a1f94132c794"},{url:"save.46fbf12f.svg",revision:"3e1d90c414fadfd6727cc77f150e79e5"},{url:"say-that-again-i-dare-you.0c8b53b9.jpg",revision:"948be03975e613eaa08ac7f284491b40"},{url:"scooby-doo-mask-reveal.429e97d4.jpg",revision:"25e1ffa6609634b650196cb2f30b5756"},{url:"screenshot.e380cc9a.png",revision:"a6d9aa64d9f9d1d9c7fcb1cac0d6d3f2"},{url:"shame.4e42bd73.jpg",revision:"c90fda8e678c2e9a430ca63ad97360b1"},{url:"share.0fccb277.svg",revision:"19d01499fa1fe8707366653db087ebac"},{url:"shirley-temple-laugh.8125357d.png",revision:"c2e13fffe87a3a1ff91d5a955a280fe1"},{url:"shut-up-and-take-my-money.5b48e614.jpg",revision:"47906c671c509ae04afd176561bcebb9"},{url:"sparta-leonidas.b8e9ae19.jpg",revision:"ad12847005cce58fbb64794c1d1b51fe"},{url:"spiderman-pointing-at-spiderman.22c79d03.jpg",revision:"8a53889740d784ee63ebf2714f9732c1"},{url:"spinner.4452ed29.svg",revision:"609c6274c68c19f6badaf5488b6aeef2"},{url:"star-wars-yoda.c7579c93.jpg",revision:"951e4ee52db27001190248f449651c4b"},{url:"success-kid.5d6212f8.jpg",revision:"b58ffaf338ffc8f4f06ef45478365c13"},{url:"sweating-bullets.f3c2d84f.jpg",revision:"3c9c50281665c688cacdd0d1da8f8f7d"},{url:"tabasco-eye-drops.18e60f1c.jpg",revision:"5ed5959892c678ffa64bf03711a91bbb"},{url:"tell-me-the-truth-I-am-ready-to-hear-it.34eb1bcc.png",revision:"ecd53156061e4fdabf386c5f802035cf"},{url:"terminator-hasta-la-vista-baby.49d77e16.jpg",revision:"da766789007a8287073bf40415e79deb"},{url:"the-rock-driving.974ab6d7.jpg",revision:"4ed5e7160472acc31465523fd0c7dbe3"},{url:"think-about-it.f4fc185d.jpg",revision:"f70b62834ba3ec34a2c9f2a80a5068b9"},{url:"this-is-fine.95eb1510.jpg",revision:"b4d60cf8b2635b97c75683af8628d233"},{url:"toilet_guy.812f73a4.jpg",revision:"3f488def302d190dca09eb12c878d228"},{url:"trash.d9edab78.svg",revision:"db8971c7dab936bbe799ede7c1b9ac4b"},{url:"two-buttons.4ebc7b15.jpg",revision:"40a2fed25fcd71196b281ba5ddd36b2c"},{url:"undertaker.ffd700ab.jpg",revision:"04d42f19f46955888ccf08da3016a48f"},{url:"uno-draw-25-cards.d97aebe6.jpg",revision:"d55141fa895537d135f8327eed5ea8d8"},{url:"unsheathing-sword.ebe4b2d2.jpg",revision:"cc93af70f270ffa5a1bc5a28696ba9d0"},{url:"waiting-skeleton.be84023d.jpg",revision:"02009cc1a6cb2716a66b1a661142e523"},{url:"water-tank-leaking-fix.772173b9.png",revision:"3ebfc2b2c42be514ec35fd3b9948686a"},{url:"whisper-and-goosebumps.2bc61488.jpg",revision:"962ccff862d6c9d416a330c8be901be9"},{url:"x-x-everywhere.4732733a.jpg",revision:"ca16fab0846148556e776aec3ff00739"},{url:"xkcd-dependency.aadbdfb5.jpg",revision:"6102cea55ca6628fb4c2abe1145f32f7"},{url:"you-guys-are-getting-paid.ba5678cc.png",revision:"feb2da8a1fae966adae92bd1f8318153"},{url:"zero-days-since-last.30088c00.jpg",revision:"7c45b24c6db290150b90eced84d6a31b"}],{})})); //# sourceMappingURL=service-worker.js.map diff --git a/service-worker.js.map b/service-worker.js.map index 171abf1..8526e7c 100644 --- a/service-worker.js.map +++ b/service-worker.js.map @@ -1 +1 @@ -{"version":3,"file":"service-worker.js","sources":["../../../../../private/var/folders/zx/dmx9cv356r96j_n2br2yf6j80000gn/T/710e182cc009296bc03f80122972791e/service-worker.js"],"sourcesContent":["import {clientsClaim as workbox_core_clientsClaim} from '/Users/georgeraptis/Projects/personal/meme-generator/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/Users/georgeraptis/Projects/personal/meme-generator/node_modules/workbox-precaching/precacheAndRoute.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"180.ad1ffa6f.png\",\n \"revision\": \"e500d9d7377de6d701630c6345a20b99\"\n },\n {\n \"url\": \"192.02439c4c.png\",\n \"revision\": \"799182a75ab5b10e8b2088a717f0eff2\"\n },\n {\n \"url\": \"384.3d08a4a6.png\",\n \"revision\": \"3eb04d3a80b60e082d7f79e1614070fe\"\n },\n {\n \"url\": \"512.00f88ae0.png\",\n \"revision\": \"511ad055b1865aa9bda7886cb0b9e336\"\n },\n {\n \"url\": \"add-image.bd815785.svg\",\n \"revision\": \"8c00e51567cbd039981fffb87c61dab1\"\n },\n {\n \"url\": \"afraid-to-ask-andy.2454e98b.jpg\",\n \"revision\": \"5020cc5c4d4710296e8af54dfc5517df\"\n },\n {\n \"url\": \"always-has-been.08a66422.jpg\",\n \"revision\": \"d1b6401abd9cb8d382b7246bdb8ce0b5\"\n },\n {\n \"url\": \"anakin-padme.03c6b194.jpg\",\n \"revision\": \"baa00e8faccb9c63073f1db59274bd0d\"\n },\n {\n \"url\": \"aperture.4bf28ce8.svg\",\n \"revision\": \"1a6a5d3b06ba8aaa3e96658810752663\"\n },\n {\n \"url\": \"are-you-sleeping-brain.973dd336.jpg\",\n \"revision\": \"b9faa2c765251ba187c47706ad4162d5\"\n },\n {\n \"url\": \"austin-powers-doctor-evil.55956b85.jpg\",\n \"revision\": \"b4d4c37882914f3b7d7ed34483382453\"\n },\n {\n \"url\": \"bad-luck-brian.8b018588.jpg\",\n \"revision\": \"2bb70408a0ab18038a376d80da91d336\"\n },\n {\n \"url\": \"batman-slapping-robin.aa8b8054.jpg\",\n \"revision\": \"6695faabd1eb772936f31ff0af36111d\"\n },\n {\n \"url\": \"be-honest.c8b465b5.jpg\",\n \"revision\": \"09042974e2fb1edce4a05dacafa84c44\"\n },\n {\n \"url\": \"bell-curve.1167fe19.jpg\",\n \"revision\": \"e26dac38583f6f98ea8ef98e4dab71e1\"\n },\n {\n \"url\": \"ben-affleck-smoking.17cc6114.jpg\",\n \"revision\": \"512c246cb818579340a6dc8dddea4f87\"\n },\n {\n \"url\": \"bernie.ec67393e.jpg\",\n \"revision\": \"111d58f32112b92017c04f4a97070b68\"\n },\n {\n \"url\": \"bill-murray-groundhog-day.35d04f25.jpg\",\n \"revision\": \"859c5fb09ef45a22100519064955fa77\"\n },\n {\n \"url\": \"camera-reverse.284e8ac9.svg\",\n \"revision\": \"86e592b72bb2472bbacd0c823b3a3c78\"\n },\n {\n \"url\": \"camera.ed7aa43f.svg\",\n \"revision\": \"46f0c02466282ec5c4bf26141624316e\"\n },\n {\n \"url\": \"captain-picard-facepalm.7690614a.jpg\",\n \"revision\": \"926eecb6292d72fe2f99fd3113444c0b\"\n },\n {\n \"url\": \"car-drift.9255750c.jpg\",\n \"revision\": \"55b3735095d73c764704bccdda6f2bc1\"\n },\n {\n \"url\": \"change-my-mind.35bc0d99.jpg\",\n \"revision\": \"7537efe4cd5ddcf44de4dccacc1871e8\"\n },\n {\n \"url\": \"chevron-down.ad14d981.svg\",\n \"revision\": \"5635cc35f04030576a62d2d649824495\"\n },\n {\n \"url\": \"chevron-left.20a2f252.svg\",\n \"revision\": \"a8334bfa7ef65b1095bfd54557d69beb\"\n },\n {\n \"url\": \"chevron-right.1be074ac.svg\",\n \"revision\": \"3d72992183afc0c2f0b6bf010dadc2a1\"\n },\n {\n \"url\": \"chevron-up.f532d8b6.svg\",\n \"revision\": \"e1bd8bbacf48b185c4b3deb18b9e0f2d\"\n },\n {\n \"url\": \"CourierPrime-Bold.3d6bf689.ttf\",\n \"revision\": \"4acfa45d29d240044e0075a8e58f0862\"\n },\n {\n \"url\": \"CourierPrime-Regular.3a25a501.ttf\",\n \"revision\": \"fba4686ed1d1b4ef05ab14db78805dbe\"\n },\n {\n \"url\": \"disappointed-guy.471a5a63.jpg\",\n \"revision\": \"61980e7a343462d3bc7621d0d0cb8168\"\n },\n {\n \"url\": \"disaster-girl.536b1af4.jpg\",\n \"revision\": \"07542c2e7ea315f6a7b7311d2a88d074\"\n },\n {\n \"url\": \"distracted-boyfriend.22708891.jpg\",\n \"revision\": \"4ee61cd7c20689e2c8b7fa2dbffbdbc4\"\n },\n {\n \"url\": \"drake-hotline-bling.99013af7.jpg\",\n \"revision\": \"edce37df305e1b9c78d0a41ade363e29\"\n },\n {\n \"url\": \"drowning-kid-in-the-pool.37435682.jpg\",\n \"revision\": \"99e976a664709f7fe0b7141e2661a42b\"\n },\n {\n \"url\": \"duplicate.04d08287.svg\",\n \"revision\": \"e803d39c63ea0e2e910b1a989a059050\"\n },\n {\n \"url\": \"favicon-192.02439c4c.png\",\n \"revision\": \"799182a75ab5b10e8b2088a717f0eff2\"\n },\n {\n \"url\": \"finding-neverland.25f9c4f0.jpg\",\n \"revision\": \"4557c9d30b0e3114953f9cc8e981c622\"\n },\n {\n \"url\": \"gear.b3b5d1a5.svg\",\n \"revision\": \"5e0b2045d7dc4768b1ceb199d83ab6f0\"\n },\n {\n \"url\": \"gibson-jesus.1224d195.jpg\",\n \"revision\": \"b26e0d89414371dfbf7a1e1bbada7e15\"\n },\n {\n \"url\": \"girls-gossiping.e83a2c6d.jpg\",\n \"revision\": \"4af5d7b070e1af70cbd7670a7f37d045\"\n },\n {\n \"url\": \"godfather.ad422d54.jpg\",\n \"revision\": \"ea7a369994d3aa5eb79aa2add7c7a735\"\n },\n {\n \"url\": \"grant-gustin-over-grave.b84c7e44.jpg\",\n \"revision\": \"c26eab6a208dbddc8dfa9ef4a76b3aa4\"\n },\n {\n \"url\": \"greta-thunberg-how-dare-you.d40eabd9.jpg\",\n \"revision\": \"f0c3381dd2360c92719fb2474cd8c4b1\"\n },\n {\n \"url\": \"grinning-girl.9a1a3b6a.jpg\",\n \"revision\": \"133c4124813f1dfeff00a9e0a735b5c3\"\n },\n {\n \"url\": \"group-therapy.c82c3502.jpg\",\n \"revision\": \"a79a27311d3969bf370b8846bea1789c\"\n },\n {\n \"url\": \"hack-the-planet.29b5550a.jpg\",\n \"revision\": \"207de9c3f83de707d99ea7255f743fc1\"\n },\n {\n \"url\": \"harakiri.bf59635f.jpg\",\n \"revision\": \"728d8cdb4a1c2e80a344c9e11708e248\"\n },\n {\n \"url\": \"hide-the-pain-harold.dc41d0f5.jpg\",\n \"revision\": \"af3a4d69c625740558a9adc66967797c\"\n },\n {\n \"url\": \"i-bet-hes-thinking-about-other-women.c80f1ce0.jpg\",\n \"revision\": \"df6904f1480a0210525311a594cd51b7\"\n },\n {\n \"url\": \"i-dont-always.f2b397fb.jpg\",\n \"revision\": \"8c850789b4e8088af3151498a1345ab7\"\n },\n {\n \"url\": \"i-see-dead-people.cd3367e9.jpg\",\n \"revision\": \"4662e0f8717a50d678ae8d7672bd1d75\"\n },\n {\n \"url\": \"i-want-you-uncle-sam.8a3e6190.jpg\",\n \"revision\": \"9dbcf0318bd73fb07d5675c6e23e38f5\"\n },\n {\n \"url\": \"index.09064714.js\",\n \"revision\": \"cc492f00bdda037698631b3d7f08aec1\"\n },\n {\n \"url\": \"index.09064714.js.map\",\n \"revision\": \"30e9806782280a3a4e324900bbc3ab26\"\n },\n {\n \"url\": \"index.6d86f4dd.js\",\n \"revision\": \"b0b99e30ab5828ef42557868e55c7317\"\n },\n {\n \"url\": \"index.6d86f4dd.js.map\",\n \"revision\": \"cbdaed1288ab6c8c6dc802023709c815\"\n },\n {\n \"url\": \"index.98a7b582.js\",\n \"revision\": \"3fa2ad8d96c4c904414f858a549cdb14\"\n },\n {\n \"url\": \"index.98a7b582.js.map\",\n \"revision\": \"075a517ce0210c3eb84f9da7e2f21645\"\n },\n {\n \"url\": \"index.bb1ce697.js\",\n \"revision\": \"82f689cbc7405307d1eb42c297e81360\"\n },\n {\n \"url\": \"index.bb1ce697.js.map\",\n \"revision\": \"a581e787ac4468ce653d4028ea2d6f76\"\n },\n {\n \"url\": \"index.f1f30278.css\",\n \"revision\": \"0ddc16dc091fa93dced568dcfbe4a2a0\"\n },\n {\n \"url\": \"index.f1f30278.css.map\",\n \"revision\": \"d26b604d5937928dd890f7227cf67e91\"\n },\n {\n \"url\": \"index.html\",\n \"revision\": \"f901929c829a17fa565dac385844e00f\"\n },\n {\n \"url\": \"index.runtime.34c3c44d.js\",\n \"revision\": \"f831e06b20100fcd5d7bef99f622997c\"\n },\n {\n \"url\": \"index.runtime.34c3c44d.js.map\",\n \"revision\": \"2fb4d6b592aebf0e4d716dfdef467afa\"\n },\n {\n \"url\": \"index.runtime.491ea605.js\",\n \"revision\": \"02faca548f38ac5f39ce3ddd11920d42\"\n },\n {\n \"url\": \"index.runtime.491ea605.js.map\",\n \"revision\": \"bc7bf5ba5cd6a7b8e263cca5099011d1\"\n },\n {\n \"url\": \"john-wick-consequences.af167bfa.jpg\",\n \"revision\": \"acac506e0e5b25e36dd11d2e926fe5aa\"\n },\n {\n \"url\": \"jurassic-park-no-one-cares.4b16d8e3.jpg\",\n \"revision\": \"5971adaaec085b176061d7d98577a089\"\n },\n {\n \"url\": \"keep-calm-and-carry-on.645c8ecf.jpg\",\n \"revision\": \"e1ba8ca2f6dae9176120175de79d14e0\"\n },\n {\n \"url\": \"knight-with-arrow-in-helmet.70d7b8ea.jpg\",\n \"revision\": \"2d51aa7ceccfacf6e1fae33cf5279abb\"\n },\n {\n \"url\": \"laughing-leo.17727081.jpg\",\n \"revision\": \"9345f8e77580ffb9b607e9246bccc1c6\"\n },\n {\n \"url\": \"leonardo-dicaprio-cheers.66fb2170.jpg\",\n \"revision\": \"86fd400076c5f2c13c17b1626241b21d\"\n },\n {\n \"url\": \"logo.02439c4c.png\",\n \"revision\": \"799182a75ab5b10e8b2088a717f0eff2\"\n },\n {\n \"url\": \"look-of-superiority.c83e6263.jpg\",\n \"revision\": \"5a08b1ecc67813ed5632aab5b4dd6031\"\n },\n {\n \"url\": \"manifest.webmanifest\",\n \"revision\": \"97a0108d66cb5ab16c0aaee1fce306c2\"\n },\n {\n \"url\": \"matrix-morpheus.2a17fef0.jpg\",\n \"revision\": \"4306d531845e95029b5219f178ce546c\"\n },\n {\n \"url\": \"milk-girls.0d40047b.jpg\",\n \"revision\": \"c6f8242ddba1defa1ba8ff843fe083cf\"\n },\n {\n \"url\": \"monk-temptation.9fa9b52f.jpg\",\n \"revision\": \"f993e88e46226fb560559b5c8392ba6e\"\n },\n {\n \"url\": \"monkey_puppet.a1128702.jpg\",\n \"revision\": \"e3dd1d281e372a02ca2955eb62ce7dbb\"\n },\n {\n \"url\": \"mr-bean-waiting.57faee7d.jpg\",\n \"revision\": \"09bb12bfcf9f8b6eeef75d836453eccd\"\n },\n {\n \"url\": \"nervous.ecca1da9.jpg\",\n \"revision\": \"f9500924e2154f15ff3249573963e867\"\n },\n {\n \"url\": \"obama-medal.c199d73a.jpg\",\n \"revision\": \"847adc65d274cbf6d8c874e43cada9d7\"\n },\n {\n \"url\": \"office-congrats.f658c72e.jpg\",\n \"revision\": \"5e5823dd68191151a2313a3ec158e9cf\"\n },\n {\n \"url\": \"one-does-not-simply.bd73a129.jpg\",\n \"revision\": \"94eaa0e921189e88fe35ba1954988564\"\n },\n {\n \"url\": \"OpenSans-Bold.8fceb72b.ttf\",\n \"revision\": \"8ff9b5735ccb338267f0034d83fe8214\"\n },\n {\n \"url\": \"OpenSans-Regular.edf9e01b.ttf\",\n \"revision\": \"22ab03a6b890f2f142a137a38bf1d4ae\"\n },\n {\n \"url\": \"Oswald-Bold.0f6a7ca6.ttf\",\n \"revision\": \"452bfeb5bf78e71cc3cd6e720ac24bd4\"\n },\n {\n \"url\": \"Oswald-Regular.89ec7d89.ttf\",\n \"revision\": \"a7ccbd3cd9a9ff21ec41086dcc23ebe6\"\n },\n {\n \"url\": \"photo.0328c485.svg\",\n \"revision\": \"6b3fccb8598a897d641cc1dc75ed3592\"\n },\n {\n \"url\": \"plague-hackers.01c70709.jpg\",\n \"revision\": \"70712ddea9f2dd86ec34c1ffedffb3d0\"\n },\n {\n \"url\": \"Pressuru.684952ea.ttf\",\n \"revision\": \"60b45237c258b8e8f5d2fba5b304064e\"\n },\n {\n \"url\": \"Roboto-Bold.fdb9b54a.ttf\",\n \"revision\": \"b8e42971dec8d49207a8c8e2b919a6ac\"\n },\n {\n \"url\": \"Roboto-Regular.ca197847.ttf\",\n \"revision\": \"8a36205bd9b83e03af0591a004bc97f4\"\n },\n {\n \"url\": \"RobotoCondensed-Bold.e1f96d4b.ttf\",\n \"revision\": \"e38804ae070b58fbf4fdd88fd6853929\"\n },\n {\n \"url\": \"RobotoCondensed-Regular.d585f5c7.ttf\",\n \"revision\": \"0134dd8fe6fe708de73909a71d842780\"\n },\n {\n \"url\": \"sad-pablo-escobar.48ee550d.jpg\",\n \"revision\": \"1a49f6decc10da3ee849a1f94132c794\"\n },\n {\n \"url\": \"save.46fbf12f.svg\",\n \"revision\": \"3e1d90c414fadfd6727cc77f150e79e5\"\n },\n {\n \"url\": \"say-that-again-i-dare-you.0c8b53b9.jpg\",\n \"revision\": \"948be03975e613eaa08ac7f284491b40\"\n },\n {\n \"url\": \"scooby-doo-mask-reveal.429e97d4.jpg\",\n \"revision\": \"25e1ffa6609634b650196cb2f30b5756\"\n },\n {\n \"url\": \"screenshot.e380cc9a.png\",\n \"revision\": \"a6d9aa64d9f9d1d9c7fcb1cac0d6d3f2\"\n },\n {\n \"url\": \"shame.4e42bd73.jpg\",\n \"revision\": \"c90fda8e678c2e9a430ca63ad97360b1\"\n },\n {\n \"url\": \"share.0fccb277.svg\",\n \"revision\": \"19d01499fa1fe8707366653db087ebac\"\n },\n {\n \"url\": \"shirley-temple-laugh.8125357d.png\",\n \"revision\": \"c2e13fffe87a3a1ff91d5a955a280fe1\"\n },\n {\n \"url\": \"shut-up-and-take-my-money.5b48e614.jpg\",\n \"revision\": \"47906c671c509ae04afd176561bcebb9\"\n },\n {\n \"url\": \"sparta-leonidas.b8e9ae19.jpg\",\n \"revision\": \"ad12847005cce58fbb64794c1d1b51fe\"\n },\n {\n \"url\": \"spiderman-pointing-at-spiderman.22c79d03.jpg\",\n \"revision\": \"8a53889740d784ee63ebf2714f9732c1\"\n },\n {\n \"url\": \"spinner.4452ed29.svg\",\n \"revision\": \"609c6274c68c19f6badaf5488b6aeef2\"\n },\n {\n \"url\": \"star-wars-yoda.c7579c93.jpg\",\n \"revision\": \"951e4ee52db27001190248f449651c4b\"\n },\n {\n \"url\": \"success-kid.5d6212f8.jpg\",\n \"revision\": \"b58ffaf338ffc8f4f06ef45478365c13\"\n },\n {\n \"url\": \"sweating-bullets.f3c2d84f.jpg\",\n \"revision\": \"3c9c50281665c688cacdd0d1da8f8f7d\"\n },\n {\n \"url\": \"tabasco-eye-drops.18e60f1c.jpg\",\n \"revision\": \"5ed5959892c678ffa64bf03711a91bbb\"\n },\n {\n \"url\": \"tell-me-the-truth-I-am-ready-to-hear-it.34eb1bcc.png\",\n \"revision\": \"ecd53156061e4fdabf386c5f802035cf\"\n },\n {\n \"url\": \"terminator-hasta-la-vista-baby.49d77e16.jpg\",\n \"revision\": \"da766789007a8287073bf40415e79deb\"\n },\n {\n \"url\": \"the-rock-driving.974ab6d7.jpg\",\n \"revision\": \"4ed5e7160472acc31465523fd0c7dbe3\"\n },\n {\n \"url\": \"think-about-it.f4fc185d.jpg\",\n \"revision\": \"f70b62834ba3ec34a2c9f2a80a5068b9\"\n },\n {\n \"url\": \"this-is-fine.95eb1510.jpg\",\n \"revision\": \"b4d60cf8b2635b97c75683af8628d233\"\n },\n {\n \"url\": \"toilet_guy.812f73a4.jpg\",\n \"revision\": \"3f488def302d190dca09eb12c878d228\"\n },\n {\n \"url\": \"trash.d9edab78.svg\",\n \"revision\": \"db8971c7dab936bbe799ede7c1b9ac4b\"\n },\n {\n \"url\": \"two-buttons.4ebc7b15.jpg\",\n \"revision\": \"40a2fed25fcd71196b281ba5ddd36b2c\"\n },\n {\n \"url\": \"undertaker.ffd700ab.jpg\",\n \"revision\": \"04d42f19f46955888ccf08da3016a48f\"\n },\n {\n \"url\": \"uno-draw-25-cards.d97aebe6.jpg\",\n \"revision\": \"d55141fa895537d135f8327eed5ea8d8\"\n },\n {\n \"url\": \"unsheathing-sword.ebe4b2d2.jpg\",\n \"revision\": \"cc93af70f270ffa5a1bc5a28696ba9d0\"\n },\n {\n \"url\": \"waiting-skeleton.be84023d.jpg\",\n \"revision\": \"02009cc1a6cb2716a66b1a661142e523\"\n },\n {\n \"url\": \"water-tank-leaking-fix.772173b9.png\",\n \"revision\": \"3ebfc2b2c42be514ec35fd3b9948686a\"\n },\n {\n \"url\": \"whisper-and-goosebumps.2bc61488.jpg\",\n \"revision\": \"962ccff862d6c9d416a330c8be901be9\"\n },\n {\n \"url\": \"x-x-everywhere.4732733a.jpg\",\n \"revision\": \"ca16fab0846148556e776aec3ff00739\"\n },\n {\n \"url\": \"xkcd-dependency.aadbdfb5.jpg\",\n \"revision\": \"6102cea55ca6628fb4c2abe1145f32f7\"\n },\n {\n \"url\": \"you-guys-are-getting-paid.ba5678cc.png\",\n \"revision\": \"feb2da8a1fae966adae92bd1f8318153\"\n },\n {\n \"url\": \"zero-days-since-last.30088c00.jpg\",\n \"revision\": \"7c45b24c6db290150b90eced84d6a31b\"\n }\n], {});\n\n\n\n\n\n\n\n\n"],"names":["self","skipWaiting","workbox_core_clientsClaim","workbox_precaching_precacheAndRoute","url","revision"],"mappings":"0nBAoBAA,KAAKC,cAELC,EAAAA,eAQAC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,qCAEb,CAAA"} \ No newline at end of file +{"version":3,"file":"service-worker.js","sources":["../../../../../private/var/folders/zx/dmx9cv356r96j_n2br2yf6j80000gn/T/fc246a0cf1d4fc3038c5cd10bcfbf148/service-worker.js"],"sourcesContent":["import {clientsClaim as workbox_core_clientsClaim} from '/Users/georgeraptis/Projects/personal/meme-generator/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/Users/georgeraptis/Projects/personal/meme-generator/node_modules/workbox-precaching/precacheAndRoute.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"180.ad1ffa6f.png\",\n \"revision\": \"e500d9d7377de6d701630c6345a20b99\"\n },\n {\n \"url\": \"192.02439c4c.png\",\n \"revision\": \"799182a75ab5b10e8b2088a717f0eff2\"\n },\n {\n \"url\": \"384.3d08a4a6.png\",\n \"revision\": \"3eb04d3a80b60e082d7f79e1614070fe\"\n },\n {\n \"url\": \"512.00f88ae0.png\",\n \"revision\": \"511ad055b1865aa9bda7886cb0b9e336\"\n },\n {\n \"url\": \"add-image.bd815785.svg\",\n \"revision\": \"8c00e51567cbd039981fffb87c61dab1\"\n },\n {\n \"url\": \"afraid-to-ask-andy.2454e98b.jpg\",\n \"revision\": \"5020cc5c4d4710296e8af54dfc5517df\"\n },\n {\n \"url\": \"always-has-been.08a66422.jpg\",\n \"revision\": \"d1b6401abd9cb8d382b7246bdb8ce0b5\"\n },\n {\n \"url\": \"anakin-padme.03c6b194.jpg\",\n \"revision\": \"baa00e8faccb9c63073f1db59274bd0d\"\n },\n {\n \"url\": \"are-you-sleeping-brain.973dd336.jpg\",\n \"revision\": \"b9faa2c765251ba187c47706ad4162d5\"\n },\n {\n \"url\": \"austin-powers-doctor-evil.55956b85.jpg\",\n \"revision\": \"b4d4c37882914f3b7d7ed34483382453\"\n },\n {\n \"url\": \"bad-luck-brian.8b018588.jpg\",\n \"revision\": \"2bb70408a0ab18038a376d80da91d336\"\n },\n {\n \"url\": \"batman-slapping-robin.aa8b8054.jpg\",\n \"revision\": \"6695faabd1eb772936f31ff0af36111d\"\n },\n {\n \"url\": \"be-honest.c8b465b5.jpg\",\n \"revision\": \"09042974e2fb1edce4a05dacafa84c44\"\n },\n {\n \"url\": \"bell-curve.1167fe19.jpg\",\n \"revision\": \"e26dac38583f6f98ea8ef98e4dab71e1\"\n },\n {\n \"url\": \"ben-affleck-smoking.17cc6114.jpg\",\n \"revision\": \"512c246cb818579340a6dc8dddea4f87\"\n },\n {\n \"url\": \"bernie.ec67393e.jpg\",\n \"revision\": \"111d58f32112b92017c04f4a97070b68\"\n },\n {\n \"url\": \"bill-murray-groundhog-day.35d04f25.jpg\",\n \"revision\": \"859c5fb09ef45a22100519064955fa77\"\n },\n {\n \"url\": \"camera.ed7aa43f.svg\",\n \"revision\": \"46f0c02466282ec5c4bf26141624316e\"\n },\n {\n \"url\": \"captain-picard-facepalm.7690614a.jpg\",\n \"revision\": \"926eecb6292d72fe2f99fd3113444c0b\"\n },\n {\n \"url\": \"car-drift.9255750c.jpg\",\n \"revision\": \"55b3735095d73c764704bccdda6f2bc1\"\n },\n {\n \"url\": \"change-my-mind.35bc0d99.jpg\",\n \"revision\": \"7537efe4cd5ddcf44de4dccacc1871e8\"\n },\n {\n \"url\": \"chevron-down.ad14d981.svg\",\n \"revision\": \"5635cc35f04030576a62d2d649824495\"\n },\n {\n \"url\": \"chevron-left.20a2f252.svg\",\n \"revision\": \"a8334bfa7ef65b1095bfd54557d69beb\"\n },\n {\n \"url\": \"chevron-right.1be074ac.svg\",\n \"revision\": \"3d72992183afc0c2f0b6bf010dadc2a1\"\n },\n {\n \"url\": \"chevron-up.f532d8b6.svg\",\n \"revision\": \"e1bd8bbacf48b185c4b3deb18b9e0f2d\"\n },\n {\n \"url\": \"CourierPrime-Bold.3d6bf689.ttf\",\n \"revision\": \"4acfa45d29d240044e0075a8e58f0862\"\n },\n {\n \"url\": \"CourierPrime-Regular.3a25a501.ttf\",\n \"revision\": \"fba4686ed1d1b4ef05ab14db78805dbe\"\n },\n {\n \"url\": \"disappointed-guy.471a5a63.jpg\",\n \"revision\": \"61980e7a343462d3bc7621d0d0cb8168\"\n },\n {\n \"url\": \"disaster-girl.536b1af4.jpg\",\n \"revision\": \"07542c2e7ea315f6a7b7311d2a88d074\"\n },\n {\n \"url\": \"distracted-boyfriend.22708891.jpg\",\n \"revision\": \"4ee61cd7c20689e2c8b7fa2dbffbdbc4\"\n },\n {\n \"url\": \"drake-hotline-bling.99013af7.jpg\",\n \"revision\": \"edce37df305e1b9c78d0a41ade363e29\"\n },\n {\n \"url\": \"drowning-kid-in-the-pool.37435682.jpg\",\n \"revision\": \"99e976a664709f7fe0b7141e2661a42b\"\n },\n {\n \"url\": \"duplicate.04d08287.svg\",\n \"revision\": \"e803d39c63ea0e2e910b1a989a059050\"\n },\n {\n \"url\": \"favicon-192.02439c4c.png\",\n \"revision\": \"799182a75ab5b10e8b2088a717f0eff2\"\n },\n {\n \"url\": \"finding-neverland.25f9c4f0.jpg\",\n \"revision\": \"4557c9d30b0e3114953f9cc8e981c622\"\n },\n {\n \"url\": \"gear.b3b5d1a5.svg\",\n \"revision\": \"5e0b2045d7dc4768b1ceb199d83ab6f0\"\n },\n {\n \"url\": \"gibson-jesus.1224d195.jpg\",\n \"revision\": \"b26e0d89414371dfbf7a1e1bbada7e15\"\n },\n {\n \"url\": \"girls-gossiping.e83a2c6d.jpg\",\n \"revision\": \"4af5d7b070e1af70cbd7670a7f37d045\"\n },\n {\n \"url\": \"godfather.ad422d54.jpg\",\n \"revision\": \"ea7a369994d3aa5eb79aa2add7c7a735\"\n },\n {\n \"url\": \"grant-gustin-over-grave.b84c7e44.jpg\",\n \"revision\": \"c26eab6a208dbddc8dfa9ef4a76b3aa4\"\n },\n {\n \"url\": \"greta-thunberg-how-dare-you.d40eabd9.jpg\",\n \"revision\": \"f0c3381dd2360c92719fb2474cd8c4b1\"\n },\n {\n \"url\": \"grinning-girl.9a1a3b6a.jpg\",\n \"revision\": \"133c4124813f1dfeff00a9e0a735b5c3\"\n },\n {\n \"url\": \"group-therapy.c82c3502.jpg\",\n \"revision\": \"a79a27311d3969bf370b8846bea1789c\"\n },\n {\n \"url\": \"hack-the-planet.29b5550a.jpg\",\n \"revision\": \"207de9c3f83de707d99ea7255f743fc1\"\n },\n {\n \"url\": \"harakiri.bf59635f.jpg\",\n \"revision\": \"728d8cdb4a1c2e80a344c9e11708e248\"\n },\n {\n \"url\": \"hide-the-pain-harold.dc41d0f5.jpg\",\n \"revision\": \"af3a4d69c625740558a9adc66967797c\"\n },\n {\n \"url\": \"i-bet-hes-thinking-about-other-women.c80f1ce0.jpg\",\n \"revision\": \"df6904f1480a0210525311a594cd51b7\"\n },\n {\n \"url\": \"i-dont-always.f2b397fb.jpg\",\n \"revision\": \"8c850789b4e8088af3151498a1345ab7\"\n },\n {\n \"url\": \"i-see-dead-people.cd3367e9.jpg\",\n \"revision\": \"4662e0f8717a50d678ae8d7672bd1d75\"\n },\n {\n \"url\": \"i-want-you-uncle-sam.8a3e6190.jpg\",\n \"revision\": \"9dbcf0318bd73fb07d5675c6e23e38f5\"\n },\n {\n \"url\": \"index.4434df8a.js\",\n \"revision\": \"4c647005367922a590630690e497a555\"\n },\n {\n \"url\": \"index.4434df8a.js.map\",\n \"revision\": \"27078cc67bb2cf9adc700891d496ea84\"\n },\n {\n \"url\": \"index.98a7b582.js\",\n \"revision\": \"3fa2ad8d96c4c904414f858a549cdb14\"\n },\n {\n \"url\": \"index.98a7b582.js.map\",\n \"revision\": \"075a517ce0210c3eb84f9da7e2f21645\"\n },\n {\n \"url\": \"index.9a005d69.js\",\n \"revision\": \"df30c454221f03fb0aa3b02941342631\"\n },\n {\n \"url\": \"index.9a005d69.js.map\",\n \"revision\": \"e7ab562411fcf7f8d8eba1e8796a7759\"\n },\n {\n \"url\": \"index.b4cc57ad.css\",\n \"revision\": \"1bbbf7eb9f6454f93ca2298d3e7f7119\"\n },\n {\n \"url\": \"index.b4cc57ad.css.map\",\n \"revision\": \"46ceea07c9da7972b629a56178e7e0b0\"\n },\n {\n \"url\": \"index.bb1ce697.js\",\n \"revision\": \"82f689cbc7405307d1eb42c297e81360\"\n },\n {\n \"url\": \"index.bb1ce697.js.map\",\n \"revision\": \"a581e787ac4468ce653d4028ea2d6f76\"\n },\n {\n \"url\": \"index.html\",\n \"revision\": \"b652c0877e02354971028376742feb34\"\n },\n {\n \"url\": \"index.runtime.ddd227ef.js\",\n \"revision\": \"b96dd248d562b5148caaef05f580be81\"\n },\n {\n \"url\": \"index.runtime.ddd227ef.js.map\",\n \"revision\": \"e856dca9042903a717b022c4675e80a3\"\n },\n {\n \"url\": \"index.runtime.fd3a20bd.js\",\n \"revision\": \"9a4b332a13ebe163baabb66759cff80f\"\n },\n {\n \"url\": \"index.runtime.fd3a20bd.js.map\",\n \"revision\": \"673c38a90f3da2f8e399e0546baea591\"\n },\n {\n \"url\": \"john-wick-consequences.af167bfa.jpg\",\n \"revision\": \"acac506e0e5b25e36dd11d2e926fe5aa\"\n },\n {\n \"url\": \"jurassic-park-no-one-cares.4b16d8e3.jpg\",\n \"revision\": \"5971adaaec085b176061d7d98577a089\"\n },\n {\n \"url\": \"keep-calm-and-carry-on.645c8ecf.jpg\",\n \"revision\": \"e1ba8ca2f6dae9176120175de79d14e0\"\n },\n {\n \"url\": \"knight-with-arrow-in-helmet.70d7b8ea.jpg\",\n \"revision\": \"2d51aa7ceccfacf6e1fae33cf5279abb\"\n },\n {\n \"url\": \"laughing-leo.17727081.jpg\",\n \"revision\": \"9345f8e77580ffb9b607e9246bccc1c6\"\n },\n {\n \"url\": \"leonardo-dicaprio-cheers.66fb2170.jpg\",\n \"revision\": \"86fd400076c5f2c13c17b1626241b21d\"\n },\n {\n \"url\": \"logo.02439c4c.png\",\n \"revision\": \"799182a75ab5b10e8b2088a717f0eff2\"\n },\n {\n \"url\": \"look-of-superiority.c83e6263.jpg\",\n \"revision\": \"5a08b1ecc67813ed5632aab5b4dd6031\"\n },\n {\n \"url\": \"manifest.webmanifest\",\n \"revision\": \"97a0108d66cb5ab16c0aaee1fce306c2\"\n },\n {\n \"url\": \"matrix-morpheus.2a17fef0.jpg\",\n \"revision\": \"4306d531845e95029b5219f178ce546c\"\n },\n {\n \"url\": \"milk-girls.0d40047b.jpg\",\n \"revision\": \"c6f8242ddba1defa1ba8ff843fe083cf\"\n },\n {\n \"url\": \"monk-temptation.9fa9b52f.jpg\",\n \"revision\": \"f993e88e46226fb560559b5c8392ba6e\"\n },\n {\n \"url\": \"monkey_puppet.a1128702.jpg\",\n \"revision\": \"e3dd1d281e372a02ca2955eb62ce7dbb\"\n },\n {\n \"url\": \"mr-bean-waiting.57faee7d.jpg\",\n \"revision\": \"09bb12bfcf9f8b6eeef75d836453eccd\"\n },\n {\n \"url\": \"nervous.ecca1da9.jpg\",\n \"revision\": \"f9500924e2154f15ff3249573963e867\"\n },\n {\n \"url\": \"obama-medal.c199d73a.jpg\",\n \"revision\": \"847adc65d274cbf6d8c874e43cada9d7\"\n },\n {\n \"url\": \"office-congrats.f658c72e.jpg\",\n \"revision\": \"5e5823dd68191151a2313a3ec158e9cf\"\n },\n {\n \"url\": \"one-does-not-simply.bd73a129.jpg\",\n \"revision\": \"94eaa0e921189e88fe35ba1954988564\"\n },\n {\n \"url\": \"OpenSans-Bold.8fceb72b.ttf\",\n \"revision\": \"8ff9b5735ccb338267f0034d83fe8214\"\n },\n {\n \"url\": \"OpenSans-Regular.edf9e01b.ttf\",\n \"revision\": \"22ab03a6b890f2f142a137a38bf1d4ae\"\n },\n {\n \"url\": \"Oswald-Bold.0f6a7ca6.ttf\",\n \"revision\": \"452bfeb5bf78e71cc3cd6e720ac24bd4\"\n },\n {\n \"url\": \"Oswald-Regular.89ec7d89.ttf\",\n \"revision\": \"a7ccbd3cd9a9ff21ec41086dcc23ebe6\"\n },\n {\n \"url\": \"photo.0328c485.svg\",\n \"revision\": \"6b3fccb8598a897d641cc1dc75ed3592\"\n },\n {\n \"url\": \"plague-hackers.01c70709.jpg\",\n \"revision\": \"70712ddea9f2dd86ec34c1ffedffb3d0\"\n },\n {\n \"url\": \"Pressuru.684952ea.ttf\",\n \"revision\": \"60b45237c258b8e8f5d2fba5b304064e\"\n },\n {\n \"url\": \"Roboto-Bold.fdb9b54a.ttf\",\n \"revision\": \"b8e42971dec8d49207a8c8e2b919a6ac\"\n },\n {\n \"url\": \"Roboto-Regular.ca197847.ttf\",\n \"revision\": \"8a36205bd9b83e03af0591a004bc97f4\"\n },\n {\n \"url\": \"RobotoCondensed-Bold.e1f96d4b.ttf\",\n \"revision\": \"e38804ae070b58fbf4fdd88fd6853929\"\n },\n {\n \"url\": \"RobotoCondensed-Regular.d585f5c7.ttf\",\n \"revision\": \"0134dd8fe6fe708de73909a71d842780\"\n },\n {\n \"url\": \"sad-pablo-escobar.48ee550d.jpg\",\n \"revision\": \"1a49f6decc10da3ee849a1f94132c794\"\n },\n {\n \"url\": \"save.46fbf12f.svg\",\n \"revision\": \"3e1d90c414fadfd6727cc77f150e79e5\"\n },\n {\n \"url\": \"say-that-again-i-dare-you.0c8b53b9.jpg\",\n \"revision\": \"948be03975e613eaa08ac7f284491b40\"\n },\n {\n \"url\": \"scooby-doo-mask-reveal.429e97d4.jpg\",\n \"revision\": \"25e1ffa6609634b650196cb2f30b5756\"\n },\n {\n \"url\": \"screenshot.e380cc9a.png\",\n \"revision\": \"a6d9aa64d9f9d1d9c7fcb1cac0d6d3f2\"\n },\n {\n \"url\": \"shame.4e42bd73.jpg\",\n \"revision\": \"c90fda8e678c2e9a430ca63ad97360b1\"\n },\n {\n \"url\": \"share.0fccb277.svg\",\n \"revision\": \"19d01499fa1fe8707366653db087ebac\"\n },\n {\n \"url\": \"shirley-temple-laugh.8125357d.png\",\n \"revision\": \"c2e13fffe87a3a1ff91d5a955a280fe1\"\n },\n {\n \"url\": \"shut-up-and-take-my-money.5b48e614.jpg\",\n \"revision\": \"47906c671c509ae04afd176561bcebb9\"\n },\n {\n \"url\": \"sparta-leonidas.b8e9ae19.jpg\",\n \"revision\": \"ad12847005cce58fbb64794c1d1b51fe\"\n },\n {\n \"url\": \"spiderman-pointing-at-spiderman.22c79d03.jpg\",\n \"revision\": \"8a53889740d784ee63ebf2714f9732c1\"\n },\n {\n \"url\": \"spinner.4452ed29.svg\",\n \"revision\": \"609c6274c68c19f6badaf5488b6aeef2\"\n },\n {\n \"url\": \"star-wars-yoda.c7579c93.jpg\",\n \"revision\": \"951e4ee52db27001190248f449651c4b\"\n },\n {\n \"url\": \"success-kid.5d6212f8.jpg\",\n \"revision\": \"b58ffaf338ffc8f4f06ef45478365c13\"\n },\n {\n \"url\": \"sweating-bullets.f3c2d84f.jpg\",\n \"revision\": \"3c9c50281665c688cacdd0d1da8f8f7d\"\n },\n {\n \"url\": \"tabasco-eye-drops.18e60f1c.jpg\",\n \"revision\": \"5ed5959892c678ffa64bf03711a91bbb\"\n },\n {\n \"url\": \"tell-me-the-truth-I-am-ready-to-hear-it.34eb1bcc.png\",\n \"revision\": \"ecd53156061e4fdabf386c5f802035cf\"\n },\n {\n \"url\": \"terminator-hasta-la-vista-baby.49d77e16.jpg\",\n \"revision\": \"da766789007a8287073bf40415e79deb\"\n },\n {\n \"url\": \"the-rock-driving.974ab6d7.jpg\",\n \"revision\": \"4ed5e7160472acc31465523fd0c7dbe3\"\n },\n {\n \"url\": \"think-about-it.f4fc185d.jpg\",\n \"revision\": \"f70b62834ba3ec34a2c9f2a80a5068b9\"\n },\n {\n \"url\": \"this-is-fine.95eb1510.jpg\",\n \"revision\": \"b4d60cf8b2635b97c75683af8628d233\"\n },\n {\n \"url\": \"toilet_guy.812f73a4.jpg\",\n \"revision\": \"3f488def302d190dca09eb12c878d228\"\n },\n {\n \"url\": \"trash.d9edab78.svg\",\n \"revision\": \"db8971c7dab936bbe799ede7c1b9ac4b\"\n },\n {\n \"url\": \"two-buttons.4ebc7b15.jpg\",\n \"revision\": \"40a2fed25fcd71196b281ba5ddd36b2c\"\n },\n {\n \"url\": \"undertaker.ffd700ab.jpg\",\n \"revision\": \"04d42f19f46955888ccf08da3016a48f\"\n },\n {\n \"url\": \"uno-draw-25-cards.d97aebe6.jpg\",\n \"revision\": \"d55141fa895537d135f8327eed5ea8d8\"\n },\n {\n \"url\": \"unsheathing-sword.ebe4b2d2.jpg\",\n \"revision\": \"cc93af70f270ffa5a1bc5a28696ba9d0\"\n },\n {\n \"url\": \"waiting-skeleton.be84023d.jpg\",\n \"revision\": \"02009cc1a6cb2716a66b1a661142e523\"\n },\n {\n \"url\": \"water-tank-leaking-fix.772173b9.png\",\n \"revision\": \"3ebfc2b2c42be514ec35fd3b9948686a\"\n },\n {\n \"url\": \"whisper-and-goosebumps.2bc61488.jpg\",\n \"revision\": \"962ccff862d6c9d416a330c8be901be9\"\n },\n {\n \"url\": \"x-x-everywhere.4732733a.jpg\",\n \"revision\": \"ca16fab0846148556e776aec3ff00739\"\n },\n {\n \"url\": \"xkcd-dependency.aadbdfb5.jpg\",\n \"revision\": \"6102cea55ca6628fb4c2abe1145f32f7\"\n },\n {\n \"url\": \"you-guys-are-getting-paid.ba5678cc.png\",\n \"revision\": \"feb2da8a1fae966adae92bd1f8318153\"\n },\n {\n \"url\": \"zero-days-since-last.30088c00.jpg\",\n \"revision\": \"7c45b24c6db290150b90eced84d6a31b\"\n }\n], {});\n\n\n\n\n\n\n\n\n"],"names":["self","skipWaiting","workbox_core_clientsClaim","workbox_precaching_precacheAndRoute","url","revision"],"mappings":"0nBAoBAA,KAAKC,cAELC,EAAAA,eAQAC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,qCAEb,CAAA"} \ No newline at end of file