UNPKG

ngx-extended-pdf-viewer

Version:

Embedding PDF files in your Angular application. Highly configurable viewer including the toolbar, sidebar, and all the features you're used to.

140 lines 20.2 kB
import { AnnotationMode } from './editor-annotations'; const _isIE11 = typeof window === 'undefined' ? false : !!globalThis.MSInputMethodContext && !!document.documentMode; const isEdge = typeof navigator === 'undefined' || /Edge\/\d./i.test(navigator.userAgent); const needsES5 = typeof ReadableStream === 'undefined' || typeof Promise['allSettled'] === 'undefined'; export const pdfjsVersion = '4.10.708'; export const pdfjsBleedingEdgeVersion = '4.10.708'; export function getVersionSuffix(folder) { if (folder?.includes('bleeding-edge')) { return pdfjsBleedingEdgeVersion; } return pdfjsVersion; } export function assetsUrl(url, postfixIfPathIsRelativ = '') { if (url.includes('://')) { // the assets folder is on an absolute path (like https://example.com/assets) return url; } return `./${url + postfixIfPathIsRelativ}`; } export function getSafeCanvasSize() { if (typeof window === 'undefined' || typeof document === 'undefined') { return 4096; } // Create a temporary WebGL context const canvas = document.createElement('canvas'); const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); let maxTextureSize; if (gl instanceof WebGLRenderingContext) { maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); } else { maxTextureSize = 4096; } // Get available device RAM (in MB) function getAvailableMemoryMB() { if ('deviceMemory' in navigator) { return navigator.deviceMemory * 1024; // Convert GB to MB } if (window.performance && 'memory' in window.performance) { return window.performance.memory.jsHeapSizeLimit / 1024 / 1024; // Only works on Chrome, Firefox, and Edgewindow.performance.memory.jsHeapSizeLimit / 1024 / 1024; // Only works on Chrome } return 4096; // Default to 4GB if unknown } const availableMemoryMB = getAvailableMemoryMB(); // Conservative formula: Scale by square root of available memory let estimatedSafeSize = Math.floor(Math.sqrt((availableMemoryMB * 1024 * 1024) / 6)); // Apply platform-specific limits const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !('MSStream' in window); const isMobile = /Android|iPhone|iPad|iPod/.test(navigator.userAgent); const isHighEndDesktop = availableMemoryMB > 12000; // Assume high-end desktops have >12GB RAM if (isIOS) { estimatedSafeSize = Math.min(estimatedSafeSize, 4096); // iOS Safari memory limits } else if (isMobile) { estimatedSafeSize = Math.min(estimatedSafeSize, 4096); // Most mobile devices } else if (isHighEndDesktop) { estimatedSafeSize = Math.min(estimatedSafeSize, 8192); // Allow larger sizes for desktops } else { estimatedSafeSize = Math.min(estimatedSafeSize, 6000); // Mid-range desktops } // Final limit based on GPU and estimated memory safety const maxWidth = Math.min(maxTextureSize, estimatedSafeSize); return maxWidth * maxWidth; } // sonar ignore next line export const pdfDefaultOptions = { needsES5: _isIE11 || isEdge || needsES5, annotationEditorMode: 0, annotationMode: AnnotationMode.ENABLE_FORMS, defaultZoomDelay: 400, cursorToolOnLoad: 0, defaultUrl: '', defaultZoomValue: '', disableHistory: false, disablePageLabels: false, enablePermissions: false, docBaseUrl: '', enablePrintAutoRotate: true, externalLinkRel: 'noopener noreferrer nofollow', externalLinkTarget: 0, findController: undefined, historyUpdateUrl: false, ignoreDestinationZoom: false, imageResourcesPath: './images/', maxCanvasPixels: getSafeCanvasSize(), forcePageColors: false, pageColorsBackground: 'Canvas', pageColorsForeground: 'CanvasText', pdfBugEnabled: false, printResolution: 150, rangeChunkSize: 65536, removePageBorders: false, enableXfa: true, fontExtraProperties: false, sidebarViewOnLoad: -1, scrollModeOnLoad: -1, spreadModeOnLoad: -1, textLayerMode: 1, // viewerCssTheme: 0, // not supported by ngx-extended-pdf-viewer, use [theme] instead viewOnLoad: 0, cMapPacked: true, cMapUrl: function () { return `${assetsUrl(pdfDefaultOptions.assetsFolder, '/..')}/cmaps/`; }, disableAutoFetch: false, disableFontFace: false, disableRange: false, disableStream: true, isEvalSupported: true, isOffscreenCanvasSupported: true, maxImageSize: -1, pdfBug: false, verbosity: 1, workerPort: null, assetsFolder: 'assets', _internalFilenameSuffix: '.min', sandboxBundleSrc: function () { return pdfDefaultOptions.needsES5 ? `./pdf.sandbox-${getVersionSuffix(assetsUrl(pdfDefaultOptions.assetsFolder))}-es5.mjs` : `./pdf.sandbox-${getVersionSuffix(assetsUrl(pdfDefaultOptions.assetsFolder))}${pdfDefaultOptions._internalFilenameSuffix}.mjs`; }, workerSrc: function () { return pdfDefaultOptions.needsES5 ? `${assetsUrl(pdfDefaultOptions.assetsFolder)}/pdf.worker-${getVersionSuffix(assetsUrl(pdfDefaultOptions.assetsFolder))}-es5.mjs` : `${assetsUrl(pdfDefaultOptions.assetsFolder)}/pdf.worker-${getVersionSuffix(assetsUrl(pdfDefaultOptions.assetsFolder))}${pdfDefaultOptions._internalFilenameSuffix}.mjs`; }, standardFontDataUrl: () => `${assetsUrl(pdfDefaultOptions.assetsFolder, '/..')}/standard_fonts/`, // options specific to ngx-extended-pdf-viewer (as opposed to being used by pdf.js) doubleTapZoomFactor: 'page-width', doubleTapZoomsInHandMode: true, doubleTapZoomsInTextSelectionMode: false, doubleTapResetsZoomOnSecondDoubleTap: false, enableScripting: true, defaultCacheSize: 50, passwordPrompt: undefined, enableHWA: true, // enable hardware acceleration. Active since pdf.js 4.4. }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLWRlZmF1bHQtb3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1leHRlbmRlZC1wZGYtdmlld2VyL3NyYy9saWIvb3B0aW9ucy9wZGYtZGVmYXVsdC1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV0RCxNQUFNLE9BQU8sR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFPLFVBQVcsQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLENBQU8sUUFBUyxDQUFDLFlBQVksQ0FBQztBQUNuSSxNQUFNLE1BQU0sR0FBRyxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDMUYsTUFBTSxRQUFRLEdBQUcsT0FBTyxjQUFjLEtBQUssV0FBVyxJQUFJLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLFdBQVcsQ0FBQztBQUV2RyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLFVBQVUsQ0FBQztBQUNuRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBYztJQUM3QyxJQUFJLE1BQU0sRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUU7UUFDckMsT0FBTyx3QkFBd0IsQ0FBQztLQUNqQztJQUNELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVcsRUFBRSxzQkFBc0IsR0FBRyxFQUFFO0lBQ2hFLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN2Qiw2RUFBNkU7UUFDN0UsT0FBTyxHQUFHLENBQUM7S0FDWjtJQUNELE9BQU8sS0FBSyxHQUFHLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQztBQUM3QyxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQjtJQUMvQixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxPQUFPLFFBQVEsS0FBSyxXQUFXLEVBQUU7UUFDcEUsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUNELG1DQUFtQztJQUNuQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ2pGLElBQUksY0FBYyxDQUFDO0lBQ25CLElBQUksRUFBRSxZQUFZLHFCQUFxQixFQUFFO1FBQ3ZDLGNBQWMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0tBQ3ZEO1NBQU07UUFDTCxjQUFjLEdBQUcsSUFBSSxDQUFDO0tBQ3ZCO0lBQ0QsbUNBQW1DO0lBQ25DLFNBQVMsb0JBQW9CO1FBQzNCLElBQUksY0FBYyxJQUFJLFNBQVMsRUFBRTtZQUMvQixPQUFRLFNBQVMsQ0FBQyxZQUF1QixHQUFHLElBQUksQ0FBQyxDQUFDLG1CQUFtQjtTQUN0RTtRQUNELElBQUksTUFBTSxDQUFDLFdBQVcsSUFBSSxRQUFRLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTtZQUN4RCxPQUFRLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBYyxDQUFDLGVBQWUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsMEhBQTBIO1NBQ3BNO1FBQ0QsT0FBTyxJQUFJLENBQUMsQ0FBQyw0QkFBNEI7SUFDM0MsQ0FBQztJQUVELE1BQU0saUJBQWlCLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztJQUVqRCxpRUFBaUU7SUFDakUsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVyRixpQ0FBaUM7SUFDakMsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxDQUFDO0lBQ3RGLE1BQU0sUUFBUSxHQUFHLDBCQUEwQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEUsTUFBTSxnQkFBZ0IsR0FBRyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQywwQ0FBMEM7SUFFOUYsSUFBSSxLQUFLLEVBQUU7UUFDVCxpQkFBaUIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsMkJBQTJCO0tBQ25GO1NBQU0sSUFBSSxRQUFRLEVBQUU7UUFDbkIsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLHNCQUFzQjtLQUM5RTtTQUFNLElBQUksZ0JBQWdCLEVBQUU7UUFDM0IsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLGtDQUFrQztLQUMxRjtTQUFNO1FBQ0wsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLHFCQUFxQjtLQUM3RTtJQUVELHVEQUF1RDtJQUN2RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQzdELE9BQU8sUUFBUSxHQUFHLFFBQVEsQ0FBQztBQUM3QixDQUFDO0FBRUQseUJBQXlCO0FBQ3pCLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHO0lBQy9CLFFBQVEsRUFBRSxPQUFPLElBQUksTUFBTSxJQUFJLFFBQVE7SUFDdkMsb0JBQW9CLEVBQUUsQ0FBQztJQUN2QixjQUFjLEVBQUUsY0FBYyxDQUFDLFlBQVk7SUFDM0MsZ0JBQWdCLEVBQUUsR0FBRztJQUNyQixnQkFBZ0IsRUFBRSxDQUFDO0lBQ25CLFVBQVUsRUFBRSxFQUFFO0lBQ2QsZ0JBQWdCLEVBQUUsRUFBRTtJQUNwQixjQUFjLEVBQUUsS0FBSztJQUNyQixpQkFBaUIsRUFBRSxLQUFLO0lBQ3hCLGlCQUFpQixFQUFFLEtBQUs7SUFDeEIsVUFBVSxFQUFFLEVBQUU7SUFDZCxxQkFBcUIsRUFBRSxJQUFJO0lBQzNCLGVBQWUsRUFBRSw4QkFBOEI7SUFDL0Msa0JBQWtCLEVBQUUsQ0FBQztJQUNyQixjQUFjLEVBQUUsU0FBUztJQUN6QixnQkFBZ0IsRUFBRSxLQUFLO0lBQ3ZCLHFCQUFxQixFQUFFLEtBQUs7SUFDNUIsa0JBQWtCLEVBQUUsV0FBVztJQUMvQixlQUFlLEVBQUUsaUJBQWlCLEVBQUU7SUFDcEMsZUFBZSxFQUFFLEtBQUs7SUFDdEIsb0JBQW9CLEVBQUUsUUFBUTtJQUM5QixvQkFBb0IsRUFBRSxZQUFZO0lBQ2xDLGFBQWEsRUFBRSxLQUFLO0lBQ3BCLGVBQWUsRUFBRSxHQUFHO0lBQ3BCLGNBQWMsRUFBRSxLQUFLO0lBQ3JCLGlCQUFpQixFQUFFLEtBQUs7SUFDeEIsU0FBUyxFQUFFLElBQUk7SUFDZixtQkFBbUIsRUFBRSxLQUFLO0lBQzFCLGlCQUFpQixFQUFFLENBQUMsQ0FBQztJQUNyQixnQkFBZ0IsRUFBRSxDQUFDLENBQUM7SUFDcEIsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCLGFBQWEsRUFBRSxDQUFDO0lBQ2hCLHNGQUFzRjtJQUN0RixVQUFVLEVBQUUsQ0FBQztJQUNiLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLE9BQU8sRUFBRTtRQUNQLE9BQU8sR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUM7SUFDdEUsQ0FBQztJQUNELGdCQUFnQixFQUFFLEtBQUs7SUFDdkIsZUFBZSxFQUFFLEtBQUs7SUFDdEIsWUFBWSxFQUFFLEtBQUs7SUFDbkIsYUFBYSxFQUFFLElBQUk7SUFDbkIsZUFBZSxFQUFFLElBQUk7SUFDckIsMEJBQTBCLEVBQUUsSUFBSTtJQUNoQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLE1BQU0sRUFBRSxLQUFLO0lBQ2IsU0FBUyxFQUFFLENBQUM7SUFDWixVQUFVLEVBQUUsSUFBSTtJQUNoQixZQUFZLEVBQUUsUUFBUTtJQUN0Qix1QkFBdUIsRUFBRSxNQUFNO0lBQy9CLGdCQUFnQixFQUFFO1FBQ2hCLE9BQU8saUJBQWlCLENBQUMsUUFBUTtZQUMvQixDQUFDLENBQUMsaUJBQWlCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxVQUFVO1lBQ3hGLENBQUMsQ0FBQyxpQkFBaUIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsdUJBQXVCLE1BQU0sQ0FBQztJQUNySSxDQUFDO0lBQ0QsU0FBUyxFQUFFO1FBQ1QsT0FBTyxpQkFBaUIsQ0FBQyxRQUFRO1lBQy9CLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsZUFBZSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUMsVUFBVTtZQUNsSSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLGVBQWUsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQ3BILGlCQUFpQixDQUFDLHVCQUNwQixNQUFNLENBQUM7SUFDYixDQUFDO0lBQ0QsbUJBQW1CLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxrQkFBa0I7SUFFaEcsbUZBQW1GO0lBQ25GLG1CQUFtQixFQUFFLFlBQVk7SUFDakMsd0JBQXdCLEVBQUUsSUFBSTtJQUM5QixpQ0FBaUMsRUFBRSxLQUFLO0lBQ3hDLG9DQUFvQyxFQUFFLEtBQUs7SUFDM0MsZUFBZSxFQUFFLElBQUk7SUFDckIsZ0JBQWdCLEVBQUUsRUFBRTtJQUNwQixjQUFjLEVBQUUsU0FBUztJQUN6QixTQUFTLEVBQUUsSUFBSSxFQUFFLHlEQUF5RDtDQUMzRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvbk1vZGUgfSBmcm9tICcuL2VkaXRvci1hbm5vdGF0aW9ucyc7XG5cbmNvbnN0IF9pc0lFMTEgPSB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IGZhbHNlIDogISEoPGFueT5nbG9iYWxUaGlzKS5NU0lucHV0TWV0aG9kQ29udGV4dCAmJiAhISg8YW55PmRvY3VtZW50KS5kb2N1bWVudE1vZGU7XG5jb25zdCBpc0VkZ2UgPSB0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJyB8fCAvRWRnZVxcL1xcZC4vaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuY29uc3QgbmVlZHNFUzUgPSB0eXBlb2YgUmVhZGFibGVTdHJlYW0gPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBQcm9taXNlWydhbGxTZXR0bGVkJ10gPT09ICd1bmRlZmluZWQnO1xuXG5leHBvcnQgY29uc3QgcGRmanNWZXJzaW9uID0gJzQuMTAuNzA4JztcbmV4cG9ydCBjb25zdCBwZGZqc0JsZWVkaW5nRWRnZVZlcnNpb24gPSAnNC4xMC43MDgnO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZlcnNpb25TdWZmaXgoZm9sZGVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoZm9sZGVyPy5pbmNsdWRlcygnYmxlZWRpbmctZWRnZScpKSB7XG4gICAgcmV0dXJuIHBkZmpzQmxlZWRpbmdFZGdlVmVyc2lvbjtcbiAgfVxuICByZXR1cm4gcGRmanNWZXJzaW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXRzVXJsKHVybDogc3RyaW5nLCBwb3N0Zml4SWZQYXRoSXNSZWxhdGl2ID0gJycpOiBzdHJpbmcge1xuICBpZiAodXJsLmluY2x1ZGVzKCc6Ly8nKSkge1xuICAgIC8vIHRoZSBhc3NldHMgZm9sZGVyIGlzIG9uIGFuIGFic29sdXRlIHBhdGggKGxpa2UgaHR0cHM6Ly9leGFtcGxlLmNvbS9hc3NldHMpXG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICByZXR1cm4gYC4vJHt1cmwgKyBwb3N0Zml4SWZQYXRoSXNSZWxhdGl2fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYWZlQ2FudmFzU2l6ZSgpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiA0MDk2O1xuICB9XG4gIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBXZWJHTCBjb250ZXh0XG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICBjb25zdCBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcpIHx8IGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnKTtcbiAgbGV0IG1heFRleHR1cmVTaXplO1xuICBpZiAoZ2wgaW5zdGFuY2VvZiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpIHtcbiAgICBtYXhUZXh0dXJlU2l6ZSA9IGdsLmdldFBhcmFtZXRlcihnbC5NQVhfVEVYVFVSRV9TSVpFKTtcbiAgfSBlbHNlIHtcbiAgICBtYXhUZXh0dXJlU2l6ZSA9IDQwOTY7XG4gIH1cbiAgLy8gR2V0IGF2YWlsYWJsZSBkZXZpY2UgUkFNIChpbiBNQilcbiAgZnVuY3Rpb24gZ2V0QXZhaWxhYmxlTWVtb3J5TUIoKTogbnVtYmVyIHtcbiAgICBpZiAoJ2RldmljZU1lbW9yeScgaW4gbmF2aWdhdG9yKSB7XG4gICAgICByZXR1cm4gKG5hdmlnYXRvci5kZXZpY2VNZW1vcnkgYXMgbnVtYmVyKSAqIDEwMjQ7IC8vIENvbnZlcnQgR0IgdG8gTUJcbiAgICB9XG4gICAgaWYgKHdpbmRvdy5wZXJmb3JtYW5jZSAmJiAnbWVtb3J5JyBpbiB3aW5kb3cucGVyZm9ybWFuY2UpIHtcbiAgICAgIHJldHVybiAod2luZG93LnBlcmZvcm1hbmNlLm1lbW9yeSBhcyBhbnkpLmpzSGVhcFNpemVMaW1pdCAvIDEwMjQgLyAxMDI0OyAvLyBPbmx5IHdvcmtzIG9uIENocm9tZSwgRmlyZWZveCwgYW5kIEVkZ2V3aW5kb3cucGVyZm9ybWFuY2UubWVtb3J5LmpzSGVhcFNpemVMaW1pdCAvIDEwMjQgLyAxMDI0OyAvLyBPbmx5IHdvcmtzIG9uIENocm9tZVxuICAgIH1cbiAgICByZXR1cm4gNDA5NjsgLy8gRGVmYXVsdCB0byA0R0IgaWYgdW5rbm93blxuICB9XG5cbiAgY29uc3QgYXZhaWxhYmxlTWVtb3J5TUIgPSBnZXRBdmFpbGFibGVNZW1vcnlNQigpO1xuXG4gIC8vIENvbnNlcnZhdGl2ZSBmb3JtdWxhOiBTY2FsZSBieSBzcXVhcmUgcm9vdCBvZiBhdmFpbGFibGUgbWVtb3J5XG4gIGxldCBlc3RpbWF0ZWRTYWZlU2l6ZSA9IE1hdGguZmxvb3IoTWF0aC5zcXJ0KChhdmFpbGFibGVNZW1vcnlNQiAqIDEwMjQgKiAxMDI0KSAvIDYpKTtcblxuICAvLyBBcHBseSBwbGF0Zm9ybS1zcGVjaWZpYyBsaW1pdHNcbiAgY29uc3QgaXNJT1MgPSAvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhKCdNU1N0cmVhbScgaW4gd2luZG93KTtcbiAgY29uc3QgaXNNb2JpbGUgPSAvQW5kcm9pZHxpUGhvbmV8aVBhZHxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICBjb25zdCBpc0hpZ2hFbmREZXNrdG9wID0gYXZhaWxhYmxlTWVtb3J5TUIgPiAxMjAwMDsgLy8gQXNzdW1lIGhpZ2gtZW5kIGRlc2t0b3BzIGhhdmUgPjEyR0IgUkFNXG5cbiAgaWYgKGlzSU9TKSB7XG4gICAgZXN0aW1hdGVkU2FmZVNpemUgPSBNYXRoLm1pbihlc3RpbWF0ZWRTYWZlU2l6ZSwgNDA5Nik7IC8vIGlPUyBTYWZhcmkgbWVtb3J5IGxpbWl0c1xuICB9IGVsc2UgaWYgKGlzTW9iaWxlKSB7XG4gICAgZXN0aW1hdGVkU2FmZVNpemUgPSBNYXRoLm1pbihlc3RpbWF0ZWRTYWZlU2l6ZSwgNDA5Nik7IC8vIE1vc3QgbW9iaWxlIGRldmljZXNcbiAgfSBlbHNlIGlmIChpc0hpZ2hFbmREZXNrdG9wKSB7XG4gICAgZXN0aW1hdGVkU2FmZVNpemUgPSBNYXRoLm1pbihlc3RpbWF0ZWRTYWZlU2l6ZSwgODE5Mik7IC8vIEFsbG93IGxhcmdlciBzaXplcyBmb3IgZGVza3RvcHNcbiAgfSBlbHNlIHtcbiAgICBlc3RpbWF0ZWRTYWZlU2l6ZSA9IE1hdGgubWluKGVzdGltYXRlZFNhZmVTaXplLCA2MDAwKTsgLy8gTWlkLXJhbmdlIGRlc2t0b3BzXG4gIH1cblxuICAvLyBGaW5hbCBsaW1pdCBiYXNlZCBvbiBHUFUgYW5kIGVzdGltYXRlZCBtZW1vcnkgc2FmZXR5XG4gIGNvbnN0IG1heFdpZHRoID0gTWF0aC5taW4obWF4VGV4dHVyZVNpemUsIGVzdGltYXRlZFNhZmVTaXplKTtcbiAgcmV0dXJuIG1heFdpZHRoICogbWF4V2lkdGg7XG59XG5cbi8vIHNvbmFyIGlnbm9yZSBuZXh0IGxpbmVcbmV4cG9ydCBjb25zdCBwZGZEZWZhdWx0T3B0aW9ucyA9IHtcbiAgbmVlZHNFUzU6IF9pc0lFMTEgfHwgaXNFZGdlIHx8IG5lZWRzRVM1LFxuICBhbm5vdGF0aW9uRWRpdG9yTW9kZTogMCxcbiAgYW5ub3RhdGlvbk1vZGU6IEFubm90YXRpb25Nb2RlLkVOQUJMRV9GT1JNUyxcbiAgZGVmYXVsdFpvb21EZWxheTogNDAwLCAvLyBtaWxsaXNlY29uZHNcbiAgY3Vyc29yVG9vbE9uTG9hZDogMCxcbiAgZGVmYXVsdFVybDogJycsXG4gIGRlZmF1bHRab29tVmFsdWU6ICcnLFxuICBkaXNhYmxlSGlzdG9yeTogZmFsc2UsXG4gIGRpc2FibGVQYWdlTGFiZWxzOiBmYWxzZSxcbiAgZW5hYmxlUGVybWlzc2lvbnM6IGZhbHNlLFxuICBkb2NCYXNlVXJsOiAnJyxcbiAgZW5hYmxlUHJpbnRBdXRvUm90YXRlOiB0cnVlLFxuICBleHRlcm5hbExpbmtSZWw6ICdub29wZW5lciBub3JlZmVycmVyIG5vZm9sbG93JyxcbiAgZXh0ZXJuYWxMaW5rVGFyZ2V0OiAwLFxuICBmaW5kQ29udHJvbGxlcjogdW5kZWZpbmVkLCAvLyBtdXN0IGV4dGVuZCBQREZGaW5kQ29udHJvbGxlclxuICBoaXN0b3J5VXBkYXRlVXJsOiBmYWxzZSxcbiAgaWdub3JlRGVzdGluYXRpb25ab29tOiBmYWxzZSxcbiAgaW1hZ2VSZXNvdXJjZXNQYXRoOiAnLi9pbWFnZXMvJyxcbiAgbWF4Q2FudmFzUGl4ZWxzOiBnZXRTYWZlQ2FudmFzU2l6ZSgpLFxuICBmb3JjZVBhZ2VDb2xvcnM6IGZhbHNlLFxuICBwYWdlQ29sb3JzQmFja2dyb3VuZDogJ0NhbnZhcycsXG4gIHBhZ2VDb2xvcnNGb3JlZ3JvdW5kOiAnQ2FudmFzVGV4dCcsXG4gIHBkZkJ1Z0VuYWJsZWQ6IGZhbHNlLFxuICBwcmludFJlc29sdXRpb246IDE1MCxcbiAgcmFuZ2VDaHVua1NpemU6IDY1NTM2LFxuICByZW1vdmVQYWdlQm9yZGVyczogZmFsc2UsXG4gIGVuYWJsZVhmYTogdHJ1ZSxcbiAgZm9udEV4dHJhUHJvcGVydGllczogZmFsc2UsXG4gIHNpZGViYXJWaWV3T25Mb2FkOiAtMSxcbiAgc2Nyb2xsTW9kZU9uTG9hZDogLTEsXG4gIHNwcmVhZE1vZGVPbkxvYWQ6IC0xLFxuICB0ZXh0TGF5ZXJNb2RlOiAxLFxuICAvLyB2aWV3ZXJDc3NUaGVtZTogMCwgLy8gbm90IHN1cHBvcnRlZCBieSBuZ3gtZXh0ZW5kZWQtcGRmLXZpZXdlciwgdXNlIFt0aGVtZV0gaW5zdGVhZFxuICB2aWV3T25Mb2FkOiAwLFxuICBjTWFwUGFja2VkOiB0cnVlLFxuICBjTWFwVXJsOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGAke2Fzc2V0c1VybChwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXIsICcvLi4nKX0vY21hcHMvYDtcbiAgfSxcbiAgZGlzYWJsZUF1dG9GZXRjaDogZmFsc2UsXG4gIGRpc2FibGVGb250RmFjZTogZmFsc2UsXG4gIGRpc2FibGVSYW5nZTogZmFsc2UsXG4gIGRpc2FibGVTdHJlYW06IHRydWUsXG4gIGlzRXZhbFN1cHBvcnRlZDogdHJ1ZSxcbiAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6IHRydWUsXG4gIG1heEltYWdlU2l6ZTogLTEsXG4gIHBkZkJ1ZzogZmFsc2UsXG4gIHZlcmJvc2l0eTogMSxcbiAgd29ya2VyUG9ydDogbnVsbCxcbiAgYXNzZXRzRm9sZGVyOiAnYXNzZXRzJyxcbiAgX2ludGVybmFsRmlsZW5hbWVTdWZmaXg6ICcubWluJywgLy8gZG9uJ3QgbW9kaWZ5IHRoaXMgLSBpdCdzIGFuIGludGVybmFsIGZpZWxkXG4gIHNhbmRib3hCdW5kbGVTcmM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcGRmRGVmYXVsdE9wdGlvbnMubmVlZHNFUzVcbiAgICAgID8gYC4vcGRmLnNhbmRib3gtJHtnZXRWZXJzaW9uU3VmZml4KGFzc2V0c1VybChwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXIpKX0tZXM1Lm1qc2BcbiAgICAgIDogYC4vcGRmLnNhbmRib3gtJHtnZXRWZXJzaW9uU3VmZml4KGFzc2V0c1VybChwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXIpKX0ke3BkZkRlZmF1bHRPcHRpb25zLl9pbnRlcm5hbEZpbGVuYW1lU3VmZml4fS5tanNgO1xuICB9LFxuICB3b3JrZXJTcmM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcGRmRGVmYXVsdE9wdGlvbnMubmVlZHNFUzVcbiAgICAgID8gYCR7YXNzZXRzVXJsKHBkZkRlZmF1bHRPcHRpb25zLmFzc2V0c0ZvbGRlcil9L3BkZi53b3JrZXItJHtnZXRWZXJzaW9uU3VmZml4KGFzc2V0c1VybChwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXIpKX0tZXM1Lm1qc2BcbiAgICAgIDogYCR7YXNzZXRzVXJsKHBkZkRlZmF1bHRPcHRpb25zLmFzc2V0c0ZvbGRlcil9L3BkZi53b3JrZXItJHtnZXRWZXJzaW9uU3VmZml4KGFzc2V0c1VybChwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXIpKX0ke1xuICAgICAgICAgIHBkZkRlZmF1bHRPcHRpb25zLl9pbnRlcm5hbEZpbGVuYW1lU3VmZml4XG4gICAgICAgIH0ubWpzYDtcbiAgfSxcbiAgc3RhbmRhcmRGb250RGF0YVVybDogKCkgPT4gYCR7YXNzZXRzVXJsKHBkZkRlZmF1bHRPcHRpb25zLmFzc2V0c0ZvbGRlciwgJy8uLicpfS9zdGFuZGFyZF9mb250cy9gLFxuXG4gIC8vIG9wdGlvbnMgc3BlY2lmaWMgdG8gbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIgKGFzIG9wcG9zZWQgdG8gYmVpbmcgdXNlZCBieSBwZGYuanMpXG4gIGRvdWJsZVRhcFpvb21GYWN0b3I6ICdwYWdlLXdpZHRoJyxcbiAgZG91YmxlVGFwWm9vbXNJbkhhbmRNb2RlOiB0cnVlLFxuICBkb3VibGVUYXBab29tc0luVGV4dFNlbGVjdGlvbk1vZGU6IGZhbHNlLFxuICBkb3VibGVUYXBSZXNldHNab29tT25TZWNvbmREb3VibGVUYXA6IGZhbHNlLFxuICBlbmFibGVTY3JpcHRpbmc6IHRydWUsXG4gIGRlZmF1bHRDYWNoZVNpemU6IDUwLFxuICBwYXNzd29yZFByb21wdDogdW5kZWZpbmVkLFxuICBlbmFibGVIV0E6IHRydWUsIC8vIGVuYWJsZSBoYXJkd2FyZSBhY2NlbGVyYXRpb24uIEFjdGl2ZSBzaW5jZSBwZGYuanMgNC40LlxufTtcbiJdfQ==