@dotglitch/ngx-common
Version:
Angular components and utilities that are commonly used.
155 lines • 20.1 kB
JavaScript
import textExtensions from './textextensions';
import * as MIT from '../../assets/mat-icons';
// Object.keys(MIT).forEach(k => {
// console.log(k, MIT[k])
// })
const symIcon = Symbol('icon');
const folderNames = MIT['default'].folderNames;
const fileNames = MIT['default'].fileNames;
const fileExtensions = MIT['default'].fileExtensions;
let folderIconNameList = [];
let fileIconNameList = [];
let fileIconExtensionList = [];
Object.entries(fileNames).forEach(([name, icon]) => {
fileIconNameList.push({
val: name,
iconName: icon
});
});
Object.entries(fileExtensions).forEach(([name, icon]) => {
fileIconExtensionList.push({
val: name,
iconName: icon
});
});
Object.entries(folderNames).forEach(([name, icon]) => {
folderIconNameList.push({
val: name,
iconName: icon,
});
});
// const getMimeType = (name: string) =>
// (/\.(appimage)$/.test(name) && "compressed") ||
// (/\.(pot|potx|pps|ppsx|ppt|pptm|pptx)$/.test(name) && "presentation") ||
// (/\.(odt|rtf|doc|docm|docx|dot|dotm|dotx)$/.test(name) && "richtext") ||
// (/\.(ods|xls|xlsm|xlsx|xps|xlsx|csv)$/.test(name) && "spreadsheet");
// Limited list of pop-icons that match before mat-icons
// const builtinIcons = [
// "7z",
// "apk",
// "arc",
// "bz",
// "deb",
// "gz",
// "pdf",
// "rar",
// "rpm",
// "tar",
// "xar",
// "xz",
// "zip"
// ];
export class IconResolver {
constructor(assetPath = "/assets/") {
let path = assetPath.trim();
// Replace any duplicate slash occurences
path = path.replace(/\/{2,99}/g, '\/');
// Trim off trailing slashes
if (path.endsWith('/'))
path = path.replace(/\/+$/, '');
// Ensure it starts with a slash.
if (!path.startsWith('/'))
path = '/' + path;
this.path = path;
}
isText(path) {
const ext = path.split('.').pop();
return textExtensions.includes(ext);
}
getBestMatch(data, filename) {
return data
.filter(d => filename.endsWith(d.val)) // filter to all match results
.sort((a, b) => b.val.length - a.val.length) // sort longest string first
[0]?.iconName; // Return the first result.
}
resolveDirIcon(file) {
if (!file.name && !file.path) {
return {
path: `${this.path}/material/folder.svg`,
needsBackdrop: false
};
}
const dirnameMatch = this.getBestMatch(folderIconNameList, file['vanityName'] || file.name || file.path);
// VS Code Material Icon Theme pack
// TODO: default to a clear icon that doesn't have decoration
return {
path: dirnameMatch ? `${this.path}/material/${dirnameMatch}.svg` : `${this.path}/material/folder.svg`,
needsBackdrop: false
};
}
resolveFileIcon(file) {
// Folders always use the material-icon-theme
// const baseExt = builtinIcons.find(ext => (file['vanityName'] || file.name).endsWith('.' + ext));
// if (baseExt) {
// return {
// path: `${this.path}/pop/exts/${baseExt}.svg`,
// needsBackdrop: false
// };
// }
// // Resolve a base MIME type via path extension
// const base2Ext = getMimeType((file['vanityName'] || file.name));
// // If we get a path extension, we can easily map the icon
// if (base2Ext) {
// return {
// path: `${this.path}/pop/${base2Ext}.svg`,
// needsBackdrop: false
// };
// }
// Lookup a filename from material-icon-theme
const filename = fileIconNameList
.filter(d => (file['vanityName'] || file.name).toLowerCase() == d.val.toLowerCase())
.sort((a, b) => b.val.length - a.val.length)[0]?.iconName;
if (filename) {
return {
path: `${this.path}/material/${filename}.svg`,
needsBackdrop: true
};
}
// foo.log.1 foo.log.123 should be treated clearly as log files.
if (/\.log\.\d+$/.test(filename)) {
return {
path: `${this.path}/material/log.svg`,
needsBackdrop: true
};
}
// Check the file's extension -- we may
const fileext = fileIconExtensionList
.filter(d => (file['vanityName'] || file.name).toLowerCase().endsWith('.' + d.val.toLowerCase()))
.sort((a, b) => b.val.length - a.val.length)[0]?.iconName;
if (fileext)
return {
path: `${this.path}/material/${fileext}.svg`,
needsBackdrop: true
};
// If the file doesn't have a text extension, we're going to assume it's binary data.
const isFileBinary = !this.isText(file.path);
return {
path: isFileBinary ? `${this.path}/material/document.svg` : `${this.path}/material/assembly.svg`,
// path: isFileBinary ? `${this.path}/pop/text.svg` : `${this.path}/pop/binary.svg`,
needsBackdrop: false
};
}
// TODO: resolve dynamic thumbnails for media documents
resolveIcon(file) {
if (!file)
return null;
if (file[symIcon])
return file[symIcon];
if (file.kind == "directory") {
return file[symIcon] = this.resolveDirIcon(file);
}
return file[symIcon] = this.resolveFileIcon(file);
}
;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi1yZXNvbHZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvY29tcG9uZW50cy9maWxlbWFuYWdlci9pY29uLXJlc29sdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sY0FBYyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxHQUFHLE1BQU0sd0JBQXdCLENBQUM7QUFFOUMsa0NBQWtDO0FBQ2xDLDZCQUE2QjtBQUM3QixLQUFLO0FBRUwsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRS9CLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLENBQUM7QUFDL0MsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUMzQyxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsY0FBYyxDQUFDO0FBRXJELElBQUksa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLElBQUksZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQzFCLElBQUkscUJBQXFCLEdBQUcsRUFBRSxDQUFDO0FBRS9CLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtJQUMvQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7UUFDbEIsR0FBRyxFQUFFLElBQUk7UUFDVCxRQUFRLEVBQUUsSUFBSTtLQUNqQixDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQTtBQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtJQUNwRCxxQkFBcUIsQ0FBQyxJQUFJLENBQUM7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QUFJLElBQUksV0FBVyxFQUFFLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQUEsQ0FBQztDQUNMIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRlNEZXNjcmlwdG9yIH0gZnJvbSAnLi9maWxlbWFuYWdlci5jb21wb25lbnQnO1xuaW1wb3J0IHRleHRFeHRlbnNpb25zIGZyb20gJy4vdGV4dGV4dGVuc2lvbnMnO1xuaW1wb3J0ICogYXMgTUlUIGZyb20gJy4uLy4uL2Fzc2V0cy9tYXQtaWNvbnMnO1xuXG4vLyBPYmplY3Qua2V5cyhNSVQpLmZvckVhY2goayA9PiB7XG4vLyAgICAgY29uc29sZS5sb2coaywgTUlUW2tdKVxuLy8gfSlcblxuY29uc3Qgc3ltSWNvbiA9IFN5bWJvbCgnaWNvbicpO1xuXG5jb25zdCBmb2xkZXJOYW1lcyA9IE1JVFsnZGVmYXVsdCddLmZvbGRlck5hbWVzO1xuY29uc3QgZmlsZU5hbWVzID0gTUlUWydkZWZhdWx0J10uZmlsZU5hbWVzO1xuY29uc3QgZmlsZUV4dGVuc2lvbnMgPSBNSVRbJ2RlZmF1bHQnXS5maWxlRXh0ZW5zaW9ucztcblxubGV0IGZvbGRlckljb25OYW1lTGlzdCA9IFtdO1xubGV0IGZpbGVJY29uTmFtZUxpc3QgPSBbXTtcbmxldCBmaWxlSWNvbkV4dGVuc2lvbkxpc3QgPSBbXTtcblxuT2JqZWN0LmVudHJpZXMoZmlsZU5hbWVzKS5mb3JFYWNoKChbbmFtZSwgaWNvbl0pID0+IHtcbiAgICBmaWxlSWNvbk5hbWVMaXN0LnB1c2goe1xuICAgICAgICB2YWw6IG5hbWUsXG4gICAgICAgIGljb25OYW1lOiBpY29uXG4gICAgfSk7XG59KVxuT2JqZWN0LmVudHJpZXMoZmlsZUV4dGVuc2lvbnMpLmZvckVhY2goKFtuYW1lLCBpY29uXSkgPT4ge1xuICAgIGZpbGVJY29uRXh0ZW5zaW9uTGlzdC5wdXNoKHtcbiAgICAgICAgdmFsOiBuYW1lLFxuICAgICAgICBpY29uTmFtZTogaWNvblxuICAgIH0pO1xufSlcblxuT2JqZWN0LmVudHJpZXMoZm9sZGVyTmFtZXMpLmZvckVhY2goKFtuYW1lLCBpY29uXSkgPT4ge1xuICAgIGZvbGRlckljb25OYW1lTGlzdC5wdXNoKHtcbiAgICAgICAgdmFsOiBuYW1lLFxuICAgICAgICBpY29uTmFtZTogaWNvbixcbiAgICB9KTtcbn0pXG5cbi8vIGNvbnN0IGdldE1pbWVUeXBlID0gKG5hbWU6IHN0cmluZykgPT5cbi8vICAgICAoL1xcLihhcHBpbWFnZSkkLy50ZXN0KG5hbWUpICYmIFwiY29tcHJlc3NlZFwiKSB8fFxuLy8gICAgICgvXFwuKHBvdHxwb3R4fHBwc3xwcHN4fHBwdHxwcHRtfHBwdHgpJC8udGVzdChuYW1lKSAmJiBcInByZXNlbnRhdGlvblwiKSB8fFxuLy8gICAgICgvXFwuKG9kdHxydGZ8ZG9jfGRvY218ZG9jeHxkb3R8ZG90bXxkb3R4KSQvLnRlc3QobmFtZSkgJiYgXCJyaWNodGV4dFwiKSB8fFxuLy8gICAgICgvXFwuKG9kc3x4bHN8eGxzbXx4bHN4fHhwc3x4bHN4fGNzdikkLy50ZXN0KG5hbWUpICYmIFwic3ByZWFkc2hlZXRcIik7XG5cblxuLy8gTGltaXRlZCBsaXN0IG9mIHBvcC1pY29ucyB0aGF0IG1hdGNoIGJlZm9yZSBtYXQtaWNvbnNcbi8vIGNvbnN0IGJ1aWx0aW5JY29ucyA9IFtcbi8vICAgICBcIjd6XCIsXG4vLyAgICAgXCJhcGtcIixcbi8vICAgICBcImFyY1wiLFxuLy8gICAgIFwiYnpcIixcbi8vICAgICBcImRlYlwiLFxuLy8gICAgIFwiZ3pcIixcbi8vICAgICBcInBkZlwiLFxuLy8gICAgIFwicmFyXCIsXG4vLyAgICAgXCJycG1cIixcbi8vICAgICBcInRhclwiLFxuLy8gICAgIFwieGFyXCIsXG4vLyAgICAgXCJ4elwiLFxuLy8gICAgIFwiemlwXCJcbi8vIF07XG5cbmV4cG9ydCBjbGFzcyBJY29uUmVzb2x2ZXIge1xuICAgIHB1YmxpYyBwYXRoOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3Rvcihhc3NldFBhdGggPSBcIi9hc3NldHMvXCIpIHtcbiAgICAgICAgbGV0IHBhdGggPSBhc3NldFBhdGgudHJpbSgpO1xuXG4gICAgICAgIC8vIFJlcGxhY2UgYW55IGR1cGxpY2F0ZSBzbGFzaCBvY2N1cmVuY2VzXG4gICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcL3syLDk5fS9nLCAnXFwvJyk7XG5cbiAgICAgICAgLy8gVHJpbSBvZmYgdHJhaWxpbmcgc2xhc2hlc1xuICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgnLycpKVxuICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG5cbiAgICAgICAgLy8gRW5zdXJlIGl0IHN0YXJ0cyB3aXRoIGEgc2xhc2guXG4gICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKCcvJykpXG4gICAgICAgICAgICBwYXRoID0gJy8nICsgcGF0aDtcblxuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNUZXh0KHBhdGg6IHN0cmluZykge1xuICAgICAgICBjb25zdCBleHQgPSBwYXRoLnNwbGl0KCcuJykucG9wKCk7XG4gICAgICAgIHJldHVybiB0ZXh0RXh0ZW5zaW9ucy5pbmNsdWRlcyhleHQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QmVzdE1hdGNoKGRhdGE6IHsgdmFsOiBzdHJpbmcsIGljb25OYW1lOiBzdHJpbmc7IH1bXSwgZmlsZW5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICAgICAgICAgIC5maWx0ZXIoZCA9PiBmaWxlbmFtZS5lbmRzV2l0aChkLnZhbCkpIC8vIGZpbHRlciB0byBhbGwgbWF0Y2ggcmVzdWx0c1xuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIudmFsLmxlbmd0aCAtIGEudmFsLmxlbmd0aCkgLy8gc29ydCBsb25nZXN0IHN0cmluZyBmaXJzdFxuICAgICAgICBbMF0/Lmljb25OYW1lOyAvLyBSZXR1cm4gdGhlIGZpcnN0IHJlc3VsdC5cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc29sdmVEaXJJY29uIChmaWxlOiBGU0Rlc2NyaXB0b3IpIHtcbiAgICAgICAgaWYgKCFmaWxlLm5hbWUgJiYgIWZpbGUucGF0aCkgIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcGF0aDogYCR7dGhpcy5wYXRofS9tYXRlcmlhbC9mb2xkZXIuc3ZnYCxcbiAgICAgICAgICAgICAgICBuZWVkc0JhY2tkcm9wOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlybmFtZU1hdGNoID0gdGhpcy5nZXRCZXN0TWF0Y2goZm9sZGVySWNvbk5hbWVMaXN0LCBmaWxlWyd2YW5pdHlOYW1lJ10gfHwgZmlsZS5uYW1lIHx8IGZpbGUucGF0aCk7XG4gICAgICAgIC8vIFZTIENvZGUgTWF0ZXJpYWwgSWNvbiBUaGVtZSBwYWNrXG5cbiAgICAgICAgLy8gVE9ETzogZGVmYXVsdCB0byBhIGNsZWFyIGljb24gdGhhdCBkb2Vzbid0IGhhdmUgZGVjb3JhdGlvblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGF0aDogZGlybmFtZU1hdGNoID8gYCR7dGhpcy5wYXRofS9tYXRlcmlhbC8ke2Rpcm5hbWVNYXRjaH0uc3ZnYCA6IGAke3RoaXMucGF0aH0vbWF0ZXJpYWwvZm9sZGVyLnN2Z2AsXG4gICAgICAgICAgICBuZWVkc0JhY2tkcm9wOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzb2x2ZUZpbGVJY29uIChmaWxlOiBGU0Rlc2NyaXB0b3IpIHtcbiAgICAgICAgLy8gRm9sZGVycyBhbHdheXMgdXNlIHRoZSBtYXRlcmlhbC1pY29uLXRoZW1lXG5cbiAgICAgICAgLy8gY29uc3QgYmFzZUV4dCA9IGJ1aWx0aW5JY29ucy5maW5kKGV4dCA9PiAoZmlsZVsndmFuaXR5TmFtZSddIHx8IGZpbGUubmFtZSkuZW5kc1dpdGgoJy4nICsgZXh0KSk7XG4gICAgICAgIC8vIGlmIChiYXNlRXh0KSB7XG4gICAgICAgIC8vICAgICByZXR1cm4ge1xuICAgICAgICAvLyAgICAgICAgIHBhdGg6IGAke3RoaXMucGF0aH0vcG9wL2V4dHMvJHtiYXNlRXh0fS5zdmdgLFxuICAgICAgICAvLyAgICAgICAgIG5lZWRzQmFja2Ryb3A6IGZhbHNlXG4gICAgICAgIC8vICAgICB9O1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gLy8gUmVzb2x2ZSBhIGJhc2UgTUlNRSB0eXBlIHZpYSBwYXRoIGV4dGVuc2lvblxuICAgICAgICAvLyBjb25zdCBiYXNlMkV4dCA9IGdldE1pbWVUeXBlKChmaWxlWyd2YW5pdHlOYW1lJ10gfHwgZmlsZS5uYW1lKSk7XG5cbiAgICAgICAgLy8gLy8gSWYgd2UgZ2V0IGEgcGF0aCBleHRlbnNpb24sIHdlIGNhbiBlYXNpbHkgbWFwIHRoZSBpY29uXG4gICAgICAgIC8vIGlmIChiYXNlMkV4dCkge1xuICAgICAgICAvLyAgICAgcmV0dXJuIHtcbiAgICAgICAgLy8gICAgICAgICBwYXRoOiBgJHt0aGlzLnBhdGh9L3BvcC8ke2Jhc2UyRXh0fS5zdmdgLFxuICAgICAgICAvLyAgICAgICAgIG5lZWRzQmFja2Ryb3A6IGZhbHNlXG4gICAgICAgIC8vICAgICB9O1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gTG9va3VwIGEgZmlsZW5hbWUgZnJvbSBtYXRlcmlhbC1pY29uLXRoZW1lXG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gZmlsZUljb25OYW1lTGlzdFxuICAgICAgICAgICAgLmZpbHRlcihkID0+IChmaWxlWyd2YW5pdHlOYW1lJ10gfHwgZmlsZS5uYW1lKS50b0xvd2VyQ2FzZSgpID09IGQudmFsLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYi52YWwubGVuZ3RoIC0gYS52YWwubGVuZ3RoKVxuICAgICAgICAgICAgWzBdPy5pY29uTmFtZTtcblxuICAgICAgICBpZiAoZmlsZW5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcGF0aDogYCR7dGhpcy5wYXRofS9tYXRlcmlhbC8ke2ZpbGVuYW1lfS5zdmdgLFxuICAgICAgICAgICAgICAgIG5lZWRzQmFja2Ryb3A6IHRydWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmb28ubG9nLjEgZm9vLmxvZy4xMjMgc2hvdWxkIGJlIHRyZWF0ZWQgY2xlYXJseSBhcyBsb2cgZmlsZXMuXG4gICAgICAgIGlmICgvXFwubG9nXFwuXFxkKyQvLnRlc3QoZmlsZW5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHBhdGg6IGAke3RoaXMucGF0aH0vbWF0ZXJpYWwvbG9nLnN2Z2AsXG4gICAgICAgICAgICAgICAgbmVlZHNCYWNrZHJvcDogdHJ1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRoZSBmaWxlJ3MgZXh0ZW5zaW9uIC0tIHdlIG1heVxuICAgICAgICBjb25zdCBmaWxlZXh0ID0gZmlsZUljb25FeHRlbnNpb25MaXN0XG4gICAgICAgICAgICAuZmlsdGVyKGQgPT4gKGZpbGVbJ3Zhbml0eU5hbWUnXSB8fCBmaWxlLm5hbWUpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy4nICsgZC52YWwudG9Mb3dlckNhc2UoKSkpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYi52YWwubGVuZ3RoIC0gYS52YWwubGVuZ3RoKVxuICAgICAgICAgICAgWzBdPy5pY29uTmFtZTtcblxuICAgICAgICBpZiAoZmlsZWV4dCkgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhdGg6IGAke3RoaXMucGF0aH0vbWF0ZXJpYWwvJHtmaWxlZXh0fS5zdmdgLFxuICAgICAgICAgICAgbmVlZHNCYWNrZHJvcDogdHJ1ZVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIElmIHRoZSBmaWxlIGRvZXNuJ3QgaGF2ZSBhIHRleHQgZXh0ZW5zaW9uLCB3ZSdyZSBnb2luZyB0byBhc3N1bWUgaXQncyBiaW5hcnkgZGF0YS5cbiAgICAgICAgY29uc3QgaXNGaWxlQmluYXJ5ID0gIXRoaXMuaXNUZXh0KGZpbGUucGF0aCk7XG5cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGF0aDogaXNGaWxlQmluYXJ5ID8gYCR7dGhpcy5wYXRofS9tYXRlcmlhbC9kb2N1bWVudC5zdmdgIDogYCR7dGhpcy5wYXRofS9tYXRlcmlhbC9hc3NlbWJseS5zdmdgLFxuICAgICAgICAgICAgLy8gcGF0aDogaXNGaWxlQmluYXJ5ID8gYCR7dGhpcy5wYXRofS9wb3AvdGV4dC5zdmdgIDogYCR7dGhpcy5wYXRofS9wb3AvYmluYXJ5LnN2Z2AsXG4gICAgICAgICAgICBuZWVkc0JhY2tkcm9wOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIFRPRE86IHJlc29sdmUgZHluYW1pYyB0aHVtYm5haWxzIGZvciBtZWRpYSBkb2N1bWVudHNcbiAgICByZXNvbHZlSWNvbihmaWxlOiBGU0Rlc2NyaXB0b3IpOiB7IHBhdGg6IHN0cmluZywgbmVlZHNCYWNrZHJvcDogYm9vbGVhbjsgfSB7XG4gICAgICAgIGlmICghZmlsZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChmaWxlW3N5bUljb25dKSByZXR1cm4gZmlsZVtzeW1JY29uXTtcblxuICAgICAgICBpZiAoZmlsZS5raW5kID09IFwiZGlyZWN0b3J5XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmaWxlW3N5bUljb25dID0gdGhpcy5yZXNvbHZlRGlySWNvbihmaWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWxlW3N5bUljb25dID0gdGhpcy5yZXNvbHZlRmlsZUljb24oZmlsZSk7XG4gICAgfTtcbn1cbiJdfQ==