obsidian-integration-testing 12.3.0 → 14.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/cjs/adb.cjs +1 -1
- package/dist/lib/cjs/app-config.cjs +1 -1
- package/dist/lib/cjs/app-config.d.cts +24 -24
- package/dist/lib/cjs/appium-dependencies.cjs +1 -1
- package/dist/lib/cjs/appium-session-config.cjs +1 -1
- package/dist/lib/cjs/connect-to-cdp.cjs +1 -1
- package/dist/lib/cjs/connect-to-cdp.d.cts +4 -4
- package/dist/lib/cjs/demo-vault-bootstrap.cjs +1 -1
- package/dist/lib/cjs/demo-vault-bootstrap.d.cts +10 -2
- package/dist/lib/cjs/desktop-only-plugin-skip-error.cjs +1 -1
- package/dist/lib/cjs/device-readiness.cjs +1 -1
- package/dist/lib/cjs/device-settings.cjs +1 -1
- package/dist/lib/cjs/emulator-reclaim.cjs +1 -1
- package/dist/lib/cjs/emulator-reclaim.d.cts +17 -17
- package/dist/lib/cjs/enable-plugin.cjs +1 -1
- package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/eval-in-obsidian.d.cts +17 -12
- package/dist/lib/cjs/fit-screenshot.cjs +1 -1
- package/dist/lib/cjs/generate-function-call.cjs +1 -1
- package/dist/lib/cjs/generate-function-call.d.cts +1 -1
- package/dist/lib/cjs/global-setup-core.cjs +1 -1
- package/dist/lib/cjs/global-setup-core.d.cts +4 -4
- package/dist/lib/cjs/index.cjs +1 -1
- package/dist/lib/cjs/index.d.cts +4 -4
- package/dist/lib/cjs/integration-setup-failed-error.cjs +1 -1
- package/dist/lib/cjs/jest/global-setup.cjs +1 -1
- package/dist/lib/cjs/jest/global-setup.d.cts +6 -6
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/mobile-input.cjs +1 -1
- package/dist/lib/cjs/namespace-bootstrap.cjs +13 -3
- package/dist/lib/cjs/obsidian-instance.cjs +1 -1
- package/dist/lib/cjs/obsidian-instance.d.cts +3 -3
- package/dist/lib/cjs/obsidian-version-switch.cjs +1 -1
- package/dist/lib/cjs/open-obsidian-settings-tab.cjs +3 -3
- package/dist/lib/cjs/open-obsidian-settings-tab.d.cts +4 -4
- package/dist/lib/cjs/owned-vault-seed.cjs +3 -3
- package/dist/lib/cjs/parent-liveness.cjs +1 -1
- package/dist/lib/cjs/parent-liveness.d.cts +1 -1
- package/dist/lib/cjs/poll-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/poll-in-obsidian.d.cts +3 -3
- package/dist/lib/cjs/poll-until.cjs +1 -1
- package/dist/lib/cjs/poll-until.d.cts +4 -4
- package/dist/lib/cjs/process-capture.cjs +1 -1
- package/dist/lib/cjs/process-capture.d.cts +2 -2
- package/dist/lib/cjs/process-exit-message.cjs +1 -1
- package/dist/lib/cjs/process-exit-message.d.cts +2 -2
- package/dist/lib/cjs/run-version-matrix.cjs +3 -3
- package/dist/lib/cjs/setup-lock.cjs +1 -1
- package/dist/lib/cjs/setup-lock.d.cts +1 -1
- package/dist/lib/cjs/sharp-loader.cjs +1 -1
- package/dist/lib/cjs/sharp-loader.d.cts +6 -6
- package/dist/lib/cjs/temporary-vault.cjs +3 -2
- package/dist/lib/cjs/temporary-vault.d.cts +4 -4
- package/dist/lib/cjs/transport-appium.cjs +3 -1
- package/dist/lib/cjs/transport-desktop-cdp.cjs +7 -5
- package/dist/lib/cjs/transport-factory.cjs +2 -2
- package/dist/lib/cjs/transport-options.cjs +1 -1
- package/dist/lib/cjs/transport.cjs +1 -1
- package/dist/lib/cjs/transport.d.cts +10 -10
- package/dist/lib/cjs/vault-teardown-verdict.cjs +1 -1
- package/dist/lib/cjs/vitest/global-setup.cjs +1 -1
- package/dist/lib/cjs/vitest/global-setup.d.cts +6 -6
- package/dist/lib/cjs/webview-cdp.cjs +1 -1
- package/dist/lib/esm/adb.mjs +1 -1
- package/dist/lib/esm/app-config.d.mts +24 -24
- package/dist/lib/esm/app-config.mjs +1 -1
- package/dist/lib/esm/appium-dependencies.mjs +1 -1
- package/dist/lib/esm/appium-session-config.mjs +1 -1
- package/dist/lib/esm/connect-to-cdp.d.mts +4 -4
- package/dist/lib/esm/connect-to-cdp.mjs +1 -1
- package/dist/lib/esm/demo-vault-bootstrap.d.mts +10 -2
- package/dist/lib/esm/demo-vault-bootstrap.mjs +1 -1
- package/dist/lib/esm/desktop-only-plugin-skip-error.mjs +1 -1
- package/dist/lib/esm/device-readiness.mjs +1 -1
- package/dist/lib/esm/device-settings.mjs +1 -1
- package/dist/lib/esm/emulator-reclaim.d.mts +17 -17
- package/dist/lib/esm/emulator-reclaim.mjs +1 -1
- package/dist/lib/esm/enable-plugin.mjs +1 -1
- package/dist/lib/esm/eval-in-obsidian.d.mts +17 -12
- package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
- package/dist/lib/esm/fit-screenshot.mjs +1 -1
- package/dist/lib/esm/generate-function-call.d.mts +1 -1
- package/dist/lib/esm/generate-function-call.mjs +1 -1
- package/dist/lib/esm/global-setup-core.d.mts +4 -4
- package/dist/lib/esm/global-setup-core.mjs +1 -1
- package/dist/lib/esm/index.d.mts +4 -4
- package/dist/lib/esm/index.mjs +1 -1
- package/dist/lib/esm/integration-setup-failed-error.mjs +1 -1
- package/dist/lib/esm/jest/global-setup.d.mts +6 -6
- package/dist/lib/esm/jest/global-setup.mjs +1 -1
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/mobile-input.mjs +1 -1
- package/dist/lib/esm/namespace-bootstrap.mjs +13 -3
- package/dist/lib/esm/obsidian-instance.d.mts +3 -3
- package/dist/lib/esm/obsidian-instance.mjs +1 -1
- package/dist/lib/esm/obsidian-version-switch.mjs +1 -1
- package/dist/lib/esm/open-obsidian-settings-tab.d.mts +4 -4
- package/dist/lib/esm/open-obsidian-settings-tab.mjs +3 -3
- package/dist/lib/esm/owned-vault-seed.mjs +3 -3
- package/dist/lib/esm/parent-liveness.d.mts +1 -1
- package/dist/lib/esm/parent-liveness.mjs +1 -1
- package/dist/lib/esm/poll-in-obsidian.d.mts +3 -3
- package/dist/lib/esm/poll-in-obsidian.mjs +1 -1
- package/dist/lib/esm/poll-until.d.mts +4 -4
- package/dist/lib/esm/poll-until.mjs +1 -1
- package/dist/lib/esm/process-capture.d.mts +2 -2
- package/dist/lib/esm/process-capture.mjs +1 -1
- package/dist/lib/esm/process-exit-message.d.mts +2 -2
- package/dist/lib/esm/process-exit-message.mjs +1 -1
- package/dist/lib/esm/run-version-matrix.mjs +3 -3
- package/dist/lib/esm/setup-lock.d.mts +1 -1
- package/dist/lib/esm/setup-lock.mjs +1 -1
- package/dist/lib/esm/sharp-loader.d.mts +6 -6
- package/dist/lib/esm/sharp-loader.mjs +1 -1
- package/dist/lib/esm/temporary-vault.d.mts +4 -4
- package/dist/lib/esm/temporary-vault.mjs +3 -2
- package/dist/lib/esm/transport-appium.mjs +3 -1
- package/dist/lib/esm/transport-desktop-cdp.mjs +7 -5
- package/dist/lib/esm/transport-factory.mjs +2 -2
- package/dist/lib/esm/transport-options.mjs +1 -1
- package/dist/lib/esm/transport.d.mts +10 -10
- package/dist/lib/esm/vault-teardown-verdict.mjs +1 -1
- package/dist/lib/esm/vitest/global-setup.d.mts +6 -6
- package/dist/lib/esm/vitest/global-setup.mjs +1 -1
- package/dist/lib/esm/webview-cdp.mjs +1 -1
- package/package.json +1 -7
|
@@ -154,6 +154,7 @@ class AppiumTransport {
|
|
|
154
154
|
* @returns The raw PNG bytes.
|
|
155
155
|
* @throws Error if the driver returns data that is not a PNG.
|
|
156
156
|
*/
|
|
157
|
+
// eslint-disable-next-line obsidian-dev-utils/params-options-name-match -- Permanent: `CaptureScreenshotParams` is one bag shared by the `captureScreenshot` of both transports, so no per-owner name can satisfy both.
|
|
157
158
|
async captureScreenshot(_params) {
|
|
158
159
|
const bytes = decodeBase64Png(await this.browser.takeScreenshot());
|
|
159
160
|
if (!isPng(bytes)) {
|
|
@@ -197,6 +198,7 @@ class AppiumTransport {
|
|
|
197
198
|
* @param _options - Evaluation options (cwd is not used on mobile — vault targeting is via localStorage).
|
|
198
199
|
* @returns The normalized result string.
|
|
199
200
|
*/
|
|
201
|
+
// eslint-disable-next-line obsidian-dev-utils/params-options-name-match -- Permanent: `TransportEvalOptions` is one bag shared by the `evaluate` of both transports, so no per-owner name can satisfy both.
|
|
200
202
|
async evaluate(expression, _options) {
|
|
201
203
|
await this.ensureWebViewContext();
|
|
202
204
|
await this.ensureInputChannel();
|
|
@@ -765,4 +767,4 @@ export {
|
|
|
765
767
|
AppiumTransport,
|
|
766
768
|
DEFAULT_ANDROID_VAULT_BASE_PATH
|
|
767
769
|
};
|
|
768
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1hcHBpdW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBcHBpdW0gdHJhbnNwb3J0IFx1MjAxNCBldmFsdWF0ZXMgZXhwcmVzc2lvbnMgaW5zaWRlIE9ic2lkaWFuIE1vYmlsZSB2aWEgV2ViVmlld1xuICogSmF2YVNjcmlwdCBpbmplY3Rpb24uIE1hbmFnZXMgdmF1bHQgbGlmZWN5Y2xlIHZpYSBsb2NhbFN0b3JhZ2UgYW5kIGZpbGUgcHVzaC5cbiAqXG4gKiBDb25maWd1cmVkIHZpYSBgZW52aXJvbm1lbnRPcHRpb25zLm9ic2lkaWFuVHJhbnNwb3J0YCBpbiB2aXRlc3QgY29uZmlnOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIHZpdGVzdC5jb25maWcudHNcbiAqIGVudmlyb25tZW50T3B0aW9uczoge1xuICogICBvYnNpZGlhblRyYW5zcG9ydDoge1xuICogICAgIHR5cGU6ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bScsXG4gKiAgICAgYXBwaXVtVXJsOiAnaHR0cDovL2xvY2FsaG9zdDo0NzIzJyxcbiAqICAgICBhdmROYW1lOiAnb2JzaWRpYW5fdGVzdCcsXG4gKiAgIH0sXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBGb3IgQnJvd3NlclN0YWNrLCBzZXQgYGFwcGl1bVVybGAgdG8gdGhlIEJyb3dzZXJTdGFjayBodWIgVVJMXG4gKiBcdTIwMTQgdGhlIHRyYW5zcG9ydCBpdHNlbGYgaXMgaHViLWFnbm9zdGljLlxuICpcbiAqICMjIEhvdyB2YXVsdCByZWdpc3RyYXRpb24gd29ya3Mgb24gbW9iaWxlXG4gKlxuICogT2JzaWRpYW4gTW9iaWxlIHN0b3JlcyBpdHMgdmF1bHQgcmVnaXN0cnkgaW4gdGhlIFdlYlZpZXcncyBgbG9jYWxTdG9yYWdlYDpcbiAqXG4gKiAtIGBtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzYCBcdTIwMTQgSlNPTiBhcnJheSBvZiByZWdpc3RlcmVkIHZhdWx0IHBhdGhzXG4gKiAtIGBtb2JpbGUtc2VsZWN0ZWQtdmF1bHRgIFx1MjAxNCB0aGUgY3VycmVudGx5IGFjdGl2ZSB2YXVsdCBwYXRoXG4gKiAtIGBlbmFibGUtcGx1Z2luLTx2YXVsdFBhdGg+YCBcdTIwMTQgYFwidHJ1ZVwiYCB0byBlbmFibGUgdGhlIHBsdWdpbiBzeXN0ZW0gZm9yIHRoZSB2YXVsdFxuICpcbiAqIFRvIHJlZ2lzdGVyIGEgdmF1bHQgcHJvZ3JhbW1hdGljYWxseSAod2l0aG91dCBVSSBpbnRlcmFjdGlvbik6XG4gKlxuICogMS4gUHVzaCB2YXVsdCBmaWxlcyB0byB0aGUgZGV2aWNlIChlLmcuIGAvc2RjYXJkL0RvY3VtZW50cy88TmFtZT4vLm9ic2lkaWFuL2FwcC5qc29uYClcbiAqIDIuIFN3aXRjaCB0byBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dFxuICogMy4gU2V0IHRoZSBsb2NhbFN0b3JhZ2UgZW50cmllc1xuICogNC4gQ2FsbCBgbG9jYXRpb24ucmVsb2FkKClgIFx1MjAxNCBPYnNpZGlhbiByZS1yZWFkcyBsb2NhbFN0b3JhZ2UgYW5kIG9wZW5zIHRoZSB2YXVsdFxuICpcbiAqIFRoaXMgYXZvaWRzIHRoZSBvbmJvYXJkaW5nIGZsb3cgZW50aXJlbHkuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHR5cGUgeyBCcm93c2VyIH0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgcm0sXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwU3RhcnR1cE1pbGVzdG9uZSxcbiAgQXBwU3RhcnR1cFBoYXNlLFxuICBTdGFydHVwUHJvYmVSZXN1bHRcbn0gZnJvbSAnLi9hcHAtc3RhcnR1cC1wcm9ncmVzcy5tanMnO1xuaW1wb3J0IHR5cGUgeyBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyB9IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IE1vYmlsZUlucHV0RW52ZWxvcGUgfSBmcm9tICcuL21vYmlsZS1pbnB1dC5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBDb25zb2xlQ2FwdHVyZUhhbmRsZSxcbiAgT2JzaWRpYW5UcmFuc3BvcnQsXG4gIFRyYW5zcG9ydEV2YWxPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IFdlYlZpZXdDZHBDb25uZWN0aW9uIH0gZnJvbSAnLi93ZWJ2aWV3LWNkcC5tanMnO1xuXG5pbXBvcnQge1xuICBidWlsZFN0YXJ0dXBUaW1lb3V0TWVzc2FnZSxcbiAgY2hlY2tBcHBTdGFydGVkLFxuICBjaGVja0xheW91dFJlYWR5LFxuICBjbGFzc2lmeUFwcFN0YXJ0dXBQcm9iZSxcbiAgY29tcGFyZUFwcFN0YXJ0dXBNaWxlc3RvbmVzXG59IGZyb20gJy4vYXBwLXN0YXJ0dXAtcHJvZ3Jlc3MubWpzJztcbmltcG9ydCB7XG4gIGRlY29kZUJhc2U2NFBuZyxcbiAgaXNQbmdcbn0gZnJvbSAnLi9jYXB0dXJlLXNjcmVlbnNob3QubWpzJztcbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICcuL2Vycm9yLXRvLXN0cmluZy5tanMnO1xuaW1wb3J0IHtcbiAgRXZhbENhcEV4Y2VlZGVkRXJyb3IsXG4gIGlzU2NyaXB0VGltZW91dEVycm9yXG59IGZyb20gJy4vZXZhbC1jYXAtZXhjZWVkZWQtZXJyb3IubWpzJztcbmltcG9ydCB7IERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTIH0gZnJvbSAnLi9ldmFsLWNhcC5tanMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5tanMnO1xuaW1wb3J0IHsgVEVNUF9WQVVMVF9ESVJfUFJFRklYIH0gZnJvbSAnLi9sZWZ0b3Zlci1jbGVhbnVwLm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuaW1wb3J0IHtcbiAgYnVpbGRDbGFpbUlucHV0RXhwcmVzc2lvbixcbiAgYnVpbGRSZXNvbHZlSW5wdXRFeHByZXNzaW9uLFxuICBjaGVja0lucHV0Q2xhaW1HcmFudGVkLFxuICBNT0JJTEVfSU5QVVRfQklORElOR19OQU1FLFxuICB0b0NkcElucHV0Q29tbWFuZHNcbn0gZnJvbSAnLi9tb2JpbGUtaW5wdXQubWpzJztcbmltcG9ydCB7IGNvbm5lY3RUb1dlYlZpZXdDZHAgfSBmcm9tICcuL3dlYnZpZXctY2RwLm1qcyc7XG5cbi8qKlxuICogU2Vzc2lvbiBjb25uZWN0aW9uIGluZm8gcmV0dXJuZWQgYnkge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5nZXRTZXNzaW9uSW5mb30sXG4gKiB1c2VkIHRvIHJlYXR0YWNoIGZyb20gYW5vdGhlciBwcm9jZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGl1bVNlc3Npb25JbmZvIHtcbiAgLyoqXG4gIFRoZSBkZXZpY2UgVURJRCAoZS5nLiBgJ2VtdWxhdG9yLTU1NTQnYCkuXG4gICAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgQXBwaXVtL1dlYkRyaXZlciBzZXNzaW9uIElELlxuICAgKi9cbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIEFwcGl1bSB0cmFuc3BvcnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwaXVtVHJhbnNwb3J0Q29uZmlnIHtcbiAgLyoqXG4gICAqIEFwcCBwYWNrYWdlIChBbmRyb2lkKSBvciBidW5kbGUgSUQgKGlPUykuXG4gICAqIERlZmF1bHRzIHRvIGAnbWQub2JzaWRpYW4nYC5cbiAgICovXG4gIGFwcElkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgT2JzaWRpYW4gTW9iaWxlIHRvIGdldCBhcyBmYXIgYXMgYGdsb2JhbFRoaXMuYXBwYFxuICAgKiBleGlzdGluZyBhZnRlciB0aGUgdmF1bHQgaXMgKHJlKW9wZW5lZCwgYmVmb3JlIHRoZSB0aWdodGVyXG4gICAqIHtAbGluayBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kc30gY2xvY2sgc3RhcnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTgwMDAwYFxuICAgKi9cbiAgYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBBcHBpdW0gYnJvd3Nlci9kcml2ZXIgaW5zdGFuY2UuXG4gICAqIENyZWF0ZWQgYnkgdGhlIGNvbnN1bWVyIHZpYSBlLmcuIFdlYkRyaXZlcklPJ3MgYHJlbW90ZSgpYC5cbiAgICovXG4gIGJyb3dzZXI6IEJyb3dzZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgVURJRCAoZS5nLiBgJ2VtdWxhdG9yLTU1NTQnYCkuXG4gICAqIFVzZWQgZm9yIGBhZGJgIGNvbW1hbmRzIHdoZW4gcHVzaGluZyBmaWxlcyB0byB0aGUgZGV2aWNlLlxuICAgKi9cbiAgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBvd25zIHRoZSBBcHBpdW0gc2Vzc2lvbiBhbmQgc2hvdWxkIGRlbGV0ZSBpdCBvblxuICAgKiB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0LmRpc3Bvc2V9LlxuICAgKlxuICAgKiBgdHJ1ZWAgZm9yIHNlc3Npb25zIGNyZWF0ZWQgdmlhIGByZW1vdGUoKWAgKGdsb2JhbCBzZXR1cCkuXG4gICAqIGBmYWxzZWAgZm9yIHNlc3Npb25zIHJlYXR0YWNoZWQgdmlhIGBhdHRhY2goKWAgKHRlc3Qgd29ya2VycykuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgaXNTZXNzaW9uT3duZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgYGFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHlgLCBjb3VudGVkXG4gICAqIGZyb20gdGhlIG1vbWVudCB7QGxpbmsgYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHN9IGlzIHNhdGlzZmllZCBcdTIwMTQgbm90IGZyb21cbiAgICogdGhlIHJlbG9hZCwgc28gYSBjb2xkIGFwcCBzdGFydCBpcyBub3QgY2hhcmdlZCBhZ2FpbnN0IGl0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgOTAwMDBgXG4gICAqL1xuICBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGFyZ2V0IHBsYXRmb3JtLiBEZXRlcm1pbmVzIFdlYlZpZXcgY29udGV4dCBuYW1pbmcgYW5kIGRldmljZSBmaWxlIHBhdGhzLlxuICAgKi9cbiAgcGxhdGZvcm06ICdhbmRyb2lkJyB8ICdpb3MnO1xuXG4gIC8qKlxuICAgKiBUaGUgcGVyLXNjcmlwdCBjYXAsIGluIG1pbGxpc2Vjb25kcywgdGhpcyBzZXNzaW9uIHdhcyBnaXZlbiBhcyBpdHMgVzNDXG4gICAqIGB0aW1lb3V0cy5zY3JpcHRgIGNhcGFiaWxpdHkuXG4gICAqXG4gICAqIENhcnJpZWQgb25seSBzbyBhIHNjcmlwdCB0aW1lb3V0IGNhbiBiZSByZXBvcnRlZCB3aXRoIHRoZSBudW1iZXIgdGhhdFxuICAgKiBwcm9kdWNlZCBpdDsgdGhlIGNhcGFiaWxpdHkgaXRzZWxmIGlzIHNldCB3aGVuIHRoZSBzZXNzaW9uIGlzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAzMDAwMGBcbiAgICovXG4gIHNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciByZWdpc3RlcmluZyBhIHZhdWx0IGFsc28gcHJ1bmVzIHRoZSAqKm90aGVyKiogYHRlbXAtdmF1bHQtKmBcbiAgICogcmVnaXN0cmF0aW9ucyBlYXJsaWVyIHJ1bnMgbGVmdCBpbiBPYnNpZGlhbiBNb2JpbGUncyBgbG9jYWxTdG9yYWdlYC5cbiAgICpcbiAgICogVGhlIGRldmljZS1zaWRlIGRpcmVjdG9yaWVzIGFyZSBzd2VwdCBiZWZvcmUgdGhlIGFwcCBsYXVuY2hlcyAoc2VlIHRoZVxuICAgKiBmYWN0b3J5KTsgdGhpcyByZW1vdmVzIHRoZWlyIG5vdy1kYW5nbGluZyByZWdpc3RyeSBlbnRyaWVzLCB3aGljaCBhcmUgd2hhdFxuICAgKiBPYnNpZGlhbiBhY3R1YWxseSBlbnVtZXJhdGVzIGF0IHN0YXJ0dXAuIFVucmVnaXN0ZXJpbmcgdGhpcyBydW4ncyBvd24gdmF1bHRcbiAgICogaXMgdW5hZmZlY3RlZCBcdTIwMTQgdGhhdCBhbHdheXMgaGFwcGVucy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICBzaG91bGRTd2VlcExlZnRvdmVycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEJhc2UgcGF0aCBvbiB0aGUgZGV2aWNlIHdoZXJlIE9ic2lkaWFuIHN0b3JlcyB2YXVsdHMuXG4gICAqXG4gICAqIERlZmF1bHRzOlxuICAgKiAtIEFuZHJvaWQ6IGAvc2RjYXJkL0RvY3VtZW50cy9gXG4gICAqIC0gaU9TOiBgQG1kLm9ic2lkaWFuOmRvY3VtZW50cy9gXG4gICAqL1xuICB2YXVsdEJhc2VQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgdGhlIFdlYlZpZXcgY29udGV4dCB0byBiZWNvbWUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDBgXG4gICAqL1xuICB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG5jb25zdCBOT19PVVRQVVQgPSAnKG5vIG91dHB1dCknO1xuY29uc3QgQVBQX1NUQVRFX0ZPUkVHUk9VTkQgPSA0O1xuY29uc3QgV0VCVklFV19DT05URVhUX1BSRUZJWCA9ICdXRUJWSUVXX21kLm9ic2lkaWFuJztcbmNvbnN0IFdFQlZJRVdfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBERUZBVUxUX1dFQlZJRVdfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwXzAwMDtcbmNvbnN0IExBWU9VVF9SRUFEWV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IERFRkFVTFRfTEFZT1VUX1JFQURZX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA5MF8wMDA7XG5jb25zdCBERUZBVUxUX0FQUF9TVEFSVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTgwXzAwMDtcbmNvbnN0IEFQUF9SRVNUQVJUX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBERUZBVUxUX0FQUF9JRCA9ICdtZC5vYnNpZGlhbic7XG5jb25zdCBBREJfVkFVTFRfUkVNT1ZFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzBfMDAwO1xuLypcbiAqIEV4dHJhIGJ1ZGdldCBncmFudGVkIHRvIHRoZSBPTkUgZXZhbCB0aGF0IGZvbGxvd3MgYSBjYXAgb3ZlcnJ1biwgb24gdG9wIG9mIHRoZSBjYXAgaXRzZWxmLiBUaGVcbiAqIGFiYW5kb25lZCBjbG9zdXJlIGtlZXBzIHJ1bm5pbmcgaW4gdGhlIGd1ZXN0LCBhbmQgQXBwaXVtIHNlcmlhbGl6ZXMgY29tbWFuZHMgcGVyIHNlc3Npb24sIHNvIHRoZSBuZXh0XG4gKiBjb21tYW5kIHdhaXRzIG91dCB3aGF0ZXZlciBpcyBsZWZ0IG9mIGl0LiBTaXplZCBhdCB0aGUgZGVmYXVsdCBjYXAgYWdhaW4gXHUyMDE0IGRlcml2ZWQgZnJvbSBpdCByYXRoZXIgdGhhblxuICogcmVzdGF0ZWQsIHNvIHRoZSB0d28gY2Fubm90IGRyaWZ0IFx1MjAxNCB3aGljaCBpcyBhIHByYWdtYXRpYyBjZWlsaW5nIHJhdGhlciB0aGFuIGEgcHJvb2Y6IGEgY2xvc3VyZSBjYW5cbiAqIG91dHJ1biBhbnkgbnVtYmVyIHBpY2tlZCBoZXJlLiBJdCBkb2VzIG5vdCBuZWVkIHRvIGJlIGEgcHJvb2YsIGJlY2F1c2UgYSBndWVzdCB0aGF0IGlzIHN0aWxsIGJ1c3kgYWZ0ZXJcbiAqIGl0IHNpbXBseSBwcm9kdWNlcyBhbm90aGVyIG92ZXJydW4gb24gdGhlIG5leHQgZXZhbCwgd2hpY2ggaXMgZ3JhbnRlZCB0aGUgZ3JhY2UgaW4gdHVybiBcdTIwMTQgc28gdGhlIHNlc3Npb25cbiAqIHJlY292ZXJzIG92ZXIgc3VjY2Vzc2l2ZSBldmFscyBpbnN0ZWFkIG9mIGNvbXBvdW5kaW5nLCBhbmQgZXZlcnkgb25lIG9mIHRob3NlIGV2YWxzIHJlcG9ydHMgdGhlIHNhbWVcbiAqIGhvbmVzdCBkaWFnbm9zaXMuXG4gKi9cbmNvbnN0IENBUF9SRUNPVkVSWV9HUkFDRV9JTl9NSUxMSVNFQ09ORFMgPSBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EUztcblxuLy8gLS0tIENvbnNvbGUgY2FwdHVyZSAoTGF5ZXIgMiBvZiB0aGUgcGx1Z2luLWxvYWQgZXJyb3Igc3VyZmFjaW5nKSAtLS1cbi8qKlxuICogVGhlIGBsb2djYXRgIHRhZyBzdGFtcGVkIGF0IGNhcHR1cmUgc3RhcnQsIGFuZCB0aGUgcHJlZml4IG9mIHRoZSB1bmlxdWUgbWFya2VyIHdyaXR0ZW4gdW5kZXIgaXQuXG4gKlxuICogUHJvY2Vzcy1sb2NhbCByYXRoZXIgdGhhbiBhIHByb3RvY29sOiBgYmVnaW5Db25zb2xlQ2FwdHVyZWAgd3JpdGVzIGl0IGFuZCBgcmVhZENvbnNvbGVDYXB0dXJlU2luY2VgIHNlYXJjaGVzIHRoZSBkdW1wIGZvclxuICogdGhlIHNhbWUgc3RyaW5nLCBib3RoIGZyb20gdGhpcyBjb25zdGFudCwgc28gdGhlIHZhbHVlIGlzIGZyZWUgdG8gY2hhbmdlLiBJdCBvbmx5IGhhcyB0byBiZSB1bmxpa2VseSB0byBvY2N1ciBpbiBhblxuICogdW5yZWxhdGVkIGxvZyBsaW5lLlxuICovXG5jb25zdCBDT05TT0xFX0NBUFRVUkVfTUFSS0VSX1RBRyA9ICdPQlNJRElBTl9JTlRFR1JBVElPTl9URVNUSU5HX0NBUFRVUkUnO1xuY29uc3QgQ09OU09MRV9DQVBUVVJFX1RBSUxfTUFYX0xFTkdUSCA9IDgwMDA7XG5jb25zdCBBREJfTE9HX01BUktFUl9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBMT0dDQVRfRFVNUF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwXzAwMDtcbi8qKlxuICogYGFkYiBsb2djYXQgLXYgdGltZWAgbGluZXMgbG9vayBsaWtlIGBNTS1ERCBISDpNTTpTUy5tbW0gTEVWRUwvVEFHKCBQSUQpOiBtZXNzYWdlYC5cbiAqIEtlZXAgb25seSB0aGUgdGFncyBDaHJvbWl1bS9XZWJWaWV3IHJvdXRlcyBKUyBgY29uc29sZS4qYCBvdXRwdXQgYW5kIHVuY2F1Z2h0XG4gKiBlcnJvcnMgdG8gKGBjaHJvbWl1bWAsIHRoZSBDYXBhY2l0b3IgY29uc29sZSBicmlkZ2UsIGFuZCBuYXRpdmUgYEFuZHJvaWRSdW50aW1lYCkuXG4gKi9cbmNvbnN0IENPTlNPTEVfQ0FQVFVSRV9UQUdfUkUgPSAvXFwvKD86Y2hyb21pdW18QW5kcm9pZFJ1bnRpbWV8Q2FwYWNpdG9yXFwvQ29uc29sZSlcXCgvO1xuXG4vKipcbiAqIEJhc2UgcGF0aCBvbiBhbiBBbmRyb2lkIGRldmljZSB3aGVyZSBPYnNpZGlhbiBNb2JpbGUgc3RvcmVzIGl0cyB2YXVsdHMuXG4gKlxuICogRXhwb3J0ZWQgYmVjYXVzZSB0aGUgdHJhbnNwb3J0IGZhY3Rvcnkgc3dlZXBzIGxlZnRvdmVyIHZhdWx0cyBmcm9tIGl0IGJlZm9yZVxuICogYSB0cmFuc3BvcnQgZXhpc3RzIChzZWUgdGhlIHJlcG8ncyBMMzEpLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BTkRST0lEX1ZBVUxUX0JBU0VfUEFUSCA9ICcvc2RjYXJkL0RvY3VtZW50cy8nO1xuXG5jb25zdCBERUZBVUxUX1ZBVUxUX0JBU0VfUEFUSDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgYW5kcm9pZDogREVGQVVMVF9BTkRST0lEX1ZBVUxUX0JBU0VfUEFUSCxcbiAgaW9zOiAnQG1kLm9ic2lkaWFuOmRvY3VtZW50cy8nXG59O1xuXG5pbnRlcmZhY2UgTG9hZGluZ0FwcCB7XG4gIHdvcmtzcGFjZT86IExvYWRpbmdXb3Jrc3BhY2U7XG59XG5cbmludGVyZmFjZSBMb2FkaW5nV29ya3NwYWNlIHtcbiAgbGF5b3V0UmVhZHk/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBBcHBpdW1UcmFuc3BvcnQud2FpdEZvclN0YXJ0dXBNaWxlc3RvbmV9LlxuICovXG5pbnRlcmZhY2UgV2FpdEZvclN0YXJ0dXBNaWxlc3RvbmVQYXJhbXMge1xuICAvKipcbiAgV2hldGhlciB0aGUgbWlsZXN0b25lIGp1c3Qgb2JzZXJ2ZWQgZW5kcyB0aGlzIHBoYXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNTYXRpc2ZpZWQ6IChtaWxlc3RvbmU6IEFwcFN0YXJ0dXBNaWxlc3RvbmUpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gIFRoZSBwaGFzZSBiZWluZyB3YWl0ZWQgb3V0LCBuYW1lZCBpbiB0aGUgbG9nIGFuZCBpbiB0aGUgdGltZW91dCBtZXNzYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGhhc2U6IEFwcFN0YXJ0dXBQaGFzZTtcblxuICAvKipcbiAgVGhpcyBwaGFzZSdzIGJ1ZGdldC5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRyYW5zcG9ydCB0aGF0IGNvbW11bmljYXRlcyB3aXRoIE9ic2lkaWFuIE1vYmlsZSB2aWEgQXBwaXVtIFdlYlZpZXcgSlMgaW5qZWN0aW9uLlxuICpcbiAqIEV2YWx1YXRlcyBleHByZXNzaW9ucyBieSBzd2l0Y2hpbmcgdG8gdGhlIGBXRUJWSUVXX21kLm9ic2lkaWFuYCBjb250ZXh0IGFuZFxuICogY2FsbGluZyBgZXhlY3V0ZSgpYC4gTWFuYWdlcyB2YXVsdHMgYnkgd3JpdGluZyB0byB0aGUgV2ViVmlldydzIGBsb2NhbFN0b3JhZ2VgXG4gKiAod2hpY2ggT2JzaWRpYW4gdXNlcyBhcyBpdHMgdmF1bHQgcmVnaXN0cnkgb24gbW9iaWxlKSBhbmQgcHVzaGluZyBmaWxlcyB0byB0aGUgZGV2aWNlLlxuICovXG5leHBvcnQgY2xhc3MgQXBwaXVtVHJhbnNwb3J0IGltcGxlbWVudHMgT2JzaWRpYW5UcmFuc3BvcnQge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgZm9yIGEgbW9iaWxlIHBsYXRmb3JtLiBBbHdheXMgYHRydWVgIGZvciB0aGlzIHRyYW5zcG9ydC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc01vYmlsZSA9IHRydWU7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBhcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGJyb3dzZXI6IEJyb3dzZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBgcHJvY2Vzcy5vbignZXhpdCcpYCBoYW5kbGVyIHRoYXQgdGVhcnMgdGhlIGNoYW5uZWwgZG93biB3aGVuIG5vdGhpbmcgZWxzZSB3aWxsLlxuICAgKi9cbiAgcHJpdmF0ZSBkaXNwb3NlSW5wdXRDaGFubmVsT25FeGl0OiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBob3N0IGhhbGYgb2YgdGhlIHRydXN0ZWQtaW5wdXQgY2hhbm5lbDogYSBDRFAgY29ubmVjdGlvbiB0byB0aGUgV2ViVmlldywgaW5kZXBlbmRlbnQgb2YgdGhlXG4gICAqIEFwcGl1bSBzZXNzaW9uLCBvcGVuZWQgbGF6aWx5IG9uIGZpcnN0IGV2YWx1YXRlIGFuZCByZXVzZWQgKHNlZSAqKkwzOSoqKS5cbiAgICovXG4gIHByaXZhdGUgaW5wdXRDaGFubmVsOiBudWxsIHwgV2ViVmlld0NkcENvbm5lY3Rpb24gPSBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb25jZSB0aGUgdHJ1c3RlZC1pbnB1dCBjaGFubmVsIGlzIGtub3duIG5vdCB0byBiZSBvcGVuYWJsZSBoZXJlIChpT1MsIGEgcmVtb3RlIGh1Yiwgbm8gbG9jYWxcbiAgICogYGFkYmApLCBzbyB0aGUgYXR0ZW1wdCBpcyBub3QgcmVwZWF0ZWQgb24gZXZlcnkgZXZhbHVhdGUuXG4gICAqL1xuICBwcml2YXRlIGlzSW5wdXRDaGFubmVsVW5hdmFpbGFibGUgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFRyYWNrcyB3aGV0aGVyIHRoZSBkcml2ZXIgaXMgY3VycmVudGx5IHN3aXRjaGVkIHRvIHRoZSBXZWJWaWV3IGNvbnRleHQuXG4gICAqXG4gICAqIFNldCB0byBgdHJ1ZWAgYWZ0ZXIgYSBzdWNjZXNzZnVsIGBzd2l0Y2hDb250ZXh0KFdFQlZJRVdfbWQub2JzaWRpYW4pYC5cbiAgICogUmVzZXQgdG8gYGZhbHNlYCB3aGVuIHRoZSBjb250ZXh0IGlzIGtub3duIHRvIGJlIGludmFsaWRhdGVkXG4gICAqIChlLmcuIGFmdGVyIGBsb2NhdGlvbi5yZWxvYWQoKWAgaW4ge0BsaW5rIHJlZ2lzdGVyVmF1bHR9KS5cbiAgICpcbiAgICogV2hlbiBgdHJ1ZWAsIHtAbGluayBlbnN1cmVXZWJWaWV3Q29udGV4dH0gc2tpcHMgdGhlIGV4cGVuc2l2ZVxuICAgKiBgZ2V0Q29udGV4dHMoKWAgY2FsbCAod2hpY2ggcnVucyBgYWRiIHNoZWxsIGNhdCAvcHJvYy9uZXQvdW5peGAgYW5kXG4gICAqIGNhbiB0aW1lIG91dCBvbiBzbG93IGVtdWxhdG9ycykuXG4gICAqL1xuICBwcml2YXRlIGlzSW5XZWJWaWV3Q29udGV4dCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwcmV2aW91cyBldmFsIGVuZGVkIGluIGEgY2FwIG92ZXJydW4sIHNvIHRoZSBuZXh0IG9uZSBpcyBvd2VkIHRoZSByZWNvdmVyeSBncmFjZS5cbiAgICpcbiAgICogVGhlIGFiYW5kb25lZCBjbG9zdXJlIGlzIHN0aWxsIHJ1bm5pbmcgaW4gdGhlIGd1ZXN0LCBhbmQgQXBwaXVtIHNlcmlhbGl6ZXMgY29tbWFuZHMgcGVyIHNlc3Npb24sIHNvXG4gICAqIHRoZSBuZXh0IGNvbW1hbmQgcXVldWVzIGJlaGluZCB3aGF0ZXZlciBpcyBsZWZ0IG9mIGl0LiBTZWUge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5ldmFsdWF0ZVdpdGhpbkNhcH0uXG4gICAqL1xuICBwcml2YXRlIGlzUmVjb3ZlcmluZ0Zyb21DYXBPdmVycnVuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpc1Nlc3Npb25Pd25lcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtOiAnYW5kcm9pZCcgfCAnaW9zJztcbiAgcHJpdmF0ZSByZWFkb25seSBzY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRTd2VlcExlZnRvdmVyczogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSB2YXVsdEJhc2VQYXRoOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQXBwaXVtIHRyYW5zcG9ydC5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIEFwcGl1bSB0cmFuc3BvcnQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb25maWc6IEFwcGl1bVRyYW5zcG9ydENvbmZpZykge1xuICAgIHRoaXMuYnJvd3NlciA9IGNvbmZpZy5icm93c2VyO1xuICAgIHRoaXMuZGV2aWNlSWQgPSBjb25maWcuZGV2aWNlSWQ7XG4gICAgdGhpcy5pc1Nlc3Npb25Pd25lciA9IGNvbmZpZy5pc1Nlc3Npb25Pd25lciA/PyB0cnVlO1xuICAgIHRoaXMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBjb25maWcubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9MQVlPVVRfUkVBRFlfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB0aGlzLnBsYXRmb3JtID0gY29uZmlnLnBsYXRmb3JtO1xuICAgIHRoaXMuYXBwSWQgPSBjb25maWcuYXBwSWQgPz8gREVGQVVMVF9BUFBfSUQ7XG4gICAgdGhpcy5hcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IGNvbmZpZy5hcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0FQUF9TVEFSVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHRoaXMuc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzID0gY29uZmlnLnNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EUztcbiAgICB0aGlzLnNob3VsZFN3ZWVwTGVmdG92ZXJzID0gY29uZmlnLnNob3VsZFN3ZWVwTGVmdG92ZXJzID8/IHRydWU7XG4gICAgdGhpcy52YXVsdEJhc2VQYXRoID0gY29uZmlnLnZhdWx0QmFzZVBhdGggPz8gREVGQVVMVF9WQVVMVF9CQVNFX1BBVEhbdGhpcy5wbGF0Zm9ybV0gPz8gREVGQVVMVF9BTkRST0lEX1ZBVUxUX0JBU0VfUEFUSDtcbiAgICB0aGlzLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBjb25maWcud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX1dFQlZJRVdfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgfVxuXG4gIC8qKlxuICAgKiBCZWdpbnMgYSBjb25zb2xlIGNhcHR1cmUgYnkgc3RhbXBpbmcgdGhlIGRldmljZSBsb2cgd2l0aCBhIHVuaXF1ZSBtYXJrZXIuXG4gICAqXG4gICAqIFVzZXMgYGFkYiBzaGVsbCBsb2dgIHRvIHdyaXRlIGEgbWFya2VyIGludG8gYGxvZ2NhdGAgYXQgY2FwdHVyZSBzdGFydCBzbyBhXG4gICAqIGxhdGVyIHtAbGluayBBcHBpdW1UcmFuc3BvcnQucmVhZENvbnNvbGVDYXB0dXJlU2luY2V9IGNhbiBzbGljZSBvdXRcbiAgICogZXZlcnl0aGluZyB0aGUgV2ViVmlldyBsb2dnZWQgYWZ0ZXJ3YXJkcyBcdTIwMTQgd2l0aG91dCB0aGUgaW52YXNpdmUgYGxvZ2NhdCAtY2BcbiAgICogYnVmZmVyIGNsZWFyLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIGhhbmRsZSBjYXJyeWluZyB0aGUgdW5pcXVlIG1hcmtlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBiZWdpbkNvbnNvbGVDYXB0dXJlKCk6IFByb21pc2U8Q29uc29sZUNhcHR1cmVIYW5kbGU+IHtcbiAgICBjb25zdCBtYXJrZXIgPSBgJHtDT05TT0xFX0NBUFRVUkVfTUFSS0VSX1RBR31fJHtyYW5kb21VVUlEKCl9YDtcbiAgICBhd2FpdCBleGVjKFxuICAgICAgWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAnbG9nJywgJy10JywgQ09OU09MRV9DQVBUVVJFX01BUktFUl9UQUcsIG1hcmtlcl0sXG4gICAgICB7IGlzUXVpZXQ6IHRydWUsIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IEFEQl9MT0dfTUFSS0VSX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH1cbiAgICApO1xuICAgIHJldHVybiB7IG1hcmtlciB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhcHR1cmVzIGEgUE5HIHNjcmVlbnNob3Qgb2YgdGhlIGRldmljZSdzIHNjcmVlbi5cbiAgICpcbiAgICogVGhlIGltYWdlIGlzIGFsd2F5cyB0aGUgZGV2aWNlJ3MgbmF0aXZlIGZyYW1lYnVmZmVyIFx1MjAxNCB0aGVyZSBpcyBubyBtb2JpbGVcbiAgICogZXF1aXZhbGVudCBvZiB0aGUgZGVza3RvcCB2aWV3cG9ydCBvdmVycmlkZSwgc29cbiAgICoge0BsaW5rIENhcHR1cmVTY3JlZW5zaG90UGFyYW1zLndpZHRoSW5QaXhlbHN9IC9cbiAgICoge0BsaW5rIENhcHR1cmVTY3JlZW5zaG90UGFyYW1zLmhlaWdodEluUGl4ZWxzfSBhcmUgaWdub3JlZC4gU2l6ZSBhIG1vYmlsZVxuICAgKiBjYXB0dXJlIGJ5IGNob29zaW5nIGFuIEFWRCB3aG9zZSBzY3JlZW4gZ2VvbWV0cnkgYWxyZWFkeSBtYXRjaGVzIHdoYXQgdGhlXG4gICAqIGltYWdlIGhhcyB0byBiZS5cbiAgICpcbiAgICogQHBhcmFtIF9wYXJhbXMgLSBDYXB0dXJlIHBhcmFtZXRlcnMuIElnbm9yZWQgb24gbW9iaWxlOiBgY3dkYCBkb2VzIG5vdCBzZWxlY3QgYSB3aW5kb3cgKHZhdWx0IHRhcmdldGluZyBpcyB2aWEgbG9jYWxTdG9yYWdlKSwgYW5kIHRoZSBzaXplIGNhbm5vdCBiZSBvdmVycmlkZGVuLlxuICAgKiBAcmV0dXJucyBUaGUgcmF3IFBORyBieXRlcy5cbiAgICogQHRocm93cyBFcnJvciBpZiB0aGUgZHJpdmVyIHJldHVybnMgZGF0YSB0aGF0IGlzIG5vdCBhIFBORy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjYXB0dXJlU2NyZWVuc2hvdChfcGFyYW1zOiBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gZGVjb2RlQmFzZTY0UG5nKGF3YWl0IHRoaXMuYnJvd3Nlci50YWtlU2NyZWVuc2hvdCgpKTtcbiAgICBpZiAoIWlzUG5nKGJ5dGVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcHBpdW0gc2NyZWVuc2hvdCBlcnJvcjogdGFrZVNjcmVlbnNob3QgcmV0dXJuZWQgZGF0YSB0aGF0IGlzIG5vdCBhIFBORy4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnl0ZXM7XG4gIH1cblxuICAvKipcbiAgICogRW5kcyB0aGUgQXBwaXVtIHNlc3Npb24uXG4gICAqXG4gICAqIE9ubHkgZGVsZXRlcyB0aGUgc2Vzc2lvbiBpZiB0aGlzIHRyYW5zcG9ydCBvd25zIGl0LiBUcmFuc3BvcnRzIGNyZWF0ZWRcbiAgICogdmlhIGBhdHRhY2goKWAgKHRlc3Qgd29ya2VycyByZXVzaW5nIHRoZSBnbG9iYWwgc2V0dXAncyBzZXNzaW9uKSBza2lwXG4gICAqIGRlbGV0aW9uIHNvIHRoZSBzZXNzaW9uIHJlbWFpbnMgYXZhaWxhYmxlIGZvciB0aGUgb3duaW5nIHByb2Nlc3MuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRpc3Bvc2VJbnB1dENoYW5uZWwoKTtcblxuICAgIGlmICh0aGlzLmlzU2Vzc2lvbk93bmVyKSB7XG4gICAgICBhd2FpdCB0aGlzLmJyb3dzZXIuZGVsZXRlU2Vzc2lvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbm91cyB0ZWFyZG93biBmb3IgYHByb2Nlc3Mub24oJ2V4aXQnKWAgaGFuZGxlcnMuXG4gICAqXG4gICAqIE9ubHkgdGhlIHRydXN0ZWQtaW5wdXQgY2hhbm5lbCBuZWVkcyBpdDogdGhlIEFwcGl1bSBzZXNzaW9uIGlzIHRoZSBvd25pbmcgcHJvY2VzcydzIHRvIGVuZCwgYW5kIGFuXG4gICAqIGFicnVwdCBleGl0IGlzIGV4YWN0bHkgd2hlbiB0aGUgYXN5bmMge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5kaXNwb3NlfSBuZXZlciBydW5zIFx1MjAxNCB3aGljaCB3b3VsZCBzdHJhbmRcbiAgICogdGhlIGFkYiBwb3J0IGZvcndhcmQgb24gdGhlIGRldmljZS5cbiAgICovXG4gIHB1YmxpYyBkaXNwb3NlU3luYygpOiB2b2lkIHtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5pbnB1dENoYW5uZWw7XG4gICAgdGhpcy5pbnB1dENoYW5uZWwgPSBudWxsO1xuICAgIHRoaXMudW5yZWdpc3RlcklucHV0Q2hhbm5lbEV4aXRIYW5kbGVyKCk7XG4gICAgY2hhbm5lbD8uZGlzcG9zZVN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gaW5zaWRlIE9ic2lkaWFuIE1vYmlsZSdzIFdlYlZpZXcuXG4gICAqXG4gICAqIFN3aXRjaGVzIHRvIHRoZSBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dCwgZXhlY3V0ZXMgdGhlIGV4cHJlc3Npb24sXG4gICAqIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgc3RyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIFRoZSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gICAqIEBwYXJhbSBfb3B0aW9ucyAtIEV2YWx1YXRpb24gb3B0aW9ucyAoY3dkIGlzIG5vdCB1c2VkIG9uIG1vYmlsZSBcdTIwMTQgdmF1bHQgdGFyZ2V0aW5nIGlzIHZpYSBsb2NhbFN0b3JhZ2UpLlxuICAgKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCByZXN1bHQgc3RyaW5nLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV2YWx1YXRlKGV4cHJlc3Npb246IHN0cmluZywgX29wdGlvbnM6IFRyYW5zcG9ydEV2YWxPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVdlYlZpZXdDb250ZXh0KCk7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbnB1dENoYW5uZWwoKTtcblxuICAgIHRyeSB7XG4gICAgICAvKlxuICAgICAgICogVGhlIGNhcCBpcyBlbmZvcmNlZCBIRVJFLCBvbiB0aGUgTm9kZSBzaWRlLCBhbmQgbm90IGJ5IHRoZSBgdGltZW91dHMuc2NyaXB0YCBjYXBhYmlsaXR5IHRoZVxuICAgICAgICogU2Vzc2lvbiBhbHNvIGRlY2xhcmVzLiBNZWFzdXJlZCBvbiBhIGxpdmUgZW11bGF0b3I6IHRoZSBjYXBhYmlsaXR5IGlzIGFjY2VwdGVkIGFuZCByZWFkc1xuICAgICAgICogQmFjayBhcyAzMDAwMCBpbiB0aGUgV2ViVmlldyBjb250ZXh0LCBhbmQgbm90aGluZyBldmVyIGVuZm9yY2VzIGl0IFx1MjAxNCBvdmVyLWNhcCBjbG9zdXJlcyBpbiBib3RoIHRoZVxuICAgICAgICogU2xlZXBpbmcgYW5kIHRoZSBzcGlubmluZyBzaGFwZSwgd2l0aCBhbmQgd2l0aG91dCBhbiBleHBsaWNpdCBgc2V0VGltZW91dHNgLCByYW4gcGFzdCBhIDYwcyBjZWlsaW5nXG4gICAgICAgKiBXaXRob3V0IFdlYkRyaXZlciByYWlzaW5nIGBzY3JpcHQgdGltZW91dGAgZXZlbiBvbmNlLiBXaGF0IGFjdHVhbGx5IGhhcHBlbnMgcGFzdCByb3VnaGx5IGhhbGYgYVxuICAgICAgICogTWludXRlIGlzIHdvcnNlIHRoYW4gYSBsYXRlIGFuc3dlcjogdGhlIGNsb3N1cmUgQ09NUExFVEVTIGluIHRoZSBndWVzdCBvbiBzY2hlZHVsZSAodGltZXJzIGFybWVkIGF0XG4gICAgICAgKiAzMHMgYW5kIDQwcyBmaXJlZCB3aXRoaW4gfjEzbXMgb2Ygbm9taW5hbCwgb24gYSB2aXNpYmxlIGFuZCBmb2N1c2VkIHBhZ2UpIGFuZCBpdHMgRXhlY3V0ZSBTY3JpcHRcbiAgICAgICAqIFJlc3BvbnNlIG5ldmVyIHJlYWNoZXMgdGhpcyBjbGllbnQgXHUyMDE0IHNvIHRoZSBwcm9taXNlIGJlbG93IHNpbXBseSBuZXZlciBzZXR0bGVzLlxuICAgICAgICpcbiAgICAgICAqIEEgaGFuZyBpcyB0aGUgb25lIGZhaWx1cmUgbW9kZSBhIHRlc3QgYXV0aG9yIGNhbm5vdCBhY3Qgb24sIHNvIHRoZSB3YWl0IGlzIGJvdW5kZWQgaGVyZS5cbiAgICAgICAqL1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVdpdGhpbkNhcChgcmV0dXJuICgke2V4cHJlc3Npb259KWApO1xuXG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQgfHwgcmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBOT19PVVRQVVQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8qXG4gICAgICAgKiBBIGNhcCBvdmVycnVuIGlzIHRoZSBvbmUgZmFpbHVyZSBoZXJlIHRoYXQgc2F5cyBub3RoaW5nIGFib3V0IHRoZSBjb250ZXh0OiB0aGUgY2xvc3VyZSBvdXRzdGF5ZWRcbiAgICAgICAqIEl0cyBidWRnZXQsIHRoZSBXZWJWaWV3IGlzIHN0aWxsIHRoZSBXZWJWaWV3LiBSZXNldHRpbmcgdGhlIGZsYWcgd291bGQgY2hhcmdlIHRoZSBORVhUIGV2YWwgYVxuICAgICAgICogfjE3cyBgc3dpdGNoQ29udGV4dGAgKCoqTDE5KiopIHRvIHJlY292ZXIgZnJvbSBzb21ldGhpbmcgdGhhdCB3YXMgbmV2ZXIgbG9zdC5cbiAgICAgICAqL1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXZhbENhcEV4Y2VlZGVkRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnRleHQgbWF5IGhhdmUgYmVlbiBsb3N0IG1pZC1leGVjdXRpb24gKGUuZy4gcGFnZSByZWxvYWQpLlxuICAgICAgdGhpcy5pc0luV2ViVmlld0NvbnRleHQgPSBmYWxzZTtcblxuICAgICAgLypcbiAgICAgICAqIEtlcHQgYXMgYSBmYXN0IHBhdGggZXZlbiB0aG91Z2ggdGhpcyBkcml2ZXIgd2FzIG1lYXN1cmVkIG5ldmVyIHJhaXNpbmcgaXQ6IGl0IGNvc3RzIG5vdGhpbmcsXG4gICAgICAgKiBJdCBpcyB0aGUgY29ycmVjdCB0cmFuc2xhdGlvbiBpZiBhIGZ1dHVyZSBkcml2ZXIgZG9lcyBlbmZvcmNlIHRoZSBjYXBhYmlsaXR5LCBhbmQgaXQga2VlcHMgdGhlIHR3b1xuICAgICAgICogVHJhbnNwb3J0cyByZXBvcnRpbmcgb25lIGVycm9yIGZvciBvbmUgY29uZGl0aW9uLlxuICAgICAgICovXG4gICAgICBpZiAoaXNTY3JpcHRUaW1lb3V0RXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IG5ldyBFdmFsQ2FwRXhjZWVkZWRFcnJvcih7XG4gICAgICAgICAgY2FwSW5NaWxsaXNlY29uZHM6IHRoaXMuc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBvcHRpb25OYW1lOiAnc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzJyxcbiAgICAgICAgICB0cmFuc3BvcnROYW1lOiAnQW5kcm9pZCAoQXBwaXVtKSdcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzZXNzaW9uIGNvbm5lY3Rpb24gaW5mbyBuZWVkZWQgdG8gcmVhdHRhY2ggdG8gdGhpcyBzZXNzaW9uXG4gICAqIGZyb20gYW5vdGhlciBwcm9jZXNzIChlLmcuIGEgdGVzdCB3b3JrZXIpLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgc2Vzc2lvbiBJRCBhbmQgZGV2aWNlIElELlxuICAgKi9cbiAgcHVibGljIGdldFNlc3Npb25JbmZvKCk6IEFwcGl1bVNlc3Npb25JbmZvIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXG4gICAgICBzZXNzaW9uSWQ6IHRoaXMuYnJvd3Nlci5zZXNzaW9uSWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIE9ic2lkaWFuIGFwcCBpcyBydW5uaW5nIGFuZCB0aGUgV2ViVmlldyBpcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBfdmF1bHRQYXRoIC0gTm90IHVzZWQgb24gbW9iaWxlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZWZsaWdodENoZWNrKF92YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZygnW2FwcGl1bS10cmFuc3BvcnRdIFJ1bm5pbmcgcHJlZmxpZ2h0IGNoZWNrLi4uJyk7XG4gICAgY29uc3Qgc3RhdGUgPSBhd2FpdCB0aGlzLmJyb3dzZXIucXVlcnlBcHBTdGF0ZSh0aGlzLmFwcElkKTtcbiAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBBcHAgc3RhdGU6ICR7U3RyaW5nKHN0YXRlKX0gKG5lZWQgJHtTdHJpbmcoQVBQX1NUQVRFX0ZPUkVHUk9VTkQpfT1mb3JlZ3JvdW5kKWApO1xuICAgIGlmIChzdGF0ZSAhPT0gQVBQX1NUQVRFX0ZPUkVHUk9VTkQpIHtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIEFjdGl2YXRpbmcgYXBwICR7dGhpcy5hcHBJZH0uLi5gKTtcbiAgICAgIHRoaXMuaXNJbldlYlZpZXdDb250ZXh0ID0gZmFsc2U7XG4gICAgICBhd2FpdCB0aGlzLmJyb3dzZXIuYWN0aXZhdGVBcHAodGhpcy5hcHBJZCk7XG4gICAgICBhd2FpdCBkZWxheShBUFBfUkVTVEFSVF9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZW5zdXJlV2ViVmlld0NvbnRleHQoKTtcbiAgICBsb2coJ1thcHBpdW0tdHJhbnNwb3J0XSBQcmVmbGlnaHQgY2hlY2sgcGFzc2VkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1c2hlcyB2YXVsdCBmaWxlcyB0byB0aGUgZGV2aWNlIHZpYSBjb21wcmVzc2VkIGBhZGIgcHVzaGAuXG4gICAqXG4gICAqIENyZWF0ZXMgYSB0YXIuZ3ogYXJjaGl2ZSBvZiB0aGUgbG9jYWwgdmF1bHQgZGlyZWN0b3J5LCBwdXNoZXMgaXQgdG8gdGhlXG4gICAqIGRldmljZSBhcyBhIHNpbmdsZSBmaWxlLCBhbmQgZXh0cmFjdHMgaXQgaW4tcGxhY2UuIFRoaXMgYXZvaWRzIHRoZVxuICAgKiB3ZWJkcml2ZXIgYFJhbmdlRXJyb3JgIG9uIGxhcmdlIGJhc2U2NCBwYXlsb2FkcyBhbmQgaXMgc2lnbmlmaWNhbnRseVxuICAgKiBmYXN0ZXIgdGhhbiBwZXItZmlsZSBgYnJvd3Nlci5wdXNoRmlsZSgpYCBjYWxscy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoICh1c2VkIGFzIHRoZSB2YXVsdCBkaXJlY3RvcnkgbmFtZSBvbiBkZXZpY2UpLlxuICAgKiBAcGFyYW0gX2ZpbGVzIC0gTWFwIG9mIHJlbGF0aXZlIGZpbGUgcGF0aHMgdG8gY29udGVudCBidWZmZXJzICh1bnVzZWQgXHUyMDE0IGFkYiBwdXNoZXMgdGhlIGRpcmVjdG9yeSBkaXJlY3RseSkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHVzaEZpbGVzKHZhdWx0UGF0aDogc3RyaW5nLCBfZmlsZXM6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGV2aWNlVmF1bHRQYXRoID0gdGhpcy5nZXREZXZpY2VWYXVsdFBhdGgodmF1bHRQYXRoKTtcbiAgICBjb25zdCBhcmNoaXZlTmFtZSA9IGB2YXVsdC0ke3JhbmRvbVVVSUQoKX0udGFyLmd6YDtcbiAgICBjb25zdCBsb2NhbEFyY2hpdmUgPSBqb2luKHRtcGRpcigpLCBhcmNoaXZlTmFtZSk7XG4gICAgY29uc3QgcmVtb3RlQXJjaGl2ZSA9IGAvZGF0YS9sb2NhbC90bXAvJHthcmNoaXZlTmFtZX1gO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIENyZWF0aW5nIGFyY2hpdmU6ICR7bG9jYWxBcmNoaXZlfWApO1xuICAgICAgYXdhaXQgZXhlYyhbJ3RhcicsICdjemYnLCBhcmNoaXZlTmFtZSwgJy1DJywgdmF1bHRQYXRoLCAnLiddLCB7IGN3ZDogdG1wZGlyKCksIGlzUXVpZXQ6IHRydWUgfSk7XG5cbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFB1c2hpbmcgYXJjaGl2ZSB0byBkZXZpY2UgJHt0aGlzLmRldmljZUlkfS4uLmApO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdwdXNoJywgbG9jYWxBcmNoaXZlLCByZW1vdGVBcmNoaXZlXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBFeHRyYWN0aW5nIGFyY2hpdmUgb24gZGV2aWNlIGF0ICR7ZGV2aWNlVmF1bHRQYXRofS4uLmApO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdta2RpcicsICctcCcsIGRldmljZVZhdWx0UGF0aF0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAndGFyJywgJ3h6ZicsIHJlbW90ZUFyY2hpdmUsICctQycsIGRldmljZVZhdWx0UGF0aF0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcblxuICAgICAgbG9nKCdbYXBwaXVtLXRyYW5zcG9ydF0gRmx1c2hpbmcgZmlsZXN5c3RlbSBidWZmZXJzLi4uJyk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ3N5bmMnXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gICAgICBsb2coJ1thcHBpdW0tdHJhbnNwb3J0XSBDbGVhbmluZyB1cCByZW1vdGUgYXJjaGl2ZS4uLicpO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdybScsIHJlbW90ZUFyY2hpdmVdLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHJtKGxvY2FsQXJjaGl2ZSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHVtcHMgYGFkYiBsb2djYXRgIGFuZCByZXR1cm5zIHRoZSBXZWJWaWV3IGNvbnNvbGUvZXJyb3Igb3V0cHV0IGxvZ2dlZFxuICAgKiBzaW5jZSB0aGUgbWFya2VyIGZyb20ge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5iZWdpbkNvbnNvbGVDYXB0dXJlfS5cbiAgICpcbiAgICogRmlsdGVycyB0byB0aGUgQ2hyb21pdW0vV2ViVmlldyB0YWdzIHRoYXQgY2FycnkgSlMgYGNvbnNvbGUuKmAgb3V0cHV0IGFuZFxuICAgKiB1bmNhdWdodCBlcnJvcnMsIGFuZCBjYXBzIHRoZSByZXN1bHQgbGVuZ3RoLiBCb3VuZGVkLCBwb3N0LWhvYyxcbiAgICogZmFpbHVyZS1wYXRoLW9ubHkgXHUyMDE0IG5ldmVyIGEgbGl2ZSBtb25pdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gaGFuZGxlIC0gVGhlIGNhcHR1cmUgaGFuZGxlIChvciBgdW5kZWZpbmVkYCB3aGVuIGNhcHR1cmUgbmV2ZXIgc3RhcnRlZCkuXG4gICAqIEByZXR1cm5zIFRoZSBjYXB0dXJlZCBjb25zb2xlL2Vycm9yIHRleHQsIG9yIGB1bmRlZmluZWRgIGlmIG5vdGhpbmcgcmVsZXZhbnQgd2FzIGxvZ2dlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWFkQ29uc29sZUNhcHR1cmVTaW5jZShoYW5kbGU6IENvbnNvbGVDYXB0dXJlSGFuZGxlIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBkdW1wID0gYXdhaXQgZXhlYyhcbiAgICAgIFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ2xvZ2NhdCcsICctZCcsICctdicsICd0aW1lJ10sXG4gICAgICB7IGlzUXVpZXQ6IHRydWUsIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IExPR0NBVF9EVU1QX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH1cbiAgICApO1xuXG4gICAgY29uc3QgbWFya2VySW5kZXggPSBkdW1wLmxhc3RJbmRleE9mKGhhbmRsZS5tYXJrZXIpO1xuICAgIGNvbnN0IHJlZ2lvbiA9IG1hcmtlckluZGV4ID09PSAtMSA/IGR1bXAgOiBkdW1wLnNsaWNlKG1hcmtlckluZGV4ICsgaGFuZGxlLm1hcmtlci5sZW5ndGgpO1xuICAgIGNvbnN0IHJlbGV2YW50ID0gcmVnaW9uXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBDT05TT0xFX0NBUFRVUkVfVEFHX1JFLnRlc3QobGluZSkpXG4gICAgICAuam9pbignXFxuJylcbiAgICAgIC50cmltKCk7XG5cbiAgICBpZiAoIXJlbGV2YW50KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiByZWxldmFudC5zbGljZSgtQ09OU09MRV9DQVBUVVJFX1RBSUxfTUFYX0xFTkdUSCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmF1bHQgb24gbW9iaWxlIGJ5IHB1c2hpbmcgZmlsZXMgYW5kIGNvbmZpZ3VyaW5nIGxvY2FsU3RvcmFnZS5cbiAgICpcbiAgICogVGhlIHJlZ2lzdHJhdGlvbiBmbG93OlxuICAgKiAxLiBQdXNoIGEgbWluaW1hbCBgLm9ic2lkaWFuL2FwcC5qc29uYCB0byB0aGUgZGV2aWNlIHNvIE9ic2lkaWFuIHJlY29nbml6ZXMgdGhlIHZhdWx0XG4gICAqIDIuIFN3aXRjaCB0byB0aGUgV2ViVmlldyBjb250ZXh0XG4gICAqIDMuIEFkZCB0aGUgdmF1bHQgdG8gbG9jYWxTdG9yYWdlIChgbW9iaWxlLWV4dGVybmFsLXZhdWx0c2AsIGBtb2JpbGUtc2VsZWN0ZWQtdmF1bHRgLFxuICAgKiAgICBgZW5hYmxlLXBsdWdpbi08cGF0aD5gKVxuICAgKiA0LiBUcmlnZ2VyIGBsb2NhdGlvbi5yZWxvYWQoKWAgc28gT2JzaWRpYW4gcmUtcmVhZHMgbG9jYWxTdG9yYWdlIGFuZCBvcGVucyB0aGUgdmF1bHRcbiAgICogNS4gV2FpdCBmb3IgYGdsb2JhbFRoaXMuYXBwYCB0byBleGlzdCAodGhlIGFwcCdzIGNvbGQgc3RhcnQpLCB0aGVuIFx1MjAxNCBvbiBhXG4gICAqICAgIHNlcGFyYXRlLCB0aWdodGVyIGJ1ZGdldCBcdTIwMTQgZm9yIGBhcHAud29ya3NwYWNlLmxheW91dFJlYWR5YFxuICAgKlxuICAgKiBFeGlzdGluZyB2YXVsdCByZWdpc3RyYXRpb25zIGluIGxvY2FsU3RvcmFnZSBhcmUgcHJlc2VydmVkIChhcHBlbmQsIG5vdFxuICAgKiBvdmVyd3JpdGUpIFx1MjAxNCBleGNlcHQgdGhlICoqaGFybmVzcydzIG93bioqIGB0ZW1wLXZhdWx0LSpgIHJlZ2lzdHJhdGlvbnMgZnJvbVxuICAgKiBlYXJsaWVyIHJ1bnMsIHdoaWNoIGFyZSBwcnVuZWQgd2hlbiB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0Q29uZmlnLnNob3VsZFN3ZWVwTGVmdG92ZXJzfVxuICAgKiBpcyBvbi4gVGhlaXIgZGlyZWN0b3JpZXMgYXJlIGFscmVhZHkgZ29uZSAodGhlIGZhY3Rvcnkgc3dlZXBzIHRoZW0gYmVmb3JlXG4gICAqIHRoZSBhcHAgbGF1bmNoZXMpLCBhbmQgaXQgaXMgdGhpcyByZWdpc3RyeSBcdTIwMTQgbm90IHRoZSBmaWxlc3lzdGVtIFx1MjAxNCB0aGF0XG4gICAqIE9ic2lkaWFuIGVudW1lcmF0ZXMgYXQgc3RhcnR1cCwgc28gbGVhdmluZyB0aGVtIGlzIHdoYXQgbWFrZXMgZWFjaCBmYWlsZWRcbiAgICogcnVuIHNsb3cgdGhlIG5leHQgb25lIGRvd24uXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgb24gdGhlIGhvc3QgbWFjaGluZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gUmVnaXN0ZXJpbmcgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGNvbnN0IGRldmljZVZhdWx0UGF0aCA9IHRoaXMuZ2V0RGV2aWNlVmF1bHRQYXRoKHZhdWx0UGF0aCk7XG5cbiAgICAvLyBQdXNoIGEgbWluaW1hbCAub2JzaWRpYW4gZGlyZWN0b3J5IHNvIE9ic2lkaWFuIHJlY29nbml6ZXMgaXQgYXMgYSB2YXVsdC5cbiAgICBhd2FpdCB0aGlzLnB1c2hPYnNpZGlhbk1hcmtlcihkZXZpY2VWYXVsdFBhdGgpO1xuXG4gICAgLy8gU3dpdGNoIHRvIFdlYlZpZXcgYW5kIGNvbmZpZ3VyZSBsb2NhbFN0b3JhZ2UuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVXZWJWaWV3Q29udGV4dCgpO1xuXG4gICAgLy8gSW52YWxpZGF0ZSBiZWZvcmUgcmVsb2FkIFx1MjAxNCB0aGUgcGFnZSB3aWxsIG5hdmlnYXRlIGFuZCB0aGUgV2ViVmlld1xuICAgIC8vIENvbnRleHQgbWF5IGJlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlIGR1cmluZyByZWxvYWQuXG4gICAgdGhpcy5pc0luV2ViVmlld0NvbnRleHQgPSBmYWxzZTtcblxuICAgIGNvbnN0IHN0YWxlUHJlZml4ID0gdGhpcy5zaG91bGRTd2VlcExlZnRvdmVycyA/IGAke3RoaXMudmF1bHRCYXNlUGF0aH0ke1RFTVBfVkFVTFRfRElSX1BSRUZJWH1gIDogJyc7XG5cbiAgICBhd2FpdCB0aGlzLmJyb3dzZXIuZXhlY3V0ZShcbiAgICAgIChwYXRoOiBzdHJpbmcsIHBydW5lUHJlZml4OiBzdHJpbmcpID0+IHtcbiAgICAgICAgbGV0IGV4aXN0aW5nID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbW9iaWxlLWV4dGVybmFsLXZhdWx0cycpID8/ICdbXScpIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgIGlmIChwcnVuZVByZWZpeCkge1xuICAgICAgICAgIGNvbnN0IHN0YWxlID0gZXhpc3RpbmcuZmlsdGVyKChyZWdpc3RlcmVkKSA9PiByZWdpc3RlcmVkICE9PSBwYXRoICYmIHJlZ2lzdGVyZWQuc3RhcnRzV2l0aChwcnVuZVByZWZpeCkpO1xuICAgICAgICAgIGZvciAoY29uc3QgcmVnaXN0ZXJlZCBvZiBzdGFsZSkge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oYGVuYWJsZS1wbHVnaW4tJHtyZWdpc3RlcmVkfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBleGlzdGluZyA9IGV4aXN0aW5nLmZpbHRlcigocmVnaXN0ZXJlZCkgPT4gIXN0YWxlLmluY2x1ZGVzKHJlZ2lzdGVyZWQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZXhpc3RpbmcuaW5jbHVkZXMocGF0aCkpIHtcbiAgICAgICAgICBleGlzdGluZy5wdXNoKHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzJywgSlNPTi5zdHJpbmdpZnkoZXhpc3RpbmcpKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ21vYmlsZS1zZWxlY3RlZC12YXVsdCcsIHBhdGgpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgZW5hYmxlLXBsdWdpbi0ke3BhdGh9YCwgJ3RydWUnKTtcbiAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9LFxuICAgICAgZGV2aWNlVmF1bHRQYXRoLFxuICAgICAgc3RhbGVQcmVmaXhcbiAgICApO1xuXG4gICAgLy8gV2FpdCBmb3IgcmVsb2FkICsgdmF1bHQgaW5pdGlhbGl6YXRpb24sIGFzIHR3byBzZXBhcmF0ZWx5IGJ1ZGdldGVkIHBoYXNlczpcbiAgICAvLyBUaGUgYXBwJ3MgY29sZCBzdGFydCBmaXJzdCwgdGhlbiBPYnNpZGlhbidzIG93biB3b3JrLiBTZWUgYHdhaXRGb3JBcHBTdGFydGVkYC5cbiAgICBhd2FpdCB0aGlzLndhaXRGb3JBcHBTdGFydGVkKCk7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTGF5b3V0UmVhZHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIHZhdWx0IG9uIG1vYmlsZSBieSByZW1vdmluZyBpdCBmcm9tIGxvY2FsU3RvcmFnZS5cbiAgICpcbiAgICogUHJlc2VydmVzIG90aGVyIHZhdWx0IHJlZ2lzdHJhdGlvbnMuIElmIHRoZSB1bnJlZ2lzdGVyZWQgdmF1bHQgd2FzIHNlbGVjdGVkLFxuICAgKiBzd2l0Y2hlcyB0byB0aGUgZmlyc3QgcmVtYWluaW5nIHZhdWx0IChvciBjbGVhcnMgdGhlIHNlbGVjdGlvbikuXG4gICAqXG4gICAqIFRoZSB2YXVsdCdzICoqZmlsZXMgYXJlIHRoZW4gcmVtb3ZlZCBmcm9tIHRoZSBkZXZpY2Ugb3ZlciBgYWRiYCwgd2hldGhlciBvclxuICAgKiBub3QgdGhlIGBsb2NhbFN0b3JhZ2VgIHN0ZXAgc3VjY2VlZGVkKiogXHUyMDE0IGRlbGliZXJhdGVseSwgYmVjYXVzZSB0aGVcbiAgICogYGxvY2FsU3RvcmFnZWAgc3RlcCBnb2VzIHRocm91Z2ggdGhlIFdlYlZpZXcgYW5kIGEgZGVhZCBXZWJWaWV3IGlzIGV4YWN0bHlcbiAgICogd2hhdCBtb3N0IEFuZHJvaWQgZmFpbHVyZXMgYXJlLiBSb3V0aW5nIHRoZSByZW1vdmFsIHRocm91Z2ggdGhlIGFwcCB3YXMgd2hhdFxuICAgKiBtYWRlIGV2ZXJ5IGZhaWxlZCBydW4gbGVhayBpdHMgdmF1bHQgKGBWYXVsdCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiBub1xuICAgKiBzdWNoIHdpbmRvd2ApLCBzbyB0aGUgZmlsZXN5c3RlbS1sZXZlbCByZW1vdmFsIG11c3Qgbm90IGRlcGVuZCBvbiBpdC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBvbiB0aGUgaG9zdCBtYWNoaW5lLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRldmljZVZhdWx0UGF0aCA9IHRoaXMuZ2V0RGV2aWNlVmF1bHRQYXRoKHZhdWx0UGF0aCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVXZWJWaWV3Q29udGV4dCgpO1xuXG4gICAgICBhd2FpdCB0aGlzLmJyb3dzZXIuZXhlY3V0ZSgocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbW9iaWxlLWV4dGVybmFsLXZhdWx0cycpID8/ICdbXScpIGFzIHN0cmluZ1tdO1xuICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IGV4aXN0aW5nLmZpbHRlcigodikgPT4gdiAhPT0gcGF0aCk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzJywgSlNPTi5zdHJpbmdpZnkoZmlsdGVyZWQpKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oYGVuYWJsZS1wbHVnaW4tJHtwYXRofWApO1xuICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21vYmlsZS1zZWxlY3RlZC12YXVsdCcpID09PSBwYXRoKSB7XG4gICAgICAgICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdtb2JpbGUtc2VsZWN0ZWQtdmF1bHQnLCBmaWx0ZXJlZFswXSA/PyAnJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdtb2JpbGUtc2VsZWN0ZWQtdmF1bHQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIGRldmljZVZhdWx0UGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhcbiAgICAgICAgYFthcHBpdW0tdHJhbnNwb3J0XSBDb3VsZCBub3QgZGVyZWdpc3RlciAke2RldmljZVZhdWx0UGF0aH0gZnJvbSBsb2NhbFN0b3JhZ2UgYFxuICAgICAgICAgICsgYCgke1N0cmluZyhlcnJvcil9KTsgcmVtb3ZpbmcgaXRzIGZpbGVzIGFueXdheS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucmVtb3ZlRGV2aWNlVmF1bHREaXJlY3RvcnkoZGV2aWNlVmF1bHRQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIHRydXN0ZWQtaW5wdXQgY2hhbm5lbCwgaWYgb25lIGlzIG9wZW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3Bvc2VJbnB1dENoYW5uZWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuaW5wdXRDaGFubmVsO1xuICAgIHRoaXMuaW5wdXRDaGFubmVsID0gbnVsbDtcbiAgICB0aGlzLnVucmVnaXN0ZXJJbnB1dENoYW5uZWxFeGl0SGFuZGxlcigpO1xuICAgIGF3YWl0IGNoYW5uZWw/LmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgdHJ1c3RlZC1pbnB1dCBjaGFubmVsIGlmIGl0IGlzIG5vdCBhbHJlYWR5IG9wZW4sIGFuZCByZS1vcGVucyBpdCBpZiB0aGUgV2ViVmlldyB3ZW50IGF3YXkuXG4gICAqXG4gICAqIEluc3RhbGxzIGEgYFJ1bnRpbWUuYWRkQmluZGluZ2AgZnVuY3Rpb24gb24gdGhlIHBhZ2UgYW5kIHNlcnZpY2VzIGV2ZXJ5IGNhbGwgdG8gaXQgZm9yIHRoZSBsaWZlIG9mIHRoZVxuICAgKiBjb25uZWN0aW9uLiBUaGUgYmluZGluZyBpcyBleHBvc2VkIG9uICpldmVyeSogZXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIHBhZ2UsIHNvIGl0IHN1cnZpdmVzIHRoZVxuICAgKiBgbG9jYXRpb24ucmVsb2FkKClgIHRoYXQge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5yZWdpc3RlclZhdWx0fSBwZXJmb3Jtczsgb25seSBhIGZ1bGwgYXBwIHJlc3RhcnQsIHdoaWNoXG4gICAqIGRlc3Ryb3lzIHRoZSBXZWJWaWV3IHRhcmdldCwgbmVlZHMgdGhlIHJlY29ubmVjdCBiZWxvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlSW5wdXRDaGFubmVsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlucHV0Q2hhbm5lbD8uaXNPcGVuIHx8IHRoaXMuaXNJbnB1dENoYW5uZWxVbmF2YWlsYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSBjaGFubmVsIGlzIHJlYWNoYWJsZSBvbmx5IG92ZXIgbG9jYWwgYGFkYmAsIHNvIGl0IGRvZXMgbm90IGV4aXN0IG9uIGlPUyBvciBhZ2FpbnN0IGEgcmVtb3RlIGh1YlxuICAgIC8vIChCcm93c2VyU3RhY2spLiBUaG9zZSBhcmUgc3VwcG9ydGVkIHRyYW5zcG9ydHMsIHNvIHRoaXMgc3RheXMgKipiZXN0LWVmZm9ydCoqOiBhIHJ1biB0aGF0IG5ldmVyXG4gICAgLy8gRHJpdmVzIGlucHV0IG11c3Qgbm90IGZhaWwgYmVjYXVzZSB0aGUgY2hhbm5lbCBjb3VsZCBub3QgYmUgb3BlbmVkLiBBIHJ1biB0aGF0ICpkb2VzKiBkcml2ZSBpbnB1dFxuICAgIC8vIEdldHMgYSBsZWdpYmxlIGVycm9yIGZyb20gdGhlIHJlbmRlcmVyJ3Mgb3duIGd1YXJkLCB3aGljaCBuYW1lcyB0aGUgbWlzc2luZyBjaGFubmVsLlxuICAgIGlmICh0aGlzLnBsYXRmb3JtICE9PSAnYW5kcm9pZCcpIHtcbiAgICAgIHRoaXMuaXNJbnB1dENoYW5uZWxVbmF2YWlsYWJsZSA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5kaXNwb3NlSW5wdXRDaGFubmVsKCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IGNvbm5lY3RUb1dlYlZpZXdDZHAoeyBhcHBJZDogdGhpcy5hcHBJZCwgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQgfSk7XG4gICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1J1bnRpbWUuZW5hYmxlJyk7XG4gICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1J1bnRpbWUuYWRkQmluZGluZycsIHsgbmFtZTogTU9CSUxFX0lOUFVUX0JJTkRJTkdfTkFNRSB9KTtcbiAgICAgIGNvbm5lY3Rpb24ub24oJ1J1bnRpbWUuYmluZGluZ0NhbGxlZCcsIChwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgIGlmIChwYXJhbXNbJ25hbWUnXSAhPT0gTU9CSUxFX0lOUFVUX0JJTkRJTkdfTkFNRSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYXJhbXNbJ3BheWxvYWQnXTtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IG5vdCBhd2FpdGVkOiB0aGlzIHJ1bnMgd2hpbGUgdGhlIHJlbmRlcmVyJ3MgYEV4ZWN1dGUgU2NyaXB0YCBpcyBzdGlsbCBwZW5kaW5nLCBhbmRcbiAgICAgICAgLy8gVGhhdCBpcyB0aGUgd2hvbGUgcG9pbnQgXHUyMDE0IHRoZSByZXF1ZXN0IGlzIHNlcnZpY2VkIGNvbmN1cnJlbnRseSBhbmQgYW5zd2VyZWQgYnkgcmVzb2x2aW5nIHRoZVxuICAgICAgICAvLyBSZW5kZXJlcidzIHByb21pc2Ugb3ZlciB0aGlzIHNhbWUgc29ja2V0LiBJdCBoYW5kbGVzIGl0cyBvd24gZmFpbHVyZXMsIHNvIG5vdGhpbmcgcmVhY2hlcyBoZXJlLlxuICAgICAgICB0aGlzLmhhbmRsZUlucHV0UmVxdWVzdChjb25uZWN0aW9uLCB0eXBlb2YgcGF5bG9hZCA9PT0gJ3N0cmluZycgPyBwYXlsb2FkIDogJycpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAvLyBVbnJlYWNoYWJsZTogYGhhbmRsZUlucHV0UmVxdWVzdGAgbmV2ZXIgcmVqZWN0cy5cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5pbnB1dENoYW5uZWwgPSBjb25uZWN0aW9uO1xuXG4gICAgICAvLyBTZWxmLWNsZWFuaW5nLCBkZWxpYmVyYXRlbHk6IHRoaXMgdHJhbnNwb3J0IGNhbiBiZSBjcmVhdGVkIHN0cmFpZ2h0IGZyb20gYSB0ZXN0IHdvcmtlciwgd2l0aCBub1xuICAgICAgLy8gYGNvcmVTZXR1cGAgb3duaW5nIGl0cyBsaWZlY3ljbGUgYW5kIHRoZXJlZm9yZSBub3RoaW5nIHRoYXQgZXZlciBjYWxscyBgZGlzcG9zZWAvYGRpc3Bvc2VTeW5jYCBcdTIwMTRcbiAgICAgIC8vIFdoaWNoIGlzIGhvdyBhIHJ1biBsZWF2ZXMgaXRzIGFkYiBwb3J0IGZvcndhcmQgc3RyYW5kZWQgb24gdGhlIGRldmljZSAob2JzZXJ2ZWQgMjAyNi0wOC0zMCkuIFRoZVxuICAgICAgLy8gSGFuZGxlciBpcyByZW1vdmVkIGFnYWluIG9uIGRpc3Bvc2FsIHNvIHJlY29ubmVjdHMgZG8gbm90IHN0YWNrIGxpc3RlbmVycy5cbiAgICAgIHRoaXMuZGlzcG9zZUlucHV0Q2hhbm5lbE9uRXhpdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29ubmVjdGlvbi5kaXNwb3NlU3luYygpO1xuICAgICAgfTtcbiAgICAgIHByb2Nlc3Mub25jZSgnZXhpdCcsIHRoaXMuZGlzcG9zZUlucHV0Q2hhbm5lbE9uRXhpdCk7XG5cbiAgICAgIGxvZygnW2FwcGl1bS10cmFuc3BvcnRdIFRydXN0ZWQtaW5wdXQgY2hhbm5lbCBvcGVuLicpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvLyBHaXZlIHVwIGZvciB0aGUgbGlmZSBvZiB0aGUgdHJhbnNwb3J0IHJhdGhlciB0aGFuIHBheWluZyBhbiBgYWRiYCByb3VuZC10cmlwIG9uIGV2ZXJ5IGV2YWwuXG4gICAgICAvLyBBIHNvY2tldCB0aGF0IG1lcmVseSAqY2xvc2VkKiBhZnRlciBhIHN1Y2Nlc3NmdWwgY29ubmVjdCBpcyBhIGRpZmZlcmVudCBjYXNlIFx1MjAxNCBgaXNPcGVuYCBpcyBmYWxzZVxuICAgICAgLy8gVGhlcmUgd2hpbGUgdGhpcyBmbGFnIHN0YXlzIHVuc2V0LCBzbyB0aGUgcmVjb25uZWN0IGFib3ZlIHN0aWxsIHJ1bnMuXG4gICAgICB0aGlzLmlzSW5wdXRDaGFubmVsVW5hdmFpbGFibGUgPSB0cnVlO1xuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gVHJ1c3RlZCBpbnB1dCBpcyB1bmF2YWlsYWJsZSBvbiB0aGlzIGRldmljZTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3dpdGNoZXMgdGhlIGRyaXZlciB0byB0aGUgYFdFQlZJRVdfbWQub2JzaWRpYW5gIGNvbnRleHQuXG4gICAqXG4gICAqIElmIHRoZSBjb250ZXh0IHdhcyBhbHJlYWR5IHZlcmlmaWVkIChjYWNoZWQgdmlhIHtAbGluayBpc0luV2ViVmlld0NvbnRleHR9KSxcbiAgICogcmV0dXJucyBpbW1lZGlhdGVseSB3aXRob3V0IGNhbGxpbmcgYGdldENvbnRleHRzKClgIFx1MjAxNCB3aGljaCBydW5zXG4gICAqIGBhZGIgc2hlbGwgY2F0IC9wcm9jL25ldC91bml4YCBhbmQgY2FuIHRpbWUgb3V0IG9uIHNsb3cgZW11bGF0b3JzLlxuICAgKlxuICAgKiBQb2xscyB1bnRpbCB0aGUgY29udGV4dCBiZWNvbWVzIGF2YWlsYWJsZSAodGhlIGFwcCBtYXkgc3RpbGwgYmUgbG9hZGluZykuXG4gICAqIFVzZXMgdGhlIGBXRUJWSUVXX21kLm9ic2lkaWFuYCBjb250ZXh0IHNwZWNpZmljYWxseSB0byBhdm9pZCBjb25uZWN0aW5nXG4gICAqIHRvIENocm9tZSBvciBvdGhlciBXZWJWaWV3cyBvbiB0aGUgZGV2aWNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVXZWJWaWV3Q29udGV4dCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0luV2ViVmlld0NvbnRleHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aGlzLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gV2FpdGluZyBmb3IgJHtXRUJWSUVXX0NPTlRFWFRfUFJFRklYfSBjb250ZXh0ICh0aW1lb3V0PSR7U3RyaW5nKHRoaXMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMpLi4uYCk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBjb250ZXh0cyA9IGF3YWl0IHRoaXMuYnJvd3Nlci5nZXRDb250ZXh0cygpO1xuICAgICAgY29uc3Qgb2JzaWRpYW5Db250ZXh0ID0gY29udGV4dHMuZmluZCgoY29udGV4dCk6IGNvbnRleHQgaXMgc3RyaW5nID0+IHR5cGVvZiBjb250ZXh0ID09PSAnc3RyaW5nJyAmJiBjb250ZXh0LnN0YXJ0c1dpdGgoV0VCVklFV19DT05URVhUX1BSRUZJWCkpO1xuXG4gICAgICBpZiAob2JzaWRpYW5Db250ZXh0KSB7XG4gICAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIEZvdW5kIFdlYlZpZXcgY29udGV4dDogJHtvYnNpZGlhbkNvbnRleHR9YCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5icm93c2VyLnN3aXRjaENvbnRleHQob2JzaWRpYW5Db250ZXh0KTtcbiAgICAgICAgICB0aGlzLmlzSW5XZWJWaWV3Q29udGV4dCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIHN3aXRjaENvbnRleHQgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9LiBSZXNldHRpbmcgdG8gTkFUSVZFX0FQUCBiZWZvcmUgcmV0cnlpbmcuLi5gKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5icm93c2VyLnN3aXRjaENvbnRleHQoJ05BVElWRV9BUFAnKTtcbiAgICAgICAgICB9IGNhdGNoIChyZXNldEVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBOQVRJVkVfQVBQIHJlc2V0IGFsc28gZmFpbGVkOiAke1N0cmluZyhyZXNldEVycm9yKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gV2ViVmlldyBub3QgcmVhZHksIGF2YWlsYWJsZSBjb250ZXh0czogJHtKU09OLnN0cmluZ2lmeShjb250ZXh0cyl9LiBSZXRyeWluZy4uLmApO1xuICAgICAgYXdhaXQgZGVsYXkoV0VCVklFV19QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyAke1dFQlZJRVdfQ09OVEVYVF9QUkVGSVh9IGNvbnRleHQgZm91bmQgd2l0aGluICR7U3RyaW5nKHRoaXMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMuIElzIHRoZSBPYnNpZGlhbiBhcHAgZnVsbHkgbG9hZGVkP2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgb25lIEV4ZWN1dGUgU2NyaXB0IHVuZGVyIHRoZSBwZXItZXZhbCBjYXAsIHJhaXNpbmcge0BsaW5rIEV2YWxDYXBFeGNlZWRlZEVycm9yfSBpZiBpdCBvdXRsYXN0cyBpdC5cbiAgICpcbiAgICogVGhlIGNhcCBjb3ZlcnMgdGhlIHNjcmlwdCBBTE9ORSBcdTIwMTQgYGVuc3VyZVdlYlZpZXdDb250ZXh0YCBhbmQgYGVuc3VyZUlucHV0Q2hhbm5lbGAgcnVuIGJlZm9yZSBpdCxcbiAgICogYmVjYXVzZSBhIGBzd2l0Y2hDb250ZXh0YCBsZWdpdGltYXRlbHkgY29zdHMgfjE3cyAoKipMMTkqKikgYW5kIGNoYXJnaW5nIHRoYXQgdG8gYSB0ZXN0J3Mgb3duIGJ1ZGdldFxuICAgKiB3b3VsZCByZXBvcnQgdGhlIGhhcm5lc3MncyBzZXR1cCBhcyB0aGUgdGVzdCdzIG92ZXJydW4uXG4gICAqXG4gICAqIFRoZSBhYmFuZG9uZWQgcmVxdWVzdCBpcyBkZWxpYmVyYXRlbHkgbGVmdCBpbiBmbGlnaHQgcmF0aGVyIHRoYW4gY2FuY2VsbGVkLiBOb3RoaW5nIGNhbiBjYW5jZWwgaXQ6XG4gICAqIGBSdW50aW1lLnRlcm1pbmF0ZUV4ZWN1dGlvbmAgb3ZlciB0aGUgdHJhbnNwb3J0J3Mgb3duIENEUCBjaGFubmVsIHdhcyBtZWFzdXJlZCByZWxlYXNpbmcgbm90aGluZyxcbiAgICogYW5kIGEgZ3Vlc3Qtc2lkZSBhYm9ydCBob29rIGNvdWxkIG5vdCBldmVuIGJlIGluc3RhbGxlZCBpbiB0aW1lLiBXaGF0IHRoZSBzYW1lIHJ1bnMgZGlkIHNob3cgaXMgdGhhdFxuICAgKiB0aGUgc2Vzc2lvbiB1c3VhbGx5IGtlZXBzIHNlcnZpbmcgXHUyMDE0IGEgdmF1bHQgcmVhZC1iYWNrIHdhcyBhbnN3ZXJlZCA1MjhtcyBhZnRlciBvbmUgc3VjaCBhYmFuZG9ubWVudCxcbiAgICogd2l0aCB0aGUgc2Vzc2lvbiBmcmVlIFx1MjAxNCBzbyBib3VuZGluZyB0aGUgd2FpdCBjb3N0cyBhIHRlc3QgaXRzIGNsb3N1cmUsIG5vdCB0aGUgcmVzdCBvZiBpdHMgc3VpdGUuXG4gICAqXG4gICAqIEBwYXJhbSBzY3JpcHQgLSBUaGUgc2NyaXB0IHRvIHJ1biwgYWxyZWFkeSB3cmFwcGVkIGluIGl0cyBgcmV0dXJuICguLi4pYC5cbiAgICogQHJldHVybnMgVGhlIHNjcmlwdCdzIHJlc3VsdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXZhbHVhdGVXaXRoaW5DYXAoc2NyaXB0OiBzdHJpbmcpOiBQcm9taXNlPG51bGwgfCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICAvKlxuICAgICAqIFRoZSBldmFsIEFGVEVSIGFuIG92ZXJydW4gZ2V0cyBhIGdyYWNlIHBlcmlvZCBvbiB0b3Agb2YgdGhlIGNhcCwgYW5kIHRoaXMgaXMgbm90IGdlbmVyb3NpdHkuIEFwcGl1bVxuICAgICAqIFNlcmlhbGl6ZXMgY29tbWFuZHMgcGVyIHNlc3Npb24sIGFuZCBhbiBhYmFuZG9uZWQgY2xvc3VyZSBrZWVwcyBydW5uaW5nIGluIHRoZSBndWVzdCBcdTIwMTQgc28gdGhlIG5leHRcbiAgICAgKiBDb21tYW5kIHF1ZXVlcyBiZWhpbmQgd2hhdGV2ZXIgaXMgbGVmdCBvZiBpdCBhbmQsIG9uIHRoZSBiYXJlIGNhcCwgaXMgY2FwcGVkIGluIGl0cyB0dXJuLiBUaGF0IGlzXG4gICAgICogTWVhc3VyZWQ6IHdpdGggdGhlIGNhcCBmaXJpbmcgYXQgMzBzIGFnYWluc3QgYSA0MHMgY2xvc3VyZSwgdGhlIGZvbGxvd2luZyB2YXVsdCByZWFkLWJhY2sgZmFpbGVkIGF0XG4gICAgICogMzAgMjA2bXMsIHdoaWxlIHRoZSBzYW1lIHJlYWQtYmFjayBpc3N1ZWQgYWZ0ZXIgdGhlIGNsb3N1cmUgaGFkIGZpbmlzaGVkIHdhcyBhbnN3ZXJlZCBpbiA1Mjhtcy5cbiAgICAgKlxuICAgICAqIFdhaXRpbmcgb24gdGhlIGFiYW5kb25lZCByZXF1ZXN0IGluc3RlYWQgd291bGQgbm90IHdvcms6IHRoYXQgcHJvbWlzZSBpcyB0aGUgb25lIHRoYXQgbmV2ZXIgc2V0dGxlcy5cbiAgICAgKiBXaGF0IGZyZWVzIHRoZSBzZXNzaW9uIGlzIHRoZSBHVUVTVCBmaW5pc2hpbmcsIG9uIGEgc2NoZWR1bGUgdGhpcyBzaWRlIGNhbm5vdCBrbm93IFx1MjAxNCBzbyB0aGUgZ3JhY2UgaXNcbiAgICAgKiBhIGNlaWxpbmcsIG5vdCBhIGRlbGF5LiBJdCBjb3N0cyBub3RoaW5nIHdoZW4gdGhlIHNlc3Npb24gY29tZXMgYmFjayBwcm9tcHRseSwgd2hpY2ggaXMgdGhlIG5vcm0uXG4gICAgICovXG4gICAgY29uc3QgYnVkZ2V0SW5NaWxsaXNlY29uZHMgPSB0aGlzLmlzUmVjb3ZlcmluZ0Zyb21DYXBPdmVycnVuXG4gICAgICA/IHRoaXMuc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzICsgQ0FQX1JFQ09WRVJZX0dSQUNFX0lOX01JTExJU0VDT05EU1xuICAgICAgOiB0aGlzLnNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kcztcbiAgICB0aGlzLmlzUmVjb3ZlcmluZ0Zyb21DYXBPdmVycnVuID0gZmFsc2U7XG5cbiAgICBsZXQgY2FwVGltZXI6IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY2FwID0gbmV3IFByb21pc2U8bmV2ZXI+KChfcmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjYXBUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmlzUmVjb3ZlcmluZ0Zyb21DYXBPdmVycnVuID0gdHJ1ZTtcbiAgICAgICAgcmVqZWN0KFxuICAgICAgICAgIG5ldyBFdmFsQ2FwRXhjZWVkZWRFcnJvcih7XG4gICAgICAgICAgICBjYXBJbk1pbGxpc2Vjb25kczogYnVkZ2V0SW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgICBjYXVzZTogbmV3IEVycm9yKGBUaGUgQXBwaXVtIEV4ZWN1dGUgU2NyaXB0IGNhcnJ5aW5nIHRoaXMgY2xvc3VyZSBkaWQgbm90IGFuc3dlciB3aXRoaW4gJHtTdHJpbmcoYnVkZ2V0SW5NaWxsaXNlY29uZHMpfW1zLmApLFxuICAgICAgICAgICAgb3B0aW9uTmFtZTogJ3NjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kcycsXG4gICAgICAgICAgICB0cmFuc3BvcnROYW1lOiAnQW5kcm9pZCAoQXBwaXVtKSdcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSwgYnVkZ2V0SW5NaWxsaXNlY29uZHMpO1xuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICB0aGlzLmJyb3dzZXIuZXhlY3V0ZTxudWxsIHwgc3RyaW5nIHwgdW5kZWZpbmVkLCBbXT4oc2NyaXB0KSxcbiAgICAgICAgY2FwXG4gICAgICBdKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGNhcFRpbWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGNhcFRpbWVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBob3N0LXNpZGUgdmF1bHQgcGF0aCB0byB0aGUgZGV2aWNlLXNpZGUgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIEFic29sdXRlIHBhdGggb24gdGhlIGhvc3QgbWFjaGluZS5cbiAgICogQHJldHVybnMgVGhlIGRldmljZS1zaWRlIHZhdWx0IHBhdGguXG4gICAqL1xuICBwcml2YXRlIGdldERldmljZVZhdWx0UGF0aCh2YXVsdFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMudmF1bHRCYXNlUGF0aH0ke2V4dHJhY3RWYXVsdE5hbWUodmF1bHRQYXRoKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcnZpY2VzIG9uZSBpbnB1dCByZXF1ZXN0IGZyb20gdGhlIHJlbmRlcmVyOiBpbmplY3QsIHRoZW4gcmVzb2x2ZSB0aGUgcmVuZGVyZXIncyBwcm9taXNlLlxuICAgKlxuICAgKiBFdmVyeSBmYWlsdXJlIHBhdGggc3RpbGwgcmVzb2x2ZXMgdGhhdCBwcm9taXNlIFx1MjAxNCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgdGhlIHJlbmRlcmVyIHJlLXRocm93cyBcdTIwMTQgYmVjYXVzZVxuICAgKiBhIHJlcXVlc3QgdGhhdCBpcyBzaWxlbnRseSBkcm9wcGVkIHdvdWxkIGhhbmcgdGhlIGNsb3N1cmUgdW50aWwgdGhlIHdob2xlIHJ1biB0aW1lcyBvdXQsIGFuZCByZXBvcnRcbiAgICogbm90aGluZyBhYm91dCB3aHkuXG4gICAqXG4gICAqIEBwYXJhbSBjb25uZWN0aW9uIC0gVGhlIGNoYW5uZWwgdGhlIHJlcXVlc3QgYXJyaXZlZCBvbi5cbiAgICogQHBhcmFtIHBheWxvYWQgLSBUaGUgcmF3IEpTT04gcGF5bG9hZCB0aGUgYmluZGluZyB3YXMgY2FsbGVkIHdpdGguXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZUlucHV0UmVxdWVzdChjb25uZWN0aW9uOiBXZWJWaWV3Q2RwQ29ubmVjdGlvbiwgcGF5bG9hZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHJlcXVlc3RJZCA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGlkLCByZXF1ZXN0IH0gPSBKU09OLnBhcnNlKHBheWxvYWQpIGFzIE1vYmlsZUlucHV0RW52ZWxvcGU7XG4gICAgICByZXF1ZXN0SWQgPSBpZDtcblxuICAgICAgLy8gRXhhY3RseS1vbmNlIGFjcm9zcyBldmVyeSBhdHRhY2hlZCBob3N0LiBgUnVudGltZS5iaW5kaW5nQ2FsbGVkYCBpcyBicm9hZGNhc3QgdG8gQUxMIGF0dGFjaGVkXG4gICAgICAvLyBDRFAgc2Vzc2lvbnMsIHNvIHdpdGhvdXQgdGhpcyBlYWNoIHByb2Nlc3MgaW5qZWN0cyB0aGUgZ2VzdHVyZSBhZ2FpbjogbWVhc3VyZWQgMjAyNi0wOS0xMCwgYVxuICAgICAgLy8gVml0ZXN0IG1haW4gcHJvY2VzcyBhbmQgaXRzIHdvcmtlciBzZXJ2aWNlZCByZXF1ZXN0IGBpZD0xYCBpbiB0aGUgc2FtZSBtaWxsaXNlY29uZCwgYW5kIG9uZVxuICAgICAgLy8gYGNsaWNrRWxlbWVudGAgcmVhY2hlZCB0aGUgcGFnZSBhcyB0d28gYHBvaW50ZXJkb3duYCAvIGB0b3VjaHN0YXJ0YCBwYWlycy5cbiAgICAgIC8vXG4gICAgICAvLyBBIExPU0VSIE1VU1QgUkVUVVJOIFNJTEVOVExZOiB0aGUgd2lubmVyIGlzIHRoZSBvbmUgdGhhdCBpbmplY3RzIGFuZCB0aGUgb25lIHRoYXQgcmVzb2x2ZXMgdGhlXG4gICAgICAvLyBSZW5kZXJlcidzIHByb21pc2UsIHNvIGFuc3dlcmluZyBoZXJlIGFzIHdlbGwgd291bGQgcmVzb2x2ZSBhIHJlcXVlc3Qgd2hvc2UgZ2VzdHVyZSB0aGlzXG4gICAgICAvLyBQcm9jZXNzIG5ldmVyIHNlbnQuXG4gICAgICBjb25zdCBjbGFpbSA9IGF3YWl0IGNvbm5lY3Rpb24uc2VuZCgnUnVudGltZS5ldmFsdWF0ZScsIHsgZXhwcmVzc2lvbjogYnVpbGRDbGFpbUlucHV0RXhwcmVzc2lvbihpZCksIHJldHVybkJ5VmFsdWU6IHRydWUgfSk7XG4gICAgICBpZiAoIWNoZWNrSW5wdXRDbGFpbUdyYW50ZWQoY2xhaW0pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgY29ubmVjdGlvbi5zZW5kQWxsKHRvQ2RwSW5wdXRDb21tYW5kcyhyZXF1ZXN0KSk7XG4gICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1J1bnRpbWUuZXZhbHVhdGUnLCB7IGV4cHJlc3Npb246IGJ1aWxkUmVzb2x2ZUlucHV0RXhwcmVzc2lvbihpZCkgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvclRvU3RyaW5nKGVycm9yKTtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFRydXN0ZWQgaW5wdXQgZmFpbGVkOiAke21lc3NhZ2V9YCk7XG4gICAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZCgnUnVudGltZS5ldmFsdWF0ZScsIHsgZXhwcmVzc2lvbjogYnVpbGRSZXNvbHZlSW5wdXRFeHByZXNzaW9uKHJlcXVlc3RJZCwgbWVzc2FnZSkgfSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVGhlIHNvY2tldCBpcyBnb25lOyB0aGUgcmVuZGVyZXIncyBvd24gdGltZW91dCBpcyB0aGUgcmVtYWluaW5nIGJhY2tzdG9wLlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9iZXMgdGhlIFdlYlZpZXcgb25jZSBmb3IgaG93IGZhciBPYnNpZGlhbidzIHN0YXJ0dXAgaGFzIGdvdC5cbiAgICpcbiAgICogQSBwcm9iZSB0aGF0IHRocm93cyBpcyByZXBvcnRlZCBhcyBgdW5kZWZpbmVkYCByYXRoZXIgdGhhbiBwcm9wYWdhdGVkOiB0aGVcbiAgICogcGFnZSBpcyBtaWQtYGxvY2F0aW9uLnJlbG9hZCgpYCBmb3IgbW9zdCBvZiB0aGUgYXBwLXN0YXJ0IHBoYXNlLCBhbmQgYVxuICAgKiBXZWJWaWV3IHRoYXQgY2Fubm90IGFuc3dlciB5ZXQgaXMgdGhlICpleHBlY3RlZCogcmVhZGluZyB0aGVyZSwgbm90IGFuIGVycm9yLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGF0IHRoZSBwcm9iZSBzYXcsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgY291bGQgbm90IHJ1bi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvYmVTdGFydHVwKCk6IFByb21pc2U8U3RhcnR1cFByb2JlUmVzdWx0IHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJyb3dzZXIuZXhlY3V0ZSgoKTogU3RhcnR1cFByb2JlUmVzdWx0ID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkIC0tIFdlIG5lZWQgZ2xvYmFsIGBhcHBgIHZhcmlhYmxlLlxuICAgICAgICBjb25zdCBhcHAgPSBnbG9iYWxUaGlzLmFwcCBhcyBMb2FkaW5nQXBwIHwgdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhhc0FwcDogISFhcHAsXG4gICAgICAgICAgaGFzV29ya3NwYWNlOiAhIWFwcD8ud29ya3NwYWNlLFxuICAgICAgICAgIGlzTGF5b3V0UmVhZHk6ICEhYXBwPy53b3Jrc3BhY2U/LmxheW91dFJlYWR5XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1c2hlcyB0aGUgbWluaW1hbCBgLm9ic2lkaWFuL2FwcC5qc29uYCB2YXVsdCBtYXJrZXIgdmlhIGBhZGIgcHVzaGAuXG4gICAqXG4gICAqIGBicm93c2VyLnB1c2hGaWxlYCAoV2ViRHJpdmVyIGJhc2U2NCkgaXMgYW4gb3JkZXIgb2YgbWFnbml0dWRlIHNsb3dlciBvbiBhXG4gICAqIGNvbGQgb3IgbG9hZGVkIGVtdWxhdG9yIFx1MjAxNCBtZWFzdXJlZCBhdCA5XHUyMDEzMjFzIHBlciBjYWxsIGZvciB0aGlzIDItYnl0ZSBtYXJrZXIsXG4gICAqIHZlcnN1cyBzdWItc2Vjb25kIG92ZXIgYGFkYmAuIFRoaXMgbWlycm9ycyB7QGxpbmsgcHVzaEZpbGVzfSwgd2hpY2ggc3dpdGNoZWRcbiAgICogdG8gYGFkYmAgZm9yIHRoZSBzYW1lIHJlYXNvbi4gYG1rZGlyIC1wYCBndWFyYW50ZWVzIHRoZSBwYXJlbnQgZGlyZWN0b3J5LlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlVmF1bHRQYXRoIC0gVGhlIGRldmljZS1zaWRlIHZhdWx0IGRpcmVjdG9yeSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwdXNoT2JzaWRpYW5NYXJrZXIoZGV2aWNlVmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2NhbE1hcmtlciA9IGpvaW4odG1wZGlyKCksIGBvYnNpZGlhbi1tYXJrZXItJHtyYW5kb21VVUlEKCl9Lmpzb25gKTtcbiAgICBjb25zdCByZW1vdGVNYXJrZXIgPSBgJHtkZXZpY2VWYXVsdFBhdGh9Ly5vYnNpZGlhbi9hcHAuanNvbmA7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKGxvY2FsTWFya2VyLCAne30nLCAndXRmLTgnKTtcbiAgICAgIGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAnbWtkaXInLCAnLXAnLCBgJHtkZXZpY2VWYXVsdFBhdGh9Ly5vYnNpZGlhbmBdLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3B1c2gnLCBsb2NhbE1hcmtlciwgcmVtb3RlTWFya2VyXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBybShsb2NhbE1hcmtlciwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIHZhdWx0IGRpcmVjdG9yeSBmcm9tIHRoZSBkZXZpY2Ugb3ZlciBgYWRiYCwgYW5kIENIRUNLUyB0aGF0IGl0IGlzXG4gICAqIGFjdHVhbGx5IGdvbmUuXG4gICAqXG4gICAqIEJlc3QtZWZmb3J0OiBhIGZhaWx1cmUgaXMgbG9nZ2VkLCBub3QgdGhyb3duLCBzbyBhIHRlYXJkb3duIHByb2JsZW0gbmV2ZXJcbiAgICogbWFza3MgdGhlIHRlc3QgcmVzdWx0LiBUaGUgbmV4dCBydW4ncyBzdGFydC1vZi1ydW4gc3dlZXAgcGlja3MgdXAgd2hhdGV2ZXJcbiAgICogdGhpcyBjb3VsZCBub3QgcmVtb3ZlLlxuICAgKlxuICAgKiBUaGUgY2hlY2sgaXMgdGhlIHBvaW50LiBgcm0gLXJmYCBydW5zIHdpdGggYHNob3VsZElnbm9yZUV4aXRDb2RlYCwgc28gYW5cbiAgICogdW5yZW1vdmVkIGRpcmVjdG9yeSB1c2VkIHRvIGxlYXZlIG5vIHRyYWNlIGF0IGFsbCBcdTIwMTQgd2hpY2ggaXMgaG93IHJ1bnMgdGhhdFxuICAgKiBwYXNzZWQgZW5kIHRvIGVuZCB3ZXJlIHN0aWxsIGZvdW5kIHRvIGJlIGxlYWtpbmcgYSB2YXVsdCBhcGllY2UsIGludmlzaWJseSxcbiAgICogdW50aWwgc29tZW9uZSBjb3VudGVkIHRoZSBkaXJlY3RvcmllcyBvbiB0aGUgZGV2aWNlIGJ5IGhhbmQuIEEgbGVhayBpcyBub3dcbiAgICogbmFtZWQgaW4gdGhlIGxvZyBhdCB0aGUgbW9tZW50IGl0IGhhcHBlbnMuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VWYXVsdFBhdGggLSBUaGUgZGV2aWNlLXNpZGUgdmF1bHQgZGlyZWN0b3J5IHBhdGguXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlbW92ZURldmljZVZhdWx0RGlyZWN0b3J5KGRldmljZVZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFJlbW92aW5nIHZhdWx0IGRpcmVjdG9yeSBmcm9tIGRldmljZTogJHtkZXZpY2VWYXVsdFBhdGh9YCk7XG4gICAgICBhd2FpdCBleGVjKFxuICAgICAgICBbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdybScsICctcmYnLCBkZXZpY2VWYXVsdFBhdGhdLFxuICAgICAgICB7IGlzUXVpZXQ6IHRydWUsIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IEFEQl9WQVVMVF9SRU1PVkVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfVxuICAgICAgKTtcblxuICAgICAgY29uc3QgbGlzdGluZyA9IGF3YWl0IGV4ZWMoXG4gICAgICAgIFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ2xzJywgJy1kJywgZGV2aWNlVmF1bHRQYXRoXSxcbiAgICAgICAgeyBpc1F1aWV0OiB0cnVlLCBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZSwgdGltZW91dEluTWlsbGlzZWNvbmRzOiBBREJfVkFVTFRfUkVNT1ZFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH1cbiAgICAgICk7XG5cbiAgICAgIGlmIChsaXN0aW5nLmluY2x1ZGVzKGRldmljZVZhdWx0UGF0aCkpIHtcbiAgICAgICAgbG9nKFxuICAgICAgICAgIGBbYXBwaXVtLXRyYW5zcG9ydF0gV2FybmluZzogJHtkZXZpY2VWYXVsdFBhdGh9IHN1cnZpdmVkIHJlbW92YWwgYW5kIGlzIG5vdyBsZWFrZWQgcmVzaWR1ZS4gYFxuICAgICAgICAgICAgKyAnVGhlIG5leHQgcnVuXFwncyBzdGFydC1vZi1ydW4gc3dlZXAgd2lsbCByZXRyeSBpdC4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFZhdWx0IGRpcmVjdG9yeSByZW1vdmFsIGZhaWxlZCAobm9uLWZhdGFsKTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wcyB0aGUgYHByb2Nlc3Mub24oJ2V4aXQnKWAgaGFuZGxlciB0aGF0IHdvdWxkIG90aGVyd2lzZSBjbG9zZSBhbiBhbHJlYWR5LWNsb3NlZCBjaGFubmVsLCBhbmQgd291bGRcbiAgICogc3RhY2sgYSBsaXN0ZW5lciBwZXIgcmVjb25uZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSB1bnJlZ2lzdGVySW5wdXRDaGFubmVsRXhpdEhhbmRsZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpc3Bvc2VJbnB1dENoYW5uZWxPbkV4aXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwcm9jZXNzLm9mZignZXhpdCcsIHRoaXMuZGlzcG9zZUlucHV0Q2hhbm5lbE9uRXhpdCk7XG4gICAgdGhpcy5kaXNwb3NlSW5wdXRDaGFubmVsT25FeGl0ID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xscyB1bnRpbCBgZ2xvYmFsVGhpcy5hcHBgIGV4aXN0cyBpbiB0aGUgV2ViVmlldyBcdTIwMTQgdGhlIGFwcCBoYXMgZmluaXNoZWRcbiAgICogaXRzIGNvbGQgc3RhcnQgYW5kIE9ic2lkaWFuJ3Mgb3duIGJvb3QgaGFzIGJlZ3VuLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSAqKmZpcnN0Kiogb2YgdGhlIHR3byBidWRnZXRzIHNwZW50IGFmdGVyIGBsb2NhdGlvbi5yZWxvYWQoKWAsXG4gICAqIGFuZCB0aGUgZ2VuZXJvdXMgb25lLiBFdmVyeXRoaW5nIGl0IHBheXMgZm9yIGlzIG91dHNpZGUgT2JzaWRpYW4ncyBjb250cm9sOlxuICAgKiB0aGUgV2ViVmlldyByZWxvYWRpbmcsIGFuZCBhIGd1ZXN0IHRoYXQgbWF5IHN0aWxsIGJlIG9wdGltaXppbmcgcGFja2FnZXMuXG4gICAqIEtlZXBpbmcgaXQgc2VwYXJhdGUgaXMgdGhlIHBvaW50IG9mIHRoZSBzcGxpdCBcdTIwMTQgdGhlIG9sZCBzaW5nbGUgd2FsbCBjbG9ja1xuICAgKiBzdGFydGVkIGhlcmUgYW5kIGxlZnQgdGhlIHRpZ2h0IGxheW91dCBidWRnZXQgcGF5aW5nIGZvciBhIGNvbGQgc3RhcnQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JBcHBTdGFydGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFdhaXRpbmcgZm9yIHRoZSBhcHAgdG8gc3RhcnQgKHRpbWVvdXQ9JHtTdHJpbmcodGhpcy5hcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMpLi4uYCk7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yU3RhcnR1cE1pbGVzdG9uZSh7XG4gICAgICBpc1NhdGlzZmllZDogY2hlY2tBcHBTdGFydGVkLFxuICAgICAgcGhhc2U6ICdhcHAtc3RhcnQnLFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiB0aGlzLmFwcFN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdW50aWwgYGFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHlgIGlzIGB0cnVlYCBpbiB0aGUgV2ViVmlldy5cbiAgICpcbiAgICogVGhlICoqc2Vjb25kKiogYnVkZ2V0LCBhbmQgdGhlIHRpZ2h0IG9uZTogYnkgdGhlIHRpbWUgaXQgc3RhcnRzLCB0aGUgYXBwIGlzXG4gICAqIGFscmVhZHkgdXAsIHNvIGFsbCBpdCBjb3ZlcnMgaXMgT2JzaWRpYW4gb3BlbmluZyB0aGUgdmF1bHQgYW5kIGxvYWRpbmdcbiAgICogcGx1Z2lucyBcdTIwMTQgfjFzIGluIHByYWN0aWNlLCBcdTIyNjQ4LjRzIHVuZGVyIGhlYXZ5IGhvc3Qgc3RyZXNzICgqKkwxOSoqKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckxheW91dFJlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFdhaXRpbmcgZm9yIGxheW91dCByZWFkeSAodGltZW91dD0ke1N0cmluZyh0aGlzLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzKX1tcykuLi5gKTtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JTdGFydHVwTWlsZXN0b25lKHtcbiAgICAgIGlzU2F0aXNmaWVkOiBjaGVja0xheW91dFJlYWR5LFxuICAgICAgcGhhc2U6ICdsYXlvdXQtcmVhZHknLFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiB0aGlzLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdGhlIFdlYlZpZXcgdW50aWwgYSBzdGFydHVwIHBoYXNlJ3MgbWlsZXN0b25lIGlzIHNhdGlzZmllZCwgdHJhY2tpbmdcbiAgICogdGhlIGV2aWRlbmNlIHRoYXQgdGVsbHMgYSBzbG93IE9ic2lkaWFuIGZyb20gYSBjb250ZW5kZWQgZ3Vlc3QuXG4gICAqXG4gICAqIEVhY2ggcG9sbCBjb3N0cyBleGFjdGx5IG9uZSBgYnJvd3Nlci5leGVjdXRlYCByb3VuZC10cmlwIFx1MjAxNCBkZWxpYmVyYXRlbHkgbm90XG4gICAqIGFuIHtAbGluayBlbnN1cmVXZWJWaWV3Q29udGV4dH0gY2FsbCwgd2hvc2UgYGdldENvbnRleHRzKClgIHJ1bnNcbiAgICogYGFkYiBzaGVsbCBjYXQgL3Byb2MvbmV0L3VuaXhgIGFuZCB3YXMgbWVhc3VyZWQgYXQgfjE3cyBwZXIgKipMMTkqKi4gVGhlXG4gICAqIHJvdW5kLXRyaXAgaXMgdGltZWQsIGFuZCB0aGUgc2xvd2VzdCBvbmUgaXMgcmVwb3J0ZWQgb24gdGltZW91dDogYSBwaGFzZVxuICAgKiB0aGF0IHJhbiBvdXQgYWZ0ZXIgYSBoYW5kZnVsIG9mIHByb2JlcyBlYWNoIHRha2luZyB0ZW5zIG9mIHNlY29uZHMgd2FzXG4gICAqIHN0YXJ2ZWQgYnkgdGhlIGd1ZXN0LCBub3QgYnkgT2JzaWRpYW4uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGhhc2UsIGl0cyBidWRnZXQsIGFuZCB0aGUgcHJlZGljYXRlIHRoYXQgZW5kcyBpdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvclN0YXJ0dXBNaWxlc3RvbmUocGFyYW1zOiBXYWl0Rm9yU3RhcnR1cE1pbGVzdG9uZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgaXNTYXRpc2ZpZWQsIHBoYXNlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHMgfSA9IHBhcmFtcztcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBzdGFydCArIHRpbWVvdXRJbk1pbGxpc2Vjb25kcztcblxuICAgIGxldCBmdXJ0aGVzdE1pbGVzdG9uZTogQXBwU3RhcnR1cE1pbGVzdG9uZSA9ICduby13ZWJ2aWV3JztcbiAgICBsZXQgcG9sbENvdW50ID0gMDtcbiAgICBsZXQgc2xvd2VzdFJvdW5kVHJpcEluTWlsbGlzZWNvbmRzID0gMDtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGNvbnN0IHJvdW5kVHJpcFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IG1pbGVzdG9uZSA9IGNsYXNzaWZ5QXBwU3RhcnR1cFByb2JlKGF3YWl0IHRoaXMucHJvYmVTdGFydHVwKCkpO1xuICAgICAgY29uc3Qgcm91bmRUcmlwSW5NaWxsaXNlY29uZHMgPSBEYXRlLm5vdygpIC0gcm91bmRUcmlwU3RhcnQ7XG5cbiAgICAgIHBvbGxDb3VudCsrO1xuICAgICAgc2xvd2VzdFJvdW5kVHJpcEluTWlsbGlzZWNvbmRzID0gTWF0aC5tYXgoc2xvd2VzdFJvdW5kVHJpcEluTWlsbGlzZWNvbmRzLCByb3VuZFRyaXBJbk1pbGxpc2Vjb25kcyk7XG4gICAgICBpZiAoY29tcGFyZUFwcFN0YXJ0dXBNaWxlc3RvbmVzKG1pbGVzdG9uZSwgZnVydGhlc3RNaWxlc3RvbmUpID4gMCkge1xuICAgICAgICBmdXJ0aGVzdE1pbGVzdG9uZSA9IG1pbGVzdG9uZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzU2F0aXNmaWVkKG1pbGVzdG9uZSkpIHtcbiAgICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gUGhhc2UgXCIke3BoYXNlfVwiIHNhdGlzZmllZCBhZnRlciAke1N0cmluZyhEYXRlLm5vdygpIC0gc3RhcnQpfW1zICgke1N0cmluZyhwb2xsQ291bnQpfSBwcm9iZShzKSkuYCk7XG4gICAgICAgIHRoaXMuaXNJbldlYlZpZXdDb250ZXh0ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsb2coXG4gICAgICAgIGBbYXBwaXVtLXRyYW5zcG9ydF0gUGhhc2UgXCIke3BoYXNlfVwiIG5vdCBzYXRpc2ZpZWQgeWV0OiAke21pbGVzdG9uZX0gYFxuICAgICAgICAgICsgYChlbGFwc2VkPSR7U3RyaW5nKERhdGUubm93KCkgLSBzdGFydCl9bXMsIHJvdW5kLXRyaXA9JHtTdHJpbmcocm91bmRUcmlwSW5NaWxsaXNlY29uZHMpfW1zKS4gUmV0cnlpbmcuLi5gXG4gICAgICApO1xuICAgICAgYXdhaXQgZGVsYXkoTEFZT1VUX1JFQURZX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYnVpbGRTdGFydHVwVGltZW91dE1lc3NhZ2Uoe1xuICAgICAgZWxhcHNlZEluTWlsbGlzZWNvbmRzOiBEYXRlLm5vdygpIC0gc3RhcnQsXG4gICAgICBtaWxlc3RvbmU6IGZ1cnRoZXN0TWlsZXN0b25lLFxuICAgICAgcGhhc2UsXG4gICAgICBwb2xsQ291bnQsXG4gICAgICBzbG93ZXN0Um91bmRUcmlwSW5NaWxsaXNlY29uZHMsXG4gICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICB9KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBnaXZlbiBkZWxheS5cbiAqXG4gKiBAcGFyYW0gbXMgLSBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGRlbGF5LlxuICovXG5mdW5jdGlvbiBkZWxheShtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgdmF1bHQgZGlyZWN0b3J5IG5hbWUgZnJvbSBhIGhvc3Qtc2lkZSB2YXVsdCBwYXRoLlxuICpcbiAqIEBwYXJhbSB2YXVsdFBhdGggLSBBYnNvbHV0ZSBwYXRoIG9uIHRoZSBob3N0IG1hY2hpbmUuXG4gKiBAcmV0dXJucyBUaGUgbGFzdCBwYXRoIHNlZ21lbnQgKHZhdWx0IGRpcmVjdG9yeSBuYW1lKS5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFZhdWx0TmFtZSh2YXVsdFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YXVsdFBhdGgucmVwbGFjZSgvW1xcXFwvXSskLywgJycpO1xuICBjb25zdCBsYXN0U2VwYXJhdG9yID0gTWF0aC5tYXgobm9ybWFsaXplZC5sYXN0SW5kZXhPZignLycpLCBub3JtYWxpemVkLmxhc3RJbmRleE9mKCdcXFxcJykpO1xuICByZXR1cm4gbm9ybWFsaXplZC5zbGljZShs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
|
|
770
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1hcHBpdW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBcHBpdW0gdHJhbnNwb3J0IFx1MjAxNCBldmFsdWF0ZXMgZXhwcmVzc2lvbnMgaW5zaWRlIE9ic2lkaWFuIE1vYmlsZSB2aWEgV2ViVmlld1xuICogSmF2YVNjcmlwdCBpbmplY3Rpb24uIE1hbmFnZXMgdmF1bHQgbGlmZWN5Y2xlIHZpYSBsb2NhbFN0b3JhZ2UgYW5kIGZpbGUgcHVzaC5cbiAqXG4gKiBDb25maWd1cmVkIHZpYSBgZW52aXJvbm1lbnRPcHRpb25zLm9ic2lkaWFuVHJhbnNwb3J0YCBpbiB2aXRlc3QgY29uZmlnOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIHZpdGVzdC5jb25maWcudHNcbiAqIGVudmlyb25tZW50T3B0aW9uczoge1xuICogICBvYnNpZGlhblRyYW5zcG9ydDoge1xuICogICAgIHR5cGU6ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bScsXG4gKiAgICAgYXBwaXVtVXJsOiAnaHR0cDovL2xvY2FsaG9zdDo0NzIzJyxcbiAqICAgICBhdmROYW1lOiAnb2JzaWRpYW5fdGVzdCcsXG4gKiAgIH0sXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBGb3IgQnJvd3NlclN0YWNrLCBzZXQgYGFwcGl1bVVybGAgdG8gdGhlIEJyb3dzZXJTdGFjayBodWIgVVJMXG4gKiBcdTIwMTQgdGhlIHRyYW5zcG9ydCBpdHNlbGYgaXMgaHViLWFnbm9zdGljLlxuICpcbiAqICMjIEhvdyB2YXVsdCByZWdpc3RyYXRpb24gd29ya3Mgb24gbW9iaWxlXG4gKlxuICogT2JzaWRpYW4gTW9iaWxlIHN0b3JlcyBpdHMgdmF1bHQgcmVnaXN0cnkgaW4gdGhlIFdlYlZpZXcncyBgbG9jYWxTdG9yYWdlYDpcbiAqXG4gKiAtIGBtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzYCBcdTIwMTQgSlNPTiBhcnJheSBvZiByZWdpc3RlcmVkIHZhdWx0IHBhdGhzXG4gKiAtIGBtb2JpbGUtc2VsZWN0ZWQtdmF1bHRgIFx1MjAxNCB0aGUgY3VycmVudGx5IGFjdGl2ZSB2YXVsdCBwYXRoXG4gKiAtIGBlbmFibGUtcGx1Z2luLTx2YXVsdFBhdGg+YCBcdTIwMTQgYFwidHJ1ZVwiYCB0byBlbmFibGUgdGhlIHBsdWdpbiBzeXN0ZW0gZm9yIHRoZSB2YXVsdFxuICpcbiAqIFRvIHJlZ2lzdGVyIGEgdmF1bHQgcHJvZ3JhbW1hdGljYWxseSAod2l0aG91dCBVSSBpbnRlcmFjdGlvbik6XG4gKlxuICogMS4gUHVzaCB2YXVsdCBmaWxlcyB0byB0aGUgZGV2aWNlIChlLmcuIGAvc2RjYXJkL0RvY3VtZW50cy88TmFtZT4vLm9ic2lkaWFuL2FwcC5qc29uYClcbiAqIDIuIFN3aXRjaCB0byBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dFxuICogMy4gU2V0IHRoZSBsb2NhbFN0b3JhZ2UgZW50cmllc1xuICogNC4gQ2FsbCBgbG9jYXRpb24ucmVsb2FkKClgIFx1MjAxNCBPYnNpZGlhbiByZS1yZWFkcyBsb2NhbFN0b3JhZ2UgYW5kIG9wZW5zIHRoZSB2YXVsdFxuICpcbiAqIFRoaXMgYXZvaWRzIHRoZSBvbmJvYXJkaW5nIGZsb3cgZW50aXJlbHkuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHR5cGUgeyBCcm93c2VyIH0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgcm0sXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwU3RhcnR1cE1pbGVzdG9uZSxcbiAgQXBwU3RhcnR1cFBoYXNlLFxuICBTdGFydHVwUHJvYmVSZXN1bHRcbn0gZnJvbSAnLi9hcHAtc3RhcnR1cC1wcm9ncmVzcy5tanMnO1xuaW1wb3J0IHR5cGUgeyBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyB9IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IE1vYmlsZUlucHV0RW52ZWxvcGUgfSBmcm9tICcuL21vYmlsZS1pbnB1dC5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBDb25zb2xlQ2FwdHVyZUhhbmRsZSxcbiAgT2JzaWRpYW5UcmFuc3BvcnQsXG4gIFRyYW5zcG9ydEV2YWxPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IFdlYlZpZXdDZHBDb25uZWN0aW9uIH0gZnJvbSAnLi93ZWJ2aWV3LWNkcC5tanMnO1xuXG5pbXBvcnQge1xuICBidWlsZFN0YXJ0dXBUaW1lb3V0TWVzc2FnZSxcbiAgY2hlY2tBcHBTdGFydGVkLFxuICBjaGVja0xheW91dFJlYWR5LFxuICBjbGFzc2lmeUFwcFN0YXJ0dXBQcm9iZSxcbiAgY29tcGFyZUFwcFN0YXJ0dXBNaWxlc3RvbmVzXG59IGZyb20gJy4vYXBwLXN0YXJ0dXAtcHJvZ3Jlc3MubWpzJztcbmltcG9ydCB7XG4gIGRlY29kZUJhc2U2NFBuZyxcbiAgaXNQbmdcbn0gZnJvbSAnLi9jYXB0dXJlLXNjcmVlbnNob3QubWpzJztcbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICcuL2Vycm9yLXRvLXN0cmluZy5tanMnO1xuaW1wb3J0IHtcbiAgRXZhbENhcEV4Y2VlZGVkRXJyb3IsXG4gIGlzU2NyaXB0VGltZW91dEVycm9yXG59IGZyb20gJy4vZXZhbC1jYXAtZXhjZWVkZWQtZXJyb3IubWpzJztcbmltcG9ydCB7IERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTIH0gZnJvbSAnLi9ldmFsLWNhcC5tanMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5tanMnO1xuaW1wb3J0IHsgVEVNUF9WQVVMVF9ESVJfUFJFRklYIH0gZnJvbSAnLi9sZWZ0b3Zlci1jbGVhbnVwLm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuaW1wb3J0IHtcbiAgYnVpbGRDbGFpbUlucHV0RXhwcmVzc2lvbixcbiAgYnVpbGRSZXNvbHZlSW5wdXRFeHByZXNzaW9uLFxuICBjaGVja0lucHV0Q2xhaW1HcmFudGVkLFxuICBNT0JJTEVfSU5QVVRfQklORElOR19OQU1FLFxuICB0b0NkcElucHV0Q29tbWFuZHNcbn0gZnJvbSAnLi9tb2JpbGUtaW5wdXQubWpzJztcbmltcG9ydCB7IGNvbm5lY3RUb1dlYlZpZXdDZHAgfSBmcm9tICcuL3dlYnZpZXctY2RwLm1qcyc7XG5cbi8qKlxuICogU2Vzc2lvbiBjb25uZWN0aW9uIGluZm8gcmV0dXJuZWQgYnkge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5nZXRTZXNzaW9uSW5mb30sXG4gKiB1c2VkIHRvIHJlYXR0YWNoIGZyb20gYW5vdGhlciBwcm9jZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGl1bVNlc3Npb25JbmZvIHtcbiAgLyoqXG4gIFRoZSBkZXZpY2UgVURJRCAoZS5nLiBgJ2VtdWxhdG9yLTU1NTQnYCkuXG4gICAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgQXBwaXVtL1dlYkRyaXZlciBzZXNzaW9uIElELlxuICAgKi9cbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIEFwcGl1bSB0cmFuc3BvcnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwaXVtVHJhbnNwb3J0Q29uZmlnIHtcbiAgLyoqXG4gICAqIEFwcCBwYWNrYWdlIChBbmRyb2lkKSBvciBidW5kbGUgSUQgKGlPUykuXG4gICAqIERlZmF1bHRzIHRvIGAnbWQub2JzaWRpYW4nYC5cbiAgICovXG4gIGFwcElkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgT2JzaWRpYW4gTW9iaWxlIHRvIGdldCBhcyBmYXIgYXMgYGdsb2JhbFRoaXMuYXBwYFxuICAgKiBleGlzdGluZyBhZnRlciB0aGUgdmF1bHQgaXMgKHJlKW9wZW5lZCwgYmVmb3JlIHRoZSB0aWdodGVyXG4gICAqIHtAbGluayBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kc30gY2xvY2sgc3RhcnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTgwMDAwYFxuICAgKi9cbiAgYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBBcHBpdW0gYnJvd3Nlci9kcml2ZXIgaW5zdGFuY2UuXG4gICAqIENyZWF0ZWQgYnkgdGhlIGNvbnN1bWVyIHZpYSBlLmcuIFdlYkRyaXZlcklPJ3MgYHJlbW90ZSgpYC5cbiAgICovXG4gIGJyb3dzZXI6IEJyb3dzZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgVURJRCAoZS5nLiBgJ2VtdWxhdG9yLTU1NTQnYCkuXG4gICAqIFVzZWQgZm9yIGBhZGJgIGNvbW1hbmRzIHdoZW4gcHVzaGluZyBmaWxlcyB0byB0aGUgZGV2aWNlLlxuICAgKi9cbiAgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBvd25zIHRoZSBBcHBpdW0gc2Vzc2lvbiBhbmQgc2hvdWxkIGRlbGV0ZSBpdCBvblxuICAgKiB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0LmRpc3Bvc2V9LlxuICAgKlxuICAgKiBgdHJ1ZWAgZm9yIHNlc3Npb25zIGNyZWF0ZWQgdmlhIGByZW1vdGUoKWAgKGdsb2JhbCBzZXR1cCkuXG4gICAqIGBmYWxzZWAgZm9yIHNlc3Npb25zIHJlYXR0YWNoZWQgdmlhIGBhdHRhY2goKWAgKHRlc3Qgd29ya2VycykuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgaXNTZXNzaW9uT3duZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgYGFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHlgLCBjb3VudGVkXG4gICAqIGZyb20gdGhlIG1vbWVudCB7QGxpbmsgYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHN9IGlzIHNhdGlzZmllZCBcdTIwMTQgbm90IGZyb21cbiAgICogdGhlIHJlbG9hZCwgc28gYSBjb2xkIGFwcCBzdGFydCBpcyBub3QgY2hhcmdlZCBhZ2FpbnN0IGl0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgOTAwMDBgXG4gICAqL1xuICBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGFyZ2V0IHBsYXRmb3JtLiBEZXRlcm1pbmVzIFdlYlZpZXcgY29udGV4dCBuYW1pbmcgYW5kIGRldmljZSBmaWxlIHBhdGhzLlxuICAgKi9cbiAgcGxhdGZvcm06ICdhbmRyb2lkJyB8ICdpb3MnO1xuXG4gIC8qKlxuICAgKiBUaGUgcGVyLXNjcmlwdCBjYXAsIGluIG1pbGxpc2Vjb25kcywgdGhpcyBzZXNzaW9uIHdhcyBnaXZlbiBhcyBpdHMgVzNDXG4gICAqIGB0aW1lb3V0cy5zY3JpcHRgIGNhcGFiaWxpdHkuXG4gICAqXG4gICAqIENhcnJpZWQgb25seSBzbyBhIHNjcmlwdCB0aW1lb3V0IGNhbiBiZSByZXBvcnRlZCB3aXRoIHRoZSBudW1iZXIgdGhhdFxuICAgKiBwcm9kdWNlZCBpdDsgdGhlIGNhcGFiaWxpdHkgaXRzZWxmIGlzIHNldCB3aGVuIHRoZSBzZXNzaW9uIGlzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAzMDAwMGBcbiAgICovXG4gIHNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciByZWdpc3RlcmluZyBhIHZhdWx0IGFsc28gcHJ1bmVzIHRoZSAqKm90aGVyKiogYHRlbXAtdmF1bHQtKmBcbiAgICogcmVnaXN0cmF0aW9ucyBlYXJsaWVyIHJ1bnMgbGVmdCBpbiBPYnNpZGlhbiBNb2JpbGUncyBgbG9jYWxTdG9yYWdlYC5cbiAgICpcbiAgICogVGhlIGRldmljZS1zaWRlIGRpcmVjdG9yaWVzIGFyZSBzd2VwdCBiZWZvcmUgdGhlIGFwcCBsYXVuY2hlcyAoc2VlIHRoZVxuICAgKiBmYWN0b3J5KTsgdGhpcyByZW1vdmVzIHRoZWlyIG5vdy1kYW5nbGluZyByZWdpc3RyeSBlbnRyaWVzLCB3aGljaCBhcmUgd2hhdFxuICAgKiBPYnNpZGlhbiBhY3R1YWxseSBlbnVtZXJhdGVzIGF0IHN0YXJ0dXAuIFVucmVnaXN0ZXJpbmcgdGhpcyBydW4ncyBvd24gdmF1bHRcbiAgICogaXMgdW5hZmZlY3RlZCBcdTIwMTQgdGhhdCBhbHdheXMgaGFwcGVucy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICBzaG91bGRTd2VlcExlZnRvdmVycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEJhc2UgcGF0aCBvbiB0aGUgZGV2aWNlIHdoZXJlIE9ic2lkaWFuIHN0b3JlcyB2YXVsdHMuXG4gICAqXG4gICAqIERlZmF1bHRzOlxuICAgKiAtIEFuZHJvaWQ6IGAvc2RjYXJkL0RvY3VtZW50cy9gXG4gICAqIC0gaU9TOiBgQG1kLm9ic2lkaWFuOmRvY3VtZW50cy9gXG4gICAqL1xuICB2YXVsdEJhc2VQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgdGhlIFdlYlZpZXcgY29udGV4dCB0byBiZWNvbWUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDBgXG4gICAqL1xuICB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG5jb25zdCBOT19PVVRQVVQgPSAnKG5vIG91dHB1dCknO1xuY29uc3QgQVBQX1NUQVRFX0ZPUkVHUk9VTkQgPSA0O1xuY29uc3QgV0VCVklFV19DT05URVhUX1BSRUZJWCA9ICdXRUJWSUVXX21kLm9ic2lkaWFuJztcbmNvbnN0IFdFQlZJRVdfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBERUZBVUxUX1dFQlZJRVdfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwXzAwMDtcbmNvbnN0IExBWU9VVF9SRUFEWV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IERFRkFVTFRfTEFZT1VUX1JFQURZX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA5MF8wMDA7XG5jb25zdCBERUZBVUxUX0FQUF9TVEFSVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTgwXzAwMDtcbmNvbnN0IEFQUF9SRVNUQVJUX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBERUZBVUxUX0FQUF9JRCA9ICdtZC5vYnNpZGlhbic7XG5jb25zdCBBREJfVkFVTFRfUkVNT1ZFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzBfMDAwO1xuLypcbiAqIEV4dHJhIGJ1ZGdldCBncmFudGVkIHRvIHRoZSBPTkUgZXZhbCB0aGF0IGZvbGxvd3MgYSBjYXAgb3ZlcnJ1biwgb24gdG9wIG9mIHRoZSBjYXAgaXRzZWxmLiBUaGVcbiAqIGFiYW5kb25lZCBjbG9zdXJlIGtlZXBzIHJ1bm5pbmcgaW4gdGhlIGd1ZXN0LCBhbmQgQXBwaXVtIHNlcmlhbGl6ZXMgY29tbWFuZHMgcGVyIHNlc3Npb24sIHNvIHRoZSBuZXh0XG4gKiBjb21tYW5kIHdhaXRzIG91dCB3aGF0ZXZlciBpcyBsZWZ0IG9mIGl0LiBTaXplZCBhdCB0aGUgZGVmYXVsdCBjYXAgYWdhaW4gXHUyMDE0IGRlcml2ZWQgZnJvbSBpdCByYXRoZXIgdGhhblxuICogcmVzdGF0ZWQsIHNvIHRoZSB0d28gY2Fubm90IGRyaWZ0IFx1MjAxNCB3aGljaCBpcyBhIHByYWdtYXRpYyBjZWlsaW5nIHJhdGhlciB0aGFuIGEgcHJvb2Y6IGEgY2xvc3VyZSBjYW5cbiAqIG91dHJ1biBhbnkgbnVtYmVyIHBpY2tlZCBoZXJlLiBJdCBkb2VzIG5vdCBuZWVkIHRvIGJlIGEgcHJvb2YsIGJlY2F1c2UgYSBndWVzdCB0aGF0IGlzIHN0aWxsIGJ1c3kgYWZ0ZXJcbiAqIGl0IHNpbXBseSBwcm9kdWNlcyBhbm90aGVyIG92ZXJydW4gb24gdGhlIG5leHQgZXZhbCwgd2hpY2ggaXMgZ3JhbnRlZCB0aGUgZ3JhY2UgaW4gdHVybiBcdTIwMTQgc28gdGhlIHNlc3Npb25cbiAqIHJlY292ZXJzIG92ZXIgc3VjY2Vzc2l2ZSBldmFscyBpbnN0ZWFkIG9mIGNvbXBvdW5kaW5nLCBhbmQgZXZlcnkgb25lIG9mIHRob3NlIGV2YWxzIHJlcG9ydHMgdGhlIHNhbWVcbiAqIGhvbmVzdCBkaWFnbm9zaXMuXG4gKi9cbmNvbnN0IENBUF9SRUNPVkVSWV9HUkFDRV9JTl9NSUxMSVNFQ09ORFMgPSBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EUztcblxuLy8gLS0tIENvbnNvbGUgY2FwdHVyZSAoTGF5ZXIgMiBvZiB0aGUgcGx1Z2luLWxvYWQgZXJyb3Igc3VyZmFjaW5nKSAtLS1cbi8qKlxuICogVGhlIGBsb2djYXRgIHRhZyBzdGFtcGVkIGF0IGNhcHR1cmUgc3RhcnQsIGFuZCB0aGUgcHJlZml4IG9mIHRoZSB1bmlxdWUgbWFya2VyIHdyaXR0ZW4gdW5kZXIgaXQuXG4gKlxuICogUHJvY2Vzcy1sb2NhbCByYXRoZXIgdGhhbiBhIHByb3RvY29sOiBgYmVnaW5Db25zb2xlQ2FwdHVyZWAgd3JpdGVzIGl0IGFuZCBgcmVhZENvbnNvbGVDYXB0dXJlU2luY2VgIHNlYXJjaGVzIHRoZSBkdW1wIGZvclxuICogdGhlIHNhbWUgc3RyaW5nLCBib3RoIGZyb20gdGhpcyBjb25zdGFudCwgc28gdGhlIHZhbHVlIGlzIGZyZWUgdG8gY2hhbmdlLiBJdCBvbmx5IGhhcyB0byBiZSB1bmxpa2VseSB0byBvY2N1ciBpbiBhblxuICogdW5yZWxhdGVkIGxvZyBsaW5lLlxuICovXG5jb25zdCBDT05TT0xFX0NBUFRVUkVfTUFSS0VSX1RBRyA9ICdPQlNJRElBTl9JTlRFR1JBVElPTl9URVNUSU5HX0NBUFRVUkUnO1xuY29uc3QgQ09OU09MRV9DQVBUVVJFX1RBSUxfTUFYX0xFTkdUSCA9IDgwMDA7XG5jb25zdCBBREJfTE9HX01BUktFUl9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBMT0dDQVRfRFVNUF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwXzAwMDtcbi8qKlxuICogYGFkYiBsb2djYXQgLXYgdGltZWAgbGluZXMgbG9vayBsaWtlIGBNTS1ERCBISDpNTTpTUy5tbW0gTEVWRUwvVEFHKCBQSUQpOiBtZXNzYWdlYC5cbiAqIEtlZXAgb25seSB0aGUgdGFncyBDaHJvbWl1bS9XZWJWaWV3IHJvdXRlcyBKUyBgY29uc29sZS4qYCBvdXRwdXQgYW5kIHVuY2F1Z2h0XG4gKiBlcnJvcnMgdG8gKGBjaHJvbWl1bWAsIHRoZSBDYXBhY2l0b3IgY29uc29sZSBicmlkZ2UsIGFuZCBuYXRpdmUgYEFuZHJvaWRSdW50aW1lYCkuXG4gKi9cbmNvbnN0IENPTlNPTEVfQ0FQVFVSRV9UQUdfUkUgPSAvXFwvKD86Y2hyb21pdW18QW5kcm9pZFJ1bnRpbWV8Q2FwYWNpdG9yXFwvQ29uc29sZSlcXCgvO1xuXG4vKipcbiAqIEJhc2UgcGF0aCBvbiBhbiBBbmRyb2lkIGRldmljZSB3aGVyZSBPYnNpZGlhbiBNb2JpbGUgc3RvcmVzIGl0cyB2YXVsdHMuXG4gKlxuICogRXhwb3J0ZWQgYmVjYXVzZSB0aGUgdHJhbnNwb3J0IGZhY3Rvcnkgc3dlZXBzIGxlZnRvdmVyIHZhdWx0cyBmcm9tIGl0IGJlZm9yZVxuICogYSB0cmFuc3BvcnQgZXhpc3RzIChzZWUgdGhlIHJlcG8ncyBMMzEpLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BTkRST0lEX1ZBVUxUX0JBU0VfUEFUSCA9ICcvc2RjYXJkL0RvY3VtZW50cy8nO1xuXG5jb25zdCBERUZBVUxUX1ZBVUxUX0JBU0VfUEFUSDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgYW5kcm9pZDogREVGQVVMVF9BTkRST0lEX1ZBVUxUX0JBU0VfUEFUSCxcbiAgaW9zOiAnQG1kLm9ic2lkaWFuOmRvY3VtZW50cy8nXG59O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBBcHBpdW1UcmFuc3BvcnQud2FpdEZvclN0YXJ0dXBNaWxlc3RvbmV9LlxuICovXG5pbnRlcmZhY2UgQXBwaXVtVHJhbnNwb3J0V2FpdEZvclN0YXJ0dXBNaWxlc3RvbmVQYXJhbXMge1xuICAvKipcbiAgV2hldGhlciB0aGUgbWlsZXN0b25lIGp1c3Qgb2JzZXJ2ZWQgZW5kcyB0aGlzIHBoYXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNTYXRpc2ZpZWQ6IChtaWxlc3RvbmU6IEFwcFN0YXJ0dXBNaWxlc3RvbmUpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gIFRoZSBwaGFzZSBiZWluZyB3YWl0ZWQgb3V0LCBuYW1lZCBpbiB0aGUgbG9nIGFuZCBpbiB0aGUgdGltZW91dCBtZXNzYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGhhc2U6IEFwcFN0YXJ0dXBQaGFzZTtcblxuICAvKipcbiAgVGhpcyBwaGFzZSdzIGJ1ZGdldC5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgTG9hZGluZ0FwcCB7XG4gIHdvcmtzcGFjZT86IExvYWRpbmdXb3Jrc3BhY2U7XG59XG5cbmludGVyZmFjZSBMb2FkaW5nV29ya3NwYWNlIHtcbiAgbGF5b3V0UmVhZHk/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRyYW5zcG9ydCB0aGF0IGNvbW11bmljYXRlcyB3aXRoIE9ic2lkaWFuIE1vYmlsZSB2aWEgQXBwaXVtIFdlYlZpZXcgSlMgaW5qZWN0aW9uLlxuICpcbiAqIEV2YWx1YXRlcyBleHByZXNzaW9ucyBieSBzd2l0Y2hpbmcgdG8gdGhlIGBXRUJWSUVXX21kLm9ic2lkaWFuYCBjb250ZXh0IGFuZFxuICogY2FsbGluZyBgZXhlY3V0ZSgpYC4gTWFuYWdlcyB2YXVsdHMgYnkgd3JpdGluZyB0byB0aGUgV2ViVmlldydzIGBsb2NhbFN0b3JhZ2VgXG4gKiAod2hpY2ggT2JzaWRpYW4gdXNlcyBhcyBpdHMgdmF1bHQgcmVnaXN0cnkgb24gbW9iaWxlKSBhbmQgcHVzaGluZyBmaWxlcyB0byB0aGUgZGV2aWNlLlxuICovXG5leHBvcnQgY2xhc3MgQXBwaXVtVHJhbnNwb3J0IGltcGxlbWVudHMgT2JzaWRpYW5UcmFuc3BvcnQge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgZm9yIGEgbW9iaWxlIHBsYXRmb3JtLiBBbHdheXMgYHRydWVgIGZvciB0aGlzIHRyYW5zcG9ydC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc01vYmlsZSA9IHRydWU7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBhcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGJyb3dzZXI6IEJyb3dzZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBgcHJvY2Vzcy5vbignZXhpdCcpYCBoYW5kbGVyIHRoYXQgdGVhcnMgdGhlIGNoYW5uZWwgZG93biB3aGVuIG5vdGhpbmcgZWxzZSB3aWxsLlxuICAgKi9cbiAgcHJpdmF0ZSBkaXNwb3NlSW5wdXRDaGFubmVsT25FeGl0OiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBob3N0IGhhbGYgb2YgdGhlIHRydXN0ZWQtaW5wdXQgY2hhbm5lbDogYSBDRFAgY29ubmVjdGlvbiB0byB0aGUgV2ViVmlldywgaW5kZXBlbmRlbnQgb2YgdGhlXG4gICAqIEFwcGl1bSBzZXNzaW9uLCBvcGVuZWQgbGF6aWx5IG9uIGZpcnN0IGV2YWx1YXRlIGFuZCByZXVzZWQgKHNlZSAqKkwzOSoqKS5cbiAgICovXG4gIHByaXZhdGUgaW5wdXRDaGFubmVsOiBudWxsIHwgV2ViVmlld0NkcENvbm5lY3Rpb24gPSBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb25jZSB0aGUgdHJ1c3RlZC1pbnB1dCBjaGFubmVsIGlzIGtub3duIG5vdCB0byBiZSBvcGVuYWJsZSBoZXJlIChpT1MsIGEgcmVtb3RlIGh1Yiwgbm8gbG9jYWxcbiAgICogYGFkYmApLCBzbyB0aGUgYXR0ZW1wdCBpcyBub3QgcmVwZWF0ZWQgb24gZXZlcnkgZXZhbHVhdGUuXG4gICAqL1xuICBwcml2YXRlIGlzSW5wdXRDaGFubmVsVW5hdmFpbGFibGUgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFRyYWNrcyB3aGV0aGVyIHRoZSBkcml2ZXIgaXMgY3VycmVudGx5IHN3aXRjaGVkIHRvIHRoZSBXZWJWaWV3IGNvbnRleHQuXG4gICAqXG4gICAqIFNldCB0byBgdHJ1ZWAgYWZ0ZXIgYSBzdWNjZXNzZnVsIGBzd2l0Y2hDb250ZXh0KFdFQlZJRVdfbWQub2JzaWRpYW4pYC5cbiAgICogUmVzZXQgdG8gYGZhbHNlYCB3aGVuIHRoZSBjb250ZXh0IGlzIGtub3duIHRvIGJlIGludmFsaWRhdGVkXG4gICAqIChlLmcuIGFmdGVyIGBsb2NhdGlvbi5yZWxvYWQoKWAgaW4ge0BsaW5rIHJlZ2lzdGVyVmF1bHR9KS5cbiAgICpcbiAgICogV2hlbiBgdHJ1ZWAsIHtAbGluayBlbnN1cmVXZWJWaWV3Q29udGV4dH0gc2tpcHMgdGhlIGV4cGVuc2l2ZVxuICAgKiBgZ2V0Q29udGV4dHMoKWAgY2FsbCAod2hpY2ggcnVucyBgYWRiIHNoZWxsIGNhdCAvcHJvYy9uZXQvdW5peGAgYW5kXG4gICAqIGNhbiB0aW1lIG91dCBvbiBzbG93IGVtdWxhdG9ycykuXG4gICAqL1xuICBwcml2YXRlIGlzSW5XZWJWaWV3Q29udGV4dCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwcmV2aW91cyBldmFsIGVuZGVkIGluIGEgY2FwIG92ZXJydW4sIHNvIHRoZSBuZXh0IG9uZSBpcyBvd2VkIHRoZSByZWNvdmVyeSBncmFjZS5cbiAgICpcbiAgICogVGhlIGFiYW5kb25lZCBjbG9zdXJlIGlzIHN0aWxsIHJ1bm5pbmcgaW4gdGhlIGd1ZXN0LCBhbmQgQXBwaXVtIHNlcmlhbGl6ZXMgY29tbWFuZHMgcGVyIHNlc3Npb24sIHNvXG4gICAqIHRoZSBuZXh0IGNvbW1hbmQgcXVldWVzIGJlaGluZCB3aGF0ZXZlciBpcyBsZWZ0IG9mIGl0LiBTZWUge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5ldmFsdWF0ZVdpdGhpbkNhcH0uXG4gICAqL1xuICBwcml2YXRlIGlzUmVjb3ZlcmluZ0Zyb21DYXBPdmVycnVuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpc1Nlc3Npb25Pd25lcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtOiAnYW5kcm9pZCcgfCAnaW9zJztcbiAgcHJpdmF0ZSByZWFkb25seSBzY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRTd2VlcExlZnRvdmVyczogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSB2YXVsdEJhc2VQYXRoOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQXBwaXVtIHRyYW5zcG9ydC5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIEFwcGl1bSB0cmFuc3BvcnQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb25maWc6IEFwcGl1bVRyYW5zcG9ydENvbmZpZykge1xuICAgIHRoaXMuYnJvd3NlciA9IGNvbmZpZy5icm93c2VyO1xuICAgIHRoaXMuZGV2aWNlSWQgPSBjb25maWcuZGV2aWNlSWQ7XG4gICAgdGhpcy5pc1Nlc3Npb25Pd25lciA9IGNvbmZpZy5pc1Nlc3Npb25Pd25lciA/PyB0cnVlO1xuICAgIHRoaXMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBjb25maWcubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9MQVlPVVRfUkVBRFlfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB0aGlzLnBsYXRmb3JtID0gY29uZmlnLnBsYXRmb3JtO1xuICAgIHRoaXMuYXBwSWQgPSBjb25maWcuYXBwSWQgPz8gREVGQVVMVF9BUFBfSUQ7XG4gICAgdGhpcy5hcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IGNvbmZpZy5hcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0FQUF9TVEFSVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHRoaXMuc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzID0gY29uZmlnLnNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EUztcbiAgICB0aGlzLnNob3VsZFN3ZWVwTGVmdG92ZXJzID0gY29uZmlnLnNob3VsZFN3ZWVwTGVmdG92ZXJzID8/IHRydWU7XG4gICAgdGhpcy52YXVsdEJhc2VQYXRoID0gY29uZmlnLnZhdWx0QmFzZVBhdGggPz8gREVGQVVMVF9WQVVMVF9CQVNFX1BBVEhbdGhpcy5wbGF0Zm9ybV0gPz8gREVGQVVMVF9BTkRST0lEX1ZBVUxUX0JBU0VfUEFUSDtcbiAgICB0aGlzLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBjb25maWcud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX1dFQlZJRVdfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgfVxuXG4gIC8qKlxuICAgKiBCZWdpbnMgYSBjb25zb2xlIGNhcHR1cmUgYnkgc3RhbXBpbmcgdGhlIGRldmljZSBsb2cgd2l0aCBhIHVuaXF1ZSBtYXJrZXIuXG4gICAqXG4gICAqIFVzZXMgYGFkYiBzaGVsbCBsb2dgIHRvIHdyaXRlIGEgbWFya2VyIGludG8gYGxvZ2NhdGAgYXQgY2FwdHVyZSBzdGFydCBzbyBhXG4gICAqIGxhdGVyIHtAbGluayBBcHBpdW1UcmFuc3BvcnQucmVhZENvbnNvbGVDYXB0dXJlU2luY2V9IGNhbiBzbGljZSBvdXRcbiAgICogZXZlcnl0aGluZyB0aGUgV2ViVmlldyBsb2dnZWQgYWZ0ZXJ3YXJkcyBcdTIwMTQgd2l0aG91dCB0aGUgaW52YXNpdmUgYGxvZ2NhdCAtY2BcbiAgICogYnVmZmVyIGNsZWFyLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIGhhbmRsZSBjYXJyeWluZyB0aGUgdW5pcXVlIG1hcmtlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBiZWdpbkNvbnNvbGVDYXB0dXJlKCk6IFByb21pc2U8Q29uc29sZUNhcHR1cmVIYW5kbGU+IHtcbiAgICBjb25zdCBtYXJrZXIgPSBgJHtDT05TT0xFX0NBUFRVUkVfTUFSS0VSX1RBR31fJHtyYW5kb21VVUlEKCl9YDtcbiAgICBhd2FpdCBleGVjKFxuICAgICAgWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAnbG9nJywgJy10JywgQ09OU09MRV9DQVBUVVJFX01BUktFUl9UQUcsIG1hcmtlcl0sXG4gICAgICB7IGlzUXVpZXQ6IHRydWUsIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IEFEQl9MT0dfTUFSS0VSX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH1cbiAgICApO1xuICAgIHJldHVybiB7IG1hcmtlciB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhcHR1cmVzIGEgUE5HIHNjcmVlbnNob3Qgb2YgdGhlIGRldmljZSdzIHNjcmVlbi5cbiAgICpcbiAgICogVGhlIGltYWdlIGlzIGFsd2F5cyB0aGUgZGV2aWNlJ3MgbmF0aXZlIGZyYW1lYnVmZmVyIFx1MjAxNCB0aGVyZSBpcyBubyBtb2JpbGVcbiAgICogZXF1aXZhbGVudCBvZiB0aGUgZGVza3RvcCB2aWV3cG9ydCBvdmVycmlkZSwgc29cbiAgICoge0BsaW5rIENhcHR1cmVTY3JlZW5zaG90UGFyYW1zLndpZHRoSW5QaXhlbHN9IC9cbiAgICoge0BsaW5rIENhcHR1cmVTY3JlZW5zaG90UGFyYW1zLmhlaWdodEluUGl4ZWxzfSBhcmUgaWdub3JlZC4gU2l6ZSBhIG1vYmlsZVxuICAgKiBjYXB0dXJlIGJ5IGNob29zaW5nIGFuIEFWRCB3aG9zZSBzY3JlZW4gZ2VvbWV0cnkgYWxyZWFkeSBtYXRjaGVzIHdoYXQgdGhlXG4gICAqIGltYWdlIGhhcyB0byBiZS5cbiAgICpcbiAgICogQHBhcmFtIF9wYXJhbXMgLSBDYXB0dXJlIHBhcmFtZXRlcnMuIElnbm9yZWQgb24gbW9iaWxlOiBgY3dkYCBkb2VzIG5vdCBzZWxlY3QgYSB3aW5kb3cgKHZhdWx0IHRhcmdldGluZyBpcyB2aWEgbG9jYWxTdG9yYWdlKSwgYW5kIHRoZSBzaXplIGNhbm5vdCBiZSBvdmVycmlkZGVuLlxuICAgKiBAcmV0dXJucyBUaGUgcmF3IFBORyBieXRlcy5cbiAgICogQHRocm93cyBFcnJvciBpZiB0aGUgZHJpdmVyIHJldHVybnMgZGF0YSB0aGF0IGlzIG5vdCBhIFBORy5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbi1kZXYtdXRpbHMvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBQZXJtYW5lbnQ6IGBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtc2AgaXMgb25lIGJhZyBzaGFyZWQgYnkgdGhlIGBjYXB0dXJlU2NyZWVuc2hvdGAgb2YgYm90aCB0cmFuc3BvcnRzLCBzbyBubyBwZXItb3duZXIgbmFtZSBjYW4gc2F0aXNmeSBib3RoLlxuICBwdWJsaWMgYXN5bmMgY2FwdHVyZVNjcmVlbnNob3QoX3BhcmFtczogQ2FwdHVyZVNjcmVlbnNob3RQYXJhbXMpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBieXRlcyA9IGRlY29kZUJhc2U2NFBuZyhhd2FpdCB0aGlzLmJyb3dzZXIudGFrZVNjcmVlbnNob3QoKSk7XG4gICAgaWYgKCFpc1BuZyhieXRlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXBwaXVtIHNjcmVlbnNob3QgZXJyb3I6IHRha2VTY3JlZW5zaG90IHJldHVybmVkIGRhdGEgdGhhdCBpcyBub3QgYSBQTkcuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ5dGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZHMgdGhlIEFwcGl1bSBzZXNzaW9uLlxuICAgKlxuICAgKiBPbmx5IGRlbGV0ZXMgdGhlIHNlc3Npb24gaWYgdGhpcyB0cmFuc3BvcnQgb3ducyBpdC4gVHJhbnNwb3J0cyBjcmVhdGVkXG4gICAqIHZpYSBgYXR0YWNoKClgICh0ZXN0IHdvcmtlcnMgcmV1c2luZyB0aGUgZ2xvYmFsIHNldHVwJ3Mgc2Vzc2lvbikgc2tpcFxuICAgKiBkZWxldGlvbiBzbyB0aGUgc2Vzc2lvbiByZW1haW5zIGF2YWlsYWJsZSBmb3IgdGhlIG93bmluZyBwcm9jZXNzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kaXNwb3NlSW5wdXRDaGFubmVsKCk7XG5cbiAgICBpZiAodGhpcy5pc1Nlc3Npb25Pd25lcikge1xuICAgICAgYXdhaXQgdGhpcy5icm93c2VyLmRlbGV0ZVNlc3Npb24oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXMgdGVhcmRvd24gZm9yIGBwcm9jZXNzLm9uKCdleGl0JylgIGhhbmRsZXJzLlxuICAgKlxuICAgKiBPbmx5IHRoZSB0cnVzdGVkLWlucHV0IGNoYW5uZWwgbmVlZHMgaXQ6IHRoZSBBcHBpdW0gc2Vzc2lvbiBpcyB0aGUgb3duaW5nIHByb2Nlc3MncyB0byBlbmQsIGFuZCBhblxuICAgKiBhYnJ1cHQgZXhpdCBpcyBleGFjdGx5IHdoZW4gdGhlIGFzeW5jIHtAbGluayBBcHBpdW1UcmFuc3BvcnQuZGlzcG9zZX0gbmV2ZXIgcnVucyBcdTIwMTQgd2hpY2ggd291bGQgc3RyYW5kXG4gICAqIHRoZSBhZGIgcG9ydCBmb3J3YXJkIG9uIHRoZSBkZXZpY2UuXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZVN5bmMoKTogdm9pZCB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuaW5wdXRDaGFubmVsO1xuICAgIHRoaXMuaW5wdXRDaGFubmVsID0gbnVsbDtcbiAgICB0aGlzLnVucmVnaXN0ZXJJbnB1dENoYW5uZWxFeGl0SGFuZGxlcigpO1xuICAgIGNoYW5uZWw/LmRpc3Bvc2VTeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluc2lkZSBPYnNpZGlhbiBNb2JpbGUncyBXZWJWaWV3LlxuICAgKlxuICAgKiBTd2l0Y2hlcyB0byB0aGUgYFdFQlZJRVdfbWQub2JzaWRpYW5gIGNvbnRleHQsIGV4ZWN1dGVzIHRoZSBleHByZXNzaW9uLFxuICAgKiBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIGV4cHJlc3Npb24gLSBUaGUgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLlxuICAgKiBAcGFyYW0gX29wdGlvbnMgLSBFdmFsdWF0aW9uIG9wdGlvbnMgKGN3ZCBpcyBub3QgdXNlZCBvbiBtb2JpbGUgXHUyMDE0IHZhdWx0IHRhcmdldGluZyBpcyB2aWEgbG9jYWxTdG9yYWdlKS5cbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgcmVzdWx0IHN0cmluZy5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbi1kZXYtdXRpbHMvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBQZXJtYW5lbnQ6IGBUcmFuc3BvcnRFdmFsT3B0aW9uc2AgaXMgb25lIGJhZyBzaGFyZWQgYnkgdGhlIGBldmFsdWF0ZWAgb2YgYm90aCB0cmFuc3BvcnRzLCBzbyBubyBwZXItb3duZXIgbmFtZSBjYW4gc2F0aXNmeSBib3RoLlxuICBwdWJsaWMgYXN5bmMgZXZhbHVhdGUoZXhwcmVzc2lvbjogc3RyaW5nLCBfb3B0aW9uczogVHJhbnNwb3J0RXZhbE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlV2ViVmlld0NvbnRleHQoKTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUlucHV0Q2hhbm5lbCgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8qXG4gICAgICAgKiBUaGUgY2FwIGlzIGVuZm9yY2VkIEhFUkUsIG9uIHRoZSBOb2RlIHNpZGUsIGFuZCBub3QgYnkgdGhlIGB0aW1lb3V0cy5zY3JpcHRgIGNhcGFiaWxpdHkgdGhlXG4gICAgICAgKiBTZXNzaW9uIGFsc28gZGVjbGFyZXMuIE1lYXN1cmVkIG9uIGEgbGl2ZSBlbXVsYXRvcjogdGhlIGNhcGFiaWxpdHkgaXMgYWNjZXB0ZWQgYW5kIHJlYWRzXG4gICAgICAgKiBCYWNrIGFzIDMwMDAwIGluIHRoZSBXZWJWaWV3IGNvbnRleHQsIGFuZCBub3RoaW5nIGV2ZXIgZW5mb3JjZXMgaXQgXHUyMDE0IG92ZXItY2FwIGNsb3N1cmVzIGluIGJvdGggdGhlXG4gICAgICAgKiBTbGVlcGluZyBhbmQgdGhlIHNwaW5uaW5nIHNoYXBlLCB3aXRoIGFuZCB3aXRob3V0IGFuIGV4cGxpY2l0IGBzZXRUaW1lb3V0c2AsIHJhbiBwYXN0IGEgNjBzIGNlaWxpbmdcbiAgICAgICAqIFdpdGhvdXQgV2ViRHJpdmVyIHJhaXNpbmcgYHNjcmlwdCB0aW1lb3V0YCBldmVuIG9uY2UuIFdoYXQgYWN0dWFsbHkgaGFwcGVucyBwYXN0IHJvdWdobHkgaGFsZiBhXG4gICAgICAgKiBNaW51dGUgaXMgd29yc2UgdGhhbiBhIGxhdGUgYW5zd2VyOiB0aGUgY2xvc3VyZSBDT01QTEVURVMgaW4gdGhlIGd1ZXN0IG9uIHNjaGVkdWxlICh0aW1lcnMgYXJtZWQgYXRcbiAgICAgICAqIDMwcyBhbmQgNDBzIGZpcmVkIHdpdGhpbiB+MTNtcyBvZiBub21pbmFsLCBvbiBhIHZpc2libGUgYW5kIGZvY3VzZWQgcGFnZSkgYW5kIGl0cyBFeGVjdXRlIFNjcmlwdFxuICAgICAgICogUmVzcG9uc2UgbmV2ZXIgcmVhY2hlcyB0aGlzIGNsaWVudCBcdTIwMTQgc28gdGhlIHByb21pc2UgYmVsb3cgc2ltcGx5IG5ldmVyIHNldHRsZXMuXG4gICAgICAgKlxuICAgICAgICogQSBoYW5nIGlzIHRoZSBvbmUgZmFpbHVyZSBtb2RlIGEgdGVzdCBhdXRob3IgY2Fubm90IGFjdCBvbiwgc28gdGhlIHdhaXQgaXMgYm91bmRlZCBoZXJlLlxuICAgICAgICovXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlV2l0aGluQ2FwKGByZXR1cm4gKCR7ZXhwcmVzc2lvbn0pYCk7XG5cbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCB8fCByZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIE5PX09VVFBVVDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLypcbiAgICAgICAqIEEgY2FwIG92ZXJydW4gaXMgdGhlIG9uZSBmYWlsdXJlIGhlcmUgdGhhdCBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIGNvbnRleHQ6IHRoZSBjbG9zdXJlIG91dHN0YXllZFxuICAgICAgICogSXRzIGJ1ZGdldCwgdGhlIFdlYlZpZXcgaXMgc3RpbGwgdGhlIFdlYlZpZXcuIFJlc2V0dGluZyB0aGUgZmxhZyB3b3VsZCBjaGFyZ2UgdGhlIE5FWFQgZXZhbCBhXG4gICAgICAgKiB+MTdzIGBzd2l0Y2hDb250ZXh0YCAoKipMMTkqKikgdG8gcmVjb3ZlciBmcm9tIHNvbWV0aGluZyB0aGF0IHdhcyBuZXZlciBsb3N0LlxuICAgICAgICovXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFdmFsQ2FwRXhjZWVkZWRFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgLy8gQ29udGV4dCBtYXkgaGF2ZSBiZWVuIGxvc3QgbWlkLWV4ZWN1dGlvbiAoZS5nLiBwYWdlIHJlbG9hZCkuXG4gICAgICB0aGlzLmlzSW5XZWJWaWV3Q29udGV4dCA9IGZhbHNlO1xuXG4gICAgICAvKlxuICAgICAgICogS2VwdCBhcyBhIGZhc3QgcGF0aCBldmVuIHRob3VnaCB0aGlzIGRyaXZlciB3YXMgbWVhc3VyZWQgbmV2ZXIgcmFpc2luZyBpdDogaXQgY29zdHMgbm90aGluZyxcbiAgICAgICAqIEl0IGlzIHRoZSBjb3JyZWN0IHRyYW5zbGF0aW9uIGlmIGEgZnV0dXJlIGRyaXZlciBkb2VzIGVuZm9yY2UgdGhlIGNhcGFiaWxpdHksIGFuZCBpdCBrZWVwcyB0aGUgdHdvXG4gICAgICAgKiBUcmFuc3BvcnRzIHJlcG9ydGluZyBvbmUgZXJyb3IgZm9yIG9uZSBjb25kaXRpb24uXG4gICAgICAgKi9cbiAgICAgIGlmIChpc1NjcmlwdFRpbWVvdXRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEV2YWxDYXBFeGNlZWRlZEVycm9yKHtcbiAgICAgICAgICBjYXBJbk1pbGxpc2Vjb25kczogdGhpcy5zY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgIG9wdGlvbk5hbWU6ICdzY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHMnLFxuICAgICAgICAgIHRyYW5zcG9ydE5hbWU6ICdBbmRyb2lkIChBcHBpdW0pJ1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNlc3Npb24gY29ubmVjdGlvbiBpbmZvIG5lZWRlZCB0byByZWF0dGFjaCB0byB0aGlzIHNlc3Npb25cbiAgICogZnJvbSBhbm90aGVyIHByb2Nlc3MgKGUuZy4gYSB0ZXN0IHdvcmtlcikuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBzZXNzaW9uIElEIGFuZCBkZXZpY2UgSUQuXG4gICAqL1xuICBwdWJsaWMgZ2V0U2Vzc2lvbkluZm8oKTogQXBwaXVtU2Vzc2lvbkluZm8ge1xuICAgIHJldHVybiB7XG4gICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCxcbiAgICAgIHNlc3Npb25JZDogdGhpcy5icm93c2VyLnNlc3Npb25JZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0aGUgT2JzaWRpYW4gYXBwIGlzIHJ1bm5pbmcgYW5kIHRoZSBXZWJWaWV3IGlzIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHBhcmFtIF92YXVsdFBhdGggLSBOb3QgdXNlZCBvbiBtb2JpbGUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJlZmxpZ2h0Q2hlY2soX3ZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKCdbYXBwaXVtLXRyYW5zcG9ydF0gUnVubmluZyBwcmVmbGlnaHQgY2hlY2suLi4nKTtcbiAgICBjb25zdCBzdGF0ZSA9IGF3YWl0IHRoaXMuYnJvd3Nlci5xdWVyeUFwcFN0YXRlKHRoaXMuYXBwSWQpO1xuICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIEFwcCBzdGF0ZTogJHtTdHJpbmcoc3RhdGUpfSAobmVlZCAke1N0cmluZyhBUFBfU1RBVEVfRk9SRUdST1VORCl9PWZvcmVncm91bmQpYCk7XG4gICAgaWYgKHN0YXRlICE9PSBBUFBfU1RBVEVfRk9SRUdST1VORCkge1xuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gQWN0aXZhdGluZyBhcHAgJHt0aGlzLmFwcElkfS4uLmApO1xuICAgICAgdGhpcy5pc0luV2ViVmlld0NvbnRleHQgPSBmYWxzZTtcbiAgICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5hY3RpdmF0ZUFwcCh0aGlzLmFwcElkKTtcbiAgICAgIGF3YWl0IGRlbGF5KEFQUF9SRVNUQVJUX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVXZWJWaWV3Q29udGV4dCgpO1xuICAgIGxvZygnW2FwcGl1bS10cmFuc3BvcnRdIFByZWZsaWdodCBjaGVjayBwYXNzZWQuJyk7XG4gIH1cblxuICAvKipcbiAgICogUHVzaGVzIHZhdWx0IGZpbGVzIHRvIHRoZSBkZXZpY2UgdmlhIGNvbXByZXNzZWQgYGFkYiBwdXNoYC5cbiAgICpcbiAgICogQ3JlYXRlcyBhIHRhci5neiBhcmNoaXZlIG9mIHRoZSBsb2NhbCB2YXVsdCBkaXJlY3RvcnksIHB1c2hlcyBpdCB0byB0aGVcbiAgICogZGV2aWNlIGFzIGEgc2luZ2xlIGZpbGUsIGFuZCBleHRyYWN0cyBpdCBpbi1wbGFjZS4gVGhpcyBhdm9pZHMgdGhlXG4gICAqIHdlYmRyaXZlciBgUmFuZ2VFcnJvcmAgb24gbGFyZ2UgYmFzZTY0IHBheWxvYWRzIGFuZCBpcyBzaWduaWZpY2FudGx5XG4gICAqIGZhc3RlciB0aGFuIHBlci1maWxlIGBicm93c2VyLnB1c2hGaWxlKClgIGNhbGxzLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggKHVzZWQgYXMgdGhlIHZhdWx0IGRpcmVjdG9yeSBuYW1lIG9uIGRldmljZSkuXG4gICAqIEBwYXJhbSBfZmlsZXMgLSBNYXAgb2YgcmVsYXRpdmUgZmlsZSBwYXRocyB0byBjb250ZW50IGJ1ZmZlcnMgKHVudXNlZCBcdTIwMTQgYWRiIHB1c2hlcyB0aGUgZGlyZWN0b3J5IGRpcmVjdGx5KS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBwdXNoRmlsZXModmF1bHRQYXRoOiBzdHJpbmcsIF9maWxlczogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkZXZpY2VWYXVsdFBhdGggPSB0aGlzLmdldERldmljZVZhdWx0UGF0aCh2YXVsdFBhdGgpO1xuICAgIGNvbnN0IGFyY2hpdmVOYW1lID0gYHZhdWx0LSR7cmFuZG9tVVVJRCgpfS50YXIuZ3pgO1xuICAgIGNvbnN0IGxvY2FsQXJjaGl2ZSA9IGpvaW4odG1wZGlyKCksIGFyY2hpdmVOYW1lKTtcbiAgICBjb25zdCByZW1vdGVBcmNoaXZlID0gYC9kYXRhL2xvY2FsL3RtcC8ke2FyY2hpdmVOYW1lfWA7XG5cbiAgICB0cnkge1xuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gQ3JlYXRpbmcgYXJjaGl2ZTogJHtsb2NhbEFyY2hpdmV9YCk7XG4gICAgICBhd2FpdCBleGVjKFsndGFyJywgJ2N6ZicsIGFyY2hpdmVOYW1lLCAnLUMnLCB2YXVsdFBhdGgsICcuJ10sIHsgY3dkOiB0bXBkaXIoKSwgaXNRdWlldDogdHJ1ZSB9KTtcblxuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gUHVzaGluZyBhcmNoaXZlIHRvIGRldmljZSAke3RoaXMuZGV2aWNlSWR9Li4uYCk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3B1c2gnLCBsb2NhbEFyY2hpdmUsIHJlbW90ZUFyY2hpdmVdLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG5cbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIEV4dHJhY3RpbmcgYXJjaGl2ZSBvbiBkZXZpY2UgYXQgJHtkZXZpY2VWYXVsdFBhdGh9Li4uYCk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ21rZGlyJywgJy1wJywgZGV2aWNlVmF1bHRQYXRoXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICd0YXInLCAneHpmJywgcmVtb3RlQXJjaGl2ZSwgJy1DJywgZGV2aWNlVmF1bHRQYXRoXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gICAgICBsb2coJ1thcHBpdW0tdHJhbnNwb3J0XSBGbHVzaGluZyBmaWxlc3lzdGVtIGJ1ZmZlcnMuLi4nKTtcbiAgICAgIGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAnc3luYyddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG5cbiAgICAgIGxvZygnW2FwcGl1bS10cmFuc3BvcnRdIENsZWFuaW5nIHVwIHJlbW90ZSBhcmNoaXZlLi4uJyk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ3JtJywgcmVtb3RlQXJjaGl2ZV0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgcm0obG9jYWxBcmNoaXZlLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEdW1wcyBgYWRiIGxvZ2NhdGAgYW5kIHJldHVybnMgdGhlIFdlYlZpZXcgY29uc29sZS9lcnJvciBvdXRwdXQgbG9nZ2VkXG4gICAqIHNpbmNlIHRoZSBtYXJrZXIgZnJvbSB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0LmJlZ2luQ29uc29sZUNhcHR1cmV9LlxuICAgKlxuICAgKiBGaWx0ZXJzIHRvIHRoZSBDaHJvbWl1bS9XZWJWaWV3IHRhZ3MgdGhhdCBjYXJyeSBKUyBgY29uc29sZS4qYCBvdXRwdXQgYW5kXG4gICAqIHVuY2F1Z2h0IGVycm9ycywgYW5kIGNhcHMgdGhlIHJlc3VsdCBsZW5ndGguIEJvdW5kZWQsIHBvc3QtaG9jLFxuICAgKiBmYWlsdXJlLXBhdGgtb25seSBcdTIwMTQgbmV2ZXIgYSBsaXZlIG1vbml0b3IuXG4gICAqXG4gICAqIEBwYXJhbSBoYW5kbGUgLSBUaGUgY2FwdHVyZSBoYW5kbGUgKG9yIGB1bmRlZmluZWRgIHdoZW4gY2FwdHVyZSBuZXZlciBzdGFydGVkKS5cbiAgICogQHJldHVybnMgVGhlIGNhcHR1cmVkIGNvbnNvbGUvZXJyb3IgdGV4dCwgb3IgYHVuZGVmaW5lZGAgaWYgbm90aGluZyByZWxldmFudCB3YXMgbG9nZ2VkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlYWRDb25zb2xlQ2FwdHVyZVNpbmNlKGhhbmRsZTogQ29uc29sZUNhcHR1cmVIYW5kbGUgfCB1bmRlZmluZWQpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghaGFuZGxlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGR1bXAgPSBhd2FpdCBleGVjKFxuICAgICAgWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnbG9nY2F0JywgJy1kJywgJy12JywgJ3RpbWUnXSxcbiAgICAgIHsgaXNRdWlldDogdHJ1ZSwgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWUsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogTE9HQ0FUX0RVTVBfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfVxuICAgICk7XG5cbiAgICBjb25zdCBtYXJrZXJJbmRleCA9IGR1bXAubGFzdEluZGV4T2YoaGFuZGxlLm1hcmtlcik7XG4gICAgY29uc3QgcmVnaW9uID0gbWFya2VySW5kZXggPT09IC0xID8gZHVtcCA6IGR1bXAuc2xpY2UobWFya2VySW5kZXggKyBoYW5kbGUubWFya2VyLmxlbmd0aCk7XG4gICAgY29uc3QgcmVsZXZhbnQgPSByZWdpb25cbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5maWx0ZXIoKGxpbmUpID0+IENPTlNPTEVfQ0FQVFVSRV9UQUdfUkUudGVzdChsaW5lKSlcbiAgICAgIC5qb2luKCdcXG4nKVxuICAgICAgLnRyaW0oKTtcblxuICAgIGlmICghcmVsZXZhbnQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbGV2YW50LnNsaWNlKC1DT05TT0xFX0NBUFRVUkVfVEFJTF9NQVhfTEVOR1RIKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSB2YXVsdCBvbiBtb2JpbGUgYnkgcHVzaGluZyBmaWxlcyBhbmQgY29uZmlndXJpbmcgbG9jYWxTdG9yYWdlLlxuICAgKlxuICAgKiBUaGUgcmVnaXN0cmF0aW9uIGZsb3c6XG4gICAqIDEuIFB1c2ggYSBtaW5pbWFsIGAub2JzaWRpYW4vYXBwLmpzb25gIHRvIHRoZSBkZXZpY2Ugc28gT2JzaWRpYW4gcmVjb2duaXplcyB0aGUgdmF1bHRcbiAgICogMi4gU3dpdGNoIHRvIHRoZSBXZWJWaWV3IGNvbnRleHRcbiAgICogMy4gQWRkIHRoZSB2YXVsdCB0byBsb2NhbFN0b3JhZ2UgKGBtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzYCwgYG1vYmlsZS1zZWxlY3RlZC12YXVsdGAsXG4gICAqICAgIGBlbmFibGUtcGx1Z2luLTxwYXRoPmApXG4gICAqIDQuIFRyaWdnZXIgYGxvY2F0aW9uLnJlbG9hZCgpYCBzbyBPYnNpZGlhbiByZS1yZWFkcyBsb2NhbFN0b3JhZ2UgYW5kIG9wZW5zIHRoZSB2YXVsdFxuICAgKiA1LiBXYWl0IGZvciBgZ2xvYmFsVGhpcy5hcHBgIHRvIGV4aXN0ICh0aGUgYXBwJ3MgY29sZCBzdGFydCksIHRoZW4gXHUyMDE0IG9uIGFcbiAgICogICAgc2VwYXJhdGUsIHRpZ2h0ZXIgYnVkZ2V0IFx1MjAxNCBmb3IgYGFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHlgXG4gICAqXG4gICAqIEV4aXN0aW5nIHZhdWx0IHJlZ2lzdHJhdGlvbnMgaW4gbG9jYWxTdG9yYWdlIGFyZSBwcmVzZXJ2ZWQgKGFwcGVuZCwgbm90XG4gICAqIG92ZXJ3cml0ZSkgXHUyMDE0IGV4Y2VwdCB0aGUgKipoYXJuZXNzJ3Mgb3duKiogYHRlbXAtdmF1bHQtKmAgcmVnaXN0cmF0aW9ucyBmcm9tXG4gICAqIGVhcmxpZXIgcnVucywgd2hpY2ggYXJlIHBydW5lZCB3aGVuIHtAbGluayBBcHBpdW1UcmFuc3BvcnRDb25maWcuc2hvdWxkU3dlZXBMZWZ0b3ZlcnN9XG4gICAqIGlzIG9uLiBUaGVpciBkaXJlY3RvcmllcyBhcmUgYWxyZWFkeSBnb25lICh0aGUgZmFjdG9yeSBzd2VlcHMgdGhlbSBiZWZvcmVcbiAgICogdGhlIGFwcCBsYXVuY2hlcyksIGFuZCBpdCBpcyB0aGlzIHJlZ2lzdHJ5IFx1MjAxNCBub3QgdGhlIGZpbGVzeXN0ZW0gXHUyMDE0IHRoYXRcbiAgICogT2JzaWRpYW4gZW51bWVyYXRlcyBhdCBzdGFydHVwLCBzbyBsZWF2aW5nIHRoZW0gaXMgd2hhdCBtYWtlcyBlYWNoIGZhaWxlZFxuICAgKiBydW4gc2xvdyB0aGUgbmV4dCBvbmUgZG93bi5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBvbiB0aGUgaG9zdCBtYWNoaW5lLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBSZWdpc3RlcmluZyB2YXVsdDogJHt2YXVsdFBhdGh9YCk7XG4gICAgY29uc3QgZGV2aWNlVmF1bHRQYXRoID0gdGhpcy5nZXREZXZpY2VWYXVsdFBhdGgodmF1bHRQYXRoKTtcblxuICAgIC8vIFB1c2ggYSBtaW5pbWFsIC5vYnNpZGlhbiBkaXJlY3Rvcnkgc28gT2JzaWRpYW4gcmVjb2duaXplcyBpdCBhcyBhIHZhdWx0LlxuICAgIGF3YWl0IHRoaXMucHVzaE9ic2lkaWFuTWFya2VyKGRldmljZVZhdWx0UGF0aCk7XG5cbiAgICAvLyBTd2l0Y2ggdG8gV2ViVmlldyBhbmQgY29uZmlndXJlIGxvY2FsU3RvcmFnZS5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVdlYlZpZXdDb250ZXh0KCk7XG5cbiAgICAvLyBJbnZhbGlkYXRlIGJlZm9yZSByZWxvYWQgXHUyMDE0IHRoZSBwYWdlIHdpbGwgbmF2aWdhdGUgYW5kIHRoZSBXZWJWaWV3XG4gICAgLy8gY29udGV4dCBtYXkgYmUgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUgZHVyaW5nIHJlbG9hZC5cbiAgICB0aGlzLmlzSW5XZWJWaWV3Q29udGV4dCA9IGZhbHNlO1xuXG4gICAgY29uc3Qgc3RhbGVQcmVmaXggPSB0aGlzLnNob3VsZFN3ZWVwTGVmdG92ZXJzID8gYCR7dGhpcy52YXVsdEJhc2VQYXRofSR7VEVNUF9WQVVMVF9ESVJfUFJFRklYfWAgOiAnJztcblxuICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5leGVjdXRlKFxuICAgICAgKHBhdGg6IHN0cmluZywgcHJ1bmVQcmVmaXg6IHN0cmluZykgPT4ge1xuICAgICAgICBsZXQgZXhpc3RpbmcgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzJykgPz8gJ1tdJykgYXMgc3RyaW5nW107XG5cbiAgICAgICAgaWYgKHBydW5lUHJlZml4KSB7XG4gICAgICAgICAgY29uc3Qgc3RhbGUgPSBleGlzdGluZy5maWx0ZXIoKHJlZ2lzdGVyZWQpID0+IHJlZ2lzdGVyZWQgIT09IHBhdGggJiYgcmVnaXN0ZXJlZC5zdGFydHNXaXRoKHBydW5lUHJlZml4KSk7XG4gICAgICAgICAgZm9yIChjb25zdCByZWdpc3RlcmVkIG9mIHN0YWxlKSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShgZW5hYmxlLXBsdWdpbi0ke3JlZ2lzdGVyZWR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGV4aXN0aW5nID0gZXhpc3RpbmcuZmlsdGVyKChyZWdpc3RlcmVkKSA9PiAhc3RhbGUuaW5jbHVkZXMocmVnaXN0ZXJlZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFleGlzdGluZy5pbmNsdWRlcyhwYXRoKSkge1xuICAgICAgICAgIGV4aXN0aW5nLnB1c2gocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ21vYmlsZS1leHRlcm5hbC12YXVsdHMnLCBKU09OLnN0cmluZ2lmeShleGlzdGluZykpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbW9iaWxlLXNlbGVjdGVkLXZhdWx0JywgcGF0aCk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGBlbmFibGUtcGx1Z2luLSR7cGF0aH1gLCAndHJ1ZScpO1xuICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgIH0sXG4gICAgICBkZXZpY2VWYXVsdFBhdGgsXG4gICAgICBzdGFsZVByZWZpeFxuICAgICk7XG5cbiAgICAvLyBXYWl0IGZvciByZWxvYWQgKyB2YXVsdCBpbml0aWFsaXphdGlvbiwgYXMgdHdvIHNlcGFyYXRlbHkgYnVkZ2V0ZWQgcGhhc2VzOlxuICAgIC8vIFRoZSBhcHAncyBjb2xkIHN0YXJ0IGZpcnN0LCB0aGVuIE9ic2lkaWFuJ3Mgb3duIHdvcmsuIFNlZSBgd2FpdEZvckFwcFN0YXJ0ZWRgLlxuICAgIGF3YWl0IHRoaXMud2FpdEZvckFwcFN0YXJ0ZWQoKTtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JMYXlvdXRSZWFkeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgdmF1bHQgb24gbW9iaWxlIGJ5IHJlbW92aW5nIGl0IGZyb20gbG9jYWxTdG9yYWdlLlxuICAgKlxuICAgKiBQcmVzZXJ2ZXMgb3RoZXIgdmF1bHQgcmVnaXN0cmF0aW9ucy4gSWYgdGhlIHVucmVnaXN0ZXJlZCB2YXVsdCB3YXMgc2VsZWN0ZWQsXG4gICAqIHN3aXRjaGVzIHRvIHRoZSBmaXJzdCByZW1haW5pbmcgdmF1bHQgKG9yIGNsZWFycyB0aGUgc2VsZWN0aW9uKS5cbiAgICpcbiAgICogVGhlIHZhdWx0J3MgKipmaWxlcyBhcmUgdGhlbiByZW1vdmVkIGZyb20gdGhlIGRldmljZSBvdmVyIGBhZGJgLCB3aGV0aGVyIG9yXG4gICAqIG5vdCB0aGUgYGxvY2FsU3RvcmFnZWAgc3RlcCBzdWNjZWVkZWQqKiBcdTIwMTQgZGVsaWJlcmF0ZWx5LCBiZWNhdXNlIHRoZVxuICAgKiBgbG9jYWxTdG9yYWdlYCBzdGVwIGdvZXMgdGhyb3VnaCB0aGUgV2ViVmlldyBhbmQgYSBkZWFkIFdlYlZpZXcgaXMgZXhhY3RseVxuICAgKiB3aGF0IG1vc3QgQW5kcm9pZCBmYWlsdXJlcyBhcmUuIFJvdXRpbmcgdGhlIHJlbW92YWwgdGhyb3VnaCB0aGUgYXBwIHdhcyB3aGF0XG4gICAqIG1hZGUgZXZlcnkgZmFpbGVkIHJ1biBsZWFrIGl0cyB2YXVsdCAoYFZhdWx0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6IG5vXG4gICAqIHN1Y2ggd2luZG93YCksIHNvIHRoZSBmaWxlc3lzdGVtLWxldmVsIHJlbW92YWwgbXVzdCBub3QgZGVwZW5kIG9uIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IG9uIHRoZSBob3N0IG1hY2hpbmUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGV2aWNlVmF1bHRQYXRoID0gdGhpcy5nZXREZXZpY2VWYXVsdFBhdGgodmF1bHRQYXRoKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZVdlYlZpZXdDb250ZXh0KCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5leGVjdXRlKChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzJykgPz8gJ1tdJykgYXMgc3RyaW5nW107XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gZXhpc3RpbmcuZmlsdGVyKCh2KSA9PiB2ICE9PSBwYXRoKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ21vYmlsZS1leHRlcm5hbC12YXVsdHMnLCBKU09OLnN0cmluZ2lmeShmaWx0ZXJlZCkpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShgZW5hYmxlLXBsdWdpbi0ke3BhdGh9YCk7XG4gICAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbW9iaWxlLXNlbGVjdGVkLXZhdWx0JykgPT09IHBhdGgpIHtcbiAgICAgICAgICBpZiAoZmlsdGVyZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ21vYmlsZS1zZWxlY3RlZC12YXVsdCcsIGZpbHRlcmVkWzBdID8/ICcnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ21vYmlsZS1zZWxlY3RlZC12YXVsdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgZGV2aWNlVmF1bHRQYXRoKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKFxuICAgICAgICBgW2FwcGl1bS10cmFuc3BvcnRdIENvdWxkIG5vdCBkZXJlZ2lzdGVyICR7ZGV2aWNlVmF1bHRQYXRofSBmcm9tIGxvY2FsU3RvcmFnZSBgXG4gICAgICAgICAgKyBgKCR7U3RyaW5nKGVycm9yKX0pOyByZW1vdmluZyBpdHMgZmlsZXMgYW55d2F5LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5yZW1vdmVEZXZpY2VWYXVsdERpcmVjdG9yeShkZXZpY2VWYXVsdFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgdHJ1c3RlZC1pbnB1dCBjaGFubmVsLCBpZiBvbmUgaXMgb3Blbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcG9zZUlucHV0Q2hhbm5lbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5pbnB1dENoYW5uZWw7XG4gICAgdGhpcy5pbnB1dENoYW5uZWwgPSBudWxsO1xuICAgIHRoaXMudW5yZWdpc3RlcklucHV0Q2hhbm5lbEV4aXRIYW5kbGVyKCk7XG4gICAgYXdhaXQgY2hhbm5lbD8uZGlzcG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIHRoZSB0cnVzdGVkLWlucHV0IGNoYW5uZWwgaWYgaXQgaXMgbm90IGFscmVhZHkgb3BlbiwgYW5kIHJlLW9wZW5zIGl0IGlmIHRoZSBXZWJWaWV3IHdlbnQgYXdheS5cbiAgICpcbiAgICogSW5zdGFsbHMgYSBgUnVudGltZS5hZGRCaW5kaW5nYCBmdW5jdGlvbiBvbiB0aGUgcGFnZSBhbmQgc2VydmljZXMgZXZlcnkgY2FsbCB0byBpdCBmb3IgdGhlIGxpZmUgb2YgdGhlXG4gICAqIGNvbm5lY3Rpb24uIFRoZSBiaW5kaW5nIGlzIGV4cG9zZWQgb24gKmV2ZXJ5KiBleGVjdXRpb24gY29udGV4dCBvZiB0aGUgcGFnZSwgc28gaXQgc3Vydml2ZXMgdGhlXG4gICAqIGBsb2NhdGlvbi5yZWxvYWQoKWAgdGhhdCB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0LnJlZ2lzdGVyVmF1bHR9IHBlcmZvcm1zOyBvbmx5IGEgZnVsbCBhcHAgcmVzdGFydCwgd2hpY2hcbiAgICogZGVzdHJveXMgdGhlIFdlYlZpZXcgdGFyZ2V0LCBuZWVkcyB0aGUgcmVjb25uZWN0IGJlbG93LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVJbnB1dENoYW5uZWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaW5wdXRDaGFubmVsPy5pc09wZW4gfHwgdGhpcy5pc0lucHV0Q2hhbm5lbFVuYXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIGNoYW5uZWwgaXMgcmVhY2hhYmxlIG9ubHkgb3ZlciBsb2NhbCBgYWRiYCwgc28gaXQgZG9lcyBub3QgZXhpc3Qgb24gaU9TIG9yIGFnYWluc3QgYSByZW1vdGUgaHViXG4gICAgLy8gKEJyb3dzZXJTdGFjaykuIFRob3NlIGFyZSBzdXBwb3J0ZWQgdHJhbnNwb3J0cywgc28gdGhpcyBzdGF5cyAqKmJlc3QtZWZmb3J0Kio6IGEgcnVuIHRoYXQgbmV2ZXJcbiAgICAvLyBkcml2ZXMgaW5wdXQgbXVzdCBub3QgZmFpbCBiZWNhdXNlIHRoZSBjaGFubmVsIGNvdWxkIG5vdCBiZSBvcGVuZWQuIEEgcnVuIHRoYXQgKmRvZXMqIGRyaXZlIGlucHV0XG4gICAgLy8gZ2V0cyBhIGxlZ2libGUgZXJyb3IgZnJvbSB0aGUgcmVuZGVyZXIncyBvd24gZ3VhcmQsIHdoaWNoIG5hbWVzIHRoZSBtaXNzaW5nIGNoYW5uZWwuXG4gICAgaWYgKHRoaXMucGxhdGZvcm0gIT09ICdhbmRyb2lkJykge1xuICAgICAgdGhpcy5pc0lucHV0Q2hhbm5lbFVuYXZhaWxhYmxlID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmRpc3Bvc2VJbnB1dENoYW5uZWwoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gYXdhaXQgY29ubmVjdFRvV2ViVmlld0NkcCh7IGFwcElkOiB0aGlzLmFwcElkLCBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCB9KTtcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZCgnUnVudGltZS5lbmFibGUnKTtcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZCgnUnVudGltZS5hZGRCaW5kaW5nJywgeyBuYW1lOiBNT0JJTEVfSU5QVVRfQklORElOR19OQU1FIH0pO1xuICAgICAgY29ubmVjdGlvbi5vbignUnVudGltZS5iaW5kaW5nQ2FsbGVkJywgKHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgICAgaWYgKHBhcmFtc1snbmFtZSddICE9PSBNT0JJTEVfSU5QVVRfQklORElOR19OQU1FKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHBhcmFtc1sncGF5bG9hZCddO1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgbm90IGF3YWl0ZWQ6IHRoaXMgcnVucyB3aGlsZSB0aGUgcmVuZGVyZXIncyBgRXhlY3V0ZSBTY3JpcHRgIGlzIHN0aWxsIHBlbmRpbmcsIGFuZFxuICAgICAgICAvLyB0aGF0IGlzIHRoZSB3aG9sZSBwb2ludCBcdTIwMTQgdGhlIHJlcXVlc3QgaXMgc2VydmljZWQgY29uY3VycmVudGx5IGFuZCBhbnN3ZXJlZCBieSByZXNvbHZpbmcgdGhlXG4gICAgICAgIC8vIHJlbmRlcmVyJ3MgcHJvbWlzZSBvdmVyIHRoaXMgc2FtZSBzb2NrZXQuIEl0IGhhbmRsZXMgaXRzIG93biBmYWlsdXJlcywgc28gbm90aGluZyByZWFjaGVzIGhlcmUuXG4gICAgICAgIHRoaXMuaGFuZGxlSW5wdXRSZXF1ZXN0KGNvbm5lY3Rpb24sIHR5cGVvZiBwYXlsb2FkID09PSAnc3RyaW5nJyA/IHBheWxvYWQgOiAnJykuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8vIFVucmVhY2hhYmxlOiBgaGFuZGxlSW5wdXRSZXF1ZXN0YCBuZXZlciByZWplY3RzLlxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmlucHV0Q2hhbm5lbCA9IGNvbm5lY3Rpb247XG5cbiAgICAgIC8vIFNlbGYtY2xlYW5pbmcsIGRlbGliZXJhdGVseTogdGhpcyB0cmFuc3BvcnQgY2FuIGJlIGNyZWF0ZWQgc3RyYWlnaHQgZnJvbSBhIHRlc3Qgd29ya2VyLCB3aXRoIG5vXG4gICAgICAvLyBgY29yZVNldHVwYCBvd25pbmcgaXRzIGxpZmVjeWNsZSBhbmQgdGhlcmVmb3JlIG5vdGhpbmcgdGhhdCBldmVyIGNhbGxzIGBkaXNwb3NlYC9gZGlzcG9zZVN5bmNgIFx1MjAxNFxuICAgICAgLy8gd2hpY2ggaXMgaG93IGEgcnVuIGxlYXZlcyBpdHMgYWRiIHBvcnQgZm9yd2FyZCBzdHJhbmRlZCBvbiB0aGUgZGV2aWNlIChvYnNlcnZlZCAyMDI2LTA4LTMwKS4gVGhlXG4gICAgICAvLyBoYW5kbGVyIGlzIHJlbW92ZWQgYWdhaW4gb24gZGlzcG9zYWwgc28gcmVjb25uZWN0cyBkbyBub3Qgc3RhY2sgbGlzdGVuZXJzLlxuICAgICAgdGhpcy5kaXNwb3NlSW5wdXRDaGFubmVsT25FeGl0ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25uZWN0aW9uLmRpc3Bvc2VTeW5jKCk7XG4gICAgICB9O1xuICAgICAgcHJvY2Vzcy5vbmNlKCdleGl0JywgdGhpcy5kaXNwb3NlSW5wdXRDaGFubmVsT25FeGl0KTtcblxuICAgICAgbG9nKCdbYXBwaXVtLXRyYW5zcG9ydF0gVHJ1c3RlZC1pbnB1dCBjaGFubmVsIG9wZW4uJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIEdpdmUgdXAgZm9yIHRoZSBsaWZlIG9mIHRoZSB0cmFuc3BvcnQgcmF0aGVyIHRoYW4gcGF5aW5nIGFuIGBhZGJgIHJvdW5kLXRyaXAgb24gZXZlcnkgZXZhbC5cbiAgICAgIC8vIEEgc29ja2V0IHRoYXQgbWVyZWx5ICpjbG9zZWQqIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjb25uZWN0IGlzIGEgZGlmZmVyZW50IGNhc2UgXHUyMDE0IGBpc09wZW5gIGlzIGZhbHNlXG4gICAgICAvLyB0aGVyZSB3aGlsZSB0aGlzIGZsYWcgc3RheXMgdW5zZXQsIHNvIHRoZSByZWNvbm5lY3QgYWJvdmUgc3RpbGwgcnVucy5cbiAgICAgIHRoaXMuaXNJbnB1dENoYW5uZWxVbmF2YWlsYWJsZSA9IHRydWU7XG4gICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBUcnVzdGVkIGlucHV0IGlzIHVuYXZhaWxhYmxlIG9uIHRoaXMgZGV2aWNlOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTd2l0Y2hlcyB0aGUgZHJpdmVyIHRvIHRoZSBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dC5cbiAgICpcbiAgICogSWYgdGhlIGNvbnRleHQgd2FzIGFscmVhZHkgdmVyaWZpZWQgKGNhY2hlZCB2aWEge0BsaW5rIGlzSW5XZWJWaWV3Q29udGV4dH0pLFxuICAgKiByZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGhvdXQgY2FsbGluZyBgZ2V0Q29udGV4dHMoKWAgXHUyMDE0IHdoaWNoIHJ1bnNcbiAgICogYGFkYiBzaGVsbCBjYXQgL3Byb2MvbmV0L3VuaXhgIGFuZCBjYW4gdGltZSBvdXQgb24gc2xvdyBlbXVsYXRvcnMuXG4gICAqXG4gICAqIFBvbGxzIHVudGlsIHRoZSBjb250ZXh0IGJlY29tZXMgYXZhaWxhYmxlICh0aGUgYXBwIG1heSBzdGlsbCBiZSBsb2FkaW5nKS5cbiAgICogVXNlcyB0aGUgYFdFQlZJRVdfbWQub2JzaWRpYW5gIGNvbnRleHQgc3BlY2lmaWNhbGx5IHRvIGF2b2lkIGNvbm5lY3RpbmdcbiAgICogdG8gQ2hyb21lIG9yIG90aGVyIFdlYlZpZXdzIG9uIHRoZSBkZXZpY2UuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZVdlYlZpZXdDb250ZXh0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzSW5XZWJWaWV3Q29udGV4dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRoaXMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcztcbiAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBXYWl0aW5nIGZvciAke1dFQlZJRVdfQ09OVEVYVF9QUkVGSVh9IGNvbnRleHQgKHRpbWVvdXQ9JHtTdHJpbmcodGhpcy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzKX1tcykuLi5gKTtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGNvbnN0IGNvbnRleHRzID0gYXdhaXQgdGhpcy5icm93c2VyLmdldENvbnRleHRzKCk7XG4gICAgICBjb25zdCBvYnNpZGlhbkNvbnRleHQgPSBjb250ZXh0cy5maW5kKChjb250ZXh0KTogY29udGV4dCBpcyBzdHJpbmcgPT4gdHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnICYmIGNvbnRleHQuc3RhcnRzV2l0aChXRUJWSUVXX0NPTlRFWFRfUFJFRklYKSk7XG5cbiAgICAgIGlmIChvYnNpZGlhbkNvbnRleHQpIHtcbiAgICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gRm91bmQgV2ViVmlldyBjb250ZXh0OiAke29ic2lkaWFuQ29udGV4dH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmJyb3dzZXIuc3dpdGNoQ29udGV4dChvYnNpZGlhbkNvbnRleHQpO1xuICAgICAgICAgIHRoaXMuaXNJbldlYlZpZXdDb250ZXh0ID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gc3dpdGNoQ29udGV4dCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX0uIFJlc2V0dGluZyB0byBOQVRJVkVfQVBQIGJlZm9yZSByZXRyeWluZy4uLmApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmJyb3dzZXIuc3dpdGNoQ29udGV4dCgnTkFUSVZFX0FQUCcpO1xuICAgICAgICAgIH0gY2F0Y2ggKHJlc2V0RXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIE5BVElWRV9BUFAgcmVzZXQgYWxzbyBmYWlsZWQ6ICR7U3RyaW5nKHJlc2V0RXJyb3IpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBXZWJWaWV3IG5vdCByZWFkeSwgYXZhaWxhYmxlIGNvbnRleHRzOiAke0pTT04uc3RyaW5naWZ5KGNvbnRleHRzKX0uIFJldHJ5aW5nLi4uYCk7XG4gICAgICBhd2FpdCBkZWxheShXRUJWSUVXX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vICR7V0VCVklFV19DT05URVhUX1BSRUZJWH0gY29udGV4dCBmb3VuZCB3aXRoaW4gJHtTdHJpbmcodGhpcy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzKX1tcy4gSXMgdGhlIE9ic2lkaWFuIGFwcCBmdWxseSBsb2FkZWQ/YCk7XG4gIH1cblxuICAvKipcbiAgICogUnVucyBvbmUgRXhlY3V0ZSBTY3JpcHQgdW5kZXIgdGhlIHBlci1ldmFsIGNhcCwgcmFpc2luZyB7QGxpbmsgRXZhbENhcEV4Y2VlZGVkRXJyb3J9IGlmIGl0IG91dGxhc3RzIGl0LlxuICAgKlxuICAgKiBUaGUgY2FwIGNvdmVycyB0aGUgc2NyaXB0IEFMT05FIFx1MjAxNCBgZW5zdXJlV2ViVmlld0NvbnRleHRgIGFuZCBgZW5zdXJlSW5wdXRDaGFubmVsYCBydW4gYmVmb3JlIGl0LFxuICAgKiBiZWNhdXNlIGEgYHN3aXRjaENvbnRleHRgIGxlZ2l0aW1hdGVseSBjb3N0cyB+MTdzICgqKkwxOSoqKSBhbmQgY2hhcmdpbmcgdGhhdCB0byBhIHRlc3QncyBvd24gYnVkZ2V0XG4gICAqIHdvdWxkIHJlcG9ydCB0aGUgaGFybmVzcydzIHNldHVwIGFzIHRoZSB0ZXN0J3Mgb3ZlcnJ1bi5cbiAgICpcbiAgICogVGhlIGFiYW5kb25lZCByZXF1ZXN0IGlzIGRlbGliZXJhdGVseSBsZWZ0IGluIGZsaWdodCByYXRoZXIgdGhhbiBjYW5jZWxsZWQuIE5vdGhpbmcgY2FuIGNhbmNlbCBpdDpcbiAgICogYFJ1bnRpbWUudGVybWluYXRlRXhlY3V0aW9uYCBvdmVyIHRoZSB0cmFuc3BvcnQncyBvd24gQ0RQIGNoYW5uZWwgd2FzIG1lYXN1cmVkIHJlbGVhc2luZyBub3RoaW5nLFxuICAgKiBhbmQgYSBndWVzdC1zaWRlIGFib3J0IGhvb2sgY291bGQgbm90IGV2ZW4gYmUgaW5zdGFsbGVkIGluIHRpbWUuIFdoYXQgdGhlIHNhbWUgcnVucyBkaWQgc2hvdyBpcyB0aGF0XG4gICAqIHRoZSBzZXNzaW9uIHVzdWFsbHkga2VlcHMgc2VydmluZyBcdTIwMTQgYSB2YXVsdCByZWFkLWJhY2sgd2FzIGFuc3dlcmVkIDUyOG1zIGFmdGVyIG9uZSBzdWNoIGFiYW5kb25tZW50LFxuICAgKiB3aXRoIHRoZSBzZXNzaW9uIGZyZWUgXHUyMDE0IHNvIGJvdW5kaW5nIHRoZSB3YWl0IGNvc3RzIGEgdGVzdCBpdHMgY2xvc3VyZSwgbm90IHRoZSByZXN0IG9mIGl0cyBzdWl0ZS5cbiAgICpcbiAgICogQHBhcmFtIHNjcmlwdCAtIFRoZSBzY3JpcHQgdG8gcnVuLCBhbHJlYWR5IHdyYXBwZWQgaW4gaXRzIGByZXR1cm4gKC4uLilgLlxuICAgKiBAcmV0dXJucyBUaGUgc2NyaXB0J3MgcmVzdWx0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBldmFsdWF0ZVdpdGhpbkNhcChzY3JpcHQ6IHN0cmluZyk6IFByb21pc2U8bnVsbCB8IHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIC8qXG4gICAgICogVGhlIGV2YWwgQUZURVIgYW4gb3ZlcnJ1biBnZXRzIGEgZ3JhY2UgcGVyaW9kIG9uIHRvcCBvZiB0aGUgY2FwLCBhbmQgdGhpcyBpcyBub3QgZ2VuZXJvc2l0eS4gQXBwaXVtXG4gICAgICogU2VyaWFsaXplcyBjb21tYW5kcyBwZXIgc2Vzc2lvbiwgYW5kIGFuIGFiYW5kb25lZCBjbG9zdXJlIGtlZXBzIHJ1bm5pbmcgaW4gdGhlIGd1ZXN0IFx1MjAxNCBzbyB0aGUgbmV4dFxuICAgICAqIENvbW1hbmQgcXVldWVzIGJlaGluZCB3aGF0ZXZlciBpcyBsZWZ0IG9mIGl0IGFuZCwgb24gdGhlIGJhcmUgY2FwLCBpcyBjYXBwZWQgaW4gaXRzIHR1cm4uIFRoYXQgaXNcbiAgICAgKiBNZWFzdXJlZDogd2l0aCB0aGUgY2FwIGZpcmluZyBhdCAzMHMgYWdhaW5zdCBhIDQwcyBjbG9zdXJlLCB0aGUgZm9sbG93aW5nIHZhdWx0IHJlYWQtYmFjayBmYWlsZWQgYXRcbiAgICAgKiAzMCAyMDZtcywgd2hpbGUgdGhlIHNhbWUgcmVhZC1iYWNrIGlzc3VlZCBhZnRlciB0aGUgY2xvc3VyZSBoYWQgZmluaXNoZWQgd2FzIGFuc3dlcmVkIGluIDUyOG1zLlxuICAgICAqXG4gICAgICogV2FpdGluZyBvbiB0aGUgYWJhbmRvbmVkIHJlcXVlc3QgaW5zdGVhZCB3b3VsZCBub3Qgd29yazogdGhhdCBwcm9taXNlIGlzIHRoZSBvbmUgdGhhdCBuZXZlciBzZXR0bGVzLlxuICAgICAqIFdoYXQgZnJlZXMgdGhlIHNlc3Npb24gaXMgdGhlIEdVRVNUIGZpbmlzaGluZywgb24gYSBzY2hlZHVsZSB0aGlzIHNpZGUgY2Fubm90IGtub3cgXHUyMDE0IHNvIHRoZSBncmFjZSBpc1xuICAgICAqIGEgY2VpbGluZywgbm90IGEgZGVsYXkuIEl0IGNvc3RzIG5vdGhpbmcgd2hlbiB0aGUgc2Vzc2lvbiBjb21lcyBiYWNrIHByb21wdGx5LCB3aGljaCBpcyB0aGUgbm9ybS5cbiAgICAgKi9cbiAgICBjb25zdCBidWRnZXRJbk1pbGxpc2Vjb25kcyA9IHRoaXMuaXNSZWNvdmVyaW5nRnJvbUNhcE92ZXJydW5cbiAgICAgID8gdGhpcy5zY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHMgKyBDQVBfUkVDT1ZFUllfR1JBQ0VfSU5fTUlMTElTRUNPTkRTXG4gICAgICA6IHRoaXMuc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzO1xuICAgIHRoaXMuaXNSZWNvdmVyaW5nRnJvbUNhcE92ZXJydW4gPSBmYWxzZTtcblxuICAgIGxldCBjYXBUaW1lcjogTm9kZUpTLlRpbWVvdXQgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBjYXAgPSBuZXcgUHJvbWlzZTxuZXZlcj4oKF9yZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNhcFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNSZWNvdmVyaW5nRnJvbUNhcE92ZXJydW4gPSB0cnVlO1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IEV2YWxDYXBFeGNlZWRlZEVycm9yKHtcbiAgICAgICAgICAgIGNhcEluTWlsbGlzZWNvbmRzOiBidWRnZXRJbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgICAgIGNhdXNlOiBuZXcgRXJyb3IoYFRoZSBBcHBpdW0gRXhlY3V0ZSBTY3JpcHQgY2FycnlpbmcgdGhpcyBjbG9zdXJlIGRpZCBub3QgYW5zd2VyIHdpdGhpbiAke1N0cmluZyhidWRnZXRJbk1pbGxpc2Vjb25kcyl9bXMuYCksXG4gICAgICAgICAgICBvcHRpb25OYW1lOiAnc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzJyxcbiAgICAgICAgICAgIHRyYW5zcG9ydE5hbWU6ICdBbmRyb2lkIChBcHBpdW0pJ1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9LCBidWRnZXRJbk1pbGxpc2Vjb25kcyk7XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgIHRoaXMuYnJvd3Nlci5leGVjdXRlPG51bGwgfCBzdHJpbmcgfCB1bmRlZmluZWQsIFtdPihzY3JpcHQpLFxuICAgICAgICBjYXBcbiAgICAgIF0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoY2FwVGltZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQoY2FwVGltZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGhvc3Qtc2lkZSB2YXVsdCBwYXRoIHRvIHRoZSBkZXZpY2Utc2lkZSBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gQWJzb2x1dGUgcGF0aCBvbiB0aGUgaG9zdCBtYWNoaW5lLlxuICAgKiBAcmV0dXJucyBUaGUgZGV2aWNlLXNpZGUgdmF1bHQgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgZ2V0RGV2aWNlVmF1bHRQYXRoKHZhdWx0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy52YXVsdEJhc2VQYXRofSR7ZXh0cmFjdFZhdWx0TmFtZSh2YXVsdFBhdGgpfWA7XG4gIH1cblxuICAvKipcbiAgICogU2VydmljZXMgb25lIGlucHV0IHJlcXVlc3QgZnJvbSB0aGUgcmVuZGVyZXI6IGluamVjdCwgdGhlbiByZXNvbHZlIHRoZSByZW5kZXJlcidzIHByb21pc2UuXG4gICAqXG4gICAqIEV2ZXJ5IGZhaWx1cmUgcGF0aCBzdGlsbCByZXNvbHZlcyB0aGF0IHByb21pc2UgXHUyMDE0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSB0aGUgcmVuZGVyZXIgcmUtdGhyb3dzIFx1MjAxNCBiZWNhdXNlXG4gICAqIGEgcmVxdWVzdCB0aGF0IGlzIHNpbGVudGx5IGRyb3BwZWQgd291bGQgaGFuZyB0aGUgY2xvc3VyZSB1bnRpbCB0aGUgd2hvbGUgcnVuIHRpbWVzIG91dCwgYW5kIHJlcG9ydFxuICAgKiBub3RoaW5nIGFib3V0IHdoeS5cbiAgICpcbiAgICogQHBhcmFtIGNvbm5lY3Rpb24gLSBUaGUgY2hhbm5lbCB0aGUgcmVxdWVzdCBhcnJpdmVkIG9uLlxuICAgKiBAcGFyYW0gcGF5bG9hZCAtIFRoZSByYXcgSlNPTiBwYXlsb2FkIHRoZSBiaW5kaW5nIHdhcyBjYWxsZWQgd2l0aC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlSW5wdXRSZXF1ZXN0KGNvbm5lY3Rpb246IFdlYlZpZXdDZHBDb25uZWN0aW9uLCBwYXlsb2FkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgcmVxdWVzdElkID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgaWQsIHJlcXVlc3QgfSA9IEpTT04ucGFyc2UocGF5bG9hZCkgYXMgTW9iaWxlSW5wdXRFbnZlbG9wZTtcbiAgICAgIHJlcXVlc3RJZCA9IGlkO1xuXG4gICAgICAvLyBFeGFjdGx5LW9uY2UgYWNyb3NzIGV2ZXJ5IGF0dGFjaGVkIGhvc3QuIGBSdW50aW1lLmJpbmRpbmdDYWxsZWRgIGlzIGJyb2FkY2FzdCB0byBBTEwgYXR0YWNoZWRcbiAgICAgIC8vIENEUCBzZXNzaW9ucywgc28gd2l0aG91dCB0aGlzIGVhY2ggcHJvY2VzcyBpbmplY3RzIHRoZSBnZXN0dXJlIGFnYWluOiBtZWFzdXJlZCAyMDI2LTA5LTEwLCBhXG4gICAgICAvLyBWaXRlc3QgbWFpbiBwcm9jZXNzIGFuZCBpdHMgd29ya2VyIHNlcnZpY2VkIHJlcXVlc3QgYGlkPTFgIGluIHRoZSBzYW1lIG1pbGxpc2Vjb25kLCBhbmQgb25lXG4gICAgICAvLyBgY2xpY2tFbGVtZW50YCByZWFjaGVkIHRoZSBwYWdlIGFzIHR3byBgcG9pbnRlcmRvd25gIC8gYHRvdWNoc3RhcnRgIHBhaXJzLlxuICAgICAgLy9cbiAgICAgIC8vIEEgTE9TRVIgTVVTVCBSRVRVUk4gU0lMRU5UTFk6IHRoZSB3aW5uZXIgaXMgdGhlIG9uZSB0aGF0IGluamVjdHMgYW5kIHRoZSBvbmUgdGhhdCByZXNvbHZlcyB0aGVcbiAgICAgIC8vIHJlbmRlcmVyJ3MgcHJvbWlzZSwgc28gYW5zd2VyaW5nIGhlcmUgYXMgd2VsbCB3b3VsZCByZXNvbHZlIGEgcmVxdWVzdCB3aG9zZSBnZXN0dXJlIHRoaXNcbiAgICAgIC8vIHByb2Nlc3MgbmV2ZXIgc2VudC5cbiAgICAgIGNvbnN0IGNsYWltID0gYXdhaXQgY29ubmVjdGlvbi5zZW5kKCdSdW50aW1lLmV2YWx1YXRlJywgeyBleHByZXNzaW9uOiBidWlsZENsYWltSW5wdXRFeHByZXNzaW9uKGlkKSwgcmV0dXJuQnlWYWx1ZTogdHJ1ZSB9KTtcbiAgICAgIGlmICghY2hlY2tJbnB1dENsYWltR3JhbnRlZChjbGFpbSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmRBbGwodG9DZHBJbnB1dENvbW1hbmRzKHJlcXVlc3QpKTtcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZCgnUnVudGltZS5ldmFsdWF0ZScsIHsgZXhwcmVzc2lvbjogYnVpbGRSZXNvbHZlSW5wdXRFeHByZXNzaW9uKGlkKSB9KTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yVG9TdHJpbmcoZXJyb3IpO1xuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gVHJ1c3RlZCBpbnB1dCBmYWlsZWQ6ICR7bWVzc2FnZX1gKTtcbiAgICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5zZW5kKCdSdW50aW1lLmV2YWx1YXRlJywgeyBleHByZXNzaW9uOiBidWlsZFJlc29sdmVJbnB1dEV4cHJlc3Npb24ocmVxdWVzdElkLCBtZXNzYWdlKSB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBUaGUgc29ja2V0IGlzIGdvbmU7IHRoZSByZW5kZXJlcidzIG93biB0aW1lb3V0IGlzIHRoZSByZW1haW5pbmcgYmFja3N0b3AuXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2JlcyB0aGUgV2ViVmlldyBvbmNlIGZvciBob3cgZmFyIE9ic2lkaWFuJ3Mgc3RhcnR1cCBoYXMgZ290LlxuICAgKlxuICAgKiBBIHByb2JlIHRoYXQgdGhyb3dzIGlzIHJlcG9ydGVkIGFzIGB1bmRlZmluZWRgIHJhdGhlciB0aGFuIHByb3BhZ2F0ZWQ6IHRoZVxuICAgKiBwYWdlIGlzIG1pZC1gbG9jYXRpb24ucmVsb2FkKClgIGZvciBtb3N0IG9mIHRoZSBhcHAtc3RhcnQgcGhhc2UsIGFuZCBhXG4gICAqIFdlYlZpZXcgdGhhdCBjYW5ub3QgYW5zd2VyIHlldCBpcyB0aGUgKmV4cGVjdGVkKiByZWFkaW5nIHRoZXJlLCBub3QgYW4gZXJyb3IuXG4gICAqXG4gICAqIEByZXR1cm5zIFdoYXQgdGhlIHByb2JlIHNhdywgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBjb3VsZCBub3QgcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9iZVN0YXJ0dXAoKTogUHJvbWlzZTxTdGFydHVwUHJvYmVSZXN1bHQgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYnJvd3Nlci5leGVjdXRlKCgpOiBTdGFydHVwUHJvYmVSZXN1bHQgPT4ge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgLS0gV2UgbmVlZCBnbG9iYWwgYGFwcGAgdmFyaWFibGUuXG4gICAgICAgIGNvbnN0IGFwcCA9IGdsb2JhbFRoaXMuYXBwIGFzIExvYWRpbmdBcHAgfCB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaGFzQXBwOiAhIWFwcCxcbiAgICAgICAgICBoYXNXb3Jrc3BhY2U6ICEhYXBwPy53b3Jrc3BhY2UsXG4gICAgICAgICAgaXNMYXlvdXRSZWFkeTogISFhcHA/LndvcmtzcGFjZT8ubGF5b3V0UmVhZHlcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHVzaGVzIHRoZSBtaW5pbWFsIGAub2JzaWRpYW4vYXBwLmpzb25gIHZhdWx0IG1hcmtlciB2aWEgYGFkYiBwdXNoYC5cbiAgICpcbiAgICogYGJyb3dzZXIucHVzaEZpbGVgIChXZWJEcml2ZXIgYmFzZTY0KSBpcyBhbiBvcmRlciBvZiBtYWduaXR1ZGUgc2xvd2VyIG9uIGFcbiAgICogY29sZCBvciBsb2FkZWQgZW11bGF0b3IgXHUyMDE0IG1lYXN1cmVkIGF0IDlcdTIwMTMyMXMgcGVyIGNhbGwgZm9yIHRoaXMgMi1ieXRlIG1hcmtlcixcbiAgICogdmVyc3VzIHN1Yi1zZWNvbmQgb3ZlciBgYWRiYC4gVGhpcyBtaXJyb3JzIHtAbGluayBwdXNoRmlsZXN9LCB3aGljaCBzd2l0Y2hlZFxuICAgKiB0byBgYWRiYCBmb3IgdGhlIHNhbWUgcmVhc29uLiBgbWtkaXIgLXBgIGd1YXJhbnRlZXMgdGhlIHBhcmVudCBkaXJlY3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VWYXVsdFBhdGggLSBUaGUgZGV2aWNlLXNpZGUgdmF1bHQgZGlyZWN0b3J5IHBhdGguXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHB1c2hPYnNpZGlhbk1hcmtlcihkZXZpY2VWYXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvY2FsTWFya2VyID0gam9pbih0bXBkaXIoKSwgYG9ic2lkaWFuLW1hcmtlci0ke3JhbmRvbVVVSUQoKX0uanNvbmApO1xuICAgIGNvbnN0IHJlbW90ZU1hcmtlciA9IGAke2RldmljZVZhdWx0UGF0aH0vLm9ic2lkaWFuL2FwcC5qc29uYDtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3cml0ZUZpbGUobG9jYWxNYXJrZXIsICd7fScsICd1dGYtOCcpO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdta2RpcicsICctcCcsIGAke2RldmljZVZhdWx0UGF0aH0vLm9ic2lkaWFuYF0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAncHVzaCcsIGxvY2FsTWFya2VyLCByZW1vdGVNYXJrZXJdLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHJtKGxvY2FsTWFya2VyLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgdmF1bHQgZGlyZWN0b3J5IGZyb20gdGhlIGRldmljZSBvdmVyIGBhZGJgLCBhbmQgQ0hFQ0tTIHRoYXQgaXQgaXNcbiAgICogYWN0dWFsbHkgZ29uZS5cbiAgICpcbiAgICogQmVzdC1lZmZvcnQ6IGEgZmFpbHVyZSBpcyBsb2dnZWQsIG5vdCB0aHJvd24sIHNvIGEgdGVhcmRvd24gcHJvYmxlbSBuZXZlclxuICAgKiBtYXNrcyB0aGUgdGVzdCByZXN1bHQuIFRoZSBuZXh0IHJ1bidzIHN0YXJ0LW9mLXJ1biBzd2VlcCBwaWNrcyB1cCB3aGF0ZXZlclxuICAgKiB0aGlzIGNvdWxkIG5vdCByZW1vdmUuXG4gICAqXG4gICAqIFRoZSBjaGVjayBpcyB0aGUgcG9pbnQuIGBybSAtcmZgIHJ1bnMgd2l0aCBgc2hvdWxkSWdub3JlRXhpdENvZGVgLCBzbyBhblxuICAgKiB1bnJlbW92ZWQgZGlyZWN0b3J5IHVzZWQgdG8gbGVhdmUgbm8gdHJhY2UgYXQgYWxsIFx1MjAxNCB3aGljaCBpcyBob3cgcnVucyB0aGF0XG4gICAqIHBhc3NlZCBlbmQgdG8gZW5kIHdlcmUgc3RpbGwgZm91bmQgdG8gYmUgbGVha2luZyBhIHZhdWx0IGFwaWVjZSwgaW52aXNpYmx5LFxuICAgKiB1bnRpbCBzb21lb25lIGNvdW50ZWQgdGhlIGRpcmVjdG9yaWVzIG9uIHRoZSBkZXZpY2UgYnkgaGFuZC4gQSBsZWFrIGlzIG5vd1xuICAgKiBuYW1lZCBpbiB0aGUgbG9nIGF0IHRoZSBtb21lbnQgaXQgaGFwcGVucy5cbiAgICpcbiAgICogQHBhcmFtIGRldmljZVZhdWx0UGF0aCAtIFRoZSBkZXZpY2Utc2lkZSB2YXVsdCBkaXJlY3RvcnkgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlRGV2aWNlVmF1bHREaXJlY3RvcnkoZGV2aWNlVmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gUmVtb3ZpbmcgdmF1bHQgZGlyZWN0b3J5IGZyb20gZGV2aWNlOiAke2RldmljZVZhdWx0UGF0aH1gKTtcbiAgICAgIGF3YWl0IGV4ZWMoXG4gICAgICAgIFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ3JtJywgJy1yZicsIGRldmljZVZhdWx0UGF0aF0sXG4gICAgICAgIHsgaXNRdWlldDogdHJ1ZSwgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWUsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogQURCX1ZBVUxUX1JFTU9WRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBsaXN0aW5nID0gYXdhaXQgZXhlYyhcbiAgICAgICAgWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAnbHMnLCAnLWQnLCBkZXZpY2VWYXVsdFBhdGhdLFxuICAgICAgICB7IGlzUXVpZXQ6IHRydWUsIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IEFEQl9WQVVMVF9SRU1PVkVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfVxuICAgICAgKTtcblxuICAgICAgaWYgKGxpc3RpbmcuaW5jbHVkZXMoZGV2aWNlVmF1bHRQYXRoKSkge1xuICAgICAgICBsb2coXG4gICAgICAgICAgYFthcHBpdW0tdHJhbnNwb3J0XSBXYXJuaW5nOiAke2RldmljZVZhdWx0UGF0aH0gc3Vydml2ZWQgcmVtb3ZhbCBhbmQgaXMgbm93IGxlYWtlZCByZXNpZHVlLiBgXG4gICAgICAgICAgICArICdUaGUgbmV4dCBydW5cXCdzIHN0YXJ0LW9mLXJ1biBzd2VlcCB3aWxsIHJldHJ5IGl0LidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gVmF1bHQgZGlyZWN0b3J5IHJlbW92YWwgZmFpbGVkIChub24tZmF0YWwpOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyb3BzIHRoZSBgcHJvY2Vzcy5vbignZXhpdCcpYCBoYW5kbGVyIHRoYXQgd291bGQgb3RoZXJ3aXNlIGNsb3NlIGFuIGFscmVhZHktY2xvc2VkIGNoYW5uZWwsIGFuZCB3b3VsZFxuICAgKiBzdGFjayBhIGxpc3RlbmVyIHBlciByZWNvbm5lY3QuXG4gICAqL1xuICBwcml2YXRlIHVucmVnaXN0ZXJJbnB1dENoYW5uZWxFeGl0SGFuZGxlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlzcG9zZUlucHV0Q2hhbm5lbE9uRXhpdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHByb2Nlc3Mub2ZmKCdleGl0JywgdGhpcy5kaXNwb3NlSW5wdXRDaGFubmVsT25FeGl0KTtcbiAgICB0aGlzLmRpc3Bvc2VJbnB1dENoYW5uZWxPbkV4aXQgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGxzIHVudGlsIGBnbG9iYWxUaGlzLmFwcGAgZXhpc3RzIGluIHRoZSBXZWJWaWV3IFx1MjAxNCB0aGUgYXBwIGhhcyBmaW5pc2hlZFxuICAgKiBpdHMgY29sZCBzdGFydCBhbmQgT2JzaWRpYW4ncyBvd24gYm9vdCBoYXMgYmVndW4uXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlICoqZmlyc3QqKiBvZiB0aGUgdHdvIGJ1ZGdldHMgc3BlbnQgYWZ0ZXIgYGxvY2F0aW9uLnJlbG9hZCgpYCxcbiAgICogYW5kIHRoZSBnZW5lcm91cyBvbmUuIEV2ZXJ5dGhpbmcgaXQgcGF5cyBmb3IgaXMgb3V0c2lkZSBPYnNpZGlhbidzIGNvbnRyb2w6XG4gICAqIHRoZSBXZWJWaWV3IHJlbG9hZGluZywgYW5kIGEgZ3Vlc3QgdGhhdCBtYXkgc3RpbGwgYmUgb3B0aW1pemluZyBwYWNrYWdlcy5cbiAgICogS2VlcGluZyBpdCBzZXBhcmF0ZSBpcyB0aGUgcG9pbnQgb2YgdGhlIHNwbGl0IFx1MjAxNCB0aGUgb2xkIHNpbmdsZSB3YWxsIGNsb2NrXG4gICAqIHN0YXJ0ZWQgaGVyZSBhbmQgbGVmdCB0aGUgdGlnaHQgbGF5b3V0IGJ1ZGdldCBwYXlpbmcgZm9yIGEgY29sZCBzdGFydC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckFwcFN0YXJ0ZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gV2FpdGluZyBmb3IgdGhlIGFwcCB0byBzdGFydCAodGltZW91dD0ke1N0cmluZyh0aGlzLmFwcFN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzKX1tcykuLi5gKTtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JTdGFydHVwTWlsZXN0b25lKHtcbiAgICAgIGlzU2F0aXNmaWVkOiBjaGVja0FwcFN0YXJ0ZWQsXG4gICAgICBwaGFzZTogJ2FwcC1zdGFydCcsXG4gICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IHRoaXMuYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xscyB1bnRpbCBgYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeWAgaXMgYHRydWVgIGluIHRoZSBXZWJWaWV3LlxuICAgKlxuICAgKiBUaGUgKipzZWNvbmQqKiBidWRnZXQsIGFuZCB0aGUgdGlnaHQgb25lOiBieSB0aGUgdGltZSBpdCBzdGFydHMsIHRoZSBhcHAgaXNcbiAgICogYWxyZWFkeSB1cCwgc28gYWxsIGl0IGNvdmVycyBpcyBPYnNpZGlhbiBvcGVuaW5nIHRoZSB2YXVsdCBhbmQgbG9hZGluZ1xuICAgKiBwbHVnaW5zIFx1MjAxNCB+MXMgaW4gcHJhY3RpY2UsIFx1MjI2NDguNHMgdW5kZXIgaGVhdnkgaG9zdCBzdHJlc3MgKCoqTDE5KiopLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yTGF5b3V0UmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gV2FpdGluZyBmb3IgbGF5b3V0IHJlYWR5ICh0aW1lb3V0PSR7U3RyaW5nKHRoaXMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zKS4uLmApO1xuICAgIGF3YWl0IHRoaXMud2FpdEZvclN0YXJ0dXBNaWxlc3RvbmUoe1xuICAgICAgaXNTYXRpc2ZpZWQ6IGNoZWNrTGF5b3V0UmVhZHksXG4gICAgICBwaGFzZTogJ2xheW91dC1yZWFkeScsXG4gICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IHRoaXMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xscyB0aGUgV2ViVmlldyB1bnRpbCBhIHN0YXJ0dXAgcGhhc2UncyBtaWxlc3RvbmUgaXMgc2F0aXNmaWVkLCB0cmFja2luZ1xuICAgKiB0aGUgZXZpZGVuY2UgdGhhdCB0ZWxscyBhIHNsb3cgT2JzaWRpYW4gZnJvbSBhIGNvbnRlbmRlZCBndWVzdC5cbiAgICpcbiAgICogRWFjaCBwb2xsIGNvc3RzIGV4YWN0bHkgb25lIGBicm93c2VyLmV4ZWN1dGVgIHJvdW5kLXRyaXAgXHUyMDE0IGRlbGliZXJhdGVseSBub3RcbiAgICogYW4ge0BsaW5rIGVuc3VyZVdlYlZpZXdDb250ZXh0fSBjYWxsLCB3aG9zZSBgZ2V0Q29udGV4dHMoKWAgcnVuc1xuICAgKiBgYWRiIHNoZWxsIGNhdCAvcHJvYy9uZXQvdW5peGAgYW5kIHdhcyBtZWFzdXJlZCBhdCB+MTdzIHBlciAqKkwxOSoqLiBUaGVcbiAgICogcm91bmQtdHJpcCBpcyB0aW1lZCwgYW5kIHRoZSBzbG93ZXN0IG9uZSBpcyByZXBvcnRlZCBvbiB0aW1lb3V0OiBhIHBoYXNlXG4gICAqIHRoYXQgcmFuIG91dCBhZnRlciBhIGhhbmRmdWwgb2YgcHJvYmVzIGVhY2ggdGFraW5nIHRlbnMgb2Ygc2Vjb25kcyB3YXNcbiAgICogc3RhcnZlZCBieSB0aGUgZ3Vlc3QsIG5vdCBieSBPYnNpZGlhbi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwaGFzZSwgaXRzIGJ1ZGdldCwgYW5kIHRoZSBwcmVkaWNhdGUgdGhhdCBlbmRzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yU3RhcnR1cE1pbGVzdG9uZShwYXJhbXM6IEFwcGl1bVRyYW5zcG9ydFdhaXRGb3JTdGFydHVwTWlsZXN0b25lUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBpc1NhdGlzZmllZCwgcGhhc2UsIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IHN0YXJ0ICsgdGltZW91dEluTWlsbGlzZWNvbmRzO1xuXG4gICAgbGV0IGZ1cnRoZXN0TWlsZXN0b25lOiBBcHBTdGFydHVwTWlsZXN0b25lID0gJ25vLXdlYnZpZXcnO1xuICAgIGxldCBwb2xsQ291bnQgPSAwO1xuICAgIGxldCBzbG93ZXN0Um91bmRUcmlwSW5NaWxsaXNlY29uZHMgPSAwO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgY29uc3Qgcm91bmRUcmlwU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgbWlsZXN0b25lID0gY2xhc3NpZnlBcHBTdGFydHVwUHJvYmUoYXdhaXQgdGhpcy5wcm9iZVN0YXJ0dXAoKSk7XG4gICAgICBjb25zdCByb3VuZFRyaXBJbk1pbGxpc2Vjb25kcyA9IERhdGUubm93KCkgLSByb3VuZFRyaXBTdGFydDtcblxuICAgICAgcG9sbENvdW50Kys7XG4gICAgICBzbG93ZXN0Um91bmRUcmlwSW5NaWxsaXNlY29uZHMgPSBNYXRoLm1heChzbG93ZXN0Um91bmRUcmlwSW5NaWxsaXNlY29uZHMsIHJvdW5kVHJpcEluTWlsbGlzZWNvbmRzKTtcbiAgICAgIGlmIChjb21wYXJlQXBwU3RhcnR1cE1pbGVzdG9uZXMobWlsZXN0b25lLCBmdXJ0aGVzdE1pbGVzdG9uZSkgPiAwKSB7XG4gICAgICAgIGZ1cnRoZXN0TWlsZXN0b25lID0gbWlsZXN0b25lO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNTYXRpc2ZpZWQobWlsZXN0b25lKSkge1xuICAgICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBQaGFzZSBcIiR7cGhhc2V9XCIgc2F0aXNmaWVkIGFmdGVyICR7U3RyaW5nKERhdGUubm93KCkgLSBzdGFydCl9bXMgKCR7U3RyaW5nKHBvbGxDb3VudCl9IHByb2JlKHMpKS5gKTtcbiAgICAgICAgdGhpcy5pc0luV2ViVmlld0NvbnRleHQgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxvZyhcbiAgICAgICAgYFthcHBpdW0tdHJhbnNwb3J0XSBQaGFzZSBcIiR7cGhhc2V9XCIgbm90IHNhdGlzZmllZCB5ZXQ6ICR7bWlsZXN0b25lfSBgXG4gICAgICAgICAgKyBgKGVsYXBzZWQ9JHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcywgcm91bmQtdHJpcD0ke1N0cmluZyhyb3VuZFRyaXBJbk1pbGxpc2Vjb25kcyl9bXMpLiBSZXRyeWluZy4uLmBcbiAgICAgICk7XG4gICAgICBhd2FpdCBkZWxheShMQVlPVVRfUkVBRFlfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihidWlsZFN0YXJ0dXBUaW1lb3V0TWVzc2FnZSh7XG4gICAgICBlbGFwc2VkSW5NaWxsaXNlY29uZHM6IERhdGUubm93KCkgLSBzdGFydCxcbiAgICAgIG1pbGVzdG9uZTogZnVydGhlc3RNaWxlc3RvbmUsXG4gICAgICBwaGFzZSxcbiAgICAgIHBvbGxDb3VudCxcbiAgICAgIHNsb3dlc3RSb3VuZFRyaXBJbk1pbGxpc2Vjb25kcyxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgIH0pKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGdpdmVuIGRlbGF5LlxuICpcbiAqIEBwYXJhbSBtcyAtIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZGVsYXkuXG4gKi9cbmZ1bmN0aW9uIGRlbGF5KG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgc2V0VGltZW91dChyZXNvbHZlLCBtcyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSB2YXVsdCBkaXJlY3RvcnkgbmFtZSBmcm9tIGEgaG9zdC1zaWRlIHZhdWx0IHBhdGguXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIEFic29sdXRlIHBhdGggb24gdGhlIGhvc3QgbWFjaGluZS5cbiAqIEByZXR1cm5zIFRoZSBsYXN0IHBhdGggc2VnbWVudCAodmF1bHQgZGlyZWN0b3J5IG5hbWUpLlxuICovXG5mdW5jdGlvbiBleHRyYWN0VmF1bHROYW1lKHZhdWx0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHZhdWx0UGF0aC5yZXBsYWNlKC9bXFxcXC9dKyQvLCAnJyk7XG4gIGNvbnN0IGxhc3RTZXBhcmF0b3IgPSBNYXRoLm1heChub3JtYWxpemVkLmxhc3RJbmRleE9mKCcvJyksIG5vcm1hbGl6ZWQubGFzdEluZGV4T2YoJ1xcXFwnKSk7XG4gIHJldHVybiBub3JtYWxpemVkLnNsaWNlKGxhc3RTZXBhcmF0b3IgKyAxKTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQTRDQSxTQUFTLGtCQUFrQjtBQUMzQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QixTQUFTLFlBQVk7QUFnQnJCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHFCQUFxQjtBQUM5QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsd0NBQXdDO0FBQ2pELFNBQVMsWUFBWTtBQUNyQixTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLFdBQVc7QUFDcEI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFD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
|