single-file-extension-background.js 85 KB

1
  1. !function(){"use strict";const e="complete",t="interrupted",a="USER_CANCELED",n="canceled",o="conflictaction prompt not yet implemented",r="'incognito'",i='"incognito"',s="illegal characters",c="invalid filename";async function l(u,d){let f;try{f=await browser.downloads.download(u)}catch(e){if(e.message){const t=e.message.toLowerCase(),a=t.includes(s)||t.includes(c);if(a&&u.filename.startsWith("."))return u.filename=d+u.filename,l(u,d);if(a&&u.filename.includes(","))return u.filename=u.filename.replace(/,/g,d),l(u,d);if(a&&u.filename.match(/\u200C|\u200D|\u200E|\u200F/))return u.filename=u.filename.replace(/\u200C|\u200D|\u200E|\u200F/g,d),l(u,d);if(a&&!u.filename.match(/^[\x00-\x7F]+$/))return u.filename=u.filename.replace(/[^\x00-\x7F]+/g,d),l(u,d);if((t.includes(r)||t.includes(i))&&u.incognito)return delete u.incognito,l(u,d);if(t==o&&u.conflictAction)return delete u.conflictAction,l(u,d);if(t.includes(n))return{};throw e}throw e}return new Promise(((n,o)=>{browser.downloads.onChanged.addListener((function r(i){i.id==f&&i.state&&(i.state.current==e&&(browser.downloads.search({id:f}).then((e=>n({filename:e[0]&&e[0].filename}))).catch((()=>n({}))),browser.downloads.onChanged.removeListener(r)),i.state.current==t&&(i.error&&i.error.current==a?n({}):o(new Error(i.state.current)),browser.downloads.onChanged.removeListener(r)))}))}))}let u,d,f;async function h(e,t,a){e[a]&&!e[t]&&(e[t]=e[a],delete e[a])}async function w(e){d&&delete d[e];const t=await p();if(t[e]){const a=t[e].autoSave;t[e]={autoSave:a},await b(t)}}function m(e){return d||(d={}),void 0===e||d[e]||(d[e]={}),d}async function p(e){if(!u){const e=await browser.storage.local.get();u=e.tabsData||{}}return async function(){if(!f){f=!0;const e=await browser.tabs.query({currentWindow:!0,highlighted:!0});Object.keys(u).filter((t=>{if("autoSaveAll"!=t&&"autoSaveUnpinned"!=t&&"profileName"!=t)return!e.find((e=>e.id==t))})).forEach((e=>delete u[e])),await browser.storage.local.set({tabsData:u})}}(),void 0===e||u[e]||(u[e]={}),u}async function b(e){u=e,await browser.storage.local.set({tabsData:e})}setTimeout((()=>p().then((e=>u=e))),0);const g="-",y="__Default_Settings__",v="__Disabled_Settings__",k="regexp:",A="profile_",x=!/Safari/.test(navigator.userAgent)||/Chrome/.test(navigator.userAgent)||/Vivaldi/.test(navigator.userAgent)||/OPR/.test(navigator.userAgent),I=!(/Mobile.*Firefox/.test(navigator.userAgent)||/Safari/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)&&!/Vivaldi/.test(navigator.userAgent)&&!/OPR/.test(navigator.userAgent)),T=x,S=x,C=x,E=x,P=x,D=x,U=x,R=x,W=x,_=x,L={removeHiddenElements:!0,removeUnusedStyles:!0,removeUnusedFonts:!0,removeFrames:!1,compressHTML:!0,compressCSS:!1,loadDeferredImages:!0,loadDeferredImagesMaxIdleTime:1500,loadDeferredImagesBlockCookies:!1,loadDeferredImagesBlockStorage:!1,loadDeferredImagesKeepZoomLevel:!1,loadDeferredImagesDispatchScrollEvent:!1,loadDeferredImagesBeforeFrames:!1,filenameTemplate:"%if-empty<{page-title}|No title> ({date-locale} {time-locale}).{filename-extension}",infobarTemplate:"",includeInfobar:!x,confirmInfobarContent:!1,autoClose:!1,confirmFilename:!1,filenameConflictAction:"uniquify",filenameMaxLength:192,filenameMaxLengthUnit:"bytes",filenameReplacedCharacters:["~","+","\\\\","?","%","*",":","|",'"',"<",">","\0-",""],filenameReplacementCharacter:"_",replaceEmojisInFilename:!1,saveFilenameTemplateData:!1,contextMenuEnabled:!0,tabMenuEnabled:!0,browserActionMenuEnabled:!0,shadowEnabled:!0,logsEnabled:!0,progressBarEnabled:!0,maxResourceSizeEnabled:!1,maxResourceSize:10,displayInfobar:!0,displayStats:!1,backgroundSave:I,defaultEditorMode:"normal",applySystemTheme:!0,autoSaveDelay:1,autoSaveLoad:!1,autoSaveUnload:!1,autoSaveLoadOrUnload:!0,autoSaveDiscard:!1,autoSaveRemove:!1,autoSaveRepeat:!1,autoSaveRepeatDelay:10,removeAlternativeFonts:!0,removeAlternativeMedias:!0,removeAlternativeImages:!0,groupDuplicateImages:!0,maxSizeDuplicateImages:524288,saveRawPage:!1,saveToClipboard:!1,addProof:!1,saveToGDrive:!1,saveToDropbox:!1,saveWithWebDAV:!1,webDAVURL:"",webDAVUser:"",webDAVPassword:"",saveToGitHub:!1,githubToken:"",githubUser:"",githubRepository:"SingleFile-Archives",githubBranch:"main",saveWithCompanion:!1,forceWebAuthFlow:!1,resolveFragmentIdentifierURLs:!1,userScriptEnabled:!1,openEditor:!1,openSavedPage:!1,autoOpenEditor:!1,saveCreatedBookmarks:!1,allowedBookmarkFolders:[],ignoredBookmarkFolders:[],replaceBookmarkURL:!0,saveFavicon:!0,includeBOM:!1,warnUnsavedPage:!0,displayInfobarInEditor:!1,compressContent:!1,createRootDirectory:!1,selfExtractingArchive:!0,extractDataFromPage:!0,preventAppendedData:!1,insertTextBody:!1,autoSaveExternalSave:!1,insertMetaNoIndex:!1,insertMetaCSP:!0,passReferrerOnError:!1,password:"",insertSingleFileComment:!0,removeSavedDate:!1,blockMixedContent:!1,saveOriginalURLs:!1,acceptHeaders:{font:"application/font-woff2;q=1.0,application/font-woff;q=0.9,*/*;q=0.8",image:"image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8",stylesheet:"text/css,*/*;q=0.1",script:"*/*",document:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",video:"video/webm,video/ogg,video/*;q=0.9,application/ogg;q=0.7,audio/*;q=0.6,*/*;q=0.5",audio:"audio/webm,audio/ogg,audio/wav,audio/*;q=0.9,application/ogg;q=0.7,video/*;q=0.6,*/*;q=0.5"},moveStylesInHead:!1,networkTimeout:0,woleetKey:"",blockImages:!1,blockStylesheets:!1,blockFonts:!1,blockScripts:!0,blockVideos:!0,blockAudios:!0,_migratedTemplateFormat:!0},O=[{url:"file:",profile:"__Default_Settings__",autoSaveProfile:"__Disabled_Settings__"}],B={"page-title":"No title","page-heading":"No heading","page-language":"No language","page-description":"No description","page-author":"No author","page-creator":"No creator","page-publisher":"No publisher","url-hash":"No hash","url-host":"No host","url-hostname":"No hostname","url-href":"No href","url-href-digest-sha-1":"No hash","url-href-flat":"No href","url-referrer":"No referrer","url-referrer-flat":"No referrer","url-password":"No password","url-pathname":"No pathname","url-pathname-flat":"No pathname","url-port":"No port","url-protocol":"No protocol","url-search":"No search","url-username":"No username","tab-id":"No tab id","tab-index":"No tab index","url-last-segment":"No last segment"};let M,N=F();async function F(){const{sync:e}=await browser.storage.local.get();M=e?browser.storage.sync:browser.storage.local;const t=await M.get();if(t[A+y])t.profiles&&await M.remove(["profiles"]);else if(t.profiles){const e=Object.keys(t.profiles);for(const a of e)await Z(a,t.profiles[a])}else await Z(y,L);t.rules||await M.set({rules:O}),t.maxParallelWorkers||await M.set({maxParallelWorkers:navigator.hardwareConcurrency||4}),t.processInForeground||await M.set({processInForeground:!1});(await K()).map((async e=>{const t=await X(e);t._migratedTemplateFormat||(t.filenameTemplate=function(e){try{return Object.keys(B).forEach((t=>{const a=B[t];e=e.replaceAll(`{${t}}`,`%if-empty<{${t}}|${a}>`)})),e}catch(e){}}(t.filenameTemplate),t._migratedTemplateFormat=!0);for(const e of Object.keys(L))void 0===t[e]&&(t[e]=L[e]);await Z(e,t)}))}async function j(e,t){const{rules:a}=await M.get(["rules"]),n=a.filter((e=>H(e)));let o=n.sort(z).find((t=>e&&e.match(new RegExp(t.url.split(k)[1]))));if(!o){const n=a.filter((e=>!H(e)));o=n.sort(z).find((a=>!t&&"*"==a.url||e&&e.includes(a.url)))}return o}async function q(){await N;const{maxParallelWorkers:e,processInForeground:t}=await M.get(["maxParallelWorkers","processInForeground"]),a=await $();return{profiles:await G(),rules:a,maxParallelWorkers:e,processInForeground:t}}function z(e,t){return t.url.length-e.url.length}function H(e){return e.url.toLowerCase().startsWith(k)}async function V(e){if(e.method.endsWith(".deleteRules")&&await async function(e){const t=await $();await M.set({rules:e?t.filter((t=>t.autoSaveProfile!=e&&t.profile!=e)):[]})}(e.profileName),e.method.endsWith(".deleteRule")&&await async function(e){if(!e)throw new Error("URL is empty");const t=await $();await M.set({rules:t.filter((t=>t.url!=e))})}(e.url),e.method.endsWith(".addRule")&&await Q(e.url,e.profileName,e.autoSaveProfileName),e.method.endsWith(".createProfile")&&await async function(e,t){if((await K()).includes(e))throw new Error("Duplicate profile name");const a=await X(t),n=JSON.parse(JSON.stringify(a));await Z(e,n)}(e.profileName,e.fromProfileName||y),e.method.endsWith(".renameProfile")&&await async function(e,t){const a=await K(),n=await p(),o=await $();if(!a.includes(e))throw new Error("Profile not found");if(a.includes(t))throw new Error("Duplicate profile name");if(e==y)throw new Error("Default settings cannot be renamed");n.profileName==e&&(n.profileName=t,await b(n));o.forEach((a=>{a.profile==e&&(a.profile=t),a.autoSaveProfile==e&&(a.autoSaveProfile=t)}));const r=await X(e);await M.remove([A+e]),await M.set({[A+t]:r,rules:o})}(e.profileName,e.newProfileName),e.method.endsWith(".deleteProfile")&&await async function(e){const t=await K(),a=await p(),n=await $();if(!t.includes(e))throw new Error("Profile not found");if(e==y)throw new Error("Default settings cannot be deleted");a.profileName==e&&(delete a.profileName,await b(a));n.forEach((t=>{t.profile==e&&(t.profile=y),t.autoSaveProfile==e&&(t.autoSaveProfile=y)})),M.remove([A+e]),await M.set({rules:n})}(e.profileName),e.method.endsWith(".resetProfiles")&&await async function(){await N;const e=await p();delete e.profileName,await b(e);let t=await Y();await M.remove([...t,"rules","maxParallelWorkers","processInForeground"]),await F()}(),e.method.endsWith(".resetProfile")&&await async function(e){if(!(await K()).includes(e))throw new Error("Profile not found");await Z(e,L)}(e.profileName),e.method.endsWith(".importConfig")&&await async function(e){const t=await K(),a=await Y(),n=await p();t.includes(n.profileName)&&(delete n.profileName,await b(n));await M.remove([...a,"rules","maxParallelWorkers","processInForeground"]);const o={rules:e.rules,maxParallelWorkers:e.maxParallelWorkers,processInForeground:e.processInForeground};Object.keys(e.profiles).forEach((t=>o[A+t]=e.profiles[t])),await M.set(o),await F()}(e.config),e.method.endsWith(".updateProfile")&&await async function(e,t){if(!(await K()).includes(e))throw new Error("Profile not found");const a=await X(e);Object.keys(a).forEach((e=>{t[e]=void 0===t[e]?a[e]:t[e]})),await Z(e,t)}(e.profileName,e.profile),e.method.endsWith(".updateRule")&&await ee(e.url,e.newUrl,e.profileName,e.autoSaveProfileName),e.method.endsWith(".getConstants"))return{DISABLED_PROFILE_NAME:v,DEFAULT_PROFILE_NAME:y,CURRENT_PROFILE_NAME:g,BACKGROUND_SAVE_SUPPORTED:I,BADGE_COLOR_SUPPORTED:T,AUTO_SAVE_SUPPORTED:S,SELECTABLE_TABS_SUPPORTED:C,AUTO_OPEN_EDITOR_SUPPORTED:E,INFOBAR_SUPPORTED:P,BOOKMARKS_API_SUPPORTED:D,IDENTITY_API_SUPPORTED:U,CLIPBOARD_API_SUPPORTED:R,NATIVE_API_API_SUPPORTED:W,WEB_BLOCKING_API_SUPPORTED:_};if(e.method.endsWith(".getRules"))return $();if(e.method.endsWith(".getProfiles"))return G();if(e.method.endsWith(".exportConfig"))return async function(){const e=await q(),t=JSON.stringify({profiles:e.profiles,rules:e.rules,maxParallelWorkers:e.maxParallelWorkers,processInForeground:e.processInForeground},null,2),a=`singlefile-settings-${(new Date).toISOString().replace(/:/g,"_")}.json`;if(x){const e=URL.createObjectURL(new Blob([t],{type:"text/json"}));try{await l({url:e,filename:a,saveAs:!0},"_")}finally{URL.revokeObjectURL(e)}return{}}return{filename:a,textContent:t}}();if(e.method.endsWith(".enableSync")){await browser.storage.local.set({sync:!0});const e=await browser.storage.sync.get();if(!e||!e.rules){const e=await Y(),t=await browser.storage.local.get(["rules","maxParallelWorkers","processInForeground",...e]);await browser.storage.sync.set(t)}return M=browser.storage.sync,await F(),{}}if(e.method.endsWith(".disableSync")){await browser.storage.local.set({sync:!1});const e=await browser.storage.sync.get(),t=await browser.storage.local.get();if(e&&e.rules&&(!t||!t.rules)){await browser.storage.local.set({rules:e.rules,maxParallelWorkers:e.maxParallelWorkers,processInForeground:e.processInForeground});const t={};await browser.storage.local.set(t)}return M=browser.storage.local,await F(),{}}return e.method.endsWith(".isSync")?{sync:(await browser.storage.local.get()).sync}:{}}async function G(){await N;const e=await Y(),t=await M.get(e),a={};return Object.keys(t).forEach((e=>a[e.substring(A.length)]=t[e])),a}async function J(e,t){await N;const[a,n]=await Promise.all([j(e),p()]),o=n.profileName||y;let r;if(a){const e=a[t?"autoSaveProfile":"profile"];r=e==g?o:e}else r=o;const i=await X(r);return Object.assign({profileName:r},i)}async function $(){return(await M.get(["rules"])).rules}async function K(){return Object.keys(await M.get()).filter((e=>e.startsWith(A))).map((e=>e.substring(A.length)))}async function Y(){return Object.keys(await M.get()).filter((e=>e.startsWith(A)))}async function X(e){const t=A+e;return(await M.get([t]))[t]}async function Z(e,t){const a=A+e;await M.set({[a]:t})}async function Q(e,t,a){if(!e)throw new Error("URL is empty");const n=await $();if(n.find((t=>t.url==e)))throw new Error("URL already exists");n.push({url:e,profile:t,autoSaveProfile:a}),await M.set({rules:n})}async function ee(e,t,a,n){if(!e||!t)throw new Error("URL is empty");const o=await $(),r=o.find((t=>t.url==e));if(!r)throw new Error("URL not found");if(o.find((a=>a.url==t&&a.url!=e)))throw new Error("New URL already exists");r.url=t,r.profile=a,r.autoSaveProfile=n,await M.set({rules:o})}async function te(){return(await M.get()).authInfo}async function ae(){return(await M.get()).dropboxAuthInfo}async function ne(e){await M.set({authInfo:e})}async function oe(e){await M.set({dropboxAuthInfo:e})}async function re(){let e=te();e.revokableAccessToken?ne({revokableAccessToken:e.revokableAccessToken}):await M.remove(["authInfo"])}async function ie(){let e=ae();e.revokableAccessToken?oe({revokableAccessToken:e.revokableAccessToken}):await M.remove(["dropboxAuthInfo"])}async function se(e){if(e){const[t,a]=await Promise.all([p(),j(e.url)]);return Boolean(t.autoSaveAll||t.autoSaveUnpinned&&!e.pinned||t[e.id]&&t[e.id].autoSave)&&(!a||a.autoSaveProfile!=v)}}const ce=33554432,le="/src/ui/pages/editor.html",ue=new Map,de=new Map,fe=browser.runtime.getURL(le);async function he({tabIndex:e,content:t,filename:a,compressContent:n,selfExtractingArchive:o,extractDataFromPage:r,insertTextBody:i}){const s={active:!0,url:le};null!=e&&(s.index=e);const c=await browser.tabs.create(s);ue.set(c.id,{content:t,filename:a,compressContent:n,selfExtractingArchive:o,extractDataFromPage:r,insertTextBody:i})}function we(e){return e.url==fe}const me=new Map,pe="x-single-file-request-id",be=8388608;async function ge(e,t,a){for(let n=0;n*be<=a.array.length;n++){const o={method:"singlefile.fetchResponse",requestId:t,headers:a.headers,status:a.status,error:a.error};o.truncated=a.array.length>be,o.truncated?(o.finished=(n+1)*be>a.array.length,o.array=a.array.slice(n*be,(n+1)*be)):o.array=a.array,await browser.tabs.sendMessage(e,o)}return{}}function ye(e,t={},a){return new Promise(((n,o)=>{const r=new XMLHttpRequest;if(r.withCredentials=!0,r.responseType="arraybuffer",r.onerror=e=>o(new Error(e.detail)),r.onreadystatechange=()=>{r.readyState==XMLHttpRequest.DONE&&(r.status||r.response.byteLength?401!=r.status&&403!=r.status&&404!=r.status||a?n({arrayBuffer:r.response,array:Array.from(new Uint8Array(r.response)),headers:{"content-type":r.getResponseHeader("Content-Type")},status:r.status}):ye(e,t,!0).then(n).catch(o):o(new Error("Empty response")))},r.open("GET",e,!0),t.headers)for(const e of Object.entries(t.headers))r.setRequestHeader(e[0],e[1]);if(a){const e=String(Math.random()).substring(2);!function(e,t){me.set(e,t)}(e,t.referrer),r.setRequestHeader(pe,e)}r.send()}))}browser.runtime.onMessage.addListener(((e,t)=>{if(e.method&&e.method.startsWith("singlefile.fetch"))return new Promise((a=>{(async function(e,t){if("singlefile.fetch"==e.method)try{const a=await ye(e.url,{referrer:e.referrer,headers:e.headers});return ge(t.tab.id,e.requestId,a)}catch(a){return ge(t.tab.id,e.requestId,{error:a.message,arrray:[]})}else if("singlefile.fetchFrame"==e.method)return browser.tabs.sendMessage(t.tab.id,e)})(e,t).then(a).catch((e=>a({error:e&&e.toString()})))}))}));let ve=!1;function ke(e){return e.method.endsWith(".enableReferrerOnError")?(xe(),{}):e.method.endsWith(".disableReferrerOnError")?(function(){try{browser.webRequest.onBeforeSendHeaders.removeListener(Ae)}catch(e){}ve=!1}(),{}):void 0}function Ae(e){if(ve){let t=e.requestHeaders.find((e=>e.name===pe));if(t){e.requestHeaders=e.requestHeaders.filter((e=>e.name!==pe));const a=me.get(t.value);if(a){me.delete(t.value);if(!e.requestHeaders.find((e=>"referer"===e.name.toLowerCase())))return e.requestHeaders.push({name:"Referer",value:a}),{requestHeaders:e.requestHeaders}}}}}function xe(){if(!ve){try{browser.webRequest.onBeforeSendHeaders.addListener(Ae,{urls:["<all_urls>"]},["blocking","requestHeaders","extraHeaders"])}catch(e){browser.webRequest.onBeforeSendHeaders.addListener(Ae,{urls:["<all_urls>"]},["blocking","requestHeaders"])}ve=!0}}async function Ie(e){return(await browser.tabs.query(e)).sort(((e,t)=>e.index-t.index))}function Te(e){return new Promise(((t,a)=>{browser.tabs.onUpdated.addListener((function n(o,r){if(r&&r.url&&r.url.startsWith(e)){browser.tabs.onUpdated.removeListener(n);const e=new URLSearchParams(new URL(r.url).search).get("code");e?(browser.tabs.remove(o),t(e)):a()}}))}))}async function Se(e){const t=await browser.tabs.create({url:e.url,active:!0});return new Promise(((e,a)=>{browser.tabs.onRemoved.addListener((function e(n){n==t.id&&(browser.tabs.onRemoved.removeListener(e),a(new Error("code_required")))}))}))}const Ce="/src/ui/resources/icon_128.png",Ee="/src/ui/resources/icon_128_wait",Pe=browser.i18n.getMessage("buttonDefaultTooltip"),De=browser.i18n.getMessage("buttonBlockedTooltip"),Ue=browser.i18n.getMessage("buttonInitializingBadge"),Re=browser.i18n.getMessage("buttonInitializingTooltip"),We=browser.i18n.getMessage("buttonErrorBadge"),_e=browser.i18n.getMessage("buttonBlockedBadge"),Le=browser.i18n.getMessage("buttonOKBadge"),Oe=browser.i18n.getMessage("buttonSaveProgressTooltip"),Be=browser.i18n.getMessage("buttonUploadProgressTooltip"),Me=browser.i18n.getMessage("buttonAutoSaveActiveBadge"),Ne=browser.i18n.getMessage("buttonAutoSaveActiveTooltip"),Fe=[2,147,20,192],je=[4,229,36,192],qe=1,ze={default:{setBadgeBackgroundColor:{color:Fe},setBadgeText:{text:""},setTitle:{title:Pe},setIcon:{path:Ce}},inject:{setBadgeBackgroundColor:{color:Fe},setBadgeText:{text:Ue},setTitle:{title:Re}},execute:{setBadgeBackgroundColor:{color:je},setBadgeText:{text:Ue}},progress:{setBadgeBackgroundColor:{color:je},setBadgeText:{text:""}},edit:{setBadgeBackgroundColor:{color:Fe},setBadgeText:{text:""},setTitle:{title:Pe},setIcon:{path:Ce}},end:{setBadgeBackgroundColor:{color:je},setBadgeText:{text:Le},setTitle:{title:Pe},setIcon:{path:Ce}},error:{setBadgeBackgroundColor:{color:[229,4,12,192]},setBadgeText:{text:We},setTitle:{title:""},setIcon:{path:Ce}},forbidden:{setBadgeBackgroundColor:{color:[255,255,255,1]},setBadgeText:{text:_e},setTitle:{title:De},setIcon:{path:Ce}},autosave:{inject:{setBadgeBackgroundColor:{color:[64,64,64,192]},setBadgeText:{text:Me},setTitle:{title:Ne},setIcon:{path:Ce}},default:{setBadgeBackgroundColor:{color:[208,208,208,192]},setBadgeText:{text:Me},setTitle:{title:Ne},setIcon:{path:Ce}}}};let He;function Ve(e,t){if(e.method.endsWith(".processInit")){delete m(t.tab.id)[t.tab.id].button,Ye(t.tab)}var a,n,o;return e.method.endsWith(".processProgress")&&e.maxIndex&&(a=t.tab.id,n=e.index,o=e.maxIndex,Ke(a,n,o,Oe)),e.method.endsWith(".processEnd")&&Je(t.tab.id),e.method.endsWith(".processError")&&(e.error&&console.error("Initialization error",e.error),Ge(t.tab.id)),e.method.endsWith(".processCancelled")&&$e(t.tab),Promise.resolve({})}function Ge(e){Xe(e,Qe("error"))}function Je(e,t){Xe(e,t?Qe("default",!0):Qe("end"))}function $e(e){Ye(e)}function Ke(e,t,a,n){const o=Math.max(Math.min(20,Math.floor(t/a*20)),0),r=Math.min(Math.floor(t/a*8),8),i=Ee+r+".png",s=Qe("progress");s.setTitle={title:n+5*o+"%"},s.setIcon={path:i},Xe(e,s)}async function Ye(e){const t=Qe("default",await se(e));await Xe(e.id,t)}async function Xe(e,t){try{const a=m(e);if(t){a[e].button||(a[e].button={lastState:null});const n=a[e].button.lastState||{},o={};Object.keys(t).forEach((e=>{void 0!==t[e]&&JSON.stringify(n[e])!=JSON.stringify(t[e])&&(o[e]=t[e])})),Object.keys(o).length&&(a[e].button.lastState=t,await async function(e,t){for(const a of Object.keys(t))await Ze(e,a,t[a])}(e,o))}}catch(e){}}async function Ze(e,t,a){const n="setBadgeBackgroundColor"!=t||T;if(browser.browserAction[t]&&n){const n=JSON.parse(JSON.stringify(a));n.tabId=e,await browser.browserAction[t](n)}}function Qe(e,t){return JSON.parse(JSON.stringify(t?ze.autosave[e]:ze[e]))}browser.browserAction.onClicked.addListener((async e=>{const t=await Ie({currentWindow:!0,highlighted:!0});t.length<=1?function(e){He.isSavingTab(e)?He.cancelTab(e.id):He.saveTabs([e])}(e):He.saveTabs(t)}));const et=browser.menus,tt=et&&et.onClicked&&et.create&&et.update&&et.removeAll,at="save-page",nt="edit-and-save-page",ot="save-with-profile",rt="save-selected-links",it="view-pendings",st="select-profile",ct="wasve-with-profile-",lt="select-profile-",ut="associate-with-profile",dt="associate-with-profile-",ft="save-selected",ht="save-frame",wt="save-tabs",mt="save-selected-tabs",pt="save-unpinned-tabs",bt="save-all-tabs",gt="batch-save-urls",yt="button-"+mt,vt="button-"+pt,kt="button-"+bt,At="auto-save",xt="auto-save-disabled",It="auto-save-tab",Tt="auto-save-unpinned",St="auto-save-all",Ct=browser.i18n.getMessage("menuCreateDomainRule"),Et=browser.i18n.getMessage("menuUpdateRule"),Pt=browser.i18n.getMessage("menuSavePage"),Dt=browser.i18n.getMessage("menuSaveWithProfile"),Ut=browser.i18n.getMessage("menuSaveSelectedLinks"),Rt=browser.i18n.getMessage("menuEditPage"),Wt=browser.i18n.getMessage("menuEditAndSavePage"),_t=browser.i18n.getMessage("menuViewPendingSaves"),Lt=browser.i18n.getMessage("menuSaveSelection"),Ot=browser.i18n.getMessage("menuSaveFrame"),Bt=browser.i18n.getMessage("menuSaveTabs"),Mt=browser.i18n.getMessage("menuSaveSelectedTabs"),Nt=browser.i18n.getMessage("menuSaveUnpinnedTabs"),Ft=browser.i18n.getMessage("menuSaveAllTabs"),jt=browser.i18n.getMessage("menuBatchSaveUrls"),qt=browser.i18n.getMessage("menuSelectProfile"),zt=browser.i18n.getMessage("profileDefaultSettings"),Ht=browser.i18n.getMessage("menuAutoSave"),Vt=browser.i18n.getMessage("menuAutoSaveDisabled"),Gt=browser.i18n.getMessage("menuAutoSaveTab"),Jt=browser.i18n.getMessage("menuAutoSaveUnpinnedTabs"),$t=browser.i18n.getMessage("menuAutoSaveAllTabs"),Kt=[nt,rt,ft,ht,At,ut],Yt=new Map,Xt=new Map;let Zt,Qt,ea,ta=!0,aa=!0,na=new Map;async function oa(e){const[t,a]=await Promise.all([G(),p()]),n=await J(e&&e.url);if(tt&&n){const o=["page","frame","image","link","video","audio","selection"],r=[];if(n.browserActionMenuEnabled&&r.push("browser_action"),n.tabMenuEnabled)try{await et.create({id:"temporary-id",contexts:["tab"],title:"title"}),r.push("tab")}catch(e){n.tabMenuEnabled=!1}await et.removeAll();const i=r.concat(...o),s=n.contextMenuEnabled?i:r;if(et.create({id:at,contexts:s,title:Pt}),et.create({id:nt,contexts:s,title:Wt}),et.create({id:rt,contexts:n.contextMenuEnabled?r.concat(["selection"]):r,title:Ut}),Object.keys(t).length>1&&et.create({id:ot,contexts:s,title:Dt}),n.contextMenuEnabled&&et.create({id:"separator-1",contexts:o,type:"separator"}),et.create({id:ft,contexts:s,title:Lt}),n.contextMenuEnabled&&et.create({id:ht,contexts:["frame"],title:Ot}),et.create({id:wt,contexts:r,title:Bt}),et.create({id:yt,contexts:r,title:Mt,parentId:wt}),et.create({id:vt,contexts:r,title:Nt,parentId:wt}),et.create({id:kt,contexts:r,title:Ft,parentId:wt}),n.contextMenuEnabled&&(C&&et.create({id:mt,contexts:o,title:Mt}),et.create({id:pt,contexts:o,title:Nt}),et.create({id:bt,contexts:o,title:Ft}),et.create({id:"separator-2",contexts:o,type:"separator"})),Object.keys(t).length>1){et.create({id:st,title:qt,contexts:s}),et.create({id:ct+"default",contexts:s,title:zt,parentId:ot});const r=lt+"default",i=!a.profileName||a.profileName==y;let c;et.create({id:r,type:"radio",contexts:s,title:zt,checked:i,parentId:st}),Yt.set(r,i),et.create({id:ut,title:Ct,contexts:s}),Xt.set(ut,Ct),e&&e.url&&(c=await j(e.url,!0));const l=dt+"current",u=!c||c.profile==g;et.create({id:l,type:"radio",contexts:s,title:g,checked:u,parentId:ut}),Yt.set(l,u);const d=dt+"default",f=Boolean(c)&&c.profile==y;et.create({id:d,type:"radio",contexts:s,title:zt,checked:f,parentId:ut}),Yt.set(d,f),na=new Map,Object.keys(t).forEach(((e,t)=>{if(e!=y){let n=ct+t;et.create({id:n,contexts:s,title:e,parentId:ot}),n=lt+t;let o=a.profileName==e;et.create({id:n,type:"radio",contexts:s,title:e,checked:o,parentId:st}),Yt.set(n,o),n=dt+t,o=Boolean(c)&&c.profile==e,et.create({id:n,type:"radio",contexts:s,title:e,checked:o,parentId:ut}),Yt.set(n,o),na.set(e,t)}})),n.contextMenuEnabled&&et.create({id:"separator-3",contexts:o,type:"separator"})}S&&(et.create({id:At,contexts:s,title:Ht}),et.create({id:xt,type:"radio",title:Vt,contexts:s,checked:!0,parentId:At}),Yt.set(xt,!0),et.create({id:It,type:"radio",title:Gt,contexts:s,checked:!1,parentId:At}),Yt.set(It,!1),et.create({id:Tt,type:"radio",title:Jt,contexts:s,checked:!1,parentId:At}),Yt.set(Tt,!1),et.create({id:St,type:"radio",title:$t,contexts:s,checked:!1,parentId:At}),Yt.set(St,!1),et.create({id:"separator-4",contexts:s,type:"separator"})),et.create({id:gt,contexts:s,title:jt}),et.create({id:it,contexts:s,title:_t})}Zt=!0,Qt&&(Qt=!1,(await browser.tabs.query({})).forEach((async e=>await ia(e))))}async function ra(e){const t=await p(e.id);await async function(){const e=await browser.tabs.query({});return Promise.all(e.map((async e=>{const[t,a]=await Promise.all([J(e.url,!0),se(e)]);try{await browser.tabs.sendMessage(e.id,{method:"content.init",autoSaveEnabled:a,options:t})}catch(e){}})))}(),await Ye(e);try{await browser.runtime.sendMessage({method:"options.refresh",profileName:t.profileName})}catch(e){}}async function ia(e){if(tt&&Zt){const t=[],a=await p(e.id);if(a[e.id].editorDetected)sa(!1);else if(sa(!0),S&&(t.push(la(xt,!a[e.id].autoSave)),t.push(la(It,a[e.id].autoSave)),t.push(la(Tt,Boolean(a.autoSaveUnpinned))),t.push(la(St,Boolean(a.autoSaveAll)))),e&&e.url){const n=await J(e.url);t.push(async function(e,t){const a=ta;ta=t,(void 0===a||a!=t)&&await oa(e)}(e,n.contextMenuEnabled)),t.push(ca(nt,a[e.id].savedPageDetected?Rt:Wt)),C&&t.push(et.update(ft,{visible:!n.saveRawPage})),t.push(et.update(nt,{visible:!n.openEditor||a[e.id].savedPageDetected}));let o=dt+"default",r=Ct;const[i,s]=await Promise.all([G(),j(e.url)]);if(s){const e=na.get(s.profile);e&&(o=dt+e,r=Et)}Object.keys(i).length>1&&(Object.keys(i).forEach(((e,a)=>{e==y?t.push(la(dt+"default",o==dt+"default")):t.push(la(dt+a,o==dt+a))})),t.push(ca(ut,r)))}await Promise.all(t)}}async function sa(e){const t=aa;if(aa=e,void 0===t||t!=e){const t=[];try{Kt.forEach((a=>t.push(et.update(a,{visible:e})))),await Promise.all(t)}catch(e){}}}function ca(e,t){const a=Xt.get(e);return Xt.set(e,t),void 0===a||a!=t?et.update(e,{title:t}):void 0}async function la(e,t){t=Boolean(t),Yt.set(e,t),await et.update(e,{checked:t})}Promise.resolve().then((async function(){tt&&(oa(),et.onClicked.addListener((async(e,t)=>{if(e.menuItemId==at&&(e.linkUrl?ea.saveUrls([e.linkUrl]):ea.saveTabs([t])),e.menuItemId==nt){(await p(t.id))[t.id].savedPageDetected?ea.openEditor(t):e.linkUrl?ea.saveUrls([e.linkUrl],{openEditor:!0}):ea.saveTabs([t],{openEditor:!0})}if(e.menuItemId==rt&&ea.saveSelectedLinks(t),e.menuItemId==it&&await browser.tabs.create({active:!0,url:"/src/ui/pages/pendings.html"}),e.menuItemId==ft&&ea.saveTabs([t],{selected:!0}),e.menuItemId==ht&&ea.saveTabs([t],{frameId:e.frameId}),e.menuItemId==mt||e.menuItemId==yt){const e=await Ie({currentWindow:!0,highlighted:!0});ea.saveTabs(e)}if(e.menuItemId==pt||e.menuItemId==vt){const e=await Ie({currentWindow:!0,pinned:!1});ea.saveTabs(e)}if(e.menuItemId==bt||e.menuItemId==kt){const e=await Ie({currentWindow:!0});ea.saveTabs(e)}if(e.menuItemId==gt&&ea.batchSaveUrls(),e.menuItemId==It){const e=await p(t.id);e[t.id].autoSave=!0,await b(e),ra(t)}if(e.menuItemId==xt){const e=await p();Object.keys(e).forEach((t=>{"object"==typeof e[t]&&e[t].autoSave&&(e[t].autoSave=!1)})),e.autoSaveUnpinned=e.autoSaveAll=!1,await b(e),ra(t)}if(e.menuItemId==St){const a=await p();a.autoSaveAll=e.checked,await b(a),ra(t)}if(e.menuItemId==Tt){const a=await p();a.autoSaveUnpinned=e.checked,await b(a),ra(t)}if(e.menuItemId.startsWith(ct)){const a=await G(),n=e.menuItemId.split(ct)[1];let o;if("default"==n)o=y;else{const e=Number(n);o=Object.keys(a)[e]}a[o].profileName=o,ea.saveTabs([t],a[o])}if(e.menuItemId.startsWith(lt)){const[a,n]=await Promise.all([G(),p()]),o=e.menuItemId.split(lt)[1];if("default"==o)n.profileName=y;else{const e=Number(o);n.profileName=Object.keys(a)[e]}await b(n),ra(t)}if(e.menuItemId.startsWith(dt)){const[a,n]=await Promise.all([G(),j(t.url,!0)]),o=e.menuItemId.split(dt)[1];let r;if("default"==o)r=y;else if("current"==o)r=g;else{const e=Number(o);r=Object.keys(a)[e]}n?await ee(n.url,n.url,r,r):(await ca(ut,Et),await Q(new URL(t.url).hostname,r,r))}})),Zt?Qt=!0:(await browser.tabs.query({})).forEach((async e=>await ia(e))))}));const ua=browser.commands;let da,fa,ha;function wa(e,t){return e.method.endsWith(".refreshMenu")?function(e){if(e.method.endsWith("refreshMenu"))return oa(),Promise.resolve({})}(e):Ve(e,t)}function ma(e){!function(e){Xe(e.id,Qe("forbidden"))}(e)}function pa(e,t,a){!function(e,t,a){let n;a?n=Qe("inject",!0):(n=Qe(t==qe?"inject":"execute"),n.setTitle={title:Re+" ("+t+"/2)"},n.setIcon={path:Ee+"0.png"}),Xe(e,n)}(e,t,a)}async function ba(e,t,a){Ge(e);try{t&&await browser.tabs.sendMessage(e,{method:"content.error",error:t.toString(),link:a})}catch(e){}}function ga(e){!function(e){Xe(e,Qe("edit"))}(e)}function ya(e,t){Je(e,t)}function va(e,t,a){!function(e,t,a){Ke(e,t,a,Be)}(e,t,a)}function ka(e){ia(e)}ua&&ua.onCommand&&ua.onCommand.addListener&&ua.onCommand.addListener((async e=>{if("save-selected-tabs"==e){const e=await Ie({currentWindow:!0,highlighted:!0});da.saveTabs(e,{optionallySelected:!0})}if("save-all-tabs"==e){const e=await Ie({currentWindow:!0});da.saveTabs(e)}}));const Aa=["lib/web-stream.js","lib/chrome-browser-polyfill.js","lib/single-file.js"],xa=["lib/chrome-browser-polyfill.js","lib/single-file-frames.js"],Ia="../../../";async function Ta(e,t){let a;if(await async function(e){const t=e.extensionScriptFiles||[];fa||ha||([fa,ha]=await Promise.all([Sa(Aa.concat(t)),Sa(xa)]))}(t),!t.removeFrames)try{await browser.tabs.executeScript(e,{code:ha,allFrames:!0,matchAboutBlank:!0,runAt:"document_start"})}catch(e){}try{await browser.tabs.executeScript(e,{code:fa,allFrames:!1,runAt:"document_idle"}),a=!0}catch(e){}return a&&t.frameId&&await browser.tabs.executeScript(e,{code:"document.documentElement.dataset.requestedFrameId = true",frameId:t.frameId,matchAboutBlank:!0,runAt:"document_start"}),a}async function Sa(e){const t=e.map((async e=>{if("function"==typeof e)return"("+e.toString()+")();";{const t=await fetch(browser.runtime.getURL(Ia+e));return(new TextDecoder).decode(await t.arrayBuffer())}}));let a="";for(const e of t)a+=await e;return a}const Ca="single-file-request-fetch",Ea="single-file-ack-fetch",Pa="single-file-response-fetch",Da="Host fetch error (SingleFile)",Ua=2500,Ra=Boolean(window.wrappedJSObject),Wa=(e,t,a)=>window.addEventListener(e,t,a),_a=e=>window.dispatchEvent(e),La=(e,t,a)=>window.removeEventListener(e,t,a),Oa=(e,t)=>window.fetch(e,t);let Ba=0,Ma=new Map;async function Na(e,t={}){try{const a={cache:"force-cache",headers:t.headers};return await(t.referrer&&Ra?async function(e,t){const a=new Promise(((a,n)=>{_a(new CustomEvent(Ca,{detail:JSON.stringify({url:e,options:t})})),Wa(Ea,i,!1),Wa(Pa,r,!1);const o=setTimeout((()=>{s(),n(new Error(Da))}),Ua);function r(t){t.detail?t.detail.url==e&&(s(),t.detail.response?a({status:t.detail.status,headers:new Map(t.detail.headers),arrayBuffer:async()=>t.detail.response}):n(t.detail.error)):n()}function i(){clearTimeout(o)}function s(){La(Pa,r,!1),La(Ea,i,!1)}}));try{return await a}catch(a){if(a&&a.message==Da)return Oa(e,t);throw a}}(e,a):Oa(e,a))}catch(a){Ba++;const n=new Promise(((e,t)=>Ma.set(Ba,{resolve:e,reject:t})));return await ja({method:"singlefile.fetch",url:e,requestId:Ba,referrer:t.referrer,headers:t.headers}),n}}async function Fa(e,t){const a=await ja({method:"singlefile.fetchFrame",url:e,frameId:t.frameId,referrer:t.referrer,headers:t.headers});return{status:a.status,headers:new Map(a.headers),arrayBuffer:async()=>new Uint8Array(a.array).buffer}}async function ja(e){const t=await browser.runtime.sendMessage(e);if(!t||t.error)throw new Error(t&&t.error&&t.error.toString());return t}function qa(e,t){return Ta(e,t)}browser.runtime.onMessage.addListener((e=>"singlefile.fetchFrame"==e.method&&window.frameId&&window.frameId==e.frameId?async function(e){try{const t=await Oa(e.url,{cache:"force-cache",headers:e.headers});return{status:t.status,headers:[...t.headers],array:Array.from(new Uint8Array(await t.arrayBuffer()))}}catch(e){return{error:e&&e.toString()}}}(e):"singlefile.fetchResponse"==e.method?async function(e){const t=Ma.get(e.requestId);t&&(e.error?(t.reject(new Error(e.error)),Ma.delete(e.requestId)):(e.truncated&&(t.array?t.array=t.array.concat(e.array):(t.array=e.array,Ma.set(e.requestId,t)),e.finished&&(e.array=t.array)),e.truncated&&!e.finished||(t.resolve({status:e.status,headers:{get:t=>e.headers&&e.headers[t]},arrayBuffer:async()=>new Uint8Array(e.array).buffer}),Ma.delete(e.requestId))));return{}}(e):void 0));const za="Could not establish connection. Receiving end does not exist.",Ha="The message port closed before a response was received.",Va="Message manager disconnected",Ga="Cannot access contents of url ",Ja=1,$a=2,Ka="pending",Ya="processing",Xa=["lib/single-file-extension.js"],Za=[];let Qa,en,tn=0;var an;async function nn(e){const t={extensionScriptFiles:Xa,tabId:e.id,tabIndex:e.index};if(await qa(e.id,t)){const t=await browser.tabs.sendMessage(e.id,{method:"content.getSelectedLinks"});if(t.urls&&t.urls.length){const e=await on(),a=(n,o)=>{"complete"==o.status&&n==e.id&&(browser.tabs.onUpdated.removeListener(a),browser.tabs.sendMessage(e.id,{method:"newUrls.addURLs",urls:t.urls}))};browser.tabs.onUpdated.addListener(a)}}else ma(e)}async function on(){return browser.tabs.create({active:!0,url:"/src/ui/pages/batch-save-urls.html"})}async function rn(e,t={}){await ln(),await Promise.all(e.map((async e=>{const a=await J(e);Object.keys(t).forEach((e=>a[e]=t[e])),a.autoClose=!0,a.extensionScriptFiles=Xa,a.passReferrerOnError&&xe(),cn({tab:{url:e},status:Ka,options:a,method:"content.save"})}))),un()}async function sn(e,t={}){await ln(),await Promise.all(e.map((async e=>{const a=e.id,n=await J(e.url);Object.keys(t).forEach((e=>n[e]=t[e])),n.tabId=a,n.tabIndex=e.index,n.extensionScriptFiles=Xa,n.passReferrerOnError&&xe();const o={id:e.id,index:e.index,url:e.url,title:e.title};if(t.autoSave){if(se(e)){dn(cn({status:Ya,tab:o,options:n,method:"content.autosave"}))}}else{pa(a,Ja);await qa(a,n)||we(e)?(pa(a,$a),cn({status:Ka,tab:o,options:n,method:"content.save"})):ma(e)}}))),un()}function cn(e){const t={id:tn,status:e.status,tab:e.tab,options:e.options,method:e.method,done:function(){const e=Za.findIndex((e=>e.id==this.id));e>-1&&(Za.splice(e,1),un())}};return Za.push(t),tn++,t}async function ln(){if(!Qa){const e=await q();en=e.processInForeground,Qa=en?1:e.maxParallelWorkers}}function un(){const e=Za.filter((e=>e.status==Ya)).length;for(let t=0;t<Math.min(Za.length-e,Qa-e);t++){const e=Za.find((e=>e.status==Ka));e&&dn(e)}}async function dn(e){const t=e.id;if(e.status=Ya,!e.tab.id){let t;try{const a=await async function(e){const t=await browser.tabs.create(e);return new Promise(((e,a)=>{function n(a,r){a==t.id&&"complete"==r.status&&(e(t),browser.tabs.onUpdated.removeListener(n),browser.tabs.onRemoved.removeListener(o))}function o(e){e==t.id&&(a(e),browser.tabs.onRemoved.removeListener(o))}browser.tabs.onUpdated.addListener(n),browser.tabs.onRemoved.addListener(o)}))}({url:e.tab.url,active:!1});e.tab.id=e.options.tabId=a.id,e.tab.index=e.options.tabIndex=a.index,pa(e.tab.id,Ja),t=await qa(e.tab.id,e.options)}catch(t){e.tab.id=t}if(!t)return void e.done();pa(e.tab.id,$a)}e.options.taskId=t;try{en&&await browser.tabs.update(e.tab.id,{active:!0}),await browser.tabs.sendMessage(e.tab.id,{method:e.method,options:e.options})}catch(t){!t||t.message&&function(e){return e.message==Ha||e.message==za||e.message==Va||e.message.startsWith(Ga+JSON.stringify(fe))}(t)||(console.log(t.message?t.message:t),ba(e.tab.id,t.message,t.link),e.done())}}function fn(e){const t=Za.find((t=>t.id==e));t&&(t.options.autoClose&&!t.cancelled&&browser.tabs.remove(t.tab.id),t.done())}function hn(e,t){const a=Za.find((t=>t.id==e));a&&(a.cancel=t)}function wn(e){Array.from(Za).filter((t=>t.tab.id==e&&!t.options.autoSave)).forEach(pn)}function mn(e){return Za.find((t=>t.id==e))}function pn(e){const t=e.tab.id;e.cancelled=!0,browser.tabs.sendMessage(t,{method:"content.cancelSave",options:{loadDeferredImages:e.options.loadDeferredImages,loadDeferredImagesKeepZoomLevel:e.options.loadDeferredImagesKeepZoomLevel}}),e.cancel&&e.cancel(),"content.autosave"==e.method&&ya(t,!0),function(e){$e(e)}(e.tab),e.done()}function bn(e){return{id:e.id,tabId:e.tab.id,index:e.tab.index,url:e.tab.url,title:e.tab.title,cancelled:e.cancelled,status:e.status}}(function(e){ea=e})(an={isSavingTab:function(e){return Boolean(Za.find((t=>t.tab.id==e.id)))},saveTabs:sn,saveUrls:rn,cancelTab:wn,openEditor:function(e){browser.tabs.sendMessage(e.id,{method:"content.openEditor"})},saveSelectedLinks:nn,batchSaveUrls:on}),function(e){He=e}(an),function(e){da=e}(an);async function gn(e){let t;try{t=await browser.runtime.sendNativeMessage("singlefile_companion",{method:"save",pageData:e})}catch(e){if(!e.message||!e.message.includes("Native host has exited"))throw e}if(t&&t.error)throw new Error(t.error+" (Companion)")}const yn=new Set;async function vn(e){return e.method.endsWith(".saveCreatedBookmarks")?(kn(),{}):e.method.endsWith(".disable")?(async function(){let e;const t=await G();Object.keys(t).forEach((a=>e=e||!t[a].saveCreatedBookmarks)),e&&(browser.bookmarks.onCreated.removeListener(xn),browser.bookmarks.onMoved.removeListener(In))}(),{}):void 0}async function kn(){try{browser.bookmarks.onCreated.removeListener(xn),browser.bookmarks.onMoved.removeListener(In)}catch(e){}let e;const t=await G();Object.keys(t).forEach((a=>{t[a].saveCreatedBookmarks&&(e=!0)})),e&&(browser.bookmarks.onCreated.addListener(xn),browser.bookmarks.onMoved.addListener(In))}async function An(e,t){try{await browser.bookmarks.update(e,t)}catch(e){}}async function xn(e,t){yn.add(e),await Tn(e,t.url,t)}async function In(e,t){if(yn.has(e)){const a=await browser.bookmarks.get(e);a[0]&&await Tn(e,a[0].url,t)}}async function Tn(e,t,a){const n=await browser.tabs.query({lastFocusedWindow:!0,active:!0}),o=await J(t);if(o.saveCreatedBookmarks){const i=await async function e(t,a=[]){if(t){const n=(await browser.bookmarks.get(t))[0];n&&n.title&&(a.unshift(n.title),await e(n.parentId,a))}return a}(a.parentId),s=o.allowedBookmarkFolders.toString(),c=i.find((e=>o.allowedBookmarkFolders.includes(e))),l=o.ignoredBookmarkFolders.toString(),u=i.find((e=>o.ignoredBookmarkFolders.includes(e)));if((s&&c||!s)&&(l&&!u||!l))if(n.length&&n[0].url==t)yn.delete(e),sn(n,{bookmarkId:e,bookmarkFolders:i});else{const a=await browser.tabs.query({});if(a.length){const n=a.find((e=>e.url==t));n?(yn.delete(e),sn([n],{bookmarkId:e,bookmarkFolders:i})):t&&("about:blank"==t?browser.bookmarks.onChanged.addListener((function t(a,n){a==e&&n.url&&(browser.bookmarks.onChanged.removeListener(t),r(n.url))})):r(t))}}}function r(t){yn.delete(e),rn([t],{bookmarkId:e})}}Promise.resolve().then(kn);const Sn="https://api.woleet.io/v1/anchor",Cn="eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhYzZmZTMzMi0wODNjLTRjZmMtYmYxNC0xNWU5MTJmMWY4OWIiLCJpYXQiOjE1NzYxNzQzNDV9.n31j9ctJj7R1Vjwyc5yd1d6Cmg0NDnpwSaLWsqtZJQA";async function En(e,t){let a=t||Cn;const n=await fetch(Sn,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",Authorization:"Bearer "+a},body:JSON.stringify({name:e,hash:e,public:!0})});if(401==n.status){const e=new Error("Your access token on Woleet is invalid. Go to __DOC_LINK__ to create your account.");throw e.link="https://app.woleet.io/",e}if(402==n.status){const e=new Error("You have no more credits on Woleet. Go to __DOC_LINK__ to recharge them.");throw e.link="https://app.woleet.io/",e}if(n.status>=400)throw new Error((n.statusText||"Error "+n.status)+" (Woleet)");return n.json()}const Pn="https://oauth2.googleapis.com/token",Dn="https://www.googleapis.com/drive/v3/files",Un="uniquify";class Rn{constructor(e){this.file=e.file,this.onProgress=e.onProgress,this.contentType=this.file.type||"application/octet-stream",this.metadata={name:e.filename,mimeType:this.contentType,parents:e.parents||["root"]},this.token=e.token,this.offset=0,this.chunkSize=e.chunkSize||524288,this.filenameConflictAction=e.filenameConflictAction,this.prompt=e.prompt}async upload(e=1){let t,a="POST";const n=Nn(await fetch(Dn+`?q=name = '${this.metadata.name}' and trashed != true and '${this.metadata.parents[0]}' in parents`,{headers:{Authorization:"Bearer "+this.token,"Content-Type":"application/json"}})),o=await n.json();if(o.files.length)if("overwrite"==this.filenameConflictAction)a="PATCH",t=o.files[0].id,this.metadata.parents=null;else if(this.filenameConflictAction==Un){let t=this.metadata.name,a="";const n=this.metadata.name.lastIndexOf(".");n>-1&&(t=this.metadata.name.substring(0,n),a=this.metadata.name.substring(n+1));const o=t+" ("+e+")."+a,r=Nn(await fetch(Dn+`?q=name = '${o}' and trashed != true and '${this.metadata.parents[0]}' in parents`,{headers:{Authorization:"Bearer "+this.token,"Content-Type":"application/json"}}));if((await r.json()).files.length)return this.upload(e+1);this.metadata.name=o}else{if("prompt"==this.filenameConflictAction){if(this.prompt){const t=await this.prompt(this.metadata.name);return t?(this.metadata.name=t,this.upload(e)):o}return this.filenameConflictAction=Un,this.upload(e)}if("skip"==this.filenameConflictAction)return o}const r=Nn(await fetch("https://www.googleapis.com/upload/drive/v3/files"+(t?"/"+t:"")+"?uploadType=resumable",{method:a,headers:{Authorization:"Bearer "+this.token,"Content-Type":"application/json","X-Upload-Content-Length":this.file.size,"X-Upload-Content-Type":this.contentType},body:JSON.stringify(this.metadata)})).headers.get("Location");if(this.url=r,!this.cancelled)return this.onProgress&&this.onProgress(0,this.file.size),Bn(this)}}async function Wn(e,t){const a=await fetch(Pn,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"client_id="+e.clientId+"&client_secret="+e.clientKey+"&grant_type=authorization_code&code="+t.code+"&redirect_uri="+browser.identity.getRedirectURL()}),n=await Mn(a);return e.accessToken=n.access_token,e.refreshToken=n.refresh_token,e.expirationDate=Date.now()+1e3*n.expires_in,{accessToken:e.accessToken,refreshToken:e.refreshToken,expirationDate:e.expirationDate}}function _n(e={}){return Boolean(browser.identity&&browser.identity.getAuthToken)&&!e.forceWebAuthFlow}async function Ln(e,t,a=!0){const n=t.split("/");n.pop();const o=e.folderIds.get(n.join("/"));if(o)return o;let r="root";if(n.length){let o="";for(const i of n){o&&(o+="/"),o+=i;const n=e.folderIds.get(o);if(n)r=n;else try{r=await On(e,i,r),e.folderIds.set(o,r)}catch(n){if("path_not_found"==n.message&&a)return e.folderIds.clear(),Ln(e,t,!1);throw n}}}return r}async function On(e,t,a){const n=await async function(e,t,a){const n=await fetch(Dn+"?q=mimeType = 'application/vnd.google-apps.folder' and name = '"+t+"' and trashed != true and '"+a+"' in parents",{headers:{Authorization:"Bearer "+e.accessToken}});return Mn(n)}(e,t,a);if(n.files.length)return n.files[0].id;{const n=await async function(e,t,a){const n=await fetch(Dn,{method:"POST",headers:{Authorization:"Bearer "+e.accessToken,"Content-Type":"application/json"},body:JSON.stringify({name:t,parents:[a],mimeType:"application/vnd.google-apps.folder"})});return Mn(n)}(e,t,a);return n.id}}async function Bn(e){let t=e.file,a=e.file.size;(e.offset||e.chunkSize)&&(e.chunkSize&&(a=Math.min(e.offset+e.chunkSize,e.file.size)),t=t.slice(e.offset,a));const n=await fetch(e.url,{method:"PUT",headers:{Authorization:"Bearer "+e.token,"Content-Type":e.contentType,"Content-Range":"bytes "+e.offset+"-"+(a-1)+"/"+e.file.size,"X-Upload-Content-Type":e.contentType},body:t});if(e.onProgress&&!e.cancelled&&e.onProgress(e.offset+e.chunkSize,e.file.size),200==n.status||201==n.status)return n.json();if(308==n.status){const t=n.headers.get("Range");if(t&&(e.offset=parseInt(t.match(/\d+/g).pop(),10)+1),e.cancelled)throw new Error("upload_cancelled");return Bn(e)}Nn(n)}async function Mn(e){e=Nn(e);const t=await e.json();if(t.error)throw new Error(t.error);return t}function Nn(e){if(200==e.status)return e;throw 404==e.status?new Error("path_not_found"):401==e.status?new Error("invalid_token"):new Error("unknown_error ("+e.status+")")}const Fn="https://api.dropboxapi.com/oauth2/token",jn="uniquify",qn="prompt",zn=/[\u007f-\uffff]/g;class Hn{constructor(e){this.file=e.file,this.onProgress=e.onProgress,this.contentType=this.file.type||"application/octet-stream",this.metadata={name:e.filename,mimeType:this.contentType},this.token=e.token,this.offset=0,this.chunkSize=e.chunkSize||8388608,this.filenameConflictAction=e.filenameConflictAction,this.prompt=e.prompt}async upload(){const e=$n(await fetch("https://api.dropboxapi.com/2/files/search_v2",{method:"POST",headers:{Authorization:"Bearer "+this.token,"Content-Type":"application/json"},body:Kn({query:this.metadata.name,options:{filename:!0}})})),t=await Jn(e);if(t.matches.length)if(this.filenameConflictAction==qn)if(this.prompt){const e=await this.prompt(this.metadata.name);if(!e)return t;this.metadata.name=e}else this.filenameConflictAction=jn;else if("skip"==this.filenameConflictAction)return t;const a=$n(await fetch("https://content.dropboxapi.com/2/files/upload_session/start",{method:"POST",headers:{Authorization:"Bearer "+this.token,"Dropbox-API-Arg":Kn({close:!1}),"Content-Type":"application/octet-stream"}})),n=(await Jn(a)).session_id;if(this.sessionId=n,!this.cancelled)return this.onProgress&&this.onProgress(0,this.file.size),Gn(this)}}async function Vn(e,t){const a=await fetch(Fn,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"client_id="+e.clientId+"&client_secret="+e.clientKey+"&grant_type=authorization_code&code="+t.code+"&redirect_uri="+browser.identity.getRedirectURL()}),n=await Jn(a);return e.accessToken=n.access_token,e.refreshToken=n.refresh_token,e.expirationDate=Date.now()+1e3*n.expires_in,{accessToken:e.accessToken,refreshToken:e.refreshToken,expirationDate:e.expirationDate}}async function Gn(e){let t=e.file,a=e.file.size;(e.offset||e.chunkSize)&&(e.chunkSize&&(a=Math.min(e.offset+e.chunkSize,e.file.size)),t=t.slice(e.offset,a));const n=$n(await fetch("https://content.dropboxapi.com/2/files/upload_session/append_v2",{method:"POST",headers:{Authorization:"Bearer "+e.token,"Content-Type":"application/octet-stream","Dropbox-API-Arg":Kn({cursor:{session_id:e.sessionId,offset:e.offset},close:a==e.file.size})},body:t}));if(e.onProgress&&!e.cancelled&&e.onProgress(e.offset+e.chunkSize,e.file.size),200==n.status&&(e.offset=a,e.offset<e.file.size))return Gn(e);let o=e.metadata.name;o.startsWith("/")||(o="/"+o);const r=await fetch("https://content.dropboxapi.com/2/files/upload_session/finish",{method:"POST",headers:{Authorization:"Bearer "+e.token,"Content-Type":"application/octet-stream","Dropbox-API-Arg":Kn({cursor:{session_id:e.sessionId,offset:e.offset},commit:{path:o,mode:"overwrite"==e.filenameConflictAction?"overwrite":"add",autorename:e.filenameConflictAction==jn}})}});if(200==r.status)return Jn(r);if(409==r.status&&e.filenameConflictAction==qn)return e.offset=0,e.upload();throw new Error("unknown_error ("+r.status+")")}async function Jn(e){e=$n(e);const t=await e.json();if(t.error)throw new Error(t.error);return t}function $n(e){if(200==e.status)return e;throw 401==e.status?new Error("invalid_token"):new Error("unknown_error ("+e.status+")")}function Kn(e){return JSON.stringify(e).replace(zn,(function(e){return"\\u"+("000"+e.charCodeAt(0).toString(16)).slice(-4)}))}const Yn="",Xn="prompt",Zn="/",Qn=".",eo="Error ",to=/\s\((\d+)\)$/,ao="PROPFIND",no="MKCOL",oo=400;class ro{constructor(e,t,a){e.endsWith(Zn)||(e+=Zn),this.url=e,this.authorization="Basic "+btoa(t+":"+a)}upload(e,t,a){return this.controller=new AbortController,a.signal=this.controller.signal,a.authorization=this.authorization,a.url=this.url,io(e,t,a)}abort(){this.controller&&this.controller.abort()}}async function io(e,t,a){const{authorization:n,filenameConflictAction:o,prompt:r,signal:i,preventRetry:s}=a;let{url:c}=a;try{if("overwrite"==o){let n=await l(e,"PUT",t);if(201==n.status)return n;if(n.status>=oo){if(n=await l(e,"DELETE"),n.status>=oo)throw new Error(eo+n.status);return await io(e,t,a)}}else{let n=await l(e,"HEAD");if(200==n.status){if("uniquify"==o||o==Xn&&!r){const{filenameWithoutExtension:n,extension:o,indexFilename:r}=function(e){let t=e,a=Yn;const n=e.lastIndexOf(".");n>-1&&(t=e.substring(0,n),a=e.substring(n+1));let o;return({filenameWithoutExtension:t,indexFilename:o}=function(e){const t=e.match(to);let a=0;if(t&&t.length>1){const n=Number(t[t.length-1]);Number.isNaN(n)||(a=n,e=e.replace(to,Yn))}return{filenameWithoutExtension:e,indexFilename:a}}(t)),{filenameWithoutExtension:t,extension:a,indexFilename:o}}(e);return a.indexFilename=r+1,await io(function(e,t){return e+" ("+a.indexFilename+")"+(t?Qn+t:Yn)}(n,o),t,a)}if(o==Xn)return(e=await r(e))?io(e,t,a):n;if("skip"==o)return n}else{if(404==n.status){if(n=await l(e,"PUT",t),n.status>=oo&&!s){if(e.includes(Zn))return await async function(){const t=e.split(Zn);t.pop();let a=Yn;for(const e of t)if(e){a+=e;if(404==(await l(a,ao)).status){const e=await l(a,no);if(e.status>=oo)throw new Error(eo+e.status)}a+=Zn}}(),a.preventRetry=!0,await io(e,t,a);throw new Error(eo+n.status)}return n}if(n.status>=oo)throw new Error(eo+n.status)}}}catch(e){if("AbortError"!=e.name)throw e}function l(e,t,a){const o={Authorization:n};return a&&(o["Content-Type"]="text/html"),fetch(c+e,{method:t,headers:o,signal:i,body:a,credentials:"omit"})}}const so="",co="skip",lo="uniquify",uo="overwrite",fo="prompt",ho=".",wo=/\s\((\d+)\)$/,mo="AbortError",po="https://github.com",bo="https://api.github.com",go="blob",yo="repos",vo="contents";let ko;class Ao{constructor(e,t,a,n){this.headers=new Map([["Authorization","Bearer "+e],["Accept","application/vnd.github+json"],["X-GitHub-Api-Version","2022-11-28"]]),this.userName=t,this.repositoryName=a,this.branch=n}async upload(e,t,a){this.controller=new AbortController,a.signal=this.controller.signal,a.headers=this.headers;const n=t instanceof Blob?await(o=t,new Promise(((e,t)=>{const a=new FileReader;a.onloadend=()=>e(a.result.match(/^data:[^,]+,(.*)$/)[1]),a.onerror=e=>t(e.detail),a.readAsDataURL(o)}))):btoa(unescape(encodeURIComponent(t)));var o;return async function(e,t,a,n,o,r){const{filenameConflictAction:i,prompt:s,signal:c,headers:l}=r;for(;ko;)await ko;try{ko=await u({path:n,content:o})}finally{ko=null}return{url:`${po}/${e}/${t}/${go}/${a}/${n}`};async function u({path:n,content:o,message:f="",sha:w}){try{const e=await m("PUT",JSON.stringify({content:o,message:f,branch:a,sha:w})),t=await e.json();if(422==e.status){if(i==uo){const e=await m("GET"),t=(await e.json()).sha;return await u({path:n,content:o,message:f,sha:t})}if(i==lo){const{filenameWithoutExtension:e,extension:t,indexFilename:a}=d(n);return r.indexFilename=a+1,n=h(e,t),await u({path:n,content:o,message:f})}if(i==co)return t;if(i==fo)return s?(n=await s(n))?await u({path:n,content:o,message:f}):t:(r.filenameConflictAction=lo,await u({path:n,content:o,message:f}))}if(e.status<400)return t;throw new Error(t.message)}catch(e){if(e.name!=mo)throw e}function m(a,o){return fetch(`${bo}/${yo}/${e}/${t}/${vo}/${n}`,{method:a,headers:l,body:o,signal:c})}}function d(e){let t=e,a=so;const n=e.lastIndexOf(ho);let o;return n>-1&&(t=e.substring(0,n),a=e.substring(n+1)),({filenameWithoutExtension:t,indexFilename:o}=f(t)),{filenameWithoutExtension:t,extension:a,indexFilename:o}}function f(e){const t=e.match(wo);let a=0;if(t&&t.length>1){const n=Number(t[t.length-1]);Number.isNaN(n)||(a=n,e=e.replace(wo,so))}return{filenameWithoutExtension:e,indexFilename:a}}function h(e,t){return e+" ("+r.indexFilename+")"+(t?ho+t:so)}}(this.userName,this.repositoryName,this.branch,e,n,a)}abort(){this.controller&&this.controller.abort()}}const xo=8388608,Io=0,To=[Io],So=Symbol(),Co=new TextEncoder,Eo=new TextDecoder,Po=new Array(256);let Do=0;function Uo(e,t,a,n){if(void 0===n){if(Do++,!(Po.length-Do>=To.length))throw new Error("Reached maximum number of custom types");Po[Po.length-Do]={serialize:e,parse:t,test:a}}else Po[n]={serialize:e,parse:t,test:a}}async function Ro(e){const t=function(){let e,t,a,n,o,r;return{next:async e=>e?i(e):{value:await n,done:!0},return:()=>({done:!0})};async function i(e){return o?await o:s().catch((()=>{})),l(),a(e),{done:!1}}async function s(){let t;n=new Promise((e=>t=e)),e=new zo(u),c();const a=await Vo(e);e.executeSetters(),t(a)}function c(){t=new Promise((e=>a=e))}function l(){o=new Promise((e=>r=e))}async function u(){const e=await t;return c(),r&&r(),e}}();await t.next(e);return(await t.next()).value}Uo((async function(e,t){const a=e.objects.indexOf(t);await Oo(e,a)}),(async function(e){const t=await Vo(e);return new qo(t,e)}),Yo,Io),Uo(null,(function(){return{}}),Zo),Uo(Bo,Go,Qo),Uo(Mo,Jo,(function(e){return"string"==typeof e})),Uo(No,(async function(e){const t=await Vo(e),a=await e.consume(8*t);return new Float64Array(a.buffer)}),(function(e){return e instanceof Float64Array})),Uo(No,(async function(e){const t=await Vo(e),a=await e.consume(4*t);return new Float32Array(a.buffer)}),(function(e){return e instanceof Float32Array})),Uo(No,(async function(e){const t=await Vo(e),a=await e.consume(4*t);return new Uint32Array(a.buffer)}),(function(e){return e instanceof Uint32Array})),Uo(No,(async function(e){const t=await Vo(e),a=await e.consume(4*t);return new Int32Array(a.buffer)}),(function(e){return e instanceof Int32Array})),Uo(No,(async function(e){const t=await Vo(e),a=await e.consume(2*t);return new Uint16Array(a.buffer)}),(function(e){return e instanceof Uint16Array})),Uo(No,(async function(e){const t=await Vo(e),a=await e.consume(2*t);return new Int16Array(a.buffer)}),(function(e){return e instanceof Int16Array})),Uo(No,(async function(e){const t=await Vo(e),a=await e.consume(t);return new Uint8ClampedArray(a.buffer)}),(function(e){return e instanceof Uint8ClampedArray})),Uo(No,(async function(e){const t=await Vo(e);return await e.consume(t)}),(function(e){return e instanceof Uint8Array})),Uo(No,(async function(e){const t=await Vo(e),a=await e.consume(t);return new Int8Array(a.buffer)}),(function(e){return e instanceof Int8Array})),Uo((async function(e,t){await Oo(e,t.byteLength),await e.append(new Uint8Array(t))}),(async function(e){const t=await Vo(e);return(await e.consume(t)).buffer}),(function(e){return e instanceof ArrayBuffer})),Uo(Fo,$o,tr),Uo((async function(e,t){const a=new Uint8Array(new Uint32Array([t]).buffer);await e.append(a)}),(async function(e){const t=await e.consume(4);return new Uint32Array(t.buffer)[0]}),(function(e){return ar(e)&&e>=0&&e<=4294967295})),Uo((async function(e,t){const a=new Uint8Array(new Int32Array([t]).buffer);await e.append(a)}),(async function(e){const t=await e.consume(4);return new Int32Array(t.buffer)[0]}),(function(e){return ar(e)&&e>=-2147483648&&e<=2147483647})),Uo((async function(e,t){const a=new Uint8Array(new Uint16Array([t]).buffer);await e.append(a)}),(async function(e){const t=await e.consume(2);return new Uint16Array(t.buffer)[0]}),(function(e){return ar(e)&&e>=0&&e<=65535})),Uo((async function(e,t){const a=new Uint8Array(new Int16Array([t]).buffer);await e.append(a)}),(async function(e){const t=await e.consume(2);return new Int16Array(t.buffer)[0]}),(function(e){return ar(e)&&e>=-32768&&e<=32767})),Uo((async function(e,t){const a=new Uint8Array([t]);await e.append(a)}),(async function(e){const t=await e.consume(1);return new Uint8Array(t.buffer)[0]}),(function(e){return ar(e)&&e>=0&&e<=255})),Uo((async function(e,t){const a=new Uint8Array(new Int8Array([t]).buffer);await e.append(a)}),(async function(e){const t=await e.consume(1);return new Int8Array(t.buffer)[0]}),(function(e){return ar(e)&&e>=-128&&e<=127})),Uo(null,(function(){return}),(function(e){return void 0===e})),Uo(null,(function(){return null}),(function(e){return null===e})),Uo(null,(function(){return NaN}),(function(e){return Number.isNaN(e)})),Uo(jo,Ko,(function(e){return"boolean"==typeof e})),Uo((async function(e,t){await Mo(e,t.description)}),(async function(e){const t=await Jo(e);return Symbol(t)}),nr),Uo(null,(function(){return So}),er),Uo((async function(e,t){const a=t.entries();await Oo(e,t.size);for(const[t,n]of a)await Oo(e,t),await Oo(e,n)}),(async function(e){const t=await Vo(e),a=new Map;t&&await async function n(o=0){const r=await Vo(e),i=await Vo(e);e.setObject([r,i],((e,t)=>a.set(e,t))),o<t-1&&await n(o+1)}();return a}),(function(e){return e instanceof Map})),Uo((async function(e,t){await Oo(e,t.size);for(const a of t)await Oo(e,a)}),(async function(e){const t=await Vo(e),a=new Set;t&&await async function n(o=0){const r=await Vo(e);e.setObject([r],(e=>a.add(e))),o<t-1&&await n(o+1)}();return a}),(function(e){return e instanceof Set})),Uo((async function(e,t){await Fo(e,t.getTime())}),(async function(e){const t=await $o(e);return new Date(t)}),(function(e){return e instanceof Date})),Uo((async function(e,t){await Mo(e,t.message),await Mo(e,t.stack)}),(async function(e){const t=await Jo(e),a=await Jo(e),n=new Error(t);return n.stack=a,n}),(function(e){return e instanceof Error})),Uo((async function(e,t){await Mo(e,t.source),await Mo(e,t.flags)}),(async function(e){const t=await Jo(e),a=await Jo(e);return new RegExp(t,a)}),(function(e){return e instanceof RegExp})),Uo((async function(e,t){await Mo(e,t.valueOf())}),(async function(e){return new String(await Jo(e))}),(function(e){return e instanceof String})),Uo((async function(e,t){await Fo(e,t.valueOf())}),(async function(e){return new Number(await $o(e))}),(function(e){return e instanceof Number})),Uo((async function(e,t){await jo(e,t.valueOf())}),(async function(e){return new Boolean(await Ko(e))}),(function(e){return e instanceof Boolean}));class Wo{constructor(e,t){this.stream=new _o(e,t),this.objects=[]}append(e){return this.stream.append(e)}flush(){return this.stream.flush()}addObject(e){this.objects.push(or(e)&&!Yo(e,this)?e:void 0)}}class _o{constructor(e,t){this.offset=0,this.appendData=e,this.value=new Uint8Array(t)}async append(e){if(this.offset+e.length>this.value.length){const t=this.value.length-this.offset;await this.append(e.subarray(0,t)),await this.appendData({value:this.value}),this.offset=0,await this.append(e.subarray(t))}else this.value.set(e,this.offset),this.offset+=e.length}async flush(){this.offset&&await this.appendData({value:this.value.subarray(0,this.offset),done:!0})}}function Lo(e,{chunkSize:t=xo}={}){let a,n,o,r,i,s;return{[Symbol.asyncIterator]:()=>({next:()=>r?{done:r}:async function(){s?s():c().catch((()=>{}));i=new Promise((e=>s=e));const e=await async function(){const{value:e,done:t}=await n;r=t,t||l();return e}();return{value:e}}(),return:()=>({done:!0})})};async function c(){l(),a=new Wo(u,t),await Oo(a,e),await a.flush()}function l(){n=new Promise((e=>o=e))}async function u(e){o(e),await i}}async function Oo(e,t){const a=Po.findIndex((({test:a}={})=>a&&a(t,e)));e.addObject(t),await e.append(new Uint8Array([a]));const n=Po[a].serialize;n&&await n(e,t),a!=Io&&Zo(t)&&(await async function(e,t){const a=Object.getOwnPropertySymbols(t),n=a.map((e=>[e,t[e]]));await Bo(e,n)}(e,t),await async function(e,t){if(ArrayBuffer.isView(t))await Oo(e,0);else{let a=Object.entries(t);Qo(t)&&(a=a.filter((([e])=>!ar(Number(e))))),await Oo(e,a.length);for(const[t,n]of a)await Mo(e,t),await Oo(e,n)}}(e,t))}async function Bo(e,t){await Oo(e,t.length);const a=Object.keys(t).filter((e=>ar(Number(e)))).map((e=>Number(e)));let n=0,o=a[n];for(const[r,i]of t.entries())o==r?(o=a[++n],await Oo(e,i)):await Oo(e,So)}async function Mo(e,t){const a=Co.encode(t);await Oo(e,a.length),await e.append(a)}async function No(e,t){await Oo(e,t.length),await e.append(t instanceof Uint8Array?t:new Uint8Array(t.buffer))}async function Fo(e,t){const a=new Uint8Array(new Float64Array([t]).buffer);await e.append(a)}async function jo(e,t){const a=new Uint8Array([Number(t)]);await e.append(a)}class qo{constructor(e,t){this.index=e,this.data=t}getObject(){return this.data.objects[this.index]}}class zo{constructor(e){this.stream=new Ho(e),this.objects=[],this.setters=[]}consume(e){return this.stream.consume(e)}getObjectId(){const e=this.objects.length;return this.objects.push(void 0),e}resolveObject(e,t){or(t)&&!Xo(t)&&(this.objects[e]=t)}setObject(e,t){this.setters.push({functionArguments:e,setterFunction:t})}executeSetters(){this.setters.forEach((({functionArguments:e,setterFunction:t})=>{t(...e.map((e=>Xo(e)?e.getObject():e)))}))}}class Ho{constructor(e){this.offset=0,this.value=new Uint8Array(0),this.consumeData=e}async consume(e){if(this.offset+e>this.value.length){const t=this.value.subarray(this.offset,this.value.length),a=await this.consumeData();return t.length+a.length!=this.value.length&&(this.value=new Uint8Array(t.length+a.length)),this.value.set(t),this.value.set(a,t.length),this.offset=0,this.consume(e)}{const t=this.value.slice(this.offset,this.offset+e);return this.offset+=t.length,t}}}async function Vo(e){const t=(await e.consume(1))[0],a=Po[t].parse,n=e.getObjectId(),o=await a(e);return t!=Io&&Zo(o)&&(await async function(e,t){const a=await Go(e);e.setObject([a],(e=>e.forEach((([e,a])=>t[e]=a))))}(e,o),await async function(e,t){const a=await Vo(e);a&&await n();async function n(o=0){const r=await Jo(e),i=await Vo(e);e.setObject([i],(e=>t[r]=e)),o<a-1&&await n(o+1)}}(e,o)),e.resolveObject(n,o),o}async function Go(e){const t=await Vo(e),a=new Array(t);return t&&await async function n(o=0){const r=await Vo(e);er(r)||e.setObject([r],(e=>a[o]=e));o<t-1&&await n(o+1)}(),a}async function Jo(e){const t=await Vo(e),a=await e.consume(t);return Eo.decode(a)}async function $o(e){const t=await e.consume(8);return new Float64Array(t.buffer)[0]}async function Ko(e){const t=await e.consume(1);return Boolean(t[0])}function Yo(e,t){return Zo(e)&&t.objects.includes(e)}function Xo(e){return e instanceof qo}function Zo(e){return e===Object(e)}function Qo(e){return"number"==typeof e.length}function er(e){return e===So}function tr(e){return"number"==typeof e}function ar(e){return tr(e)&&Number.isInteger(e)}function nr(e){return"symbol"==typeof e}function or(e){return Zo(e)||nr(e)}const rr=new Map,ir=new Map,sr="text/html",cr="skip",lr="uniquify",ur=/([{}()^$&.*?/+|[\\\\]|\]|-)/g;let dr="207618107333-h1220p1oasj3050kr5r416661adm091a.apps.googleusercontent.com",fr="VQJ8Gq8Vxx72QyxPyeLtWvUt";const hr=browser.runtime.getManifest().oauth2;hr&&(dr=hr.client_id,fr=hr.client_secret);const wr=new class{constructor(e,t,a){this.clientId=e,this.clientKey=t,this.scopes=a,this.folderIds=new Map,setInterval((()=>this.folderIds.clear()),6e4)}async auth(e={interactive:!0}){return _n(e)?(this.accessToken=await browser.identity.getAuthToken({interactive:e.interactive}),{revokableAccessToken:this.accessToken}):(this.authURL="https://accounts.google.com/o/oauth2/v2/auth?client_id="+this.clientId+"&response_type=code&access_type=offline&redirect_uri="+browser.identity.getRedirectURL()+"&scope="+this.scopes.join(" "),e.code?Wn(this,e):async function(e,t){let a;try{if(browser.identity&&browser.identity.launchWebAuthFlow&&!t.forceWebAuthFlow){const a=await browser.identity.launchWebAuthFlow({interactive:t.interactive,url:e.authURL});return t.code=new URLSearchParams(new URL(a).search).get("code"),await Wn(e,t)}if(t.launchWebAuthFlow)return t.extractAuthCode(browser.identity.getRedirectURL()).then((e=>a=e)).catch((()=>{})),await t.launchWebAuthFlow({url:e.authURL});throw new Error("auth_not_supported")}catch(n){if(n.message&&("code_required"==n.message||n.message.includes("access"))){if(a)return t.code=a,await Wn(e,t);throw new Error("code_required")}throw n}}(this,e))}setAuthInfo(e,t){_n(t)||(e?(this.accessToken=e.accessToken,this.refreshToken=e.refreshToken,this.expirationDate=e.expirationDate):(delete this.accessToken,delete this.refreshToken,delete this.expirationDate))}async refreshAuthToken(){if(this.refreshToken){const e=await fetch(Pn,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"client_id="+this.clientId+"&refresh_token="+this.refreshToken+"&grant_type=refresh_token&client_secret="+this.clientKey});if(400==e.status)throw new Error("unknown_token");const t=await Mn(e);return this.accessToken=t.access_token,t.refresh_token&&(this.refreshToken=t.refresh_token),t.expires_in&&(this.expirationDate=Date.now()+1e3*t.expires_in),{accessToken:this.accessToken,refreshToken:this.refreshToken,expirationDate:this.expirationDate}}try{return browser.identity&&browser.identity.removeCachedAuthToken&&this.accessToken&&await browser.identity.removeCachedAuthToken({token:this.accessToken}),this.accessToken=await browser.identity.getAuthToken({interactive:!1}),{revokableAccessToken:this.accessToken}}catch(e){delete this.accessToken}}async revokeAuthToken(e){if(e){if(browser.identity&&browser.identity.removeCachedAuthToken)try{await browser.identity.removeCachedAuthToken({token:e})}catch(e){}const t=await fetch("https://accounts.google.com/o/oauth2/revoke",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"token="+e});try{await Mn(t)}catch(e){if("invalid_token"!=e.message)throw e}finally{delete this.accessToken,delete this.refreshToken,delete this.expirationDate}}}async upload(e,t,a,n,o=!0){const r=await Ln(this,e),i=e.split("/").pop(),s=new Rn({token:this.accessToken,file:t,parents:[r],filename:i,onProgress:a.onProgress,filenameConflictAction:a.filenameConflictAction,prompt:a.prompt});try{n&&n((()=>s.cancelled=!0)),await s.upload()}catch(r){if("path_not_found"==r.message&&o)return this.folderIds.clear(),this.upload(e,t,a,n);throw r}}}(dr,fr,["https://www.googleapis.com/auth/drive.file"]),mr=new class{constructor(e,t){this.clientId=e,this.clientKey=t}async auth(e={interactive:!0}){return this.authURL="https://www.dropbox.com/oauth2/authorize?client_id="+this.clientId+"&response_type=code&token_access_type=offline&redirect_uri="+browser.identity.getRedirectURL(),e.code?Vn(this,e):async function(e,t){let a;try{return t.extractAuthCode(browser.identity.getRedirectURL()).then((e=>a=e)).catch((()=>{})),await t.launchWebAuthFlow({url:e.authURL})}catch(n){if(n.message&&("code_required"==n.message||n.message.includes("access"))){if(a)return t.code=a,await Vn(e,t);throw new Error("code_required")}throw n}}(this,e)}setAuthInfo(e){e?(this.accessToken=e.accessToken,this.refreshToken=e.refreshToken,this.expirationDate=e.expirationDate):(delete this.accessToken,delete this.refreshToken,delete this.expirationDate)}async refreshAuthToken(){if(this.refreshToken){const e=await fetch(Fn,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"client_id="+this.clientId+"&refresh_token="+this.refreshToken+"&grant_type=refresh_token&client_secret="+this.clientKey});if(400==e.status)throw new Error("unknown_token");const t=await Jn(e);return this.accessToken=t.access_token,t.refresh_token&&(this.refreshToken=t.refresh_token),t.expires_in&&(this.expirationDate=Date.now()+1e3*t.expires_in),{accessToken:this.accessToken,refreshToken:this.refreshToken,expirationDate:this.expirationDate}}delete this.accessToken}async revokeAuthToken(e){if(e){const t=await fetch("https://api.dropboxapi.com/2/auth/token/revoke",{method:"POST",headers:{Authorization:"Bearer "+e}});try{await t.text()}catch(e){if("invalid_token"!=e.message)throw e}finally{delete this.accessToken,delete this.refreshToken,delete this.expirationDate}}}async upload(e,t,a,n){const o=new Hn({token:this.accessToken,file:t,filename:e,onProgress:a.onProgress,filenameConflictAction:a.filenameConflictAction,prompt:a.prompt});n&&n((()=>o.cancelled=!0)),await o.upload()}}("s50p6litdvuzrtb","i1vzwllesr14fzd");async function pr(e,t){if(e.method.endsWith(".download"))return async function(e,t){const a=t.id;let n;if(e.blobURL)try{e.compressContent?(e.pageData=await Ro(new Uint8Array(await(await fetch(e.blobURL)).arrayBuffer())),await gr(e,t)):(e.content=await(await fetch(e.blobURL)).text(),await br([e.content],t,t.incognito,e))}catch(e){return{error:!0}}else if(e.compressContent){let n=ir.get(a);if(n||(n=[],ir.set(a,n)),e.data)n.push(new Uint8Array(e.data));else{ir.delete(a);const e=await Ro(new Uint8Array(await new Blob(n).arrayBuffer()));await gr(e,t)}}else e.truncated?(n=rr.get(a),n||(n=[],rr.set(a,n)),n.push(e.content),e.finished&&rr.delete(a)):e.content&&(n=[e.content]),e.truncated&&!e.finished||await br(n,t,t.incognito,e);return{}}(e,t.tab);if(e.method.endsWith(".disableGDrive")){const e=await te();return re(),await wr.revokeAuthToken(e&&(e.accessToken||e.revokableAccessToken)),{}}if(e.method.endsWith(".disableDropbox")){const e=await ae();return ie(),await mr.revokeAuthToken(e&&(e.accessToken||e.revokableAccessToken)),{}}if(e.method.endsWith(".end")){if(e.hash)try{await En(e.hash,e.woleetKey)}catch(e){ba(t.tab.id,e.message,e.link)}return fn(e.taskId),{}}return e.method.endsWith(".getInfo")?Za.map(bn):e.method.endsWith(".cancel")?(a=e.taskId,pn(Za.find((e=>e.id==a))),{}):e.method.endsWith(".cancelAll")?(Array.from(Za).forEach(pn),{}):e.method.endsWith(".saveUrls")?(rn(e.urls),{}):void 0;var a}async function br(e,t,a,n){const o=t.id;try{let r;if(n.backgroundSave&&!n.saveToGDrive&&!n.saveToDropbox&&!n.saveWithWebDAV&&!n.saveToGitHub){const e=await Sr(n.filename,n);n.filenameConflictAction=e.filenameConflictAction,r=e.skipped}if(r)ya(o);else{const r=e=>Cr(o,e);let i;if(n.openEditor?(ga(o),await he({tabIndex:t.index+1,filename:n.filename,content:e.join("")})):n.saveToClipboard?(n.content=e.join(""),function(e){const t="copy";function a(t){t.clipboardData.setData(sr,e.content),t.clipboardData.setData("text/plain",e.content),t.preventDefault()}document.addEventListener(t,a),document.execCommand(t),document.removeEventListener(t,a)}(n)):n.saveWithWebDAV?i=await xr(n.taskId,yr(n.filename),e.join(""),n.webDAVURL,n.webDAVUser,n.webDAVPassword,{filenameConflictAction:n.filenameConflictAction,prompt:r}):n.saveToGDrive?await Ir(n.taskId,yr(n.filename),new Blob(e,{type:sr}),{forceWebAuthFlow:n.forceWebAuthFlow},{onProgress:(e,t)=>va(o,e,t),filenameConflictAction:n.filenameConflictAction,prompt:r}):n.saveToDropbox?await Tr(n.taskId,yr(n.filename),new Blob(e,{type:sr}),{onProgress:(e,t)=>va(o,e,t),filenameConflictAction:n.filenameConflictAction,prompt:r}):n.saveToGitHub?(i=await Ar(n.taskId,yr(n.filename),e.join(""),n.githubToken,n.githubUser,n.githubRepository,n.githubBranch,{filenameConflictAction:n.filenameConflictAction,prompt:r}),await i.pushPromise):n.saveWithCompanion?await gn({filename:n.filename,content:n.content,filenameConflictAction:n.filenameConflictAction}):(n.url=URL.createObjectURL(new Blob(e,{type:sr})),i=await Er(n,{confirmFilename:n.confirmFilename,incognito:a,filenameConflictAction:n.filenameConflictAction,filenameReplacementCharacter:n.filenameReplacementCharacter,bookmarkId:n.bookmarkId,replaceBookmarkURL:n.replaceBookmarkURL,includeInfobar:n.includeInfobar})),n.bookmarkId&&n.replaceBookmarkURL&&i&&i.url&&await An(n.bookmarkId,{url:i.url}),ya(o),n.openSavedPage&&!n.openEditor){const a={active:!0,url:"/src/ui/pages/viewer.html?blobURI="+URL.createObjectURL(new Blob(e,{type:sr})),windowId:t.windowId};null!=t.index&&(a.index=t.index+1),browser.tabs.create(a)}}}catch(e){e.message&&"upload_cancelled"==e.message||(console.error(e),ba(o,e.message,e.link))}finally{n.url&&URL.revokeObjectURL(n.url)}}async function gr(e,t){const a=t.id;try{let n;if(e.backgroundSave&&!e.saveToGDrive&&!e.saveToDropbox&&!e.saveWithWebDAV&&!e.saveToGitHub){const t=await Sr(e.filename,e);e.filenameConflictAction=t.filenameConflictAction,n=t.skipped}if(n)ya(a);else{const n=e.pageData,o=e=>Cr(a,e),r=await singlefile.processors.compression.process(n,{insertTextBody:e.insertTextBody,url:n.url||t.url,createRootDirectory:e.createRootDirectory,tabId:a,selfExtractingArchive:e.selfExtractingArchive,extractDataFromPage:e.extractDataFromPage,preventAppendedData:e.preventAppendedData,insertCanonicalLink:e.insertCanonicalLink,insertMetaNoIndex:e.insertMetaNoIndex,password:e.password});let i;if(e.openEditor?(ga(a),await he({tabIndex:t.index+1,filename:e.filename,content:Array.from(new Uint8Array(await r.arrayBuffer())),compressContent:e.compressContent,selfExtractingArchive:e.selfExtractingArchive,extractDataFromPage:e.extractDataFromPage,insertTextBody:e.insertTextBody})):e.foregroundSave?await Pr(e.taskId,e.filename,r,a,e.foregroundSave):e.saveWithWebDAV?i=await xr(e.taskId,yr(e.filename),r,e.webDAVURL,e.webDAVUser,e.webDAVPassword,{filenameConflictAction:e.filenameConflictAction,prompt:o}):e.saveToGDrive?await Ir(e.taskId,yr(e.filename),r,{forceWebAuthFlow:e.forceWebAuthFlow},{onProgress:(e,t)=>va(a,e,t),filenameConflictAction:e.filenameConflictAction,prompt:o}):e.saveToDropbox?await Tr(e.taskId,yr(e.filename),r,{onProgress:(e,t)=>va(a,e,t),filenameConflictAction:e.filenameConflictAction,prompt:o}):e.saveToGitHub?(i=await Ar(e.taskId,yr(e.filename),r,e.githubToken,e.githubUser,e.githubRepository,e.githubBranch,{filenameConflictAction:e.filenameConflictAction,prompt:o}),await i.pushPromise):e.backgroundSave?(e.url=URL.createObjectURL(r),i=await Er(e,{confirmFilename:e.confirmFilename,incognito:t.incognito,filenameConflictAction:e.filenameConflictAction,filenameReplacementCharacter:e.filenameReplacementCharacter,bookmarkId:e.bookmarkId,replaceBookmarkURL:e.replaceBookmarkURL,includeInfobar:e.includeInfobar})):await Pr(e.taskId,e.filename,r,a),e.bookmarkId&&e.replaceBookmarkURL&&i&&i.url&&await An(e.bookmarkId,{url:i.url}),ya(a),e.openSavedPage&&!e.openEditor){const e={active:!0,url:"/src/ui/pages/viewer.html?compressed&blobURI="+URL.createObjectURL(r),windowId:t.windowId};null!=t.index&&(e.index=t.index+1),browser.tabs.create(e)}}}catch(e){e.message&&"upload_cancelled"==e.message||(console.error(e),ba(a,e.message,e.link))}finally{e.url&&URL.revokeObjectURL(e.url)}}function yr(e){return e.replace(/#/g,"%23")}async function vr(e,t){let a=await te();const n={interactive:!0,forceWebAuthFlow:e.forceWebAuthFlow,launchWebAuthFlow:e=>Se(e),extractAuthCode:e=>Te(e)};return wr.setAuthInfo(a,n),a&&a.accessToken&&!t||(a=await wr.auth(n),a?await ne(a):await re()),a}async function kr(e){let t=await ae();const a={launchWebAuthFlow:e=>Se(e),extractAuthCode:e=>Te(e)};return mr.setAuthInfo(t),t&&t.accessToken&&!e||(t=await mr.auth(a),t?await oe(t):await ie()),t}async function Ar(e,t,a,n,o,r,i,{filenameConflictAction:s,prompt:c}){try{const l=mn(e);if(!l||!l.cancelled){const l=new Ao(n,o,r,i);return hn(e,(()=>l.abort())),await l.upload(t,a,{filenameConflictAction:s,prompt:c})}}catch(e){throw new Error(e.message+" (GitHub)")}}async function xr(e,t,a,n,o,r,{filenameConflictAction:i,prompt:s}){try{const c=mn(e);if(!c||!c.cancelled){const c=new ro(n,o,r);return hn(e,(()=>c.abort())),await c.upload(t,a,{filenameConflictAction:i,prompt:s})}}catch(e){throw new Error(e.message+" (WebDAV)")}}async function Ir(e,t,a,n,o){try{await vr(n);const r=mn(e);if(!r||!r.cancelled)return await wr.upload(t,a,o,(t=>hn(e,t)))}catch(r){if("invalid_token"==r.message){let r;try{r=await wr.refreshAuthToken()}catch(e){if("unknown_token"!=e.message)throw new Error(e.message+" (Google Drive)");r=await vr(n,!0)}return r?await ne(r):await re(),await Ir(e,t,a,n,o)}throw new Error(r.message+" (Google Drive)")}}async function Tr(e,t,a,n){try{await kr();const o=mn(e);if(!o||!o.cancelled)return await mr.upload(t,a,n,(t=>hn(e,t)))}catch(o){if("invalid_token"==o.message){let o;try{o=await mr.refreshAuthToken()}catch(e){if("unknown_token"!=e.message)throw new Error(e.message+" (Dropbox)");o=await kr(!0)}return o?await oe(o):await ie(),await Tr(e,t,a,n)}throw new Error(o.message+" (Dropbox)")}}async function Sr(e,t){let a,n=t.filenameConflictAction;if(n==cr){(await browser.downloads.search({filenameRegex:"(\\\\|/)"+(o=e,o.replace(ur,"\\$1")+"$"),exists:!0})).length?a=!0:n=lr}var o;return{skipped:a,filenameConflictAction:n}}function Cr(e,t){return browser.tabs.sendMessage(e,{method:"content.prompt",message:"Filename conflict, please enter a new filename",value:t})}async function Er(e,t){const a={url:e.url,saveAs:t.confirmFilename,filename:e.filename,conflictAction:t.filenameConflictAction};t.incognito&&(a.incognito=!0);const n=await l(a,t.filenameReplacementCharacter);if(n.filename){let e=n.filename;return e.startsWith("file:")||(e.startsWith("/")&&(e=e.substring(1)),e="file:///"+yr(e)),{url:e}}}async function Pr(e,t,a,n,o){const r=Lo({filename:t,taskId:e,foregroundSave:o,content:await a.arrayBuffer()});for await(const e of r)await browser.tabs.sendMessage(n,{method:"content.download",data:Array.from(e)});await browser.tabs.sendMessage(n,{method:"content.download"})}const Dr={},Ur={};async function Rr(e,t){if("enableAutoSave"==e.method){const a=await p(t.id);a[t.id].autoSave=e.enabled,await b(a),async function(e){Promise.all([oa(e),Ye(e)])}(t)}if("isAutoSaveEnabled"==e.method)return se(t)}async function Wr(e,t){const a=t.id,n=await J(t.url,!0);if(n){let o;pa(a,1,!0),n.content=e.content,n.url=e.url,n.frames=e.frames,n.canvases=e.canvases,n.fonts=e.fonts,n.stylesheets=e.stylesheets,n.images=e.images,n.posters=e.posters,n.videos=e.videos,n.usedFonts=e.usedFonts,n.shadowRoots=e.shadowRoots,n.referrer=e.referrer,n.updatedResources=e.updatedResources,n.adoptedStyleSheets=e.adoptedStyleSheets,n.visitDate=new Date(e.visitDate),n.backgroundTab=!0,n.autoSave=!0,n.incognito=t.incognito,n.tabId=a,n.tabIndex=t.index,n.keepFilename=n.saveToGDrive||n.saveToGitHub||n.saveWithWebDAV||n.saveToDropbox;try{if(n.autoSaveExternalSave)await async function(e){let t;e.autoSaveExternalSave=!1;try{t=await browser.runtime.sendNativeMessage("singlefile_companion",{method:"externalSave",pageData:e})}catch(e){if(!e.message||!e.message.includes("Native host has exited"))throw e}if(t&&t.error)throw new Error(t.error+" (Companion)")}(n);else{let r;if(n.passReferrerOnError&&xe(),n.tabId=a,o=await function(e,t,a,n={fetch:Na,frameFetch:Fa}){return globalThis.singlefile.getPageData(e,n,t,a)}(n,null,null,{fetch:_r}),!(n.saveToGDrive||n.saveWithWebDAV||n.saveToGitHub||n.saveToDropbox||n.saveWithCompanion)){const e=await Sr(o.filename,n);r=e.skipped,n.filenameConflictAction=e.filenameConflictAction}if(!r){let{content:r}=o;if(n.compressContent&&(r=new Blob([new Uint8Array(r)],{type:"text/html"})),n.saveToGDrive&&(r instanceof Blob||(r=new Blob([r],{type:"text/html"})),await Ir(e.taskId,yr(o.filename),r,n,{forceWebAuthFlow:n.forceWebAuthFlow},n.filenameConflictAction)),n.saveToDropbox?(r instanceof Blob||(r=new Blob([r],{type:"text/html"})),await Tr(e.taskId,yr(o.filename),r,{filenameConflictAction:n.filenameConflictAction})):n.saveWithWebDAV?await xr(e.taskId,yr(o.filename),r,n.webDAVURL,n.webDAVUser,n.webDAVPassword,{filenameConflictAction:n.filenameConflictAction}):n.saveToGitHub?await(await Ar(e.taskId,yr(o.filename),r,n.githubToken,n.githubUser,n.githubRepository,n.githubBranch,{filenameConflictAction:n.filenameConflictAction})).pushPromise:n.saveWithCompanion&&!n.compressContent?await gn({filename:o.filename,content:o.content,filenameConflictAction:n.filenameConflictAction}):(r instanceof Blob||(r=new Blob([r],{type:"text/html"})),o.url=URL.createObjectURL(r),await Er(o,n)),n.openSavedPage){const e={active:!0,url:"/src/ui/pages/viewer.html?compressed=true&blobURI="+URL.createObjectURL(r),windowId:t.windowId},n=t.index;try{await browser.tabs.get(a),e.index=n+1}catch(t){e.index=n}browser.tabs.create(e)}o.hash&&await En(o.hash,n.woleetKey)}}}finally{e.taskId?fn(e.taskId):n.autoClose&&(browser.tabs.remove(Ur[a]||a),delete Ur[a]),o&&o.url&&URL.revokeObjectURL(o.url),ya(a,!0)}}}async function _r(e,t={}){const a=await ye(e,t);return{status:a.status,headers:{get:e=>a.headers.get(e)},arrayBuffer:()=>a.arrayBuffer}}async function Lr(e,t){if(e.method.endsWith(".init")&&(await async function(e,t){await w(e.id);const a=await p(e.id);a[e.id].savedPageDetected=t.savedPageDetected,await b(a)}(t.tab,e),ia(t.tab),function(e){wn(e.id)}(t.tab),async function(e){const[t,a]=await Promise.all([J(e.url,!0),se(e)]);t&&(t.autoSaveLoad||t.autoSaveLoadOrUnload)&&a&&sn([e],{autoSave:!0})}(t.tab)),e.method.endsWith(".getOptions"))return J(e.url);e.method.endsWith(".activate")&&await browser.tabs.update(e.tabId,{active:!0})}browser.tabs.onCreated.addListener((e=>function(e){!function(e){ia(e)}(e)}(e))),browser.tabs.onActivated.addListener((e=>async function(e){const t=await browser.tabs.get(e.tabId);ka(t)}(e))),browser.tabs.onRemoved.addListener((e=>function(e){w(e),function(e){ue.delete(e)}(e),wn(e),async function(e){const t=Dr[e];t?t.autoSaveRemove&&(delete Dr[e],await Wr(t,t.tab)):Dr[e]={removed:!0}}(e)}(e))),browser.tabs.onUpdated.addListener(((e,t)=>async function(e,t){if("complete"==t.status){setTimeout((async()=>{try{await browser.tabs.sendMessage(e,{method:"content.maybeInit"})}catch(e){}}),1500),function(e){delete Dr[e]}(e);const t=await browser.tabs.get(e);if(we(t)){const e=await p(t.id);e[t.id].editorDetected=!0,await b(e),ka(t)}}t.discarded&&async function(e){const t=Dr[e];t?(delete Dr[e],await Wr(t,t.tab)):Dr[e]={discarded:!0}}(e)}(e,t))),browser.tabs.onReplaced.addListener(((e,t)=>function(e,t){(async function(e,t){let a=await p();await h(a,e,t),b(a),await h(d,e,t)})(e,t),async function(e,t){Dr[t]&&!Dr[e]&&(Dr[e]=Dr[t],delete Dr[t],Ur[t]=e)}(e,t),function(e,t){Za.forEach((a=>{a.tab.id==t&&(a.tab.id=e)}))}(e,t)}(e,t))),browser.runtime.onMessage.addListener(((e,t)=>{if("singlefile.frameTree.initResponse"==e.method||"singlefile.frameTree.ackInitRequest"==e.method)return browser.tabs.sendMessage(t.tab.id,e,{frameId:0}),Promise.resolve({})}));const Or=new Map;function Br(e,t){e.delete(t)}browser.runtime.onMessage.addListener(((e,t)=>{if("singlefile.lazyTimeout.setTimeout"==e.method){let a,n=Or.get(t.tab.id);if(n)if(a=n.get(t.frameId),a){const t=a.get(e.type);t&&clearTimeout(t)}else a=new Map;const o=setTimeout((async()=>{try{const a=Or.get(t.tab.id),n=a.get(t.frameId);a&&n&&Br(n,e.type),await browser.tabs.sendMessage(t.tab.id,{method:"singlefile.lazyTimeout.onTimeout",type:e.type})}catch(e){}}),e.delay);return n||(n=new Map,a=new Map,n.set(t.frameId,a),Or.set(t.tab.id,n)),a.set(e.type,o),Promise.resolve({})}if("singlefile.lazyTimeout.clearTimeout"==e.method){let a=Or.get(t.tab.id);if(a){const n=a.get(t.frameId);if(n){const t=n.get(e.type);t&&clearTimeout(t),Br(n,e.type)}}return Promise.resolve({})}})),browser.tabs.onRemoved.addListener((e=>Or.delete(e)));async function Mr(e){return(await browser.tabs.query(e)).sort(((e,t)=>e.index-t.index))}browser.runtime.onMessage.addListener(((e,t)=>e.method.startsWith("tabs.")?Lr(e,t):e.method.startsWith("downloads.")?pr(e,t):e.method.startsWith("autosave.")?async function(e,t){if(e.method.endsWith(".save"))return e.autoSaveDiscard||e.autoSaveRemove?(t.tab?(e.tab=t.tab,Dr[t.tab.id]=e):Dr[e.tabId]&&(Dr[e.tabId].removed&&e.autoSaveRemove||Dr[e.tabId].discarded&&e.autoSaveDiscard)&&(delete Dr[e.tabId],await Wr(e,{id:e.tabId,index:e.tabIndex,url:t.url})),e.autoSaveUnload&&(delete Dr[e.tabId],await Wr(e,t.tab))):(delete Dr[e.tabId],await Wr(e,t.tab)),{}}(e,t):e.method.startsWith("ui.")?wa(e,t):e.method.startsWith("config.")?V(e):e.method.startsWith("tabsData.")?function(e){return e.method.endsWith(".get")?p():e.method.endsWith(".set")?b(e.tabsData):void 0}(e):e.method.startsWith("devtools.")?async function(e){e.method.endsWith(".resourceCommitted")&&e.tabId&&e.url&&("stylesheet"==e.type||"script"==e.type)&&await browser.tabs.sendMessage(e.tabId,e)}(e):e.method.startsWith("editor.")?async function(e,t){if(e.method.endsWith(".getTabData")){const e=t.tab,a=ue.get(e.id);if(a){const t=await J(a.url),n=JSON.stringify(a);for(let o=0;o*ce<n.length;o++){const r={method:"editor.setTabData",compressContent:a.compressContent};r.truncated=n.length>ce,r.truncated?(r.finished=(o+1)*ce>n.length,r.content=n.substring(o*ce,(o+1)*ce),r.finished&&(r.options=t)):(r.content=n,r.options=t),await browser.tabs.sendMessage(e.id,r)}}return{}}if(e.method.endsWith(".open")){let a;const n=t.tab;if(e.truncated?(a=de.get(n.id),a||(a=[],de.set(n.id,a)),a.push(e.content),e.finished&&de.delete(n.id)):e.content&&(a=[e.content]),!e.truncated||e.finished){const t={url:le};await browser.tabs.update(n.id,t);const o=e.compressContent?a.flat():a.join("");ue.set(n.id,{url:n.url,content:o,filename:e.filename,compressContent:e.compressContent,selfExtractingArchive:e.selfExtractingArchive,extractDataFromPageTags:e.extractDataFromPageTags,insertTextBody:e.insertTextBody})}return{}}if(e.method.endsWith(".ping"))return{}}(e,t):e.method.startsWith("bookmarks.")?vn(e):e.method.startsWith("companion.")?async function(e){if(e.method.endsWith(".state"))return{enabled:!0}}(e):e.method.startsWith("requests.")?ke(e):e.method.startsWith("bootstrap.")?async function(e,t){if(e.method.endsWith(".init")){const[e,a,n]=await Promise.all([J(t.tab.url,!0),J(t.tab.url),se(t.tab)]);return{optionsAutoSave:e,options:a,autoSaveEnabled:n,tabId:t.tab.id,tabIndex:t.tab.index}}}(e,t):void 0)),browser.runtime.onMessageExternal&&browser.runtime.onMessageExternal.addListener((async function(e,t){if("save-page"==e){const e=await browser.tabs.query({currentWindow:!0,active:!0});e.length=1,await sn(e)}else if("edit-and-save-page"==e){const e=await browser.tabs.query({currentWindow:!0,active:!0});e.length=1,await sn(e,{openEditor:!0})}else if("save-selected-links"==e){const e=await browser.tabs.query({currentWindow:!0,active:!0});await nn(e[0])}else if("save-selected-content"==e){const e=await browser.tabs.query({currentWindow:!0,active:!0});await sn(e,{selected:!0})}else if("save-selected-tabs"==e){const e=await Mr({currentWindow:!0,highlighted:!0});await sn(e)}else if("save-unpinned-tabs"==e){const e=await Mr({currentWindow:!0,pinned:!1});await sn(e)}else if("save-all-tabs"==e){const e=await Mr({currentWindow:!0});await sn(e)}else if(e.method){const t=(await browser.tabs.query({currentWindow:!0,active:!0}))[0];return!!t&&Rr(e,t)}}))}();