!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).firebase=t()}(this,function(){"use strict";const r=function(t){const r=[];let n=0;for(let i=0;i<t.length;i++){let e=t.charCodeAt(i);e<128?r[n++]=e:(e<2048?r[n++]=e>>6|192:(55296==(64512&e)&&i+1<t.length&&56320==(64512&t.charCodeAt(i+1))?(e=65536+((1023&e)<<10)+(1023&t.charCodeAt(++i)),r[n++]=e>>18|240,r[n++]=e>>12&63|128):r[n++]=e>>12|224,r[n++]=e>>6&63|128),r[n++]=63&e|128)}return r},n={byteToCharMap_:null,charToByteMap_:null,byteToCharMapWebSafe_:null,charToByteMapWebSafe_:null,ENCODED_VALS_BASE:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",get ENCODED_VALS(){return this.ENCODED_VALS_BASE+"+/="},get ENCODED_VALS_WEBSAFE(){return this.ENCODED_VALS_BASE+"-_."},HAS_NATIVE_SUPPORT:"function"==typeof atob,encodeByteArray(r,e){if(!Array.isArray(r))throw Error("encodeByteArray takes an array as a parameter");this.init_();var n=e?this.byteToCharMapWebSafe_:this.byteToCharMap_;const i=[];for(let h=0;h<r.length;h+=3){var a=r[h],s=h+1<r.length,o=s?r[h+1]:0,c=h+2<r.length,l=c?r[h+2]:0;let e=(15&o)<<2|l>>6,t=63&l;c||(t=64,s||(e=64)),i.push(n[a>>2],n[(3&a)<<4|o>>4],n[e],n[t])}return i.join("")},encodeString(e,t){return this.HAS_NATIVE_SUPPORT&&!t?btoa(e):this.encodeByteArray(r(e),t)},decodeString(e,t){return this.HAS_NATIVE_SUPPORT&&!t?atob(e):function(e){const t=[];let r=0,n=0;for(;r<e.length;){var i,a,s=e[r++];s<128?t[n++]=String.fromCharCode(s):191<s&&s<224?(i=e[r++],t[n++]=String.fromCharCode((31&s)<<6|63&i)):239<s&&s<365?(a=((7&s)<<18|(63&e[r++])<<12|(63&e[r++])<<6|63&e[r++])-65536,t[n++]=String.fromCharCode(55296+(a>>10)),t[n++]=String.fromCharCode(56320+(1023&a))):(i=e[r++],a=e[r++],t[n++]=String.fromCharCode((15&s)<<12|(63&i)<<6|63&a))}return t.join("")}(this.decodeStringToByteArray(e,t))},decodeStringToByteArray(e,t){this.init_();var r=t?this.charToByteMapWebSafe_:this.charToByteMap_;const n=[];for(let c=0;c<e.length;){var i=r[e.charAt(c++)],a=c<e.length?r[e.charAt(c)]:0;++c;var s=c<e.length?r[e.charAt(c)]:64;++c;var o=c<e.length?r[e.charAt(c)]:64;if(++c,null==i||null==a||null==s||null==o)throw new l;n.push(i<<2|a>>4),64!==s&&(n.push(a<<4&240|s>>2),64!==o&&n.push(s<<6&192|o))}return n},init_(){if(!this.byteToCharMap_){this.byteToCharMap_={},this.charToByteMap_={},this.byteToCharMapWebSafe_={},this.charToByteMapWebSafe_={};for(let e=0;e<this.ENCODED_VALS.length;e++)this.byteToCharMap_[e]=this.ENCODED_VALS.charAt(e),this.charToByteMap_[this.byteToCharMap_[e]]=e,this.byteToCharMapWebSafe_[e]=this.ENCODED_VALS_WEBSAFE.charAt(e),this.charToByteMapWebSafe_[this.byteToCharMapWebSafe_[e]]=e,e>=this.ENCODED_VALS_BASE.length&&(this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(e)]=e,this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(e)]=e)}}};class l extends Error{constructor(){super(...arguments),this.name="DecodeBase64StringError"}}const i=function(e){return e=e,t=r(e),n.encodeByteArray(t,!0).replace(/\./g,"");var t};function c(e,t){if(!(t instanceof Object))return t;switch(t.constructor){case Date:const r=t;return new Date(r.getTime());case Object:void 0===e&&(e={});break;case Array:e=[];break;default:return t}for(const n in t)t.hasOwnProperty(n)&&"__proto__"!==n&&(e[n]=c(e[n],t[n]));return e}const e=()=>function(){if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if("undefined"!=typeof global)return global;throw new Error("Unable to locate global object.")}().__FIREBASE_DEFAULTS__,t=()=>{if("undefined"!=typeof document){let e;try{e=document.cookie.match(/__FIREBASE_DEFAULTS__=([^;]+)/)}catch(e){return}var t=e&&function(e){try{return n.decodeString(e,!0)}catch(e){console.error("base64Decode failed: ",e)}return null}(e[1]);return t&&JSON.parse(t)}},a=()=>{try{return e()||(()=>{if("undefined"!=typeof process&&void 0!==process.env){var e=process.env.__FIREBASE_DEFAULTS__;return e?JSON.parse(e):void 0}})()||t()}catch(e){return void console.info(`Unable to get __FIREBASE_DEFAULTS__ due to: ${e}`)}},h=()=>{var e;return null===(e=a())||void 0===e?void 0:e.config};class s{constructor(){this.reject=()=>{},this.resolve=()=>{},this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}wrapCallback(r){return(e,t)=>{e?this.reject(e):this.resolve(t),"function"==typeof r&&(this.promise.catch(()=>{}),1===r.length?r(e):r(e,t))}}}function d(){return"object"==typeof self&&self.self===self}class o extends Error{constructor(e,t,r){super(t),this.code=e,this.customData=r,this.name="FirebaseError",Object.setPrototypeOf(this,o.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,u.prototype.create)}}class u{constructor(e,t,r){this.service=e,this.serviceName=t,this.errors=r}create(e,...t){var n,r=t[0]||{},i=`${this.service}/${e}`,a=this.errors[e],a=a?(n=r,a.replace(p,(e,t)=>{var r=n[t];return null!=r?String(r):`<${t}?>`})):"Error",a=`${this.serviceName}: ${a} (${i}).`;return new o(i,a,r)}}const p=/\{\$([^}]+)}/g;function f(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function g(e,t){if(e===t)return 1;const r=Object.keys(e),n=Object.keys(t);for(const s of r){if(!n.includes(s))return;var i=e[s],a=t[s];if(b(i)&&b(a)){if(!g(i,a))return}else if(i!==a)return}for(const o of n)if(!r.includes(o))return;return 1}function b(e){return null!==e&&"object"==typeof e}function m(e,t){const r=new v(e,t);return r.subscribe.bind(r)}class v{constructor(e,t){this.observers=[],this.unsubscribes=[],this.observerCount=0,this.task=Promise.resolve(),this.finalized=!1,this.onNoObservers=t,this.task.then(()=>{e(this)}).catch(e=>{this.error(e)})}next(t){this.forEachObserver(e=>{e.next(t)})}error(t){this.forEachObserver(e=>{e.error(t)}),this.close(t)}complete(){this.forEachObserver(e=>{e.complete()}),this.close()}subscribe(e,t,r){let n;if(void 0===e&&void 0===t&&void 0===r)throw new Error("Missing Observer.");n=function(e,t){if("object"!=typeof e||null===e)return!1;for(const r of t)if(r in e&&"function"==typeof e[r])return!0;return!1}(e,["next","error","complete"])?e:{next:e,error:t,complete:r},void 0===n.next&&(n.next=_),void 0===n.error&&(n.error=_),void 0===n.complete&&(n.complete=_);var i=this.unsubscribeOne.bind(this,this.observers.length);return this.finalized&&this.task.then(()=>{try{this.finalError?n.error(this.finalError):n.complete()}catch(e){}}),this.observers.push(n),i}unsubscribeOne(e){void 0!==this.observers&&void 0!==this.observers[e]&&(delete this.observers[e],--this.observerCount,0===this.observerCount&&void 0!==this.onNoObservers&&this.onNoObservers(this))}forEachObserver(t){if(!this.finalized)for(let e=0;e<this.observers.length;e++)this.sendOne(e,t)}sendOne(e,t){this.task.then(()=>{if(void 0!==this.observers&&void 0!==this.observers[e])try{t(this.observers[e])}catch(e){"undefined"!=typeof console&&console.error&&console.error(e)}})}close(e){this.finalized||(this.finalized=!0,void 0!==e&&(this.finalError=e),this.task.then(()=>{this.observers=void 0,this.onNoObservers=void 0}))}}function _(){}class E{constructor(e,t,r){this.name=e,this.instanceFactory=t,this.type=r,this.multipleInstances=!1,this.serviceProps={},this.instantiationMode="LAZY",this.onInstanceCreated=null}setInstantiationMode(e){return this.instantiationMode=e,this}setMultipleInstances(e){return this.multipleInstances=e,this}setServiceProps(e){return this.serviceProps=e,this}setInstanceCreatedCallback(e){return this.onInstanceCreated=e,this}}const y="[DEFAULT]";class w{constructor(e,t){this.name=e,this.container=t,this.component=null,this.instances=new Map,this.instancesDeferred=new Map,this.instancesOptions=new Map,this.onInitCallbacks=new Map}get(e){var t=this.normalizeInstanceIdentifier(e);if(!this.instancesDeferred.has(t)){const n=new s;if(this.instancesDeferred.set(t,n),this.isInitialized(t)||this.shouldAutoInitialize())try{var r=this.getOrInitializeService({instanceIdentifier:t});r&&n.resolve(r)}catch(e){}}return this.instancesDeferred.get(t).promise}getImmediate(e){var t=this.normalizeInstanceIdentifier(null==e?void 0:e.identifier),r=null!==(r=null==e?void 0:e.optional)&&void 0!==r&&r;if(!this.isInitialized(t)&&!this.shouldAutoInitialize()){if(r)return null;throw Error(`Service ${this.name} is not available`)}try{return this.getOrInitializeService({instanceIdentifier:t})}catch(e){if(r)return null;throw e}}getComponent(){return this.component}setComponent(e){if(e.name!==this.name)throw Error(`Mismatching Component ${e.name} for Provider ${this.name}.`);if(this.component)throw Error(`Component for ${this.name} has already been provided`);if(this.component=e,this.shouldAutoInitialize()){if("EAGER"===e.instantiationMode)try{this.getOrInitializeService({instanceIdentifier:y})}catch(e){}for(var[t,r]of this.instancesDeferred.entries()){t=this.normalizeInstanceIdentifier(t);try{var n=this.getOrInitializeService({instanceIdentifier:t});r.resolve(n)}catch(e){}}}}clearInstance(e=y){this.instancesDeferred.delete(e),this.instancesOptions.delete(e),this.instances.delete(e)}async delete(){const e=Array.from(this.instances.values());await Promise.all([...e.filter(e=>"INTERNAL"in e).map(e=>e.INTERNAL.delete()),...e.filter(e=>"_delete"in e).map(e=>e._delete())])}isComponentSet(){return null!=this.component}isInitialized(e=y){return this.instances.has(e)}getOptions(e=y){return this.instancesOptions.get(e)||{}}initialize(e={}){var{options:t={}}=e,r=this.normalizeInstanceIdentifier(e.instanceIdentifier);if(this.isInitialized(r))throw Error(`${this.name}(${r}) has already been initialized`);if(!this.isComponentSet())throw Error(`Component ${this.name} has not been registered yet`);var n,i,a=this.getOrInitializeService({instanceIdentifier:r,options:t});for([n,i]of this.instancesDeferred.entries())r===this.normalizeInstanceIdentifier(n)&&i.resolve(a);return a}onInit(e,t){var r=this.normalizeInstanceIdentifier(t);const n=null!==(i=this.onInitCallbacks.get(r))&&void 0!==i?i:new Set;n.add(e),this.onInitCallbacks.set(r,n);var i=this.instances.get(r);return i&&e(i,r),()=>{n.delete(e)}}invokeOnInitCallbacks(e,t){var r=this.onInitCallbacks.get(t);if(r)for(const n of r)try{n(e,t)}catch(e){}}getOrInitializeService({instanceIdentifier:e,options:t={}}){let r=this.instances.get(e);if(!r&&this.component&&(r=this.component.instanceFactory(this.container,{instanceIdentifier:(n=e)===y?void 0:n,options:t}),this.instances.set(e,r),this.instancesOptions.set(e,t),this.invokeOnInitCallbacks(r,e),this.component.onInstanceCreated))try{this.component.onInstanceCreated(this.container,e,r)}catch(e){}var n;return r||null}normalizeInstanceIdentifier(e=y){return!this.component||this.component.multipleInstances?e:y}shouldAutoInitialize(){return!!this.component&&"EXPLICIT"!==this.component.instantiationMode}}class C{constructor(e){this.name=e,this.providers=new Map}addComponent(e){const t=this.getProvider(e.name);if(t.isComponentSet())throw new Error(`Component ${e.name} has already been registered with ${this.name}`);t.setComponent(e)}addOrOverwriteComponent(e){const t=this.getProvider(e.name);t.isComponentSet()&&this.providers.delete(e.name),this.addComponent(e)}getProvider(e){if(this.providers.has(e))return this.providers.get(e);var t=new w(e,this);return this.providers.set(e,t),t}getProviders(){return Array.from(this.providers.values())}}const D=[];var I,S,O;(S=I=I||{})[S.DEBUG=0]="DEBUG",S[S.VERBOSE=1]="VERBOSE",S[S.INFO=2]="INFO",S[S.WARN=3]="WARN",S[S.ERROR=4]="ERROR",S[S.SILENT=5]="SILENT";const A={debug:I.DEBUG,verbose:I.VERBOSE,info:I.INFO,warn:I.WARN,error:I.ERROR,silent:I.SILENT},L=I.INFO,N={[I.DEBUG]:"log",[I.VERBOSE]:"log",[I.INFO]:"info",[I.WARN]:"warn",[I.ERROR]:"error"},B=(e,t,...r)=>{if(!(t<e.logLevel)){var n=(new Date).toISOString(),i=N[t];if(!i)throw new Error(`Attempted to log a message with an invalid logType (value: ${t})`);console[i](`[${n}]  ${e.name}:`,...r)}};class T{constructor(e){this.name=e,this._logLevel=L,this._logHandler=B,this._userLogHandler=null,D.push(this)}get logLevel(){return this._logLevel}set logLevel(e){if(!(e in I))throw new TypeError(`Invalid value "${e}" assigned to \`logLevel\``);this._logLevel=e}setLogLevel(e){this._logLevel="string"==typeof e?A[e]:e}get logHandler(){return this._logHandler}set logHandler(e){if("function"!=typeof e)throw new TypeError("Value assigned to `logHandler` must be a function");this._logHandler=e}get userLogHandler(){return this._userLogHandler}set userLogHandler(e){this._userLogHandler=e}debug(...e){this._userLogHandler&&this._userLogHandler(this,I.DEBUG,...e),this._logHandler(this,I.DEBUG,...e)}log(...e){this._userLogHandler&&this._userLogHandler(this,I.VERBOSE,...e),this._logHandler(this,I.VERBOSE,...e)}info(...e){this._userLogHandler&&this._userLogHandler(this,I.INFO,...e),this._logHandler(this,I.INFO,...e)}warn(...e){this._userLogHandler&&this._userLogHandler(this,I.WARN,...e),this._logHandler(this,I.WARN,...e)}error(...e){this._userLogHandler&&this._userLogHandler(this,I.ERROR,...e),this._logHandler(this,I.ERROR,...e)}}const R=(t,e)=>e.some(e=>t instanceof e);let P,M;const k=new WeakMap,F=new WeakMap,j=new WeakMap,$=new WeakMap,z=new WeakMap;let H={get(e,t,r){if(e instanceof IDBTransaction){if("done"===t)return F.get(e);if("objectStoreNames"===t)return e.objectStoreNames||j.get(e);if("store"===t)return r.objectStoreNames[1]?void 0:r.objectStore(r.objectStoreNames[0])}return U(e[t])},set(e,t,r){return e[t]=r,!0},has(e,t){return e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e}};function x(n){return n!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?(M=M||[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey]).includes(n)?function(...e){return n.apply(W(this),e),U(k.get(this))}:function(...e){return U(n.apply(W(this),e))}:function(e,...t){var r=n.call(W(this),e,...t);return j.set(r,e.sort?e.sort():[e]),U(r)}}function V(e){return"function"==typeof e?x(e):(e instanceof IDBTransaction&&(a=e,F.has(a)||(t=new Promise((e,t)=>{const r=()=>{a.removeEventListener("complete",n),a.removeEventListener("error",i),a.removeEventListener("abort",i)},n=()=>{e(),r()},i=()=>{t(a.error||new DOMException("AbortError","AbortError")),r()};a.addEventListener("complete",n),a.addEventListener("error",i),a.addEventListener("abort",i)}),F.set(a,t))),R(e,P=P||[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])?new Proxy(e,H):e);var a,t}function U(e){if(e instanceof IDBRequest)return function(a){const e=new Promise((e,t)=>{const r=()=>{a.removeEventListener("success",n),a.removeEventListener("error",i)},n=()=>{e(U(a.result)),r()},i=()=>{t(a.error),r()};a.addEventListener("success",n),a.addEventListener("error",i)});return e.then(e=>{e instanceof IDBCursor&&k.set(e,a)}).catch(()=>{}),z.set(e,a),e}(e);if($.has(e))return $.get(e);var t=V(e);return t!==e&&($.set(e,t),z.set(t,e)),t}const W=e=>z.get(e);const J=["get","getKey","getAll","getAllKeys","count"],G=["put","add","delete","clear"],K=new Map;function Y(e,t){if(e instanceof IDBDatabase&&!(t in e)&&"string"==typeof t){if(K.get(t))return K.get(t);const i=t.replace(/FromIndex$/,""),a=t!==i,s=G.includes(i);if(i in(a?IDBIndex:IDBObjectStore).prototype&&(s||J.includes(i))){var r=async function(e,...t){var r=this.transaction(e,s?"readwrite":"readonly");let n=r.store;return a&&(n=n.index(t.shift())),(await Promise.all([n[i](...t),s&&r.done]))[0]};return K.set(t,r),r}}}H={...O=H,get:(e,t,r)=>Y(e,t)||O.get(e,t,r),has:(e,t)=>!!Y(e,t)||O.has(e,t)};class X{constructor(e){this.container=e}getPlatformInfoString(){const e=this.container.getProviders();return e.map(e=>{if("VERSION"!==(null==(t=e.getComponent())?void 0:t.type))return null;var t,t=e.getImmediate();return`${t.library}/${t.version}`}).filter(e=>e).join(" ")}}const q="@firebase/app",Z="0.10.0",Q=new T("@firebase/app");var ee;const te="[DEFAULT]",re={"@firebase/app":"fire-core","@firebase/app-compat":"fire-core-compat","@firebase/analytics":"fire-analytics","@firebase/analytics-compat":"fire-analytics-compat","@firebase/app-check":"fire-app-check","@firebase/app-check-compat":"fire-app-check-compat","@firebase/auth":"fire-auth","@firebase/auth-compat":"fire-auth-compat","@firebase/database":"fire-rtdb","@firebase/database-compat":"fire-rtdb-compat","@firebase/functions":"fire-fn","@firebase/functions-compat":"fire-fn-compat","@firebase/installations":"fire-iid","@firebase/installations-compat":"fire-iid-compat","@firebase/messaging":"fire-fcm","@firebase/messaging-compat":"fire-fcm-compat","@firebase/performance":"fire-perf","@firebase/performance-compat":"fire-perf-compat","@firebase/remote-config":"fire-rc","@firebase/remote-config-compat":"fire-rc-compat","@firebase/storage":"fire-gcs","@firebase/storage-compat":"fire-gcs-compat","@firebase/firestore":"fire-fst","@firebase/firestore-compat":"fire-fst-compat","fire-js":"fire-js",firebase:"fire-js-all"},ne=new Map,ie=new Map,ae=new Map;function se(t,r){try{t.container.addComponent(r)}catch(e){Q.debug(`Component ${r.name} failed to register with FirebaseApp ${t.name}`,e)}}function oe(e,t){e.container.addOrOverwriteComponent(t)}function ce(e){var t=e.name;if(ae.has(t))return Q.debug(`There were multiple attempts to register component ${t}.`),!1;ae.set(t,e);for(const r of ne.values())se(r,e);for(const n of ie.values())se(n,e);return!0}function le(e,t){const r=e.container.getProvider("heartbeat").getImmediate({optional:!0});return r&&r.triggerHeartbeat(),e.container.getProvider(t)}function he(e){return void 0!==e.options}const de=new u("app","Firebase",{"no-app":"No Firebase App '{$appName}' has been created - call initializeApp() first","bad-app-name":"Illegal App name: '{$appName}'","duplicate-app":"Firebase App named '{$appName}' already exists with different options or config","app-deleted":"Firebase App named '{$appName}' already deleted","server-app-deleted":"Firebase Server App has been deleted","no-options":"Need to provide options, when not being deployed to hosting via source.","invalid-app-argument":"firebase.{$appName}() takes either no argument or a Firebase App instance.","invalid-log-argument":"First argument to `onLog` must be null or a function.","idb-open":"Error thrown when opening IndexedDB. Original error: {$originalErrorMessage}.","idb-get":"Error thrown when reading from IndexedDB. Original error: {$originalErrorMessage}.","idb-set":"Error thrown when writing to IndexedDB. Original error: {$originalErrorMessage}.","idb-delete":"Error thrown when deleting from IndexedDB. Original error: {$originalErrorMessage}.","finalization-registry-not-supported":"FirebaseServerApp deleteOnDeref field defined but the JS runtime does not support FinalizationRegistry.","invalid-server-app-environment":"FirebaseServerApp is not for use in browser environments."});class ue{constructor(e,t,r){this._isDeleted=!1,this._options=Object.assign({},e),this._config=Object.assign({},t),this._name=t.name,this._automaticDataCollectionEnabled=t.automaticDataCollectionEnabled,this._container=r,this.container.addComponent(new E("app",()=>this,"PUBLIC"))}get automaticDataCollectionEnabled(){return this.checkDestroyed(),this._automaticDataCollectionEnabled}set automaticDataCollectionEnabled(e){this.checkDestroyed(),this._automaticDataCollectionEnabled=e}get name(){return this.checkDestroyed(),this._name}get options(){return this.checkDestroyed(),this._options}get config(){return this.checkDestroyed(),this._config}get container(){return this._container}get isDeleted(){return this._isDeleted}set isDeleted(e){this._isDeleted=e}checkDestroyed(){if(this.isDeleted)throw de.create("app-deleted",{appName:this._name})}}class pe extends ue{constructor(e,t,r,n){var i=void 0!==t.automaticDataCollectionEnabled&&t.automaticDataCollectionEnabled,a={name:r,automaticDataCollectionEnabled:i};void 0!==e.apiKey?super(e,a,n):super(e.options,a,n),this._serverConfig=Object.assign({automaticDataCollectionEnabled:i},t),this._finalizationRegistry=new FinalizationRegistry(()=>{this.automaticCleanup()}),this._refCount=0,this.incRefCount(this._serverConfig.releaseOnDeref),this._serverConfig.releaseOnDeref=void 0,t.releaseOnDeref=void 0,me(q,Z,"serverapp")}get refCount(){return this._refCount}incRefCount(e){this.isDeleted||(this._refCount++,void 0!==e&&this._finalizationRegistry.register(e,this))}decRefCount(){return this.isDeleted?0:--this._refCount}automaticCleanup(){be(this)}get settings(){return this.checkDestroyed(),this._serverConfig}checkDestroyed(){if(this.isDeleted)throw de.create("server-app-deleted")}}const fe="10.10.0";function ge(e,t={}){let r=e;if("object"!=typeof t){const i=t;t={name:i}}var n=Object.assign({name:te,automaticDataCollectionEnabled:!1},t);const i=n.name;if("string"!=typeof i||!i)throw de.create("bad-app-name",{appName:String(i)});if(r=r||h(),!r)throw de.create("no-options");var a=ne.get(i);if(a){if(g(r,a.options)&&g(n,a.config))return a;throw de.create("duplicate-app",{appName:i})}const s=new C(i);for(const o of ae.values())s.addComponent(o);n=new ue(r,n,s);return ne.set(i,n),n}async function be(e){let t=!1;var r=e.name;if(ne.has(r))t=!0,ne.delete(r);else if(ie.has(r)){const n=e;n.decRefCount()<=0&&(ie.delete(r),t=!0)}t&&(await Promise.all(e.container.getProviders().map(e=>e.delete())),e.isDeleted=!0)}function me(e,t,r){let n=null!==(a=re[e])&&void 0!==a?a:e;r&&(n+=`-${r}`);var i=n.match(/\s|\//),a=t.match(/\s|\//);if(i||a){const s=[`Unable to register library "${n}" with version "${t}":`];return i&&s.push(`library name "${n}" contains illegal characters (whitespace or "/")`),i&&a&&s.push("and"),a&&s.push(`version name "${t}" contains illegal characters (whitespace or "/")`),void Q.warn(s.join(" "))}ce(new E(`${n}-version`,()=>({library:n,version:t}),"VERSION"))}function ve(e,t){if(null!==e&&"function"!=typeof e)throw de.create("invalid-log-argument");!function(a,e){for(const t of D){let i=null;e&&e.level&&(i=A[e.level]),t.userLogHandler=null===a?null:(e,t,...r)=>{var n=r.map(e=>{if(null==e)return null;if("string"==typeof e)return e;if("number"==typeof e||"boolean"==typeof e)return e.toString();if(e instanceof Error)return e.message;try{return JSON.stringify(e)}catch(e){return null}}).filter(e=>e).join(" ");t>=(null!==i&&void 0!==i?i:e.logLevel)&&a({level:I[t].toLowerCase(),message:n,args:r,type:e.name})}}}(e,t)}function _e(e){var t;t=e,D.forEach(e=>{e.setLogLevel(t)})}const Ee="firebase-heartbeat-database",ye=1,we="firebase-heartbeat-store";let Ce=null;function De(){return Ce=Ce||function(e,t,{blocked:r,upgrade:n,blocking:i,terminated:a}){const s=indexedDB.open(e,t),o=U(s);return n&&s.addEventListener("upgradeneeded",e=>{n(U(s.result),e.oldVersion,e.newVersion,U(s.transaction),e)}),r&&s.addEventListener("blocked",e=>r(e.oldVersion,e.newVersion,e)),o.then(e=>{a&&e.addEventListener("close",()=>a()),i&&e.addEventListener("versionchange",e=>i(e.oldVersion,e.newVersion,e))}).catch(()=>{}),o}(Ee,ye,{upgrade:(e,t)=>{if(0===t)try{e.createObjectStore(we)}catch(e){console.warn(e)}}}).catch(e=>{throw de.create("idb-open",{originalErrorMessage:e.message})}),Ce}async function Ie(e,t){try{const n=await De(),i=n.transaction(we,"readwrite"),a=i.objectStore(we);await a.put(t,Se(e)),await i.done}catch(e){var r;e instanceof o?Q.warn(e.message):(r=de.create("idb-set",{originalErrorMessage:null==e?void 0:e.message}),Q.warn(r.message))}}function Se(e){return`${e.name}!${e.options.appId}`}class Oe{constructor(e){this.container=e,this._heartbeatsCache=null;var t=this.container.getProvider("app").getImmediate();this._storage=new Le(t),this._heartbeatsCachePromise=this._storage.read().then(e=>this._heartbeatsCache=e)}async triggerHeartbeat(){var e;const t=this.container.getProvider("platform-logger").getImmediate();var r=t.getPlatformInfoString();const n=Ae();if((null!=(null===(e=this._heartbeatsCache)||void 0===e?void 0:e.heartbeats)||(this._heartbeatsCache=await this._heartbeatsCachePromise,null!=(null===(e=this._heartbeatsCache)||void 0===e?void 0:e.heartbeats)))&&this._heartbeatsCache.lastSentHeartbeatDate!==n&&!this._heartbeatsCache.heartbeats.some(e=>e.date===n))return this._heartbeatsCache.heartbeats.push({date:n,agent:r}),this._heartbeatsCache.heartbeats=this._heartbeatsCache.heartbeats.filter(e=>{var t=new Date(e.date).valueOf();return Date.now()-t<=2592e6}),this._storage.overwrite(this._heartbeatsCache)}async getHeartbeatsHeader(){if(null===this._heartbeatsCache&&await this._heartbeatsCachePromise,null==(null===(r=this._heartbeatsCache)||void 0===r?void 0:r.heartbeats)||0===this._heartbeatsCache.heartbeats.length)return"";var e=Ae(),{heartbeatsToSend:t,unsentEntries:r}=function(e,t=1024){const r=[];let n=e.slice();for(const i of e){const a=r.find(e=>e.agent===i.agent);if(a){if(a.dates.push(i.date),Ne(r)>t){a.dates.pop();break}}else if(r.push({agent:i.agent,dates:[i.date]}),Ne(r)>t){r.pop();break}n=n.slice(1)}return{heartbeatsToSend:r,unsentEntries:n}}(this._heartbeatsCache.heartbeats),t=i(JSON.stringify({version:2,heartbeats:t}));return this._heartbeatsCache.lastSentHeartbeatDate=e,0<r.length?(this._heartbeatsCache.heartbeats=r,await this._storage.overwrite(this._heartbeatsCache)):(this._heartbeatsCache.heartbeats=[],this._storage.overwrite(this._heartbeatsCache)),t}}function Ae(){const e=new Date;return e.toISOString().substring(0,10)}class Le{constructor(e){this.app=e,this._canUseIndexedDBPromise=this.runIndexedDBEnvironmentCheck()}async runIndexedDBEnvironmentCheck(){return!!function(){try{return"object"==typeof indexedDB}catch(e){return}}()&&new Promise((t,r)=>{try{let e=!0;const n="validate-browser-context-for-indexeddb-analytics-module",i=self.indexedDB.open(n);i.onsuccess=()=>{i.result.close(),e||self.indexedDB.deleteDatabase(n),t(!0)},i.onupgradeneeded=()=>{e=!1},i.onerror=()=>{var e;r((null===(e=i.error)||void 0===e?void 0:e.message)||"")}}catch(e){r(e)}}).then(()=>!0).catch(()=>!1)}async read(){if(await this._canUseIndexedDBPromise){var e=await async function(e){try{const r=await De(),n=r.transaction(we);var t=await n.objectStore(we).get(Se(e));return await n.done,t}catch(e){e instanceof o?Q.warn(e.message):(t=de.create("idb-get",{originalErrorMessage:null==e?void 0:e.message}),Q.warn(t.message))}}(this.app);return null!=e&&e.heartbeats?e:{heartbeats:[]}}return{heartbeats:[]}}async overwrite(e){var t;if(await this._canUseIndexedDBPromise){var r=await this.read();return Ie(this.app,{lastSentHeartbeatDate:null!==(t=e.lastSentHeartbeatDate)&&void 0!==t?t:r.lastSentHeartbeatDate,heartbeats:e.heartbeats})}}async add(e){var t;if(await this._canUseIndexedDBPromise){var r=await this.read();return Ie(this.app,{lastSentHeartbeatDate:null!==(t=e.lastSentHeartbeatDate)&&void 0!==t?t:r.lastSentHeartbeatDate,heartbeats:[...r.heartbeats,...e.heartbeats]})}}}function Ne(e){return i(JSON.stringify({version:2,heartbeats:e})).length}ee="",ce(new E("platform-logger",e=>new X(e),"PRIVATE")),ce(new E("heartbeat",e=>new Oe(e),"PRIVATE")),me(q,Z,ee),me(q,Z,"esm2017"),me("fire-js","");var Be=Object.freeze({__proto__:null,SDK_VERSION:fe,_DEFAULT_ENTRY_NAME:te,_addComponent:se,_addOrOverwriteComponent:oe,_apps:ne,_clearComponents:function(){ae.clear()},_components:ae,_getProvider:le,_isFirebaseApp:he,_isFirebaseServerApp:function(e){return void 0!==e.settings},_registerComponent:ce,_removeServiceInstance:function(e,t,r=te){le(e,t).clearInstance(r)},_serverApps:ie,deleteApp:be,getApp:function(e=te){var t=ne.get(e);if(!t&&e===te&&h())return ge();if(!t)throw de.create("no-app",{appName:e});return t},getApps:function(){return Array.from(ne.values())},initializeApp:ge,initializeServerApp:function(e,t){if(d())throw de.create("invalid-server-app-environment");void 0===t.automaticDataCollectionEnabled&&(t.automaticDataCollectionEnabled=!1);let r;r=he(e)?e.options:e;const n=Object.assign(Object.assign({},t),r);if(void 0!==n.releaseOnDeref&&delete n.releaseOnDeref,void 0!==t.releaseOnDeref&&"undefined"==typeof FinalizationRegistry)throw de.create("finalization-registry-not-supported",{});var i=""+[...JSON.stringify(n)].reduce((e,t)=>Math.imul(31,e)+t.charCodeAt(0)|0,0);const a=ie.get(i);if(a)return a.incRefCount(t.releaseOnDeref),a;const s=new C(i);for(const c of ae.values())s.addComponent(c);var o=new pe(r,t,i,s);return ie.set(i,o),o},onLog:ve,registerVersion:me,setLogLevel:_e,FirebaseError:o});class Te{constructor(e,t){this._delegate=e,this.firebase=t,se(e,new E("app-compat",()=>this,"PUBLIC")),this.container=e.container}get automaticDataCollectionEnabled(){return this._delegate.automaticDataCollectionEnabled}set automaticDataCollectionEnabled(e){this._delegate.automaticDataCollectionEnabled=e}get name(){return this._delegate.name}get options(){return this._delegate.options}delete(){return new Promise(e=>{this._delegate.checkDestroyed(),e()}).then(()=>(this.firebase.INTERNAL.removeApp(this.name),be(this._delegate)))}_getService(e,t=te){var r;this._delegate.checkDestroyed();const n=this._delegate.container.getProvider(e);return n.isInitialized()||"EXPLICIT"!==(null===(r=n.getComponent())||void 0===r?void 0:r.instantiationMode)||n.initialize(),n.getImmediate({identifier:t})}_removeServiceInstance(e,t=te){this._delegate.container.getProvider(e).clearInstance(t)}_addComponent(e){se(this._delegate,e)}_addOrOverwriteComponent(e){oe(this._delegate,e)}toJSON(){return{name:this.name,automaticDataCollectionEnabled:this.automaticDataCollectionEnabled,options:this.options}}}const Re=new u("app-compat","Firebase",{"no-app":"No Firebase App '{$appName}' has been created - call Firebase App.initializeApp()","invalid-app-argument":"firebase.{$appName}() takes either no argument or a Firebase App instance."});function Pe(i){const a={},s={__esModule:!0,initializeApp:function(e,t={}){var r=ge(e,t);if(f(a,r.name))return a[r.name];var n=new i(r,s);return a[r.name]=n},app:o,registerVersion:me,setLogLevel:_e,onLog:ve,apps:null,SDK_VERSION:fe,INTERNAL:{registerComponent:function(r){const n=r.name,t=n.replace("-compat","");{var e;ce(r)&&"PUBLIC"===r.type&&(e=(e=o())=>{if("function"!=typeof e[t])throw Re.create("invalid-app-argument",{appName:n});return e[t]()},void 0!==r.serviceProps&&c(e,r.serviceProps),s[t]=e,i.prototype[t]=function(...e){const t=this._getService.bind(this,n);return t.apply(this,r.multipleInstances?e:[])})}return"PUBLIC"===r.type?s[t]:null},removeApp:function(e){delete a[e]},useAsService:function(e,t){if("serverAuth"===t)return null;var r=t;return r},modularAPIs:Be}};function o(e){if(e=e||te,!f(a,e))throw Re.create("no-app",{appName:e});return a[e]}return s.default=s,Object.defineProperty(s,"apps",{get:function(){return Object.keys(a).map(e=>a[e])}}),o.App=i,s}var Me=function e(){const t=Pe(Te);return t.INTERNAL=Object.assign(Object.assign({},t.INTERNAL),{createFirebaseNamespace:e,extendNamespace:function(e){c(t,e)},createSubscribe:m,ErrorFactory:u,deepExtend:c}),t}();const ke=new T("@firebase/app-compat");if(d()&&void 0!==self.firebase){ke.warn(`
    Warning: Firebase is already defined in the global scope. Please make sure
    Firebase library is only loaded once.
  `);const je=self.firebase.SDK_VERSION;je&&0<=je.indexOf("LITE")&&ke.warn(`
    Warning: You are trying to load Firebase while using Firebase Performance standalone script.
    You should load Firebase Performance with this instance of Firebase to avoid loading duplicate code.
    `)}const Fe=Me;me("@firebase/app-compat","0.2.30",void 0);return Fe.registerVersion("firebase","10.10.0","app-compat-cdn"),Fe});!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("@firebase/app-compat"),require("@firebase/app")):"function"==typeof define&&define.amd?define(["@firebase/app-compat","@firebase/app"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).firebase,e.firebase.INTERNAL.modularAPIs)}(this,function(Wt,Ut){"use strict";try{!(function(){function e(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i,t=e(Wt);function n(){try{return"object"==typeof indexedDB}catch(e){return!1}}class o extends Error{constructor(e,t,n){super(t),this.code=e,this.customData=n,this.name="FirebaseError",Object.setPrototypeOf(this,o.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,a.prototype.create)}}class a{constructor(e,t,n){this.service=e,this.serviceName=t,this.errors=n}create(e,...t){var i,n=t[0]||{},a=`${this.service}/${e}`,r=this.errors[e],r=r?(i=n,r.replace(s,(e,t)=>{var n=i[t];return null!=n?String(n):`<${t}?>`})):"Error",r=`${this.serviceName}: ${r} (${a}).`;return new o(a,r,n)}}const s=/\{\$([^}]+)}/g;function r(e){return e&&e._delegate?e._delegate:e}class c{constructor(e,t,n){this.name=e,this.instanceFactory=t,this.type=n,this.multipleInstances=!1,this.serviceProps={},this.instantiationMode="LAZY",this.onInstanceCreated=null}setInstantiationMode(e){return this.instantiationMode=e,this}setMultipleInstances(e){return this.multipleInstances=e,this}setServiceProps(e){return this.serviceProps=e,this}setInstanceCreatedCallback(e){return this.onInstanceCreated=e,this}}const u=(t,e)=>e.some(e=>t instanceof e);let d,p;const l=new WeakMap,f=new WeakMap,g=new WeakMap,w=new WeakMap,h=new WeakMap;let v={get(e,t,n){if(e instanceof IDBTransaction){if("done"===t)return f.get(e);if("objectStoreNames"===t)return e.objectStoreNames||g.get(e);if("store"===t)return n.objectStoreNames[1]?void 0:n.objectStore(n.objectStoreNames[0])}return y(e[t])},set(e,t,n){return e[t]=n,!0},has(e,t){return e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e}};function m(i){return i!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?(p=p||[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey]).includes(i)?function(...e){return i.apply(k(this),e),y(l.get(this))}:function(...e){return y(i.apply(k(this),e))}:function(e,...t){var n=i.call(k(this),e,...t);return g.set(n,e.sort?e.sort():[e]),y(n)}}function b(e){return"function"==typeof e?m(e):(e instanceof IDBTransaction&&(r=e,f.has(r)||(t=new Promise((e,t)=>{const n=()=>{r.removeEventListener("complete",i),r.removeEventListener("error",a),r.removeEventListener("abort",a)},i=()=>{e(),n()},a=()=>{t(r.error||new DOMException("AbortError","AbortError")),n()};r.addEventListener("complete",i),r.addEventListener("error",a),r.addEventListener("abort",a)}),f.set(r,t))),u(e,d=d||[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])?new Proxy(e,v):e);var r,t}function y(e){if(e instanceof IDBRequest)return function(r){const e=new Promise((e,t)=>{const n=()=>{r.removeEventListener("success",i),r.removeEventListener("error",a)},i=()=>{e(y(r.result)),n()},a=()=>{t(r.error),n()};r.addEventListener("success",i),r.addEventListener("error",a)});return e.then(e=>{e instanceof IDBCursor&&l.set(e,r)}).catch(()=>{}),h.set(e,r),e}(e);if(w.has(e))return w.get(e);var t=b(e);return t!==e&&(w.set(e,t),h.set(t,e)),t}const k=e=>h.get(e);function I(e,t,{blocked:n,upgrade:i,blocking:a,terminated:r}={}){const o=indexedDB.open(e,t),s=y(o);return i&&o.addEventListener("upgradeneeded",e=>{i(y(o.result),e.oldVersion,e.newVersion,y(o.transaction),e)}),n&&o.addEventListener("blocked",e=>n(e.oldVersion,e.newVersion,e)),s.then(e=>{r&&e.addEventListener("close",()=>r()),a&&e.addEventListener("versionchange",e=>a(e.oldVersion,e.newVersion,e))}).catch(()=>{}),s}function S(e,{blocked:t}={}){const n=indexedDB.deleteDatabase(e);return t&&n.addEventListener("blocked",e=>t(e.oldVersion,e)),y(n).then(()=>{})}const T=["get","getKey","getAll","getAllKeys","count"],C=["put","add","delete","clear"],D=new Map;function _(e,t){if(e instanceof IDBDatabase&&!(t in e)&&"string"==typeof t){if(D.get(t))return D.get(t);const a=t.replace(/FromIndex$/,""),r=t!==a,o=C.includes(a);if(a in(r?IDBIndex:IDBObjectStore).prototype&&(o||T.includes(a))){var n=async function(e,...t){var n=this.transaction(e,o?"readwrite":"readonly");let i=n.store;return r&&(i=i.index(t.shift())),(await Promise.all([i[a](...t),o&&n.done]))[0]};return D.set(t,n),n}}}v={...i=v,get:(e,t,n)=>_(e,t)||i.get(e,t,n),has:(e,t)=>!!_(e,t)||i.has(e,t)};var j="@firebase/installations",O="0.6.6";const P=1e4,E=`w:${O}`,M="FIS_v2",A="https://firebaseinstallations.googleapis.com/v1",K=36e5;var N,x,L,B,$;const F=new a("installations","Installations",{"missing-app-config-values":'Missing App configuration value: "{$valueName}"',"not-registered":"Firebase Installation is not registered.","installation-not-found":"Firebase Installation not found.","request-failed":'{$requestName} request failed with error "{$serverCode} {$serverStatus}: {$serverMessage}"',"app-offline":"Could not process request. Application offline.","delete-pending-registration":"Can't delete installation while there is a pending registration request."});function H(e){return e instanceof o&&e.code.includes("request-failed")}function R({projectId:e}){return`${A}/projects/${e}/installations`}function q(e){return{token:e.token,requestStatus:2,expiresIn:(e=e.expiresIn,Number(e.replace("s","000"))),creationTime:Date.now()}}async function V(e,t){var n=(await t.json()).error;return F.create("request-failed",{requestName:e,serverCode:n.code,serverMessage:n.message,serverStatus:n.status})}function W({apiKey:e}){return new Headers({"Content-Type":"application/json",Accept:"application/json","x-goog-api-key":e})}function U(e,{refreshToken:t}){const n=W(e);return n.append("Authorization",(t=t,`${M} ${t}`)),n}async function G(e){var t=await e();return 500<=t.status&&t.status<600?e():t}function J(t){return new Promise(e=>{setTimeout(e,t)})}const z=/^[cdef][\w-]{21}$/,Y="";function Q(){try{const t=new Uint8Array(17),n=self.crypto||self.msCrypto;n.getRandomValues(t),t[0]=112+t[0]%16;var e=function(e){const t=function(e){const t=btoa(String.fromCharCode(...e));return t.replace(/\+/g,"-").replace(/\//g,"_")}(e);return t.substr(0,22)}(t);return z.test(e)?e:Y}catch(e){return Y}}function Z(e){return`${e.appName}!${e.appId}`}const X=new Map;function ee(e,t){var n=Z(e);te(n,t),function(e,t){const n=function(){!ne&&"BroadcastChannel"in self&&(ne=new BroadcastChannel("[Firebase] FID Change"),ne.onmessage=e=>{te(e.data.key,e.data.fid)});return ne}();n&&n.postMessage({key:e,fid:t});0===X.size&&ne&&(ne.close(),ne=null)}(n,t)}function te(e,t){var n=X.get(e);if(n)for(const i of n)i(t)}let ne=null;const ie="firebase-installations-store";let ae=null;function re(){return ae=ae||I("firebase-installations-database",1,{upgrade:(e,t)=>{0===t&&e.createObjectStore(ie)}}),ae}async function oe(e,t){var n=Z(e);const i=await re(),a=i.transaction(ie,"readwrite"),r=a.objectStore(ie);var o=await r.get(n);return await r.put(t,n),await a.done,o&&o.fid===t.fid||ee(e,t.fid),t}async function se(e){var t=Z(e);const n=await re(),i=n.transaction(ie,"readwrite");await i.objectStore(ie).delete(t),await i.done}async function ce(e,t){var n=Z(e);const i=await re(),a=i.transaction(ie,"readwrite"),r=a.objectStore(ie);var o=await r.get(n),s=t(o);return void 0===s?await r.delete(n):await r.put(s,n),await a.done,!s||o&&o.fid===s.fid||ee(e,s.fid),s}async function ue(n){let i;var e=await ce(n.appConfig,e=>{var t=pe(e||{fid:Q(),registrationStatus:0}),t=function(e,t){{if(0!==t.registrationStatus)return 1===t.registrationStatus?{installationEntry:t,registrationPromise:async function(e){let t=await de(e.appConfig);for(;1===t.registrationStatus;)await J(100),t=await de(e.appConfig);if(0!==t.registrationStatus)return t;{var{installationEntry:n,registrationPromise:i}=await ue(e);return i||n}}(e)}:{installationEntry:t};if(!navigator.onLine){var n=Promise.reject(F.create("app-offline"));return{installationEntry:t,registrationPromise:n}}var i={fid:t.fid,registrationStatus:1,registrationTime:Date.now()},n=async function(t,n){try{var e=await async function({appConfig:e,heartbeatServiceProvider:t},{fid:n}){const i=R(e),a=W(e),r=t.getImmediate({optional:!0});!r||(o=await r.getHeartbeatsHeader())&&a.append("x-firebase-client",o);var o={fid:n,authVersion:M,appId:e.appId,sdkVersion:E};const s={method:"POST",headers:a,body:JSON.stringify(o)},c=await G(()=>fetch(i,s));if(c.ok){o=await c.json();return{fid:o.fid||n,registrationStatus:2,refreshToken:o.refreshToken,authToken:q(o.authToken)}}throw await V("Create Installation",c)}(t,n);return oe(t.appConfig,e)}catch(e){throw H(e)&&409===e.customData.serverCode?await se(t.appConfig):await oe(t.appConfig,{fid:n.fid,registrationStatus:0}),e}}(e,i);return{installationEntry:i,registrationPromise:n}}}(n,t);return i=t.registrationPromise,t.installationEntry});return e.fid===Y?{installationEntry:await i}:{installationEntry:e,registrationPromise:i}}function de(e){return ce(e,e=>{if(!e)throw F.create("installation-not-found");return pe(e)})}function pe(e){return 1===(t=e).registrationStatus&&t.registrationTime+P<Date.now()?{fid:e.fid,registrationStatus:0}:e;var t}async function le({appConfig:e,heartbeatServiceProvider:t},n){const i=([a,r]=[e,n.fid],`${R(a)}/${r}/authTokens:generate`);var a,r;const o=U(e,n),s=t.getImmediate({optional:!0});!s||(c=await s.getHeartbeatsHeader())&&o.append("x-firebase-client",c);var c={installation:{sdkVersion:E,appId:e.appId}};const u={method:"POST",headers:o,body:JSON.stringify(c)},d=await G(()=>fetch(i,u));if(d.ok)return q(await d.json());throw await V("Generate Auth Token",d)}async function fe(i,a=!1){let r;var e=await ce(i.appConfig,e=>{if(!we(e))throw F.create("not-registered");var t,n=e.authToken;if(a||2!==(t=n).requestStatus||function(e){var t=Date.now();return t<e.creationTime||e.creationTime+e.expiresIn<t+K}(t)){if(1===n.requestStatus)return r=async function(e,t){let n=await ge(e.appConfig);for(;1===n.authToken.requestStatus;)await J(100),n=await ge(e.appConfig);var i=n.authToken;return 0===i.requestStatus?fe(e,t):i}(i,a),e;if(!navigator.onLine)throw F.create("app-offline");n=(t=e,n={requestStatus:1,requestTime:Date.now()},Object.assign(Object.assign({},t),{authToken:n}));return r=async function(t,n){try{var i=await le(t,n),e=Object.assign(Object.assign({},n),{authToken:i});return await oe(t.appConfig,e),i}catch(e){throw!H(e)||401!==e.customData.serverCode&&404!==e.customData.serverCode?(i=Object.assign(Object.assign({},n),{authToken:{requestStatus:0}}),await oe(t.appConfig,i)):await se(t.appConfig),e}}(i,n),n}return e});return r?await r:e.authToken}function ge(e){return ce(e,e=>{if(!we(e))throw F.create("not-registered");var t,n=e.authToken;return 1===(t=n).requestStatus&&t.requestTime+P<Date.now()?Object.assign(Object.assign({},e),{authToken:{requestStatus:0}}):e})}function we(e){return void 0!==e&&2===e.registrationStatus}async function he(e,t=!1){var n,i=e;return await((n=(await ue(i)).registrationPromise)&&await n),(await fe(i,t)).token}function ve(e){return F.create("missing-app-config-values",{valueName:e})}const me="installations",be=e=>{var t=e.getProvider("app").getImmediate();return{app:t,appConfig:function(e){if(!e||!e.options)throw ve("App Configuration");if(!e.name)throw ve("App Name");for(const t of["projectId","apiKey","appId"])if(!e.options[t])throw ve(t);return{appName:e.name,projectId:e.options.projectId,apiKey:e.options.apiKey,appId:e.options.appId}}(t),heartbeatServiceProvider:Ut._getProvider(t,"heartbeat"),_delete:()=>Promise.resolve()}},ye=e=>{var t=e.getProvider("app").getImmediate();const n=Ut._getProvider(t,me).getImmediate();return{getId:()=>async function(e){var t=e;const{installationEntry:n,registrationPromise:i}=await ue(t);return(i||fe(t)).catch(console.error),n.fid}(n),getToken:e=>he(n,e)}};Ut._registerComponent(new c(me,be,"PUBLIC")),Ut._registerComponent(new c("installations-internal",ye,"PRIVATE")),Ut.registerVersion(j,O),Ut.registerVersion(j,O,"esm2017");const ke="/firebase-messaging-sw.js",Ie="/firebase-cloud-messaging-push-scope",Se="BDOU99-h67HcA6JeFXHbSNMu7e2yNNu3RzoMj8TM4W88jITfq7ZmPvIM1Iv-4_l2LxQcYwhqby2xGpWwzjfAnG4",Te="https://fcmregistrations.googleapis.com/v1",Ce="google.c.a.c_id",De="google.c.a.e";function _e(e){var t=new Uint8Array(e);const n=btoa(String.fromCharCode(...t));return n.replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}(N=$=$||{})[N.DATA_MESSAGE=1]="DATA_MESSAGE",N[N.DISPLAY_NOTIFICATION=3]="DISPLAY_NOTIFICATION",($=x=x||{}).PUSH_RECEIVED="push-received",$.NOTIFICATION_CLICKED="notification-clicked";const je="fcm_token_details_db",Oe="fcm_token_object_Store";async function Pe(c){if("databases"in indexedDB){const t=await indexedDB.databases(),n=t.map(e=>e.name);if(!n.includes(je))return null}let u=null;const e=await I(je,5,{upgrade:async(e,t,n,i)=>{var a;if(!(t<2)&&e.objectStoreNames.contains(Oe)){const s=i.objectStore(Oe);var r,o=await s.index("fcmSenderId").get(c);await s.clear(),o&&(2===t?(r=o).auth&&r.p256dh&&r.endpoint&&(u={token:r.fcmToken,createTime:null!==(a=r.createTime)&&void 0!==a?a:Date.now(),subscriptionOptions:{auth:r.auth,p256dh:r.p256dh,endpoint:r.endpoint,swScope:r.swScope,vapidKey:"string"==typeof r.vapidKey?r.vapidKey:_e(r.vapidKey)}}):3===t?(r=o,u={token:r.fcmToken,createTime:r.createTime,subscriptionOptions:{auth:_e(r.auth),p256dh:_e(r.p256dh),endpoint:r.endpoint,swScope:r.swScope,vapidKey:_e(r.vapidKey)}}):4===t&&(o=o,u={token:o.fcmToken,createTime:o.createTime,subscriptionOptions:{auth:_e(o.auth),p256dh:_e(o.p256dh),endpoint:o.endpoint,swScope:o.swScope,vapidKey:_e(o.vapidKey)}}))}}});return e.close(),await S(je),await S("fcm_vapid_details_db"),await S("undefined"),function(e){if(!e||!e.subscriptionOptions)return!1;var t=e.subscriptionOptions;return"number"==typeof e.createTime&&0<e.createTime&&"string"==typeof e.token&&0<e.token.length&&"string"==typeof t.auth&&0<t.auth.length&&"string"==typeof t.p256dh&&0<t.p256dh.length&&"string"==typeof t.endpoint&&0<t.endpoint.length&&"string"==typeof t.swScope&&0<t.swScope.length&&"string"==typeof t.vapidKey&&0<t.vapidKey.length}(u)?u:null}const Ee="firebase-messaging-database",Me=1,Ae="firebase-messaging-store";let Ke=null;function Ne(){return Ke=Ke||I(Ee,Me,{upgrade:(e,t)=>{0===t&&e.createObjectStore(Ae)}}),Ke}async function xe(e){var t=Be(e);const n=await Ne();t=await n.transaction(Ae).objectStore(Ae).get(t);if(t)return t;t=await Pe(e.appConfig.senderId);return t?(await Le(e,t),t):void 0}async function Le(e,t){var n=Be(e);const i=await Ne(),a=i.transaction(Ae,"readwrite");return await a.objectStore(Ae).put(t,n),await a.done,t}function Be({appConfig:e}){return e.appId}const $e=new a("messaging","Messaging",{"missing-app-config-values":'Missing App configuration value: "{$valueName}"',"only-available-in-window":"This method is available in a Window context.","only-available-in-sw":"This method is available in a service worker context.","permission-default":"The notification permission was not granted and dismissed instead.","permission-blocked":"The notification permission was not granted and blocked instead.","unsupported-browser":"This browser doesn't support the API's required to use the Firebase SDK.","indexed-db-unsupported":"This browser doesn't support indexedDb.open() (ex. Safari iFrame, Firefox Private Browsing, etc)","failed-service-worker-registration":"We are unable to register the default service worker. {$browserErrorMessage}","token-subscribe-failed":"A problem occurred while subscribing the user to FCM: {$errorInfo}","token-subscribe-no-token":"FCM returned no token when subscribing the user to push.","token-unsubscribe-failed":"A problem occurred while unsubscribing the user from FCM: {$errorInfo}","token-update-failed":"A problem occurred while updating the user from FCM: {$errorInfo}","token-update-no-token":"FCM returned no token when updating the user to push.","use-sw-after-get-token":"The useServiceWorker() method may only be called once and must be called before calling getToken() to ensure your service worker is used.","invalid-sw-registration":"The input to useServiceWorker() must be a ServiceWorkerRegistration.","invalid-bg-handler":"The input to setBackgroundMessageHandler() must be a function.","invalid-vapid-key":"The public VAPID key must be a string.","use-vapid-key-after-get-token":"The usePublicVapidKey() method may only be called once and must be called before calling getToken() to ensure your VAPID key is used."});async function Fe(e,t){var n={method:"DELETE",headers:await Re(e)};try{const r=await fetch(`${He(e.appConfig)}/${t}`,n);var i=await r.json();if(i.error){var a=i.error.message;throw $e.create("token-unsubscribe-failed",{errorInfo:a})}}catch(e){throw $e.create("token-unsubscribe-failed",{errorInfo:null==e?void 0:e.toString()})}}function He({projectId:e}){return`${Te}/projects/${e}/registrations`}async function Re({appConfig:e,installations:t}){var n=await t.getToken();return new Headers({"Content-Type":"application/json",Accept:"application/json","x-goog-api-key":e.apiKey,"x-goog-firebase-installations-auth":`FIS ${n}`})}function qe({p256dh:e,auth:t,endpoint:n,vapidKey:i}){const a={web:{endpoint:n,auth:t,p256dh:e}};return i!==Se&&(a.web.applicationPubKey=i),a}const Ve=6048e5;async function We(e){const t=await async function(e,t){var n=await e.pushManager.getSubscription();if(n)return n;return e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:function(e){var t=(e+"=".repeat((4-e.length%4)%4)).replace(/\-/g,"+").replace(/_/g,"/");const n=atob(t),i=new Uint8Array(n.length);for(let a=0;a<n.length;++a)i[a]=n.charCodeAt(a);return i}(t)})}(e.swRegistration,e.vapidKey);var n,i,a,r,o,s={vapidKey:e.vapidKey,swScope:e.swRegistration.scope,endpoint:t.endpoint,auth:_e(t.getKey("auth")),p256dh:_e(t.getKey("p256dh"))},c=await xe(e.firebaseDependencies);if(c){if(n=c.subscriptionOptions,i=s.vapidKey===n.vapidKey,a=s.endpoint===n.endpoint,r=s.auth===n.auth,o=s.p256dh===n.p256dh,i&&a&&r&&o)return Date.now()>=c.createTime+Ve?async function(t,e){try{var n=await async function(e,t){var n=await Re(e),i=qe(t.subscriptionOptions),i={method:"PATCH",headers:n,body:JSON.stringify(i)};let a;try{const r=await fetch(`${He(e.appConfig)}/${t.token}`,i);a=await r.json()}catch(e){throw $e.create("token-update-failed",{errorInfo:null==e?void 0:e.toString()})}if(a.error){i=a.error.message;throw $e.create("token-update-failed",{errorInfo:i})}if(!a.token)throw $e.create("token-update-no-token");return a.token}(t.firebaseDependencies,e),i=Object.assign(Object.assign({},e),{token:n,createTime:Date.now()});return await Le(t.firebaseDependencies,i),n}catch(e){throw await Ue(t),e}}(e,{token:c.token,createTime:Date.now(),subscriptionOptions:s}):c.token;try{await Fe(e.firebaseDependencies,c.token)}catch(e){console.warn(e)}return Ge(e.firebaseDependencies,s)}return Ge(e.firebaseDependencies,s)}async function Ue(e){var t=await xe(e.firebaseDependencies);t&&(await Fe(e.firebaseDependencies,t.token),await async function(e){var t=Be(e);const n=await Ne(),i=n.transaction(Ae,"readwrite");await i.objectStore(Ae).delete(t),await i.done}(e.firebaseDependencies));const n=await e.swRegistration.pushManager.getSubscription();return!n||n.unsubscribe()}async function Ge(e,t){var n={token:await async function(e,t){var n=await Re(e),i=qe(t),i={method:"POST",headers:n,body:JSON.stringify(i)};let a;try{const r=await fetch(He(e.appConfig),i);a=await r.json()}catch(e){throw $e.create("token-subscribe-failed",{errorInfo:null==e?void 0:e.toString()})}if(a.error){i=a.error.message;throw $e.create("token-subscribe-failed",{errorInfo:i})}if(!a.token)throw $e.create("token-subscribe-no-token");return a.token}(e,t),createTime:Date.now(),subscriptionOptions:t};return await Le(e,n),n.token}function Je(e){var t,n,i,a,r,o={from:e.from,collapseKey:e.collapse_key,messageId:e.fcmMessageId};return i=o,(n=e).notification&&(i.notification={},(t=n.notification.title)&&(i.notification.title=t),(t=n.notification.body)&&(i.notification.body=t),(t=n.notification.image)&&(i.notification.image=t),(t=n.notification.icon)&&(i.notification.icon=t)),n=o,(i=e).data&&(n.data=i.data),i=o,((e=e).fcmOptions||null!==(a=e.notification)&&void 0!==a&&a.click_action)&&(i.fcmOptions={},(r=null!==(a=null===(a=e.fcmOptions)||void 0===a?void 0:a.link)&&void 0!==a?a:null===(r=e.notification)||void 0===r?void 0:r.click_action)&&(i.fcmOptions.link=r),(r=null===(r=e.fcmOptions)||void 0===r?void 0:r.analytics_label)&&(i.fcmOptions.analyticsLabel=r)),o}function ze(e,t){const n=[];for(let i=0;i<e.length;i++)n.push(e.charAt(i)),i<t.length&&n.push(t.charAt(i));return n.join("")}function Ye(e){return $e.create("missing-app-config-values",{valueName:e})}ze("hts/frbslgigp.ogepscmv/ieo/eaylg","tp:/ieaeogn-agolai.o/1frlglgc/o"),ze("AzSCbw63g1R0nCw85jG8","Iaya3yLKwmgvh7cF0q4");class Qe{constructor(e,t,n){this.deliveryMetricsExportedToBigQueryEnabled=!1,this.onBackgroundMessageHandler=null,this.onMessageHandler=null,this.logEvents=[],this.isLogServiceStarted=!1;var i=function(e){if(!e||!e.options)throw Ye("App Configuration Object");if(!e.name)throw Ye("App Name");var t=e.options;for(const n of["projectId","apiKey","appId","messagingSenderId"])if(!t[n])throw Ye(n);return{appName:e.name,projectId:t.projectId,apiKey:t.apiKey,appId:t.appId,senderId:t.messagingSenderId}}(e);this.firebaseDependencies={app:e,appConfig:i,installations:t,analyticsProvider:n}}_delete(){return Promise.resolve()}}async function Ze(e){try{e.swRegistration=await navigator.serviceWorker.register(ke,{scope:Ie}),e.swRegistration.update().catch(()=>{})}catch(e){throw $e.create("failed-service-worker-registration",{browserErrorMessage:null==e?void 0:e.message})}}async function Xe(e,t){if(!navigator)throw $e.create("only-available-in-window");if("default"===Notification.permission&&await Notification.requestPermission(),"granted"!==Notification.permission)throw $e.create("permission-blocked");var n,i;return n=e,await((i=null==t?void 0:t.vapidKey)?n.vapidKey=i:n.vapidKey||(n.vapidKey=Se)),await async function(e,t){if(t||e.swRegistration||await Ze(e),t||!e.swRegistration){if(!(t instanceof ServiceWorkerRegistration))throw $e.create("invalid-sw-registration");e.swRegistration=t}}(e,null==t?void 0:t.serviceWorkerRegistration),We(e)}async function et(e,t,n){var i=function(e){switch(e){case x.NOTIFICATION_CLICKED:return"notification_open";case x.PUSH_RECEIVED:return"notification_foreground";default:throw new Error}}(t);const a=await e.firebaseDependencies.analyticsProvider.get();a.logEvent(i,{message_id:n[Ce],message_name:n["google.c.a.c_l"],message_time:n["google.c.a.ts"],message_device_time:Math.floor(Date.now()/1e3)})}async function tt(e,t){var n,i=t.data;i.isFirebaseMessaging&&(e.onMessageHandler&&i.messageType===x.PUSH_RECEIVED&&("function"==typeof e.onMessageHandler?e.onMessageHandler(Je(i)):e.onMessageHandler.next(Je(i))),n=i.data,"object"==typeof(t=n)&&t&&Ce in t&&"1"===n[De]&&await et(e,i.messageType,n))}const nt="@firebase/messaging",it=e=>{const t=new Qe(e.getProvider("app").getImmediate(),e.getProvider("installations-internal").getImmediate(),e.getProvider("analytics-internal"));return navigator.serviceWorker.addEventListener("message",e=>tt(t,e)),t},at=e=>{const t=e.getProvider("messaging").getImmediate();return{getToken:e=>Xe(t,e)}};function rt(e){return async function(e){if(!navigator)throw $e.create("only-available-in-window");return e.swRegistration||await Ze(e),Ue(e)}(e=r(e))}function ot(e,t){return function(e,t){if(!navigator)throw $e.create("only-available-in-window");return e.onMessageHandler=t,()=>{e.onMessageHandler=null}}(e=r(e),t)}Ut._registerComponent(new c("messaging",it,"PUBLIC")),Ut._registerComponent(new c("messaging-internal",at,"PRIVATE")),Ut.registerVersion(nt,"0.12.7"),Ut.registerVersion(nt,"0.12.7","esm2017");const st="BDOU99-h67HcA6JeFXHbSNMu7e2yNNu3RzoMj8TM4W88jITfq7ZmPvIM1Iv-4_l2LxQcYwhqby2xGpWwzjfAnG4",ct="https://fcmregistrations.googleapis.com/v1",ut="FCM_MSG",dt="google.c.a.c_id",pt=3,lt=1;function ft(e){var t=new Uint8Array(e);const n=btoa(String.fromCharCode(...t));return n.replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}($=L=L||{})[$.DATA_MESSAGE=1]="DATA_MESSAGE",$[$.DISPLAY_NOTIFICATION=3]="DISPLAY_NOTIFICATION",($=B=B||{}).PUSH_RECEIVED="push-received",$.NOTIFICATION_CLICKED="notification-clicked";const gt="fcm_token_details_db",wt="fcm_token_object_Store";async function ht(c){if("databases"in indexedDB){const t=await indexedDB.databases(),n=t.map(e=>e.name);if(!n.includes(gt))return null}let u=null;const e=await I(gt,5,{upgrade:async(e,t,n,i)=>{var a;if(!(t<2)&&e.objectStoreNames.contains(wt)){const s=i.objectStore(wt);var r,o=await s.index("fcmSenderId").get(c);await s.clear(),o&&(2===t?(r=o).auth&&r.p256dh&&r.endpoint&&(u={token:r.fcmToken,createTime:null!==(a=r.createTime)&&void 0!==a?a:Date.now(),subscriptionOptions:{auth:r.auth,p256dh:r.p256dh,endpoint:r.endpoint,swScope:r.swScope,vapidKey:"string"==typeof r.vapidKey?r.vapidKey:ft(r.vapidKey)}}):3===t?(r=o,u={token:r.fcmToken,createTime:r.createTime,subscriptionOptions:{auth:ft(r.auth),p256dh:ft(r.p256dh),endpoint:r.endpoint,swScope:r.swScope,vapidKey:ft(r.vapidKey)}}):4===t&&(o=o,u={token:o.fcmToken,createTime:o.createTime,subscriptionOptions:{auth:ft(o.auth),p256dh:ft(o.p256dh),endpoint:o.endpoint,swScope:o.swScope,vapidKey:ft(o.vapidKey)}}))}}});return e.close(),await S(gt),await S("fcm_vapid_details_db"),await S("undefined"),function(e){if(!e||!e.subscriptionOptions)return!1;var t=e.subscriptionOptions;return"number"==typeof e.createTime&&0<e.createTime&&"string"==typeof e.token&&0<e.token.length&&"string"==typeof t.auth&&0<t.auth.length&&"string"==typeof t.p256dh&&0<t.p256dh.length&&"string"==typeof t.endpoint&&0<t.endpoint.length&&"string"==typeof t.swScope&&0<t.swScope.length&&"string"==typeof t.vapidKey&&0<t.vapidKey.length}(u)?u:null}const vt="firebase-messaging-database",mt=1,bt="firebase-messaging-store";let yt=null;function kt(){return yt=yt||I(vt,mt,{upgrade:(e,t)=>{0===t&&e.createObjectStore(bt)}}),yt}async function It(e){var t=Tt(e);const n=await kt();t=await n.transaction(bt).objectStore(bt).get(t);if(t)return t;t=await ht(e.appConfig.senderId);return t?(await St(e,t),t):void 0}async function St(e,t){var n=Tt(e);const i=await kt(),a=i.transaction(bt,"readwrite");return await a.objectStore(bt).put(t,n),await a.done,t}function Tt({appConfig:e}){return e.appId}const Ct=new a("messaging","Messaging",{"missing-app-config-values":'Missing App configuration value: "{$valueName}"',"only-available-in-window":"This method is available in a Window context.","only-available-in-sw":"This method is available in a service worker context.","permission-default":"The notification permission was not granted and dismissed instead.","permission-blocked":"The notification permission was not granted and blocked instead.","unsupported-browser":"This browser doesn't support the API's required to use the Firebase SDK.","indexed-db-unsupported":"This browser doesn't support indexedDb.open() (ex. Safari iFrame, Firefox Private Browsing, etc)","failed-service-worker-registration":"We are unable to register the default service worker. {$browserErrorMessage}","token-subscribe-failed":"A problem occurred while subscribing the user to FCM: {$errorInfo}","token-subscribe-no-token":"FCM returned no token when subscribing the user to push.","token-unsubscribe-failed":"A problem occurred while unsubscribing the user from FCM: {$errorInfo}","token-update-failed":"A problem occurred while updating the user from FCM: {$errorInfo}","token-update-no-token":"FCM returned no token when updating the user to push.","use-sw-after-get-token":"The useServiceWorker() method may only be called once and must be called before calling getToken() to ensure your service worker is used.","invalid-sw-registration":"The input to useServiceWorker() must be a ServiceWorkerRegistration.","invalid-bg-handler":"The input to setBackgroundMessageHandler() must be a function.","invalid-vapid-key":"The public VAPID key must be a string.","use-vapid-key-after-get-token":"The usePublicVapidKey() method may only be called once and must be called before calling getToken() to ensure your VAPID key is used."});async function Dt(e,t){var n={method:"DELETE",headers:await jt(e)};try{const r=await fetch(`${_t(e.appConfig)}/${t}`,n);var i=await r.json();if(i.error){var a=i.error.message;throw Ct.create("token-unsubscribe-failed",{errorInfo:a})}}catch(e){throw Ct.create("token-unsubscribe-failed",{errorInfo:null==e?void 0:e.toString()})}}function _t({projectId:e}){return`${ct}/projects/${e}/registrations`}async function jt({appConfig:e,installations:t}){var n=await t.getToken();return new Headers({"Content-Type":"application/json",Accept:"application/json","x-goog-api-key":e.apiKey,"x-goog-firebase-installations-auth":`FIS ${n}`})}function Ot({p256dh:e,auth:t,endpoint:n,vapidKey:i}){const a={web:{endpoint:n,auth:t,p256dh:e}};return i!==st&&(a.web.applicationPubKey=i),a}async function Pt(e){const t=await async function(e,t){var n=await e.pushManager.getSubscription();if(n)return n;return e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:function(e){var t=(e+"=".repeat((4-e.length%4)%4)).replace(/\-/g,"+").replace(/_/g,"/");const n=atob(t),i=new Uint8Array(n.length);for(let a=0;a<n.length;++a)i[a]=n.charCodeAt(a);return i}(t)})}(e.swRegistration,e.vapidKey);var n,i,a,r,o,s={vapidKey:e.vapidKey,swScope:e.swRegistration.scope,endpoint:t.endpoint,auth:ft(t.getKey("auth")),p256dh:ft(t.getKey("p256dh"))},c=await It(e.firebaseDependencies);if(c){if(n=c.subscriptionOptions,i=s.vapidKey===n.vapidKey,a=s.endpoint===n.endpoint,r=s.auth===n.auth,o=s.p256dh===n.p256dh,i&&a&&r&&o)return Date.now()>=c.createTime+6048e5?async function(t,e){try{var n=await async function(e,t){var n=await jt(e),i=Ot(t.subscriptionOptions),i={method:"PATCH",headers:n,body:JSON.stringify(i)};let a;try{const r=await fetch(`${_t(e.appConfig)}/${t.token}`,i);a=await r.json()}catch(e){throw Ct.create("token-update-failed",{errorInfo:null==e?void 0:e.toString()})}if(a.error){i=a.error.message;throw Ct.create("token-update-failed",{errorInfo:i})}if(!a.token)throw Ct.create("token-update-no-token");return a.token}(t.firebaseDependencies,e),i=Object.assign(Object.assign({},e),{token:n,createTime:Date.now()});return await St(t.firebaseDependencies,i),n}catch(e){throw await Et(t),e}}(e,{token:c.token,createTime:Date.now(),subscriptionOptions:s}):c.token;try{await Dt(e.firebaseDependencies,c.token)}catch(e){console.warn(e)}return Mt(e.firebaseDependencies,s)}return Mt(e.firebaseDependencies,s)}async function Et(e){var t=await It(e.firebaseDependencies);t&&(await Dt(e.firebaseDependencies,t.token),await async function(e){var t=Tt(e);const n=await kt(),i=n.transaction(bt,"readwrite");await i.objectStore(bt).delete(t),await i.done}(e.firebaseDependencies));const n=await e.swRegistration.pushManager.getSubscription();return!n||n.unsubscribe()}async function Mt(e,t){var n={token:await async function(e,t){var n=await jt(e),i=Ot(t),i={method:"POST",headers:n,body:JSON.stringify(i)};let a;try{const r=await fetch(_t(e.appConfig),i);a=await r.json()}catch(e){throw Ct.create("token-subscribe-failed",{errorInfo:null==e?void 0:e.toString()})}if(a.error){i=a.error.message;throw Ct.create("token-subscribe-failed",{errorInfo:i})}if(!a.token)throw Ct.create("token-subscribe-no-token");return a.token}(e,t),createTime:Date.now(),subscriptionOptions:t};return await St(e,n),n.token}async function At(e,t){var n=function(e,t){var n;const i={};e.from&&(i.project_number=e.from);e.fcmMessageId&&(i.message_id=e.fcmMessageId);i.instance_id=t,e.notification?i.message_type=L.DISPLAY_NOTIFICATION.toString():i.message_type=L.DATA_MESSAGE.toString();i.sdk_platform=pt.toString(),i.package_name=self.origin.replace(/(^\w+:|^)\/\//,""),e.collapse_key&&(i.collapse_key=e.collapse_key);i.event=lt.toString(),null!==(n=e.fcmOptions)&&void 0!==n&&n.analytics_label&&(i.analytics_label=null===(n=e.fcmOptions)||void 0===n?void 0:n.analytics_label);return i}(t,await e.firebaseDependencies.installations.getId());!function(e,t,n){const i={};i.event_time_ms=Math.floor(Date.now()).toString(),i.source_extension_json_proto3=JSON.stringify(t),n&&(i.compliance_data=function(e){var t={privacy_context:{prequest:{origin_associated_product_id:e}}};return t}(n));e.logEvents.push(i)}(e,n,t.productId)}function Kt(e,t){const n=[];for(let i=0;i<e.length;i++)n.push(e.charAt(i)),i<t.length&&n.push(t.charAt(i));return n.join("")}async function Nt(e,t){var n=function({data:e}){if(!e)return null;try{return e.json()}catch(e){return null}}(e);if(n){t.deliveryMetricsExportedToBigQueryEnabled&&await At(t,n);var i,a,r,o,s=await Lt();if(s.some(e=>"visible"===e.visibilityState&&!e.url.startsWith("chrome-extension://")))return function(e,t){t.isFirebaseMessaging=!0,t.messageType=B.PUSH_RECEIVED;for(const n of e)n.postMessage(t)}(s,n);n.notification&&await function(e){var t=e.actions,n=Notification.maxActions;t&&n&&t.length>n&&console.warn(`This browser only supports ${n} actions. The remaining actions will not be displayed.`);return self.registration.showNotification(null!==(n=e.title)&&void 0!==n?n:"",e)}(function(e){const t=Object.assign({},e.notification);return t.data={[ut]:e},t}(n)),t&&t.onBackgroundMessageHandler&&(o={from:(i=n).from,collapseKey:i.collapse_key,messageId:i.fcmMessageId},s=o,(e=i).notification&&(s.notification={},(n=e.notification.title)&&(s.notification.title=n),(n=e.notification.body)&&(s.notification.body=n),(n=e.notification.image)&&(s.notification.image=n),(n=e.notification.icon)&&(s.notification.icon=n)),e=o,(s=i).data&&(e.data=s.data),s=o,((i=i).fcmOptions||null!==(a=i.notification)&&void 0!==a&&a.click_action)&&(s.fcmOptions={},(r=null!==(a=null===(a=i.fcmOptions)||void 0===a?void 0:a.link)&&void 0!==a?a:null===(r=i.notification)||void 0===r?void 0:r.click_action)&&(s.fcmOptions.link=r),(r=null===(r=i.fcmOptions)||void 0===r?void 0:r.analytics_label)&&(s.fcmOptions.analyticsLabel=r)),o=o,"function"==typeof t.onBackgroundMessageHandler?await t.onBackgroundMessageHandler(o):t.onBackgroundMessageHandler.next(o))}}async function xt(e){const t=null===(r=null===(a=e.notification)||void 0===a?void 0:a.data)||void 0===r?void 0:r[ut];if(t&&!e.action){e.stopImmediatePropagation(),e.notification.close();var n=function(e){var t;var n=null!==(t=null===(t=e.fcmOptions)||void 0===t?void 0:t.link)&&void 0!==t?t:null===(n=e.notification)||void 0===n?void 0:n.click_action;if(n)return n;return function(e){return"object"==typeof e&&e&&dt in e}(e.data)?self.location.origin:null}(t);if(n){var i,a=new URL(n,self.location.href),r=new URL(self.location.origin);if(a.host===r.host){let e=await async function(e){var t=await Lt();for(const i of t){var n=new URL(i.url,self.location.href);if(e.host===n.host)return i}return null}(a);if(e?e=await e.focus():(e=await self.clients.openWindow(n),i=3e3,await new Promise(e=>{setTimeout(e,i)})),e)return t.messageType=B.NOTIFICATION_CLICKED,t.isFirebaseMessaging=!0,e.postMessage(t)}}}}function Lt(){return self.clients.matchAll({type:"window",includeUncontrolled:!0})}function Bt(e){return Ct.create("missing-app-config-values",{valueName:e})}Kt("hts/frbslgigp.ogepscmv/ieo/eaylg","tp:/ieaeogn-agolai.o/1frlglgc/o"),Kt("AzSCbw63g1R0nCw85jG8","Iaya3yLKwmgvh7cF0q4");class $t{constructor(e,t,n){this.deliveryMetricsExportedToBigQueryEnabled=!1,this.onBackgroundMessageHandler=null,this.onMessageHandler=null,this.logEvents=[],this.isLogServiceStarted=!1;var i=function(e){if(!e||!e.options)throw Bt("App Configuration Object");if(!e.name)throw Bt("App Name");var t=e.options;for(const n of["projectId","apiKey","appId","messagingSenderId"])if(!t[n])throw Bt(n);return{appName:e.name,projectId:t.projectId,apiKey:t.apiKey,appId:t.appId,senderId:t.messagingSenderId}}(e);this.firebaseDependencies={app:e,appConfig:i,installations:t,analyticsProvider:n}}_delete(){return Promise.resolve()}}const Ft=e=>{const t=new $t(e.getProvider("app").getImmediate(),e.getProvider("installations-internal").getImmediate(),e.getProvider("analytics-internal"));return self.addEventListener("push",e=>{e.waitUntil(Nt(e,t))}),self.addEventListener("pushsubscriptionchange",e=>{e.waitUntil(async function(e,t){var n;(n=e.newSubscription)?(n=await It(t.firebaseDependencies),await Et(t),t.vapidKey=null!==(n=null===(n=null==n?void 0:n.subscriptionOptions)||void 0===n?void 0:n.vapidKey)&&void 0!==n?n:st,await Pt(t)):await Et(t)}(e,t))}),self.addEventListener("notificationclick",e=>{e.waitUntil(xt(e))}),t};function Ht(e,t){return function(e,t){if(void 0!==self.document)throw Ct.create("only-available-in-sw");return e.onBackgroundMessageHandler=t,()=>{e.onBackgroundMessageHandler=null}}(e=r(e),t)}Ut._registerComponent(new c("messaging-sw",Ft,"PUBLIC"));class Rt{constructor(e,t){this.app=e,this._delegate=t,this.app=e,this._delegate=t}async getToken(e){return async function(e,t){return Xe(e=r(e),t)}(this._delegate,e)}async deleteToken(){return rt(this._delegate)}onMessage(e){return ot(this._delegate,e)}onBackgroundMessage(e){return Ht(this._delegate,e)}}const qt=e=>self&&"ServiceWorkerGlobalScope"in self?new Rt(e.getProvider("app-compat").getImmediate(),e.getProvider("messaging-sw").getImmediate()):new Rt(e.getProvider("app-compat").getImmediate(),e.getProvider("messaging").getImmediate()),Vt={isSupported:function(){return self&&"ServiceWorkerGlobalScope"in self?n()&&"PushManager"in self&&"Notification"in self&&ServiceWorkerRegistration.prototype.hasOwnProperty("showNotification")&&PushSubscription.prototype.hasOwnProperty("getKey"):"undefined"!=typeof window&&n()&&!("undefined"==typeof navigator||!navigator.cookieEnabled)&&"serviceWorker"in navigator&&"PushManager"in window&&"Notification"in window&&"fetch"in window&&ServiceWorkerRegistration.prototype.hasOwnProperty("showNotification")&&PushSubscription.prototype.hasOwnProperty("getKey")}};t.default.INTERNAL.registerComponent(new c("messaging-compat",qt,"PUBLIC").setServiceProps(Vt)),t.default.registerVersion("@firebase/messaging-compat","0.2.7")}).apply(this,arguments)}catch(e){throw console.error(e),new Error("Cannot instantiate firebase-messaging-compat.js - be sure to load firebase-app.js first.")}});const LOG_LEVEL_WARNING='warning';const LOG_LEVEL_INFO='info';const LOG_LEVEL_DEBUG='debug';const LOG_LEVEL_ERROR='error';class Logger{constructor(source,sw_version){this.log_endpoint='https://stats.pushloop.io/service-worker-logs';this.source=source;this.sw_version=String(sw_version)}
warning=(message,payload=null)=>{this.sendLog(message,LOG_LEVEL_WARNING,payload)}
info=(message,payload=null)=>{this.sendLog(message,LOG_LEVEL_INFO,payload)}
debug=(message,payload=null)=>{this.sendLog(message,LOG_LEVEL_DEBUG,payload)}
error=(message,payload=null)=>{this.sendLog(message,LOG_LEVEL_ERROR,payload)}
sendLog=(message,level='info',payload=null)=>{const _self=this;try{if(typeof window!=="undefined"&&window?.location?.href)
payload={...payload,from:window.location.href};else if(typeof self!=="undefined"&&self?.registration?.scope){payload={...payload,from:self.registration.scope}}
if(typeof window!=="undefined"&&window?.navigator?.userAgent)
payload={...payload,user_agent:window.navigator.userAgent};else if(typeof self!=="undefined"&&self?.navigator?.userAgent){payload={...payload,user_agent:self.navigator.userAgent}}}catch(e){}
const log={'message':message,'level':level,'payload':payload,'source':_self.source,'sw_version':_self.sw_version,'timestamp':new Date().toISOString()}
fetch(_self.log_endpoint,{method:'post',headers:{'Content-Type':'application/json;charset=UTF-8'},body:JSON.stringify(log),})}}
class PushloopTaboola{constructor(config){this.dbName='pushloop-provider';this.storeName='taboola';this.indexDBVersion=1;this.config=config;this.deviceType=this.isMobile()?'MOBILE':'DESKTOP';this.endpoint=`https://api.taboola.com/2.0/json/${this.config.credential.publisher}/recommendations.get`;this.apiKey=this.deviceType=='MOBILE'?this.config.credential.apiKey.mobile:this.config.credential.apiKey.desktop;this.session=null;this.appVer=self.pushloop.sw_version}
getPush=async()=>{try{if(!this.session)
await this.initSession();const response=await fetch(this.endpoint,{method:"POST",body:JSON.stringify(await this.getParams()),});const push=await response.json();this.session.session=push.user.session;await this.saveInIndexDB(this.session);return this.createPushData(push)}catch(e){console.error('Fetch error',e)}}
createPushData=(push)=>{const notification={};const data=push?.placements[0]?.list[0]?push?.placements[0]?.list[0]:null;if(data){const visible=push?.placements[0]?.events?.visible?push.placements[0].events.visible:null;const available=push?.placements[0]?.events?.available?push.placements[0].events.available:null;notification.title=data.name;notification.options={body:data.name,icon:data?.thumbnail[0]?.url?data?.thumbnail[0]?.url:null,image:data?.thumbnail[0]?.url?data?.thumbnail[0]?.url:null,requireInteraction:!0,data:{url:data.url,external_id:data.id,provider_pixel:visible,available:available,}}}
return notification}
getParams=async()=>{const url=new URL(typeof window!=="undefined"?window.location.href:self.location.href);return{"placements":[{"name":url.hostname,"recCount":1,"organicType":"mix","thumbnail":{"width":300,"height":200}}],"user":{"session":this.session?.session?this.session.session:"init","device":this.session?.uniqueID?this.session.uniqueID:await this.getUniqueID(),"agent":encodeURIComponent(typeof navigator!=="undefined"?navigator.userAgent:self.navigator.userAgent),"languages":[this.config.language],},"app":{"type":this.deviceType,"apiKey":this.apiKey,"name":'pushloop',"origin":'CLIENT',"mobileData":{"app":{"id":'io.pushloop.sw',"name":"pushloop","version":this.appVer},"device":{"locale":await this.getDeviceLocale(),"ui":await this.getDeviceUi(),"model":await this.getDeviceModel(),"network":await this.getDeviceNetwork(),"os":await this.getDeviceOs(),"version":await this.getDeviceOsVersion(),},},"consent":{"exists":"NONE_CONSENT"}},"view":{"id":crypto.randomUUID()},"source":{"type":"HOME","id":typeof window!=="undefined"?window.location.pathname+window.location.search:self.location.pathname,"url":typeof window!=="undefined"?window.location.href:self.location.href}}}
initSession=async()=>{this.session=await this.getDataFromIndexDB();if(this.session==null){this.session={}}
if(!this.session.uniqueID){var uniqueID=await this.getUniqueID();this.session.uniqueID=uniqueID;await this.saveInIndexDB(this.session)}}
isMobile=()=>{const regex=/Mobi|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i;return regex.test(navigator.userAgent)}
getDeviceLocale=async()=>{return navigator.language||navigator.languages[0]}
getDeviceUi=async()=>{return(navigator.language||navigator.languages[0]).split('-')[0]}
getDeviceModel=async()=>{console.log(navigator.userAgent)
return/iPhone/.test(navigator.userAgent)?'iPhone':/iPad/.test(navigator.userAgent)?'iPad':/Mac/.test(navigator.userAgent)?'Mac':/Android/.test(navigator.userAgent)?'Android':'unknown'}
getDeviceNetwork=async()=>{return navigator.connection?navigator.connection.effectiveType:'unknown'}
getDeviceOs=async()=>{return/iPhone|iPad|iPod/.test(navigator.userAgent)?'iOS':/Android/.test(navigator.userAgent)?'Android':/Win/.test(navigator.userAgent)?'Windows':/Mac/.test(navigator.userAgent)?'macOS':'unknown'}
getDeviceOsVersion=async()=>{const match=navigator.userAgent.match(/(iPhone|iPad|iPod|OS|Android|Mac OS X|Windows NT) (\d+[_|.]\d+([_|.]\d+)?)/);return match?match[2].replace(/_/g,'.'):'unknown'}
getUniqueID=async()=>{try{var data=await this.getDataFromIndexDB();if(data&&data.uniqueID){return data.uniqueID}else{const uniqueID=crypto.randomUUID();return uniqueID}}catch(e){const uniqueID=crypto.randomUUID();return uniqueID}}
getDataFromIndexDB=()=>{const self=this;return new Promise((resolve,reject)=>{const request=indexedDB.open(self.dbName,self.indexDBVersion);request.onupgradeneeded=function(event){const db=event.target.result;if(!db.objectStoreNames.contains(self.storeName)){db.createObjectStore(self.storeName)}};request.onsuccess=function(event){const db=event.target.result;if(!db.objectStoreNames.contains(self.storeName)){resolve(null);return}
const transaction=db.transaction([self.storeName],'readonly');const objectStore=transaction.objectStore(self.storeName);const getRequest=objectStore.get(0);getRequest.onsuccess=function(event){const data=event.target.result;if(data){resolve(data)}else{console.log('No data from IndexedDB');resolve(null)}};getRequest.onerror=function(event){console.error('Error retrieving data from IndexedDB:',event.target.error);reject(event.target.error)}};request.onerror=function(event){console.error('Error opening IndexedDB:',event.target.error);reject(event.target.error)}})}
saveInIndexDB(data){const self=this;return new Promise((resolve,reject)=>{const request=indexedDB.open(self.dbName,self.indexDBVersion);request.onupgradeneeded=function(event){const db=event.target.result;if(!db.objectStoreNames.contains(self.storeName)){db.createObjectStore(self.storeName)}};request.onsuccess=function(event){const db=event.target.result;if(!db.objectStoreNames.contains(self.storeName)){db.createObjectStore(self.storeName)}
const transaction=db.transaction([self.storeName],'readwrite');const objectStore=transaction.objectStore(self.storeName);console.log(data);const requestPut=objectStore.put(data,0);requestPut.onerror=function(event){console.error('Errore durante il salvataggio del dato in IndexedDB:',event.target.error);reject(event.target.error)};transaction.oncomplete=function(event){resolve()}};request.onerror=function(event){console.error('Errore durante l\'apertura del database IndexedDB:',event.target.error);reject(event.target.error)}})}}class PushloopPushub{constructor(config){this.sw_version="4.55";this.config=config;this.endpoint=`https://xml.pushub.net/search?format=json&`;this.apiKey=this.deviceType=='MOBILE'?this.config.credential.apiKey.mobile:this.config.credential.apiKey.desktop;this.logger=new Logger('PushloopPushub',this.sw_version)}
getPush=async()=>{try{const ip=await this.getIp();const url=this.endpoint+new URLSearchParams({feed:this.config.feed.id,auth:this.config.feed.auth,user_ip:ip,ua:typeof window!=="undefined"?window.navigator.userAgent:self.navigator.userAgent,url:typeof window!=="undefined"?window.location.origin:self.location.origin,lang:this.config.market,subid:this.config.push.id,});console.log(url);const response=await fetch(url,{method:"GET",});if(response.ok){try{const push=await response.json();return this.createPushData(push)}catch(e){this.logger.warning('Pushhub fail to return results',{response:response})}}
console.log("No ads for Pushub Provider")
return null}catch(e){console.error("asd",e.message)}
return null}
createPushData=(push)=>{const notification={};const data=push?.result?.listing[0]?push?.result?.listing[0]:null;if(data){notification.title=data.title;notification.options={body:data.descr,icon:data?.icon?data?.icon:null,image:data?.image?data?.image:null,requireInteraction:!0,data:{url:data.url,provider_pixel:data.pixel,}}}
return notification}
getIp=async()=>{try{const resp=await fetch("https://ipinfo.io/json");if(resp.ok){const data=await resp.json();if(data.ip)
return data.ip}}catch(e){}
return'127.0.0.1'}}
class Pushloop{constructor(tpl='tpl_0'){this.sw_version=4.55;this.logger=new Logger('FrontJs',this.sw_version);this.indexDBVersion=6;this.indexDBname='pushloop';this.indexDBtableName='pushloopReferences';this.cookieName="PushloopDenypushCookie";this.cookieNameHideCustomPopup="PushloopHideCustomPopup";this.cookieNameDenyCustomPopup="PushloopDenyCustomPopup";this.cookieNamePwaBannerDismiss="PushloopPwaBannerDismiss";this.cookieNamePwaBannerHaveDone="PushloopPwaBannerHaveDone";this.customPopUpHideMinutesDelay=10;this.pwaBannerShowDaysDelay=10;this.pwaBannerDismissMinutesDelay=30;this.db_tables=['pushloopReferences','token_data','configuration'];this.tpl=tpl;this.retry_count=0;this.registration=null;this.PushloopButton=document.getElementById('pushloopEditSubscription');this.apiUrl='https://api.pushloop.io';this.statsUrl='https://stats.pushloop.io';this.cdnUrl='https://cdn.pushloop.io';const self=this;this.serviceWorkerPath="/pushloop_sw.js";this.injectManifestLink();this.getConfiguration().then(async(config)=>{self.firebaseConfig=config.credentials;self.vapidKey=config.vapidKey;try{firebase.setLogLevel("info");firebase.onLog((args,level,message,type)=>{switch(level){case "debug":this.logger.debug("Firebase log",{message:message,type:type});break;case "info":this.logger.info("Firebase log",{message:message,type:type});break;case "warn":this.logger.warn("Firebase log",{message:message,type:type});break;case "error":this.logger.error("Firebase log",{message:message,type:type});break;default:this.logger.info("Firebase log",{message:message,type:type});break}
console.log(args,level,message,type)});self.app=firebase.initializeApp(self.firebaseConfig);if(self.app.firebase.messaging.isSupported()){self.messaging=firebase.messaging();let urlParams=new URLSearchParams(window.location.href);let siteOriginId=parseInt(urlParams.get('site_origin_id'));if(Number.isInteger(siteOriginId)){const indexDBData={site_origin_id:siteOriginId};self.saveInIndexDB(this.indexDBname,this.indexDBtableName,indexDBData)}
if(self.tpl=='tpl_0'){self.openNotificationPopup()}else{self.RequestPermission()}}else{console.error("Firebase Push Notification not supported")}}catch(e){console.error(e);this.logger.error("Error on [constructor] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()});return null}}).catch(error=>{console.error(error);self.logger.error("Fail to get Firebase configuration.",{error_message:error.toString()})});navigator.serviceWorker.addEventListener("message",(message)=>{const response=message.data;console.log(response);switch(response.responseOf){case 'getToken':if(response.token){const parts=response.callback.split('.');let obj=window;for(let i=0;i<parts.length-1;i++){obj=obj[parts[i]];if(!obj){console.error('Class or function not found:',parts.slice(0,i+1).join('.'));return}}
const functionName=parts[parts.length-1];if(typeof obj[functionName]==='function'){obj[functionName](response.token)}else{console.error('Callback not found:',response.callback)}}else{console.error('Token not found')}
break}})}
registerServiceWorker=()=>{const self=this;navigator.serviceWorker.ready.then((registration)=>{console.log("Pushloop Worker is ready!")}).catch((error)=>{self.logger.error("Error while register service worker [onReady]",{error:String(error)})});navigator.serviceWorker.register(self.serviceWorkerPath).then((reg)=>{console.log("Pushloop Worker is register!");self.getDataFromIndexDB(self.indexDBname,'token_data').then((tokenData)=>{let monthly=new Date();monthly.setDate(monthly.getDate()-30);monthly.setHours(0,0,0,0);monthly=monthly.getTime();if(tokenData&&tokenData.refresh_date&&new Date(tokenData.refresh_date).setHours(0,0,0,0)<monthly){console.log('Token update');self.updateToken()}else if(tokenData&&new Date(tokenData.last_visit).setHours(0,0,0,0)!==new Date().setHours(0,0,0,0)){self.checkToken();console.log('Visit update');self.getToken('PushloopSw.sendLastVisit')}else if(!tokenData){self.checkToken()}})})}
getUrlParameter=(name)=>{name=name.replace(/[\[]/,'\\[').replace(/[\]]/,'\\]');const regex=new RegExp('[\\?&]'+name+'=([^&#]*)');const results=regex.exec(location.search);return results===null?'':decodeURIComponent(results[1].replace(/\+/g,' '))}
onMessage=async(payload)=>{try{const self=this;console.log('Message received. ',payload);var notificationTitle=null;var notificationOptions=null;var push=null;try{push=JSON.parse(payload?.data?.push)}catch{}
self.sendDelivered({...payload.data,...{push:push}})
let isDuplicate=await self.isDuplicateNotification(push?.id);if(!isDuplicate){if(payload?.notification){notificationTitle=payload?.notification?.title;notificationOptions={body:payload?.notification?.body,icon:this.clearUrl((payload?.notification?.icon)??(payload?.data?.icon)??null),image:this.clearUrl((payload?.notification?.image)??(payload?.data?.image)??null),requireInteraction:!0,tag:push?.id,data:{url:payload?.data?.onClick,push:payload?.data?.push}}}else if(payload?.data?.msgType=='notification'){notificationTitle=payload?.data?.title;notificationOptions={body:payload?.data?.body,icon:this.clearUrl((payload?.data?.icon)??(payload?.data?.icon)??null),image:this.clearUrl((payload?.data?.image)??(payload?.data?.image)??null),requireInteraction:!0,tag:push?.id,data:{url:payload?.data?.onClick,push:payload?.data?.push}}}else if(payload?.data?.msgType.startsWith('provider_')&&payload?.data?.provider_config!==''&&payload?.data?.provider_config!==null){const config={...JSON.parse(payload?.data?.provider_config),...{push:push}};const provider=config?.type?config.type:payload?.data?.msgType.split('_')[1];var serviceProvider=null;switch(provider.toLowerCase()){case 'taboola':serviceProvider=new PushloopTaboola(config);break;case 'pushub':serviceProvider=new PushloopPushub(config);break}
if(serviceProvider){const push=await serviceProvider.getPush();if(push){notificationTitle=push.title;notificationOptions=push.options;notificationOptions.data={...push.options.data,...payload?.data}}}}
if(notificationTitle&&notificationOptions){if(notificationTitle!=="undefined"&&notificationTitle!==undefined&&typeof notificationTitle!=="undefined"){await self.registration.showNotification(notificationTitle,notificationOptions);self.sendImpression({...payload.data,...{push:push},...{provider_pixel:notificationOptions?.data?.provider_pixel?notificationOptions?.data?.provider_pixel:null},...{available:notificationOptions?.data?.available?notificationOptions?.data?.available:null}});let notifications=await self.registration.getNotifications({tag:push?.id});if(notifications.length<1){self.logger.error("Notification not showed!",{token:await self.getToken()})}}else{self.logger.error("Notification with undefined title!",{token:await self.getToken(),payload:payload})}}else{await self.registration.showNotification('',{tag:"to-close"});setTimeout(async function(){let notifications=await self.registration.getNotifications({tag:"to-close"});for(var noti of notifications){noti.close()}},0)}}else{self.logger.info("NOTIFICA DUPLICATA FRONT");console.log("NOTIFICA DUPLICATA FRONT")}}catch(e){this.logger.error("Error on [onMessage] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()});console.log(e)}}
clearUrl=(url)=>{try{return encodeURI(url.trim())}catch(e){return url}}
checkToken=(currentToken,callback)=>{try{const self=this;navigator.serviceWorker.register(self.serviceWorkerPath).then((registration)=>{registration.active.postMessage({command:'checkToken'})}).catch((error)=>{self.logger.error("Error to send message to Service Worker from FrontJS",{error:String(error)})})}catch(e){this.logger.error("Error on [checkToken] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()});console.log(e)}}
updateToken=()=>{try{const self=this;navigator.serviceWorker.register(self.serviceWorkerPath).then((registration)=>{registration.active.postMessage({command:'updateToken'})}).catch((error)=>{self.logger.error("Error to send message to Service Worker from FrontJS",{error:String(error)})})}catch(e){this.logger.error("Error on [updateToken] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()});console.log(e)}}
sendTokenToServer=(old_token,new_token,callback)=>{try{const self=this;const site_origin_id=self.getSiteOriginId();window.dataLayer=window.dataLayer||[];window.dataLayer.push({'event':'registrationComplete','domain':'oroscopissimiit','market':'ALL','lang':'ALL','tipologia':'push_project'});console.log('Sending token to server... FrontJS');console.log('Token: '+old_token);if(!new_token){new_token=old_token}else{console.log('New Token: '+new_token)}
let userLang=navigator.language||navigator.userLanguage;let lang=userLang.substring(0,2).toUpperCase();let sc=window.location.href.split('?')[0];const data={date:new Date(),lang:lang,market:'ALL',domain:'oroscopissimiit',source:sc,token:new_token,oldToken:old_token,};if(site_origin_id){data.site_origin_id=site_origin_id}
self.saveInIndexDB(self.indexDBname,self.indexDBtableName,data).then(()=>{var form_data=new FormData();form_data.append('new_tok',new_token);form_data.append('curr_tok',old_token);form_data.append('app_id',self.firebaseConfig.projectId);form_data.append('lang',lang);form_data.append('market','ALL');form_data.append('domain','oroscopissimiit');form_data.append('source',sc);form_data.append('sw_version',self.sw_version);form_data.append('from','FrontJs');if(site_origin_id){form_data.append('site_origin_id',site_origin_id)}
self.saveToken(new URLSearchParams(form_data));if(callback&&typeof callback==='function'){callback()}}).catch((error)=>{self.logger.error("Error on [saveInIndexDB] catch",{error:error})})}catch(e){this.logger.error("Error on [sendTokenToServer] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()});console.log(e)}}
getSiteOriginId=()=>{try{const site_origin_id_param=this.getUrlParameter('site_origin_id');const hasValidIdOrigin=site_origin_id_param&&!isNaN(site_origin_id_param);return hasValidIdOrigin?parseInt(site_origin_id_param):null}catch(e){this.logger.error("Error on [getSiteOriginId] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()});return null}}
saveInIndexDB=(dbName,storeName,data)=>{const self=this;try{return new Promise((resolve,reject)=>{try{const request=indexedDB.open(dbName,self.indexDBVersion);request.onupgradeneeded=function(event){const db=event.target.result;for(var tab of self.db_tables){if(!db.objectStoreNames.contains(tab)){db.createObjectStore(tab)}}};request.onsuccess=function(event){const db=event.target.result;const transaction=db.transaction([storeName],'readwrite');const objectStore=transaction.objectStore(storeName);console.log(data);const requestPut=objectStore.put(data,0);requestPut.onerror=function(event){console.error('Errore durante il salvataggio del dato in IndexedDB:',event.target.error);reject(event.target.error)};transaction.oncomplete=function(event){resolve()}};request.onerror=function(event){console.error('Errore durante l\'apertura del database IndexedDB:',event.target.error);reject(event.target.error)}}catch(e){self.logger.error("Error on [saveInIndexDB] promise",{error_stack:JSON.stringify(e.stack),error_message:e.toString()})}})}catch(e){self.logger.error("Error on [saveInIndexDB] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()})}}
getDataFromIndexDB=(dbName,storeName)=>{const self=this;try{return new Promise((resolve,reject)=>{try{const request=indexedDB.open(dbName,self.indexDBVersion);request.onupgradeneeded=function(event){const db=event.target.result;for(var tab of self.db_tables){if(!db.objectStoreNames.contains(tab)){db.createObjectStore(tab)}}};request.onsuccess=function(event){const db=event.target.result;const transaction=db.transaction([storeName],'readwrite');const objectStore=transaction.objectStore(storeName);const getRequest=objectStore.get(0);getRequest.onsuccess=function(event){const data=event.target.result;if(data){resolve(data)}else{console.log('No data from IndexedDB');resolve(null)}};getRequest.onerror=function(event){console.error('Error retrieving data from IndexedDB:',event.target.error);reject(event.target.error)}};request.onerror=function(event){console.error('Error opening IndexedDB:',event.target.error);reject(event.target.error)}}catch(e){self.logger.error("Error on [getDataFromIndexDB] promise",{error_stack:JSON.stringify(e.stack),error_message:e.toString()})}})}catch(e){self.logger.error("Error on [getDataFromIndexDB] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()})}}
clearStoreInIndexDB=(dbName,storeName)=>{const request=indexedDB.open(dbName);request.onsuccess=function(event){const db=event.target.result;const transaction=db.transaction(storeName,'readwrite');const store=transaction.objectStore(storeName);const clearRequest=store.clear();clearRequest.onsuccess=function(){console.log('Store cleaned')};clearRequest.onerror=function(){console.error(`Error cleaning data from "${storeName}"`)};transaction.oncomplete=function(){return!0}};request.onerror=function(event){console.error(`Error opening IndexedDB: "${dbName}".`,event.target.error)}}
isDuplicateNotification=async(id)=>{const self=this;try{if(id&&id!=''){let notifications=await self.registration.getNotifications({tag:id});return notifications.length>0}}catch(e){console.error(e);self.logger.error("Error on [isDuplucateNotification] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()})}
return!1}
getCookie=(name)=>{try{var nameEQ=name+'=';var ca=document.cookie.split(';');for(var i=0;i<ca.length;i++){var c=ca[i];while(c.charAt(0)==' ')c=c.substring(1,c.length);if(c.indexOf(nameEQ)==0)return c.substring(nameEQ.length,c.length);}
return null}catch(e){this.logger.error("Error on [getCookie] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()});return null}}
setCookie=(name,value,days)=>{try{const self=this;var expires='';if(days){var date=new Date();date.setTime(date.getTime()+(days*24*60*60*1000));expires='; expires='+date.toUTCString()}
document.cookie=name+'='+(value||'')+expires+'; path=/';var cookieValue=self.getCookie(name);if(cookieValue!==value){console.error('Set cookie ERROR')}
document.cookie=name+'='+(value||'')+expires+'; path=/'}catch(e){this.logger.error("Error on [setCookie] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()});console.log(e)}}
deleteCookie=(name)=>{document.cookie=name+'=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;'}
getToken=async(callback)=>{const self=this;try{navigator.serviceWorker.register(self.serviceWorkerPath).then((registration)=>{registration.active.postMessage({command:'getToken',callback:callback})}).catch((error)=>{self.logger.error("Error to send message to Service Worker from FrontJS",{error:String(error)})})}catch(e){console.error('Fail to get Token',e);this.logger.error("Error on [getToken] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()});return null}}
RequestPermission=()=>{const self=this;try{var cookieDeny=this.getCookie(this.cookieName);const cookieHideCustomPopup=parseInt(this.getCookie(this.cookieNameHideCustomPopup));if(this.checkNotificationPermission('granted')&&(cookieDeny===undefined||cookieDeny===null)){self.registerServiceWorker();if(!0){var BellUpPL=document.createElement('div');BellUpPL.setAttribute('id','BellPl');document.body.appendChild(BellUpPL);document.getElementById('BellPl').innerHTML=`
                    <div class='bell-modal'>
                        <img onclick='PushloopSw.openModalPush()' src='https://cdn.pushloop.io/dist/img/logomark_pushloop.svg' />
                        <a href='javascript:void(0);' id='bellLinkPL' onclick='PushloopSw.PushloopDenyPush()'>
                            SMETTI DI SEGUIRCI
                        </a>
                    </div>`}}else if(this.checkNotificationPermission('granted')&&cookieDeny==1){var BellUpPL=document.createElement('div');BellUpPL.setAttribute('id','BellPl');document.body.appendChild(BellUpPL);document.getElementById('BellPl').innerHTML=`
                <div class='bell-modal'>
                    <img onclick='PushloopSw.openModalPush()' src='https://cdn.pushloop.io/dist/img/logomark_pushloop.svg' />
                    <a href='javascript:void(0);' id='bellLinkPL' onclick='PushloopSw.PushloopReactivePush()'>
                        RIMANI AGGIORNATO
                    </a>
                </div>`}else if(this.checkNotificationPermission('default')&&(cookieDeny===undefined||cookieDeny===null)&&(this.checkExpiredMinutes(cookieHideCustomPopup,this.customPopUpHideMinutesDelay))){self.clearStoreInIndexDB(self.indexDBname,'token_data');self.clearStoreInIndexDB(self.indexDBname,'pushloopReferences');var popUpPL=document.createElement('div');popUpPL.setAttribute('id','popUpPl');document.body.appendChild(popUpPL);document.getElementById('popUpPl').innerHTML=`
                    <div class='popup-modal'>
                        <img src='https://cdn.pushloop.io/dist/img/logomark_pushloop.svg' />
                        <p>
                            Vuoi essere sempre aggiornato sulle novità?
                        </p>
                        <span class='action-no'>
                            <a href='javascript:void(0);' id='plDenie' onclick='PushloopSw.PushloopDenyPush(); PushloopSw.hidePopUp()'>
                                NO Grazie...
                            </a>
                        </span>
                        <span class='action-yes'>
                            <a href='javascript:void(0);' id='plApprove' onclick='PushloopSw.openNotificationPopup(); PushloopSw.hidePopUp()'>
                                OK
                            </a>
                        </span>
                    </div>`}else if(this.checkNotificationPermission('denied')){console.log('Permission denied');self.unregisterSw()}}catch(e){this.logger.error("Error on [RequestPermission] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()});console.log(e)}}
hidePopUp=()=>{try{var element=document.getElementById('popUpPl');element.style.display='none';const currentTime=new Date().getTime();this.setCookie(this.cookieNameHideCustomPopup,String(currentTime),1)}catch(e){this.logger.error("Error on [hidePopUp] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()});console.log(e)}}
openModalPush=()=>{try{var element=document.getElementById('bellLinkPL');element.style.display='flex'}catch(e){this.logger.error("Error on [openModalPush] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()});console.log(e)}}
updateBellModal(newElement){try{const element=document.getElementById('bellLinkPL');if(element){element.parentNode.removeChild(element)}
const bellModal=document.querySelector('.bell-modal');if(bellModal){bellModal.innerHTML=newElement}}catch(e){this.logger.error("Error on [updateBellModal] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()});console.log(e)}}
PushloopDenyPush=()=>{try{const self=this;if(this.tpl!="tpl_0"){const newElement=`<a href='javascript:void(0);' id='bellLinkPL' onclick='PushloopSw.PushloopReactivePush()'>$RIMANI AGGIORNATO</a>`;this.updateBellModal(newElement)}
if(typeof element!=='undefined'&&element!==null){element.style.display='none'}
this.setCookie(this.cookieName,'1',365);navigator.serviceWorker.register(self.serviceWorkerPath).then((registration)=>{registration.active.postMessage({command:'deleteToken'})})}catch(e){this.logger.error("Error on [PushloopDenyPush] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()});console.log(e)}}
PushloopReactivePush=()=>{try{this.deleteCookie(this.cookieName);this.checkToken()
if(this.tpl!="tpl_0"){var element=document.getElementById('bellLinkPL');element.parentNode.removeChild(element);var bellModal=document.querySelector('.bell-modal');var newElement="<a href='javascript:void(0);' id='bellLinkPL' onclick='PushloopSw.PushloopDenyPush()'>SMETTI DI SEGUIRCI</a>";bellModal.innerHTML=bellModal.innerHTML+newElement;element.style.display='none'}}catch(e){this.logger.error("Error on [PushloopReactivePush] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()});console.log(e)}}
buttonTPLInvisibility=()=>{if(this.PushloopButton){this.PushloopButton.style.display='none'}}
openNotificationPopup=async()=>{try{const self=this;const permission=await window.Notification.requestPermission();if(permission==='granted'){this.registerServiceWorker()}else{console.log('Permission denied');self.unregisterSw()}}catch(e){console.error('Error requesting notification permission:',error);this.logger.error("Error on [openNotificationPopup] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()})}}
buttonFunction=()=>{try{var cookieDeny=this.getCookie(this.cookieName);const self=this;if(this.checkNotificationPermission('default')){this.openNotificationPopup()}else if(this.checkNotificationPermission('denied')){alert('You Have Denied Notification!');self.unregisterSw()}else{if(!cookieDeny){this.PushloopDenyPush();this.PushloopButton.disabled=!0}else{this.PushloopReactivePush()
this.PushloopButton.disabled=!0}}}catch(e){this.logger.error("Error on [buttonFunction] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()});console.log(e)}}
checkNameButton=()=>{var cookieDeny=this.getCookie(this.cookieName);const self=this;if(this.checkNotificationPermission('default')||this.checkNotificationPermission('denied')){this.PushloopButton.innerHTML='Iscriviti'
self.unregisterSw()}else{if(!cookieDeny){this.PushloopButton.innerHTML='Disiscriviti'}else{this.PushloopButton.innerHTML='Reiscriviti'}}}
registerSW=(registration)=>{try{if(this.registration==null){this.registration=registration;if(this.tpl=='tpl_0'){this.regFirebase();if(this.PushloopButton)
this.PushloopButton.addEventListener('click',this.buttonFunction.bind(this));}else{this.buttonTPLInvisibility();this.RequestPermission()}}}catch(e){this.logger.error("Error on [registerSW] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()});console.log(e)}}
regFirebase=()=>{try{const self=this;var cookieDeny=this.getCookie(this.cookieName);if(cookieDeny!=1){if(this.checkNotificationPermission('granted')){self.getToken().then((currentToken)=>{if(currentToken){self.checkToken(currentToken,null)}else{console.log('No registration token available. Request permission to generate one.')}}).catch((err)=>{self.logger.error('An error occurred while retrieving token',{error:err});console.log('An error occurred while retrieving token. ',err)})}else if(this.checkNotificationPermission('default')){self.openNotificationPopup()}}}catch(e){this.logger.error("Error on [regFirebase] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()});console.log(e)}}
sendDelivered=async(data)=>{try{const self=this;const payload={...data,...{token:await this.getToken(),script:"frontjs"}};payload.timestamp=new Date().toISOString();fetch(this.statsUrl+'/push-delivered',{method:'post',headers:{'Content-Type':'application/json;charset=UTF-8'},body:JSON.stringify(payload)}).catch((error)=>{console.log(error);self.logger.error('An error occurred while fetch sendDelivered',{error:error})})}catch(e){this.logger.error("Error on [sendDelivered] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()});console.log(e)}}
sendImpression=async(data)=>{try{const self=this;const payload={...data,...{token:await this.getToken(),script:"frontjs"}};payload.timestamp=new Date().toISOString();fetch(this.statsUrl+'/push-impression',{method:'post',headers:{'Content-Type':'application/json;charset=UTF-8'},body:JSON.stringify(payload)}).catch((error)=>{console.log(error);self.logger.error('An error occurred while fetch sendImpression',{error:error})});if(data?.provider_pixel!=null){fetch(data.provider_pixel,{method:'GET'})}
if(data?.available!=null){fetch(data.available,{method:'GET'})}}catch(e){this.logger.error("Error on [sendImpression] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()});console.log(e)}}
sendLastVisit=async(token)=>{try{const self=this;const payload={...{token:token,last_visit:new Date().toISOString()}};fetch(this.statsUrl+'/last-visit',{method:'post',headers:{'Content-Type':'application/json;charset=UTF-8'},body:JSON.stringify(payload)}).then((resp)=>resp.json()).then((data)=>{if(data.success&&data.data){self.saveInIndexDB(self.indexDBname,'token_data',data.data).catch((error)=>{self.logger.error("Fail to save token [sendLastVisit] indexDB",{error:error})});self.retry_count=0}else{if(self.retry_count<5){setTimeout(()=>{self.sendLastVisit(token)},5000);self.logger.error("Fail to save token [sendLastVisit] fetch response")}else{self.logger.error("Fail to save token [sendLastVisit] after 5 tries",{data:String(payload)});self.retry_count=0}}}).catch((error)=>{console.log(error);self.logger.error('An error occurred while fetch sendLastVisit',{error:error})})}catch(e){this.logger.error("Error on [sendLastVisit] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()});console.log(e)}}
saveToken=(payload)=>{const self=this;try{self.retry_count++;fetch(self.apiUrl+"/savetoken",{method:'post',headers:{'Content-Type':'application/x-www-form-urlencoded;charset=UTF-8'},body:payload,}).then((resp)=>resp.json()).then((data)=>{if(data.success&&data.data){self.saveInIndexDB(self.indexDBname,'token_data',data.data).catch((error)=>{self.logger.error("Fail to save token [sendTokenToServer] indexDB",{error:error})});self.retry_count=0}else{if(self.retry_count<5){setTimeout(()=>{self.saveToken(payload)},5000);self.logger.error("Fail to save token [sendTokenToServer] fetch response")}else{self.logger.error("Fail to save token [sendTokenToServer] after 5 tries",{data:String(payload)});self.retry_count=0}}}).catch((error)=>{if(self.retry_count<5){setTimeout(()=>{self.saveToken(payload)},5000);self.logger.error("Fail to save token [sendTokenToServer] fetch",{error:error.toString()})}else{self.logger.error("Fail to save token [sendTokenToServer] after 5 tries",{error:error.toString(),data:String(payload)});self.retry_count=0}})}catch(e){self.logger.error("Error on [saveToken] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()})}}
unregisterSw=()=>{const self=this;self.clearStoreInIndexDB(self.indexDBname,'token_data');self.clearStoreInIndexDB(self.indexDBname,'pushloopReferences');if(self.registration!=null){self.registration.unregister().then((success)=>{if(success){self.registration=null}else self.logger.error("Error while unregister service worker. Return false")}).catch((error)=>{self.logger.error("Error while unregister service worker",{error:error})})}}
getConfiguration=()=>{const self=this;return new Promise((resolve,reject)=>{self.getDataFromIndexDB(self.indexDBname,'configuration').then(async(config)=>{if(!config||config.sw_version!=self.sw_version){config=await self.updateConfiguration()}
resolve(config)}).catch(error=>{self.logger.error('Error retrieving data configuration from IndexedDB',{error:error});console.error('Error retrieving data configuration from IndexedDB:',error);resolve()})})}
updateConfiguration=()=>{const self=this;return new Promise((resolve,reject)=>{fetch(self.cdnUrl+"/api/v2/service-worker/firebase-conf.json?domain="+window.location.host,{method:'GET',headers:{'Content-Type':'application/json;charset=UTF-8'},}).then((resp)=>resp.json()).then(async(data)=>{if(data.success&&data.data){await self.saveInIndexDB(self.indexDBname,'configuration',data.data);resolve(data.data);self.retry_count=0}else{if(self.retry_count<5){setTimeout(()=>{self.updateConfiguration()},5000);self.logger.error("Fail to save configuration [updateConfiguration] fetch response")}else{self.logger.error("Fail to save configuration [updateConfiguration] after 5 tries");self.retry_count=0;reject("Fail to save configuration")}}}).catch((error)=>{if(self.retry_count<5){setTimeout(()=>{self.updateConfiguration()},5000);self.logger.error("Fail to save configuration [updateConfiguration] fetch",{error:error.toString()})}else{self.logger.error("Fail to save configuration [updateConfiguration] after 5 tries",{error:error.toString()});self.retry_count=0;reject("Fail to save configuration")}})})}
injectManifestLink=()=>{try{if(!document.querySelector('link[rel="manifest"]')){const manifestLink=document.createElement('link');manifestLink.rel='manifest';manifestLink.href='https://cdn.pushloop.io/code/manifest.json?domain='+window.location.host;document.head.appendChild(manifestLink);this.logger.info("Manifest link injected")}}catch(e){this.logger.error("Error injecting manifest link",{error_stack:JSON.stringify(e.stack),error_message:e.toString()})}}
checkAndPromptPWAInstall=()=>{try{if(!this.isIphone())return;const dismissedCookie=this.getCookie(this.cookieNamePwaBannerDismiss);if(dismissedCookie){const dismissedTime=parseInt(dismissedCookie);if(this.checkExpiredMinutes(dismissedTime,this.pwaBannerDismissMinutesDelay)){this.deleteCookie(this.cookieNamePwaBannerDismiss)}else{this.logger.info("PWA banner dismissed recently, will show again in X minutes");return}}
const doneCookie=this.getCookie(this.cookieNamePwaBannerHaveDone);if(doneCookie){const doneTime=parseInt(doneCookie);if(this.checkExpiredDays(doneTime,this.pwaBannerShowDaysDelay)){this.deleteCookie(this.cookieNamePwaBannerHaveDone)}else{this.logger.info("PWA banner  by 'have done' recently, will show again in X days");return}}
this.showPWAInstallBanner()}catch(e){console.error('Error on [checkAndPromptPWAInstall] function',e);this.logger.error("Error on [checkAndPromptPWAInstall] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()})}}
checkExpiredDays=(time,days)=>{if(!time||time===''||isNaN(time)){return!0}
const timeValue=typeof time==='string'?parseInt(time):time;if(isNaN(timeValue)||timeValue<=0){return!0}
const currentTime=new Date().getTime();const diff=currentTime-time;return diff>days*24*60*60*1000}
checkExpiredMinutes=(time,minutes)=>{if(!time||time===''||isNaN(time)){return!0}
const timeValue=typeof time==='string'?parseInt(time):time;if(isNaN(timeValue)||timeValue<=0){return!0}
const currentTime=new Date().getTime();const diff=currentTime-time;return diff>minutes*60*1000}
showPWAInstallBanner=()=>{try{const banner=document.createElement('div');banner.id='pwaInstallBanner';banner.innerHTML=`<div style="
    position: fixed; 
    bottom: 20px; 
    left: 50%; 
    transform: translateX(-50%);
    background: #fff; 
    border-radius: 16px; 
    padding: 0; 
    box-shadow: 0 10px 40px rgba(0,0,0,0.15); 
    z-index: 10000;
    max-width: 320px;
    width: 90%;
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
    overflow: hidden;
">
    <!-- Header con icona, titolo e pulsante chiudi -->
    <div style="
        display: flex; 
        align-items: center; 
        justify-content: space-between; 
        padding: 20px 24px 16px 24px;
        border-bottom: 1px solid #e5e5e5;
    ">
        <div style="display: flex; align-items: center; flex: 1;">
            <h3 style="margin: 0; font-size: 18px; font-weight: 600; color: #333;">Install App</h3>
        </div>
        <button onclick="PushloopSw.dismissPWABanner()" style="
            background: #f0f0f0; 
            border: none; 
            font-size: 16px; 
            color: #666; 
            cursor: pointer; 
            padding: 0;
            border-radius: 50%;
            width: 28px;
            height: 28px;
            display: flex;
            align-items: center;
            justify-content: center;
            margin-left: 12px;
            flex-shrink: 0;
        ">×</button>
    </div>
    
    <!-- Contenuto principale -->
    <div style="padding: 20px 24px 24px 24px;">
        <!-- Descrizione -->
        <p style="
            margin: 0 0 20px 0; 
            font-size: 14px; 
            color: #666; 
            line-height: 1.4;
        ">Install the app on your device to easily access it anytime. No app store. No download. No hassle.</p>
        
        <!-- Istruzioni per Safari/iOS -->
        <div style="margin-bottom: 20px;">
            <div style="display: flex; align-items: center; margin-bottom: 12px;">
                <span style="
                    background: #f8f8f8; 
                    border-radius: 12px; 
                    width: 20px; 
                    height: 20px; 
                    display: flex; 
                    align-items: center; 
                    justify-content: center; 
                    font-size: 12px; 
                    font-weight: 600; 
                    color: #666;
                    margin-right: 12px;
                    flex-shrink: 0;
                ">1</span>
                <span style="font-size: 14px; color: #333;">Tap on</span>
                <span style="
                    margin-left: 8px; 
                    font-size: 16px; 
                    background: #f0f0f0; 
                    padding: 4px 8px; 
                    border-radius: 6px;
                ">
                    <img 
                        src="https://cdn.pushloop.io/storage/icons/iphone-share-icon.png" 
                        style="width: 20px; height: 20px;" 
                        alt="Share Icon"
                    >
                </span>
            </div>
            <div style="display: flex; align-items: center;">
                <span style="
                    background: #f8f8f8; 
                    border-radius: 12px; 
                    width: 20px; 
                    height: 20px; 
                    display: flex; 
                    align-items: center; 
                    justify-content: center; 
                    font-size: 12px; 
                    font-weight: 600; 
                    color: #666;
                    margin-right: 12px;
                    flex-shrink: 0;
                ">2</span>
                <span style="font-size: 14px; color: #333;">Select</span>
                <span style="
                    margin-left: 8px; 
                    font-weight: 600; 
                    color: #333;
                ">Add to Home Screen</span>
            </div>
        </div>

        <button onclick="PushloopSw.installPWADone()" style="
            width: 100%; 
            background: #007AFF; 
            color: white; 
            border: none; 
            padding: 12px 16px; 
            border-radius: 8px; 
            font-size: 16px; 
            font-weight: 600; 
            cursor: pointer;
            display: block;
        " id="pwaInstallDoneButton">I have done this</button>

        

    </div>
</div> `;document.body.appendChild(banner);this.logger.info("PWA install banner shown")}catch(e){this.logger.error("Error showing PWA banner",{error_stack:JSON.stringify(e.stack),error_message:e.toString()})}}
isStandaloneApp=()=>{return window.matchMedia?.('(display-mode: standalone)').matches||window.navigator.standalone===!0}
isMac=()=>{const platform=navigator.platform.toLowerCase();const userAgent=navigator.userAgent.toLowerCase();return platform.includes('mac')||userAgent.includes('macintosh')}
isIphone=()=>/iPhone/i.test(navigator.userAgent);installPWA=async()=>{try{if(!this.deferredPrompt)return;this.deferredPrompt.prompt();const{outcome}=await this.deferredPrompt.userChoice;this.logger.info("PWA install prompt result",{outcome:outcome});this.deferredPrompt=null;this.dismissPWABanner()}catch(e){this.logger.error("Error on [installPWA] function",{error_stack:JSON.stringify(e.stack),error_message:e.toString()})}}
installPWADone=()=>{this.dismissPWABanner();this.logger.info("PWA install done");const currentTime=new Date().getTime();this.setCookie(this.cookieNamePwaBannerHaveDone,String(currentTime),14)}
dismissPWABanner=()=>{const currentTime=new Date().getTime();this.setCookie(this.cookieNamePwaBannerDismiss,String(currentTime),1);const banner=document.getElementById('pwaInstallBanner');if(banner){banner.remove()}}
checkNotificationPermission=(permission)=>{if('Notification' in window&&window.Notification.permission===permission){return!0}
return!1}}
try{if((!navigator.userAgent.includes("Chrome")||navigator.userAgent.includes("Edg"))&&'tpl_0'=='tpl_0'){window.PushloopSw=new Pushloop('tpl_1')}else{window.PushloopSw=new Pushloop('tpl_0')}
if(this.PushloopButton)
PushloopSw.checkNameButton();}catch(e){const logger=new Logger('FrontJs',4.55);logger.error("Fail to initilize Pushloop",{error_stack:JSON.stringify(e.stack),error_message:e.toString()})}