// ==UserScript==
// @name Material Icons for GitHub
// @version 1.10.4
// @description Material icons for the file browser of popular websites like GitHub, Azure, Bitbucket etc.
// @namespace material-icons-for-github
// @author Converter Script
// @match *://github.com/*
// @match *://bitbucket.org/*
// @match *://dev.azure.com/*
// @match *://*.visualstudio.com/*
// @match *://gitea.com/*
// @match *://gitlab.com/*
// @match *://gitee.com/*
// @match *://sourceforge.net/*
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_listValues
// @grant GM_deleteValue
// @grant GM_xmlhttpRequest
// @grant GM_registerMenuCommand
// @grant GM_openInTab
// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAADwElEQVR4nNWaz0sVURTH732ZuzYZmdky6c/oDwjEirl3zKA2pvQTatOuokUZldWi9+acB+XCzaNtPQvyR4uy5FmgRf4IAt1Jgr/ALLxx77wn78fMvJnxjm+68AURRj/fM2funHPuEKJjGc8OEAPaKYPHlMFrymGGMlykHH5TjuuUwy/K4TtlkKUcewlHTkxsJDVd7dY+YuJlyvET5SiCCzYpw1FiwgVi4N6dA++AQyrSHNfCgTuIwSpl8JCY6YPRgZ+zdhNuXaEcV7SB8wqtEY43iZGp1wtvpI9QDl8iBBdld2SctCdb9MAz62TEURcuJpYIS7dtD57DWcrxz47D860H/S9h2BUO3oDu2oFjsYlNYkBnwMjjCem+9vBYdCf8ppOBh2X+1R4ay7UiN5Mq8Jl6yvFzDGCFi3JqO/dInesxgBReIgyvuUQ/2azeiDGApNVSqcNqquCnDB/FAE74E9wvpW/ra9Ba20QtBqulBSCDS34v3mWmRWvPgOhMjTjq2J2sSJjRmyDMOl+UPjDm98LbL3JiY2PDU5n3s2LPmecR3wUctelNbFS1uc8LByfmqhqQmltYEtnxn76VfvtNNHf3B3kONu2mSHZSAZwPT877MhBG/e+mJZj/NDKAkXxz4vuika/RGRienBcJIxnERC+hHAfiZiDBUv5MMHwl9//Z2Bkw/JqAGWJPDOJpIFHNBMMFkh99xMcAS5XJ8jKxLlNoI94GUl4mlIHF/8FAQhkAhxRi8CO+BqxSlZtgOC0NvImnAasCvqCiXeilfA88iZ8ByxHcwUSv7MJOxcuAVRU+wUCmj11KBC3mhnwWc2E0ODHnDS4jn4enzMoXcxGU02F1KzNWBV41M7Y4fihq5tXQ1n9DczcrOlNDeQ1rUWtPVtSZ6JkyW/AMShsaOesP2lKqh63w2neS435efYdJeEVdRV5ppeJMIWhZ7WrCEzwAPHOFl7+/53ZwEXisoiC0Rx3K8r1Y1rI60tI52LKhIo46t0U4XHWG3+Zo0d2EjqhDoYTIkaM36twNbHO4a0dRf9Tp1oNbbbirYbxuQ+mMOsi8/0tMq5UEWgy7whgoMRF8exQO8CEOODQcMWlIGaEiH/qIqbBMOE45LOsw4R8cZK2zFDxt3FZ7skUefYYzIXeogPAcc3IzIVqX3L5UzRTubvgDh4gOuotXh9VEGT4I/tb2TJdV+Tfd37BRrLa+BsLxIuXw0X8/Ubq7UFkS7/jHHk5LNhbMMmWLpz6pYTilph1yZGNL/jxV8rnN6af7dfzvfzlz3XrDjDi5AAAAAElFTkSuQmCC
// @run-at document-start
// ==/UserScript==
console.log("Script start:",performance.now());const e=!0,t=e=>e,o="passthrough";let s,c={createHTML:t,createScript:t,createScriptURL:t},i=!1;const r=()=>{try{void 0!==window.isSecureContext&&window.isSecureContext&&window.trustedTypes&&window.trustedTypes.createPolicy&&(i=!0,trustedTypes.defaultPolicy?(l("TT Default Policy exists"),c=window.trustedTypes.createPolicy("default",c),s=trustedTypes.defaultPolicy,l(`Created custom passthrough policy, in case the default policy is too restrictive: Use Policy '${o}' in var 'TTP':`,c)):s=c=window.trustedTypes.createPolicy("default",c),l("Trusted-Type Policies: TTP:",c,"TTP_default:",s))}catch(e){l(e)}},l=(...e)=>{console.log(...e)};r();
(function() {
// #region Logging
const SCRIPT_NAME = "Material Icons for GitHub";
const _log = (...args) => {};
const _warn = (...args) => console.warn(`[${typeof SCRIPT_NAME === 'string' ? SCRIPT_NAME : '[USERSCRIPT_CONVERTED]'}]`, ...args);
const _error = (...args) => {
let e = args[0];
console.error(`[${typeof SCRIPT_NAME === 'string' ? SCRIPT_NAME : '[USERSCRIPT_CONVERTED]'}]`, ...args);
}
// #endregion
// #region Unified Polyfill
// #region Messaging implementation
function createEventBus(
scopeId,
type = "page", // "page" or "iframe"
{ allowedOrigin = "*", children = [], parentWindow = null } = {}
) {
if (!scopeId) throw new Error("createEventBus requires a scopeId");
const handlers = {};
function handleIncoming(ev) {
if (allowedOrigin !== "*" && ev.origin !== allowedOrigin) return;
const msg = ev.data;
if (!msg || msg.__eventBus !== true || msg.scopeId !== scopeId) return;
const { event, payload } = msg;
// PAGE: if it's an INIT from an iframe, adopt it
if (type === "page" && event === "__INIT__") {
const win = ev.source;
if (win && !children.includes(win)) {
children.push(win);
}
return;
}
(handlers[event] || []).forEach((fn) =>
fn(payload, { origin: ev.origin, source: ev.source })
);
}
window.addEventListener("message", handleIncoming);
function emitTo(win, event, payload) {
const envelope = {
__eventBus: true,
scopeId,
event,
payload,
};
win.postMessage(envelope, allowedOrigin);
}
// IFRAME: announce to page on startup
if (type === "iframe") {
setTimeout(() => {
const pw = parentWindow || window.parent;
if (pw && pw.postMessage) {
emitTo(pw, "__INIT__", null);
}
}, 0);
}
return {
on(event, fn) {
handlers[event] = handlers[event] || [];
handlers[event].push(fn);
},
off(event, fn) {
if (!handlers[event]) return;
handlers[event] = handlers[event].filter((h) => h !== fn);
},
/**
* Emits an event.
* @param {string} event - The event name.
* @param {any} payload - The event payload.
* @param {object} [options] - Emission options.
* @param {Window} [options.to] - A specific window to target. If provided, message is ONLY sent to the target.
*/
emit(event, payload, { to } = {}) {
// If a specific target window is provided, send only to it and DO NOT dispatch locally.
// This prevents a port from receiving its own messages.
if (to) {
if (to && typeof to.postMessage === "function") {
emitTo(to, event, payload);
}
return; // Exit after targeted send.
}
// For broadcast messages (no 'to' target), dispatch locally first.
(handlers[event] || []).forEach((fn) =>
fn(payload, { origin: location.origin, source: window })
);
// Then propagate the broadcast to other windows.
if (type === "page") {
children.forEach((win) => emitTo(win, event, payload));
} else {
const pw = parentWindow || window.parent;
if (pw && pw.postMessage) {
emitTo(pw, event, payload);
}
}
},
};
}
function createRuntime(type = "background", bus) {
let nextId = 1;
const pending = {};
const msgListeners = [];
let nextPortId = 1;
const ports = {};
const onConnectListeners = [];
function parseArgs(args) {
let target, message, options, callback;
const arr = [...args];
if (arr.length === 0) {
throw new Error("sendMessage requires at least one argument");
}
if (arr.length === 1) {
return { message: arr[0] };
}
// last object could be options
if (
arr.length &&
typeof arr[arr.length - 1] === "object" &&
!Array.isArray(arr[arr.length - 1])
) {
options = arr.pop();
}
// last function is callback
if (arr.length && typeof arr[arr.length - 1] === "function") {
callback = arr.pop();
}
if (
arr.length === 2 &&
(typeof arr[0] === "string" || typeof arr[0] === "number")
) {
[target, message] = arr;
} else {
[message] = arr;
}
return { target, message, options, callback };
}
if (type === "background") {
bus.on("__REQUEST__", ({ id, message }, { source }) => {
let responded = false,
isAsync = false;
function sendResponse(resp) {
if (responded) return;
responded = true;
// Target the response directly back to the window that sent the request.
bus.emit("__RESPONSE__", { id, response: resp }, { to: source });
}
const results = msgListeners
.map((fn) => {
try {
// msg, sender, sendResponse
const ret = fn(message, { id, tab: { id: source } }, sendResponse);
if (ret === true || (ret && typeof ret.then === "function")) {
isAsync = true;
return ret;
}
return ret;
} catch (e) {
_error(e);
}
})
.filter((r) => r !== undefined);
const promises = results.filter((r) => r && typeof r.then === "function");
if (!isAsync && promises.length === 0) {
const out = results.length === 1 ? results[0] : results;
sendResponse(out);
} else if (promises.length) {
Promise.all(promises).then((vals) => {
if (!responded) {
const out = vals.length === 1 ? vals[0] : vals;
sendResponse(out);
}
});
}
});
}
if (type !== "background") {
bus.on("__RESPONSE__", ({ id, response }) => {
const entry = pending[id];
if (!entry) return;
entry.resolve(response);
if (entry.callback) entry.callback(response);
delete pending[id];
});
}
function sendMessage(...args) {
// Background should be able to send message to itself
// if (type === "background") {
// throw new Error("Background cannot sendMessage to itself");
// }
const { target, message, callback } = parseArgs(args);
const id = nextId++;
const promise = new Promise((resolve) => {
pending[id] = { resolve, callback };
bus.emit("__REQUEST__", { id, message });
});
return promise;
}
bus.on("__PORT_CONNECT__", ({ portId, name }, { source }) => {
if (type !== "background") return;
const backgroundPort = makePort("background", portId, name, source);
ports[portId] = backgroundPort;
onConnectListeners.forEach((fn) => fn(backgroundPort));
// send back a CONNECT_ACK so the client can
// start listening on its end:
bus.emit("__PORT_CONNECT_ACK__", { portId, name }, { to: source });
});
// Clients handle the ACK and finalize their Port object by learning the remote window.
bus.on("__PORT_CONNECT_ACK__", ({ portId, name }, { source }) => {
if (type === "background") return; // ignore
const p = ports[portId];
if (!p) return;
// Call the port's internal finalize method to complete the handshake
if (p._finalize) {
p._finalize(source);
}
});
// Any port message travels via "__PORT_MESSAGE__"
bus.on("__PORT_MESSAGE__", (envelope, { source }) => {
const { portId } = envelope;
const p = ports[portId];
if (!p) return;
p._receive(envelope, source);
});
// Any port disconnect:
bus.on("__PORT_DISCONNECT__", ({ portId }) => {
const p = ports[portId];
if (!p) return;
p._disconnect();
delete ports[portId];
});
// Refactored makePort to correctly manage internal state and the connection handshake.
function makePort(side, portId, name, remoteWindow) {
let onMessageHandlers = [];
let onDisconnectHandlers = [];
let buffer = [];
// Unique instance ID for this port instance
const instanceId = Math.random().toString(36).slice(2) + Date.now();
// These state variables are part of the closure and are updated by _finalize
let _ready = side === "background";
function _drainBuffer() {
buffer.forEach((m) => _post(m));
buffer = [];
}
function _post(msg) {
// Always use the 'to' parameter for port messages, making them directional.
// Include senderInstanceId
bus.emit(
"__PORT_MESSAGE__",
{ portId, msg, senderInstanceId: instanceId },
{ to: remoteWindow }
);
}
function postMessage(msg) {
if (!_ready) {
buffer.push(msg);
} else {
_post(msg);
}
}
function _receive(envelope, source) {
// envelope: { msg, senderInstanceId }
if (envelope.senderInstanceId === instanceId) return; // Don't dispatch to self
onMessageHandlers.forEach((fn) =>
fn(envelope.msg, { id: portId, tab: { id: source } })
);
}
function disconnect() {
// Also use the 'to' parameter for disconnect messages
bus.emit("__PORT_DISCONNECT__", { portId }, { to: remoteWindow });
_disconnect();
delete ports[portId];
}
function _disconnect() {
onDisconnectHandlers.forEach((fn) => fn());
onMessageHandlers = [];
onDisconnectHandlers = [];
}
// This function is called on the client port when the ACK is received from background.
// It updates the port's state, completing the connection.
function _finalize(win) {
remoteWindow = win; // <-- This is the crucial part: learn the destination
_ready = true;
_drainBuffer();
}
return {
name,
sender: {
id: portId,
},
onMessage: {
addListener(fn) {
onMessageHandlers.push(fn);
},
removeListener(fn) {
onMessageHandlers = onMessageHandlers.filter((x) => x !== fn);
},
},
onDisconnect: {
addListener(fn) {
onDisconnectHandlers.push(fn);
},
removeListener(fn) {
onDisconnectHandlers = onDisconnectHandlers.filter((x) => x !== fn);
},
},
postMessage,
disconnect,
// Internal methods used by the runtime
_receive,
_disconnect,
_finalize, // Expose the finalizer for the ACK handler
};
}
function connect(connectInfo = {}) {
if (type === "background") {
throw new Error("Background must use onConnect, not connect()");
}
const name = connectInfo.name || "";
const portId = nextPortId++;
// create the client side port
// remoteWindow is initially null; it will be set by _finalize upon ACK.
const clientPort = makePort("client", portId, name, null);
ports[portId] = clientPort;
// fire the connect event across the bus
bus.emit("__PORT_CONNECT__", { portId, name });
return clientPort;
}
function onConnect(fn) {
if (type !== "background") {
throw new Error("connect event only fires in background");
}
onConnectListeners.push(fn);
}
return {
// rpc:
sendMessage,
onMessage: {
addListener(fn) {
msgListeners.push(fn);
},
removeListener(fn) {
const i = msgListeners.indexOf(fn);
if (i >= 0) msgListeners.splice(i, 1);
},
},
// port API:
connect,
onConnect: {
addListener(fn) {
onConnect(fn);
},
removeListener(fn) {
const i = onConnectListeners.indexOf(fn);
if (i >= 0) onConnectListeners.splice(i, 1);
},
},
};
}
// #region Abstraction layer Handle postmesage for
(function () {
const pendingRequests = new Map(); // requestId -> { resolve, reject, timeout }
let nextRequestId = 1;
window.addEventListener("message", async (event) => {
const { type, requestId, method, args } = event.data;
if (type === "abstraction-request") {
try {
let result;
switch (method) {
case "_storageSet":
result = await _storageSet(args[0]);
break;
case "_storageGet":
result = await _storageGet(args[0]);
break;
case "_storageRemove":
result = await _storageRemove(args[0]);
break;
case "_storageClear":
result = await _storageClear();
break;
case "_cookieList":
result = await _cookieList(args[0]);
break;
case "_cookieSet":
result = await _cookieSet(args[0]);
break;
case "_cookieDelete":
result = await _cookieDelete(args[0]);
break;
case "_fetch":
result = await _fetch(args[0], args[1]);
break;
case "_registerMenuCommand":
result = _registerMenuCommand(args[0], args[1]);
break;
case "_openTab":
result = _openTab(args[0], args[1]);
break;
case "_initStorage":
result = await _initStorage();
break;
default:
throw new Error(`Unknown abstraction method: ${method}`);
}
event.source.postMessage({
type: "abstraction-response",
requestId,
success: true,
result,
});
} catch (error) {
event.source.postMessage({
type: "abstraction-response",
requestId,
success: false,
error: {
message: error.message,
stack: error.stack,
},
});
}
}
});
_log("[PostMessage Handler] Abstraction layer message handler initialized");
})();
// #endregion
// #region Abstraction Layer Userscript Target
async function _storageSet(items) {
try {
for (const key in items) {
if (items.hasOwnProperty(key)) {
await GM_setValue(key, items[key]);
}
}
return Promise.resolve();
} catch (e) {
_error("GM_setValue error:", e);
return Promise.reject(e);
}
}
async function _storageGet(keys) {
if (!keys) {
keys = null;
}
if (
Array.isArray(keys) &&
(keys.length === 0 || [null, undefined].includes(keys[0]))
) {
keys = null;
}
try {
const results = {};
let keyList = [];
let defaults = {};
let requestedKeys = [];
if (keys === null) {
keyList = await GM_listValues();
requestedKeys = [...keyList];
} else if (typeof keys === "string") {
keyList = [keys];
requestedKeys = [keys];
} else if (Array.isArray(keys)) {
keyList = keys;
requestedKeys = [...keys];
} else if (typeof keys === "object" && keys !== null) {
keyList = Object.keys(keys);
requestedKeys = [...keyList];
defaults = keys;
} else {
_error("_storageGet error: Invalid keys format", keys);
return Promise.reject(new Error("Invalid keys format for get"));
}
for (const key of keyList) {
const defaultValue = defaults.hasOwnProperty(key)
? defaults[key]
: undefined;
const storedValue = await GM_getValue(key, defaultValue);
results[key] = storedValue;
}
const finalResult = {};
for (const key of requestedKeys) {
if (results.hasOwnProperty(key)) {
finalResult[key] = results[key];
} else if (defaults.hasOwnProperty(key)) {
finalResult[key] = defaults[key];
}
}
return Promise.resolve(finalResult);
} catch (e) {
_error("GM_getValue/GM_listValues error:", e);
return Promise.reject(e);
}
}
async function _storageRemove(keysToRemove) {
try {
let keyList = [];
if (typeof keysToRemove === "string") {
keyList = [keysToRemove];
} else if (Array.isArray(keysToRemove)) {
keyList = keysToRemove;
} else {
_error("_storageRemove error: Invalid keys format", keysToRemove);
return Promise.reject(new Error("Invalid keys format for remove"));
}
for (const key of keyList) {
await GM_deleteValue(key);
}
return Promise.resolve();
} catch (e) {
_error("GM_deleteValue error:", e);
return Promise.reject(e);
}
}
async function _storageClear() {
try {
const keys = await GM_listValues();
await Promise.all(keys.map((key) => GM_deleteValue(key)));
return Promise.resolve();
} catch (e) {
_error("GM_listValues/GM_deleteValue error during clear:", e);
return Promise.reject(e);
}
}
async function _cookieList(details) {
return new Promise((resolve, reject) => {
if (typeof GM_cookie === "undefined" || !GM_cookie.list) {
return reject(new Error("GM_cookie.list is not available."));
}
GM_cookie.list(details, (cookies, error) => {
if (error) {
return reject(new Error(error));
}
resolve(cookies);
});
});
}
async function _cookieSet(details) {
return new Promise((resolve, reject) => {
if (typeof GM_cookie === "undefined" || !GM_cookie.set) {
return reject(new Error("GM_cookie.set is not available."));
}
GM_cookie.set(details, (error) => {
if (error) {
return reject(new Error(error));
}
resolve();
});
});
}
async function _cookieDelete(details) {
return new Promise((resolve, reject) => {
if (typeof GM_cookie === "undefined" || !GM_cookie.delete) {
return reject(new Error("GM_cookie.delete is not available."));
}
GM_cookie.delete(details, (error) => {
if (error) {
return reject(new Error(error));
}
resolve();
});
});
}
async function _fetch(url, options = {}) {
return new Promise((resolve, reject) => {
try {
GM_xmlhttpRequest({
method: options.method || "GET",
url: url,
headers: options.headers || {},
data: options.body,
responseType: options.responseType,
timeout: options.timeout || 0,
binary:
options.responseType === "blob" ||
options.responseType === "arraybuffer",
onload: function (response) {
const responseHeaders = {};
if (response.responseHeaders) {
response.responseHeaders
.trim()
.split("\\r\\n")
.forEach((header) => {
const parts = header.match(/^([^:]+):\s*(.*)$/);
if (parts && parts.length === 3) {
responseHeaders[parts[1].toLowerCase()] = parts[2];
}
});
}
const mockResponse = {
ok: response.status >= 200 && response.status < 300,
status: response.status,
statusText:
response.statusText ||
(response.status >= 200 && response.status < 300 ? "OK" : ""),
url: response.finalUrl || url,
headers: new Headers(responseHeaders),
text: () => Promise.resolve(response.responseText),
json: () => {
try {
return Promise.resolve(JSON.parse(response.responseText));
} catch (e) {
return Promise.reject(new SyntaxError("Could not parse JSON"));
}
},
blob: () => {
if (response.response instanceof Blob) {
return Promise.resolve(response.response);
}
return Promise.reject(
new Error("Requires responseType:'blob' in GM_xmlhttpRequest")
);
},
arrayBuffer: () => {
if (response.response instanceof ArrayBuffer) {
return Promise.resolve(response.response);
}
return Promise.reject(
new Error(
"Requires responseType:'arraybuffer' in GM_xmlhttpRequest"
)
);
},
clone: function () {
const cloned = { ...this };
cloned.text = () => Promise.resolve(response.responseText);
cloned.json = () => this.json();
cloned.blob = () => this.blob();
cloned.arrayBuffer = () => this.arrayBuffer();
return cloned;
},
};
if (mockResponse.ok) {
resolve(mockResponse);
} else {
const error = new Error(`HTTP error! status: ${response.status}`);
error.response = mockResponse;
reject(error);
}
},
onerror: function (response) {
reject(
new Error(
`GM_xmlhttpRequest network error: ${
response.statusText || "Unknown Error"
}`
)
);
},
onabort: function () {
reject(new Error("GM_xmlhttpRequest aborted"));
},
ontimeout: function () {
reject(new Error("GM_xmlhttpRequest timed out"));
},
});
} catch (e) {
_error("_fetch (GM_xmlhttpRequest) error:", e);
reject(e);
}
});
}
function _registerMenuCommand(name, func) {
if (typeof GM_registerMenuCommand === "function") {
try {
GM_registerMenuCommand(name, func);
} catch (e) {
_error("GM_registerMenuCommand failed:", e);
}
} else {
_warn("GM_registerMenuCommand not available.");
}
}
function _openTab(url, active) {
if (typeof GM_openInTab === "function") {
try {
GM_openInTab(url, { loadInBackground: !active });
} catch (e) {
_error("GM_openInTab failed:", e);
}
} else {
_warn("GM_openInTab not available, using window.open as fallback.");
try {
window.open(url);
} catch (e) {
_error("window.open fallback failed:", e);
}
}
}
async function _initStorage() {
return Promise.resolve();
}
const EXTENSION_ASSETS_MAP = {
"options.html": "\n\n
\n Material Icons\n \n \n \n \n \n \n\n",
"settings-popup.html": "\n\n \n Material Icons\n \n \n \n \n \n \n\n",
"folder-vue-directives-open.svg": "",
"vscode.svg": "",
"pascal.svg": "",
"fortran.svg": "",
"folder-test.svg": "",
"abc.svg": "",
"search.svg": "",
"taskfile.svg": "",
"folder-circleci.svg": "",
"cuda.svg": "",
"stackblitz.svg": "",
"mathematica.svg": "",
"folder-project-open.svg": "",
"folder-job.svg": "",
"folder-redux-store.clone.svg": "",
"folder-node.svg": "",
"kcl.svg": "",
"ngrx-effects.svg": "",
"folder-svelte-open.svg": "",
"folder-container-open.svg": "",
"folder-verdaccio-open.svg": "",
"raml.svg": "",
"folder-event.svg": "",
"figma.svg": "",
"bench-jsx.svg": "",
"parcel.svg": "",
"folder-changesets.svg": "",
"folder-class.svg": "",
"folder-vue-directives.svg": "",
"toml_light.svg": "",
"folder-import-open.svg": "",
"folder-upload.svg": "",
"nano-staged_light.svg": "",
"folder-rules.svg": "",
"folder-constant-open.svg": "",
"gemini.svg": "",
"folder-interface-open.svg": "",
"poetry.svg": "",
"folder-php.svg": "",
"pnpm.svg": "",
"folder-font.svg": "",
"folder-circleci-open.svg": "",
"folder-ios-open.svg": "",
"trigger.svg": "",
"folder-markdown-open.svg": "",
"purescript.svg": "",
"folder-intellij.svg": "",
"minecraft.svg": "",
"cypress.svg": "",
"elm.svg": "",
"folder-forgejo-open.svg": "",
"vue-config.svg": "",
"turborepo.svg": "",
"folder-cline-open.svg": "",
"mist.clone.svg": "",
"folder-mappings.svg": "",
"folder-upload-open.svg": "",
"replit.svg": "",
"folder-css.svg": "",
"folder-moon.svg": "",
"hex.svg": "",
"folder-bloc.svg": "",
"velocity.svg": "",
"folder-shared-open.svg": "",
"verdaccio.svg": "",
"folder-components.svg": "",
"matlab.svg": "",
"folder-context-open.svg": "",
"folder-node-open.svg": "",
"folder-godot-open.svg": "",
"folder-python-open.svg": "",
"latexmk.svg": "",
"folder-log-open.svg": "",
"rc.svg": "",
"folder-jupyter.svg": "",
"odin.svg": "",
"handlebars.svg": "",
"cabal.svg": "",
"folder-sandbox-open.svg": "",
"folder-cypress-open.svg": "",
"folder-gitea.svg": "",
"folder-expo-open.svg": "",
"folder-prisma.svg": "",
"folder-download-open.svg": "",
"folder-log.svg": "",
"webpack.svg": "",
"lefthook.svg": "",
"remix_light.svg": "",
"jinja.svg": "",
"packship.svg": "",
"folder-pdf.svg": "",
"javascript.svg": "",
"folder-batch.svg": "",
"adobe-illustrator_light.svg": "",
"dtx.clone.svg": "",
"harmonix.svg": "",
"folder-syntax-open.svg": "",
"folder-job-open.svg": "",
"folder-guard-open.svg": "",
"windicss.svg": "",
"luau.svg": "",
"folder-unity.svg": "",
"folder-ngrx-entities-open.clone.svg": "",
"folder-packages.svg": "",
"nunjucks.svg": "",
"folder-src-tauri-open.svg": "",
"folder-terraform.svg": "",
"nodejs_alt.svg": "",
"rbxmk.svg": "",
"folder-netlify.svg": "",
"panda.svg": "",
"folder-graphql-open.svg": "",
"folder-api.svg": "",
"doctex.clone.svg": "",
"android.svg": "",
"vue.svg": "",
"mdsvex.svg": "",
"dhall.svg": "",
"folder-gradle.svg": "",
"xml.svg": "",
"todo.svg": "",
"moonscript.svg": "",
"folder-redux-selector-open.clone.svg": "",
"astyle.svg": "",
"http.svg": "",
"folder-layout.svg": "",
"nano-staged.svg": "",
"ruff.svg": "",
"nest-guard.clone.svg": "",
"folder-animation-open.svg": "",
"folder-store-open.svg": "",
"mint.svg": "",
"jupyter.svg": "",
"vitest.svg": "",
"copilot_light.svg": "",
"puppet.svg": "",
"gitlab.svg": "",
"citation.svg": "",
"mermaid.svg": "",
"wallaby.svg": "",
"sequelize.svg": "",
"folder-flow-open.svg": "",
"folder-ci-open.svg": "",
"folder-helper.svg": "",
"stryker.svg": "",
"folder-i18n.svg": "",
"folder-mail-open.svg": "",
"folder-less.svg": "",
"powerpoint.svg": "",
"sass.svg": "",
"rust.svg": "",
"huff.svg": "",
"pug.svg": "",
"supabase.svg": "",
"cline.svg": "",
"rome.svg": "",
"firebase.svg": "",
"folder-directive.svg": "",
"folder-policy-open.svg": "",
"java.svg": "",
"vuex-store.svg": "",
"folder-content.svg": "",
"folder-store.svg": "",
"buck.svg": "",
"folder-views-open.svg": "",
"apiblueprint.svg": "",
"folder-webpack.svg": "",
"folder-base.svg": "",
"nim.svg": "",
"gcp.svg": "",
"bitbucket.svg": "",
"phpstan.svg": "",
"tobimake.svg": "",
"haskell.svg": "",
"appveyor.svg": "",
"angular-interceptor.clone.svg": "",
"zeabur.svg": "",
"restql.svg": "",
"quasar.svg": "",
"folder-routes.svg": "",
"systemd_light.svg": "",
"nest-decorator.clone.svg": "",
"code-climate_light.svg": "",
"nest-resolver.clone.svg": "",
"folder-changesets-open.svg": "",
"folder-scala.svg": "",
"otne.svg": "",
"liara.svg": "",
"folder-mobile.svg": "",
"folder-keys-open.svg": "",
"redux-action.svg": "",
"folder-wordpress-open.svg": "",
"just.svg": "",
"folder-android.svg": "",
"folder-images-open.svg": "",
"nest-controller.clone.svg": "",
"folder-mock.svg": "",
"netlify.svg": "",
"quokka.svg": "",
"svgo.svg": "",
"folder-svg.svg": "",
"folder-connection-open.svg": "",
"folder-aws-open.svg": "",
"label.svg": "",
"minecraft-fabric.svg": "",
"verified.svg": "",
"database.svg": "",
"folder-scons.svg": "",
"folder-bicep.svg": "",
"commitizen.svg": "",
"stitches_light.svg": "",
"tsconfig.svg": "",
"folder-generator.svg": "",
"solidity.svg": "",
"vedic.svg": "",
"folder-kubernetes-open.svg": "",
"blitz.svg": "",
"folder-config-open.svg": "",
"snyk.svg": "",
"livescript.svg": "",
"helm.svg": "",
"folder-command-open.svg": "",
"adobe-swc.svg": "",
"file.svg": "",
"biome.svg": "",
"folder-tools-open.svg": "",
"copilot.svg": "",
"folder-gulp.svg": "",
"coconut.svg": "",
"folder-pipe-open.svg": "",
"dinophp.svg": "",
"folder-environment-open.svg": "",
"subtitles.svg": "",
"nix.svg": "",
"chess.svg": "",
"folder-global-open.svg": "",
"folder-console-open.svg": "",
"bench-ts.svg": "",
"folder-cypress.svg": "",
"objective-c.svg": "",
"folder-font-open.svg": "",
"sway.svg": "",
"folder-azure-pipelines.svg": "",
"folder-test-open.svg": "",
"lisp.svg": "",
"opam.svg": "",
"fsharp.svg": "",
"folder-meta-open.svg": "",
"npm.svg": "",
"folder-trigger.svg": "",
"azure-pipelines.svg": "",
"folder-sass-open.svg": "",
"folder-decorators.svg": "",
"folder-webpack-open.svg": "",
"folder-lefthook-open.svg": "",
"tcl.svg": "",
"wrangler.svg": "",
"sentry.svg": "",
"folder-next-open.svg": "",
"nuxt.svg": "",
"lighthouse.svg": "",
"folder-root.svg": "",
"templ.svg": "",
"semantic-release.svg": "",
"gleam.svg": "",
"folder-firebase-open.svg": "",
"haml.svg": "",
"folder-symlink.svg": "\n",
"folder-angular-open.svg": "",
"webhint.svg": "",
"folder-batch-open.svg": "",
"folder-docs.svg": "",
"rubocop.svg": "",
"folder-apollo.svg": "",
"folder-shader.svg": "",
"gatsby.svg": "",
"jsr.svg": "",
"syncpack.svg": "",
"jsconfig.svg": "",
"folder-open.svg": "",
"cpp.svg": "",
"angular.svg": "",
"folder-pipe.svg": "",
"folder-intellij-open.svg": "",
"steadybit.svg": "",
"coloredpetrinets.svg": "",
"folder-utils-open.svg": "",
"javascript-map.svg": "",
"next_light.svg": "",
"textlint.svg": "",
"lyric.svg": "",
"zig.svg": "",
"remark.svg": "",
"markdoc-config.svg": "",
"zip.svg": "",
"folder-moon-open.svg": "",
"lock.svg": "",
"mjml.svg": "",
"circleci_light.svg": "",
"scala.svg": "",
"folder-fastlane.svg": "",
"folder-next.svg": "",
"folder-gulp-open.svg": "",
"perl.svg": "",
"wxt.svg": "",
"folder-drizzle-open.svg": "",
"folder-queue-open.svg": "",
"folder-stylus.svg": "",
"folder-template.svg": "",
"tilt.svg": "",
"folder-archive-open.svg": "",
"crystal_light.svg": "",
"imba.svg": "",
"keystatic.svg": "",
"folder-helper-open.svg": "",
"folder-vuepress.svg": "",
"folder-vercel.svg": "",
"bench-js.svg": "",
"folder-core-open.svg": "",
"folder-server-open.svg": "",
"dependabot.svg": "",
"json.svg": "",
"folder-tasks.svg": "",
"certificate.svg": "",
"folder-aurelia.svg": "",
"pinejs.svg": "",
"abap.svg": "",
"plastic.svg": "",
"craco.svg": "",
"key.svg": "",
"folder-controller-open.svg": "",
"folder-temp.svg": "",
"sas.svg": "",
"folder-cline.svg": "",
"folder-stylus-open.svg": "",
"bucklescript.svg": "",
"folder-theme.svg": "",
"folder-redux-store-open.clone.svg": "",
"folder-cart-open.svg": "",
"objective-cpp.svg": "",
"ada.svg": "",
"folder-mjml-open.svg": "",
"folder-class-open.svg": "",
"coderabbit-ai.svg": "",
"ruby.svg": "",
"hcl.svg": "",
"hosts.svg": "",
"folder-vscode-open.svg": "",
"edge.svg": "",
"folder-base-open.svg": "",
"folder-ngrx-entities.clone.svg": "",
"buildkite.svg": "",
"watchman.svg": "",
"folder-cloudflare-open.svg": "",
"folder-terraform-open.svg": "",
"folder-storybook.svg": "",
"folder-views.svg": "",
"folder-mappings-open.svg": "",
"diff.svg": "",
"scons_light.svg": "",
"folder-ngrx-effects.clone.svg": "",
"folder-secure-open.svg": "",
"folder-contract-open.svg": "",
"folder-functions-open.svg": "",
"angular-service.clone.svg": "",
"dll.svg": "",
"lerna.svg": "",
"folder-flutter-open.svg": "",
"settings.svg": "",
"tsil.svg": "",
"folder-review-open.svg": "",
"huff_light.svg": "",
"folder-luau-open.svg": "",
"karma.svg": "",
"applescript.svg": "",
"wepy.svg": "",
"folder-vercel-open.svg": "",
"folder-attachment.svg": "",
"werf.svg": "",
"xmake.svg": "",
"bun_light.svg": "",
"mojo.svg": "",
"folder-event-open.svg": "",
"python.svg": "",
"folder-update-open.svg": "",
"redux-selector.svg": "",
"folder-gamemaker.svg": "",
"folder-messages-open.svg": "",
"advpl-include.clone.svg": "",
"astro-config.svg": "",
"folder-coverage.svg": "",
"folder-benchmark.svg": "",
"foxpro.svg": "",
"phpunit.svg": "",
"folder-bibliography-open.svg": "",
"heroku.svg": "",
"xaml.svg": "",
"nest-pipe.clone.svg": "",
"code-climate.svg": "",
"folder-element.svg": "",
"docker.svg": "",
"git.svg": "",
"modernizr.svg": "",
"folder-seeders.svg": "",
"scons.svg": "",
"folder-typescript.svg": "",
"lilypond.svg": "",
"bicep.svg": "",
"github-actions-workflow.svg": "",
"kubernetes.svg": "",
"lbx.svg": "",
"folder-television-open.svg": "",
"jar.svg": "",
"taze.svg": "",
"python-misc.svg": "",
"mdx.svg": "",
"folder-cobol-open.svg": "",
"folder-cluster.svg": "",
"nx.svg": "",
"folder-middleware.svg": "",
"folder-decorators-open.svg": "",
"contributing.svg": "",
"angular-pipe.clone.svg": "",
"folder-serverless.svg": "",
"folder-debug.svg": "",
"forth.svg": "",
"folder-fastlane-open.svg": "",
"folder-redux-reducer-open.svg": "",
"folder-core.svg": "",
"protractor.svg": "",
"uv.svg": "",
"folder-helm-open.svg": "",
"cds.svg": "",
"folder-liquibase-open.svg": "",
"folder-dart.svg": "",
"folder-gh-workflows-open.svg": "",
"folder-guard.svg": "",
"knip.svg": "",
"javaclass.svg": "",
"bibliography.svg": "",
"folder-archive.svg": "",
"nest-filter.clone.svg": "",
"reason.svg": "",
"adobe-photoshop_light.svg": "",
"folder-include.svg": "",
"folder-routes-open.svg": "",
"folder-gitlab-open.svg": "",
"rspec.svg": "",
"folder-yarn.svg": "",
"powershell.svg": "",
"folder-tools.svg": "",
"controller.svg": "",
"coffee.svg": "",
"pdm.svg": "",
"flash.svg": "",
"folder-ios.svg": "",
"cake.svg": "",
"folder-mobile-open.svg": "",
"typst.svg": "",
"folder-images.svg": "",
"folder-typescript-open.svg": "",
"erlang.svg": "",
"folder-client.svg": "",
"salesforce.svg": "",
"folder-delta-open.svg": "",
"folder-desktop.svg": "",
"folder-bicep-open.svg": "",
"folder-enum-open.svg": "",
"folder-ngrx-actions.clone.svg": "",
"disc.svg": "",
"folder-pdf-open.svg": "",
"folder-flow.svg": "",
"nest-service.clone.svg": "",
"folder-queue.svg": "",
"coldfusion.svg": "",
"gemini-ai.svg": "",
"markdown.svg": "",
"folder-favicon-open.svg": "",
"folder-turborepo-open.svg": "",
"folder-video-open.svg": "",
"semantic-release_light.svg": "",
"folder-apollo-open.svg": "",
"folder-ui.svg": "",
"h.svg": "",
"racket.svg": "",
"tobi.svg": "",
"vim.svg": "",
"idris.svg": "",
"markdownlint.svg": "",
"horusec.svg": "",
"lottie.svg": "",
"verilog.svg": "",
"folder-middleware-open.svg": "",
"liquid.svg": "",
"folder-resource.svg": "",
"stan.svg": "",
"unity.svg": "",
"folder-linux.svg": "",
"folder-wakatime.svg": "",
"snapcraft.svg": "",
"folder-wordpress.svg": "",
"vite.svg": "",
"folder-development.clone.svg": "",
"php_elephant_pink.svg": "",
"folder-unity-open.svg": "",
"folder-svelte.svg": "",
"velite.svg": "",
"folder-angular.svg": "",
"chess_light.svg": "",
"document.svg": "",
"teal.svg": "",
"histoire.svg": "",
"folder-lib.svg": "",
"groovy.svg": "",
"bun.svg": "",
"angular-directive.clone.svg": "",
"folder-repository.svg": "",
"folder-scripts.svg": "",
"folder-theme-open.svg": "",
"folder-forgejo.svg": "",
"auto.svg": "",
"folder-error-open.svg": "",
"lua.svg": "",
"regedit.svg": "",
"aurelia.svg": "",
"folder-plastic.svg": "",
"folder-src-tauri.svg": "",
"folder-ansible-open.svg": "",
"folder-flutter.svg": "",
"css-map.svg": "",
"email.svg": "",
"mercurial.svg": "",
"nest-middleware.clone.svg": "",
"roadmap.svg": "",
"rescript-interface.svg": "",
"folder-pdm-open.svg": "",
"fusebox.svg": "",
"prolog.svg": "",
"tex.svg": "",
"siyuan.svg": "",
"folder-contract.svg": "",
"folder-dump-open.svg": "",
"folder-buildkite-open.svg": "",
"palette.svg": "",
"folder-messages.svg": "",
"folder-jinja.svg": "",
"folder-rules-open.svg": "",
"commitlint.svg": "",
"puppeteer.svg": "",
"folder-husky.svg": "",
"nodejs.svg": "",
"vfl.svg": "",
"architecture.svg": "",
"browserlist.svg": "",
"folder-bibliography.svg": "",
"tldraw.svg": "",
"scheme.svg": "",
"folder-taskfile-open.svg": "",
"folder-desktop-open.svg": "",
"folder-bloc-open.svg": "",
"folder-jinja-open.svg": "",
"hosts_light.svg": "",
"folder-ngrx-actions-open.clone.svg": "",
"folder-linux-open.svg": "",
"umi.svg": "",
"processing.svg": "",
"folder-other.svg": "",
"folder-verdaccio.svg": "",
"kotlin.svg": "",
"folder-markdown.svg": "",
"folder-rust-open.svg": "",
"red.svg": "",
"folder-android-open.svg": "",
"adobe-illustrator.svg": "",
"elixir.svg": "",
"folder-windows.svg": "",
"folder-stack-open.svg": "",
"nest-gateway.clone.svg": "",
"folder-error.svg": "",
"folder-gradle-open.svg": "",
"plop.svg": "",
"pkl.svg": "",
"brainfuck.svg": "",
"readme.svg": "",
"snowpack.svg": "",
"folder-attachment-open.svg": "",
"travis.svg": "",
"image.svg": "",
"changelog.svg": "",
"folder-connection.svg": "",
"prettier.svg": "",
"drizzle.svg": "",
"folder-custom-open.svg": "",
"payload.svg": "",
"blink_light.svg": "",
"contentlayer.svg": "",
"container.clone.svg": "",
"folder-target-open.svg": "",
"folder-resolver.svg": "",
"razor.svg": "",
"caddy.svg": "",
"folder-aws.svg": "",
"folder-docs-open.svg": "",
"percy.svg": "",
"redux-reducer.svg": "",
"adonis.svg": "",
"folder-update.svg": "",
"folder-examples-open.svg": "",
"terraform.svg": "",
"folder-redux-selector.clone.svg": "",
"folder-src.svg": "",
"word.svg": "",
"yarn.svg": "",
"folder-ngrx-selectors.clone.svg": "",
"laravel.svg": "",
"r.svg": "",
"folder-global.svg": "",
"swagger.svg": "",
"ifanr-cloud.svg": "",
"serverless.svg": "",
"sml.svg": "",
"folder-jinja-open_light.svg": "",
"folder-cobol.svg": "",
"folder-ci.svg": "",
"sbt.svg": "",
"folder-stencil-open.svg": "",
"folder-constant.svg": "",
"folder-macos-open.svg": "",
"folder-public-open.svg": "",
"folder-kusto.svg": "",
"folder-lottie.svg": "",
"folder-controller.svg": "",
"folder-src-open.svg": "",
"ocaml.svg": "",
"playwright.svg": "",
"visualstudio.svg": "",
"dart.svg": "",
"folder-powershell.svg": "",
"payload_light.svg": "",
"folder-mercurial-open.svg": "",
"svelte.svg": "",
"concourse.svg": "",
"folder-obsidian-open.svg": "",
"rubocop_light.svg": "",
"vercel_light.svg": "",
"systemd.svg": "",
"folder-shared.svg": "",
"kivy.svg": "",
"autoit.svg": "",
"folder-ngrx-reducer.clone.svg": "",
"wakatime.svg": "",
"folder-turborepo.svg": "",
"folder-scons-open.svg": "",
"folder-react-components.svg": "",
"folder-yarn-open.svg": "",
"folder-javascript-open.svg": "",
"table.svg": "",
"test-ts.svg": "",
"ndst.svg": "",
"folder-dist.svg": "",
"julia.svg": "",
"folder-lottie-open.svg": "",
"folder-syntax.svg": "",
"rojo.svg": "",
"ejs.svg": "",
"flow.svg": "",
"folder-trash-open.svg": "",
"jsr_light.svg": "",
"codeowners.svg": "",
"san.svg": "",
"opa.svg": "",
"silverstripe.svg": "",
"ngrx-state.svg": "",
"hcl_light.svg": "",
"php_elephant.svg": "",
"antlr.svg": "",
"istanbul.svg": "",
"remix.svg": "",
"d.svg": "",
"postcss.svg": "",
"svg.svg": "",
"swc.svg": "",
"folder-godot.svg": "",
"folder-delta.svg": "",
"advpl.svg": "",
"eslint.svg": "",
"folder-mojo.svg": "",
"dotjs.svg": "",
"folder-shader-open.svg": "",
"makefile.svg": "",
"hadolint.svg": "",
"css.svg": "",
"folder-root-open.svg": "",
"folder-vm.svg": "",
"jest.svg": "",
"folder-mail.svg": "",
"c3.svg": "",
"svelte_js.clone.svg": "",
"folder-keys.svg": "",
"folder-phpmailer-open.svg": "",
"folder-cart.svg": "",
"dart_generated.svg": "",
"folder-redux-reducer.svg": "",
"folder-resolver-open.svg": "",
"stylus.svg": "",
"folder-less-open.svg": "",
"folder-ngrx-store-open.svg": "",
"folder-liquibase.svg": "",
"folder-proto-open.svg": "",
"unocss.svg": "",
"folder-quasar-open.svg": "",
"folder-mojo-open.svg": "",
"folder-other-open.svg": "",
"slim.svg": "",
"folder-zeabur-open.svg": "",
"folder-dump.svg": "",
"folder-snippet.svg": "",
"folder-robot-open.svg": "",
"ballerina.svg": "",
"php.svg": "",
"folder-scala-open.svg": "",
"qsharp.svg": "",
"folder-firestore.svg": "",
"wolframlanguage.svg": "",
"folder-php-open.svg": "",
"folder-hook-open.svg": "",
"snowpack_light.svg": "",
"maven.svg": "",
"typescript.svg": "",
"vala.svg": "",
"uml_light.svg": "",
"folder-kubernetes.svg": "",
"ngrx-reducer.svg": "",
"openapi.svg": "",
"folder-admin-open.svg": "",
"folder-proto.svg": "",
"tldraw_light.svg": "",
"folder-audio.svg": "",
"folder-policy.svg": "",
"folder-ngrx-reducer-open.clone.svg": "",
"bower.svg": "",
"vercel.svg": "",
"vagrant.svg": "",
"folder-astro.svg": "",
"folder-vue-open.svg": "",
"angular-component.clone.svg": "",
"template.svg": "",
"jenkins.svg": "",
"gitpod.svg": "",
"bithound.svg": "",
"codecov.svg": "",
"beancount.svg": "",
"svelte_ts.clone.svg": "",
"rollup.svg": "",
"ahk2.clone.svg": "",
"folder-astro-open.svg": "",
"duc.svg": "",
"fastlane.svg": "",
"folder-plugin-open.svg": "",
"advpl-tlpp.clone.svg": "",
"folder-custom.svg": "",
"folder-directive-open.svg": "",
"qwik.svg": "",
"actionscript.svg": "",
"c.svg": "",
"advpl-ptm.clone.svg": "",
"dependencies-update.svg": "",
"folder-private-open.svg": "",
"folder-mjml.svg": "",
"azure.svg": "",
"next.svg": "",
"folder-vue.svg": "",
"stylable.svg": "",
"folder-download.svg": "",
"folder-python.svg": "",
"folder-macos.svg": "",
"folder-jinja_light.svg": "",
"uml.svg": "",
"mocha.svg": "",
"folder-include-open.svg": "",
"folder-api-open.svg": "",
"spwn.svg": "",
"cucumber.svg": "",
"editorconfig.svg": "",
"gemfile.svg": "",
"folder-link-open.svg": "",
"epub.svg": "",
"credits.svg": "",
"twig.svg": "",
"folder-debug-open.svg": "",
"folder-repository-open.svg": "",
"folder-interface.svg": "",
"renovate.svg": "",
"markojs.svg": "",
"capnp.svg": "",
"pdf.svg": "",
"assembly.svg": "",
"folder-server.svg": "",
"folder-animation.svg": "",
"folder-drizzle.svg": "",
"browserlist_light.svg": "",
"babel.svg": "",
"folder-github-open.svg": "",
"simulink.svg": "",
"log.svg": "",
"bbx.svg": "",
"hjson.svg": "",
"markdoc.svg": "",
"folder-video.svg": "",
"folder-stack.svg": "",
"folder-git-open.svg": "",
"folder-robot.svg": "",
"test-jsx.svg": "",
"dune.svg": "",
"folder-gh-workflows.svg": "",
"roblox.svg": "",
"freemarker.svg": "",
"folder-dart-open.svg": "",
"folder-json.svg": "",
"apps-script.svg": "",
"folder-docker.svg": "",
"folder-link.svg": "",
"wakatime_light.svg": "",
"autohotkey.svg": "",
"nodemon.svg": "",
"coala.svg": "",
"folder-vuex-store-open.svg": "",
"folder-import.svg": "",
"folder-ngrx-effects-open.clone.svg": "",
"folder-obsidian.svg": "",
"toml.svg": "",
"ltx.clone.svg": "",
"deno_light.svg": "",
"folder-trash.svg": "",
"pawn.svg": "",
"sketch.svg": "",
"folder-favicon.svg": "",
"folder-stencil.svg": "",
"gulp.svg": "",
"folder-backup-open.svg": "",
"proto.svg": "",
"audio.svg": "",
"gamemaker.svg": "",
"yaml.svg": "",
"command.svg": "",
"arduino.svg": "",
"folder-helm.svg": "",
"folder-bower.svg": "",
"folder-resource-open.svg": "",
"astro.svg": "",
"storybook.svg": "",
"folder-gitlab.svg": "",
"folder-buildkite.svg": "",
"tailwindcss.svg": "",
"folder-audio-open.svg": "",
"folder-mock-open.svg": "",
"netlify_light.svg": "",
"folder-azure-pipelines-open.svg": "",
"hurl.svg": "",
"folder-cluster-open.svg": "",
"folder-ngrx-state.clone.svg": "",
"folder-client-open.svg": "",
"folder-export-open.svg": "",
"stitches.svg": "",
"folder-project.svg": "",
"smarty.svg": "",
"rescript.svg": "",
"folder-pdm.svg": "",
"drone.svg": "",
"slug.svg": "",
"folder-hook.svg": "",
"folder-admin.svg": "",
"folder-kusto-open.svg": "",
"folder-nuxt-open.svg": "",
"folder-plugin.svg": "",
"folder-react-components-open.svg": "",
"folder-packages-open.svg": "",
"pre-commit.svg": "",
"folder-plastic-open.svg": "",
"folder-nuxt.svg": "",
"folder-quasar.svg": "",
"folder-jupyter-open.svg": "",
"hpp.svg": "",
"nest.svg": "",
"folder-vuepress-open.svg": "",
"folder-github.svg": "",
"stylelint.svg": "",
"folder-secure.svg": "",
"folder-layout-open.svg": "",
"folder-redux-actions-open.clone.svg": "",
"folder-zeabur.svg": "",
"pipeline.svg": "",
"latex.clone.svg": "",
"folder-firebase.svg": "",
"semgrep.svg": "",
"excalidraw.svg": "",
"grain.svg": "",
"folder-generator-open.svg": "",
"folder-supabase.svg": "",
"folder-ngrx-selectors-open.clone.svg": "",
"folder-export.svg": "",
"hack.svg": "",
"folder-enum.svg": "",
"deepsource.svg": "",
"folder-console.svg": "",
"folder-aurelia-open.svg": "",
"jinja_light.svg": "",
"clojure.svg": "",
"folder-gamemaker-open.svg": "",
"folder-private.svg": "",
"3d.svg": "",
"pm2-ecosystem.svg": "",
"conduct.svg": "",
"godot-assets.svg": "",
"nuget.svg": "",
"folder-java.svg": "",
"video.svg": "",
"angular-guard.clone.svg": "",
"folder-utils.svg": "",
"nest-module.clone.svg": "",
"folder-television.svg": "",
"react.svg": "",
"folder-java-open.svg": "",
"folder-cloud-functions-open.svg": "",
"robot.svg": "",
"folder-intellij-open_light.svg": "",
"tree.svg": "",
"i18n.svg": "",
"cairo.svg": "",
"less.svg": "",
"folder-sandbox.svg": "",
"folder-sass.svg": "",
"hardhat.svg": "",
"folder-rust.svg": "",
"mxml.svg": "",
"graphcool.svg": "",
"folder-content-open.svg": "",
"swift.svg": "",
"pnpm_light.svg": "",
"folder-sublime-open.svg": "",
"folder-vuex-store.svg": "",
"redux-store.svg": "",
"folder-lua.svg": "",
"cmake.svg": "",
"react_ts.svg": "",
"folder-context.svg": "",
"folder-seeders-open.svg": "",
"folder-database.svg": "",
"folder-expo.svg": "",
"ngrx-entity.svg": "",
"tune.svg": "",
"folder-css-open.svg": "",
"amplify.svg": "",
"folder-snapcraft-open.svg": "",
"lib.svg": "",
"folder-temp-open.svg": "",
"folder-dist-open.svg": "",
"shader.svg": "",
"apollo.svg": "",
"html.svg": "",
"tape.clone.svg": "",
"folder-wakatime-open.svg": "",
"sublime.svg": "",
"folder-phpmailer.svg": "",
"folder-review.svg": "",
"folder-graphql.svg": "",
"folder-firestore-open.svg": "",
"folder-element-open.svg": "",
"folder-intellij_light.svg": "",
"nest-interceptor.clone.svg": "",
"esbuild.svg": "",
"folder-ngrx-store.svg": "",
"grafana-alloy.svg": "",
"folder-supabase-open.svg": "",
"folder-benchmark-open.svg": "",
"folder-template-open.svg": "",
"folder-components-open.svg": "",
"folder-snippet-open.svg": "",
"svgr.svg": "",
"sonarcloud.svg": "",
"gridsome.svg": "",
"virtual.svg": "",
"authors.svg": "",
"folder-development-open.clone.svg": "",
"folder-lua-open.svg": "",
"typescript-def.svg": "",
"console.svg": "",
"deno.svg": "",
"ember.svg": "",
"folder-database-open.svg": "",
"bruno.svg": "",
"posthtml.svg": "",
"django.svg": "",
"twine.svg": "",
"go_gopher.svg": "",
"folder-vscode.svg": "",
"folder-svg-open.svg": "",
"folder-javascript.svg": "",
"folder-backup.svg": "",
"rocket.svg": "",
"crystal.svg": "",
"folder-ui-open.svg": "",
"folder-meta.svg": "",
"folder-storybook-open.svg": "",
"tauri.svg": "",
"folder-snapcraft.svg": "",
"folder-config.svg": "",
"test-js.svg": "",
"folder-target.svg": "",
"folder-examples.svg": "",
"auto_light.svg": "",
"folder-taskfile.svg": "",
"adobe-photoshop.svg": "",
"husky.svg": "",
"meson.svg": "",
"folder-home.svg": "",
"circleci.svg": "",
"folder-trigger-open.svg": "",
"grunt.svg": "",
"folder-cloudflare.svg": "",
"csharp.svg": "",
"folder-home-open.svg": "",
"folder-ansible.svg": "",
"folder-lib-open.svg": "",
"angular-resolver.clone.svg": "",
"folder-mercurial.svg": "",
"yang.svg": "",
"cbx.svg": "",
"asciidoc.svg": "",
"graphql.svg": "",
"nginx.svg": "",
"folder-functions.svg": "",
"riot.svg": "",
"cloudfoundry.svg": "",
"cadence.svg": "",
"bibtex-style.svg": "",
"folder-sublime.svg": "",
"folder-app-open.svg": "",
"go.svg": "",
"denizenscript.svg": "",
"folder-environment.svg": "",
"chrome.svg": "",
"kl.svg": "",
"folder-luau.svg": "",
"folder-redux-actions.clone.svg": "",
"folder-husky-open.svg": "",
"folder-command.svg": "",
"folder-bower-open.svg": "",
"screwdriver.svg": "",
"zeabur_light.svg": "",
"prisma.svg": "",
"bazel.svg": "",
"routing.svg": "",
"turborepo_light.svg": "",
"drone_light.svg": "",
"stencil.svg": "",
"favicon.svg": "",
"sty.clone.svg": "",
"haxe.svg": "",
"folder-app.svg": "",
"wally.svg": "",
"folder-ngrx-state-open.clone.svg": "",
"folder-scripts-open.svg": "",
"folder.svg": "",
"openapi_light.svg": "",
"ionic.svg": "",
"snakemake.svg": "",
"garden.svg": "",
"folder-json-open.svg": "",
"installation.svg": "",
"folder-git.svg": "",
"folder-powershell-open.svg": "",
"folder-serverless-open.svg": "",
"folder-coverage-open.svg": "",
"lolcode.svg": "",
"exe.svg": "",
"folder-cloud-functions.svg": "",
"folder-windows-open.svg": "",
"godot.svg": "",
"clangd.svg": "",
"folder-public.svg": "",
"folder-vm-open.svg": "",
"webassembly.svg": "",
"slint.svg": "",
"ngrx-selectors.svg": "",
"vlang.svg": "",
"folder-prisma-open.svg": "",
"moon.svg": "",
"url.svg": "",
"github-sponsors.svg": "",
"blink.svg": "",
"stylelint_light.svg": "",
"ngrx-actions.svg": "",
"folder-container.svg": "",
"robots.svg": "",
"cobol.svg": "",
"go-mod.svg": "",
"gnuplot.svg": "",
"gradle.svg": "",
"capacitor.svg": "",
"folder-netlify-open.svg": "",
"kusto.svg": "",
"drawio.svg": "",
"php-cs-fixer.svg": "",
"folder-tasks-open.svg": "",
"folder-lefthook.svg": "",
"folder-docker-open.svg": "",
"font.svg": "",
"folder-i18n-open.svg": "",
"folder-gitea-open.svg": "",
"merlin.svg": ""
};
// #endregion
// #endregion
// #region Polyfill Implementation
function buildPolyfill({ isBackground = false, isOtherPage = false } = {}) {
// Generate a unique context ID for this polyfill instance
const contextType = isBackground
? "background"
: isOtherPage
? "options"
: "content";
const contextId = `${contextType}_${Math.random()
.toString(36)
.substring(2, 15)}`;
const IS_IFRAME = "false" === "true";
const BUS = (function () {
if (globalThis.__BUS) {
return globalThis.__BUS;
}
globalThis.__BUS = createEventBus(
"material-icons-for-github",
IS_IFRAME ? "iframe" : "page",
);
return globalThis.__BUS;
})();
const RUNTIME = createRuntime(isBackground ? "background" : "tab", BUS);
const createNoopListeners = () => ({
addListener: (callback) => {
_log("addListener", callback);
},
removeListener: (callback) => {
_log("removeListener", callback);
},
});
// TODO: Stub
const storageChangeListeners = new Set();
function broadcastStorageChange(changes, areaName) {
storageChangeListeners.forEach((listener) => {
listener(changes, areaName);
});
}
let REQ_PERMS = [];
// #region Chrome polyfill
let chrome = {
extension: {
isAllowedIncognitoAccess: () => Promise.resolve(true),
sendMessage: (...args) => _messagingHandler.sendMessage(...args),
},
permissions: {
// TODO: Remove origin permission means exclude from origin in startup (when checking for content scripts)
request: (permissions, callback) => {
_log("permissions.request", permissions, callback);
if (Array.isArray(permissions)) {
REQ_PERMS = [...REQ_PERMS, ...permissions];
}
if (typeof callback === "function") {
callback(permissions);
}
return Promise.resolve(permissions);
},
contains: (permissions, callback) => {
if (typeof callback === "function") {
callback(true);
}
return Promise.resolve(true);
},
getAll: () => {
return Promise.resolve({
permissions: EXTENSION_PERMISSIONS,
origins: ORIGIN_PERMISSIONS,
});
},
onAdded: createNoopListeners(),
onRemoved: createNoopListeners(),
},
i18n: {
getUILanguage: () => {
return USED_LOCALE || "en";
},
getMessage: (key, substitutions = []) => {
if (typeof substitutions === "string") {
substitutions = [substitutions];
}
if (typeof LOCALE_KEYS !== "undefined" && LOCALE_KEYS[key]) {
return LOCALE_KEYS[key].message?.replace(
/\$(\d+)/g,
(match, p1) => substitutions[p1 - 1] || match,
);
}
return key;
},
},
alarms: {
onAlarm: createNoopListeners(),
create: () => {
_log("alarms.create", arguments);
},
get: () => {
_log("alarms.get", arguments);
},
},
runtime: {
...RUNTIME,
onInstalled: createNoopListeners(),
onStartup: createNoopListeners(),
// TODO: Postmessage to parent to open options page or call openOptionsPage
openOptionsPage: () => {
// const url = chrome.runtime.getURL(OPTIONS_PAGE_PATH);
// console.log("openOptionsPage", _openTab, url, EXTENSION_ASSETS_MAP);
// _openTab(url);
if (typeof openOptionsPage === "function") {
openOptionsPage();
} else if (window.parent) {
window.parent.postMessage({ type: "openOptionsPage" }, "*");
} else {
_warn("openOptionsPage not available.");
}
},
getManifest: () => {
// The manifest object will be injected into the scope where buildPolyfill is called
if (typeof INJECTED_MANIFEST !== "undefined") {
return JSON.parse(JSON.stringify(INJECTED_MANIFEST)); // Return deep copy
}
_warn("INJECTED_MANIFEST not found for chrome.runtime.getManifest");
return { name: "Unknown", version: "0.0", manifest_version: 2 };
},
getURL: (path) => {
if (!path) return "";
if (path.startsWith("/")) {
path = path.substring(1);
}
if (typeof _createAssetUrl === "function") {
return _createAssetUrl(path);
}
_warn(
`chrome.runtime.getURL fallback for '${path}'. Assets may not be available.`,
);
// Attempt a relative path resolution (highly context-dependent and likely wrong)
try {
if (window.location.protocol.startsWith("http")) {
return new URL(path, window.location.href).toString();
}
} catch (e) {
/* ignore error, fallback */
}
return path;
},
id: "polyfilled-extension-" + Math.random().toString(36).substring(2, 15),
lastError: null,
setUninstallURL: () => {},
setUpdateURL: () => {},
getPlatformInfo: async () => {
const platform = {
os: "unknown",
arch: "unknown",
nacl_arch: "unknown",
};
if (typeof navigator !== "undefined") {
const userAgent = navigator.userAgent.toLowerCase();
if (userAgent.includes("mac")) platform.os = "mac";
else if (userAgent.includes("win")) platform.os = "win";
else if (userAgent.includes("linux")) platform.os = "linux";
else if (userAgent.includes("android")) platform.os = "android";
else if (userAgent.includes("ios")) platform.os = "ios";
if (userAgent.includes("x86_64") || userAgent.includes("amd64")) {
platform.arch = "x86-64";
} else if (userAgent.includes("i386") || userAgent.includes("i686")) {
platform.arch = "x86-32";
} else if (userAgent.includes("arm")) {
platform.arch = "arm";
}
}
return platform;
},
getBrowserInfo: async () => {
const info = {
name: "unknown",
version: "unknown",
buildID: "unknown",
};
if (typeof navigator !== "undefined") {
const userAgent = navigator.userAgent;
if (userAgent.includes("Chrome")) {
info.name = "Chrome";
const match = userAgent.match(/Chrome\/([0-9.]+)/);
if (match) info.version = match[1];
} else if (userAgent.includes("Firefox")) {
info.name = "Firefox";
const match = userAgent.match(/Firefox\/([0-9.]+)/);
if (match) info.version = match[1];
} else if (userAgent.includes("Safari")) {
info.name = "Safari";
const match = userAgent.match(/Version\/([0-9.]+)/);
if (match) info.version = match[1];
}
}
return info;
},
},
storage: {
local: {
get: function (keys, callback) {
if (typeof _storageGet !== "function")
throw new Error("_storageGet not defined");
const promise = _storageGet(keys);
if (typeof callback === "function") {
promise
.then((result) => {
try {
callback(result);
} catch (e) {
_error("Error in storage.get callback:", e);
}
})
.catch((error) => {
_error("Storage.get error:", error);
callback({});
});
return;
}
return promise;
},
set: function (items, callback) {
if (typeof _storageSet !== "function")
throw new Error("_storageSet not defined");
const promise = _storageSet(items).then((result) => {
broadcastStorageChange(items, "local");
return result;
});
if (typeof callback === "function") {
promise
.then((result) => {
try {
callback(result);
} catch (e) {
_error("Error in storage.set callback:", e);
}
})
.catch((error) => {
_error("Storage.set error:", error);
callback();
});
return;
}
return promise;
},
remove: function (keys, callback) {
if (typeof _storageRemove !== "function")
throw new Error("_storageRemove not defined");
const promise = _storageRemove(keys).then((result) => {
const changes = {};
const keyList = Array.isArray(keys) ? keys : [keys];
keyList.forEach((key) => {
changes[key] = { oldValue: undefined, newValue: undefined };
});
broadcastStorageChange(changes, "local");
return result;
});
if (typeof callback === "function") {
promise
.then((result) => {
try {
callback(result);
} catch (e) {
_error("Error in storage.remove callback:", e);
}
})
.catch((error) => {
_error("Storage.remove error:", error);
callback();
});
return;
}
return promise;
},
clear: function (callback) {
if (typeof _storageClear !== "function")
throw new Error("_storageClear not defined");
const promise = _storageClear().then((result) => {
broadcastStorageChange({}, "local");
return result;
});
if (typeof callback === "function") {
promise
.then((result) => {
try {
callback(result);
} catch (e) {
_error("Error in storage.clear callback:", e);
}
})
.catch((error) => {
_error("Storage.clear error:", error);
callback();
});
return;
}
return promise;
},
onChanged: {
addListener: (callback) => {
storageChangeListeners.add(callback);
},
removeListener: (callback) => {
storageChangeListeners.delete(callback);
},
},
},
sync: {
get: function (keys, callback) {
_warn("chrome.storage.sync polyfill maps to local");
return chrome.storage.local.get(keys, callback);
},
set: function (items, callback) {
_warn("chrome.storage.sync polyfill maps to local");
const promise = chrome.storage.local.set(items).then((result) => {
broadcastStorageChange(items, "sync");
return result;
});
if (typeof callback === "function") {
promise
.then((result) => {
try {
callback(result);
} catch (e) {
_error("Error in storage.sync.set callback:", e);
}
})
.catch((error) => {
_error("Storage.sync.set error:", error);
callback();
});
return;
}
return promise;
},
remove: function (keys, callback) {
_warn("chrome.storage.sync polyfill maps to local");
const promise = chrome.storage.local.remove(keys).then((result) => {
const changes = {};
const keyList = Array.isArray(keys) ? keys : [keys];
keyList.forEach((key) => {
changes[key] = { oldValue: undefined, newValue: undefined };
});
broadcastStorageChange(changes, "sync");
return result;
});
if (typeof callback === "function") {
promise
.then((result) => {
try {
callback(result);
} catch (e) {
_error("Error in storage.sync.remove callback:", e);
}
})
.catch((error) => {
_error("Storage.sync.remove error:", error);
callback();
});
return;
}
return promise;
},
clear: function (callback) {
_warn("chrome.storage.sync polyfill maps to local");
const promise = chrome.storage.local.clear().then((result) => {
broadcastStorageChange({}, "sync");
return result;
});
if (typeof callback === "function") {
promise
.then((result) => {
try {
callback(result);
} catch (e) {
_error("Error in storage.sync.clear callback:", e);
}
})
.catch((error) => {
_error("Storage.sync.clear error:", error);
callback();
});
return;
}
return promise;
},
onChanged: {
addListener: (callback) => {
storageChangeListeners.add(callback);
},
removeListener: (callback) => {
storageChangeListeners.delete(callback);
},
},
},
onChanged: {
addListener: (callback) => {
storageChangeListeners.add(callback);
},
removeListener: (callback) => {
storageChangeListeners.delete(callback);
},
},
managed: {
get: function (keys, callback) {
_warn("chrome.storage.managed polyfill is read-only empty.");
const promise = Promise.resolve({});
if (typeof callback === "function") {
promise.then((result) => {
try {
callback(result);
} catch (e) {
_error("Error in storage.managed.get callback:", e);
}
});
return;
}
return promise;
},
},
},
cookies: (function () {
const cookieChangeListeners = new Set();
function broadcastCookieChange(changeInfo) {
cookieChangeListeners.forEach((listener) => {
try {
listener(changeInfo);
} catch (e) {
_error("Error in cookies.onChanged listener:", e);
}
});
}
function handlePromiseCallback(promise, callback) {
if (typeof callback === "function") {
promise
.then((result) => callback(result))
.catch((error) => {
// chrome.runtime.lastError = { message: error.message }; // TODO: Implement lastError
_error(error);
callback(); // Call with undefined on error
});
return;
}
return promise;
}
return {
get: function (details, callback) {
if (typeof _cookieList !== "function") {
return handlePromiseCallback(
Promise.reject(new Error("_cookieList not defined")),
callback,
);
}
const promise = _cookieList({
url: details.url,
name: details.name,
storeId: details.storeId,
partitionKey: details.partitionKey,
}).then((cookies) => {
if (!cookies || cookies.length === 0) {
return null;
}
// Sort by path length (longest first), then creation time (earliest first, if available)
cookies.sort((a, b) => {
const pathLenDiff = (b.path || "").length - (a.path || "").length;
if (pathLenDiff !== 0) return pathLenDiff;
return (a.creationTime || 0) - (b.creationTime || 0);
});
return cookies[0];
});
return handlePromiseCallback(promise, callback);
},
getAll: function (details, callback) {
if (typeof _cookieList !== "function") {
return handlePromiseCallback(
Promise.reject(new Error("_cookieList not defined")),
callback,
);
}
if (details.partitionKey) {
_warn(
"cookies.getAll: partitionKey is not fully supported in this environment.",
);
}
const promise = _cookieList(details);
return handlePromiseCallback(promise, callback);
},
set: function (details, callback) {
const promise = (async () => {
if (
typeof _cookieSet !== "function" ||
typeof _cookieList !== "function"
) {
throw new Error("_cookieSet or _cookieList not defined");
}
if (details.partitionKey) {
_warn(
"cookies.set: partitionKey is not fully supported in this environment.",
);
}
const getDetails = {
url: details.url,
name: details.name,
storeId: details.storeId,
};
const oldCookies = await _cookieList(getDetails);
const oldCookie = oldCookies && oldCookies[0];
if (oldCookie) {
broadcastCookieChange({
cause: "overwrite",
cookie: oldCookie,
removed: true,
});
}
await _cookieSet(details);
const newCookies = await _cookieList(getDetails);
const newCookie = newCookies && newCookies[0];
if (newCookie) {
broadcastCookieChange({
cause: "explicit",
cookie: newCookie,
removed: false,
});
}
return newCookie || null;
})();
return handlePromiseCallback(promise, callback);
},
remove: function (details, callback) {
const promise = (async () => {
if (
typeof _cookieDelete !== "function" ||
typeof _cookieList !== "function"
) {
throw new Error("_cookieDelete or _cookieList not defined");
}
const oldCookies = await _cookieList(details);
const oldCookie = oldCookies && oldCookies[0];
if (!oldCookie) return null; // Nothing to remove
await _cookieDelete(details);
broadcastCookieChange({
cause: "explicit",
cookie: oldCookie,
removed: true,
});
return {
url: details.url,
name: details.name,
storeId: details.storeId || "0",
partitionKey: details.partitionKey,
};
})();
return handlePromiseCallback(promise, callback);
},
getAllCookieStores: function (callback) {
const promise = Promise.resolve([
{ id: "0", tabIds: [1] }, // Mock store for the current context
]);
return handlePromiseCallback(promise, callback);
},
getPartitionKey: function (details, callback) {
_warn(
"chrome.cookies.getPartitionKey is not supported in this environment.",
);
const promise = Promise.resolve({ partitionKey: {} }); // Return empty partition key
return handlePromiseCallback(promise, callback);
},
onChanged: {
addListener: (callback) => {
if (typeof callback === "function") {
cookieChangeListeners.add(callback);
}
},
removeListener: (callback) => {
cookieChangeListeners.delete(callback);
},
},
};
})(),
tabs: {
query: async (queryInfo) => {
_warn("chrome.tabs.query polyfill only returns current tab info.");
const dummyId = Math.floor(Math.random() * 1000) + 1;
return [
{
id: dummyId,
url: CURRENT_LOCATION,
active: true,
windowId: 1,
status: "complete",
},
];
},
create: async ({ url, active = true }) => {
_log(`[Polyfill tabs.create] URL: ${url}`);
if (typeof _openTab !== "function")
throw new Error("_openTab not defined");
_openTab(url, active);
const dummyId = Math.floor(Math.random() * 1000) + 1001;
return Promise.resolve({
id: dummyId,
url: url,
active,
windowId: 1,
});
},
sendMessage: async (tabId, message) => {
_warn(
`chrome.tabs.sendMessage polyfill (to tab ${tabId}) redirects to runtime.sendMessage (current context).`,
);
return chrome.runtime.sendMessage(message);
},
onActivated: createNoopListeners(),
onUpdated: createNoopListeners(),
onRemoved: createNoopListeners(),
onReplaced: createNoopListeners(),
onCreated: createNoopListeners(),
onMoved: createNoopListeners(),
onDetached: createNoopListeners(),
onAttached: createNoopListeners(),
},
windows: {
onFocusChanged: createNoopListeners(),
onCreated: createNoopListeners(),
onRemoved: createNoopListeners(),
onFocused: createNoopListeners(),
onFocus: createNoopListeners(),
onBlur: createNoopListeners(),
onFocused: createNoopListeners(),
},
notifications: {
create: async (notificationId, options) => {
try {
let id = notificationId;
let notificationOptions = options;
if (typeof notificationId === "object" && notificationId !== null) {
notificationOptions = notificationId;
id = "notification_" + Math.random().toString(36).substring(2, 15);
} else if (typeof notificationId === "string" && options) {
id = notificationId;
notificationOptions = options;
} else {
throw new Error("Invalid parameters for notifications.create");
}
if (!notificationOptions || typeof notificationOptions !== "object") {
throw new Error("Notification options must be an object");
}
const {
title,
message,
iconUrl,
type = "basic",
} = notificationOptions;
if (!title || !message) {
throw new Error("Notification must have title and message");
}
if ("Notification" in window) {
if (Notification.permission === "granted") {
const notification = new Notification(title, {
body: message,
icon: iconUrl,
tag: id,
});
_log(`[Notifications] Created notification: ${id}`);
return id;
} else if (Notification.permission === "default") {
const permission = await Notification.requestPermission();
if (permission === "granted") {
const notification = new Notification(title, {
body: message,
icon: iconUrl,
tag: id,
});
_log(
`[Notifications] Created notification after permission: ${id}`,
);
return id;
} else {
_warn("[Notifications] Permission denied for notifications");
return id;
}
} else {
_warn("[Notifications] Notifications are blocked");
return id;
}
} else {
_warn(
"[Notifications] Native notifications not supported, using console fallback",
);
_log(`[Notification] ${title}: ${message}`);
return id;
}
} catch (error) {
_error("[Notifications] Error creating notification:", error.message);
throw error;
}
},
clear: async (notificationId) => {
_log(`[Notifications] Clear notification: ${notificationId}`);
// For native notifications, there's no direct way to clear by ID
// This is a limitation of the Web Notifications API
return true;
},
getAll: async () => {
_warn("[Notifications] getAll not fully supported in polyfill");
return {};
},
getPermissionLevel: async () => {
if ("Notification" in window) {
const permission = Notification.permission;
return { level: permission === "granted" ? "granted" : "denied" };
}
return { level: "denied" };
},
},
contextMenus: {
create: (createProperties, callback) => {
try {
if (!createProperties || typeof createProperties !== "object") {
throw new Error("Context menu create properties must be an object");
}
const { id, title, contexts = ["page"], onclick } = createProperties;
const menuId =
id || `menu_${Math.random().toString(36).substring(2, 15)}`;
if (!title || typeof title !== "string") {
throw new Error("Context menu must have a title");
}
// Store menu items for potential use
if (!window._polyfillContextMenus) {
window._polyfillContextMenus = new Map();
}
window._polyfillContextMenus.set(menuId, {
id: menuId,
title,
contexts,
onclick,
enabled: createProperties.enabled !== false,
});
_log(
`[ContextMenus] Created context menu item: ${title} (${menuId})`,
);
// Try to register a menu command as fallback
if (typeof _registerMenuCommand === "function") {
try {
_registerMenuCommand(
title,
onclick ||
(() => {
_log(`Context menu clicked: ${title}`);
}),
);
} catch (e) {
_warn(
"[ContextMenus] Failed to register as menu command:",
e.message,
);
}
}
if (callback && typeof callback === "function") {
setTimeout(() => callback(), 0);
}
return menuId;
} catch (error) {
_error("[ContextMenus] Error creating context menu:", error.message);
if (callback && typeof callback === "function") {
setTimeout(() => callback(), 0);
}
throw error;
}
},
update: (id, updateProperties, callback) => {
try {
if (
!window._polyfillContextMenus ||
!window._polyfillContextMenus.has(id)
) {
throw new Error(`Context menu item not found: ${id}`);
}
const menuItem = window._polyfillContextMenus.get(id);
Object.assign(menuItem, updateProperties);
_log(`[ContextMenus] Updated context menu item: ${id}`);
if (callback && typeof callback === "function") {
setTimeout(() => callback(), 0);
}
} catch (error) {
_error("[ContextMenus] Error updating context menu:", error.message);
if (callback && typeof callback === "function") {
setTimeout(() => callback(), 0);
}
}
},
remove: (menuItemId, callback) => {
try {
if (
window._polyfillContextMenus &&
window._polyfillContextMenus.has(menuItemId)
) {
window._polyfillContextMenus.delete(menuItemId);
_log(`[ContextMenus] Removed context menu item: ${menuItemId}`);
} else {
_warn(
`[ContextMenus] Context menu item not found for removal: ${menuItemId}`,
);
}
if (callback && typeof callback === "function") {
setTimeout(() => callback(), 0);
}
} catch (error) {
_error("[ContextMenus] Error removing context menu:", error.message);
if (callback && typeof callback === "function") {
setTimeout(() => callback(), 0);
}
}
},
removeAll: (callback) => {
try {
if (window._polyfillContextMenus) {
const count = window._polyfillContextMenus.size;
window._polyfillContextMenus.clear();
_log(`[ContextMenus] Removed all ${count} context menu items`);
}
if (callback && typeof callback === "function") {
setTimeout(() => callback(), 0);
}
} catch (error) {
_error(
"[ContextMenus] Error removing all context menus:",
error.message,
);
if (callback && typeof callback === "function") {
setTimeout(() => callback(), 0);
}
}
},
onClicked: {
addListener: (callback) => {
if (!window._polyfillContextMenuListeners) {
window._polyfillContextMenuListeners = new Set();
}
window._polyfillContextMenuListeners.add(callback);
_log("[ContextMenus] Added click listener");
},
removeListener: (callback) => {
if (window._polyfillContextMenuListeners) {
window._polyfillContextMenuListeners.delete(callback);
_log("[ContextMenus] Removed click listener");
}
},
},
},
};
const tc = (fn) => {
try {
fn();
} catch (e) {}
};
const loggingProxyHandler = (_key) => ({
get(target, key, receiver) {
tc(() => _log(`[${contextType}] [CHROME - ${_key}] Getting ${key}`));
return Reflect.get(target, key, receiver);
},
set(target, key, value, receiver) {
tc(() =>
_log(`[${contextType}] [CHROME - ${_key}] Setting ${key} to ${value}`),
);
return Reflect.set(target, key, value, receiver);
},
has(target, key) {
tc(() =>
_log(`[${contextType}] [CHROME - ${_key}] Checking if ${key} exists`),
);
return Reflect.has(target, key);
},
});
chrome = Object.fromEntries(
Object.entries(chrome).map(([key, value]) => [
key,
new Proxy(value, loggingProxyHandler(key)),
]),
);
// Alias browser to chrome for common Firefox pattern
const browser = new Proxy(chrome, loggingProxyHandler);
const oldGlobalThis = globalThis;
const oldWindow = window;
const oldSelf = self;
const oldGlobal = globalThis;
const __globalsStorage = {};
const TO_MODIFY = [oldGlobalThis, oldWindow, oldSelf, oldGlobal];
const set = (k, v) => {
__globalsStorage[k] = v;
TO_MODIFY.forEach((target) => {
target[k] = v;
});
};
const proxyHandler = {
get(target, key, receiver) {
const fns = [
() => __globalsStorage[key],
() => Reflect.get(target, key, target),
() => target[key],
];
const out = fns
.map((f) => {
try {
let out = f();
return out;
} catch (e) {
return undefined;
}
})
.find((f) => f !== undefined);
if (typeof out === "function") {
return out.bind(target);
}
return out;
},
set(target, key, value, receiver) {
try {
tc(() => _log(`[${contextType}] Setting ${key} to ${value}`));
set(key, value);
return Reflect.set(target, key, value, receiver);
} catch (e) {
_error("Error setting", key, value, e);
try {
target[key] = value;
return true;
} catch (e) {
_error("Error setting", key, value, e);
}
return false;
}
},
has(target, key) {
try {
return key in __globalsStorage || key in target;
} catch (e) {
_error("Error has", key, e);
try {
return key in __globalsStorage || key in target;
} catch (e) {
_error("Error has", key, e);
}
return false;
}
},
getOwnPropertyDescriptor(target, key) {
try {
if (key in __globalsStorage) {
return {
configurable: true,
enumerable: true,
writable: true,
value: __globalsStorage[key],
};
}
// fall back to the real globalThis
const desc = Reflect.getOwnPropertyDescriptor(target, key);
// ensure it's configurable so the with‑scope binding logic can override it
if (desc && !desc.configurable) {
desc.configurable = true;
}
return desc;
} catch (e) {
_error("Error getOwnPropertyDescriptor", key, e);
return {
configurable: true,
enumerable: true,
writable: true,
value: undefined,
};
}
},
defineProperty(target, key, descriptor) {
try {
// Normalize descriptor to avoid mixed accessor & data attributes
const hasAccessor = "get" in descriptor || "set" in descriptor;
if (hasAccessor) {
// Build a clean descriptor without value/writable when accessors present
const normalized = {
configurable:
"configurable" in descriptor ? descriptor.configurable : true,
enumerable:
"enumerable" in descriptor ? descriptor.enumerable : false,
};
if ("get" in descriptor) normalized.get = descriptor.get;
if ("set" in descriptor) normalized.set = descriptor.set;
// Store accessor references for inspection but avoid breaking invariants
set(key, {
get: descriptor.get,
set: descriptor.set,
});
return Reflect.defineProperty(target, key, normalized);
}
// Data descriptor path
set(key, descriptor.value);
return Reflect.defineProperty(target, key, descriptor);
} catch (e) {
_error("Error defineProperty", key, descriptor, e);
return false;
}
},
};
// Create proxies once proxyHandler is defined
const proxyWindow = new Proxy(oldWindow, proxyHandler);
const proxyGlobalThis = new Proxy(oldGlobalThis, proxyHandler);
const proxyGlobal = new Proxy(oldGlobal, proxyHandler);
const proxySelf = new Proxy(oldSelf, proxyHandler);
// Seed storage with core globals so lookups succeed inside `with` blocks
Object.assign(__globalsStorage, {
chrome,
browser,
window: proxyWindow,
globalThis: proxyGlobalThis,
global: proxyGlobal,
self: proxySelf,
document: oldWindow.document,
});
const __globals = {
chrome,
browser,
window: proxyWindow,
globalThis: proxyGlobalThis,
global: proxyGlobal,
self: proxySelf,
__globals: __globalsStorage,
};
__globals.contextId = contextId;
__globals.contextType = contextType;
__globals.module = undefined;
__globals.amd = undefined;
__globals.define = undefined;
__globals.importScripts = (...args) => {
_log("importScripts", args);
};
return __globals;
}
if (typeof window !== 'undefined') {
window.buildPolyfill = buildPolyfill;
}
// #endregion
// #endregion
// #endregion
// #region Background Script Environment
// #endregion
// #region Orchestration Logic
// Other globals currently defined at this spot: SCRIPT_NAME, _log, _warn, _error
const INJECTED_MANIFEST = {"manifest_version":3,"name":"Material Icons for GitHub","version":"1.10.4","description":"Material icons for the file browser of popular websites like GitHub, Azure, Bitbucket etc.","permissions":["storage","activeTab","scripting"],"optional_permissions":[],"content_scripts":[{"matches":["*://github.com/*","*://bitbucket.org/*","*://dev.azure.com/*","*://*.visualstudio.com/*","*://gitea.com/*","*://gitlab.com/*","*://gitee.com/*","*://sourceforge.net/*"],"js":["main.js"],"css":["injected-styles.css"],"run_at":"document_start"}],"options_ui":{"page":"options.html","open_in_tab":true},"browser_action":{},"page_action":{},"action":{"default_title":"Material Icons Settings","default_popup":"settings-popup.html","default_icon":{"16":"icon-16.png","32":"icon-32.png","48":"icon-48.png","128":"icon-128.png"}},"icons":{"16":"icon-16.png","32":"icon-32.png","48":"icon-48.png","128":"icon-128.png"},"web_accessible_resources":[{"resources":["*.svg"],"matches":["*://github.com/*","*://bitbucket.org/*","*://dev.azure.com/*","*://*.visualstudio.com/*","*://gitea.com/*","*://gitlab.com/*","*://gitee.com/*","*://sourceforge.net/*","*://*/*"]}],"background":{},"_id":"material-icons-for-github"};
const CONTENT_SCRIPT_CONFIGS_FOR_MATCHING = [
{
"matches": [
"*://github.com/*",
"*://bitbucket.org/*",
"*://dev.azure.com/*",
"*://*.visualstudio.com/*",
"*://gitea.com/*",
"*://gitlab.com/*",
"*://gitee.com/*",
"*://sourceforge.net/*"
]
}
];
const OPTIONS_PAGE_PATH = "options.html";
const POPUP_PAGE_PATH = "settings-popup.html";
const EXTENSION_ICON = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAADwElEQVR4nNWaz0sVURTH732ZuzYZmdky6c/oDwjEirl3zKA2pvQTatOuokUZldWi9+acB+XCzaNtPQvyR4uy5FmgRf4IAt1Jgr/ALLxx77wn78fMvJnxjm+68AURRj/fM2funHPuEKJjGc8OEAPaKYPHlMFrymGGMlykHH5TjuuUwy/K4TtlkKUcewlHTkxsJDVd7dY+YuJlyvET5SiCCzYpw1FiwgVi4N6dA++AQyrSHNfCgTuIwSpl8JCY6YPRgZ+zdhNuXaEcV7SB8wqtEY43iZGp1wtvpI9QDl8iBBdld2SctCdb9MAz62TEURcuJpYIS7dtD57DWcrxz47D860H/S9h2BUO3oDu2oFjsYlNYkBnwMjjCem+9vBYdCf8ppOBh2X+1R4ay7UiN5Mq8Jl6yvFzDGCFi3JqO/dInesxgBReIgyvuUQ/2azeiDGApNVSqcNqquCnDB/FAE74E9wvpW/ra9Ba20QtBqulBSCDS34v3mWmRWvPgOhMjTjq2J2sSJjRmyDMOl+UPjDm98LbL3JiY2PDU5n3s2LPmecR3wUctelNbFS1uc8LByfmqhqQmltYEtnxn76VfvtNNHf3B3kONu2mSHZSAZwPT877MhBG/e+mJZj/NDKAkXxz4vuika/RGRienBcJIxnERC+hHAfiZiDBUv5MMHwl9//Z2Bkw/JqAGWJPDOJpIFHNBMMFkh99xMcAS5XJ8jKxLlNoI94GUl4mlIHF/8FAQhkAhxRi8CO+BqxSlZtgOC0NvImnAasCvqCiXeilfA88iZ8ByxHcwUSv7MJOxcuAVRU+wUCmj11KBC3mhnwWc2E0ODHnDS4jn4enzMoXcxGU02F1KzNWBV41M7Y4fihq5tXQ1n9DczcrOlNDeQ1rUWtPVtSZ6JkyW/AMShsaOesP2lKqh63w2neS435efYdJeEVdRV5ppeJMIWhZ7WrCEzwAPHOFl7+/53ZwEXisoiC0Rx3K8r1Y1rI60tI52LKhIo46t0U4XHWG3+Zo0d2EjqhDoYTIkaM36twNbHO4a0dRf9Tp1oNbbbirYbxuQ+mMOsi8/0tMq5UEWgy7whgoMRF8exQO8CEOODQcMWlIGaEiH/qIqbBMOE45LOsw4R8cZK2zFDxt3FZ7skUefYYzIXeogPAcc3IzIVqX3L5UzRTubvgDh4gOuotXh9VEGT4I/tb2TJdV+Tfd37BRrLa+BsLxIuXw0X8/Ubq7UFkS7/jHHk5LNhbMMmWLpz6pYTilph1yZGNL/jxV8rnN6af7dfzvfzlz3XrDjDi5AAAAAElFTkSuQmCC";
const extensionCssData = { "injected-styles.css": "body[data-material-icons-extension-size='sm'] img[data-material-icons-extension='icon'] {\n transform: scale(0.875);\n}\n\nbody[data-material-icons-extension-size='lg'] img[data-material-icons-extension='icon'] {\n transform: scale(1.125);\n}\n\nbody[data-material-icons-extension-size='xl'] img[data-material-icons-extension='icon'] {\n transform: scale(1.25);\n}\n\n.material-icons-exension-hide-pseudo::before {\n display: none !important;\n}\n\n/* Hide folder open/closed icons from new code view tree when clicked by disabling\n display of those icons when they immediately follow the replaced icon */\nimg[data-material-icons-extension='icon'] + svg.octicon-file-directory-open-fill,\nimg[data-material-icons-extension='icon'] + svg.octicon-file-directory-fill {\n display: none !important;\n}\n\n/* github package icon spacing fix */\n.octicon-package[data-material-icons-extension] {\n margin-right: 5px;\n}\n.octicon-file-zip[data-material-icons-extension] {\n margin-right: 5px;\n}\n\n.releases-download-list .item a {\n display: flex;\n align-items: center;\n}\n"};
const LOCALE_KEYS = {};
const USED_LOCALE = "en";
const CURRENT_LOCATION = window.location.href;
const convertMatchPatternToRegExp = function convertMatchPatternToRegExp(pattern) {
if (pattern === "")
return new RegExp(".*");
try {
const singleEscapedPattern = convertMatchPatternToRegExpString(pattern).replace(/\\\\/g, "\\");
return new RegExp(singleEscapedPattern);
} catch (error) {
debug("Error converting match pattern to RegExp: %s, Error: %s", pattern, error.message);
return new RegExp("$.");
}
};
const convertMatchPatternToRegExpString = function convertMatchPatternToRegExpString(pattern) {
function escapeRegex(s) {
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\\\$&");
}
if (typeof pattern !== "string" || !pattern)
return "$.";
const schemeMatch = pattern.match(/^(\*|https?|file|ftp):\/\//);
if (!schemeMatch)
return "$.";
const scheme = schemeMatch[1];
pattern = pattern.substring(schemeMatch[0].length);
const schemeRegex = scheme === "*" ? "https?|file|ftp" : scheme, hostMatch = pattern.match(/^([^\/]+)/);
if (!hostMatch)
return "$.";
const host = hostMatch[1];
pattern = pattern.substring(host.length);
let hostRegex;
if (host === "*")
hostRegex = "[^/]+";
else if (host.startsWith("*."))
hostRegex = "(?:[^\\/]+\\.)?" + escapeRegex(host.substring(2));
else
hostRegex = escapeRegex(host);
let pathRegex = pattern;
if (!pathRegex.startsWith("/"))
pathRegex = "/" + pathRegex;
pathRegex = pathRegex.split("*").map(escapeRegex).join(".*");
if (pathRegex === "/.*")
pathRegex = "(?:/.*)?";
else
pathRegex = pathRegex + "(?:[?#]|$)";
return `^${schemeRegex}:\\/\\/${hostRegex}${pathRegex}`;
};
const ALL_PERMISSIONS = [
...(INJECTED_MANIFEST.permissions || []),
...(INJECTED_MANIFEST.optional_permissions || []),
...(INJECTED_MANIFEST.host_permissions || []),
...(INJECTED_MANIFEST.content_scripts
?.map((cs) => cs.matches || [])
?.flat() || []),
];
const isOrigin = (perm) => {
if (
perm.startsWith("*://") ||
perm.startsWith("http://") ||
perm.startsWith("https://")
) {
return true;
}
return false;
};
const ORIGIN_PERMISSIONS = ALL_PERMISSIONS.filter(isOrigin);
const EXTENSION_PERMISSIONS = ALL_PERMISSIONS.filter((perm) => !isOrigin(perm));
function _testBlobCSP() {
try {
const code = `console.log("Blob CSP test");`;
const blob = new Blob([code], { type: "application/javascript" });
const blobUrl = URL.createObjectURL(blob);
const script = document.createElement("script");
script.src = blobUrl;
let blocked = false;
script.onerror = () => {
blocked = true;
};
document.head.appendChild(script);
return new Promise((resolve) => {
setTimeout(() => {
resolve(!blocked);
document.head.removeChild(script);
URL.revokeObjectURL(blobUrl);
}, 100);
});
} catch (e) {
return Promise.resolve(false);
}
}
let CAN_USE_BLOB_CSP = false;
const waitForDOMEnd = () => {
if (document.readyState === "loading") {
return new Promise((resolve) =>
document.addEventListener("DOMContentLoaded", resolve, { once: true })
);
}
return Promise.resolve();
};
waitForDOMEnd().then(() => {
_testBlobCSP().then((result) => {
CAN_USE_BLOB_CSP = result;
});
});
function _base64ToBlob(base64, mimeType = "application/octet-stream") {
const binary = atob(base64);
const len = binary.length;
const bytes = new Uint8Array(len);
for (let i = 0; i < len; i++) bytes[i] = binary.charCodeAt(i);
return new Blob([bytes], { type: mimeType });
}
function _getMimeTypeFromPath(p) {
const ext = (p.split(".").pop() || "").toLowerCase();
const map = {
html: "text/html",
htm: "text/html",
js: "text/javascript",
css: "text/css",
json: "application/json",
png: "image/png",
jpg: "image/jpeg",
jpeg: "image/jpeg",
gif: "image/gif",
svg: "image/svg+xml",
webp: "image/webp",
ico: "image/x-icon",
woff: "font/woff",
woff2: "font/woff2",
ttf: "font/ttf",
otf: "font/otf",
eot: "application/vnd.ms-fontobject",
};
return map[ext] || "application/octet-stream";
}
function _isTextAsset(ext) {
return ["html", "htm", "js", "css", "json", "svg", "txt", "xml"].includes(
ext
);
}
function _createAssetUrl(path = "") {
if (path.startsWith("/")) path = path.slice(1);
const assetData = EXTENSION_ASSETS_MAP[path];
if (typeof assetData === "undefined") {
_warn("[runtime.getURL] Asset not found for", path);
return path;
}
const mime = _getMimeTypeFromPath(path);
const ext = (path.split(".").pop() || "").toLowerCase();
if (CAN_USE_BLOB_CSP) {
let blob;
if (_isTextAsset(ext)) {
blob = new Blob([assetData], { type: mime });
} else {
blob = _base64ToBlob(assetData, mime);
}
return URL.createObjectURL(blob);
} else {
if (_isTextAsset(ext)) {
return `data:${mime};base64,${btoa(assetData)}`;
} else {
return `data:${mime};base64,${assetData}`;
}
}
}
function _matchGlobPattern(pattern, path) {
if (!pattern || !path) return false;
pattern = pattern.replace(/\\/g, "/");
path = path.replace(/\\/g, "/");
if (pattern === path) return true;
let regexPattern = pattern
.replace(/[.+?^${}()|[\]\\]/g, "\\$&") // Escape regex chars
.replace(/\*\*/g, "__DOUBLESTAR__") // Temporarily replace **
.replace(/\*/g, "[^/]*") // * matches any chars except /
.replace(/__DOUBLESTAR__/g, ".*"); // ** matches any chars including /
regexPattern = "^" + regexPattern + "$";
try {
const regex = new RegExp(regexPattern);
return regex.test(path);
} catch (e) {
_error(`Invalid glob pattern: ${pattern}`, e);
return false;
}
}
function _isWebAccessibleResource(resourcePath, webAccessibleResources) {
if (
!Array.isArray(webAccessibleResources) ||
webAccessibleResources.length === 0
) {
return false;
}
// Normalize the resource path
const normalizedPath = resourcePath.replace(/\\/g, "/").replace(/^\/+/, "");
for (const webAccessibleResource of webAccessibleResources) {
let patterns = [];
// Handle both manifest v2 and v3 formats
if (typeof webAccessibleResource === "string") {
// Manifest v2 format: array of strings
patterns = [webAccessibleResource];
} else if (
webAccessibleResource &&
Array.isArray(webAccessibleResource.resources)
) {
// Manifest v3 format: objects with resources array
patterns = webAccessibleResource.resources;
}
// Check if the path matches any pattern
for (const pattern of patterns) {
if (_matchGlobPattern(pattern, normalizedPath)) {
return true;
}
}
}
return false;
}
window._matchGlobPattern = _matchGlobPattern;
window._isWebAccessibleResource = _isWebAccessibleResource;
// This function contains all the CSS injection and JS execution,
// ordered by run_at timing internally using await.
// #region Script Execution Logic
async function executeAllScripts(globalThis, extensionCssData) {
const {chrome, browser, global, window, self} = globalThis;
const scriptName = "Material Icons for GitHub";
_log(`Starting execution phases...`);
// #region Document Start
if (typeof document !== 'undefined') {
_log(`Executing document-start phase...`);
const cssKey_0 = "injected-styles.css";
try {
if (extensionCssData[cssKey_0]) {
_log(` Injecting CSS (start): ${cssKey_0}`);
const style = document.createElement('style');
style.textContent = extensionCssData[cssKey_0];
(document.head || document.documentElement).appendChild(style);
} else { console.warn(` CSS not found (start): ${cssKey_0}`); }
} catch(e) { _error(` Failed injecting CSS (${cssKey_0}) in phase start`, e, extensionCssData); }
const scriptPaths = ["main.js"];
_log(` Executing JS (start): ${scriptPaths}`);
try {
// Keep variables from being redeclared for global scope, but also make them apply to global scope. (Theoretically)
with (globalThis){;
// START: main.js
(()=>{var Is=Object.create;var Oe=Object.defineProperty;var qs=Object.getOwnPropertyDescriptor;var Ps=Object.getOwnPropertyNames;var Ss=Object.getPrototypeOf,Ts=Object.prototype.hasOwnProperty;var ae=(e,s)=>()=>(s||e((s={exports:{}}).exports,s),s.exports);var Ms=(e,s,o,n)=>{if(s&&typeof s=="object"||typeof s=="function")for(let r of Ps(s))!Ts.call(e,r)&&r!==o&&Oe(e,r,{get:()=>s[r],enumerable:!(n=qs(s,r))||n.enumerable});return e};var H=(e,s,o)=>(o=e!=null?Is(Ss(e)):{},Ms(s||!e||!e.__esModule?Oe(o,"default",{value:e,enumerable:!0}):o,e));var U=ae((ie,Re)=>{(function(e,s){if(typeof define=="function"&&define.amd)define("webextension-polyfill",["module"],s);else if(typeof ie<"u")s(Re);else{var o={exports:{}};s(o),e.browser=o.exports}})(typeof globalThis<"u"?globalThis:typeof self<"u"?self:ie,function(e){"use strict";if(!(globalThis.chrome&&globalThis.chrome.runtime&&globalThis.chrome.runtime.id))throw new Error("This script should only be loaded in a browser extension.");if(globalThis.browser&&globalThis.browser.runtime&&globalThis.browser.runtime.id)e.exports=globalThis.browser;else{let s="The message port closed before a response was received.",o=n=>{let r={alarms:{clear:{minArgs:0,maxArgs:1},clearAll:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getAll:{minArgs:0,maxArgs:0}},bookmarks:{create:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},getChildren:{minArgs:1,maxArgs:1},getRecent:{minArgs:1,maxArgs:1},getSubTree:{minArgs:1,maxArgs:1},getTree:{minArgs:0,maxArgs:0},move:{minArgs:2,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeTree:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}},browserAction:{disable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},enable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},getBadgeBackgroundColor:{minArgs:1,maxArgs:1},getBadgeText:{minArgs:1,maxArgs:1},getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},openPopup:{minArgs:0,maxArgs:0},setBadgeBackgroundColor:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setBadgeText:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},browsingData:{remove:{minArgs:2,maxArgs:2},removeCache:{minArgs:1,maxArgs:1},removeCookies:{minArgs:1,maxArgs:1},removeDownloads:{minArgs:1,maxArgs:1},removeFormData:{minArgs:1,maxArgs:1},removeHistory:{minArgs:1,maxArgs:1},removeLocalStorage:{minArgs:1,maxArgs:1},removePasswords:{minArgs:1,maxArgs:1},removePluginData:{minArgs:1,maxArgs:1},settings:{minArgs:0,maxArgs:0}},commands:{getAll:{minArgs:0,maxArgs:0}},contextMenus:{remove:{minArgs:1,maxArgs:1},removeAll:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},cookies:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:1,maxArgs:1},getAllCookieStores:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},devtools:{inspectedWindow:{eval:{minArgs:1,maxArgs:2,singleCallbackArg:!1}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0},elements:{createSidebarPane:{minArgs:1,maxArgs:1}}}},downloads:{cancel:{minArgs:1,maxArgs:1},download:{minArgs:1,maxArgs:1},erase:{minArgs:1,maxArgs:1},getFileIcon:{minArgs:1,maxArgs:2},open:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},pause:{minArgs:1,maxArgs:1},removeFile:{minArgs:1,maxArgs:1},resume:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},extension:{isAllowedFileSchemeAccess:{minArgs:0,maxArgs:0},isAllowedIncognitoAccess:{minArgs:0,maxArgs:0}},history:{addUrl:{minArgs:1,maxArgs:1},deleteAll:{minArgs:0,maxArgs:0},deleteRange:{minArgs:1,maxArgs:1},deleteUrl:{minArgs:1,maxArgs:1},getVisits:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1}},i18n:{detectLanguage:{minArgs:1,maxArgs:1},getAcceptLanguages:{minArgs:0,maxArgs:0}},identity:{launchWebAuthFlow:{minArgs:1,maxArgs:1}},idle:{queryState:{minArgs:1,maxArgs:1}},management:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},getSelf:{minArgs:0,maxArgs:0},setEnabled:{minArgs:2,maxArgs:2},uninstallSelf:{minArgs:0,maxArgs:1}},notifications:{clear:{minArgs:1,maxArgs:1},create:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:0},getPermissionLevel:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},pageAction:{getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},hide:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},permissions:{contains:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},request:{minArgs:1,maxArgs:1}},runtime:{getBackgroundPage:{minArgs:0,maxArgs:0},getPlatformInfo:{minArgs:0,maxArgs:0},openOptionsPage:{minArgs:0,maxArgs:0},requestUpdateCheck:{minArgs:0,maxArgs:0},sendMessage:{minArgs:1,maxArgs:3},sendNativeMessage:{minArgs:2,maxArgs:2},setUninstallURL:{minArgs:1,maxArgs:1}},sessions:{getDevices:{minArgs:0,maxArgs:1},getRecentlyClosed:{minArgs:0,maxArgs:1},restore:{minArgs:0,maxArgs:1}},storage:{local:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},managed:{get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1}},sync:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}}},tabs:{captureVisibleTab:{minArgs:0,maxArgs:2},create:{minArgs:1,maxArgs:1},detectLanguage:{minArgs:0,maxArgs:1},discard:{minArgs:0,maxArgs:1},duplicate:{minArgs:1,maxArgs:1},executeScript:{minArgs:1,maxArgs:2},get:{minArgs:1,maxArgs:1},getCurrent:{minArgs:0,maxArgs:0},getZoom:{minArgs:0,maxArgs:1},getZoomSettings:{minArgs:0,maxArgs:1},goBack:{minArgs:0,maxArgs:1},goForward:{minArgs:0,maxArgs:1},highlight:{minArgs:1,maxArgs:1},insertCSS:{minArgs:1,maxArgs:2},move:{minArgs:2,maxArgs:2},query:{minArgs:1,maxArgs:1},reload:{minArgs:0,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeCSS:{minArgs:1,maxArgs:2},sendMessage:{minArgs:2,maxArgs:3},setZoom:{minArgs:1,maxArgs:2},setZoomSettings:{minArgs:1,maxArgs:2},update:{minArgs:1,maxArgs:2}},topSites:{get:{minArgs:0,maxArgs:0}},webNavigation:{getAllFrames:{minArgs:1,maxArgs:1},getFrame:{minArgs:1,maxArgs:1}},webRequest:{handlerBehaviorChanged:{minArgs:0,maxArgs:0}},windows:{create:{minArgs:0,maxArgs:1},get:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:1},getCurrent:{minArgs:0,maxArgs:1},getLastFocused:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}}};if(Object.keys(r).length===0)throw new Error("api-metadata.json has not been included in browser-polyfill");class t extends WeakMap{constructor(f,p=void 0){super(p),this.createItem=f}get(f){return this.has(f)||this.set(f,this.createItem(f)),super.get(f)}}let l=d=>d&&typeof d=="object"&&typeof d.then=="function",i=(d,f)=>(...p)=>{n.runtime.lastError?d.reject(new Error(n.runtime.lastError.message)):f.singleCallbackArg||p.length<=1&&f.singleCallbackArg!==!1?d.resolve(p[0]):d.resolve(p)},a=d=>d==1?"argument":"arguments",c=(d,f)=>function(b,...j){if(j.lengthf.maxArgs)throw new Error(`Expected at most ${f.maxArgs} ${a(f.maxArgs)} for ${d}(), got ${j.length}`);return new Promise((N,A)=>{if(f.fallbackToNoCallback)try{b[d](...j,i({resolve:N,reject:A},f))}catch(g){console.warn(`${d} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `,g),b[d](...j),f.fallbackToNoCallback=!1,f.noCallback=!0,N()}else f.noCallback?(b[d](...j),N()):b[d](...j,i({resolve:N,reject:A},f))})},m=(d,f,p)=>new Proxy(f,{apply(b,j,N){return p.call(j,d,...N)}}),u=Function.call.bind(Object.prototype.hasOwnProperty),h=(d,f={},p={})=>{let b=Object.create(null),j={has(A,g){return g in d||g in b},get(A,g,_){if(g in b)return b[g];if(!(g in d))return;let y=d[g];if(typeof y=="function")if(typeof f[g]=="function")y=m(d,d[g],f[g]);else if(u(p,g)){let F=c(g,p[g]);y=m(d,d[g],F)}else y=y.bind(d);else if(typeof y=="object"&&y!==null&&(u(f,g)||u(p,g)))y=h(y,f[g],p[g]);else if(u(p,"*"))y=h(y,f[g],p["*"]);else return Object.defineProperty(b,g,{configurable:!0,enumerable:!0,get(){return d[g]},set(F){d[g]=F}}),y;return b[g]=y,y},set(A,g,_,y){return g in b?b[g]=_:d[g]=_,!0},defineProperty(A,g,_){return Reflect.defineProperty(b,g,_)},deleteProperty(A,g){return Reflect.deleteProperty(b,g)}},N=Object.create(d);return new Proxy(N,j)},v=d=>({addListener(f,p,...b){f.addListener(d.get(p),...b)},hasListener(f,p){return f.hasListener(d.get(p))},removeListener(f,p){f.removeListener(d.get(p))}}),E=new t(d=>typeof d!="function"?d:function(p){let b=h(p,{},{getContent:{minArgs:0,maxArgs:0}});d(b)}),P=new t(d=>typeof d!="function"?d:function(p,b,j){let N=!1,A,g=new Promise(B=>{A=function(z){N=!0,B(z)}}),_;try{_=d(p,b,A)}catch(B){_=Promise.reject(B)}let y=_!==!0&&l(_);if(_!==!0&&!y&&!N)return!1;let F=B=>{B.then(z=>{j(z)},z=>{let le;z&&(z instanceof Error||typeof z.message=="string")?le=z.message:le="An unexpected error occurred",j({__mozWebExtensionPolyfillReject__:!0,message:le})}).catch(z=>{console.error("Failed to send onMessage rejected reply",z)})};return F(y?_:g),!0}),S=({reject:d,resolve:f},p)=>{n.runtime.lastError?n.runtime.lastError.message===s?f():d(new Error(n.runtime.lastError.message)):p&&p.__mozWebExtensionPolyfillReject__?d(new Error(p.message)):f(p)},I=(d,f,p,...b)=>{if(b.lengthf.maxArgs)throw new Error(`Expected at most ${f.maxArgs} ${a(f.maxArgs)} for ${d}(), got ${b.length}`);return new Promise((j,N)=>{let A=S.bind(null,{resolve:j,reject:N});b.push(A),p.sendMessage(...b)})},q={devtools:{network:{onRequestFinished:v(E)}},runtime:{onMessage:v(P),onMessageExternal:v(P),sendMessage:I.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:I.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},M={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return r.privacy={network:{"*":M},services:{"*":M},websites:{"*":M}},h(n,q,r)};e.exports=o(chrome)}})});var Ge=ae((fn,de)=>{"use strict";var O=typeof Reflect=="object"?Reflect:null,He=O&&typeof O.apply=="function"?O.apply:function(s,o,n){return Function.prototype.apply.call(s,o,n)},J;O&&typeof O.ownKeys=="function"?J=O.ownKeys:Object.getOwnPropertySymbols?J=function(s){return Object.getOwnPropertyNames(s).concat(Object.getOwnPropertySymbols(s))}:J=function(s){return Object.getOwnPropertyNames(s)};function Rs(e){console&&console.warn&&console.warn(e)}var We=Number.isNaN||function(s){return s!==s};function x(){x.init.call(this)}de.exports=x;de.exports.once=Us;x.EventEmitter=x;x.prototype._events=void 0;x.prototype._eventsCount=0;x.prototype._maxListeners=void 0;var Ue=10;function X(e){if(typeof e!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}Object.defineProperty(x,"defaultMaxListeners",{enumerable:!0,get:function(){return Ue},set:function(e){if(typeof e!="number"||e<0||We(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");Ue=e}});x.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0};x.prototype.setMaxListeners=function(s){if(typeof s!="number"||s<0||We(s))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+s+".");return this._maxListeners=s,this};function Ke(e){return e._maxListeners===void 0?x.defaultMaxListeners:e._maxListeners}x.prototype.getMaxListeners=function(){return Ke(this)};x.prototype.emit=function(s){for(var o=[],n=1;n0&&(l=o[0]),l instanceof Error)throw l;var i=new Error("Unhandled error."+(l?" ("+l.message+")":""));throw i.context=l,i}var a=t[s];if(a===void 0)return!1;if(typeof a=="function")He(a,this,o);else for(var c=a.length,m=Xe(a,c),n=0;n0&&l.length>r&&!l.warned){l.warned=!0;var i=new Error("Possible EventEmitter memory leak detected. "+l.length+" "+String(s)+" listeners added. Use emitter.setMaxListeners() to increase limit");i.name="MaxListenersExceededWarning",i.emitter=e,i.type=s,i.count=l.length,Rs(i)}return e}x.prototype.addListener=function(s,o){return Qe(this,s,o,!1)};x.prototype.on=x.prototype.addListener;x.prototype.prependListener=function(s,o){return Qe(this,s,o,!0)};function Ds(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function Ve(e,s,o){var n={fired:!1,wrapFn:void 0,target:e,type:s,listener:o},r=Ds.bind(n);return r.listener=o,n.wrapFn=r,r}x.prototype.once=function(s,o){return X(o),this.on(s,Ve(this,s,o)),this};x.prototype.prependOnceListener=function(s,o){return X(o),this.prependListener(s,Ve(this,s,o)),this};x.prototype.removeListener=function(s,o){var n,r,t,l,i;if(X(o),r=this._events,r===void 0)return this;if(n=r[s],n===void 0)return this;if(n===o||n.listener===o)--this._eventsCount===0?this._events=Object.create(null):(delete r[s],r.removeListener&&this.emit("removeListener",s,n.listener||o));else if(typeof n!="function"){for(t=-1,l=n.length-1;l>=0;l--)if(n[l]===o||n[l].listener===o){i=n[l].listener,t=l;break}if(t<0)return this;t===0?n.shift():Bs(n,t),n.length===1&&(r[s]=n[0]),r.removeListener!==void 0&&this.emit("removeListener",s,i||o)}return this};x.prototype.off=x.prototype.removeListener;x.prototype.removeAllListeners=function(s){var o,n,r;if(n=this._events,n===void 0)return this;if(n.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):n[s]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete n[s]),this;if(arguments.length===0){var t=Object.keys(n),l;for(r=0;r=0;r--)this.removeListener(s,o[r]);return this};function Ze(e,s,o){var n=e._events;if(n===void 0)return[];var r=n[s];return r===void 0?[]:typeof r=="function"?o?[r.listener||r]:[r]:o?Hs(r):Xe(r,r.length)}x.prototype.listeners=function(s){return Ze(this,s,!0)};x.prototype.rawListeners=function(s){return Ze(this,s,!1)};x.listenerCount=function(e,s){return typeof e.listenerCount=="function"?e.listenerCount(s):Je.call(e,s)};x.prototype.listenerCount=Je;function Je(e){var s=this._events;if(s!==void 0){var o=s[e];if(typeof o=="function")return 1;if(o!==void 0)return o.length}return 0}x.prototype.eventNames=function(){return this._eventsCount>0?J(this._events):[]};function Xe(e,s){for(var o=new Array(s),n=0;n{"use strict";var je=Object.defineProperty,Ks=Object.getOwnPropertyDescriptor,Qs=Object.getOwnPropertyNames,Vs=Object.prototype.hasOwnProperty,Zs=(e,s)=>{for(var o in s)je(e,o,{get:s[o],enumerable:!0})},Js=(e,s,o,n)=>{if(s&&typeof s=="object"||typeof s=="function")for(let r of Qs(s))!Vs.call(e,r)&&r!==o&&je(e,r,{get:()=>s[r],enumerable:!(n=Ks(s,r))||n.enumerable});return e},Xs=e=>Js(je({},"__esModule",{value:!0}),e),ns={};Zs(ns,{availableIconPacks:()=>Eo,generateManifest:()=>No});ls.exports=Xs(ns);var k=(...e)=>e.reduce((s,o)=>(Object.keys(o??{}).forEach(n=>{let r=s[n],t=o?.[n];r==null&&t!==void 0&&t!==null?s[n]=t:t==null&&r!==void 0&&r!==null||(Array.isArray(t)&&Array.isArray(r)?s[n]=[...new Set(r.concat(t))]:typeof t=="object"&&t!==null&&typeof r=="object"&&r!==null?s[n]=k(r,t):s[n]=t)}),s),{}),fe="#90a4ae",rs=()=>({folders:{theme:"specific",color:fe,associations:{},customClones:[]},rootFolders:{color:fe,associations:{}},activeIconPack:"angular",hidesExplorerArrows:!1,opacity:1,saturation:1,files:{color:fe,associations:{},customClones:[]},languages:{associations:{},customClones:[]},enableLogging:!1,logLevel:"info"}),Ys=e=>k(rs(),e??{}),Gs=Ge(),eo="material-icon-theme",so=`${eo}-log-event`,Y="./../icons/",K="-open",L="_light",$="_highContrast",ke=".clone.svg",xe=new RegExp(/^\*{1,2}\./),oo=new Gs.EventEmitter({captureRejections:!0}),no=()=>{let e=(s,o)=>{let n=new Date().toISOString(),r={level:s,message:`[${s.toUpperCase()}] ${n} - ${o}`};oo.emit(so,r)};return{info:s=>e("info",s),error:s=>e("error",s),debug:s=>e("debug",s)}},ro=no(),we=e=>{var s,o,n,r,t,l,i,a,c,m,u,h,v,E,P,S,I;try{let q=rs(),M="";return(e.saturation!==q.saturation||e.opacity!==q.opacity||((s=e.files)==null?void 0:s.color)!==q.files.color||((o=e.folders)==null?void 0:o.color)!==q.folders.color||((n=e.rootFolders)==null?void 0:n.color)!==q.rootFolders.color||((l=(t=(r=e.files)==null?void 0:r.customClones)==null?void 0:t.length)!=null?l:0)>0||((c=(a=(i=e.folders)==null?void 0:i.customClones)==null?void 0:a.length)!=null?c:0)>0||((h=(u=(m=e.languages)==null?void 0:m.customClones)==null?void 0:u.length)!=null?h:0)>0)&&(M+=`~${to(JSON.stringify({saturation:e.saturation,opacity:e.opacity,foldersColor:(v=e.folders)==null?void 0:v.color,rootFoldersColor:(E=e.rootFolders)==null?void 0:E.color,filesColor:(P=e.files)==null?void 0:P.color,fileClones:(S=e.files)==null?void 0:S.customClones,folderClones:(I=e.folders)==null?void 0:I.customClones}))}`),M}catch(q){return ro.error(q),""}},to=e=>{let s=0,o=0;if(e.length===0)return s;for(let n=0;n{var n;let r=ao(e,s.activeIconPack),t=io((n=s.files)==null?void 0:n.associations),l=[...e.icons,...t],i=[...r,...t];return l.forEach(a=>{let c=a.clone!==void 0;o=R(o,s,a.name,c),a.light&&(o=R(o,s,a.name,c,L)),a.highContrast&&(o=R(o,s,a.name,c,$))}),i.forEach(a=>{var c;a.disabled||(a.fileExtensions&&(o=es(a,"fileExtensions",o)),a.fileNames&&(o=es(a,"fileNames",o,(c=s.files)==null?void 0:c.associations)))}),o=R(o,s,e.defaultIcon.name,!1),o.file=e.defaultIcon.name,e.defaultIcon.light&&o.light&&(o=R(o,s,e.defaultIcon.name,!1,L),o.light&&(o.light.file=e.defaultIcon.name+L)),e.defaultIcon.highContrast&&(o=R(o,s,e.defaultIcon.name,!1,$),o.highContrast&&(o.highContrast.file=e.defaultIcon.name+$)),o},es=(e,s,o,n={})=>{let r=e[s];return r===void 0||r.forEach(t=>{var l,i;let a=Object.keys(n).some(h=>{if(!/^\*{2}\./.test(h))return!1;let v=h.replace(xe,".");return t.toLowerCase().indexOf(v.toLowerCase())!==-1}),c=o[s],m=(l=o.light)==null?void 0:l[s],u=(i=o.highContrast)==null?void 0:i[s];a||!c||!m||!u||(c[t]=e.name,e.light&&(m[t]=`${e.name}${L}`),e.highContrast&&(u[t]=`${e.name}${$}`))}),o},ao=(e,s)=>e.icons.filter(o=>o.enabledFor?o.enabledFor.some(n=>n===s):!0),R=(e,s,o,n,r="")=>{var t;let l=n?ke:".svg",i=`${o}${r}`;if((t=e.iconDefinitions)!=null||(e.iconDefinitions={}),!e.iconDefinitions[i]){let a=we(s);e.iconDefinitions[i]={iconPath:`${Y}${o}${r}${a}${l}`}}return e},io=e=>e?Object.keys(e).map(s=>{let o={name:e[s].toLowerCase()};return xe.test(s)?o.fileExtensions=[s.toLowerCase().replace(xe,"")]:o.fileNames=[s.toLowerCase()],o}):[],co=(e,s,o)=>{var n,r,t,l,i;o.hidesExplorerArrows=s.hidesExplorerArrows;let a=fo(e,(n=s.folders)==null?void 0:n.theme);if(!a)return o;let c=go(a,s.activeIconPack),m=[...os((r=s.folders)==null?void 0:r.associations,!1),...os((t=s.rootFolders)==null?void 0:t.associations,!0)],u=[...(l=a.icons)!=null?l:[],...m],h=[...c,...m];return((i=s.folders)==null?void 0:i.theme)==="none"||(u.forEach(v=>{o=ye(o,s,v)}),h.forEach(v=>{var E,P;if(v.disabled)return;let S=ss((E=v?.folderNames)!=null?E:[]),I=ss((P=v?.rootFolderNames)!=null?P:[]);o=k(o,pe(v.name,S,I)),o.light=v.light?k(o.light,pe(v.name,S,I,L)):o.light,o.highContrast=v.highContrast?k(o.highContrast,pe(v.name,S,I,$)):o.highContrast}),o=mo(a,o,s)),o},mo=(e,s,o)=>{let n=!!e.defaultIcon.name&&e.defaultIcon.name.length>0;return n&&(s=ye(s,o,e.defaultIcon)),s=k(s,ue(n,e,"")),s.light=e.defaultIcon.light?k(s.light,ue(n,e,L)):s.light,s.highContrast=e.defaultIcon.highContrast?k(s.highContrast,ue(n,e,$)):s.highContrast,s=k(s,ve(n,e,"")),e.rootFolder&&(s=ye(s,o,e.rootFolder),s.light=e.rootFolder.light?k(s.light,ve(n,e,L)):s.light,s.highContrast=e.rootFolder.highContrast?k(s.highContrast,ve(n,e,$)):s.highContrast),s},fo=(e,s)=>e.find(o=>o.name===s),go=(e,s)=>!(e!=null&&e.icons)||e.icons.length===0?[]:e.icons.filter(o=>o.enabledFor?o.enabledFor.some(n=>n===s):!0),ye=(e,s,o)=>{let n=o.clone!==void 0;return e=ge(e,s,o.name,"",n),o.light&&(e=k(e,ge(e,s,o.name,L,n))),o.highContrast&&(e=k(e,ge(e,s,o.name,$,n))),e},ge=(e,s,o,n="",r=!1)=>{let t=we(s),l=e.iconDefinitions,i=r?ke:".svg",a=`${o}${n}`,c=`${o}${K}${n}`;return l&&(l[a]||(l[a]={iconPath:`${Y}${a}${t}${i}`}),l[`${c}`]||(l[`${c}`]={iconPath:`${Y}${c}${t}${i}`})),e},ss=e=>{let s=[],o=[["",""],[".",""],["_",""],["__","__"]];return e.forEach(n=>{o.forEach(r=>{s.push(`${r[0]}${n}${r[1]}`)})}),s},pe=(e,s,o,n="")=>{let r=i=>{let a={},c={};return i.forEach(m=>{a[m]=e+n,c[m]=`${e}${K}${n}`}),{regular:a,expanded:c}},t=r(s),l=r(o);return{folderNames:t.regular,folderNamesExpanded:t.expanded,rootFolderNames:l.regular,rootFolderNamesExpanded:l.expanded}},ue=(e,s,o="")=>{let n={folder:"",folderExpanded:""};return n.folder=e?s.defaultIcon.name+o:"",n.folderExpanded=e?`${s.defaultIcon.name}${K}${o}`:"",n},ve=(e,s,o="")=>{let n={rootFolder:"",rootFolderExpanded:""};return n.rootFolder=e?s.rootFolder?s.rootFolder.name+o:s.defaultIcon.name+o:"",n.rootFolderExpanded=e?s.rootFolder?`${s.rootFolder.name}${K}${o}`:`${s.defaultIcon.name}${K}${o}`:"",n},os=(e,s)=>e?Object.entries(e).map(([o,n])=>{let r={name:n?`folder-${n.toLowerCase()}`:"folder",folderNames:[],rootFolderNames:[]},t=s?"rootFolderNames":"folderNames";return r[t]=[o.toLowerCase()],r}):[],po=()=>({iconDefinitions:{},folderNames:{},folderNamesExpanded:{},rootFolderNames:{},rootFolderNamesExpanded:{},fileExtensions:{},fileNames:{},languageIds:{},light:{fileExtensions:{},fileNames:{}},highContrast:{fileExtensions:{},fileNames:{}}}),ts=(e=>(e.Angular="angular",e.Nest="nest",e.Ngrx="angular_ngrx",e.React="react",e.Redux="react_redux",e.Roblox="roblox",e.Qwik="qwik",e.Vue="vue",e.Vuex="vue_vuex",e))(ts||{}),uo=e=>Object.entries(e).flatMap(([s,o])=>{switch(o){case"ecmascript":return[`${s}.js`,`${s}.mjs`,`${s}.cjs`,`${s}.ts`,`${s}.mts`,`${s}.cts`];case"configuration":return[`${s}.json`,`${s}.jsonc`,`${s}.json5`,`${s}.yaml`,`${s}.yml`,`${s}.toml`];case"nodeEcosystem":return[`${s}.js`,`${s}.mjs`,`${s}.cjs`,`${s}.ts`,`${s}.mts`,`${s}.cts`,`${s}.json`,`${s}.jsonc`,`${s}.json5`,`${s}.yaml`,`${s}.yml`,`${s}.toml`];case"cosmiconfig":return[`.${s}rc`,`.${s}rc.json`,`.${s}rc.jsonc`,`.${s}rc.json5`,`.${s}rc.yaml`,`.${s}rc.yml`,`.${s}rc.toml`,`.${s}rc.js`,`.${s}rc.mjs`,`.${s}rc.cjs`,`.${s}rc.ts`,`.${s}rc.mts`,`.${s}rc.cts`,`.config/${s}rc`,`.config/${s}rc.json`,`.config/${s}rc.jsonc`,`.config/${s}rc.json5`,`.config/${s}rc.yaml`,`.config/${s}rc.yml`,`.config/${s}rc.toml`,`.config/${s}rc.js`,`.config/${s}rc.mjs`,`.config/${s}rc.cjs`,`.config/${s}rc.ts`,`.config/${s}rc.mts`,`.config/${s}rc.cts`,`${s}.config.json`,`${s}.config.jsonc`,`${s}.config.json5`,`${s}.config.yaml`,`${s}.config.yml`,`${s}.config.toml`,`${s}.config.js`,`${s}.config.mjs`,`${s}.config.cjs`,`${s}.config.ts`,`${s}.config.mts`,`${s}.config.cts`];case"yaml":return[`${s}.yaml`,`${s}.yml`];case"dotfile":return[`.${s}`,s];default:let n=o;throw new Error(`Unhandled pattern: ${n}`)}}),vo=e=>e.map(({patterns:s,fileNames:o=[],...n})=>({...n,fileNames:s?[...uo(s),...o]:o})),ho={defaultIcon:{name:"file"},icons:vo([{name:"html",fileExtensions:["htm","xhtml","html_vm","asp"]},{name:"pug",fileExtensions:["jade","pug"],fileNames:[".pug-lintrc",".pug-lintrc.js",".pug-lintrc.json"]},{name:"markdown",fileExtensions:["md","markdown","rst"]},{name:"blink",fileExtensions:["blink"],light:!0},{name:"css",fileExtensions:["css"]},{name:"sass",fileExtensions:["scss","sass"]},{name:"less",fileExtensions:["less"]},{name:"just",fileNames:["justfile",".justfile"]},{name:"json",fileExtensions:["json","jsonc","tsbuildinfo","json5","jsonl","ndjson"],fileNames:[".jscsrc",".jshintrc","composer.lock",".jsbeautifyrc",".esformatter","cdp.pid",".lintstagedrc",".whitesource"]},{name:"hjson",fileExtensions:["hjson"]},{name:"jinja",fileExtensions:["jinja","jinja2","j2","jinja-html"],light:!0},{name:"proto",fileExtensions:["proto"]},{name:"playwright",fileNames:["playwright.config.js","playwright.config.mjs","playwright.config.ts","playwright.config.base.js","playwright.config.base.mjs","playwright.config.base.ts","playwright-ct.config.js","playwright-ct.config.mjs","playwright-ct.config.ts"]},{name:"sublime",fileExtensions:["sublime-project","sublime-workspace"]},{name:"simulink",fileExtensions:["slx"]},{name:"twine",fileExtensions:["tw","twee"]},{name:"yaml",fileExtensions:["yml.dist","yaml.dist","YAML-tmLanguage"]},{name:"xml",fileExtensions:["xml","plist","xsd","dtd","xsl","xslt","resx","iml","xquery","tmLanguage","manifest","project","xml.dist","xml.dist.sample","dmn","jrxml","xmp"],fileNames:[".htaccess"]},{name:"toml",fileExtensions:["toml"],light:!0},{name:"image",fileExtensions:["png","jpeg","jpg","gif","ico","tif","tiff","ami","apx","avif","bmp","bpg","brk","cur","dds","exr","fpx","gbr","img","jbig2","jb2","jng","jxr","pgf","pic","raw","webp","eps","afphoto","ase","aseprite","clip","cpt","heif","heic","kra","mdp","ora","pdn","reb","sai","tga","xcf","jfif","ppm","pbm","pgm","pnm","icns","3fr","ari","arw","bay","braw","crw","cr2","cr3","cap","data","dcs","dcr","dng","drf","eip","erf","fff","gpr","iiq","k25","kdc","mdc","mef","mos","mrw","nef","nrw","obm","orf","pef","ptx","pxn","r3d","raf","rwl","rw2","rwz","sr2","srf","srw","x3f"]},{name:"palette",fileExtensions:["pal","gpl","act"]},{name:"javascript",fileExtensions:["esx","mjs"]},{name:"react",fileExtensions:["jsx"]},{name:"react_ts",fileExtensions:["tsx"]},{name:"rocket",fileNames:[".release-it.json",".release-it.ts",".release-it.js",".release-it.cjs",".release-it.yaml",".release-it.yml",".release-it.toml","release.toml","release-plz.toml",".release-plz.toml"]},{name:"routing",fileExtensions:["routing.ts","routing.tsx","routing.js","routing.jsx","route.ts","route.tsx","route.js","route.jsx","routes.ts","routes.tsx","routes.js","routes.jsx"],fileNames:["router.js","router.jsx","router.ts","router.tsx","route.js","route.jsx","route.ts","route.tsx","routes.js","routes.jsx","routes.ts","routes.tsx"],enabledFor:["angular","angular_ngrx","react","react_redux","vue","vue_vuex"]},{name:"redux-action",fileExtensions:["action.js","actions.js","action.ts","actions.ts"],fileNames:["action.js","actions.js","action.ts","actions.ts"],enabledFor:["react_redux"]},{name:"redux-reducer",fileExtensions:["reducer.js","reducers.js","reducer.ts","reducers.ts"],fileNames:["reducer.js","reducers.js","reducer.ts","reducers.ts"],enabledFor:["react_redux"]},{name:"redux-selector",fileExtensions:["selector.js","selectors.js","selector.ts","selectors.ts"],fileNames:["selector.js","selectors.js","selector.ts","selectors.ts"],enabledFor:["react_redux"]},{name:"redux-store",fileExtensions:["store.js","store.ts"],fileNames:["store.js","store.ts"],enabledFor:["react_redux"]},{name:"settings",fileExtensions:["ini","dlc","config","conf","properties","prop","settings","option","props","prefs","sln.dotsettings","sln.dotsettings.user","cfg","cnf","tool-versions"],fileNames:[".jshintignore",".buildignore",".mrconfig",".yardopts","manifest.mf",".clang-format",".clang-format-ignore",".clang-tidy",".conf","compile_flags.txt"]},{name:"typescript-def",fileExtensions:["d.ts","d.cts","d.mts","d.ets"]},{name:"markdoc",fileExtensions:["mdoc","markdoc","markdoc.md"]},{name:"markdoc-config",patterns:{"markdoc.config":"ecmascript"}},{name:"markojs",fileExtensions:["marko"]},{name:"astro",fileExtensions:["astro"]},{name:"astro-config",fileNames:["astro.config.js","astro.config.mjs","astro.config.cjs","astro.config.ts","astro.config.cts","astro.config.mts"]},{name:"pdf",fileExtensions:["pdf"]},{name:"table",fileExtensions:["xlsx","xlsm","xls","csv","tsv","psv","ods"]},{name:"vscode",fileExtensions:["vscodeignore","vsixmanifest","vsix","code-workplace","code-workspace","code-profile","code-snippets"]},{name:"visualstudio",fileExtensions:["csproj","ruleset","sln","slnx","suo","vb","vbs","vcxitems","vcxitems.filters","vcxproj","vcxproj.filters"]},{name:"database",fileExtensions:["pdb","sql","pks","pkb","accdb","mdb","sqlite","sqlite3","pgsql","postgres","plpgsql","psql","db","db3","dblite","dblite3","debugsymbols","odb"]},{name:"kusto",fileExtensions:["kql"]},{name:"csharp",fileExtensions:["cs","csx","csharp"]},{name:"qsharp",fileExtensions:["qs"]},{name:"zip",fileExtensions:["zip","z","tar","gz","xz","lz","liz","lzma","lzma2","lz4","lz5","lzh","lha","br","bz2","bzip2","gzip","brotli","7z","001","rar","far","tz","taz","tlz","txz","tgz","tpz","tbz","tbz2","zst","zstd","tzst","tzstd","cab","cpio","rpm","deb","arj","wim","swm","esd","fat","xar","ntfs","hfs","squashfs","apfs"]},{name:"vala",fileExtensions:["vala"]},{name:"zig",fileExtensions:["zig","zon"]},{name:"exe",fileExtensions:["exe","msi"]},{name:"hex",fileExtensions:["dat","bin","hex"]},{name:"java",fileExtensions:["java","jsp"]},{name:"jar",fileExtensions:["jar"]},{name:"javaclass",fileExtensions:["class"]},{name:"c3",fileExtensions:["c3"]},{name:"c",fileExtensions:["c","i","mi"]},{name:"h",fileExtensions:["h"]},{name:"cpp",fileExtensions:["cc","cpp","cxx","c++","cp","mii","ii"]},{name:"hpp",fileExtensions:["hh","hpp","hxx","h++","hp","tcc","inl"]},{name:"rc",fileExtensions:["rc"]},{name:"go",fileExtensions:["go"]},{name:"go-mod",fileNames:["go.mod","go.sum","go.work","go.work.sum"]},{name:"python",fileExtensions:["py"]},{name:"python-misc",fileExtensions:["pyc","whl","egg"],fileNames:["requirements.txt","pipfile",".python-version","manifest.in","pylintrc",".pylintrc","pyproject.toml","py.typed",".coveragerc",".coverage",".scrapy","celerybeat-schedule","celerybeat.pid"]},{name:"ruff",fileNames:["ruff.toml",".ruff.toml"]},{name:"uv",fileNames:["uv.toml",".uv.toml"]},{name:"scons",light:!0,fileNames:["sconstruct","sconscript","scsub"]},{name:"url",fileExtensions:["url"]},{name:"console",fileExtensions:["sh","ksh","csh","tcsh","zsh","bash","bat","cmd","awk","fish","exp","nu","xsh"],fileNames:["commit-msg","pre-commit","pre-push","post-merge"]},{name:"powershell",fileExtensions:["ps1","psm1","psd1","ps1xml","psc1","pssc"]},{name:"excalidraw",fileNames:["excalidraw.json","excalidraw.svg","excalidraw.png"],fileExtensions:["excalidraw.json","excalidraw.svg","excalidraw.png"]},{name:"gradle",fileExtensions:["gradle"],fileNames:["gradle.properties","gradlew","gradle-wrapper.properties"]},{name:"word",fileExtensions:["doc","docx","rtf","odt"]},{name:"certificate",fileExtensions:["cer","cert","crt"],fileNames:["copying","copying.md","copying.rst","copying.txt","copyright","copyright.md","copyright.rst","copyright.txt","license","license-agpl","license-apache","license-bsd","license-mit","license-gpl","license-lgpl","license.md","license.rst","license.txt","licence","licence-agpl","licence-apache","licence-bsd","licence-mit","licence-gpl","licence-lgpl","licence.md","licence.rst","licence.txt","unlicense","unlicense.txt"]},{name:"key",fileExtensions:["pub","key","pem","asc","gpg","passwd","shasum","sha256","sha256sum","sha256sums"],fileNames:[".htpasswd","sha256sums",".secrets"]},{name:"keystatic",fileNames:["keystatic.config.tsx","keystatic.config.ts","keystatic.config.jsx","keystatic.config.js"]},{name:"font",fileExtensions:["woff","woff2","ttf","eot","suit","otf","bmap","fnt","odttf","ttc","font","fonts","sui","ntf","mrf"]},{name:"lib",fileExtensions:["lib","a"]},{name:"bibliography",fileExtensions:["bib"]},{name:"bibtex-style",fileExtensions:["bst"]},{name:"dll",fileExtensions:["dll","ilk","so"]},{name:"ruby",fileExtensions:["rb","erb","rbs"],fileNames:[".ruby-version"]},{name:"gemfile",fileNames:["gemfile"]},{name:"rubocop",fileNames:[".rubocop.yml",".rubocop-todo.yml",".rubocop_todo.yml"],light:!0},{name:"rspec",fileNames:[".rspec"]},{name:"fsharp",fileExtensions:["fs","fsx","fsi","fsproj"]},{name:"swift",fileExtensions:["swift"]},{name:"arduino",fileExtensions:["ino"]},{name:"docker",fileExtensions:["dockerignore","dockerfile","docker-compose.yml","docker-compose.yaml","containerignore","containerfile","compose.yaml","compose.yml"],fileNames:["dockerfile","dockerfile.prod","dockerfile.production","dockerfile.alpha","dockerfile.beta","dockerfile.stage","dockerfile.staging","dockerfile.dev","dockerfile.development","dockerfile.local","dockerfile.test","dockerfile.testing","dockerfile.ci","dockerfile.web","dockerfile.windows","dockerfile.worker","docker-compose.yml","docker-compose.override.yml","docker-compose.prod.yml","docker-compose.production.yml","docker-compose.alpha.yml","docker-compose.beta.yml","docker-compose.stage.yml","docker-compose.staging.yml","docker-compose.dev.yml","docker-compose.development.yml","docker-compose.local.yml","docker-compose.test.yml","docker-compose.testing.yml","docker-compose.ci.yml","docker-compose.web.yml","docker-compose.worker.yml","docker-compose.yaml","docker-compose.override.yaml","docker-compose.prod.yaml","docker-compose.production.yaml","docker-compose.alpha.yaml","docker-compose.beta.yaml","docker-compose.stage.yaml","docker-compose.staging.yaml","docker-compose.dev.yaml","docker-compose.development.yaml","docker-compose.local.yaml","docker-compose.test.yaml","docker-compose.testing.yaml","docker-compose.ci.yaml","docker-compose.web.yaml","docker-compose.worker.yaml","containerfile","containerfile.prod","containerfile.production","containerfile.alpha","containerfile.beta","containerfile.stage","containerfile.staging","containerfile.dev","containerfile.development","containerfile.local","containerfile.test","containerfile.testing","containerfile.ci","containerfile.web","containerfile.worker","compose.yaml","compose.override.yaml","compose.prod.yaml","compose.production.yaml","compose.alpha.yaml","compose.beta.yaml","compose.stage.yaml","compose.staging.yaml","compose.dev.yaml","compose.development.yaml","compose.local.yaml","compose.test.yaml","compose.testing.yaml","compose.ci.yaml","compose.web.yaml","compose.worker.yaml","compose.yml","compose.override.yml","compose.prod.yml","compose.production.yml","compose.alpha.yml","compose.beta.yml","compose.stage.yml","compose.staging.yml","compose.dev.yml","compose.development.yml","compose.local.yml","compose.test.yml","compose.testing.yml","compose.ci.yml","compose.web.yml","compose.worker.yml"]},{name:"bbx",fileExtensions:["bbx"]},{name:"cbx",fileExtensions:["cbx"]},{name:"lbx",fileExtensions:["lbx"]},{name:"tex",fileExtensions:["tex"]},{name:"sty",fileExtensions:["sty"],clone:{base:"tex",color:"deep-purple-A200"}},{name:"ltx",fileExtensions:["ltx"],clone:{base:"tex",color:"teal-400"}},{name:"dtx",fileExtensions:["dtx"],clone:{base:"tex",color:"blue-gray-300"}},{name:"latexmk",patterns:{latexmkrc:"dotfile"}},{name:"powerpoint",fileExtensions:["pptx","ppt","pptm","potx","potm","ppsx","ppsm","pps","ppam","ppa","odp"]},{name:"video",fileExtensions:["webm","mkv","flv","vob","ogv","ogg","gifv","avi","mov","qt","wmv","yuv","rm","rmvb","mp4","m4v","mpg","mp2","mpeg","mpe","mpv","m2v"]},{name:"virtual",fileExtensions:["vdi","vbox","vbox-prev"]},{name:"vedic",fileExtensions:["ved","veda","vedic"]},{name:"email",fileExtensions:["edb","eml","emlx","ics","mbox","msg","oft","olm","ost","p7s","pst","rpmsg","tnef"],fileNames:[".mailmap"]},{name:"audio",fileExtensions:["8svx","aa","aac","aax","ac3","aif","aiff","alac","amr","ape","caf","cda","cdr","dss","ec3","efs","enc","flac","flp","gp","gsm","it","m3u","m3u8","m4a","m4b","m4p","m4r","mid","mka","mmf","mod","mp3","mpc","mscz","mtm","mui","musx","mxl","nsa","opus","pkf","qcp","ra","rf64","rip","sdt","sesx","sf2","stap","tg","voc","vqf","wav","weba","wfp","wma","wpl","wproj","wv"]},{name:"coffee",fileExtensions:["coffee","cson","iced"]},{name:"document",fileExtensions:["txt"]},{name:"lyric",fileExtensions:["lrc"]},{name:"graphql",fileExtensions:["graphql","gql"],fileNames:[".graphqlconfig"],patterns:{graphql:"cosmiconfig"}},{name:"rust",fileExtensions:["rs","ron"]},{name:"raml",fileExtensions:["raml"]},{name:"xaml",fileExtensions:["xaml"]},{name:"haskell",fileExtensions:["hs","lhs"]},{name:"kotlin",fileExtensions:["kt","kts"]},{name:"mist",fileExtensions:["mist.js","mist.ts","mist.jsx","mist.tsx"],clone:{base:"liquid",color:"blue-500"}},{name:"otne",fileExtensions:["otne"]},{name:"git",fileExtensions:["patch"],fileNames:[".git",".gitignore",".gitmessage",".gitignore-global",".gitignore_global",".gitattributes",".gitattributes-global",".gitattributes_global",".gitconfig",".gitmodules",".gitkeep",".keep",".gitpreserve",".gitinclude",".git-blame-ignore",".git-blame-ignore-revs",".git-for-windows-updater","git-history"]},{name:"lua",fileExtensions:["lua"],fileNames:[".luacheckrc"]},{name:"clojure",fileExtensions:["clj","cljs","cljc"]},{name:"groovy",fileExtensions:["groovy"]},{name:"r",fileExtensions:["r","rmd"],fileNames:[".Rhistory"]},{name:"dart",fileExtensions:["dart"],fileNames:[".pubignore"]},{name:"dart_generated",fileExtensions:["freezed.dart","g.dart"]},{name:"actionscript",fileExtensions:["as"]},{name:"mxml",fileExtensions:["mxml"]},{name:"autohotkey",fileExtensions:["ahk"]},{name:"flash",fileExtensions:["swf"]},{name:"adobe-swc",fileExtensions:["swc"]},{name:"swc",fileExtensions:["swcrc"]},{name:"cmake",fileExtensions:["cmake"],fileNames:["cmakelists.txt","cmakecache.txt"]},{name:"assembly",fileExtensions:["asm","a51","inc","nasm","s","ms","agc","ags","aea","argus","mitigus","binsource"]},{name:"vue",fileExtensions:["vue"]},{name:"semgrep",fileNames:["semgrep.yml",".semgrepignore"]},{name:"vue-config",fileNames:["vue.config.js","vue.config.ts","vetur.config.js","vetur.config.ts","volar.config.js"]},{name:"vuex-store",fileExtensions:["store.js","store.ts"],fileNames:["store.js","store.ts"],enabledFor:["vue_vuex"]},{name:"nuxt",fileNames:["nuxt.config.js","nuxt.config.ts",".nuxtignore",".nuxtrc"]},{name:"harmonix",fileNames:["harmonix.config.js","harmonix.config.ts"]},{name:"ocaml",fileExtensions:["ml","mli","cmx"]},{name:"odin",fileExtensions:["odin"]},{name:"javascript-map",fileExtensions:["js.map","mjs.map","cjs.map"]},{name:"css-map",fileExtensions:["css.map"]},{name:"lock",fileExtensions:["lock"],fileNames:["security.md","security.txt","security"]},{name:"handlebars",fileExtensions:["hbs","mustache"]},{name:"perl",fileExtensions:["pm","raku"]},{name:"haxe",fileExtensions:["hx"]},{name:"test-ts",fileExtensions:["spec.ts","spec.cts","spec.mts","cy.ts","e2e-spec.ts","e2e-spec.cts","e2e-spec.mts","test.ts","test.cts","test.mts","ts.snap","spec-d.ts","test-d.ts"]},{name:"test-jsx",fileExtensions:["spec.tsx","test.tsx","tsx.snap","spec.jsx","test.jsx","jsx.snap","cy.jsx","cy.tsx","spec-d.tsx","test-d.tsx"]},{name:"test-js",fileExtensions:["spec.js","spec.cjs","spec.mjs","e2e-spec.js","e2e-spec.cjs","e2e-spec.mjs","test.js","test.cjs","test.mjs","js.snap","cy.js"]},{name:"angular",fileExtensions:["module.ts","module.js","ng-template"],fileNames:["angular-cli.json",".angular-cli.json","angular.json","ng-package.json"],enabledFor:["angular","angular_ngrx"]},{name:"angular-component",clone:{base:"angular",color:"blue-700"},fileExtensions:["component.ts","component.js"],enabledFor:["angular","angular_ngrx"]},{name:"angular-guard",clone:{base:"angular",color:"green-600"},fileExtensions:["guard.ts","guard.js"],enabledFor:["angular","angular_ngrx"]},{name:"angular-service",clone:{base:"angular",color:"amber-400"},fileExtensions:["service.ts","service.js"],enabledFor:["angular","angular_ngrx"]},{name:"angular-pipe",clone:{base:"angular",color:"teal-600"},fileExtensions:["pipe.ts","pipe.js","filter.js"],enabledFor:["angular","angular_ngrx"]},{name:"angular-directive",clone:{base:"angular",color:"purple-400"},fileExtensions:["directive.ts","directive.js"],enabledFor:["angular","angular_ngrx"]},{name:"angular-resolver",clone:{base:"angular",color:"green-600"},fileExtensions:["resolver.ts","resolver.js"],enabledFor:["angular","angular_ngrx"]},{name:"angular-interceptor",clone:{base:"angular",color:"orange-500"},fileExtensions:["interceptor.ts","interceptor.js"],enabledFor:["angular","angular_ngrx"]},{name:"puppet",fileExtensions:["pp"]},{name:"elixir",fileExtensions:["ex","exs","eex","leex","heex"]},{name:"livescript",fileExtensions:["ls"]},{name:"erlang",fileExtensions:["erl"]},{name:"twig",fileExtensions:["twig"]},{name:"julia",fileExtensions:["jl"]},{name:"elm",fileExtensions:["elm"]},{name:"purescript",fileExtensions:["pure","purs"]},{name:"smarty",fileExtensions:["tpl"]},{name:"stylus",fileExtensions:["styl"]},{name:"reason",fileExtensions:["re","rei"]},{name:"bucklescript",fileExtensions:["cmj"]},{name:"merlin",fileExtensions:["merlin"]},{name:"verilog",fileExtensions:["vhd","vhdx","sv","svh","vhdl"]},{name:"mathematica",fileExtensions:["nb"]},{name:"wolframlanguage",fileExtensions:["wl","wls"]},{name:"nunjucks",fileExtensions:["njk","nunjucks"]},{name:"robot",fileExtensions:["robot"]},{name:"solidity",fileExtensions:["sol"]},{name:"autoit",fileExtensions:["au3"]},{name:"haml",fileExtensions:["haml"]},{name:"yang",fileExtensions:["yang"]},{name:"mjml",fileExtensions:["mjml"],fileNames:[".mjmlconfig"]},{name:"vercel",fileNames:["vercel.json",".vercelignore","now.json",".nowignore"],light:!0},{name:"liara",fileNames:["liara.json",".liaraignore"]},{name:"verdaccio",fileNames:["verdaccio.yml"]},{name:"payload",fileNames:["payload.config.js","payload.config.mjs","payload.config.ts","payload.config.mts"],light:!0},{name:"next",fileNames:["next.config.js","next.config.mjs","next.config.ts","next.config.mts"],light:!0},{name:"remark",fileNames:[".remarkrc",".remarkrc.cjs",".remarkrc.js",".remarkrc.json",".remarkrc.mjs",".remarkrc.yaml",".remarkrc.yml",".remarkignore"]},{name:"remix",fileNames:["remix.config.js","remix.config.ts"],light:!0},{name:"terraform",fileExtensions:["tf","tf.json","tfvars","tfstate","tfbackend"]},{name:"laravel",fileExtensions:["blade.php","inky.php"],fileNames:["artisan"]},{name:"applescript",fileExtensions:["applescript","ipa"]},{name:"cake",fileExtensions:["cake"]},{name:"cucumber",fileExtensions:["feature","features"]},{name:"nim",fileExtensions:["nim","nimble"]},{name:"apiblueprint",fileExtensions:["apib","apiblueprint"]},{name:"riot",fileExtensions:["riot","tag"]},{name:"vfl",fileExtensions:["vfl"],fileNames:[".vfl"]},{name:"kl",fileExtensions:["kl"],fileNames:[".kl"]},{name:"postcss",fileExtensions:["pcss","sss"],patterns:{postcss:"cosmiconfig"}},{name:"posthtml",patterns:{posthtml:"cosmiconfig"}},{name:"todo",fileExtensions:["todo"],fileNames:["todo.md","todos.md"]},{name:"coldfusion",fileExtensions:["cfml","cfc","lucee","cfm"]},{name:"cabal",fileExtensions:["cabal"],fileNames:["cabal.project","cabal.project.freeze","cabal.project.local"]},{name:"nix",fileExtensions:["nix"]},{name:"slim",fileExtensions:["slim"]},{name:"http",fileExtensions:["http","rest"],fileNames:["CNAME"]},{name:"restql",fileExtensions:["rql","restql"]},{name:"kivy",fileExtensions:["kv"]},{name:"graphcool",fileExtensions:["graphcool"],fileNames:["project.graphcool"]},{name:"sbt",fileExtensions:["sbt"]},{name:"webpack",fileNames:["webpack.config.coffee"],patterns:{"webpack.base":"ecmascript","webpack.client":"ecmascript","webpack.common":"ecmascript","webpack.config.babel":"ecmascript","webpack.config.base.babel":"ecmascript","webpack.config.base":"ecmascript","webpack.config.client":"ecmascript","webpack.config.common.babel":"ecmascript","webpack.config.common":"ecmascript","webpack.config.dev.babel":"ecmascript","webpack.config.dev":"ecmascript","webpack.config.main":"ecmascript","webpack.config.prod.babel":"ecmascript","webpack.config.prod":"ecmascript","webpack.config.production.babel":"ecmascript","webpack.config.production":"ecmascript","webpack.config.renderer":"ecmascript","webpack.config.server":"ecmascript","webpack.config.staging.babel":"ecmascript","webpack.config.staging":"ecmascript","webpack.config.test":"ecmascript","webpack.config.vendor.production":"ecmascript","webpack.config.vendor":"ecmascript","webpack.config":"ecmascript","webpack.dev":"ecmascript","webpack.development":"ecmascript","webpack.dist":"ecmascript","webpack.mix":"ecmascript","webpack.prod.config":"ecmascript","webpack.prod":"ecmascript","webpack.production":"ecmascript","webpack.server":"ecmascript","webpack.test":"ecmascript",webpack:"ecmascript",webpackfile:"ecmascript"}},{name:"ionic",fileNames:["ionic.config.json",".io-config.json"]},{name:"gulp",fileNames:["gulpfile.js","gulpfile.mjs","gulpfile.ts","gulpfile.cts","gulpfile.mts","gulpfile.babel.js"]},{name:"nodejs",fileNames:["package.json","package-lock.json",".nvmrc",".esmrc",".node-version"]},{name:"npm",fileNames:[".npmignore",".npmrc"]},{name:"yarn",fileNames:[".yarnrc","yarn.lock",".yarnclean",".yarn-integrity","yarn-error.log",".yarnrc.yml",".yarnrc.yaml"]},{name:"android",fileNames:["androidmanifest.xml"],fileExtensions:["apk","smali","dex"]},{name:"tune",fileExtensions:["env"],fileNames:[".env.defaults",".env.example",".env.sample",".env.template",".env.schema",".env.local",".env.dev",".env.development",".env.alpha",".env.e2e",".env.qa",".env.dist",".env.prod",".env.production",".env.stg",".env.stage",".env.staging",".env.preview",".env.test",".env.testing",".env.dev.local",".env.development.local",".env.qa.local",".env.prod.local",".env.production.local",".env.stg.local",".env.staging.local",".env.test.local",".env.uat",".vars",".dev.vars"]},{name:"turborepo",light:!0,fileNames:["turbo.json","turbo.jsonc"]},{name:"babel",fileNames:["babel-transform.js"],patterns:{babel:"cosmiconfig","babel-plugin-macros":"cosmiconfig"}},{name:"blitz",fileNames:["blitz.config.js","blitz.config.ts",".blitz.config.compiled.js"]},{name:"contributing",fileNames:["contributing.md","contributing.rst","contributing.txt","contributing"]},{name:"readme",fileNames:["readme.md","readme.rst","readme.txt","readme"]},{name:"changelog",fileNames:["changelog","changelog.md","changelog.rst","changelog.txt","changes","changes.md","changes.rst","changes.txt"]},{name:"architecture",fileNames:["architecture.md","architecture.rst","architecture.txt","architecture"]},{name:"credits",fileNames:["credits.md","credits.rst","credits.txt","credits"]},{name:"authors",fileNames:["authors.md","authors.rst","authors.txt","authors","contributors.md","contributors.rst","contributors.txt","contributors"]},{name:"flow",fileNames:[".flowconfig"]},{name:"favicon",fileNames:["favicon.ico"]},{name:"karma",fileNames:["karma.conf.js","karma.conf.ts","karma.conf.coffee","karma.config.js","karma.config.ts","karma-main.js","karma-main.ts"]},{name:"bithound",fileNames:[".bithoundrc"]},{name:"svgo",fileNames:["svgo.config.js","svgo.config.cjs","svgo.config.mjs"]},{name:"appveyor",fileNames:[".appveyor.yml","appveyor.yml"]},{name:"travis",fileNames:[".travis.yml"]},{name:"codecov",fileNames:[".codecov.yml","codecov.yml",".codecov.yaml","codecov.yaml"]},{name:"sonarcloud",fileNames:["sonar-project.properties",".sonarcloud.properties","sonarcloud.yaml","SonarQube.Analysis.xml"]},{name:"protractor",fileNames:["protractor.conf.js","protractor.conf.ts","protractor.conf.coffee","protractor.config.js","protractor.config.ts"]},{name:"fusebox",fileNames:["fuse.js"]},{name:"heroku",fileNames:["procfile","procfile.windows"]},{name:"editorconfig",fileNames:[".editorconfig",".editorconfig-checker.json",".ecrc"]},{name:"gitlab",fileExtensions:["gitlab-ci.yml"]},{name:"bower",fileNames:[".bowerrc","bower.json"]},{name:"eslint",fileNames:[".eslintrc-md.js",".eslintrc-jsdoc.js",".eslintrc.base.json",".eslintignore",".eslintcache"],patterns:{eslint:"cosmiconfig"}},{name:"conduct",fileNames:["code_of_conduct.md","code_of_conduct.txt","code_of_conduct"]},{name:"watchman",fileNames:[".watchmanconfig"]},{name:"aurelia",fileNames:["aurelia.json"]},{name:"auto",fileNames:[".autorc","auto.config.js","auto.config.ts","auto-config.json","auto-config.yaml","auto-config.yml","auto-config.ts","auto-config.js"],light:!0},{name:"mocha",fileNames:["mocha.opts",".mocharc.yml",".mocharc.yaml",".mocharc.js",".mocharc.json",".mocharc.jsonc"]},{name:"jenkins",fileNames:["jenkinsfile"],fileExtensions:["jenkinsfile","jenkins"]},{name:"firebase",fileNames:["firebase.json",".firebaserc","firestore.rules","firestore.indexes.json"]},{name:"figma",fileExtensions:["fig"]},{name:"rollup",fileNames:["rollup.config.js","rollup.config.mjs","rollup.config.ts","rollup-config.js","rollup-config.mjs","rollup-config.ts","rollup.config.common.js","rollup.config.common.mjs","rollup.config.common.ts","rollup.config.base.js","rollup.config.base.mjs","rollup.config.base.ts","rollup.config.prod.js","rollup.config.prod.mjs","rollup.config.prod.ts","rollup.config.dev.js","rollup.config.dev.mjs","rollup.config.dev.ts","rollup.config.prod.vendor.js","rollup.config.prod.vendor.mjs","rollup.config.prod.vendor.ts"]},{name:"hack",fileNames:[".hhconfig"]},{name:"huff",fileExtensions:["huff"],light:!0},{name:"hardhat",fileNames:["hardhat.config.js","hardhat.config.ts"]},{name:"stylelint",light:!0,fileNames:[".stylelintignore",".stylelintcache"],patterns:{stylelint:"cosmiconfig"}},{name:"code-climate",fileNames:[".codeclimate.yml"],light:!0},{name:"prettier",fileNames:[".prettierignore"],patterns:{prettier:"cosmiconfig"}},{name:"renovate",fileNames:[".renovaterc",".renovaterc.json","renovate-config.json","renovate.json","renovate.json5"]},{name:"apollo",fileNames:["apollo.config.js"]},{name:"nodemon",fileNames:["nodemon.json","nodemon-debug.json"]},{name:"ngrx-reducer",fileExtensions:["reducer.ts","rootReducer.ts"],enabledFor:["angular_ngrx"]},{name:"ngrx-state",fileExtensions:["state.ts"],enabledFor:["angular_ngrx"]},{name:"ngrx-actions",fileExtensions:["actions.ts"],enabledFor:["angular_ngrx"]},{name:"ngrx-effects",fileExtensions:["effects.ts"],enabledFor:["angular_ngrx"]},{name:"ngrx-entity",fileNames:[".entity"],enabledFor:["angular_ngrx"]},{name:"ngrx-selectors",fileExtensions:["selectors.ts"],enabledFor:["angular_ngrx"]},{name:"webhint",fileNames:[".hintrc"]},{name:"browserlist",fileNames:["browserslist",".browserslistrc"],light:!0},{name:"crystal",fileExtensions:["cr","ecr"],light:!0},{name:"snyk",fileNames:[".snyk"]},{name:"drone",fileExtensions:["drone.yml"],fileNames:[".drone.yml"],light:!0},{name:"cuda",fileExtensions:["cu","cuh"]},{name:"log",fileExtensions:["log"]},{name:"dotjs",fileExtensions:["def","dot","jst"]},{name:"ejs",fileExtensions:["ejs"]},{name:"sequelize",fileNames:[".sequelizerc"]},{name:"gatsby",fileNames:["gatsby-config.js","gatsby-config.mjs","gatsby-config.ts","gatsby-node.js","gatsby-node.mjs","gatsby-node.ts","gatsby-browser.js","gatsby-browser.tsx","gatsby-ssr.js","gatsby-ssr.tsx"]},{name:"wakatime",fileNames:[".wakatime-project"],fileExtensions:[".wakatime-project"],light:!0},{name:"circleci",fileNames:["circle.yml"],light:!0},{name:"cloudfoundry",fileNames:[".cfignore"]},{name:"grunt",fileNames:["gruntfile.js","gruntfile.ts","gruntfile.cjs","gruntfile.cts","gruntfile.coffee","gruntfile.babel.js","gruntfile.babel.ts","gruntfile.babel.coffee"]},{name:"jest",fileNames:["jest.config.js","jest.config.cjs","jest.config.mjs","jest.config.ts","jest.config.cts","jest.config.mts","jest.config.json","jest.e2e.config.js","jest.e2e.config.cjs","jest.e2e.config.mjs","jest.e2e.config.ts","jest.e2e.config.cts","jest.e2e.config.mts","jest.e2e.config.json","jest.e2e.json","jest-unit.config.js","jest-e2e.config.js","jest-e2e.config.cjs","jest-e2e.config.mjs","jest-e2e.config.ts","jest-e2e.config.cts","jest-e2e.config.mts","jest-e2e.config.json","jest-e2e.json","jest-github-actions-reporter.js","jest.setup.js","jest.setup.ts","jest.json",".jestrc",".jestrc.js",".jestrc.json","jest.teardown.js","jest-preset.json","jest-preset.js","jest-preset.cjs","jest-preset.mjs","jest.preset.js","jest.preset.mjs","jest.preset.cjs","jest.preset.json"]},{name:"processing",fileExtensions:["pde"]},{name:"storybook",fileExtensions:["stories.js","stories.jsx","stories.mdx","story.js","story.jsx","stories.ts","stories.tsx","story.ts","story.tsx","stories.svelte","story.mdx"]},{name:"wepy",fileExtensions:["wpy"]},{name:"fastlane",fileNames:["fastfile","appfile"]},{name:"hcl",fileExtensions:["hcl"],light:!0},{name:"helm",fileNames:[".helmignore"]},{name:"san",fileExtensions:["san"]},{name:"quokka",fileExtensions:["quokka.js","quokka.ts","quokka.jsx","quokka.tsx"]},{name:"wallaby",fileNames:["wallaby.js","wallaby.conf.js"]},{name:"django",fileExtensions:["djt"]},{name:"stencil",fileNames:["stencil.config.js","stencil.config.ts"]},{name:"red",fileExtensions:["red"]},{name:"makefile",fileExtensions:["mk"],fileNames:["makefile","gnumakefile","kbuild"]},{name:"foxpro",fileExtensions:["fxp","prg"]},{name:"i18n",fileExtensions:["pot","po","mo","lang","xlf"]},{name:"webassembly",fileExtensions:["wat","wasm"]},{name:"semantic-release",light:!0,patterns:{release:"cosmiconfig"}},{name:"bitbucket",fileNames:["bitbucket-pipelines.yaml","bitbucket-pipelines.yml"]},{name:"jupyter",fileExtensions:["ipynb"]},{name:"d",fileExtensions:["d"]},{name:"mdx",fileExtensions:["mdx"]},{name:"mdsvex",fileExtensions:["svx"]},{name:"ballerina",fileExtensions:["bal","balx"]},{name:"racket",fileExtensions:["rkt"]},{name:"bazel",fileExtensions:["bzl","bazel"],fileNames:[".bazelignore",".bazelrc",".bazelversion"]},{name:"mint",fileExtensions:["mint"]},{name:"velocity",fileExtensions:["vm","fhtml","vtl"]},{name:"godot",fileExtensions:["gd"]},{name:"godot-assets",fileExtensions:["godot","tres","tscn","gdns","gdnlib","gdshader","gdshaderinc","gdextension"],fileNames:[".gdignore","._sc_","_sc_"]},{name:"azure-pipelines",fileNames:["azure-pipelines.yml","azure-pipelines.yaml","azure-pipelines-main.yml","azure-pipelines-main.yaml"],fileExtensions:["azure-pipelines.yml","azure-pipelines.yaml","azure-pipelines-main.yml","azure-pipelines-main.yaml"]},{name:"azure",fileExtensions:["azcli"]},{name:"vagrant",fileNames:["vagrantfile"],fileExtensions:["vagrantfile"]},{name:"prisma",fileNames:["prisma.yml"],fileExtensions:["prisma"]},{name:"razor",fileExtensions:["cshtml","vbhtml"]},{name:"abc",fileExtensions:["abc"]},{name:"asciidoc",fileExtensions:["ad","adoc","asciidoc"]},{name:"istanbul",fileNames:[".nycrc",".nycrc.json",".nycrc.yaml",".nycrc.yml","nyc.config.js",".istanbul.yml"]},{name:"edge",fileExtensions:["edge"]},{name:"scheme",fileExtensions:["ss","scm"]},{name:"lisp",fileExtensions:["lisp","lsp","cl","fast"]},{name:"tailwindcss",fileNames:["tailwind.js","tailwind.ts","tailwind.config.js","tailwind.config.cjs","tailwind.config.mjs","tailwind.config.ts","tailwind.config.cts","tailwind.config.mts"]},{name:"3d",fileExtensions:["stl","stp","obj","o","ac","blend","dxf","fbx","mesh","mqo","pmd","pmx","skp","vac","vdp","vox","gltf","glb"]},{name:"buildkite",fileNames:["buildkite.yml","buildkite.yaml"]},{name:"netlify",fileNames:["netlify.json","netlify.yml","netlify.yaml","netlify.toml"],light:!0},{name:"svg",fileExtensions:["svg"]},{name:"adobe-illustrator",fileExtensions:["ai","ait"],light:!0},{name:"adobe-photoshop",fileExtensions:["psd","psb","psdt"],light:!0},{name:"svelte",fileExtensions:["svelte"],patterns:{"svelte.config":"ecmascript"}},{name:"svelte_js",fileExtensions:["svelte.js"],clone:{base:"svelte",color:"amber-400"}},{name:"svelte_ts",fileExtensions:["svelte.ts"],clone:{base:"svelte",color:"light-blue-700"}},{name:"vim",fileExtensions:["vimrc","gvimrc","exrc","vim","viminfo"]},{name:"nest",fileNames:["nest-cli.json",".nest-cli.json","nestconfig.json",".nestconfig.json"]},{name:"nest-controller",clone:{base:"nest",color:"light-blue-700"},fileExtensions:["controller.ts","controller.js"],enabledFor:["nest"]},{name:"nest-middleware",clone:{base:"nest",color:"indigo-400"},fileExtensions:["middleware.ts","middleware.js"],enabledFor:["nest"]},{name:"nest-module",clone:{base:"nest",color:"red-600"},fileExtensions:["module.ts","module.js"],enabledFor:["nest"]},{name:"nest-service",clone:{base:"nest",color:"amber-400"},fileExtensions:["service.ts","service.js"],enabledFor:["nest"]},{name:"nest-decorator",clone:{base:"nest",color:"purple-400"},fileExtensions:["decorator.ts","decorator.js"],enabledFor:["nest"]},{name:"nest-pipe",clone:{base:"nest",color:"teal-600"},fileExtensions:["pipe.ts","pipe.js"],enabledFor:["nest"]},{name:"nest-filter",clone:{base:"nest",color:"deep-orange-400"},fileExtensions:["filter.ts","filter.js"],enabledFor:["nest"]},{name:"nest-gateway",clone:{base:"nest",color:"lime-700"},fileExtensions:["gateway.ts","gateway.js"],enabledFor:["nest"]},{name:"nest-guard",clone:{base:"nest",color:"green-600"},fileExtensions:["guard.ts","guard.js"],enabledFor:["nest"]},{name:"nest-resolver",clone:{base:"nest",color:"pink-400"},fileExtensions:["resolver.ts","resolver.js"],enabledFor:["nest"]},{name:"nest-interceptor",clone:{base:"nest",color:"orange-500"},fileExtensions:["interceptor.ts","interceptor.js"],enabledFor:["nest"]},{name:"moon",fileNames:["moon.yml"]},{name:"moonscript",fileExtensions:["moon"]},{name:"percy",fileNames:[".percy.yml"]},{name:"gitpod",fileNames:[".gitpod.yml"]},{name:"stackblitz",fileNames:[".stackblitzrc"]},{name:"advpl",fileExtensions:["prw","prx"]},{name:"advpl-ptm",clone:{base:"advpl",color:"red-400"},fileExtensions:["ptm"]},{name:"advpl-tlpp",clone:{base:"advpl",color:"yellow-700"},fileExtensions:["tlpp"]},{name:"advpl-include",clone:{base:"advpl",color:"cyan-500"},fileExtensions:["ch"]},{name:"codeowners",fileNames:["codeowners","OWNERS"]},{name:"gcp",fileNames:[".gcloudignore"]},{name:"amplify",fileNames:["amplify.yml"]},{name:"disc",fileExtensions:["iso","vmdk","hdd","qcow","qcow2","qed","dmg"]},{name:"fortran",fileExtensions:["f","f77","f90","f95","f03","f08"]},{name:"tcl",fileExtensions:["tcl","do"]},{name:"liquid",fileExtensions:["liquid"]},{name:"prolog",fileExtensions:["p","pro","pl"]},{name:"husky",patterns:{husky:"cosmiconfig"}},{name:"coconut",fileExtensions:["coco"]},{name:"tilt",fileNames:["tiltfile"]},{name:"capacitor",fileNames:["capacitor.config.json","capacitor.config.ts"]},{name:"sketch",fileExtensions:["sketch"]},{name:"pawn",fileExtensions:["pwn","amx"]},{name:"adonis",fileNames:[".adonisrc.json","ace"]},{name:"forth",fileExtensions:["4th","fth","frt"]},{name:"uml",fileExtensions:["iuml","pu","puml","plantuml","wsd"],light:!0},{name:"meson",fileNames:["meson.build","meson_options.txt"],fileExtensions:["wrap"]},{name:"commitizen",fileNames:[".czrc",".cz.json",".cz.toml",".cz.yaml",".cz.yml","cz.json","cz.toml","cz.yaml","cz.yml"]},{name:"commitlint",fileNames:[".commitlint.yaml",".commitlint.yml"],patterns:{commitlint:"cosmiconfig"}},{name:"buck",fileNames:[".buckconfig"]},{name:"dhall",fileExtensions:["dhall","dhallb"]},{name:"sml",fileExtensions:["sml","mlton","mlb","sig","fun","cm","lex","use","grm"]},{name:"nx",fileNames:["nx.json",".nxignore"]},{name:"opam",fileExtensions:["opam"]},{name:"dune",fileNames:["dune","dune-project","dune-workspace","dune-workspace.dev"]},{name:"imba",fileExtensions:["imba"]},{name:"drawio",fileExtensions:["drawio","dio"]},{name:"pascal",fileExtensions:["pas"]},{name:"unity",fileExtensions:["unity","unitypackage"]},{name:"roadmap",fileNames:["roadmap.md","roadmap.txt","timeline.md","timeline.txt","milestones.md","milestones.txt"]},{name:"sas",fileExtensions:["sas","sas7bdat","sashdat","astore","ast","sast"]},{name:"nuget",fileNames:["nuget.config",".nuspec","nuget.exe"],fileExtensions:["nupkg"]},{name:"command",fileExtensions:["command"]},{name:"stryker",fileNames:["stryker.conf.json","stryker.conf.js","stryker.conf.cjs","stryker.conf.mjs",".stryker.conf.json",".stryker.conf.js",".stryker.conf.cjs",".stryker.conf.mjs","stryker.config.json","stryker.config.js","stryker.config.mjs","stryker.config.cjs",".stryker.config.json",".stryker.config.js",".stryker.config.mjs",".stryker.config.cjs"]},{name:"denizenscript",fileExtensions:["dsc"]},{name:"modernizr",fileNames:[".modernizrrc",".modernizrrc.js",".modernizrrc.json"]},{name:"slug",fileNames:[".slugignore"]},{name:"search",fileExtensions:["code-search"]},{name:"stitches",fileNames:["stitches.config.js","stitches.config.ts"],light:!0},{name:"nginx",fileNames:["nginx.conf"],fileExtensions:["nginx","nginxconf","nginxconfig"]},{name:"minecraft",fileExtensions:["mcfunction","mcmeta","mcr","mca","mcgame","mclevel","mcworld","mine","mus","mcstructure","mcpack","mcaddon","mctemplate","mcproject"],fileNames:[".mcattributes",".mcdefinitions",".mcignore"]},{name:"replit",fileNames:[".replit"]},{name:"rescript",fileExtensions:["res"]},{name:"rescript-interface",fileExtensions:["resi"]},{name:"duc",fileNames:["duc.fbs"],fileExtensions:["duc"]},{name:"snowpack",fileNames:["snowpack.config.js","snowpack.config.cjs","snowpack.config.mjs","snowpack.config.ts","snowpack.config.cts","snowpack.config.mts","snowpack.deps.json","snowpack.config.json"],light:!0},{name:"brainfuck",fileExtensions:["b","bf"]},{name:"bicep",fileExtensions:["bicep"]},{name:"cobol",fileExtensions:["cob","cbl"]},{name:"grain",fileExtensions:["gr"]},{name:"lolcode",fileExtensions:["lol"]},{name:"idris",fileExtensions:["idr","ibc"]},{name:"quasar",fileNames:["quasar.conf.js","quasar.config.js","quasar.conf.ts","quasar.config.ts","quasar.config.cjs"]},{name:"dependabot",fileNames:["dependabot.yml","dependabot.yaml"]},{name:"pipeline",fileExtensions:["pipeline"]},{name:"vite",patterns:{"vite.config":"ecmascript"}},{name:"vitest",patterns:{"vitest.workspace":"ecmascript","vitest.config":"ecmascript"}},{name:"velite",patterns:{"velite.config":"ecmascript"}},{name:"opa",fileExtensions:["rego"]},{name:"lerna",fileNames:["lerna.json"]},{name:"windicss",fileNames:["windi.config.js","windi.config.cjs","windi.config.ts","windi.config.cts","windi.config.json"],fileExtensions:["windi"]},{name:"textlint",fileNames:[".textlintrc",".textlintrc.js",".textlintrc.cjs",".textlintrc.json",".textlintrc.yml",".textlintrc.yaml",".textlintignore"]},{name:"scala",fileExtensions:["scala","sc"]},{name:"lilypond",fileExtensions:["ly"]},{name:"vlang",fileExtensions:["v"],fileNames:["vpkg.json","v.mod"]},{name:"chess",fileExtensions:["pgn","fen"],light:!0},{name:"gemini",fileExtensions:["gmi","gemini"]},{name:"sentry",fileNames:[".sentryclirc"],patterns:{"sentry.client.config":"ecmascript","sentry.server.config":"ecmascript","sentry.edge.config":"ecmascript"}},{name:"contentlayer",patterns:{"contentlayer.config":"ecmascript"}},{name:"phpunit",fileNames:[".phpunit.result.cache",".phpunit-watcher.yml","phpunit.xml","phpunit.xml.dist","phpunit-watcher.yml","phpunit-watcher.yml.dist"]},{name:"php-cs-fixer",fileNames:[".php_cs",".php_cs.dist",".php_cs.php",".php_cs.dist.php",".php-cs-fixer.php",".php-cs-fixer.dist.php"]},{name:"robots",fileNames:["robots.txt"]},{name:"tsconfig",fileNames:["tsconfig.json","tsconfig.app.json","tsconfig.editor.json","tsconfig.spec.json","tsconfig.base.json","tsconfig.build.json","tsconfig.eslint.json","tsconfig.lib.json","tsconfig.lib.prod.json","tsconfig.node.json","tsconfig.test.json","tsconfig.e2e.json","tsconfig.web.json","tsconfig.webworker.json","tsconfig.worker.json","tsconfig.config.json","tsconfig.vitest.json","tsconfig.cjs.json","tsconfig.esm.json","tsconfig.mjs.json","tsconfig.doc.json","tsconfig.paths.json","tsconfig.main.json","tsconfig.renderer.json","tsconfig.server.json","tsconfig.client.json","tsconfig.declaration.json"],fileExtensions:["tsconfig.json"]},{name:"tauri",fileNames:["tauri.conf.json","tauri.config.json","tauri.linux.conf.json","tauri.windows.conf.json","tauri.macos.conf.json",".taurignore"],fileExtensions:["tauri"]},{name:"jsconfig",fileNames:["jsconfig.json"],fileExtensions:["jsconfig.json"]},{name:"maven",fileNames:["maven.config","jvm.config","pom.xml"]},{name:"ada",fileExtensions:["ada","adb","ads","ali"]},{name:"serverless",fileNames:["serverless.yml","serverless.yaml","serverless.json","serverless.js","serverless.ts"]},{name:"supabase",fileNames:["supabase.js","supabase.ts","supabase.py"]},{name:"ember",fileNames:[".ember-cli",".ember-cli.js","ember-cli-builds.js"]},{name:"horusec",fileNames:["horusec-config.json"],fileExtensions:["horusec-config.json"]},{name:"poetry",fileNames:["poetry.lock"]},{name:"pdm",fileNames:["pdm.lock","pdm.toml",".pdm-python"],fileExtensions:["pdm.lock","pdm.toml"]},{name:"coala",fileExtensions:["coarc","coafile"]},{name:"parcel",fileNames:[".parcelrc"]},{name:"dinophp",fileExtensions:["bubble","html.bubble","php.bubble"]},{name:"teal",fileExtensions:["tl"]},{name:"template",fileExtensions:["template"]},{name:"astyle",fileNames:[".astylerc"]},{name:"shader",fileExtensions:["glsl","vert","tesc","tese","geom","frag","comp","vert.glsl","tesc.glsl","tese.glsl","geom.glsl","frag.glsl","comp.glsl","vertex.glsl","geometry.glsl","fragment.glsl","compute.glsl","ts.glsl","gs.glsl","vs.glsl","fs.glsl","shader","vertexshader","fragmentshader","geometryshader","computeshader","hlsl","pixel.hlsl","geometry.hlsl","compute.hlsl","tessellation.hlsl","px.hlsl","geom.hlsl","comp.hlsl","tess.hlsl","wgsl"]},{name:"lighthouse",fileNames:[".lighthouserc.js","lighthouserc.js",".lighthouserc.cjs","lighthouserc.cjs",".lighthouserc.json","lighthouserc.json",".lighthouserc.yml","lighthouserc.yml",".lighthouserc.yaml","lighthouserc.yaml"]},{name:"svgr",patterns:{svgr:"cosmiconfig"}},{name:"rome",fileNames:["rome.json"]},{name:"cypress",fileNames:["cypress.json","cypress.env.json"],patterns:{"cypress.config":"ecmascript"}},{name:"siyuan",fileExtensions:["sy"]},{name:"ndst",fileExtensions:["ndst.yml","ndst.yaml","ndst.json"]},{name:"plop",fileNames:["plopfile.js","plopfile.cjs","plopfile.mjs","plopfile.ts"]},{name:"tobi",fileExtensions:["tobi"]},{name:"tobimake",fileNames:[".tobimake"]},{name:"gleam",fileNames:["gleam.toml"],fileExtensions:["gleam"]},{name:"pnpm",light:!0,fileNames:["pnpm-lock.yaml","pnpm-workspace.yaml",".pnpmfile.cjs"]},{name:"gridsome",fileNames:["gridsome.config.js","gridsome.server.js"]},{name:"steadybit",fileExtensions:["steadybit.yml","steadybit.yaml"],fileNames:[".steadybit.yml","steadybit.yml",".steadybit.yaml","steadybit.yaml"]},{name:"capnp",fileExtensions:["capnp"]},{name:"tree",fileExtensions:["tree"]},{name:"cadence",fileExtensions:["cdc"]},{name:"caddy",fileNames:["Caddyfile"]},{name:"openapi",light:!0,fileExtensions:["openapi.json","openapi.yml","openapi.yaml"],fileNames:["openapi.json","openapi.yml","openapi.yaml"]},{name:"swagger",fileExtensions:["swagger.json","swagger.yml","swagger.yaml"],fileNames:["swagger.json","swagger.yml","swagger.yaml"]},{name:"bun",fileNames:["bun.lockb","bunfig.toml",".bun-version","bun.lock"],light:!0},{name:"antlr",fileExtensions:["g4"]},{name:"stylable",fileExtensions:["st.css"]},{name:"pinejs",fileExtensions:["pine"]},{name:"nano-staged",light:!0,fileNames:[".nano-staged.js","nano-staged.js",".nano-staged.cjs","nano-staged.cjs",".nano-staged.mjs","nano-staged.mjs",".nano-staged.json","nano-staged.json",".nanostagedrc"]},{name:"knip",fileNames:["knip.json","knip.jsonc",".knip.json",".knip.jsonc","knip.ts","knip.js","knip.config.ts","knip.config.js"]},{name:"taskfile",fileExtensions:["taskfile.yml","taskfile.yaml"],fileNames:["taskfile.yml","taskfile.yaml","taskfile.dist.yml","taskfile.dist.yaml",".taskrc.yml",".taskrc.yaml"]},{name:"craco",patterns:{craco:"cosmiconfig"}},{name:"gamemaker",fileExtensions:["gml","yy","yyp","yyz"]},{name:"tldraw",fileExtensions:["tldr"],light:!0},{name:"mercurial",fileNames:[".hg",".hgignore",".hgflow",".hgtags",".hgrc","hgrc","mercurial.ini"]},{name:"deno",fileNames:["deno.json","deno.jsonc","deno.lock"],light:!0},{name:"plastic",fileNames:["plastic.branchexplorer","plastic.selector","plastic.wktree","plastic.workspace","plastic.workspaces"]},{name:"typst",fileNames:["typst.toml"],fileExtensions:["typ"]},{name:"unocss",fileNames:["uno.config.js","uno.config.mjs","uno.config.ts","uno.config.mts","unocss.config.js","unocss.config.mjs","unocss.config.ts","unocss.config.mts"]},{name:"ifanr-cloud",fileNames:[".mincloudrc"]},{name:"concourse",fileNames:["concourse.yml"]},{name:"qwik",fileExtensions:["tsx"],enabledFor:["qwik"]},{name:"mermaid",fileExtensions:["mmd","mermaid"]},{name:"syncpack",patterns:{syncpack:"cosmiconfig"}},{name:"mojo",fileExtensions:["mojo","\u{1F525}"]},{name:"werf",fileNames:["werf.yaml","werf.yml","werf-giterminism.yaml","werf-giterminism.yml"]},{name:"roblox",fileExtensions:["rbxl","rbxlx","rbxm","rbxmx"]},{name:"luau",fileExtensions:["luau"],fileNames:[".luaurc"]},{name:"rojo",fileExtensions:["project.json","model.json","meta.json"],enabledFor:["roblox"]},{name:"wally",fileNames:["wally.toml"]},{name:"rbxmk",fileExtensions:["rbxmk.lua","rbxmk.luau"]},{name:"panda",patterns:{"panda.config":"ecmascript"}},{name:"biome",fileNames:["biome.json","biome.jsonc"]},{name:"esbuild",patterns:{esbuild:"ecmascript","esbuild.config":"ecmascript"}},{name:"spwn",fileExtensions:["spwn"]},{name:"templ",fileExtensions:["templ"]},{name:"chrome",fileExtensions:["crx"]},{name:"stan",fileExtensions:["stan"]},{name:"abap",fileExtensions:["abap","acds","asddls"]},{name:"drizzle",fileNames:["drizzle.config.ts","drizzle.config.js","drizzle.config.json"]},{name:"lottie",fileExtensions:["lottie"]},{name:"puppeteer",patterns:{puppeteer:"cosmiconfig"}},{name:"apps-script",fileExtensions:["gs"]},{name:"garden",fileNames:["garden.yml","garden.yaml","project.garden.yml","project.garden.yaml",".gardenignore"],fileExtensions:["garden.yml","garden.yaml"]},{name:"pkl",fileExtensions:["pkl"],fileNames:["PklProject","PklProject.deps.json"]},{name:"kubernetes",fileNames:["k8s.yml","k8s.yaml","kubernetes.yml","kubernetes.yaml",".k8s.yml",".k8s.yaml"]},{name:"phpstan",fileNames:["phpstan.neon","phpneon.neon.dist"]},{name:"screwdriver",fileNames:["screwdriver.yaml","screwdriver.yml"]},{name:"snapcraft",fileNames:["snapcraft.yaml","snapcraft.yml"]},{name:"container",clone:{base:"3d",color:"#00b0ff"},fileNames:[".devcontainer/devcontainer.json",".devcontainer/devcontainer-lock.json"]},{name:"kcl",fileNames:["kcl.mod","kcl.yaml","kcl.yml"],fileExtensions:["k"]},{name:"verified",fileExtensions:["sigstore.json"]},{name:"bruno",fileExtensions:["bru"]},{name:"cairo",fileExtensions:["cairo"]},{name:"grafana-alloy",fileExtensions:["alloy"]},{name:"clangd",fileNames:[".clangd"]},{name:"freemarker",fileExtensions:["ftl"]},{name:"markdownlint",fileNames:[".markdownlint.json",".markdownlint.jsonc",".markdownlint.yaml",".markdownlint.yml",".markdownlint-cli2.jsonc",".markdownlint-cli2.yaml",".markdownlint-cli2.cjs",".markdownlint-cli2.mjs",".markdownlintignore"]},{name:"tsil",fileExtensions:["\u0446"]},{name:"trigger",patterns:{"trigger.config":"ecmascript"}},{name:"deepsource",fileNames:[".deepsource.toml"]},{name:"tape",fileExtensions:["tape"],clone:{base:"video",color:"purple-300"}},{name:"hurl",fileExtensions:["hurl"]},{name:"cds",fileExtensions:["cds"]},{name:"slint",fileExtensions:["slint","60"]},{name:"jsr",fileNames:["jsr.json","jsr.jsonc"],light:!0},{name:"coderabbit-ai",fileNames:[".coderabbit.yml",".coderabbit.yaml"]},{name:"gemini-ai",fileNames:[".aiexclude"]},{name:"taze",patterns:{"taze.config":"ecmascript"},fileNames:[".tazerc",".tazerc.json"]},{name:"wxt",patterns:{"wxt.config":"ecmascript"}},{name:"sway",fileExtensions:["sw"]},{name:"lefthook",fileNames:[".lefthook-local.json",".lefthook-local.toml",".lefthook-local.yaml",".lefthook-local.yml",".lefthook.json",".lefthook.toml",".lefthook.yaml",".lefthook.yml",".lefthookrc","lefthook-local.json","lefthook-local.toml","lefthook-local.yaml","lefthook-local.yml","lefthook.json","lefthook.toml","lefthook.yaml","lefthook.yml","lefthookrc"]},{name:"label",fileNames:[".github/labeler.yml",".github/labeler.yaml"]},{name:"zeabur",fileExtensions:["zeabur"],patterns:{zeabur:"configuration"},light:!0},{name:"copilot",fileNames:[".github/copilot-instructions.md"],light:!0},{name:"bench-ts",fileExtensions:["bench.ts","bench.cts","bench.mts"]},{name:"bench-jsx",fileExtensions:["bench.jsx","bench.tsx"]},{name:"bench-js",fileExtensions:["bench.js","bench.cjs","bench.mjs"]},{name:"pre-commit",fileNames:[".pre-commit-config.yaml",".pre-commit-hooks.yaml"]},{name:"controller",fileExtensions:["controller.js","controller.ts"],enabledFor:["angular","angular_ngrx","qwik","react","react_redux","roblox","vue","vue_vuex"]},{name:"dependencies-update",fileExtensions:[".ncurc.json",".ncurc.yml",".ncurc.js"]},{name:"histoire",patterns:{"histoire.config":"ecmascript",".histoire":"ecmascript"}},{name:"installation",fileNames:["install","installation"]},{name:"github-sponsors",fileNames:[".github/FUNDING.yml"]},{name:"minecraft-fabric",fileNames:["fabric.mod.json"]},{name:"umi",patterns:{".umirc":"ecmascript"}},{name:"pm2-ecosystem",patterns:{"ecosystem.config":"ecmascript"}},{name:"hosts",fileNames:["hosts"],light:!0},{name:"citation",fileNames:["citation.cff"]},{name:"xmake",fileNames:["xmake.lua","xmake"]},{name:"subtitles",fileExtensions:["srt","ssa","ttml","sbv","dfxp","vtt","sub","ass"]},{name:"beancount",fileExtensions:["beancount","bean"]},{name:"wrangler",fileNames:["wrangler.toml","wrangler.json","wrangler.jsonc"]},{name:"epub",fileExtensions:["epub"]},{name:"regedit",fileExtensions:["reg"]},{name:"cline",fileNames:[".clinerules"]},{name:"gnuplot",fileExtensions:["gnu"]},{name:"packship",fileNames:[".packshiprc",".packshiprc.json",".packshiprc.js",".packshiprc.ts","packship.config.js","packship.config.ts","packship.config.mjs","packship.config.mts","packship.config.json"]},{name:"snakemake",fileExtensions:["smk","snakemake"],fileNames:["Snakefile"]},{name:"hadolint",patterns:{".hadolint":"yaml",hadolint:"yaml"}},{name:"coloredpetrinets",fileExtensions:["cpn","pnml"]}])},bo=[{name:"specific",defaultIcon:{name:"folder"},rootFolder:{name:"folder-root"},icons:[{name:"folder-rust",folderNames:["rust"]},{name:"folder-robot",folderNames:["bot","bots","robot","robots"]},{name:"folder-src",folderNames:["src","srcs","source","sources","code"]},{name:"folder-dist",folderNames:["dist","out","output","build","builds","release","bin","distribution"]},{name:"folder-css",folderNames:["css","stylesheet","stylesheets","style","styles"]},{name:"folder-sass",folderNames:["sass","scss"]},{name:"folder-television",folderNames:["tv","television"]},{name:"folder-desktop",folderNames:["desktop","display"]},{name:"folder-console",folderNames:["console"]},{name:"folder-images",folderNames:["images","image","imgs","img","icons","icon","icos","ico","figures","figure","figs","fig","screenshot","screenshots","screengrab","screengrabs","pic","pics","picture","pictures","photo","photos","photograph","photographs"]},{name:"folder-scripts",folderNames:["script","scripts","scripting"]},{name:"folder-node",folderNames:["node","nodejs","node_modules"]},{name:"folder-javascript",folderNames:["js","javascript","javascripts"]},{name:"folder-json",folderNames:["json","jsons"]},{name:"folder-font",folderNames:["font","fonts"]},{name:"folder-bower",folderNames:["bower_components"]},{name:"folder-test",folderNames:["test","tests","testing","snapshots","spec","specs"]},{name:"folder-directive",folderNames:["directive","directives"]},{name:"folder-jinja",folderNames:["jinja","jinja2","j2"],light:!0},{name:"folder-markdown",folderNames:["markdown","md"]},{name:"folder-pdm",folderNames:["pdm-plugins","pdm-build"]},{name:"folder-php",folderNames:["php"]},{name:"folder-phpmailer",folderNames:["phpmailer"]},{name:"folder-sublime",folderNames:["sublime"]},{name:"folder-docs",folderNames:["doc","docs","document","documents","documentation","post","posts","article","articles","wiki","news"]},{name:"folder-gh-workflows",folderNames:["github/workflows"]},{name:"folder-git",folderNames:["git","patches","githooks","submodules"]},{name:"folder-github",folderNames:["github"]},{name:"folder-gitea",folderNames:["gitea"]},{name:"folder-gitlab",folderNames:["gitlab"]},{name:"folder-forgejo",folderNames:["forgejo"]},{name:"folder-vscode",folderNames:["vscode","vscode-test"]},{name:"folder-views",folderNames:["view","views","screen","screens","page","pages","public_html","html"]},{name:"folder-vue",folderNames:["vue"]},{name:"folder-vuepress",folderNames:["vuepress"]},{name:"folder-expo",folderNames:["expo","expo-shared"]},{name:"folder-config",folderNames:["cfg","cfgs","conf","confs","config","configs","configuration","configurations","setting","settings","META-INF","option","options","pref","prefs","preference","preferences"]},{name:"folder-i18n",folderNames:["i18n","internationalization","lang","langs","language","languages","locale","locales","l10n","localization","translation","translate","translations","tx"]},{name:"folder-components",folderNames:["components","widget","widgets","fragments"]},{name:"folder-verdaccio",folderNames:["verdaccio"]},{name:"folder-aurelia",folderNames:["aurelia_project"]},{name:"folder-resource",folderNames:["resource","resources","res","asset","assets","static","report","reports"]},{name:"folder-lib",folderNames:["lib","libs","library","libraries","vendor","vendors","third-party","lib64"]},{name:"folder-theme",folderNames:["themes","theme","color","colors","design","designs","palette","palettes"]},{name:"folder-webpack",folderNames:["webpack"]},{name:"folder-global",folderNames:["global"]},{name:"folder-public",folderNames:["public","www","wwwroot","web","website","websites","site","browser","browsers"]},{name:"folder-include",folderNames:["inc","include","includes","partial","partials","inc64"]},{name:"folder-docker",folderNames:["docker","dockerfiles","dockerhub"]},{name:"folder-ngrx-store",folderNames:["store"],enabledFor:["angular_ngrx"]},{name:"folder-ngrx-effects",folderNames:["effects"],enabledFor:["angular_ngrx"],clone:{base:"folder-ngrx-store",color:"cyan-500"}},{name:"folder-ngrx-state",folderNames:["states","state"],enabledFor:["angular_ngrx"],clone:{base:"folder-ngrx-store",color:"lime-800"}},{name:"folder-ngrx-reducer",folderNames:["reducers","reducer"],enabledFor:["angular_ngrx"],clone:{base:"folder-ngrx-store",color:"red-400"}},{name:"folder-ngrx-actions",folderNames:["actions"],enabledFor:["angular_ngrx"],clone:{base:"folder-ngrx-store",color:"purple-400"}},{name:"folder-ngrx-entities",folderNames:["entities"],enabledFor:["angular_ngrx"],clone:{base:"folder-ngrx-store",color:"yellow-700"}},{name:"folder-ngrx-selectors",folderNames:["selectors"],enabledFor:["angular_ngrx"],clone:{base:"folder-ngrx-store",color:"deep-orange-A200"}},{name:"folder-redux-reducer",folderNames:["reducers","reducer"],enabledFor:["react_redux"]},{name:"folder-redux-actions",folderNames:["actions"],enabledFor:["react_redux"],clone:{base:"folder-redux-reducer",color:"purple-400"}},{name:"folder-redux-selector",folderNames:["selectors","selector"],enabledFor:["react_redux"],clone:{base:"folder-redux-reducer",color:"deep-orange-A200"}},{name:"folder-redux-store",folderNames:["store","stores"],enabledFor:["react_redux"],clone:{base:"folder-redux-reducer",color:"light-green-500"}},{name:"folder-react-components",folderNames:["components","react","jsx","reactjs","react-components"],enabledFor:["react","react_redux"]},{name:"folder-astro",folderNames:["astro"]},{name:"folder-database",folderNames:["db","data","database","databases","sql"]},{name:"folder-log",folderNames:["log","logs","logging"]},{name:"folder-target",folderNames:["target"]},{name:"folder-temp",folderNames:["temp","tmp","cached","cache"]},{name:"folder-aws",folderNames:["aws","azure","gcp"]},{name:"folder-audio",folderNames:["aud","auds","audio","audios","music","song","songs","sound","sounds","voice","voices","recordings"]},{name:"folder-video",folderNames:["vid","vids","video","videos","movie","movies","media"]},{name:"folder-kubernetes",folderNames:["kubernetes","k8s"]},{name:"folder-import",folderNames:["import","imports","imported"]},{name:"folder-export",folderNames:["export","exports","exported"]},{name:"folder-wakatime",folderNames:["wakatime"]},{name:"folder-circleci",folderNames:["circleci"]},{name:"folder-wordpress",folderNames:["wordpress-org","wp-content"]},{name:"folder-gradle",folderNames:["gradle"]},{name:"folder-coverage",folderNames:["coverage","nyc-output","nyc_output","e2e","it","integration-test","integration-tests"]},{name:"folder-class",folderNames:["class","classes","model","models","schemas","schema"]},{name:"folder-other",folderNames:["other","others","misc","miscellaneous","extra","extras","etc"]},{name:"folder-lua",folderNames:["lua"]},{name:"folder-turborepo",folderNames:["turbo"]},{name:"folder-typescript",folderNames:["typescript","ts","typings","@types","types"]},{name:"folder-graphql",folderNames:["graphql","gql"]},{name:"folder-routes",folderNames:["routes","router","routers","navigation","navigations","routing"]},{name:"folder-ci",folderNames:["ci"]},{name:"folder-benchmark",folderNames:["benchmark","benchmarks","bench","performance","perf","profiling","measure","measures","measurement"]},{name:"folder-messages",folderNames:["messages","messaging","forum","chat","chats","conversation","conversations","dialog","dialogs"]},{name:"folder-less",folderNames:["less"]},{name:"folder-gulp",folderNames:["gulp","gulp-tasks","gulpfile.js","gulpfile.mjs","gulpfile.ts","gulpfile.babel.js"]},{name:"folder-python",folderNames:["python","pycache","pytest_cache"]},{name:"folder-sandbox",folderNames:["sandbox","sandboxes","playground","playgrounds"]},{name:"folder-scons",folderNames:["scons","sconf_temp","scons_cache"]},{name:"folder-mojo",folderNames:["mojo"]},{name:"folder-moon",folderNames:["moon"]},{name:"folder-debug",folderNames:["debug","debugger","debugging"]},{name:"folder-fastlane",folderNames:["fastlane"]},{name:"folder-plugin",folderNames:["plugin","plugins","mod","mods","modding","extension","extensions","addon","addons","addin","addins","module","modules"]},{name:"folder-middleware",folderNames:["middleware","middlewares"]},{name:"folder-controller",folderNames:["controller","controllers","controls","service","services","provider","providers","handler","handlers"]},{name:"folder-ansible",folderNames:["ansible"]},{name:"folder-server",folderNames:["server","servers","backend","backends"]},{name:"folder-client",folderNames:["client","clients","frontend","frontends","pwa","spa"]},{name:"folder-tasks",folderNames:["tasks","tickets"]},{name:"folder-android",folderNames:["android"]},{name:"folder-ios",folderNames:["ios"]},{name:"folder-ui",folderNames:["presentation","gui","ui","ux"]},{name:"folder-upload",folderNames:["uploads","upload"]},{name:"folder-download",folderNames:["downloads","download","downloader","downloaders"]},{name:"folder-tools",folderNames:["tools","toolkit","toolkits","toolbox","toolboxes","tooling","devtools","kit","kits"]},{name:"folder-helper",folderNames:["helpers","helper"]},{name:"folder-serverless",folderNames:["serverless"]},{name:"folder-api",folderNames:["api","apis","restapi"]},{name:"folder-app",folderNames:["app","apps","application","applications"]},{name:"folder-apollo",folderNames:["apollo","apollo-client","apollo-cache","apollo-config"]},{name:"folder-archive",folderNames:["arc","arcs","archive","archives","archival"]},{name:"folder-backup",folderNames:["bkp","bkps","bak","baks","backup","backups","back-up","back-ups","history","histories"]},{name:"folder-batch",folderNames:["batch","batchs","batches"]},{name:"folder-buildkite",folderNames:["buildkite"]},{name:"folder-cluster",folderNames:["cluster","clusters"]},{name:"folder-command",folderNames:["command","commands","commandline","cmd","cli","clis"]},{name:"folder-constant",folderNames:["constant","constants","const","consts"]},{name:"folder-container",folderNames:["container","containers","devcontainer"]},{name:"folder-content",folderNames:["content","contents"]},{name:"folder-context",folderNames:["context","contexts"]},{name:"folder-core",folderNames:["core"]},{name:"folder-delta",folderNames:["delta","deltas","changes"]},{name:"folder-dump",folderNames:["dump","dumps"]},{name:"folder-examples",folderNames:["demo","demos","example","examples","sample","samples","sample-data"]},{name:"folder-environment",folderNames:["env","envs","environment","environments","venv"]},{name:"folder-functions",folderNames:["func","funcs","function","functions","lambda","lambdas","logic","math","maths","calc","calcs","calculation","calculations"]},{name:"folder-generator",folderNames:["generator","generators","generated","cfn-gen","gen","gens","auto"]},{name:"folder-hook",folderNames:["hook","hooks"]},{name:"folder-trigger",folderNames:["trigger","triggers"]},{name:"folder-job",folderNames:["job","jobs"]},{name:"folder-keys",folderNames:["key","keys","token","tokens","jwt","secret","secrets"]},{name:"folder-layout",folderNames:["layout","layouts"]},{name:"folder-mail",folderNames:["mail","mails","email","emails","smtp","mailers"]},{name:"folder-mappings",folderNames:["mappings","mapping"]},{name:"folder-meta",folderNames:["meta"]},{name:"folder-changesets",folderNames:["changesets","changeset"]},{name:"folder-packages",folderNames:["package","packages","pkg","pkgs","serverpackages","devpackages","dependencies"]},{name:"folder-shared",folderNames:["shared","common"]},{name:"folder-shader",folderNames:["glsl","hlsl","shader","shaders"]},{name:"folder-stack",folderNames:["stack","stacks"]},{name:"folder-template",folderNames:["template","templates","github/ISSUE_TEMPLATE","github/PULL_REQUEST_TEMPLATE"]},{name:"folder-utils",folderNames:["util","utils","utility","utilities"]},{name:"folder-supabase",folderNames:["supabase"]},{name:"folder-private",folderNames:["private"]},{name:"folder-linux",folderNames:["linux","linuxbsd","unix"]},{name:"folder-windows",folderNames:["windows","win","win32"]},{name:"folder-macos",folderNames:["macos","mac","osx","DS_Store","iPhone","iPad","iPod","macbook","macbook-air","macosx","apple"]},{name:"folder-error",folderNames:["error","errors","err","errs","crash","crashes"]},{name:"folder-event",folderNames:["event","events"]},{name:"folder-secure",folderNames:["auth","authentication","secure","security","cert","certs","certificate","certificates","ssl","cipher","cypher","tls"]},{name:"folder-custom",folderNames:["custom","customs"]},{name:"folder-mock",folderNames:["draft","drafts","mock","mocks","fixture","fixtures","concept","concepts","sketch","sketches"]},{name:"folder-syntax",folderNames:["syntax","syntaxes","spellcheck","spellcheckers"]},{name:"folder-vm",folderNames:["vm","vms"]},{name:"folder-stylus",folderNames:["stylus"]},{name:"folder-flow",folderNames:["flow-typed"]},{name:"folder-rules",folderNames:["rule","rules","validation","validations","validator","validators"]},{name:"folder-review",folderNames:["review","reviews","revisal","revisals","reviewed","preview","previews"]},{name:"folder-animation",folderNames:["anim","anims","animation","animations","animated","motion","motions","transition","transitions","easing","easings"]},{name:"folder-guard",folderNames:["guard","guards"]},{name:"folder-prisma",folderNames:["prisma","prisma/schema"]},{name:"folder-pipe",folderNames:["pipe","pipes","pipeline","pipelines"]},{name:"folder-svg",folderNames:["svg","svgs"]},{name:"folder-vuex-store",folderNames:["store","stores"],enabledFor:["vue_vuex"]},{name:"folder-nuxt",folderNames:["nuxt"]},{name:"folder-vue-directives",folderNames:["directives"],enabledFor:["vue_vuex","vue"]},{name:"folder-vue",folderNames:["components"],enabledFor:["vue_vuex","vue"]},{name:"folder-terraform",folderNames:["terraform"]},{name:"folder-mobile",folderNames:["mobile","mobiles","portable","portability","phone","phones"]},{name:"folder-stencil",folderNames:["stencil"]},{name:"folder-firebase",folderNames:["firebase"]},{name:"folder-firestore",folderNames:["firestore","cloud-firestore","firebase-firestore"]},{name:"folder-cloud-functions",folderNames:["cloud-functions","cloudfunctions","firebase-cloud-functions","firebase-cloudfunctions"]},{name:"folder-svelte",folderNames:["svelte","svelte-kit"]},{name:"folder-update",folderNames:["update","updates","upgrade","upgrades"]},{name:"folder-intellij",folderNames:["idea"],light:!0},{name:"folder-azure-pipelines",folderNames:["azure-pipelines","azure-pipelines-ci"]},{name:"folder-mjml",folderNames:["mjml"]},{name:"folder-admin",folderNames:["admin","admins","manager","managers","moderator","moderators"]},{name:"folder-jupyter",folderNames:["jupyter","notebook","notebooks","ipynb"]},{name:"folder-scala",folderNames:["scala"]},{name:"folder-connection",folderNames:["connection","connections","integration","integrations","remote","remotes"]},{name:"folder-quasar",folderNames:["quasar"]},{name:"folder-next",folderNames:["next"]},{name:"folder-cobol",folderNames:["cobol"]},{name:"folder-yarn",folderNames:["yarn"]},{name:"folder-husky",folderNames:["husky"]},{name:"folder-storybook",folderNames:["storybook","stories"]},{name:"folder-base",folderNames:["base","bases"]},{name:"folder-cart",folderNames:["cart","shopping-cart","shopping","shop"]},{name:"folder-home",folderNames:["home","start","main","landing"]},{name:"folder-project",folderNames:["project","projects"]},{name:"folder-interface",folderNames:["interface","interfaces"]},{name:"folder-netlify",folderNames:["netlify"]},{name:"folder-enum",folderNames:["enum","enums"]},{name:"folder-contract",folderNames:["pact","pacts","contract","contracts","contract-testing","contract-test","contract-tests"]},{name:"folder-helm",folderNames:["helm","helmchart","helmcharts"]},{name:"folder-queue",folderNames:["queue","queues","bull","mq"]},{name:"folder-vercel",folderNames:["vercel","now"]},{name:"folder-cypress",folderNames:["cypress"]},{name:"folder-decorators",folderNames:["decorator","decorators"]},{name:"folder-java",folderNames:["java"]},{name:"folder-resolver",folderNames:["resolver","resolvers"]},{name:"folder-angular",folderNames:["angular"]},{name:"folder-unity",folderNames:["unity"]},{name:"folder-pdf",folderNames:["pdf","pdfs"]},{name:"folder-proto",folderNames:["protobuf","protobufs","proto","protos"]},{name:"folder-plastic",folderNames:["plastic"]},{name:"folder-gamemaker",folderNames:["gamemaker","gamemaker2"]},{name:"folder-mercurial",folderNames:["hg","hghooks","hgext"]},{name:"folder-godot",folderNames:["godot","godot-cpp"]},{name:"folder-lottie",folderNames:["lottie","lotties","lottiefiles"]},{name:"folder-taskfile",folderNames:["taskfile","taskfiles"]},{name:"folder-drizzle",folderNames:["drizzle"]},{name:"folder-cloudflare",folderNames:["cloudflare"]},{name:"folder-seeders",folderNames:["seeds","seeders","seed","seeding"]},{name:"folder-store",folderNames:["store","stores"],enabledFor:["angular"]},{name:"folder-bicep",folderNames:["bicep"]},{name:"folder-snapcraft",folderNames:["snap","snapcraft"]},{name:"folder-development",folderNames:["dev","development"],clone:{base:"folder-src",color:"light-blue-700"}},{name:"folder-flutter",folderNames:["flutter"]},{name:"folder-snippet",folderNames:["snippet","snippets"]},{name:"folder-element",folderNames:["element","elements"]},{name:"folder-src-tauri",folderNames:["src-tauri"]},{name:"folder-favicon",folderNames:["favicon","favicons"]},{name:"folder-lefthook",folderNames:["lefthook","lefthook-local"]},{name:"folder-bloc",folderNames:["bloc","cubit","blocs","cubits"]},{name:"folder-powershell",folderNames:["powershell","ps","ps1"]},{name:"folder-repository",folderNames:["repository","repositories","repo","repos"]},{name:"folder-luau",folderNames:["luau"]},{name:"folder-obsidian",folderNames:["obsidian"]},{name:"folder-trash",folderNames:["trash"]},{name:"folder-cline",folderNames:["cline_docs"]},{name:"folder-liquibase",folderNames:["liquibase"]},{name:"folder-dart",folderNames:["dart","dart_tool","dart_tools"]},{name:"folder-zeabur",folderNames:["zeabur"]},{name:"folder-kusto",folderNames:["kusto","kql"]},{name:"folder-policy",folderNames:["policy","policies"]},{name:"folder-attachment",folderNames:["attachment","attachments"]},{name:"folder-bibliography",folderNames:["bibliography","bibliographies","book","books"]},{name:"folder-link",folderNames:["link","links"]}]},{name:"classic",defaultIcon:{name:"folder"},rootFolder:{name:"folder-root"}},{name:"none",defaultIcon:{name:""}}],xo=[{name:"git",ids:["git","git-commit","git-rebase","ignore"]},{name:"github-actions-workflow",ids:["github-actions-workflow"]},{name:"yaml",ids:["yaml","spring-boot-properties-yaml","ansible","ansible-jinja"]},{name:"xml",ids:["xml","xquery","xsl"]},{name:"matlab",ids:["matlab"]},{name:"settings",ids:["makefile","ini","properties","spring-boot-properties"]},{name:"toml",light:!0,ids:["toml"]},{name:"diff",ids:["diff"]},{name:"json",ids:["json","jsonc","json5"]},{name:"blink",ids:["blink"]},{name:"java",ids:["java"]},{name:"razor",ids:["razor","aspnetcorerazor"]},{name:"python",ids:["python"]},{name:"mojo",ids:["mojo"]},{name:"javascript",ids:["javascript"]},{name:"typescript",ids:["typescript","ets"]},{name:"scala",ids:["scala"]},{name:"handlebars",ids:["handlebars"]},{name:"perl",ids:["perl","perl6"]},{name:"haxe",ids:["haxe","hxml"]},{name:"puppet",ids:["puppet"]},{name:"elixir",ids:["elixir"]},{name:"livescript",ids:["livescript"]},{name:"erlang",ids:["erlang"]},{name:"twig",ids:["twig"]},{name:"julia",ids:["julia"]},{name:"elm",ids:["elm"]},{name:"purescript",ids:["purescript"]},{name:"stylus",ids:["stylus"]},{name:"nunjucks",ids:["nunjucks"]},{name:"pug",ids:["pug"]},{name:"robot",ids:["robotframework"]},{name:"sass",ids:["sass","scss"]},{name:"less",ids:["less"]},{name:"css",ids:["css"]},{name:"visualstudio",ids:["testOutput","vb"]},{name:"angular",ids:["ng-template"]},{name:"graphql",ids:["graphql"]},{name:"solidity",ids:["solidity"]},{name:"autoit",ids:["autoit"]},{name:"haml",ids:["haml"]},{name:"yang",ids:["yang"]},{name:"terraform",ids:["terraform"]},{name:"applescript",ids:["applescript"]},{name:"cake",ids:["cake"]},{name:"cucumber",ids:["cucumber"]},{name:"nim",ids:["nim","nimble"]},{name:"apiblueprint",ids:["apiblueprint"]},{name:"riot",ids:["riot"]},{name:"postcss",ids:["postcss"]},{name:"coldfusion",ids:["lang-cfml"]},{name:"haskell",ids:["haskell"]},{name:"dhall",ids:["dhall"]},{name:"cabal",ids:["cabal"]},{name:"nix",ids:["nix"]},{name:"ruby",ids:["ruby"]},{name:"slim",ids:["slim"]},{name:"php",ids:["php"]},{name:"php_elephant",ids:[]},{name:"php_elephant_pink",ids:[]},{name:"hack",ids:["hack"]},{name:"react",ids:["javascriptreact"]},{name:"mjml",ids:["mjml"]},{name:"processing",ids:["processing"]},{name:"hcl",ids:["hcl"]},{name:"go",ids:["go"]},{name:"go_gopher",ids:[]},{name:"nodejs_alt",ids:[]},{name:"django",ids:["django-html","django-txt"]},{name:"html",ids:["html"]},{name:"godot",ids:["gdscript"]},{name:"godot-assets",ids:["gdresource","gdshader"]},{name:"vim",ids:["viml"]},{name:"silverstripe",ids:[]},{name:"prolog",ids:["prolog"]},{name:"pawn",ids:["pawn"]},{name:"reason",ids:["reason","reason_lisp"]},{name:"sml",ids:["sml"]},{name:"tex",ids:["tex"]},{name:"latex",ids:["latex","latex-expl3"],clone:{base:"tex",color:"teal-400"}},{name:"doctex",ids:["doctex"],clone:{base:"tex",color:"blue-gray-300"}},{name:"salesforce",ids:["apex"]},{name:"sas",ids:["sas"]},{name:"docker",ids:["dockerfile","dockercompose","dockerbake"]},{name:"table",ids:["csv","tsv","psv"]},{name:"csharp",ids:["csharp"]},{name:"console",ids:["bat","awk","shellscript"]},{name:"c",ids:["c"]},{name:"cpp",ids:["cpp"]},{name:"objective-c",ids:["objective-c"]},{name:"objective-cpp",ids:["objective-cpp"]},{name:"c3",ids:["c3"]},{name:"coffee",ids:["coffeescript"]},{name:"fsharp",ids:["fsharp"]},{name:"editorconfig",ids:["editorconfig"]},{name:"clojure",ids:["clojure"]},{name:"groovy",ids:["groovy"]},{name:"markdoc",ids:["markdoc"]},{name:"markdown",ids:["markdown"]},{name:"jinja",ids:["jinja"]},{name:"proto",ids:["proto"]},{name:"python-misc",ids:["pip-requirements"]},{name:"vue",ids:["vue","vue-postcss","vue-html"]},{name:"lua",ids:["lua"]},{name:"bibliography",ids:["bibtex"]},{name:"bibtex-style",ids:["bibtex-style"]},{name:"log",ids:["log"]},{name:"jupyter",ids:["jupyter"]},{name:"document",ids:["plaintext"]},{name:"pdf",ids:["pdf"]},{name:"powershell",ids:["powershell"]},{name:"pug",ids:["jade"]},{name:"r",ids:["r","rsweave"]},{name:"rust",ids:["rust"]},{name:"database",ids:["sql"]},{name:"kusto",ids:["kql"]},{name:"lock",ids:["ssh_config"]},{name:"svg",ids:["svg"]},{name:"swift",ids:["swift"]},{name:"react_ts",ids:["typescriptreact"]},{name:"search",ids:["search-result"]},{name:"minecraft",ids:["mcfunction"]},{name:"rescript",ids:["rescript"]},{name:"otne",ids:["otne"]},{name:"twine",ids:["twee3","twee3-harlowe-3","twee3-chapbook-1","twee3-sugarcube-2"]},{name:"grain",ids:["grain"]},{name:"lolcode",ids:["lolcode"]},{name:"idris",ids:["idris"]},{name:"chess",ids:["pgn"]},{name:"gemini",ids:["gemini","text-gemini"]},{name:"vlang",ids:["v"]},{name:"wolframlanguage",ids:["wolfram"]},{name:"shader",ids:["shaderlab","hlsl","glsl","wgsl"]},{name:"tree",ids:["tree"]},{name:"svelte",ids:["svelte"]},{name:"dart",ids:["dart"]},{name:"cadence",ids:["cadence"]},{name:"stylable",ids:["stylable"]},{name:"hjson",ids:["hjson"]},{name:"huff",ids:["huff"]},{name:"cds",ids:["cds","capnb","cds-markdown-injection"]},{name:"concourse",ids:["concourse-pipeline-yaml","concourse-task-yaml"]},{name:"systemd",light:!0,ids:["systemd-conf","systemd-unit-file"]},{name:"slint",ids:["slint"]},{name:"luau",ids:["luau"]},{name:"hosts",ids:["hosts"]},{name:"beancount",ids:["beancount"]},{name:"ahk2",ids:["ahk2"],clone:{base:"autohotkey",color:"lime-700"}},{name:"gnuplot",ids:["gnuplot"]}],yo=(e,s,o)=>{var n;let r=wo(e,s.activeIconPack),t=ko((n=s.languages)==null?void 0:n.associations),l=[...e,...t],i=[...r,...t];return l.forEach(a=>{let c=a.clone!==void 0;o=jo(o,s,a,c)}),i.forEach(a=>{a.disabled||(o=k(o,be(a.name,a.ids)),o.light=a.light?k(o.light,be(a.name+L,a.ids)):o.light,o.highContrast=a.highContrast?k(o.highContrast,be(a.name+$,a.ids)):o.highContrast)}),o},jo=(e,s,o,n)=>{let r=n?ke:".svg";return he(e,s,o.name,r),o.light&&he(e,s,o.name+L,r),o.highContrast&&he(e,s,o.name+$,r),e},he=(e,s,o,n)=>{let r=we(s);e.iconDefinitions&&(e.iconDefinitions[o]={iconPath:`${Y}${o}${r}${n}`})},be=(e,s)=>{let o={languageIds:{}};return s.forEach(n=>{o.languageIds[n]=e}),o},ko=e=>e?Object.keys(e).map(s=>({name:e[s].toLowerCase(),ids:[s.toLowerCase()]})):[],wo=(e,s)=>e.filter(o=>o.enabledFor?o.enabledFor.some(n=>n===s):!0),No=e=>{let s=Ys(e),o=po(),n=yo(xo,s,o),r=lo(ho,s,o),t=co(bo,s,o);return k(n,r,t)},Eo=Object.values(ts)});var Ls=H(U());var ce=H(U()),Fs={iconPack:"react",iconSize:"md",extEnabled:!0,fileIconBindings:{},folderIconBindings:{},languageIconBindings:{}},C=async(e,s=window.location.hostname,o=!0)=>{let n={[`${s!=="default"?s:"SKIP"}:${e}`]:null,[`default:${e}`]:Fs[e]},r=await ce.default.storage.sync.get(n),t=r[`${s}:${e}`],l=r[`default:${e}`];return t??(o?l:null)};var W=(e,s,o=window.location.hostname)=>ce.default.storage.onChanged.addListener(n=>n[`${o}:${e}`]?.newValue!==void 0&&s(n[`${o}:${e}`]?.newValue));var De="data-material-icons-extension-size",me=e=>document.body.setAttribute(De,e),Os=()=>{new MutationObserver(()=>{C("iconSize").then(s=>{document.body.hasAttribute(De)||me(s)})}).observe(document.body,{attributes:!0,subtree:!1})},Be=()=>{let e=()=>C("iconSize").then(me);document.addEventListener("DOMContentLoaded",()=>{e(),Os()},!1),W("iconSize",me),W("iconSize",e,"default")};var ks=H(as());function w(){if(!(this instanceof w))return new w;this.size=0,this.uid=0,this.selectors=[],this.selectorObjects={},this.indexes=Object.create(this.indexes),this.activeIndexes=[]}var Q=window.document.documentElement,Ao=Q.matches||Q.webkitMatchesSelector||Q.mozMatchesSelector||Q.oMatchesSelector||Q.msMatchesSelector;w.prototype.matchesSelector=function(e,s){return Ao.call(e,s)};w.prototype.querySelectorAll=function(e,s){return s.querySelectorAll(e)};w.prototype.indexes=[];var _o=/^#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/g;w.prototype.indexes.push({name:"ID",selector:function(s){var o;if(o=s.match(_o))return o[0].slice(1)},element:function(s){if(s.id)return[s.id]}});var zo=/^\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/g;w.prototype.indexes.push({name:"CLASS",selector:function(s){var o;if(o=s.match(zo))return o[0].slice(1)},element:function(s){var o=s.className;if(o){if(typeof o=="string")return o.split(/\s/);if(typeof o=="object"&&"baseVal"in o)return o.baseVal.split(/\s/)}}});var Co=/^((?:[\w\u00c0-\uFFFF\-]|\\.)+)/g;w.prototype.indexes.push({name:"TAG",selector:function(s){var o;if(o=s.match(Co))return o[0].toUpperCase()},element:function(s){return[s.nodeName.toUpperCase()]}});w.prototype.indexes.default={name:"UNIVERSAL",selector:function(){return!0},element:function(){return[!0]}};var Ne;typeof window.Map=="function"?Ne=window.Map:Ne=function(){function e(){this.map={}}return e.prototype.get=function(s){return this.map[s+" "]},e.prototype.set=function(s,o){this.map[s+" "]=o},e}();var is=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g;function cs(e,s){e=e.slice(0).concat(e.default);var o=e.length,n,r,t,l,i=s,a,c,m=[];do if(is.exec(""),(t=is.exec(i))&&(i=t[3],t[2]||!i)){for(n=0;n"u"?"undefined":Bo(s))==="object"?(o=s,o.selector=e):o=e;var n=this,r={id:Ho++,selector:o.selector,initialize:o.initialize,add:o.add,remove:o.remove,subscribe:o.subscribe,elements:[],elementConstructor:o.hasOwnProperty("constructor")?o.constructor:this.ownerDocument.defaultView.Element,abort:function(){n._abortObserving(r)}};return this.selectorSet.add(r.selector,r),this.observers[r.id]=r,this._scheduleAddRootNodes(),r};Z.prototype._abortObserving=function(e){for(var s=e.elements,o=0;o{let t=(0,ks.generateManifest)({activeIconPack:s||void 0,files:{associations:o},folders:{associations:n},languages:{associations:r}});hs(e.selectors.row,{add(l){let i=()=>js(l,e,t);i(),e.onAdd(l,i)}})},Ns=e=>{document.querySelectorAll("img[data-material-icons-extension-iconname]").forEach(s=>{let o=s.getAttribute("data-material-icons-extension-iconname"),n=s.getAttribute("data-material-icons-extension-filename")??"";o&&Le(s,o,n,e)})};var Es=H(U()),As=()=>Es.default.storage.sync.get("customProviders").then(e=>e.customProviders||{});var _s="material-icons-exension-hide-pseudo";function $e(){return{name:"azure",domains:[{host:"dev.azure.com",test:/^dev\.azure\.com$/},{host:"visualstudio.com",test:/.*\.visualstudio\.com$/}],selectors:{row:"table.bolt-table tbody tr.bolt-table-row, table.bolt-table tbody > a",filename:'td.bolt-table-cell[data-column-index="0"] .bolt-table-link .text-ellipsis, table.bolt-table tbody > a > td[aria-colindex="1"] span.text-ellipsis',icon:'td.bolt-table-cell[data-column-index="0"] span.icon-margin, td[aria-colindex="1"] span.icon-margin',detect:"body > input[type=hidden][name=__RequestVerificationToken]"},canSelfHost:!1,isCustom:!1,getIsLightTheme:()=>document.defaultView?.getComputedStyle(document.body).getPropertyValue("color")==="rgba(0, 0, 0, 0.9)",getIsDirectory:({icon:e})=>e.classList.contains("repos-folder-icon"),getIsSubmodule:()=>!1,getIsSymlink:({icon:e})=>e.classList.contains("ms-Icon--PageArrowRight"),replaceIcon:(e,s)=>{s.style.display="inline-flex",s.style.height="1rem",s.style.width="1rem",e.classList.contains(_s)||e.classList.add(_s),e.hasChildNodes()&&e.firstChild!==null?e.replaceChild(s,e.firstChild):e.appendChild(s)},onAdd:(e,s)=>{let o=r=>{r.some(l=>Array.from(l.addedNodes).some(i=>i.nodeName==="IMG"))||s()};new MutationObserver(o).observe(e,{attributes:!0,childList:!0,subtree:!0})},transformFileName:(e,s,o)=>o}}function Ie(){return{name:"bitbucket",domains:[{host:"bitbucket.org",test:/^bitbucket\.org$/}],selectors:{row:'table[data-qa="repository-directory"] td:first-child a:first-child:not([aria-label="Parent directory,"])',filename:"span",icon:"svg",detect:"body[data-aui-version] > #root"},canSelfHost:!0,isCustom:!1,getIsLightTheme:()=>!0,getIsDirectory:({icon:e})=>e.parentNode?.getAttribute("aria-label")==="Directory,",getIsSubmodule:({icon:e})=>e.parentNode?.getAttribute("aria-label")==="Submodule,",getIsSymlink:()=>!1,replaceIcon:(e,s)=>{s.style.overflow="hidden",s.style.pointerEvents="none",s.style.maxHeight="100%",s.style.maxWidth="100%",s.style.verticalAlign="bottom",e.getAttributeNames().forEach(o=>o!=="src"&&!/^data-material-icons-extension/.test(o)&&s.setAttribute(o,e.getAttribute(o)??"")),e.parentNode?.replaceChild(s,e)},onAdd:()=>{},transformFileName:(e,s,o)=>o}}function qe(){return{name:"gitea",domains:[{host:"gitea.com",test:/^gitea\.com$/}],selectors:{row:"#repo-files-table .repo-file-item",filename:".repo-file-cell.name a",icon:".repo-file-cell.name svg",detect:"body > .full.height > .page-content[role=main]"},canSelfHost:!0,isCustom:!1,getIsLightTheme:()=>!1,getIsDirectory:({icon:e})=>e.classList.contains("octicon-file-directory-fill"),getIsSubmodule:({icon:e})=>e.classList.contains("octicon-file-submodule"),getIsSymlink:({icon:e})=>e.classList.contains("octicon-file-symlink-file"),replaceIcon:(e,s)=>{e.getAttributeNames().forEach(o=>o!=="src"&&!/^data-material-icons-extension/.test(o)&&s.setAttribute(o,e.getAttribute(o)??"")),e.parentNode?.replaceChild(s,e)},onAdd:()=>{},transformFileName:(e,s,o)=>e.querySelector(".archive-link")&&o.includes("Source code")?o.replace(/\s+\((.*?)\)$/,".$1"):o}}function Pe(){return{name:"gitee",domains:[{host:"gitee.com",test:/^gitee\.com$/}],selectors:{row:`#git-project-content .tree-content .row.tree-item,
.file_title,
.blob-description,
.release-body .releases-download-list .item`,filename:`.tree-list-item > a,
.tree-item-submodule-name a,
span.file_name,
a`,icon:"i.iconfont:not(.icon-delete), i.icon",detect:null},canSelfHost:!1,isCustom:!1,getIsLightTheme:()=>!0,getIsDirectory:({icon:e})=>e.classList.contains("icon-folders"),getIsSubmodule:({icon:e})=>e.classList.contains("icon-submodule"),getIsSymlink:({icon:e})=>e.classList.contains("icon-file-shortcut"),replaceIcon:(e,s)=>{e.getAttributeNames().forEach(o=>o!=="src"&&!/^data-material-icons-extension/.test(o)&&s.setAttribute(o,e.getAttribute(o)??"")),s.style.height="28px",s.style.width="18px",e.parentNode?.replaceChild(s,e)},onAdd:()=>{},transformFileName:(e,s,o)=>e.classList.contains("item")&&o.includes("Source code")?o.replace(/\s+\((.*?)\)$/,".$1"):o}}function Se(){return{name:"github",domains:[{host:"github.com",test:/^github\.com$/}],selectors:{row:`.js-navigation-container[role=grid] > .js-navigation-item,
file-tree .ActionList-content,
a.tree-browser-result,
.PRIVATE_TreeView-item-content,
.react-directory-filename-column,
.Box details .Box-row`,filename:`div[role="rowheader"] > span,
.ActionList-item-label,
a.tree-browser-result > marked-text,
.PRIVATE_TreeView-item-content > .PRIVATE_TreeView-item-content-text,
.react-directory-filename-column a,
a.Truncate`,icon:`.octicon-file,
.octicon-file-directory-fill,
.octicon-file-directory-open-fill,
.octicon-file-submodule,
.react-directory-filename-column > svg,
.octicon-package,
.octicon-file-zip`,detect:"body > div[data-turbo-body]"},canSelfHost:!0,isCustom:!1,getIsLightTheme:()=>{let e=document.querySelector("html")?.getAttribute("data-color-mode");return e==="light"?!0:e==="auto"?window.matchMedia("(prefers-color-scheme: light)").matches:!1},getIsDirectory:({icon:e})=>e.getAttribute("aria-label")==="Directory"||e.classList.contains("octicon-file-directory-fill")||e.classList.contains("octicon-file-directory-open-fill")||e.classList.contains("icon-directory"),getIsSubmodule:({icon:e})=>e.getAttribute("aria-label")==="Submodule",getIsSymlink:({icon:e})=>e.getAttribute("aria-label")==="Symlink Directory",replaceIcon:(e,s)=>{e.getAttributeNames().forEach(n=>n!=="src"&&!/^data-material-icons-extension/.test(n)&&s.setAttribute(n,e.getAttribute(n)??""));let o=e.previousElementSibling;o?.getAttribute("data-material-icons-extension")==="icon"?s.replaceWith(o):e.getAttribute("data-material-icons-extension")==="icon"?e.replaceWith(s):(e.style.display="none",e.before(s))},onAdd:()=>{},transformFileName:(e,s,o)=>o.includes("@")?o.replace(/\s+@\s+[a-fA-F0-9]{4,}$/,""):e.classList.contains("Box-row")&&o.includes("Source code")?o.replace(/\s+\((.*?)\)$/,".$1"):o}}function Te(){return{name:"gitlab",domains:[{host:"gitlab.com",test:/^gitlab\.com$/}],selectors:{row:`table[data-testid="file-tree-table"].table.tree-table tr.tree-item,
table[data-qa-selector="file_tree_table"] tr,
.file-header-content,
.gl-card[data-testid="release-block"] .js-assets-list ul li`,filename:`.tree-item-file-name .tree-item-link,
.tree-item-file-name,
.file-header-content .file-title-name,
.file-header-content .gl-link,
.gl-link`,icon:`.tree-item-file-name .tree-item-link svg,
.tree-item svg, .file-header-content svg:not(.gl-button-icon),
.gl-link svg.gl-icon[data-testid="doc-code-icon"]`,detect:'head meta[content="GitLab"]'},canSelfHost:!0,isCustom:!1,getIsLightTheme:()=>!document.querySelector("body")?.classList.contains("gl-dark"),getIsDirectory:({icon:e})=>e.getAttribute("data-testid")==="folder-icon",getIsSubmodule:({row:e})=>e.querySelector("a")?.classList.contains("is-submodule")||!1,getIsSymlink:({icon:e})=>e.getAttribute("data-testid")==="symlink-icon",replaceIcon:(e,s)=>{e.getAttributeNames().forEach(o=>o!=="src"&&!/^data-material-icons-extension/.test(o)&&s.setAttribute(o,e.getAttribute(o)??"")),s.style.height="16px",s.style.width="16px",e.parentNode?.replaceChild(s,e)},onAdd:()=>{},transformFileName:(e,s,o)=>e.parentElement?.parentElement?.classList.contains("js-assets-list")&&o.includes("Source code")?o.replace(/\s+\((.*?)\)$/,".$1"):o}}function Me(){return{name:"sourceforge",domains:[{host:"sourceforge.net",test:/^sourceforge\.net$/}],selectors:{row:"table#files_list tr, #content_base tr td:first-child",filename:'th[headers="files_name_h"], td:first-child > a.icon',icon:'th[headers="files_name_h"] > a, a.icon > i.fa',detect:null},canSelfHost:!1,isCustom:!1,getIsLightTheme:()=>!0,getIsDirectory:({row:e,icon:s})=>s.nodeName==="I"?s.classList.contains("fa-folder"):e.classList.contains("folder"),getIsSubmodule:()=>!1,getIsSymlink:({icon:e})=>e.nodeName==="I"?e.classList.contains("fa-star"):!1,replaceIcon:(e,s)=>{if(s.style.verticalAlign="text-bottom",e.nodeName==="I")s.style.height="14px",s.style.width="14px",e.parentNode?.replaceChild(s,e);else{if(e.querySelector('img[data-material-icons-extension="icon"]'))return;s.style.height="20px",s.style.width="20px";let o=e.querySelector("svg");o?o.parentNode?.replaceChild(s,o):e.prepend(s)}},onAdd:()=>{},transformFileName:(e,s,o)=>o}}var zs={azure:$e,bitbucket:Ie,gitea:qe,gitee:Pe,github:Se,gitlab:Te,sourceforge:Me},te={};for(let e of Object.values(zs)){let s=e();te[s.name]=s}function nn(e){return e.replace(/[-[\]{}()*+!<=:?./\\^$|#\s,]/g,"\\$&")}var rn=(e,s)=>{s=typeof s=="string"?zs[s]:s;let o=s();o.isCustom=!0,o.name=e,o.domains=[{host:e,test:new RegExp(`^${nn(e)}$`)}],te[e]=o};var tn=()=>As().then(e=>{for(let[s,o]of Object.entries(e))te[s]||rn(s,o);return te}),Cs=e=>(e.startsWith("http")?e=new URL(e).host:e=new URL(`http://${e}`).host,tn().then(s=>{for(let o of Object.values(s))for(let n of o.domains)if(n.test.test(e))return o;return null}));var $s=async()=>{Be();let{href:e}=window.location;await ln(e)},ln=async e=>{let s=await Cs(e);if(!s)return;let o=await C("iconPack"),n=await C("fileIconBindings"),r=await C("folderIconBindings"),t=await C("languageIconBindings"),l=await C("extEnabled");!await C("extEnabled","default")||!l||(ws(s,o,n,r,t),W("iconPack",()=>Ns(s)))},Fe={init:$s,guessProvider:e=>{for(let[s,o]of Object.entries(e))if(document.querySelector(o))return s;return null}};Ls.default.runtime.onMessage.addListener((e,s,o)=>{if(!Fe[e.cmd])return o(null);if(e.cmd==="init")return Fe.init(),o(null);if(e.cmd==="guessProvider"){let n=Fe[e.cmd]((e.args||[])[0]);return o(n)}});$s();})();
// END: main.js
;}
} catch(e) { _error(` Error executing scripts ${scriptPaths}`, e); }
} else {
_log(`Skipping document-start phase (no document).`);
}
// #endregion
// #region Wait for Document End DOMContentLoaded ---
if (typeof document !== 'undefined' && document.readyState === 'loading') {
_log(`Waiting for DOMContentLoaded...`);
await new Promise(resolve => document.addEventListener('DOMContentLoaded', resolve, { once: true }));
_log(`DOMContentLoaded fired.`);
} else if (typeof document !== 'undefined') {
_log(`DOMContentLoaded already passed or not applicable.`);
}
// #endregion
// #region Document End
if (typeof document !== 'undefined') {
_log(`Executing document-end phase...`);
const scriptPaths = [];
_log(` Executing JS (end): ${scriptPaths}`);
try {
// Keep variables from being redeclared for global scope, but also make them apply to global scope. (Theoretically)
with (globalThis){;
;}
} catch(e) { _error(` Error executing scripts ${scriptPaths}`, e); }
} else {
_log(`Skipping document-end phase (no document).`);
}
// #endregion
// #region Wait for Document Idle
_log(`Waiting for document idle state...`);
if (typeof window !== 'undefined' && typeof window.requestIdleCallback === 'function') {
await new Promise(resolve => window.requestIdleCallback(resolve, { timeout: 2000 })); // 2-second timeout fallback
_log(`requestIdleCallback fired or timed out.`);
} else {
// Fallback: wait a short period after DOMContentLoaded/current execution if requestIdleCallback is unavailable
await new Promise(resolve => setTimeout(resolve, 50));
_log(`Idle fallback timer completed.`);
}
// #endregion
// #region Document Idle
if (typeof document !== 'undefined') {
_log(`Executing document-idle phase...`);
const scriptPaths = [];
_log(` Executing JS (idle): ${scriptPaths}`);
try {
// Keep variables from being redeclared for global scope, but also make them apply to global scope. (Theoretically)
with (globalThis){;
;}
} catch(e) { _error(` Error executing scripts ${scriptPaths}`, e); }
} else {
_log(`Skipping document-idle phase (no document).`);
}
_log(`All execution phases complete, re-firing load events.`);
document.dispatchEvent(new Event("DOMContentLoaded", {
bubbles: true,
cancelable: true
}));
}
// #endregion
// #region Event Listener No changes needed here ---
window.addEventListener("message", (event) => {
if (event.data.type === "openOptionsPage") {
openOptionsPage();
}
if (event.data.type === "openPopupPage") {
openPopupPage();
}
if (event.data.type === "closeOptionsPage") {
closeOptionsModal();
}
if (event.data.type === "closePopupPage") {
closePopupModal();
}
});
// #endregion
// #region Refactored Modal Closing Functions Promise-based ---
function closeOptionsModal() {
return new Promise((resolve) => {
const DURATION = 100;
const backdrop = document.getElementById("extension-options-backdrop");
const modal = document.getElementById("extension-options-modal");
if (!backdrop || !modal) {
return resolve();
}
modal.style.animation = `modalCloseAnimation ${DURATION / 1000}s ease-out forwards`;
backdrop.style.animation = `backdropFadeOut ${DURATION / 1000}s ease-out forwards`;
setTimeout(() => {
if (confirm("Close options and reload the page?")) {
window.location.reload(); // Note: This will stop further execution
} else {
backdrop.remove();
}
resolve();
}, DURATION);
});
}
function closePopupModal() {
return new Promise((resolve) => {
const DURATION = 100;
const backdrop = document.getElementById("extension-popup-backdrop");
const modal = document.getElementById("extension-popup-modal");
if (!backdrop || !modal) {
return resolve();
}
modal.style.animation = `modalCloseAnimation ${DURATION / 1000}s ease-out forwards`;
backdrop.style.animation = `backdropFadeOut ${DURATION / 1000}s ease-out forwards`;
setTimeout(() => {
backdrop.remove();
resolve();
}, DURATION);
});
}
// #endregion
// #region Simplified Public API Functions ---
async function openPopupPage() {
if (!POPUP_PAGE_PATH || typeof EXTENSION_ASSETS_MAP === "undefined") {
_warn("No popup page available.");
return;
}
await openModal({
type: "popup",
pagePath: POPUP_PAGE_PATH,
defaultTitle: "Extension Popup",
closeFn: closePopupModal,
});
}
async function openOptionsPage() {
if (!OPTIONS_PAGE_PATH || typeof EXTENSION_ASSETS_MAP === "undefined") {
_warn("No options page available.");
return;
}
await openModal({
type: "options",
pagePath: OPTIONS_PAGE_PATH,
defaultTitle: "Extension Options",
closeFn: closeOptionsModal,
});
}
// #endregion
// #region Generic Modal Logic Style Injection ---
let stylesInjected = false;
function injectGlobalStyles() {
if (stylesInjected) return;
stylesInjected = true;
const styles = `
.extension-backdrop {
position: fixed;
top: 0; left: 0;
width: 100vw; height: 100vh;
background: rgba(0, 0, 0, 0.13);
backdrop-filter: blur(3px);
z-index: 2147483646;
display: flex;
align-items: center;
justify-content: center;
animation: backdropFadeIn 0.3s ease-out forwards;
}
.extension-modal {
z-index: 2147483647;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
--background: #ffffff;
--rad: 10px;
--border: #666;
--border-thickness: 2px;
display: flex;
flex-direction: column;
overflow: hidden;
animation: modalOpenAnimation 0.3s ease-out forwards;
}
/* Size specific styles */
.extension-modal.popup-size {
width: 400px; height: 600px;
max-width: calc(100vw - 40px);
max-height: calc(100vh - 40px);
}
.extension-modal.options-size {
width: calc(100vw - 80px); height: calc(100vh - 80px);
max-width: 1200px;
max-height: 800px;
}
/* Common modal components */
.extension-modal .modal-header {
display: flex; justify-content: space-between; align-items: flex-end;
padding: 0 16px; position: relative; flex-shrink: 0;
}
.extension-modal .tab {
padding: 12px 16px; color: #606266;
display: flex; align-items: center; gap: 8px;
font-size: 14px; cursor: pointer;
border-radius: var(--rad) var(--rad) 0 0;
transition: background-color 0.2s ease; user-select: none;
}
.extension-modal .tab.active, .extension-modal .tab.close-button {
background-color: var(--background);
border: var(--border-thickness) solid var(--border);
border-bottom-color: var(--background);
margin-bottom: -1px; z-index: 1;
color: #303133; font-weight: 500;
}
.extension-modal .tab.close-button { padding: 8px; }
.extension-modal .tab.close-button:hover { background-color: #f5f7fa; }
.extension-modal .tab svg { stroke: currentColor; }
.extension-modal .tab.active img { width: 16px; height: 16px; }
.extension-modal .tab.close-button svg { width: 20px; height: 20px; }
.extension-modal .modal-content {
flex-grow: 1; position: relative;
border-radius: var(--rad); overflow: hidden;
bottom: calc(var(--border-thickness) - 1px);
border: var(--border-thickness) solid var(--border);
}
.extension-modal .modal-content iframe {
width: 100%; height: 100%; border: 0; background: white;
}
/* Animations */
@keyframes backdropFadeIn { from { opacity: 0; backdrop-filter: blur(0px); } to { opacity: 1; backdrop-filter: blur(3px); } }
@keyframes backdropFadeOut { from { opacity: 1; backdrop-filter: blur(3px); } to { opacity: 0; backdrop-filter: blur(0px); } }
@keyframes modalOpenAnimation { from { transform: scaleY(0.8); opacity: 0; } to { transform: scaleY(1); opacity: 1; } }
@keyframes modalCloseAnimation { from { transform: scaleY(1); opacity: 1; } to { transform: scaleY(0.8); opacity: 0; } }
`;
const styleSheet = document.createElement("style");
styleSheet.id = "extension-global-styles";
styleSheet.innerText = styles;
document.head.appendChild(styleSheet);
}
async function openModal(config) {
injectGlobalStyles();
const { type, pagePath, defaultTitle, closeFn } = config;
const html = EXTENSION_ASSETS_MAP[pagePath];
if (!html) {
_warn(`${defaultTitle} HTML not found in asset map`);
return;
}
const backdropId = `extension-${type}-backdrop`;
const modalId = `extension-${type}-modal`;
const sizeClass = `${type}-size`;
// #endregion
// #region Smoothly close the other modal if it s open ---
const otherType = type === "popup" ? "options" : "popup";
const otherBackdrop = document.getElementById(
`extension-${otherType}-backdrop`
);
if (otherBackdrop) {
// Await the correct close function
await (otherType === "popup" ? closePopupModal() : closeOptionsModal());
}
let backdrop = document.getElementById(backdropId);
let modal, iframe;
if (!backdrop) {
backdrop = document.createElement("div");
backdrop.id = backdropId;
backdrop.className = "extension-backdrop";
modal = document.createElement("div");
modal.id = modalId;
modal.className = `extension-modal ${sizeClass}`;
const extensionName = INJECTED_MANIFEST.name || defaultTitle;
const iconSrc =
EXTENSION_ICON ||
"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIHN0cm9rZT0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik00IDdoM2ExIDEgMCAwIDAgMSAtMXYtMWEyIDIgMCAwIDEgNCAwdjFhMSAxIDAgMCAwIDEgMWgzYTEgMSAwIDAgMSAxIDF2M2ExIDEgMCAwIDAgMSAxaDFhMiAyIDAgMCAxIDAgNGgtMWExIDEgMCAwIDAgLTEgMXYzYTEgMSAwIDAgMSAtMSAxaC0zYTEgMSAwIDAgMSAtMSAtMXYtMWEyIDIgMCAwIDAgLTQgMHYxYTEgMSAwIDAgMSAtMSAxaC0zYTEgMSAwIDAgMSAtMSAtMXYtM2ExIDEgMCAwIDEgMSAtMWgxYTIgMiAwIDAgMCAwIC00aC0xYTEgMSAwIDAgMSAtMSAtMXYtM2ExIDEgMCAwIDEgMSAtMSIgLz48L3N2Zz4=";
modal.innerHTML = `
`;
backdrop.appendChild(modal);
backdrop.addEventListener("click", (e) => {
if (e.target === backdrop) closeFn();
});
modal.querySelector(".close-button").addEventListener("click", closeFn);
document.body.appendChild(backdrop);
iframe = modal.querySelector("iframe");
} else {
// If it already exists, just make sure it's visible
backdrop.style.display = "flex";
modal = backdrop.querySelector(".extension-modal");
iframe = modal.querySelector("iframe");
}
// Load content into iframe
try {
const polyfillString = generateCompletePolyfillForIframe();
const doc = new DOMParser().parseFromString(html, "text/html");
const script = doc.createElement("script");
script.textContent = polyfillString;
doc.head.insertAdjacentElement("afterbegin", script);
iframe.srcdoc = doc.documentElement.outerHTML;
} catch (e) {
_error("Error generating complete polyfill for iframe", e);
iframe.srcdoc = html;
}
}
function generateCompletePolyfillForIframe() {
const polyfillString = "\n// -- Messaging implementation\n\nfunction createEventBus(\n scopeId,\n type = \"page\", // \"page\" or \"iframe\"\n { allowedOrigin = \"*\", children = [], parentWindow = null } = {}\n) {\n if (!scopeId) throw new Error(\"createEventBus requires a scopeId\");\n\n const handlers = {};\n\n function handleIncoming(ev) {\n if (allowedOrigin !== \"*\" && ev.origin !== allowedOrigin) return;\n\n const msg = ev.data;\n if (!msg || msg.__eventBus !== true || msg.scopeId !== scopeId) return;\n\n const { event, payload } = msg;\n\n // PAGE: if it's an INIT from an iframe, adopt it\n if (type === \"page\" && event === \"__INIT__\") {\n const win = ev.source;\n if (win && !children.includes(win)) {\n children.push(win);\n }\n return;\n }\n\n (handlers[event] || []).forEach((fn) =>\n fn(payload, { origin: ev.origin, source: ev.source })\n );\n }\n\n window.addEventListener(\"message\", handleIncoming);\n\n function emitTo(win, event, payload) {\n const envelope = {\n __eventBus: true,\n scopeId,\n event,\n payload,\n };\n win.postMessage(envelope, allowedOrigin);\n }\n\n // IFRAME: announce to page on startup\n if (type === \"iframe\") {\n setTimeout(() => {\n const pw = parentWindow || window.parent;\n if (pw && pw.postMessage) {\n emitTo(pw, \"__INIT__\", null);\n }\n }, 0);\n }\n\n return {\n on(event, fn) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(fn);\n },\n off(event, fn) {\n if (!handlers[event]) return;\n handlers[event] = handlers[event].filter((h) => h !== fn);\n },\n /**\n * Emits an event.\n * @param {string} event - The event name.\n * @param {any} payload - The event payload.\n * @param {object} [options] - Emission options.\n * @param {Window} [options.to] - A specific window to target. If provided, message is ONLY sent to the target.\n */\n emit(event, payload, { to } = {}) {\n // If a specific target window is provided, send only to it and DO NOT dispatch locally.\n // This prevents a port from receiving its own messages.\n if (to) {\n if (to && typeof to.postMessage === \"function\") {\n emitTo(to, event, payload);\n }\n return; // Exit after targeted send.\n }\n\n // For broadcast messages (no 'to' target), dispatch locally first.\n (handlers[event] || []).forEach((fn) =>\n fn(payload, { origin: location.origin, source: window })\n );\n\n // Then propagate the broadcast to other windows.\n if (type === \"page\") {\n children.forEach((win) => emitTo(win, event, payload));\n } else {\n const pw = parentWindow || window.parent;\n if (pw && pw.postMessage) {\n emitTo(pw, event, payload);\n }\n }\n },\n };\n}\n\nfunction createRuntime(type = \"background\", bus) {\n let nextId = 1;\n const pending = {};\n const msgListeners = [];\n\n let nextPortId = 1;\n const ports = {};\n const onConnectListeners = [];\n\n function parseArgs(args) {\n let target, message, options, callback;\n const arr = [...args];\n if (arr.length === 0) {\n throw new Error(\"sendMessage requires at least one argument\");\n }\n if (arr.length === 1) {\n return { message: arr[0] };\n }\n // last object could be options\n if (\n arr.length &&\n typeof arr[arr.length - 1] === \"object\" &&\n !Array.isArray(arr[arr.length - 1])\n ) {\n options = arr.pop();\n }\n // last function is callback\n if (arr.length && typeof arr[arr.length - 1] === \"function\") {\n callback = arr.pop();\n }\n if (\n arr.length === 2 &&\n (typeof arr[0] === \"string\" || typeof arr[0] === \"number\")\n ) {\n [target, message] = arr;\n } else {\n [message] = arr;\n }\n return { target, message, options, callback };\n }\n\n if (type === \"background\") {\n bus.on(\"__REQUEST__\", ({ id, message }, { source }) => {\n let responded = false,\n isAsync = false;\n function sendResponse(resp) {\n if (responded) return;\n responded = true;\n // Target the response directly back to the window that sent the request.\n bus.emit(\"__RESPONSE__\", { id, response: resp }, { to: source });\n }\n const results = msgListeners\n .map((fn) => {\n try {\n // msg, sender, sendResponse\n const ret = fn(message, { id, tab: { id: source } }, sendResponse);\n if (ret === true || (ret && typeof ret.then === \"function\")) {\n isAsync = true;\n return ret;\n }\n return ret;\n } catch (e) {\n _error(e);\n }\n })\n .filter((r) => r !== undefined);\n\n const promises = results.filter((r) => r && typeof r.then === \"function\");\n if (!isAsync && promises.length === 0) {\n const out = results.length === 1 ? results[0] : results;\n sendResponse(out);\n } else if (promises.length) {\n Promise.all(promises).then((vals) => {\n if (!responded) {\n const out = vals.length === 1 ? vals[0] : vals;\n sendResponse(out);\n }\n });\n }\n });\n }\n\n if (type !== \"background\") {\n bus.on(\"__RESPONSE__\", ({ id, response }) => {\n const entry = pending[id];\n if (!entry) return;\n entry.resolve(response);\n if (entry.callback) entry.callback(response);\n delete pending[id];\n });\n }\n\n function sendMessage(...args) {\n // Background should be able to send message to itself\n // if (type === \"background\") {\n // throw new Error(\"Background cannot sendMessage to itself\");\n // }\n const { target, message, callback } = parseArgs(args);\n const id = nextId++;\n const promise = new Promise((resolve) => {\n pending[id] = { resolve, callback };\n bus.emit(\"__REQUEST__\", { id, message });\n });\n return promise;\n }\n\n bus.on(\"__PORT_CONNECT__\", ({ portId, name }, { source }) => {\n if (type !== \"background\") return;\n const backgroundPort = makePort(\"background\", portId, name, source);\n ports[portId] = backgroundPort;\n\n onConnectListeners.forEach((fn) => fn(backgroundPort));\n\n // send back a CONNECT_ACK so the client can\n // start listening on its end:\n bus.emit(\"__PORT_CONNECT_ACK__\", { portId, name }, { to: source });\n });\n\n // Clients handle the ACK and finalize their Port object by learning the remote window.\n bus.on(\"__PORT_CONNECT_ACK__\", ({ portId, name }, { source }) => {\n if (type === \"background\") return; // ignore\n const p = ports[portId];\n if (!p) return;\n // Call the port's internal finalize method to complete the handshake\n if (p._finalize) {\n p._finalize(source);\n }\n });\n\n // Any port message travels via \"__PORT_MESSAGE__\"\n bus.on(\"__PORT_MESSAGE__\", (envelope, { source }) => {\n const { portId } = envelope;\n const p = ports[portId];\n if (!p) return;\n p._receive(envelope, source);\n });\n\n // Any port disconnect:\n bus.on(\"__PORT_DISCONNECT__\", ({ portId }) => {\n const p = ports[portId];\n if (!p) return;\n p._disconnect();\n delete ports[portId];\n });\n\n // Refactored makePort to correctly manage internal state and the connection handshake.\n function makePort(side, portId, name, remoteWindow) {\n let onMessageHandlers = [];\n let onDisconnectHandlers = [];\n let buffer = [];\n // Unique instance ID for this port instance\n const instanceId = Math.random().toString(36).slice(2) + Date.now();\n // These state variables are part of the closure and are updated by _finalize\n let _ready = side === \"background\";\n\n function _drainBuffer() {\n buffer.forEach((m) => _post(m));\n buffer = [];\n }\n\n function _post(msg) {\n // Always use the 'to' parameter for port messages, making them directional.\n // Include senderInstanceId\n bus.emit(\n \"__PORT_MESSAGE__\",\n { portId, msg, senderInstanceId: instanceId },\n { to: remoteWindow }\n );\n }\n\n function postMessage(msg) {\n if (!_ready) {\n buffer.push(msg);\n } else {\n _post(msg);\n }\n }\n\n function _receive(envelope, source) {\n // envelope: { msg, senderInstanceId }\n if (envelope.senderInstanceId === instanceId) return; // Don't dispatch to self\n onMessageHandlers.forEach((fn) =>\n fn(envelope.msg, { id: portId, tab: { id: source } })\n );\n }\n\n function disconnect() {\n // Also use the 'to' parameter for disconnect messages\n bus.emit(\"__PORT_DISCONNECT__\", { portId }, { to: remoteWindow });\n _disconnect();\n delete ports[portId];\n }\n\n function _disconnect() {\n onDisconnectHandlers.forEach((fn) => fn());\n onMessageHandlers = [];\n onDisconnectHandlers = [];\n }\n\n // This function is called on the client port when the ACK is received from background.\n // It updates the port's state, completing the connection.\n function _finalize(win) {\n remoteWindow = win; // <-- This is the crucial part: learn the destination\n _ready = true;\n _drainBuffer();\n }\n\n return {\n name,\n sender: {\n id: portId,\n },\n onMessage: {\n addListener(fn) {\n onMessageHandlers.push(fn);\n },\n removeListener(fn) {\n onMessageHandlers = onMessageHandlers.filter((x) => x !== fn);\n },\n },\n onDisconnect: {\n addListener(fn) {\n onDisconnectHandlers.push(fn);\n },\n removeListener(fn) {\n onDisconnectHandlers = onDisconnectHandlers.filter((x) => x !== fn);\n },\n },\n postMessage,\n disconnect,\n // Internal methods used by the runtime\n _receive,\n _disconnect,\n _finalize, // Expose the finalizer for the ACK handler\n };\n }\n\n function connect(connectInfo = {}) {\n if (type === \"background\") {\n throw new Error(\"Background must use onConnect, not connect()\");\n }\n const name = connectInfo.name || \"\";\n const portId = nextPortId++;\n // create the client side port\n // remoteWindow is initially null; it will be set by _finalize upon ACK.\n const clientPort = makePort(\"client\", portId, name, null);\n ports[portId] = clientPort;\n\n // fire the connect event across the bus\n bus.emit(\"__PORT_CONNECT__\", { portId, name });\n return clientPort;\n }\n\n function onConnect(fn) {\n if (type !== \"background\") {\n throw new Error(\"connect event only fires in background\");\n }\n onConnectListeners.push(fn);\n }\n\n return {\n // rpc:\n sendMessage,\n onMessage: {\n addListener(fn) {\n msgListeners.push(fn);\n },\n removeListener(fn) {\n const i = msgListeners.indexOf(fn);\n if (i >= 0) msgListeners.splice(i, 1);\n },\n },\n\n // port API:\n connect,\n onConnect: {\n addListener(fn) {\n onConnect(fn);\n },\n removeListener(fn) {\n const i = onConnectListeners.indexOf(fn);\n if (i >= 0) onConnectListeners.splice(i, 1);\n },\n },\n };\n}\n\n\n// --- Abstraction Layer: PostMessage Target\n\nlet nextRequestId = 1;\nconst pendingRequests = new Map(); // requestId -> { resolve, reject, timeout }\n\nfunction sendAbstractionRequest(method, args = []) {\n return new Promise((resolve, reject) => {\n const requestId = nextRequestId++;\n\n const timeout = setTimeout(() => {\n pendingRequests.delete(requestId);\n reject(new Error(`PostMessage request timeout for method: ${method}`));\n }, 10000);\n\n pendingRequests.set(requestId, { resolve, reject, timeout });\n\n window.parent.postMessage({\n type: \"abstraction-request\",\n requestId,\n method,\n args,\n });\n });\n}\n\nwindow.addEventListener(\"message\", (event) => {\n const { type, requestId, success, result, error } = event.data;\n\n if (type === \"abstraction-response\") {\n const pending = pendingRequests.get(requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n pendingRequests.delete(requestId);\n\n if (success) {\n pending.resolve(result);\n } else {\n const err = new Error(error.message);\n err.stack = error.stack;\n pending.reject(err);\n }\n }\n }\n});\n\nasync function _storageSet(items) {\n return sendAbstractionRequest(\"_storageSet\", [items]);\n}\n\nasync function _storageGet(keys) {\n return sendAbstractionRequest(\"_storageGet\", [keys]);\n}\n\nasync function _storageRemove(keysToRemove) {\n return sendAbstractionRequest(\"_storageRemove\", [keysToRemove]);\n}\n\nasync function _storageClear() {\n return sendAbstractionRequest(\"_storageClear\");\n}\n\nasync function _cookieList(details) {\n return sendAbstractionRequest(\"_cookieList\", [details]);\n}\n\nasync function _cookieSet(details) {\n return sendAbstractionRequest(\"_cookieSet\", [details]);\n}\n\nasync function _cookieDelete(details) {\n return sendAbstractionRequest(\"_cookieDelete\", [details]);\n}\n\nasync function _fetch(url, options) {\n return sendAbstractionRequest(\"_fetch\", [url, options]);\n}\n\nfunction _registerMenuCommand(name, func) {\n _warn(\"_registerMenuCommand called from iframe context:\", name);\n return sendAbstractionRequest(\"_registerMenuCommand\", [\n name,\n func.toString(),\n ]);\n}\n\nfunction _openTab(url, active) {\n return sendAbstractionRequest(\"_openTab\", [url, active]);\n}\n\nasync function _initStorage() {\n return sendAbstractionRequest(\"_initStorage\");\n}\n\n\nconst EXTENSION_ASSETS_MAP = {{EXTENSION_ASSETS_MAP}};\n\n// -- Polyfill Implementation\nfunction buildPolyfill({ isBackground = false, isOtherPage = false } = {}) {\n // Generate a unique context ID for this polyfill instance\n const contextType = isBackground\n ? \"background\"\n : isOtherPage\n ? \"options\"\n : \"content\";\n const contextId = `${contextType}_${Math.random()\n .toString(36)\n .substring(2, 15)}`;\n\n const IS_IFRAME = \"true\" === \"true\";\n const BUS = (function () {\n if (globalThis.__BUS) {\n return globalThis.__BUS;\n }\n globalThis.__BUS = createEventBus(\n \"material-icons-for-github\",\n IS_IFRAME ? \"iframe\" : \"page\",\n );\n return globalThis.__BUS;\n })();\n const RUNTIME = createRuntime(isBackground ? \"background\" : \"tab\", BUS);\n const createNoopListeners = () => ({\n addListener: (callback) => {\n _log(\"addListener\", callback);\n },\n removeListener: (callback) => {\n _log(\"removeListener\", callback);\n },\n });\n // TODO: Stub\n const storageChangeListeners = new Set();\n function broadcastStorageChange(changes, areaName) {\n storageChangeListeners.forEach((listener) => {\n listener(changes, areaName);\n });\n }\n\n let REQ_PERMS = [];\n\n // --- Chrome polyfill\n let chrome = {\n extension: {\n isAllowedIncognitoAccess: () => Promise.resolve(true),\n sendMessage: (...args) => _messagingHandler.sendMessage(...args),\n },\n permissions: {\n // TODO: Remove origin permission means exclude from origin in startup (when checking for content scripts)\n request: (permissions, callback) => {\n _log(\"permissions.request\", permissions, callback);\n if (Array.isArray(permissions)) {\n REQ_PERMS = [...REQ_PERMS, ...permissions];\n }\n if (typeof callback === \"function\") {\n callback(permissions);\n }\n return Promise.resolve(permissions);\n },\n contains: (permissions, callback) => {\n if (typeof callback === \"function\") {\n callback(true);\n }\n return Promise.resolve(true);\n },\n getAll: () => {\n return Promise.resolve({\n permissions: EXTENSION_PERMISSIONS,\n origins: ORIGIN_PERMISSIONS,\n });\n },\n onAdded: createNoopListeners(),\n onRemoved: createNoopListeners(),\n },\n i18n: {\n getUILanguage: () => {\n return USED_LOCALE || \"en\";\n },\n getMessage: (key, substitutions = []) => {\n if (typeof substitutions === \"string\") {\n substitutions = [substitutions];\n }\n if (typeof LOCALE_KEYS !== \"undefined\" && LOCALE_KEYS[key]) {\n return LOCALE_KEYS[key].message?.replace(\n /\\$(\\d+)/g,\n (match, p1) => substitutions[p1 - 1] || match,\n );\n }\n return key;\n },\n },\n alarms: {\n onAlarm: createNoopListeners(),\n create: () => {\n _log(\"alarms.create\", arguments);\n },\n get: () => {\n _log(\"alarms.get\", arguments);\n },\n },\n runtime: {\n ...RUNTIME,\n onInstalled: createNoopListeners(),\n onStartup: createNoopListeners(),\n // TODO: Postmessage to parent to open options page or call openOptionsPage\n openOptionsPage: () => {\n // const url = chrome.runtime.getURL(OPTIONS_PAGE_PATH);\n // console.log(\"openOptionsPage\", _openTab, url, EXTENSION_ASSETS_MAP);\n // _openTab(url);\n if (typeof openOptionsPage === \"function\") {\n openOptionsPage();\n } else if (window.parent) {\n window.parent.postMessage({ type: \"openOptionsPage\" }, \"*\");\n } else {\n _warn(\"openOptionsPage not available.\");\n }\n },\n getManifest: () => {\n // The manifest object will be injected into the scope where buildPolyfill is called\n if (typeof INJECTED_MANIFEST !== \"undefined\") {\n return JSON.parse(JSON.stringify(INJECTED_MANIFEST)); // Return deep copy\n }\n _warn(\"INJECTED_MANIFEST not found for chrome.runtime.getManifest\");\n return { name: \"Unknown\", version: \"0.0\", manifest_version: 2 };\n },\n getURL: (path) => {\n if (!path) return \"\";\n if (path.startsWith(\"/\")) {\n path = path.substring(1);\n }\n\n if (typeof _createAssetUrl === \"function\") {\n return _createAssetUrl(path);\n }\n\n _warn(\n `chrome.runtime.getURL fallback for '${path}'. Assets may not be available.`,\n );\n // Attempt a relative path resolution (highly context-dependent and likely wrong)\n try {\n if (window.location.protocol.startsWith(\"http\")) {\n return new URL(path, window.location.href).toString();\n }\n } catch (e) {\n /* ignore error, fallback */\n }\n return path;\n },\n id: \"polyfilled-extension-\" + Math.random().toString(36).substring(2, 15),\n lastError: null,\n setUninstallURL: () => {},\n setUpdateURL: () => {},\n getPlatformInfo: async () => {\n const platform = {\n os: \"unknown\",\n arch: \"unknown\",\n nacl_arch: \"unknown\",\n };\n\n if (typeof navigator !== \"undefined\") {\n const userAgent = navigator.userAgent.toLowerCase();\n if (userAgent.includes(\"mac\")) platform.os = \"mac\";\n else if (userAgent.includes(\"win\")) platform.os = \"win\";\n else if (userAgent.includes(\"linux\")) platform.os = \"linux\";\n else if (userAgent.includes(\"android\")) platform.os = \"android\";\n else if (userAgent.includes(\"ios\")) platform.os = \"ios\";\n\n if (userAgent.includes(\"x86_64\") || userAgent.includes(\"amd64\")) {\n platform.arch = \"x86-64\";\n } else if (userAgent.includes(\"i386\") || userAgent.includes(\"i686\")) {\n platform.arch = \"x86-32\";\n } else if (userAgent.includes(\"arm\")) {\n platform.arch = \"arm\";\n }\n }\n\n return platform;\n },\n getBrowserInfo: async () => {\n const info = {\n name: \"unknown\",\n version: \"unknown\",\n buildID: \"unknown\",\n };\n\n if (typeof navigator !== \"undefined\") {\n const userAgent = navigator.userAgent;\n if (userAgent.includes(\"Chrome\")) {\n info.name = \"Chrome\";\n const match = userAgent.match(/Chrome\\/([0-9.]+)/);\n if (match) info.version = match[1];\n } else if (userAgent.includes(\"Firefox\")) {\n info.name = \"Firefox\";\n const match = userAgent.match(/Firefox\\/([0-9.]+)/);\n if (match) info.version = match[1];\n } else if (userAgent.includes(\"Safari\")) {\n info.name = \"Safari\";\n const match = userAgent.match(/Version\\/([0-9.]+)/);\n if (match) info.version = match[1];\n }\n }\n\n return info;\n },\n },\n storage: {\n local: {\n get: function (keys, callback) {\n if (typeof _storageGet !== \"function\")\n throw new Error(\"_storageGet not defined\");\n\n const promise = _storageGet(keys);\n\n if (typeof callback === \"function\") {\n promise\n .then((result) => {\n try {\n callback(result);\n } catch (e) {\n _error(\"Error in storage.get callback:\", e);\n }\n })\n .catch((error) => {\n _error(\"Storage.get error:\", error);\n callback({});\n });\n return;\n }\n\n return promise;\n },\n set: function (items, callback) {\n if (typeof _storageSet !== \"function\")\n throw new Error(\"_storageSet not defined\");\n\n const promise = _storageSet(items).then((result) => {\n broadcastStorageChange(items, \"local\");\n return result;\n });\n\n if (typeof callback === \"function\") {\n promise\n .then((result) => {\n try {\n callback(result);\n } catch (e) {\n _error(\"Error in storage.set callback:\", e);\n }\n })\n .catch((error) => {\n _error(\"Storage.set error:\", error);\n callback();\n });\n return;\n }\n\n return promise;\n },\n remove: function (keys, callback) {\n if (typeof _storageRemove !== \"function\")\n throw new Error(\"_storageRemove not defined\");\n\n const promise = _storageRemove(keys).then((result) => {\n const changes = {};\n const keyList = Array.isArray(keys) ? keys : [keys];\n keyList.forEach((key) => {\n changes[key] = { oldValue: undefined, newValue: undefined };\n });\n broadcastStorageChange(changes, \"local\");\n return result;\n });\n\n if (typeof callback === \"function\") {\n promise\n .then((result) => {\n try {\n callback(result);\n } catch (e) {\n _error(\"Error in storage.remove callback:\", e);\n }\n })\n .catch((error) => {\n _error(\"Storage.remove error:\", error);\n callback();\n });\n return;\n }\n\n return promise;\n },\n clear: function (callback) {\n if (typeof _storageClear !== \"function\")\n throw new Error(\"_storageClear not defined\");\n\n const promise = _storageClear().then((result) => {\n broadcastStorageChange({}, \"local\");\n return result;\n });\n\n if (typeof callback === \"function\") {\n promise\n .then((result) => {\n try {\n callback(result);\n } catch (e) {\n _error(\"Error in storage.clear callback:\", e);\n }\n })\n .catch((error) => {\n _error(\"Storage.clear error:\", error);\n callback();\n });\n return;\n }\n\n return promise;\n },\n onChanged: {\n addListener: (callback) => {\n storageChangeListeners.add(callback);\n },\n removeListener: (callback) => {\n storageChangeListeners.delete(callback);\n },\n },\n },\n sync: {\n get: function (keys, callback) {\n _warn(\"chrome.storage.sync polyfill maps to local\");\n return chrome.storage.local.get(keys, callback);\n },\n set: function (items, callback) {\n _warn(\"chrome.storage.sync polyfill maps to local\");\n\n const promise = chrome.storage.local.set(items).then((result) => {\n broadcastStorageChange(items, \"sync\");\n return result;\n });\n\n if (typeof callback === \"function\") {\n promise\n .then((result) => {\n try {\n callback(result);\n } catch (e) {\n _error(\"Error in storage.sync.set callback:\", e);\n }\n })\n .catch((error) => {\n _error(\"Storage.sync.set error:\", error);\n callback();\n });\n return;\n }\n\n return promise;\n },\n remove: function (keys, callback) {\n _warn(\"chrome.storage.sync polyfill maps to local\");\n\n const promise = chrome.storage.local.remove(keys).then((result) => {\n const changes = {};\n const keyList = Array.isArray(keys) ? keys : [keys];\n keyList.forEach((key) => {\n changes[key] = { oldValue: undefined, newValue: undefined };\n });\n broadcastStorageChange(changes, \"sync\");\n return result;\n });\n\n if (typeof callback === \"function\") {\n promise\n .then((result) => {\n try {\n callback(result);\n } catch (e) {\n _error(\"Error in storage.sync.remove callback:\", e);\n }\n })\n .catch((error) => {\n _error(\"Storage.sync.remove error:\", error);\n callback();\n });\n return;\n }\n\n return promise;\n },\n clear: function (callback) {\n _warn(\"chrome.storage.sync polyfill maps to local\");\n\n const promise = chrome.storage.local.clear().then((result) => {\n broadcastStorageChange({}, \"sync\");\n return result;\n });\n\n if (typeof callback === \"function\") {\n promise\n .then((result) => {\n try {\n callback(result);\n } catch (e) {\n _error(\"Error in storage.sync.clear callback:\", e);\n }\n })\n .catch((error) => {\n _error(\"Storage.sync.clear error:\", error);\n callback();\n });\n return;\n }\n\n return promise;\n },\n onChanged: {\n addListener: (callback) => {\n storageChangeListeners.add(callback);\n },\n removeListener: (callback) => {\n storageChangeListeners.delete(callback);\n },\n },\n },\n onChanged: {\n addListener: (callback) => {\n storageChangeListeners.add(callback);\n },\n removeListener: (callback) => {\n storageChangeListeners.delete(callback);\n },\n },\n managed: {\n get: function (keys, callback) {\n _warn(\"chrome.storage.managed polyfill is read-only empty.\");\n\n const promise = Promise.resolve({});\n\n if (typeof callback === \"function\") {\n promise.then((result) => {\n try {\n callback(result);\n } catch (e) {\n _error(\"Error in storage.managed.get callback:\", e);\n }\n });\n return;\n }\n\n return promise;\n },\n },\n },\n cookies: (function () {\n const cookieChangeListeners = new Set();\n function broadcastCookieChange(changeInfo) {\n cookieChangeListeners.forEach((listener) => {\n try {\n listener(changeInfo);\n } catch (e) {\n _error(\"Error in cookies.onChanged listener:\", e);\n }\n });\n }\n\n function handlePromiseCallback(promise, callback) {\n if (typeof callback === \"function\") {\n promise\n .then((result) => callback(result))\n .catch((error) => {\n // chrome.runtime.lastError = { message: error.message }; // TODO: Implement lastError\n _error(error);\n callback(); // Call with undefined on error\n });\n return;\n }\n return promise;\n }\n\n return {\n get: function (details, callback) {\n if (typeof _cookieList !== \"function\") {\n return handlePromiseCallback(\n Promise.reject(new Error(\"_cookieList not defined\")),\n callback,\n );\n }\n const promise = _cookieList({\n url: details.url,\n name: details.name,\n storeId: details.storeId,\n partitionKey: details.partitionKey,\n }).then((cookies) => {\n if (!cookies || cookies.length === 0) {\n return null;\n }\n // Sort by path length (longest first), then creation time (earliest first, if available)\n cookies.sort((a, b) => {\n const pathLenDiff = (b.path || \"\").length - (a.path || \"\").length;\n if (pathLenDiff !== 0) return pathLenDiff;\n return (a.creationTime || 0) - (b.creationTime || 0);\n });\n return cookies[0];\n });\n return handlePromiseCallback(promise, callback);\n },\n\n getAll: function (details, callback) {\n if (typeof _cookieList !== \"function\") {\n return handlePromiseCallback(\n Promise.reject(new Error(\"_cookieList not defined\")),\n callback,\n );\n }\n if (details.partitionKey) {\n _warn(\n \"cookies.getAll: partitionKey is not fully supported in this environment.\",\n );\n }\n const promise = _cookieList(details);\n return handlePromiseCallback(promise, callback);\n },\n\n set: function (details, callback) {\n const promise = (async () => {\n if (\n typeof _cookieSet !== \"function\" ||\n typeof _cookieList !== \"function\"\n ) {\n throw new Error(\"_cookieSet or _cookieList not defined\");\n }\n if (details.partitionKey) {\n _warn(\n \"cookies.set: partitionKey is not fully supported in this environment.\",\n );\n }\n\n const getDetails = {\n url: details.url,\n name: details.name,\n storeId: details.storeId,\n };\n const oldCookies = await _cookieList(getDetails);\n const oldCookie = oldCookies && oldCookies[0];\n\n if (oldCookie) {\n broadcastCookieChange({\n cause: \"overwrite\",\n cookie: oldCookie,\n removed: true,\n });\n }\n\n await _cookieSet(details);\n const newCookies = await _cookieList(getDetails);\n const newCookie = newCookies && newCookies[0];\n\n if (newCookie) {\n broadcastCookieChange({\n cause: \"explicit\",\n cookie: newCookie,\n removed: false,\n });\n }\n return newCookie || null;\n })();\n return handlePromiseCallback(promise, callback);\n },\n\n remove: function (details, callback) {\n const promise = (async () => {\n if (\n typeof _cookieDelete !== \"function\" ||\n typeof _cookieList !== \"function\"\n ) {\n throw new Error(\"_cookieDelete or _cookieList not defined\");\n }\n const oldCookies = await _cookieList(details);\n const oldCookie = oldCookies && oldCookies[0];\n\n if (!oldCookie) return null; // Nothing to remove\n\n await _cookieDelete(details);\n\n broadcastCookieChange({\n cause: \"explicit\",\n cookie: oldCookie,\n removed: true,\n });\n\n return {\n url: details.url,\n name: details.name,\n storeId: details.storeId || \"0\",\n partitionKey: details.partitionKey,\n };\n })();\n return handlePromiseCallback(promise, callback);\n },\n\n getAllCookieStores: function (callback) {\n const promise = Promise.resolve([\n { id: \"0\", tabIds: [1] }, // Mock store for the current context\n ]);\n return handlePromiseCallback(promise, callback);\n },\n\n getPartitionKey: function (details, callback) {\n _warn(\n \"chrome.cookies.getPartitionKey is not supported in this environment.\",\n );\n const promise = Promise.resolve({ partitionKey: {} }); // Return empty partition key\n return handlePromiseCallback(promise, callback);\n },\n\n onChanged: {\n addListener: (callback) => {\n if (typeof callback === \"function\") {\n cookieChangeListeners.add(callback);\n }\n },\n removeListener: (callback) => {\n cookieChangeListeners.delete(callback);\n },\n },\n };\n })(),\n tabs: {\n query: async (queryInfo) => {\n _warn(\"chrome.tabs.query polyfill only returns current tab info.\");\n const dummyId = Math.floor(Math.random() * 1000) + 1;\n return [\n {\n id: dummyId,\n url: CURRENT_LOCATION,\n active: true,\n windowId: 1,\n status: \"complete\",\n },\n ];\n },\n create: async ({ url, active = true }) => {\n _log(`[Polyfill tabs.create] URL: ${url}`);\n if (typeof _openTab !== \"function\")\n throw new Error(\"_openTab not defined\");\n _openTab(url, active);\n const dummyId = Math.floor(Math.random() * 1000) + 1001;\n return Promise.resolve({\n id: dummyId,\n url: url,\n active,\n windowId: 1,\n });\n },\n sendMessage: async (tabId, message) => {\n _warn(\n `chrome.tabs.sendMessage polyfill (to tab ${tabId}) redirects to runtime.sendMessage (current context).`,\n );\n return chrome.runtime.sendMessage(message);\n },\n onActivated: createNoopListeners(),\n onUpdated: createNoopListeners(),\n onRemoved: createNoopListeners(),\n onReplaced: createNoopListeners(),\n onCreated: createNoopListeners(),\n onMoved: createNoopListeners(),\n onDetached: createNoopListeners(),\n onAttached: createNoopListeners(),\n },\n windows: {\n onFocusChanged: createNoopListeners(),\n onCreated: createNoopListeners(),\n onRemoved: createNoopListeners(),\n onFocused: createNoopListeners(),\n onFocus: createNoopListeners(),\n onBlur: createNoopListeners(),\n onFocused: createNoopListeners(),\n },\n notifications: {\n create: async (notificationId, options) => {\n try {\n let id = notificationId;\n let notificationOptions = options;\n\n if (typeof notificationId === \"object\" && notificationId !== null) {\n notificationOptions = notificationId;\n id = \"notification_\" + Math.random().toString(36).substring(2, 15);\n } else if (typeof notificationId === \"string\" && options) {\n id = notificationId;\n notificationOptions = options;\n } else {\n throw new Error(\"Invalid parameters for notifications.create\");\n }\n\n if (!notificationOptions || typeof notificationOptions !== \"object\") {\n throw new Error(\"Notification options must be an object\");\n }\n\n const {\n title,\n message,\n iconUrl,\n type = \"basic\",\n } = notificationOptions;\n\n if (!title || !message) {\n throw new Error(\"Notification must have title and message\");\n }\n\n if (\"Notification\" in window) {\n if (Notification.permission === \"granted\") {\n const notification = new Notification(title, {\n body: message,\n icon: iconUrl,\n tag: id,\n });\n\n _log(`[Notifications] Created notification: ${id}`);\n return id;\n } else if (Notification.permission === \"default\") {\n const permission = await Notification.requestPermission();\n if (permission === \"granted\") {\n const notification = new Notification(title, {\n body: message,\n icon: iconUrl,\n tag: id,\n });\n _log(\n `[Notifications] Created notification after permission: ${id}`,\n );\n return id;\n } else {\n _warn(\"[Notifications] Permission denied for notifications\");\n return id;\n }\n } else {\n _warn(\"[Notifications] Notifications are blocked\");\n return id;\n }\n } else {\n _warn(\n \"[Notifications] Native notifications not supported, using console fallback\",\n );\n _log(`[Notification] ${title}: ${message}`);\n return id;\n }\n } catch (error) {\n _error(\"[Notifications] Error creating notification:\", error.message);\n throw error;\n }\n },\n clear: async (notificationId) => {\n _log(`[Notifications] Clear notification: ${notificationId}`);\n // For native notifications, there's no direct way to clear by ID\n // This is a limitation of the Web Notifications API\n return true;\n },\n getAll: async () => {\n _warn(\"[Notifications] getAll not fully supported in polyfill\");\n return {};\n },\n getPermissionLevel: async () => {\n if (\"Notification\" in window) {\n const permission = Notification.permission;\n return { level: permission === \"granted\" ? \"granted\" : \"denied\" };\n }\n return { level: \"denied\" };\n },\n },\n contextMenus: {\n create: (createProperties, callback) => {\n try {\n if (!createProperties || typeof createProperties !== \"object\") {\n throw new Error(\"Context menu create properties must be an object\");\n }\n\n const { id, title, contexts = [\"page\"], onclick } = createProperties;\n const menuId =\n id || `menu_${Math.random().toString(36).substring(2, 15)}`;\n\n if (!title || typeof title !== \"string\") {\n throw new Error(\"Context menu must have a title\");\n }\n\n // Store menu items for potential use\n if (!window._polyfillContextMenus) {\n window._polyfillContextMenus = new Map();\n }\n\n window._polyfillContextMenus.set(menuId, {\n id: menuId,\n title,\n contexts,\n onclick,\n enabled: createProperties.enabled !== false,\n });\n\n _log(\n `[ContextMenus] Created context menu item: ${title} (${menuId})`,\n );\n\n // Try to register a menu command as fallback\n if (typeof _registerMenuCommand === \"function\") {\n try {\n _registerMenuCommand(\n title,\n onclick ||\n (() => {\n _log(`Context menu clicked: ${title}`);\n }),\n );\n } catch (e) {\n _warn(\n \"[ContextMenus] Failed to register as menu command:\",\n e.message,\n );\n }\n }\n\n if (callback && typeof callback === \"function\") {\n setTimeout(() => callback(), 0);\n }\n\n return menuId;\n } catch (error) {\n _error(\"[ContextMenus] Error creating context menu:\", error.message);\n if (callback && typeof callback === \"function\") {\n setTimeout(() => callback(), 0);\n }\n throw error;\n }\n },\n update: (id, updateProperties, callback) => {\n try {\n if (\n !window._polyfillContextMenus ||\n !window._polyfillContextMenus.has(id)\n ) {\n throw new Error(`Context menu item not found: ${id}`);\n }\n\n const menuItem = window._polyfillContextMenus.get(id);\n Object.assign(menuItem, updateProperties);\n\n _log(`[ContextMenus] Updated context menu item: ${id}`);\n\n if (callback && typeof callback === \"function\") {\n setTimeout(() => callback(), 0);\n }\n } catch (error) {\n _error(\"[ContextMenus] Error updating context menu:\", error.message);\n if (callback && typeof callback === \"function\") {\n setTimeout(() => callback(), 0);\n }\n }\n },\n remove: (menuItemId, callback) => {\n try {\n if (\n window._polyfillContextMenus &&\n window._polyfillContextMenus.has(menuItemId)\n ) {\n window._polyfillContextMenus.delete(menuItemId);\n _log(`[ContextMenus] Removed context menu item: ${menuItemId}`);\n } else {\n _warn(\n `[ContextMenus] Context menu item not found for removal: ${menuItemId}`,\n );\n }\n\n if (callback && typeof callback === \"function\") {\n setTimeout(() => callback(), 0);\n }\n } catch (error) {\n _error(\"[ContextMenus] Error removing context menu:\", error.message);\n if (callback && typeof callback === \"function\") {\n setTimeout(() => callback(), 0);\n }\n }\n },\n removeAll: (callback) => {\n try {\n if (window._polyfillContextMenus) {\n const count = window._polyfillContextMenus.size;\n window._polyfillContextMenus.clear();\n _log(`[ContextMenus] Removed all ${count} context menu items`);\n }\n\n if (callback && typeof callback === \"function\") {\n setTimeout(() => callback(), 0);\n }\n } catch (error) {\n _error(\n \"[ContextMenus] Error removing all context menus:\",\n error.message,\n );\n if (callback && typeof callback === \"function\") {\n setTimeout(() => callback(), 0);\n }\n }\n },\n onClicked: {\n addListener: (callback) => {\n if (!window._polyfillContextMenuListeners) {\n window._polyfillContextMenuListeners = new Set();\n }\n window._polyfillContextMenuListeners.add(callback);\n _log(\"[ContextMenus] Added click listener\");\n },\n removeListener: (callback) => {\n if (window._polyfillContextMenuListeners) {\n window._polyfillContextMenuListeners.delete(callback);\n _log(\"[ContextMenus] Removed click listener\");\n }\n },\n },\n },\n };\n\n const tc = (fn) => {\n try {\n fn();\n } catch (e) {}\n };\n const loggingProxyHandler = (_key) => ({\n get(target, key, receiver) {\n tc(() => _log(`[${contextType}] [CHROME - ${_key}] Getting ${key}`));\n return Reflect.get(target, key, receiver);\n },\n set(target, key, value, receiver) {\n tc(() =>\n _log(`[${contextType}] [CHROME - ${_key}] Setting ${key} to ${value}`),\n );\n return Reflect.set(target, key, value, receiver);\n },\n has(target, key) {\n tc(() =>\n _log(`[${contextType}] [CHROME - ${_key}] Checking if ${key} exists`),\n );\n return Reflect.has(target, key);\n },\n });\n chrome = Object.fromEntries(\n Object.entries(chrome).map(([key, value]) => [\n key,\n new Proxy(value, loggingProxyHandler(key)),\n ]),\n );\n\n // Alias browser to chrome for common Firefox pattern\n const browser = new Proxy(chrome, loggingProxyHandler);\n\n const oldGlobalThis = globalThis;\n const oldWindow = window;\n const oldSelf = self;\n const oldGlobal = globalThis;\n const __globalsStorage = {};\n\n const TO_MODIFY = [oldGlobalThis, oldWindow, oldSelf, oldGlobal];\n const set = (k, v) => {\n __globalsStorage[k] = v;\n TO_MODIFY.forEach((target) => {\n target[k] = v;\n });\n };\n const proxyHandler = {\n get(target, key, receiver) {\n const fns = [\n () => __globalsStorage[key],\n () => Reflect.get(target, key, target),\n () => target[key],\n ];\n const out = fns\n .map((f) => {\n try {\n let out = f();\n return out;\n } catch (e) {\n return undefined;\n }\n })\n .find((f) => f !== undefined);\n if (typeof out === \"function\") {\n return out.bind(target);\n }\n return out;\n },\n set(target, key, value, receiver) {\n try {\n tc(() => _log(`[${contextType}] Setting ${key} to ${value}`));\n set(key, value);\n return Reflect.set(target, key, value, receiver);\n } catch (e) {\n _error(\"Error setting\", key, value, e);\n try {\n target[key] = value;\n return true;\n } catch (e) {\n _error(\"Error setting\", key, value, e);\n }\n return false;\n }\n },\n has(target, key) {\n try {\n return key in __globalsStorage || key in target;\n } catch (e) {\n _error(\"Error has\", key, e);\n try {\n return key in __globalsStorage || key in target;\n } catch (e) {\n _error(\"Error has\", key, e);\n }\n return false;\n }\n },\n getOwnPropertyDescriptor(target, key) {\n try {\n if (key in __globalsStorage) {\n return {\n configurable: true,\n enumerable: true,\n writable: true,\n value: __globalsStorage[key],\n };\n }\n // fall back to the real globalThis\n const desc = Reflect.getOwnPropertyDescriptor(target, key);\n // ensure it's configurable so the with‑scope binding logic can override it\n if (desc && !desc.configurable) {\n desc.configurable = true;\n }\n return desc;\n } catch (e) {\n _error(\"Error getOwnPropertyDescriptor\", key, e);\n return {\n configurable: true,\n enumerable: true,\n writable: true,\n value: undefined,\n };\n }\n },\n\n defineProperty(target, key, descriptor) {\n try {\n // Normalize descriptor to avoid mixed accessor & data attributes\n const hasAccessor = \"get\" in descriptor || \"set\" in descriptor;\n\n if (hasAccessor) {\n // Build a clean descriptor without value/writable when accessors present\n const normalized = {\n configurable:\n \"configurable\" in descriptor ? descriptor.configurable : true,\n enumerable:\n \"enumerable\" in descriptor ? descriptor.enumerable : false,\n };\n if (\"get\" in descriptor) normalized.get = descriptor.get;\n if (\"set\" in descriptor) normalized.set = descriptor.set;\n\n // Store accessor references for inspection but avoid breaking invariants\n set(key, {\n get: descriptor.get,\n set: descriptor.set,\n });\n\n return Reflect.defineProperty(target, key, normalized);\n }\n\n // Data descriptor path\n set(key, descriptor.value);\n return Reflect.defineProperty(target, key, descriptor);\n } catch (e) {\n _error(\"Error defineProperty\", key, descriptor, e);\n return false;\n }\n },\n };\n\n // Create proxies once proxyHandler is defined\n const proxyWindow = new Proxy(oldWindow, proxyHandler);\n const proxyGlobalThis = new Proxy(oldGlobalThis, proxyHandler);\n const proxyGlobal = new Proxy(oldGlobal, proxyHandler);\n const proxySelf = new Proxy(oldSelf, proxyHandler);\n\n // Seed storage with core globals so lookups succeed inside `with` blocks\n Object.assign(__globalsStorage, {\n chrome,\n browser,\n window: proxyWindow,\n globalThis: proxyGlobalThis,\n global: proxyGlobal,\n self: proxySelf,\n document: oldWindow.document,\n });\n\n const __globals = {\n chrome,\n browser,\n window: proxyWindow,\n globalThis: proxyGlobalThis,\n global: proxyGlobal,\n self: proxySelf,\n __globals: __globalsStorage,\n };\n\n __globals.contextId = contextId;\n __globals.contextType = contextType;\n __globals.module = undefined;\n __globals.amd = undefined;\n __globals.define = undefined;\n __globals.importScripts = (...args) => {\n _log(\"importScripts\", args);\n };\n\n return __globals;\n}\n\n\nif (typeof window !== 'undefined') {\n window.buildPolyfill = buildPolyfill;\n}\n"
let newMap = JSON.parse(JSON.stringify(EXTENSION_ASSETS_MAP));
delete newMap[OPTIONS_PAGE_PATH];
const PASS_ON = Object.fromEntries(
Object.entries({
LOCALE_KEYS,
INJECTED_MANIFEST,
USED_LOCALE,
EXTENSION_ICON,
CURRENT_LOCATION,
OPTIONS_PAGE_PATH,
CAN_USE_BLOB_CSP,
ALL_PERMISSIONS,
ORIGIN_PERMISSIONS,
EXTENSION_PERMISSIONS,
SCRIPT_NAME,
_base64ToBlob,
_getMimeTypeFromPath,
_isTextAsset,
_createAssetUrl,
_matchGlobPattern,
_isWebAccessibleResource,
_log,
_warn,
_error,
}).map((i) => {
let out = [...i];
if (typeof i[1] === "function") {
out[1] = i[1].toString();
} else {
out[1] = JSON.stringify(i[1]);
}
return out;
})
);
_log(PASS_ON);
return `
${Object.entries(PASS_ON)
.map(
(i) =>
`const ${i[0]} = ${i[1]};\nwindow[${JSON.stringify(i[0])}] = ${i[0]}`
)
.join("\n")}
_log("Initialized polyfill", {${Object.keys(PASS_ON).join(", ")}})
${polyfillString.replaceAll("{{EXTENSION_ASSETS_MAP}}", `JSON.parse(unescape(atob("${btoa(encodeURIComponent(JSON.stringify(EXTENSION_ASSETS_MAP)))}")))`)}
// Initialize the polyfill context for options page
const polyfillCtx = buildPolyfill({ isOtherPage: true });
const APPLY_TO = [window, self, globalThis];
for (const obj of APPLY_TO) {
obj.chrome = polyfillCtx.chrome;
obj.browser = polyfillCtx.browser;
obj.INJECTED_MANIFEST = ${JSON.stringify(INJECTED_MANIFEST)};
}
`;
}
async function main() {
_log(`Initializing...`, performance.now());
if (typeof _initStorage === "function") {
try {
_initStorage()
.then(() => {
_log(`Storage initialized.`);
})
.catch((e) => {
_error("Error during storage initialization:", e);
});
} catch (e) {
_error("Error during storage initialization:", e);
}
}
_log(`Starting content scripts...`);
const currentUrl = window.location.href;
let shouldRunAnyScript = false;
_log(`Checking URL: ${currentUrl}`);
if (
CONTENT_SCRIPT_CONFIGS_FOR_MATCHING &&
CONTENT_SCRIPT_CONFIGS_FOR_MATCHING.length > 0
) {
for (const config of CONTENT_SCRIPT_CONFIGS_FOR_MATCHING) {
if (
config.matches &&
config.matches.some((pattern) => {
try {
const regex = convertMatchPatternToRegExp(pattern);
if (regex.test(currentUrl)) {
return true;
}
return false;
} catch (e) {
_error(`Error testing match pattern "${pattern}":`, e);
return false;
}
})
) {
shouldRunAnyScript = true;
_log(`URL match found via config:`, config);
break;
}
}
} else {
_log(`No content script configurations found in manifest data.`);
}
if (shouldRunAnyScript) {
let polyfillContext;
try {
polyfillContext = buildPolyfill({ isBackground: false });
} catch (e) {
_error(`Failed to build polyfill:`, e);
return;
}
_log(`Polyfill built. Executing combined script logic...`);
// async function executeAllScripts({chrome, browser, global, window, globalThis, self, __globals}, extensionCssData) {
await executeAllScripts.call(
polyfillContext.globalThis,
polyfillContext,
extensionCssData
);
} else {
_log(
`No matching content script patterns for this URL. No scripts will be executed.`
);
}
if (OPTIONS_PAGE_PATH) {
if (typeof _registerMenuCommand === "function") {
try {
_registerMenuCommand("Open Options", openOptionsPage);
_log(`Options menu command registered.`);
} catch (e) {
_error("Failed to register menu command", e);
}
}
}
if (POPUP_PAGE_PATH) {
if (typeof _registerMenuCommand === "function") {
try {
_registerMenuCommand("Open Popup", openPopupPage);
_log(`Popup menu command registered.`);
} catch (e) {
_error("Failed to register popup menu command", e);
}
}
}
_log(`Initialization sequence complete.`);
}
main()//.catch((e) => _error(`Error during script initialization:`, e));
try {
const fnKey = "OPEN_OPTIONS_PAGE_" + String(SCRIPT_NAME).replace(/\s+/g, "_");
window[fnKey] = openOptionsPage;
} catch (e) {}
try {
const fnKey = "OPEN_POPUP_PAGE_" + String(SCRIPT_NAME).replace(/\s+/g, "_");
window[fnKey] = openPopupPage;
} catch (e) {}
})();
// #endregion
// #endregion
// #endregion