149 lines
19 KiB
Plaintext
149 lines
19 KiB
Plaintext
/* eslint-disable @typescript-eslint/no-base-to-string */
|
|
/* eslint-disable @typescript-eslint/prefer-promise-reject-errors */
|
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
/* eslint-disable @typescript-eslint/no-unsafe-function-type */
|
|
import { isSafari } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js";
|
|
|
|
import { setInterval } from "/_nuxt/node_modules/nuxt/dist/app/compat/interval.js?v=e4f18c29";
|
|
export class IndexedDatabase {
|
|
#options;
|
|
#db = undefined;
|
|
#dbName = 'speckle-cache';
|
|
#storeName = 'cache';
|
|
constructor(options) {
|
|
this.#options = options;
|
|
}
|
|
/**
|
|
* Initializes the database connection and creates the object store if needed.
|
|
* This must be called before any other database operations.
|
|
*/
|
|
async init() {
|
|
if (this.#db)
|
|
return;
|
|
await this.#safariFix();
|
|
return this.#openDatabase();
|
|
}
|
|
/**
|
|
* Opens the database, and if there's an error, deletes the database and tries again.
|
|
*/
|
|
async #openDatabase() {
|
|
const idb = this.#options.indexedDB ?? indexedDB;
|
|
return new Promise((resolve, reject) => {
|
|
const request = idb.open(this.#dbName, 1);
|
|
request.onerror = () => {
|
|
console.warn(`Failed to open database: ${this.#dbName}, deleting and trying again`);
|
|
// Delete the database and try again
|
|
const deleteRequest = idb.deleteDatabase(this.#dbName);
|
|
deleteRequest.onsuccess = () => {
|
|
// Try opening again after deletion
|
|
void this.#openDatabase().then(resolve).catch(reject);
|
|
};
|
|
deleteRequest.onerror = () => {
|
|
reject(`Failed to delete and reopen database: ${this.#dbName}`);
|
|
};
|
|
};
|
|
request.onupgradeneeded = (event) => {
|
|
const db = event.target.result;
|
|
if (db.objectStoreNames.contains(this.#storeName)) {
|
|
db.deleteObjectStore(this.#storeName);
|
|
}
|
|
db.createObjectStore(this.#storeName, { keyPath: 'baseId' });
|
|
};
|
|
request.onsuccess = (event) => {
|
|
this.#db = event.target.result;
|
|
resolve();
|
|
};
|
|
});
|
|
}
|
|
#getDB() {
|
|
if (!this.#db) {
|
|
throw new Error('Database not initialized. Call init() first.');
|
|
}
|
|
return this.#db;
|
|
}
|
|
/**
|
|
* Fixes a Safari bug where IndexedDB requests get lost and never resolve - invoke before you use IndexedDB
|
|
* @link Credits and more info: https://github.com/jakearchibald/safari-14-idb-fix
|
|
*/
|
|
async #safariFix() {
|
|
// No point putting other browsers or older versions of Safari through this mess.
|
|
if (!isSafari() || !this.#options.indexedDB?.databases)
|
|
return Promise.resolve();
|
|
let intervalId;
|
|
return new Promise((resolve) => {
|
|
const tryIdb = () => this.#options.indexedDB?.databases().finally(resolve);
|
|
intervalId = setInterval(() => {
|
|
void tryIdb();
|
|
}, 100);
|
|
void tryIdb();
|
|
}).finally(() => clearInterval(intervalId));
|
|
}
|
|
/**
|
|
* Inserts or updates an array of items in a single transaction.
|
|
* @param data The array of items to insert.
|
|
*/
|
|
async putAll(data) {
|
|
await this.init(); // Ensure the database is initialized
|
|
return new Promise((resolve, reject) => {
|
|
try {
|
|
const transaction = this.#getDB().transaction(this.#storeName, 'readwrite', {
|
|
durability: 'relaxed'
|
|
});
|
|
const store = transaction.objectStore(this.#storeName);
|
|
transaction.onerror = () => {
|
|
reject(`Transaction error: ${transaction.error}`);
|
|
};
|
|
transaction.oncomplete = () => {
|
|
resolve();
|
|
};
|
|
data.forEach((item) => store.put(item));
|
|
}
|
|
catch (error) {
|
|
reject(error);
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* Retrieves an array of items from the object store based on their IDs.
|
|
* @param ids The array of IDs to retrieve.
|
|
*/
|
|
async getAll(ids) {
|
|
await this.init(); // Ensure the database is initialized
|
|
return new Promise((resolve, reject) => {
|
|
if (ids.length === 0) {
|
|
return resolve([]);
|
|
}
|
|
try {
|
|
const transaction = this.#getDB().transaction(this.#storeName, 'readonly', {
|
|
durability: 'relaxed'
|
|
});
|
|
const store = transaction.objectStore(this.#storeName);
|
|
const promises = [];
|
|
for (const id of ids) {
|
|
promises.push(new Promise((resolveGet, rejectGet) => {
|
|
const request = store.get(id);
|
|
request.onerror = () => rejectGet(`Request error for id ${id}: ${request.error}`);
|
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
request.onsuccess = () => resolveGet(request.result);
|
|
}));
|
|
}
|
|
Promise.all(promises)
|
|
.then((results) => {
|
|
resolve(results);
|
|
})
|
|
.catch(reject);
|
|
}
|
|
catch (error) {
|
|
reject(error);
|
|
}
|
|
});
|
|
}
|
|
dispose() {
|
|
if (!this.#db)
|
|
return;
|
|
this.#db.close();
|
|
this.#db = undefined;
|
|
}
|
|
}
|
|
|
|
//# sourceMappingURL=data:application/json;base64,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LEtBQUssRUFBRTtnQkFDZCxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ2Y7UUFDRixDQUFDLENBQUM7SUFDSjtJQUNBLE9BQU87UUFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7WUFBRTtRQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFO1FBQ2hCLElBQUksQ0FBQyxHQUFHLEdBQUcsU0FBUztJQUN0QiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvcmUvc3RhZ2VzL2luZGV4ZWREYXRhYmFzZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tYmFzZS10by1zdHJpbmcgKi9cclxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnMgKi9cclxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGUgKi9cclxuaW1wb3J0IHsgaXNTYWZhcmkgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB7IEl0ZW0gfSBmcm9tICcuLi8uLi90eXBlcy90eXBlcy5qcydcclxuaW1wb3J0IHsgRGF0YWJhc2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzLmpzJ1xyXG5cclxuLyoqXHJcbiAqIEEgd3JhcHBlciBjbGFzcyBmb3IgSW5kZXhlZERCIHRvIHNpbXBsaWZ5IGNvbW1vbiBkYXRhYmFzZSBvcGVyYXRpb25zLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBJbmRleGVkRGF0YWJhc2VPcHRpb25zIHtcclxuICBpbmRleGVkREI/OiBJREJGYWN0b3J5XHJcbiAga2V5UmFuZ2U/OiB7XHJcbiAgICBib3VuZDogRnVuY3Rpb25cclxuICAgIGxvd2VyQm91bmQ6IEZ1bmN0aW9uXHJcbiAgICB1cHBlckJvdW5kOiBGdW5jdGlvblxyXG4gIH1cclxufVxyXG5leHBvcnQgY2xhc3MgSW5kZXhlZERhdGFiYXNlIGltcGxlbWVudHMgRGF0YWJhc2Uge1xyXG4gICNvcHRpb25zOiBJbmRleGVkRGF0YWJhc2VPcHRpb25zXHJcblxyXG4gICNkYjogSURCRGF0YWJhc2UgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcclxuICByZWFkb25seSAjZGJOYW1lOiBzdHJpbmcgPSAnc3BlY2tsZS1jYWNoZSdcclxuICByZWFkb25seSAjc3RvcmVOYW1lOiBzdHJpbmcgPSAnY2FjaGUnXHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEluZGV4ZWREYXRhYmFzZU9wdGlvbnMpIHtcclxuICAgIHRoaXMuI29wdGlvbnMgPSBvcHRpb25zXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbml0aWFsaXplcyB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgY3JlYXRlcyB0aGUgb2JqZWN0IHN0b3JlIGlmIG5lZWRlZC5cclxuICAgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgZGF0YWJhc2Ugb3BlcmF0aW9ucy5cclxuICAgKi9cclxuICBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuI2RiKSByZXR1cm5cclxuICAgIGF3YWl0IHRoaXMuI3NhZmFyaUZpeCgpXHJcbiAgICByZXR1cm4gdGhpcy4jb3BlbkRhdGFiYXNlKClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wZW5zIHRoZSBkYXRhYmFzZSwgYW5kIGlmIHRoZXJlJ3MgYW4gZXJyb3IsIGRlbGV0ZXMgdGhlIGRhdGFiYXNlIGFuZCB0cmllcyBhZ2Fpbi5cclxuICAgKi9cclxuICBhc3luYyAjb3BlbkRhdGFiYXNlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgaWRiID0gdGhpcy4jb3B0aW9ucy5pbmRleGVkREIgPz8gaW5kZXhlZERCXHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3QgcmVxdWVzdCA9IGlkYi5vcGVuKHRoaXMuI2RiTmFtZSwgMSlcclxuXHJcbiAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpOiBhbnkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgIGBGYWlsZWQgdG8gb3BlbiBkYXRhYmFzZTogJHt0aGlzLiNkYk5hbWV9LCBkZWxldGluZyBhbmQgdHJ5aW5nIGFnYWluYFxyXG4gICAgICAgIClcclxuICAgICAgICAvLyBEZWxldGUgdGhlIGRhdGFiYXNlIGFuZCB0cnkgYWdhaW5cclxuICAgICAgICBjb25zdCBkZWxldGVSZXF1ZXN0ID0gaWRiLmRlbGV0ZURhdGFiYXNlKHRoaXMuI2RiTmFtZSlcclxuICAgICAgICBkZWxldGVSZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpOiBhbnkgPT4ge1xyXG4gICAgICAgICAgLy8gVHJ5IG9wZW5pbmcgYWdhaW4gYWZ0ZXIgZGVsZXRpb25cclxuICAgICAgICAgIHZvaWQgdGhpcy4jb3BlbkRhdGFiYXNlKCkudGhlbihyZXNvbHZlKS5jYXRjaChyZWplY3QpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlbGV0ZVJlcXVlc3Qub25lcnJvciA9ICgpOiBhbnkgPT4ge1xyXG4gICAgICAgICAgcmVqZWN0KGBGYWlsZWQgdG8gZGVsZXRlIGFuZCByZW9wZW4gZGF0YWJhc2U6ICR7dGhpcy4jZGJOYW1lfWApXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChldmVudCk6IGFueSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGIgPSAoZXZlbnQudGFyZ2V0IGFzIElEQk9wZW5EQlJlcXVlc3QpLnJlc3VsdFxyXG4gICAgICAgIGlmIChkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKHRoaXMuI3N0b3JlTmFtZSkpIHtcclxuICAgICAgICAgIGRiLmRlbGV0ZU9iamVjdFN0b3JlKHRoaXMuI3N0b3JlTmFtZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUodGhpcy4jc3RvcmVOYW1lLCB7IGtleVBhdGg6ICdiYXNlSWQnIH0pXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKGV2ZW50KTogYW55ID0+IHtcclxuICAgICAgICB0aGlzLiNkYiA9IChldmVudC50YXJnZXQgYXMgSURCT3BlbkRCUmVxdWVzdCkucmVzdWx0XHJcbiAgICAgICAgcmVzb2x2ZSgpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAjZ2V0REIoKTogSURCRGF0YWJhc2Uge1xyXG4gICAgaWYgKCF0aGlzLiNkYikge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGFiYXNlIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0KCkgZmlyc3QuJylcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLiNkYlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRml4ZXMgYSBTYWZhcmkgYnVnIHdoZXJlIEluZGV4ZWREQiByZXF1ZXN0cyBnZXQgbG9zdCBhbmQgbmV2ZXIgcmVzb2x2ZSAtIGludm9rZSBiZWZvcmUgeW91IHVzZSBJbmRleGVkREJcclxuICAgKiBAbGluayBDcmVkaXRzIGFuZCBtb3JlIGluZm86IGh0dHBzOi8vZ2l0aHViLmNvbS9qYWtlYXJjaGliYWxkL3NhZmFyaS0xNC1pZGItZml4XHJcbiAgICovXHJcbiAgYXN5bmMgI3NhZmFyaUZpeCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIE5vIHBvaW50IHB1dHRpbmcgb3RoZXIgYnJvd3NlcnMgb3Igb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpIHRocm91Z2ggdGhpcyBtZXNzLlxyXG4gICAgaWYgKCFpc1NhZmFyaSgpIHx8ICF0aGlzLiNvcHRpb25zLmluZGV4ZWREQj8uZGF0YWJhc2VzKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcclxuXHJcbiAgICBsZXQgaW50ZXJ2YWxJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlOiAoKSA9PiB2b2lkKSA9PiB7XHJcbiAgICAgIGNvbnN0IHRyeUlkYiA9ICgpOiBQcm9taXNlPElEQkRhdGFiYXNlSW5mb1tdPiB8IHVuZGVmaW5lZCA9PlxyXG4gICAgICAgIHRoaXMuI29wdGlvbnMuaW5kZXhlZERCPy5kYXRhYmFzZXMoKS5maW5hbGx5KHJlc29sdmUpXHJcbiAgICAgIGludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgdm9pZCB0cnlJZGIoKVxyXG4gICAgICB9LCAxMDApXHJcbiAgICAgIHZvaWQgdHJ5SWRiKClcclxuICAgIH0pLmZpbmFsbHkoKCkgPT4gY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluc2VydHMgb3IgdXBkYXRlcyBhbiBhcnJheSBvZiBpdGVtcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvbi5cclxuICAgKiBAcGFyYW0gZGF0YSBUaGUgYXJyYXkgb2YgaXRlbXMgdG8gaW5zZXJ0LlxyXG4gICAqL1xyXG4gIGFzeW5jIHB1dEFsbChkYXRhOiBJdGVtW10pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuaW5pdCgpIC8vIEVuc3VyZSB0aGUgZGF0YWJhc2UgaXMgaW5pdGlhbGl6ZWRcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLiNnZXREQigpLnRyYW5zYWN0aW9uKHRoaXMuI3N0b3JlTmFtZSwgJ3JlYWR3cml0ZScsIHtcclxuICAgICAgICAgIGR1cmFiaWxpdHk6ICdyZWxheGVkJ1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc3Qgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSh0aGlzLiNzdG9yZU5hbWUpXHJcblxyXG4gICAgICAgIHRyYW5zYWN0aW9uLm9uZXJyb3IgPSAoKTogYW55ID0+IHtcclxuICAgICAgICAgIHJlamVjdChgVHJhbnNhY3Rpb24gZXJyb3I6ICR7dHJhbnNhY3Rpb24uZXJyb3J9YClcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9ICgpOiBhbnkgPT4ge1xyXG4gICAgICAgICAgcmVzb2x2ZSgpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkYXRhLmZvckVhY2goKGl0ZW0pID0+IHN0b3JlLnB1dChpdGVtKSlcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICByZWplY3QoZXJyb3IpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgaXRlbXMgZnJvbSB0aGUgb2JqZWN0IHN0b3JlIGJhc2VkIG9uIHRoZWlyIElEcy5cclxuICAgKiBAcGFyYW0gaWRzIFRoZSBhcnJheSBvZiBJRHMgdG8gcmV0cmlldmUuXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0QWxsKGlkczogc3RyaW5nW10pOiBQcm9taXNlPChJdGVtIHwgdW5kZWZpbmVkKVtdPiB7XHJcbiAgICBhd2FpdCB0aGlzLmluaXQoKSAvLyBFbnN1cmUgdGhlIGRhdGFiYXNlIGlzIGluaXRpYWxpemVkXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlKFtdKVxyXG4gICAgICB9XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLiNnZXREQigpLnRyYW5zYWN0aW9uKHRoaXMuI3N0b3JlTmFtZSwgJ3JlYWRvbmx5Jywge1xyXG4gICAgICAgICAgZHVyYWJpbGl0eTogJ3JlbGF4ZWQnXHJcbiAgICAgICAgfSlcclxuICAgICAgICBjb25zdCBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMuI3N0b3JlTmFtZSlcclxuICAgICAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTxJdGVtIHwgdW5kZWZpbmVkPltdID0gW11cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcclxuICAgICAgICAgIHByb21pc2VzLnB1c2goXHJcbiAgICAgICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlR2V0LCByZWplY3RHZXQpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUuZ2V0KGlkKVxyXG4gICAgICAgICAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpOiB2b2lkID0+XHJcbiAgICAgICAgICAgICAgICByZWplY3RHZXQoYFJlcXVlc3QgZXJyb3IgZm9yIGlkICR7aWR9OiAke3JlcXVlc3QuZXJyb3J9YClcclxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hcmd1bWVudFxyXG4gICAgICAgICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCk6IHZvaWQgPT4gcmVzb2x2ZUdldChyZXF1ZXN0LnJlc3VsdClcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKVxyXG4gICAgICAgICAgLnRoZW4oKHJlc3VsdHMpID0+IHtcclxuICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHRzKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5jYXRjaChyZWplY3QpXHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgcmVqZWN0KGVycm9yKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuICBkaXNwb3NlKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLiNkYikgcmV0dXJuXHJcbiAgICB0aGlzLiNkYi5jbG9zZSgpXHJcbiAgICB0aGlzLiNkYiA9IHVuZGVmaW5lZFxyXG4gIH1cclxufVxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL29iamVjdGxvYWRlcjIvZGlzdC9lc20vY29yZS9zdGFnZXMvaW5kZXhlZERhdGFiYXNlLmpzIn0= |