UNPKG

@ng-web-apis/universal

Version:

A set of fallback for @ng-web-apis/common for Angular Universal

178 lines 21.4 kB
import { DOCUMENT } from '@angular/common'; import { Optional } from '@angular/core'; import { WA_WINDOW } from '@ng-web-apis/common'; import { BlobMock } from '../classes/blob-mock'; import { LocationMock } from '../classes/location-mock'; import { StorageMock } from '../classes/storage-mock'; import { SSR_LOCATION } from '../tokens/ssr-location'; import { SSR_USER_AGENT } from '../tokens/ssr-user-agent'; import { EVENT_TARGET } from '../utils/event-target'; import { alwaysFalse, alwaysNull, alwaysRejected, alwaysZero, emptyFunction, identity, } from '../utils/functions'; import { CACHES_MOCK } from './universal-caches'; import { CRYPTO_MOCK } from './universal-crypto'; import { NAVIGATOR_MOCK } from './universal-navigator'; import { performanceFactory } from './universal-performance'; import { SPEECH_SYNTHESIS_MOCK } from './universal-speech-synthesis'; const COMPUTED_STYLES = { getPropertyPriority: () => '', getPropertyValue: () => '', item: () => '', removeProperty: () => '', setProperty: emptyFunction, }; const COMPUTED_STYLES_HANDLER = { get: (obj, key) => (key in obj ? obj[key] : null), }; const COMPUTED_STYLES_PROXY = new Proxy(COMPUTED_STYLES, COMPUTED_STYLES_HANDLER); const CSS_RULES = new (class extends Array { item = () => null; })(); const BAR_PROP = { visible: false, }; const DB_REQUEST = { ...EVENT_TARGET, onblocked: null, onerror: null, onsuccess: null, onupgradeneeded: null, error: null, readyState: 'pending', result: null, source: null, transaction: null, }; const SELF = ['frames', 'parent', 'self', 'top', 'window']; const WINDOW_HANDLER = { get: (windowRef, key) => { if (SELF.includes(key)) { return windowRef; } return key.startsWith('on') ? null : windowRef[key]; }, }; export const UNIVERSAL_WINDOW = { provide: WA_WINDOW, deps: [DOCUMENT, [new Optional(), SSR_LOCATION], [new Optional(), SSR_USER_AGENT]], useFactory: (document, location, userAgent) => { const windowMock = { ...EVENT_TARGET, document, localStorage: new StorageMock(), location: location ?? new LocationMock(), navigator: { ...NAVIGATOR_MOCK, userAgent: userAgent ?? '' }, performance: performanceFactory(), sessionStorage: new StorageMock(), speechSynthesis: SPEECH_SYNTHESIS_MOCK, caches: CACHES_MOCK, crypto: CRYPTO_MOCK, URL, URLSearchParams, setTimeout, setInterval, clearTimeout, clearInterval, console, Blob: BlobMock, alert: emptyFunction, clientInformation: { ...NAVIGATOR_MOCK, userAgent: userAgent ?? '' }, // TODO: Candidate for token matchMedia: () => ({ ...EVENT_TARGET, matches: false, media: '', onchange: null, addListener: emptyFunction, removeListener: emptyFunction, }), // TODO: Candidate for token indexedDB: { cmp: alwaysZero, open: () => DB_REQUEST, deleteDatabase: () => DB_REQUEST, }, customElements: { define: emptyFunction, get: emptyFunction, upgrade: emptyFunction, whenDefined: alwaysRejected, }, styleMedia: { type: '', matchMedium: alwaysFalse, }, history: { length: 0, scrollRestoration: 'auto', state: {}, back: emptyFunction, forward: emptyFunction, go: emptyFunction, pushState: emptyFunction, replaceState: emptyFunction, }, closed: false, defaultStatus: '', devicePixelRatio: 1, doNotTrack: '', frameElement: null, innerHeight: 0, innerWidth: 0, isSecureContext: false, length: 0, name: '', offscreenBuffering: false, opener: {}, origin: '', orientation: '', outerHeight: 0, outerWidth: 0, pageXOffset: 0, pageYOffset: 0, screenLeft: 0, screenTop: 0, screenX: 0, screenY: 0, scrollX: 0, scrollY: 0, status: '', blur: emptyFunction, cancelAnimationFrame: emptyFunction, captureEvents: emptyFunction, close: emptyFunction, confirm: alwaysFalse, departFocus: emptyFunction, focus: emptyFunction, moveBy: emptyFunction, moveTo: emptyFunction, open: alwaysNull, postMessage: emptyFunction, print: emptyFunction, prompt: alwaysNull, releaseEvents: emptyFunction, requestAnimationFrame: alwaysZero, resizeBy: emptyFunction, resizeTo: emptyFunction, scroll: emptyFunction, scrollBy: emptyFunction, scrollTo: emptyFunction, stop: emptyFunction, atob: identity, btoa: identity, fetch: alwaysRejected, createImageBitmap: alwaysRejected, queueMicrotask: emptyFunction, locationbar: BAR_PROP, menubar: BAR_PROP, personalbar: BAR_PROP, scrollbars: BAR_PROP, statusbar: BAR_PROP, toolbar: BAR_PROP, getComputedStyle: () => COMPUTED_STYLES_PROXY, getMatchedCSSRules: () => CSS_RULES, getSelection: () => null, }; return new Proxy(windowMock, WINDOW_HANDLER); }, }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdmVyc2FsLXdpbmRvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvdW5pdmVyc2FsL3NyYy9jb25zdGFudHMvdW5pdmVyc2FsLXdpbmRvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFekMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFOUMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUNILFdBQVcsRUFDWCxVQUFVLEVBQ1YsY0FBYyxFQUNkLFVBQVUsRUFDVixhQUFhLEVBQ2IsUUFBUSxHQUNYLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDM0QsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFFbkUsTUFBTSxlQUFlLEdBQWlDO0lBQ2xELG1CQUFtQixFQUFFLEdBQUcsRUFB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RUFBRSxRQUFRO1lBQ2pCLFdBQVcsRUFBRSxRQUFRO1lBQ3JCLFVBQVUsRUFBRSxRQUFRO1lBQ3BCLFNBQVMsRUFBRSxRQUFRO1lBQ25CLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxDQUFDLHFCQUFxQjtZQUM3QyxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTO1lBQ25DLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJO1NBQ3BCLENBQUM7UUFFVCxPQUFPLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7RmFjdG9yeVByb3ZpZGVyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7T3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtXQV9XSU5ET1d9IGZyb20gJ0BuZy13ZWItYXBpcy9jb21tb24nO1xuXG5pbXBvcnQge0Jsb2JNb2NrfSBmcm9tICcuLi9jbGFzc2VzL2Jsb2ItbW9jayc7XG5pbXBvcnQge0xvY2F0aW9uTW9ja30gZnJvbSAnLi4vY2xhc3Nlcy9sb2NhdGlvbi1tb2NrJztcbmltcG9ydCB7U3RvcmFnZU1vY2t9IGZyb20gJy4uL2NsYXNzZXMvc3RvcmFnZS1tb2NrJztcbmltcG9ydCB7U1NSX0xPQ0FUSU9OfSBmcm9tICcuLi90b2tlbnMvc3NyLWxvY2F0aW9uJztcbmltcG9ydCB7U1NSX1VTRVJfQUdFTlR9IGZyb20gJy4uL3Rva2Vucy9zc3ItdXNlci1hZ2VudCc7XG5pbXBvcnQge0VWRU5UX1RBUkdFVH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQtdGFyZ2V0JztcbmltcG9ydCB7XG4gICAgYWx3YXlzRmFsc2UsXG4gICAgYWx3YXlzTnVsbCxcbiAgICBhbHdheXNSZWplY3RlZCxcbiAgICBhbHdheXNaZXJvLFxuICAgIGVtcHR5RnVuY3Rpb24sXG4gICAgaWRlbnRpdHksXG59IGZyb20gJy4uL3V0aWxzL2Z1bmN0aW9ucyc7XG5pbXBvcnQge0NBQ0hFU19NT0NLfSBmcm9tICcuL3VuaXZlcnNhbC1jYWNoZXMnO1xuaW1wb3J0IHtDUllQVE9fTU9DS30gZnJvbSAnLi91bml2ZXJzYWwtY3J5cHRvJztcbmltcG9ydCB7TkFWSUdBVE9SX01PQ0t9IGZyb20gJy4vdW5pdmVyc2FsLW5hdmlnYXRvcic7XG5pbXBvcnQge3BlcmZvcm1hbmNlRmFjdG9yeX0gZnJvbSAnLi91bml2ZXJzYWwtcGVyZm9ybWFuY2UnO1xuaW1wb3J0IHtTUEVFQ0hfU1lOVEhFU0lTX01PQ0t9IGZyb20gJy4vdW5pdmVyc2FsLXNwZWVjaC1zeW50aGVzaXMnO1xuXG5jb25zdCBDT01QVVRFRF9TVFlMRVM6IFBhcnRpYWw8Q1NTU3R5bGVEZWNsYXJhdGlvbj4gPSB7XG4gICAgZ2V0UHJvcGVydHlQcmlvcml0eTogKCkgPT4gJycsXG4gICAgZ2V0UHJvcGVydHlWYWx1ZTogKCkgPT4gJycsXG4gICAgaXRlbTogKCkgPT4gJycsXG4gICAgcmVtb3ZlUHJvcGVydHk6ICgpID0+ICcnLFxuICAgIHNldFByb3BlcnR5OiBlbXB0eUZ1bmN0aW9uLFxufTtcbmNvbnN0IENPTVBVVEVEX1NUWUxFU19IQU5ETEVSOiBQcm94eUhhbmRsZXI8Q1NTU3R5bGVEZWNsYXJhdGlvbj4gPSB7XG4gICAgZ2V0OiAob2JqLCBrZXk6IGFueSkgPT4gKGtleSBpbiBvYmogPyBvYmpba2V5XSA6IG51bGwpLFxufTtcbmNvbnN0IENPTVBVVEVEX1NUWUxFU19QUk9YWSA9IG5ldyBQcm94eTxDU1NTdHlsZURlY2xhcmF0aW9uPihcbiAgICBDT01QVVRFRF9TVFlMRVMgYXMgYW55LFxuICAgIENPTVBVVEVEX1NUWUxFU19IQU5ETEVSLFxuKTtcbmNvbnN0IENTU19SVUxFUyA9IG5ldyAoY2xhc3MgZXh0ZW5kcyBBcnJheTxDU1NSdWxlPiBpbXBsZW1lbnRzIENTU1J1bGVMaXN0IHtcbiAgICBwdWJsaWMgaXRlbSA9ICgpOiBudWxsID0+IG51bGw7XG59KSgpO1xuY29uc3QgQkFSX1BST1A6IEJhclByb3AgPSB7XG4gICAgdmlzaWJsZTogZmFsc2UsXG59O1xuY29uc3QgREJfUkVRVUVTVDogSURCT3BlbkRCUmVxdWVzdCA9IHtcbiAgICAuLi5FVkVOVF9UQVJHRVQsXG4gICAgb25ibG9ja2VkOiBudWxsLFxuICAgIG9uZXJyb3I6IG51bGwsXG4gICAgb25zdWNjZXNzOiBudWxsLFxuICAgIG9udXBncmFkZW5lZWRlZDogbnVsbCxcbiAgICBlcnJvcjogbnVsbCxcbiAgICByZWFkeVN0YXRlOiAncGVuZGluZycsXG4gICAgcmVzdWx0OiBudWxsIGFzIGFueSwgLy8gQ2Fubm90IGJlIGFjY2Vzc2VkIGZvciAncGVuZGluZycgc3RhdGUgYW55d2F5XG4gICAgc291cmNlOiBudWxsIGFzIGFueSwgLy8gbnVsbCBmb3Igb3BlbiByZXF1ZXN0c1xuICAgIHRyYW5zYWN0aW9uOiBudWxsLFxufTtcbmNvbnN0IFNFTEYgPSBbJ2ZyYW1lcycsICdwYXJlbnQnLCAnc2VsZicsICd0b3AnLCAnd2luZG93J107XG5jb25zdCBXSU5ET1dfSEFORExFUjogUHJveHlIYW5kbGVyPFdpbmRvdz4gPSB7XG4gICAgZ2V0OiAod2luZG93UmVmLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoU0VMRi5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93UmVmO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGtleS5zdGFydHNXaXRoKCdvbicpID8gbnVsbCA6IHdpbmRvd1JlZltrZXkgYXMga2V5b2YgV2luZG93XTtcbiAgICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IFVOSVZFUlNBTF9XSU5ET1c6IEZhY3RvcnlQcm92aWRlciA9IHtcbiAgICBwcm92aWRlOiBXQV9XSU5ET1csXG4gICAgZGVwczogW0RPQ1VNRU5ULCBbbmV3IE9wdGlvbmFsKCksIFNTUl9MT0NBVElPTl0sIFtuZXcgT3B0aW9uYWwoKSwgU1NSX1VTRVJfQUdFTlRdXSxcbiAgICB1c2VGYWN0b3J5OiAoXG4gICAgICAgIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICAgICAgbG9jYXRpb246IExvY2F0aW9uIHwgbnVsbCxcbiAgICAgICAgdXNlckFnZW50OiBzdHJpbmcgfCBudWxsLFxuICAgICk6IFdpbmRvdyA9PiB7XG4gICAgICAgIGNvbnN0IHdpbmRvd01vY2s6IFdpbmRvdyA9IHtcbiAgICAgICAgICAgIC4uLkVWRU5UX1RBUkdFVCxcbiAgICAgICAgICAgIGRvY3VtZW50LFxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlOiBuZXcgU3RvcmFnZU1vY2soKSxcbiAgICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvbiA/PyBuZXcgTG9jYXRpb25Nb2NrKCksXG4gICAgICAgICAgICBuYXZpZ2F0b3I6IHsuLi5OQVZJR0FUT1JfTU9DSywgdXNlckFnZW50OiB1c2VyQWdlbnQgPz8gJyd9LFxuICAgICAgICAgICAgcGVyZm9ybWFuY2U6IHBlcmZvcm1hbmNlRmFjdG9yeSgpLFxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2U6IG5ldyBTdG9yYWdlTW9jaygpLFxuICAgICAgICAgICAgc3BlZWNoU3ludGhlc2lzOiBTUEVFQ0hfU1lOVEhFU0lTX01PQ0ssXG4gICAgICAgICAgICBjYWNoZXM6IENBQ0hFU19NT0NLLFxuICAgICAgICAgICAgY3J5cHRvOiBDUllQVE9fTU9DSyxcbiAgICAgICAgICAgIFVSTCxcbiAgICAgICAgICAgIFVSTFNlYXJjaFBhcmFtcyxcbiAgICAgICAgICAgIHNldFRpbWVvdXQsXG4gICAgICAgICAgICBzZXRJbnRlcnZhbCxcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCxcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwsXG4gICAgICAgICAgICBjb25zb2xlLFxuICAgICAgICAgICAgQmxvYjogQmxvYk1vY2ssXG4gICAgICAgICAgICBhbGVydDogZW1wdHlGdW5jdGlvbixcbiAgICAgICAgICAgIGNsaWVudEluZm9ybWF0aW9uOiB7Li4uTkFWSUdBVE9SX01PQ0ssIHVzZXJBZ2VudDogdXNlckFnZW50ID8/ICcnfSxcbiAgICAgICAgICAgIC8vIFRPRE86IENhbmRpZGF0ZSBmb3IgdG9rZW5cbiAgICAgICAgICAgIG1hdGNoTWVkaWE6ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgLi4uRVZFTlRfVEFSR0VULFxuICAgICAgICAgICAgICAgIG1hdGNoZXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1lZGlhOiAnJyxcbiAgICAgICAgICAgICAgICBvbmNoYW5nZTogbnVsbCxcbiAgICAgICAgICAgICAgICBhZGRMaXN0ZW5lcjogZW1wdHlGdW5jdGlvbixcbiAgICAgICAgICAgICAgICByZW1vdmVMaXN0ZW5lcjogZW1wdHlGdW5jdGlvbixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgLy8gVE9ETzogQ2FuZGlkYXRlIGZvciB0b2tlblxuICAgICAgICAgICAgaW5kZXhlZERCOiB7XG4gICAgICAgICAgICAgICAgY21wOiBhbHdheXNaZXJvLFxuICAgICAgICAgICAgICAgIG9wZW46ICgpID0+IERCX1JFUVVFU1QsXG4gICAgICAgICAgICAgICAgZGVsZXRlRGF0YWJhc2U6ICgpID0+IERCX1JFUVVFU1QsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3VzdG9tRWxlbWVudHM6IHtcbiAgICAgICAgICAgICAgICBkZWZpbmU6IGVtcHR5RnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgZ2V0OiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgICAgIHVwZ3JhZGU6IGVtcHR5RnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgd2hlbkRlZmluZWQ6IGFsd2F5c1JlamVjdGVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0eWxlTWVkaWE6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnJyxcbiAgICAgICAgICAgICAgICBtYXRjaE1lZGl1bTogYWx3YXlzRmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGlzdG9yeToge1xuICAgICAgICAgICAgICAgIGxlbmd0aDogMCxcbiAgICAgICAgICAgICAgICBzY3JvbGxSZXN0b3JhdGlvbjogJ2F1dG8nLFxuICAgICAgICAgICAgICAgIHN0YXRlOiB7fSxcbiAgICAgICAgICAgICAgICBiYWNrOiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgICAgIGZvcndhcmQ6IGVtcHR5RnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgZ286IGVtcHR5RnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgcHVzaFN0YXRlOiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgICAgIHJlcGxhY2VTdGF0ZTogZW1wdHlGdW5jdGlvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbG9zZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZGVmYXVsdFN0YXR1czogJycsXG4gICAgICAgICAgICBkZXZpY2VQaXhlbFJhdGlvOiAxLFxuICAgICAgICAgICAgZG9Ob3RUcmFjazogJycsXG4gICAgICAgICAgICBmcmFtZUVsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgICBpbm5lckhlaWdodDogMCxcbiAgICAgICAgICAgIGlubmVyV2lkdGg6IDAsXG4gICAgICAgICAgICBpc1NlY3VyZUNvbnRleHQ6IGZhbHNlLFxuICAgICAgICAgICAgbGVuZ3RoOiAwLFxuICAgICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgICBvZmZzY3JlZW5CdWZmZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgb3BlbmVyOiB7fSxcbiAgICAgICAgICAgIG9yaWdpbjogJycsXG4gICAgICAgICAgICBvcmllbnRhdGlvbjogJycsXG4gICAgICAgICAgICBvdXRlckhlaWdodDogMCxcbiAgICAgICAgICAgIG91dGVyV2lkdGg6IDAsXG4gICAgICAgICAgICBwYWdlWE9mZnNldDogMCxcbiAgICAgICAgICAgIHBhZ2VZT2Zmc2V0OiAwLFxuICAgICAgICAgICAgc2NyZWVuTGVmdDogMCxcbiAgICAgICAgICAgIHNjcmVlblRvcDogMCxcbiAgICAgICAgICAgIHNjcmVlblg6IDAsXG4gICAgICAgICAgICBzY3JlZW5ZOiAwLFxuICAgICAgICAgICAgc2Nyb2xsWDogMCxcbiAgICAgICAgICAgIHNjcm9sbFk6IDAsXG4gICAgICAgICAgICBzdGF0dXM6ICcnLFxuICAgICAgICAgICAgYmx1cjogZW1wdHlGdW5jdGlvbixcbiAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lOiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgY2FwdHVyZUV2ZW50czogZW1wdHlGdW5jdGlvbixcbiAgICAgICAgICAgIGNsb3NlOiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgY29uZmlybTogYWx3YXlzRmFsc2UsXG4gICAgICAgICAgICBkZXBhcnRGb2N1czogZW1wdHlGdW5jdGlvbixcbiAgICAgICAgICAgIGZvY3VzOiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgbW92ZUJ5OiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgbW92ZVRvOiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgb3BlbjogYWx3YXlzTnVsbCxcbiAgICAgICAgICAgIHBvc3RNZXNzYWdlOiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgcHJpbnQ6IGVtcHR5RnVuY3Rpb24sXG4gICAgICAgICAgICBwcm9tcHQ6IGFsd2F5c051bGwsXG4gICAgICAgICAgICByZWxlYXNlRXZlbnRzOiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lOiBhbHdheXNaZXJvLFxuICAgICAgICAgICAgcmVzaXplQnk6IGVtcHR5RnVuY3Rpb24sXG4gICAgICAgICAgICByZXNpemVUbzogZW1wdHlGdW5jdGlvbixcbiAgICAgICAgICAgIHNjcm9sbDogZW1wdHlGdW5jdGlvbixcbiAgICAgICAgICAgIHNjcm9sbEJ5OiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgc2Nyb2xsVG86IGVtcHR5RnVuY3Rpb24sXG4gICAgICAgICAgICBzdG9wOiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgYXRvYjogaWRlbnRpdHksXG4gICAgICAgICAgICBidG9hOiBpZGVudGl0eSxcbiAgICAgICAgICAgIGZldGNoOiBhbHdheXNSZWplY3RlZCxcbiAgICAgICAgICAgIGNyZWF0ZUltYWdlQml0bWFwOiBhbHdheXNSZWplY3RlZCxcbiAgICAgICAgICAgIHF1ZXVlTWljcm90YXNrOiBlbXB0eUZ1bmN0aW9uLFxuICAgICAgICAgICAgbG9jYXRpb25iYXI6IEJBUl9QUk9QLFxuICAgICAgICAgICAgbWVudWJhcjogQkFSX1BST1AsXG4gICAgICAgICAgICBwZXJzb25hbGJhcjogQkFSX1BST1AsXG4gICAgICAgICAgICBzY3JvbGxiYXJzOiBCQVJfUFJPUCxcbiAgICAgICAgICAgIHN0YXR1c2JhcjogQkFSX1BST1AsXG4gICAgICAgICAgICB0b29sYmFyOiBCQVJfUFJPUCxcbiAgICAgICAgICAgIGdldENvbXB1dGVkU3R5bGU6ICgpID0+IENPTVBVVEVEX1NUWUxFU19QUk9YWSxcbiAgICAgICAgICAgIGdldE1hdGNoZWRDU1NSdWxlczogKCkgPT4gQ1NTX1JVTEVTLFxuICAgICAgICAgICAgZ2V0U2VsZWN0aW9uOiAoKSA9PiBudWxsLFxuICAgICAgICB9IGFzIGFueTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb3h5KHdpbmRvd01vY2ssIFdJTkRPV19IQU5ETEVSKTtcbiAgICB9LFxufTtcbiJdfQ==