valtech-components 2.0.827 → 2.0.829
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/esm2022/lib/services/auth/auth.service.mjs +72 -2
- package/esm2022/lib/version.mjs +2 -2
- package/fesm2022/valtech-components.mjs +72 -2
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/atoms/rights-footer/rights-footer.component.d.ts +1 -1
- package/lib/components/organisms/article/article.component.d.ts +2 -2
- package/lib/components/organisms/toolbar/toolbar.component.d.ts +1 -1
- package/lib/services/auth/auth.service.d.ts +31 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
|
@@ -97,6 +97,14 @@ export class AuthService {
|
|
|
97
97
|
}
|
|
98
98
|
// 3. Iniciar timer de refresco proactivo
|
|
99
99
|
this.startRefreshTimer();
|
|
100
|
+
// 4. Re-establecer la sesión de Firebase en bootstrap.
|
|
101
|
+
// El access token sigue válido, así que NO pasamos por la rama de
|
|
102
|
+
// refresh — pero la persistencia IndexedDB propia de Firebase Auth no
|
|
103
|
+
// sobrevive el contenedor de storage de una PWA standalone en iOS.
|
|
104
|
+
// Sin esto, `firebaseAuthReady` se queda en `false` para siempre y
|
|
105
|
+
// cualquier listener Firestore (ej. el inbox de notificaciones) cuelga.
|
|
106
|
+
// Fire-and-forget: NO debe demorar el resolve de initialize().
|
|
107
|
+
void this.ensureFirebaseSessionOnBootstrap();
|
|
100
108
|
}
|
|
101
109
|
else if (storedState.refreshToken) {
|
|
102
110
|
// 4. Token expirado pero hay refresh token - intentar refrescar
|
|
@@ -749,8 +757,15 @@ export class AuthService {
|
|
|
749
757
|
console.log('[ValtechAuth] Calling signInWithFirebase with token length:', response.firebaseToken.length);
|
|
750
758
|
this.signInWithFirebase(response.firebaseToken);
|
|
751
759
|
}
|
|
760
|
+
else if (this.config.enableFirebaseIntegration) {
|
|
761
|
+
// El login NO trajo firebaseToken (ej. flujo OAuth que lo perdió). En vez
|
|
762
|
+
// de quedar sin sesión de Firebase, recurrimos al fallback self-healing:
|
|
763
|
+
// /refresh sí devuelve un firebaseToken confiable.
|
|
764
|
+
console.log('[FBAuth] login response sin firebaseToken → recurriendo a fallback /refresh');
|
|
765
|
+
void this.reestablishFirebaseViaRefresh('login-missing-firebase-token');
|
|
766
|
+
}
|
|
752
767
|
else {
|
|
753
|
-
console.log('[ValtechAuth] Firebase signin skipped -
|
|
768
|
+
console.log('[ValtechAuth] Firebase signin skipped - integración Firebase desactivada');
|
|
754
769
|
}
|
|
755
770
|
// Registro automático de dispositivo para push notifications
|
|
756
771
|
if (this.config.enableDeviceRegistration) {
|
|
@@ -873,6 +888,61 @@ export class AuthService {
|
|
|
873
888
|
console.warn('[ValtechAuth] Firebase signout failed:', error);
|
|
874
889
|
}
|
|
875
890
|
}
|
|
891
|
+
/**
|
|
892
|
+
* Re-establece la sesión de Firebase Auth en el bootstrap de la app cuando
|
|
893
|
+
* el access token de la app sigue válido (la rama de initialize() que NO
|
|
894
|
+
* pasa por refresh).
|
|
895
|
+
*
|
|
896
|
+
* Firebase Auth mantiene su PROPIA sesión con persistencia IndexedDB
|
|
897
|
+
* independiente del storage de tokens de la app. En un navegador normal esa
|
|
898
|
+
* persistencia se auto-restaura sola; en una PWA standalone en iOS el
|
|
899
|
+
* contenedor de storage no sobrevive, y `firebaseAuthReady` se queda en
|
|
900
|
+
* `false` indefinidamente → los listeners Firestore cuelgan (~40s timeout).
|
|
901
|
+
*
|
|
902
|
+
* Estrategia: dar una ventana corta a la auto-restauración de Firebase y, si
|
|
903
|
+
* no ocurre, forzar un `refreshAccessToken()` — que ya hace `signInWithFirebase`
|
|
904
|
+
* con el `firebaseToken` que devuelve `/refresh`.
|
|
905
|
+
*
|
|
906
|
+
* Fire-and-forget: se invoca con `void` para no demorar `initialize()`.
|
|
907
|
+
*/
|
|
908
|
+
async ensureFirebaseSessionOnBootstrap() {
|
|
909
|
+
if (!this.config.enableFirebaseIntegration || !this.firebaseService)
|
|
910
|
+
return;
|
|
911
|
+
// Dar a la persistencia IndexedDB propia de Firebase Auth una oportunidad
|
|
912
|
+
// de auto-restaurarse (navegador normal). En una PWA standalone de iOS
|
|
913
|
+
// normalmente NO lo hará.
|
|
914
|
+
await new Promise(r => setTimeout(r, 2500));
|
|
915
|
+
if (this.firebaseService.firebaseAuthReady()) {
|
|
916
|
+
console.log('[FBAuth] bootstrap — Firebase session restored on its own');
|
|
917
|
+
return;
|
|
918
|
+
}
|
|
919
|
+
console.log('[FBAuth] bootstrap — session valid but Firebase NOT ready → recurriendo a fallback');
|
|
920
|
+
await this.reestablishFirebaseViaRefresh('bootstrap-session-restore');
|
|
921
|
+
}
|
|
922
|
+
/**
|
|
923
|
+
* Fallback self-healing de Firebase Auth. Pide un firebaseToken fresco vía
|
|
924
|
+
* `/refresh` (que sí lo devuelve de forma confiable) y, en éxito,
|
|
925
|
+
* `refreshAccessToken()` ya ejecuta `signInWithFirebase()`.
|
|
926
|
+
*
|
|
927
|
+
* Se invoca cuando un path de auth dejó la sesión de Firebase sin establecer:
|
|
928
|
+
* - login OAuth/password que volvió sin `firebaseToken`,
|
|
929
|
+
* - cold launch de PWA iOS sin persistencia de Firebase.
|
|
930
|
+
*
|
|
931
|
+
* `reason` aparece en los logs `[FBAuth] fallback` para poder atestiguar
|
|
932
|
+
* desde el debug-console qué disparó el fallback.
|
|
933
|
+
*/
|
|
934
|
+
async reestablishFirebaseViaRefresh(reason) {
|
|
935
|
+
if (!this.config.enableFirebaseIntegration || !this.firebaseService)
|
|
936
|
+
return;
|
|
937
|
+
console.log(`[FBAuth] fallback — re-estableciendo Firebase vía /refresh (motivo: ${reason})`);
|
|
938
|
+
try {
|
|
939
|
+
await firstValueFrom(this.refreshAccessToken());
|
|
940
|
+
console.log(`[FBAuth] fallback — /refresh OK, Firebase re-establecido (motivo: ${reason})`);
|
|
941
|
+
}
|
|
942
|
+
catch (e) {
|
|
943
|
+
console.warn(`[FBAuth] fallback — /refresh falló (motivo: ${reason}):`, e);
|
|
944
|
+
}
|
|
945
|
+
}
|
|
876
946
|
// =============================================
|
|
877
947
|
// DEVICE REGISTRATION (Push Notifications)
|
|
878
948
|
// =============================================
|
|
@@ -1141,4 +1211,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
1141
1211
|
}] }, { type: i9.I18nService, decorators: [{
|
|
1142
1212
|
type: Optional
|
|
1143
1213
|
}] }, { type: i10.ConfirmationDialogService }] });
|
|
1144
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9hdXRoL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBYSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHeEUsT0FBTyxFQUFjLFVBQVUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDdEYsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7Ozs7Ozs7Ozs7O0FBK0QvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsTUFBTSxPQUFPLFdBQVc7SUFLdEIsWUFDdUMsTUFBeUIsRUFDdEQsSUFBZ0IsRUFDaEIsTUFBYyxFQUNkLFlBQThCLEVBQzlCLFlBQTBCLEVBQzFCLGNBQWtDLEVBQ2xDLFdBQTRCLEVBQzVCLGVBQWdDLEVBQ2hDLFlBQTBCLEVBQ2QsZ0JBQXlDLEVBQ3pDLFdBQStCLEVBQzNDLG1CQUE4QztRQVhqQixXQUFNLEdBQU4sTUFBTSxDQUFtQjtRQUN0RCxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxpQkFBWSxHQUFaLFlBQVksQ0FBa0I7UUFDOUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsbUJBQWMsR0FBZCxjQUFjLENBQW9CO1FBQ2xDLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDZCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXlCO1FBQ3pDLGdCQUFXLEdBQVgs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QyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDOUUsRUFBRSxHQUFHLEtBQUssQ0FBQztRQUNiLENBQUM7UUFFRCxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDMUMsQ0FBQzsrR0FqeENVLFdBQVcsa0JBTVosbUJBQW1CO21IQU5sQixXQUFXLGNBREUsTUFBTTs7NEZBQ25CLFdBQVc7a0JBRHZCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFPN0IsTUFBTTsyQkFBQyxtQkFBbUI7OzBCQVMxQixRQUFROzswQkFDUixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPbkRlc3Ryb3ksIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yLCBvZiwgZnJvbSwgZmlyc3RWYWx1ZUZyb20sIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFwLCBjYXRjaEVycm9yLCBzd2l0Y2hNYXAsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgVkFMVEVDSF9BVVRIX0NPTkZJRyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IEF1dGhTdGF0ZVNlcnZpY2UgfSBmcm9tICcuL2F1dGgtc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBUb2tlblNlcnZpY2UgfSBmcm9tICcuL3Rva2VuLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aFN5bmNTZXJ2aWNlIH0gZnJvbSAnLi9zeW5jLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgU2lnbmluUmVxdWVzdCxcbiAgU2lnbmluUmVzcG9uc2UsXG4gIFNpZ251cFJlcXVlc3QsXG4gIFNpZ251cFJlc3BvbnNlLFxuICBWZXJpZnlFbWFpbFJlcXVlc3QsXG4gIFZlcmlmeUVtYWlsUmVzcG9uc2UsXG4gIFJlc2VuZENvZGVSZXF1ZXN0LFxuICBSZXNlbmRDb2RlUmVzcG9uc2UsXG4gIE1GQVZlcmlmeVJlc3BvbnNlLFxuICBSZWZyZXNoUmVzcG9uc2UsXG4gIEdldFBlcm1pc3Npb25zUmVzcG9uc2UsXG4gIEdldFByb2ZpbGVSZXNwb25zZSxcbiAgVXBkYXRlUHJvZmlsZVJlcXVlc3QsXG4gIFVwZGF0ZVByb2ZpbGVSZXNwb25zZSxcbiAgTUZBU2V0dXBSZXNwb25zZSxcbiAgTUZBQ29uZmlybVJlc3BvbnNlLFxuICBNRkFEaXNhYmxlUmVzcG9uc2UsXG4gIEZvcmdvdFBhc3N3b3JkUmVxdWVzdCxcbiAgRm9yZ290UGFzc3dvcmRSZXNwb25zZSxcbiAgUmVzZXRQYXNzd29yZFJlcXVlc3QsXG4gIFJlc2V0UGFzc3dvcmRSZXNwb25zZSxcbiAgQ2hhbmdlUGFzc3dvcmRSZXF1ZXN0LFxuICBDaGFuZ2VQYXNzd29yZFJlc3BvbnNlLFxuICBEZWxldGVBY2NvdW50UmVxdWVzdCxcbiAgRGVsZXRlQWNjb3VudFJlc3BvbnNlLFxuICBTd2l0Y2hPcmdSZXNwb25zZSxcbiAgTUZBTWV0aG9kLFxuICBBdXRoRXJyb3IsXG4gIEF1dGhTeW5jRXZlbnQsXG4gIFZhbHRlY2hBdXRoQ29uZmlnLFxuICBSZWdpc3RlckRldmljZVJlc3BvbnNlLFxuICBFbmFibGVOb3RpZmljYXRpb25zUmVzdWx0LFxuICBOb3RpZmljYXRpb25QZXJtaXNzaW9uU3RhdGUsXG4gIFJlZ2lzdGVyRGV2aWNlUmVzdWx0LFxuICAvLyBUT1RQIE1GQSB0eXBlc1xuICBUT1RQU2V0dXBSZXNwb25zZSxcbiAgVE9UUFZlcmlmeVNldHVwUmVzcG9uc2UsXG4gIFRPVFBEaXNhYmxlUmVzcG9uc2UsXG4gIFJlZ2VuZXJhdGVCYWNrdXBDb2Rlc1Jlc3BvbnNlLFxuICBCYWNrdXBDb2Rlc0NvdW50UmVzcG9uc2UsXG4gIC8vIE9BdXRoIHR5cGVzXG4gIE9BdXRoUHJvdmlkZXIsXG4gIE9BdXRoUmVzdWx0LFxuICBMaW5rZWRQcm92aWRlcixcbiAgSGFzUGFzc3dvcmRSZXNwb25zZSxcbiAgLy8gSGFuZGxlIHR5cGVzXG4gIFVwZGF0ZUhhbmRsZVJlc3BvbnNlLFxuICBDaGVja0hhbmRsZVJlc3BvbnNlLFxuICAvLyBBdmF0YXIgdHlwZXNcbiAgVXBkYXRlQXZhdGFyUmVxdWVzdCxcbiAgVXBkYXRlQXZhdGFyUmVzcG9uc2UsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgT0F1dGhTZXJ2aWNlIH0gZnJvbSAnLi9vYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IEZpcmViYXNlU2VydmljZSwgTWVzc2FnaW5nU2VydmljZSB9IGZyb20gJy4uL2ZpcmViYXNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlLCBJMThuTGFuZyB9IGZyb20gJy4uL2kxOG4nO1xuaW1wb3J0IHsgQ29uZmlybWF0aW9uRGlhbG9nU2VydmljZSB9IGZyb20gJy4uL2NvbmZpcm1hdGlvbi1kaWFsb2cvY29uZmlybWF0aW9uLWRpYWxvZy5zZXJ2aWNlJztcblxuLyoqXG4gKiBTZXJ2aWNpbyBwcmluY2lwYWwgZGUgYXV0ZW50aWNhY2nDs24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAndmFsdGVjaC1jb21wb25lbnRzJztcbiAqXG4gKiBAQ29tcG9uZW50KHsuLi59KVxuICogZXhwb3J0IGNsYXNzIExvZ2luQ29tcG9uZW50IHtcbiAqICAgcHJpdmF0ZSBhdXRoID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAqXG4gKiAgIGFzeW5jIGxvZ2luKCkge1xuICogICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuYXV0aC5zaWduaW4oeyBlbWFpbCwgcGFzc3dvcmQgfSkpO1xuICogICAgIGlmICh0aGlzLmF1dGgubWZhUGVuZGluZygpLnJlcXVpcmVkKSB7XG4gKiAgICAgICAvLyBNb3N0cmFyIFVJIGRlIE1GQVxuICogICAgIH0gZWxzZSB7XG4gKiAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy8nXSk7XG4gKiAgICAgfVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBBdXRoU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIC8vIFRpbWVyIHBhcmEgcmVmcmVzaCBwcm9hY3Rpdm9cbiAgcHJpdmF0ZSByZWZyZXNoVGltZXJJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzeW5jU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFZBTFRFQ0hfQVVUSF9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBWYWx0ZWNoQXV0aENvbmZpZyxcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIHN0YXRlU2VydmljZTogQXV0aFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIHRva2VuU2VydmljZTogVG9rZW5TZXJ2aWNlLFxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IEF1dGhTdG9yYWdlU2VydmljZSxcbiAgICBwcml2YXRlIHN5bmNTZXJ2aWNlOiBBdXRoU3luY1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBmaXJlYmFzZVNlcnZpY2U6IEZpcmViYXNlU2VydmljZSxcbiAgICBwcml2YXRlIG9hdXRoU2VydmljZTogT0F1dGhTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbWVzc2FnaW5nU2VydmljZTogTWVzc2FnaW5nU2VydmljZSB8IG51bGwsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBpMThuU2VydmljZTogSTE4blNlcnZpY2UgfCBudWxsLFxuICAgIHByaXZhdGUgY29uZmlybWF0aW9uU2VydmljZTogQ29uZmlybWF0aW9uRGlhbG9nU2VydmljZVxuICApIHt9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEVTVEFETyBQw5pCTElDTyAoU2lnbmFscyByZWFkb25seSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEVzdGFkbyBjb21wbGV0byBkZSBhdXRlbnRpY2FjacOzbiAqL1xuICByZWFkb25seSBzdGF0ZSA9IHRoaXMuc3RhdGVTZXJ2aWNlLnN0YXRlO1xuXG4gIC8qKiBVc3VhcmlvIGVzdMOhIGF1dGVudGljYWRvICovXG4gIHJlYWRvbmx5IGlzQXV0aGVudGljYXRlZCA9IHRoaXMuc3RhdGVTZXJ2aWNlLmlzQXV0aGVudGljYXRlZDtcblxuICAvKiogRXN0YWRvIGRlIGNhcmdhICovXG4gIHJlYWRvbmx5IGlzTG9hZGluZyA9IHRoaXMuc3RhdGVTZXJ2aWNlLmlzTG9hZGluZztcblxuICAvKiogSW5mb3JtYWNpw7NuIGRlbCB1c3VhcmlvICovXG4gIHJlYWRvbmx5IHVzZXIgPSB0aGlzLnN0YXRlU2VydmljZS51c2VyO1xuXG4gIC8qKiBUb2tlbiBkZSBhY2Nlc28gKi9cbiAgcmVhZG9ubHkgYWNjZXNzVG9rZW4gPSB0aGlzLnN0YXRlU2VydmljZS5hY2Nlc3NUb2tlbjtcblxuICAvKiogUm9sZXMgZGVsIHVzdWFyaW8gKi9cbiAgcmVhZG9ubHkgcm9sZXMgPSB0aGlzLnN0YXRlU2VydmljZS5yb2xlcztcblxuICAvKiogUGVybWlzb3MgZGVsIHVzdWFyaW8gKi9cbiAgcmVhZG9ubHkgcGVybWlzc2lvbnMgPSB0aGlzLnN0YXRlU2VydmljZS5wZXJtaXNzaW9ucztcblxuICAvKiogVXN1YXJpbyBlcyBzdXBlciBhZG1pbiAqL1xuICByZWFkb25seSBpc1N1cGVyQWRtaW4gPSB0aGlzLnN0YXRlU2VydmljZS5pc1N1cGVyQWRtaW47XG5cbiAgLyoqIEVzdGFkbyBkZSBNRkEgcGVuZGllbnRlICovXG4gIHJlYWRvbmx5IG1mYVBlbmRpbmcgPSB0aGlzLnN0YXRlU2VydmljZS5tZmFQZW5kaW5nO1xuXG4gIC8qKiBFcnJvciBhY3R1YWwgKi9cbiAgcmVhZG9ubHkgZXJyb3IgPSB0aGlzLnN0YXRlU2VydmljZS5lcnJvcjtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSU5JQ0lBTElaQUNJw5NOXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbmljaWFsaXphIGVsIHNlcnZpY2lvIGRlIGF1dGVudGljYWNpw7NuLlxuICAgKiBMbGFtYWRvIGF1dG9tw6F0aWNhbWVudGUgcG9yIHByb3ZpZGVWYWx0ZWNoQXV0aC5cbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gMS4gQ2FyZ2FyIGVzdGFkbyBkZXNkZSBzdG9yYWdlXG4gICAgY29uc3Qgc3RvcmVkU3RhdGUgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmxvYWRTdGF0ZSgpO1xuXG4gICAgaWYgKHN0b3JlZFN0YXRlLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAvLyAyLiBWZXJpZmljYXIgc2kgdG9rZW4gZXMgdsOhbGlkb1xuICAgICAgaWYgKHRoaXMudG9rZW5TZXJ2aWNlLmlzVG9rZW5WYWxpZChzdG9yZWRTdGF0ZS5hY2Nlc3NUb2tlbikpIHtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UucmVzdG9yZUZyb21TdG9yYWdlKHN0b3JlZFN0YXRlKTtcblxuICAgICAgICAvLyBFeHRyYWVyIGluZm8gZGVsIHRva2VuXG4gICAgICAgIGNvbnN0IGNsYWltcyA9IHRoaXMudG9rZW5TZXJ2aWNlLnBhcnNlVG9rZW4oc3RvcmVkU3RhdGUuYWNjZXNzVG9rZW4pO1xuICAgICAgICBpZiAoY2xhaW1zKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlVXNlckluZm8oY2xhaW1zLnVpZCwgY2xhaW1zLmVtYWlsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMuIEluaWNpYXIgdGltZXIgZGUgcmVmcmVzY28gcHJvYWN0aXZvXG4gICAgICAgIHRoaXMuc3RhcnRSZWZyZXNoVGltZXIoKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RvcmVkU3RhdGUucmVmcmVzaFRva2VuKSB7XG4gICAgICAgIC8vIDQuIFRva2VuIGV4cGlyYWRvIHBlcm8gaGF5IHJlZnJlc2ggdG9rZW4gLSBpbnRlbnRhciByZWZyZXNjYXJcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgdGhpcy5zaWduT3V0RmlyZWJhc2UoKTtcbiAgICAgICAgICB0aGlzLmNsZWFyU3RhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaWduT3V0RmlyZWJhc2UoKTtcbiAgICAgICAgdGhpcy5jbGVhclN0YXRlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNS4gSW5pY2lhciBzaW5jcm9uaXphY2nDs24gZW50cmUgcGVzdGHDsWFzXG4gICAgaWYgKHRoaXMuY29uZmlnLmVuYWJsZVRhYlN5bmMpIHtcbiAgICAgIHRoaXMuc3luY1NlcnZpY2Uuc3RhcnQoKTtcbiAgICAgIHRoaXMuc3luY1N1YnNjcmlwdGlvbiA9IHRoaXMuc3luY1NlcnZpY2Uub25FdmVudCQuc3Vic2NyaWJlKGV2ZW50ID0+XG4gICAgICAgIHRoaXMuaGFuZGxlU3luY0V2ZW50KGV2ZW50KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRMb2FkaW5nKGZhbHNlKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFJlZnJlc2hUaW1lcigpO1xuICAgIHRoaXMuc3luY1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBVVRFTlRJQ0FDScOTTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pY2lhIHNlc2nDs24gY29uIGVtYWlsIHkgY29udHJhc2XDsWEuXG4gICAqIERldGVjdGEgYXV0b23DoXRpY2FtZW50ZSBsYSBwbGF0YWZvcm1hIHBhcmEgaWRlbnRpZmljYXIgZGlzcG9zaXRpdm9zIG51ZXZvcy5cbiAgICovXG4gIHNpZ25pbihyZXF1ZXN0OiBTaWduaW5SZXF1ZXN0KTogT2JzZXJ2YWJsZTxTaWduaW5SZXNwb25zZT4ge1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyRXJyb3IoKTtcblxuICAgIC8vIEFncmVnYXIgaW5mbyBkZSBwbGF0YWZvcm1hIHBhcmEgZGV2aWNlIGRldGVjdGlvblxuICAgIGNvbnN0IHBsYXRmb3JtSW5mbyA9IHRoaXMuZGV0ZWN0UGxhdGZvcm1JbmZvKCk7XG4gICAgY29uc3QgZW5yaWNoZWRSZXF1ZXN0OiBTaWduaW5SZXF1ZXN0ID0ge1xuICAgICAgLi4ucmVxdWVzdCxcbiAgICAgIHBsYXRmb3JtOiByZXF1ZXN0LnBsYXRmb3JtID8/IHBsYXRmb3JtSW5mby5wbGF0Zm9ybSxcbiAgICAgIGJyb3dzZXI6IHJlcXVlc3QuYnJvd3NlciA/PyBwbGF0Zm9ybUluZm8uYnJvd3NlcixcbiAgICAgIG9zOiByZXF1ZXN0Lm9zID8/IHBsYXRmb3JtSW5mby5vcyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFNpZ25pblJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3NpZ25pbmAsIGVucmljaGVkUmVxdWVzdCkucGlwZShcbiAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgIGlmIChyZXNwb25zZS5tZmFSZXF1aXJlZCkge1xuICAgICAgICAgIC8vIE1GQSByZXF1ZXJpZG8gLSBndWFyZGFyIGVzdGFkbyB0ZW1wb3JhbFxuICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldE1GQVBlbmRpbmcoe1xuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBtZmFUb2tlbjogcmVzcG9uc2UubWZhVG9rZW4hLFxuICAgICAgICAgICAgbWV0aG9kOiByZXNwb25zZS5tZmFNZXRob2QhLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgLy8gTG9naW4gZXhpdG9zbyBzaW4gTUZBXG4gICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzZnVsQXV0aChyZXNwb25zZSk7XG5cbiAgICAgICAgICAvLyBOb3RpZmljYXIgc2kgZXMgdW4gZGlzcG9zaXRpdm8gbnVldm9cbiAgICAgICAgICBpZiAocmVzcG9uc2UuaXNOZXdEZXZpY2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIE5ldyBkZXZpY2UgZGV0ZWN0ZWQ6JywgcmVzcG9uc2UuZGV2aWNlSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE9BVVRIIChMb2dpbiBzb2NpYWwpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbmljaWEgc2VzacOzbiBjb24gT0F1dGggKEdvb2dsZSwgQXBwbGUsIE1pY3Jvc29mdCkuXG4gICAqIEFicmUgdW4gcG9wdXAgcGFyYSBlbCBmbHVqbyBkZSBhdXRlbnRpY2FjacOzbi5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyIC0gUHJvdmVlZG9yIE9BdXRoICgnZ29vZ2xlJywgJ2FwcGxlJywgJ21pY3Jvc29mdCcpXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgcXVlIGVtaXRlIFNpZ25pblJlc3BvbnNlIGN1YW5kbyBzZSBjb21wbGV0YVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHRoaXMuYXV0aC5zaWduaW5XaXRoT0F1dGgoJ2dvb2dsZScpLnN1YnNjcmliZSh7XG4gICAqICAgbmV4dDogKCkgPT4gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvJ10pLFxuICAgKiAgIGVycm9yOiAoZXJyKSA9PiBjb25zb2xlLmVycm9yKCdPQXV0aCBmYWlsZWQ6JywgZXJyKVxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBzaWduaW5XaXRoT0F1dGgocHJvdmlkZXI6IE9BdXRoUHJvdmlkZXIpOiBPYnNlcnZhYmxlPFNpZ25pblJlc3BvbnNlPiB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJFcnJvcigpO1xuXG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLnN0YXJ0Rmxvdyhwcm92aWRlcikucGlwZShcbiAgICAgIHRhcChyZXN1bHQgPT4ge1xuICAgICAgICAvLyBERUJVRzogTG9nIE9BdXRoIHJlc3VsdCB0byBjaGVjayBmaXJlYmFzZVRva2VuXG4gICAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIE9BdXRoIHJlc3VsdCByZWNlaXZlZDonLCB7XG4gICAgICAgICAgaGFzQWNjZXNzVG9rZW46ICEhcmVzdWx0LmFjY2Vzc1Rva2VuLFxuICAgICAgICAgIGhhc1JlZnJlc2hUb2tlbjogISFyZXN1bHQucmVmcmVzaFRva2VuLFxuICAgICAgICAgIGhhc0ZpcmViYXNlVG9rZW46ICEhcmVzdWx0LmZpcmViYXNlVG9rZW4sXG4gICAgICAgICAgZmlyZWJhc2VUb2tlbkxlbmd0aDogcmVzdWx0LmZpcmViYXNlVG9rZW4/Lmxlbmd0aCB8fCAwLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDb252ZXJ0aXIgT0F1dGhSZXN1bHQgYSBTaWduaW5SZXNwb25zZSBjb21wYXRpYmxlXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlOiBTaWduaW5SZXNwb25zZSA9IHtcbiAgICAgICAgICBvcGVyYXRpb25JZDogJ29hdXRoJyxcbiAgICAgICAgICBhY2Nlc3NUb2tlbjogcmVzdWx0LmFjY2Vzc1Rva2VuLFxuICAgICAgICAgIHJlZnJlc2hUb2tlbjogcmVzdWx0LnJlZnJlc2hUb2tlbixcbiAgICAgICAgICBmaXJlYmFzZVRva2VuOiByZXN1bHQuZmlyZWJhc2VUb2tlbixcbiAgICAgICAgICBleHBpcmVzSW46IHJlc3VsdC5leHBpcmVzSW4sXG4gICAgICAgICAgcm9sZXM6IHJlc3VsdC5yb2xlcyxcbiAgICAgICAgICBwZXJtaXNzaW9uczogcmVzdWx0LnBlcm1pc3Npb25zLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3NmdWxBdXRoKHJlc3BvbnNlKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKFxuICAgICAgICByZXN1bHQgPT5cbiAgICAgICAgICAoe1xuICAgICAgICAgICAgb3BlcmF0aW9uSWQ6ICdvYXV0aCcsXG4gICAgICAgICAgICBhY2Nlc3NUb2tlbjogcmVzdWx0LmFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgcmVmcmVzaFRva2VuOiByZXN1bHQucmVmcmVzaFRva2VuLFxuICAgICAgICAgICAgZmlyZWJhc2VUb2tlbjogcmVzdWx0LmZpcmViYXNlVG9rZW4sXG4gICAgICAgICAgICBleHBpcmVzSW46IHJlc3VsdC5leHBpcmVzSW4sXG4gICAgICAgICAgICByb2xlczogcmVzdWx0LnJvbGVzLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IHJlc3VsdC5wZXJtaXNzaW9ucyxcbiAgICAgICAgICB9KSBhcyBTaWduaW5SZXNwb25zZVxuICAgICAgKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICBjb25zdCBhdXRoRXJyb3I6IEF1dGhFcnJvciA9IHtcbiAgICAgICAgICBjb2RlOiBlcnJvci5jb2RlIHx8ICdPQVVUSF9FUlJPUicsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSB8fCAnRXJyb3IgZGUgYXV0ZW50aWNhY2nDs24gT0F1dGgnLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRFcnJvcihhdXRoRXJyb3IpO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBhdXRoRXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZpbmN1bGEgdW4gcHJvdmVlZG9yIE9BdXRoIGFkaWNpb25hbCBhIGxhIGN1ZW50YSBhY3R1YWwuXG4gICAqIFJlcXVpZXJlIHF1ZSBlbCB1c3VhcmlvIGVzdMOpIGF1dGVudGljYWRvLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSBQcm92ZWVkb3IgT0F1dGggYSB2aW5jdWxhclxuICAgKi9cbiAgbGlua09BdXRoUHJvdmlkZXIocHJvdmlkZXI6IE9BdXRoUHJvdmlkZXIpOiBPYnNlcnZhYmxlPHsgc3VjY2VzczogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLnN0YXJ0TGlua0Zsb3cocHJvdmlkZXIpLnBpcGUoXG4gICAgICBtYXAoKCkgPT4gKHsgc3VjY2VzczogdHJ1ZSB9KSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgY29uc3QgYXV0aEVycm9yOiBBdXRoRXJyb3IgPSB7XG4gICAgICAgICAgY29kZTogZXJyb3IuY29kZSB8fCAnTElOS19FUlJPUicsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSB8fCAnRXJyb3IgYWwgdmluY3VsYXIgcHJvdmVlZG9yJyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0RXJyb3IoYXV0aEVycm9yKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gYXV0aEVycm9yKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxvcyBwcm92ZWVkb3JlcyBPQXV0aCB2aW5jdWxhZG9zIGFsIHVzdWFyaW8uXG4gICAqL1xuICBnZXRMaW5rZWRQcm92aWRlcnMoKTogT2JzZXJ2YWJsZTxMaW5rZWRQcm92aWRlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLmdldExpbmtlZFByb3ZpZGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3ZpbmN1bGEgdW4gcHJvdmVlZG9yIE9BdXRoIGRlIGxhIGN1ZW50YS5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyIC0gUHJvdmVlZG9yIGEgZGVzdmluY3VsYXJcbiAgICovXG4gIHVubGlua09BdXRoUHJvdmlkZXIocHJvdmlkZXI6IE9BdXRoUHJvdmlkZXIpOiBPYnNlcnZhYmxlPHsgc3VjY2VzczogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLnVubGlua1Byb3ZpZGVyKHByb3ZpZGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RhYmxlY2UgY29udHJhc2XDsWEgcGFyYSB1c3VhcmlvcyBxdWUgc29sbyB0aWVuZW4gT0F1dGguXG4gICAqIFBlcm1pdGUgcXVlIHVzdWFyaW9zIE9BdXRoLW9ubHkgcHVlZGFuIHRhbWJpw6luIHVzYXIgZW1haWwvcGFzc3dvcmQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXNzd29yZCAtIE51ZXZhIGNvbnRyYXNlw7FhXG4gICAqL1xuICBzZXRQYXNzd29yZEZvck9BdXRoVXNlcihwYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5zZXRQYXNzd29yZChwYXNzd29yZCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyB0aWVuZSBjb250cmFzZcOxYSBlc3RhYmxlY2lkYS5cbiAgICogw5p0aWwgcGFyYSBtb3N0cmFyL29jdWx0YXIgb3BjaW9uZXMgZGUgY2FtYmlvIGRlIGNvbnRyYXNlw7FhLlxuICAgKi9cbiAgY2hlY2tIYXNQYXNzd29yZCgpOiBPYnNlcnZhYmxlPEhhc1Bhc3N3b3JkUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aFNlcnZpY2UuaGFzUGFzc3dvcmQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RyYSB1biBudWV2byB1c3VhcmlvLlxuICAgKiBFbCB1c3VhcmlvIHF1ZWRhIGVuIGVzdGFkbyBQRU5ESU5HIGhhc3RhIHZlcmlmaWNhciBzdSBlbWFpbC5cbiAgICovXG4gIHNpZ251cChyZXF1ZXN0OiBTaWdudXBSZXF1ZXN0KTogT2JzZXJ2YWJsZTxTaWdudXBSZXNwb25zZT4ge1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyRXJyb3IoKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFNpZ251cFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3NpZ251cGAsIHJlcXVlc3QpXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIGVtYWlsIGNvbiBjw7NkaWdvIGRlIDYgZMOtZ2l0b3MuXG4gICAqIFNpIGVzIGV4aXRvc28sIGhhY2UgYXV0by1sb2dpbiB5IHJldG9ybmEgdG9rZW5zLlxuICAgKi9cbiAgdmVyaWZ5RW1haWwocmVxdWVzdDogVmVyaWZ5RW1haWxSZXF1ZXN0KTogT2JzZXJ2YWJsZTxWZXJpZnlFbWFpbFJlc3BvbnNlPiB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJFcnJvcigpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFZlcmlmeUVtYWlsUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vdmVyaWZ5LWVtYWlsYCwgcmVxdWVzdCkucGlwZShcbiAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgIGlmIChyZXNwb25zZS52ZXJpZmllZCAmJiByZXNwb25zZS5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgIC8vIEF1dG8tbG9naW46IGd1YXJkYXIgdG9rZW5zIHkgYWN0dWFsaXphciBlc3RhZG9cbiAgICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3NmdWxBdXRoKHJlc3BvbnNlIGFzIHVua25vd24gYXMgU2lnbmluUmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVlbnbDrWEgY8OzZGlnbyBkZSB2ZXJpZmljYWNpw7NuIGFsIGVtYWlsLlxuICAgKi9cbiAgcmVzZW5kQ29kZShyZXF1ZXN0OiBSZXNlbmRDb2RlUmVxdWVzdCk6IE9ic2VydmFibGU8UmVzZW5kQ29kZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8UmVzZW5kQ29kZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Jlc2VuZC1jb2RlYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2EgY8OzZGlnbyBNRkEuXG4gICAqL1xuICB2ZXJpZnlNRkEoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxNRkFWZXJpZnlSZXNwb25zZT4ge1xuICAgIGNvbnN0IG1mYVN0YXRlID0gdGhpcy5tZmFQZW5kaW5nKCk7XG4gICAgaWYgKCFtZmFTdGF0ZS5tZmFUb2tlbikge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gKHtcbiAgICAgICAgY29kZTogJ01GQV9OT1RfUEVORElORycsXG4gICAgICAgIG1lc3NhZ2U6ICdObyBoYXkgdmVyaWZpY2FjacOzbiBNRkEgcGVuZGllbnRlJyxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxNRkFWZXJpZnlSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvdmVyaWZ5YCwge1xuICAgICAgICBtZmFUb2tlbjogbWZhU3RhdGUubWZhVG9rZW4sXG4gICAgICAgIGNvZGUsXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJNRkFQZW5kaW5nKCk7XG4gICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzZnVsQXV0aChyZXNwb25zZSk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzY2EgZWwgdG9rZW4gZGUgYWNjZXNvLlxuICAgKiBJbXBsZW1lbnRhIHRva2VuIHJvdGF0aW9uOiBjYWRhIHJlZnJlc2ggZ2VuZXJhIHVuIG51ZXZvIHJlZnJlc2ggdG9rZW5cbiAgICogcXVlIGVsIGNsaWVudGUgZGViZSBndWFyZGFyIHBhcmEgZWwgcHLDs3hpbW8gcmVmcmVzaC5cbiAgICovXG4gIHJlZnJlc2hBY2Nlc3NUb2tlbigpOiBPYnNlcnZhYmxlPFJlZnJlc2hSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlZnJlc2hUb2tlbiA9IHRoaXMuc3RhdGUoKS5yZWZyZXNoVG9rZW47XG4gICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+ICh7XG4gICAgICAgIGNvZGU6ICdOT19SRUZSRVNIX1RPS0VOJyxcbiAgICAgICAgbWVzc2FnZTogJ05vIGhheSB0b2tlbiBkZSByZWZyZXNjbycsXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFJlZnJlc2hSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9yZWZyZXNoYCwgeyByZWZyZXNoVG9rZW4gfSkucGlwZShcbiAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgIGNvbnN0IGV4cGlyZXNBdCA9IERhdGUubm93KCkgKyByZXNwb25zZS5leHBpcmVzSW4gKiAxMDAwO1xuXG4gICAgICAgIC8vIFRva2VuIHJvdGF0aW9uOiBndWFyZGFyIG51ZXZvIGFjY2VzcyB0b2tlbiBZIHJlZnJlc2ggdG9rZW5cbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWNjZXNzVG9rZW4ocmVzcG9uc2UuYWNjZXNzVG9rZW4sIHJlc3BvbnNlLmV4cGlyZXNJbik7XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVJlZnJlc2hUb2tlbihyZXNwb25zZS5yZWZyZXNoVG9rZW4pOyAvLyBOVUVWTzogZ3VhcmRhciByZWZyZXNoIHJvdGFkb1xuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVBY2Nlc3NUb2tlbihyZXNwb25zZS5hY2Nlc3NUb2tlbiwgZXhwaXJlc0F0KTtcbiAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlUmVmcmVzaFRva2VuKHJlc3BvbnNlLnJlZnJlc2hUb2tlbik7IC8vIE5VRVZPOiBwZXJzaXN0aXIgcmVmcmVzaCByb3RhZG9cblxuICAgICAgICBpZiAodGhpcy5jb25maWcuZW5hYmxlRmlyZWJhc2VJbnRlZ3JhdGlvbiAmJiByZXNwb25zZS5maXJlYmFzZVRva2VuKSB7XG4gICAgICAgICAgdGhpcy5zaWduSW5XaXRoRmlyZWJhc2UocmVzcG9uc2UuZmlyZWJhc2VUb2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXJ0UmVmcmVzaFRpbWVyKCk7XG4gICAgICAgIHRoaXMuc3luY1NlcnZpY2UuYnJvYWRjYXN0KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fUkVGUkVTSCcsXG4gICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgYWNjZXNzVG9rZW46IHJlc3BvbnNlLmFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgcmVmcmVzaFRva2VuOiByZXNwb25zZS5yZWZyZXNoVG9rZW4sIC8vIE5VRVZPOiBzaW5jcm9uaXphciBlbnRyZSB0YWJzXG4gICAgICAgICAgICBleHBpcmVzQXQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLmxvZ291dCgpO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTWFuZWphIGF1dGVudGljYWNpw7NuIGV4aXRvc2EgZGVzZGUgZnVlbnRlcyBleHRlcm5hcyAoT0F1dGgsIGV0YykuXG4gICAqIEd1YXJkYSB0b2tlbnMsIGFjdHVhbGl6YSBlc3RhZG8sIGluaWNpYSBGaXJlYmFzZSBzaSBjb3JyZXNwb25kZS5cbiAgICpcbiAgICogQHBhcmFtIGF1dGhSZXN1bHQgLSBSZXN1bHRhZG8gZGUgYXV0ZW50aWNhY2nDs24gY29uIHRva2Vuc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIERlc2RlIHVuIGZsdWpvIE9BdXRoIGV4dGVybm9cbiAgICogZXh0ZXJuYWxPQXV0aC5zaWduSW4oKS5zdWJzY3JpYmUoe1xuICAgKiAgIG5leHQ6IChyZXN1bHQpID0+IHtcbiAgICogICAgIHRoaXMuYXV0aFNlcnZpY2Uuc2V0RXh0ZXJuYWxBdXRoKHJlc3VsdCk7XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBzZXRFeHRlcm5hbEF1dGgoYXV0aFJlc3VsdDoge1xuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gICAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gICAgZmlyZWJhc2VUb2tlbj86IHN0cmluZztcbiAgICBleHBpcmVzSW46IG51bWJlcjtcbiAgICByb2xlcz86IHN0cmluZ1tdO1xuICAgIHBlcm1pc3Npb25zPzogc3RyaW5nW107XG4gIH0pOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRsZVN1Y2Nlc3NmdWxBdXRoKHtcbiAgICAgIC4uLmF1dGhSZXN1bHQsXG4gICAgICBvcGVyYXRpb25JZDogJ2V4dGVybmFsLWF1dGgnLFxuICAgICAgdG9rZW5UeXBlOiAnQmVhcmVyJyxcbiAgICB9IGFzIFNpZ25pblJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaWVycmEgc2VzacOzbiB0cmFzIHBlZGlyIGNvbmZpcm1hY2nDs24gYWwgdXN1YXJpby5cbiAgICpcbiAgICogTXVlc3RyYSB1biBkacOhbG9nbyBuYXRpdm8gKGVzdGlsbyBkZXN0cnVjdGl2bykuIFNpIGVsIHVzdWFyaW8gY29uZmlybWEsXG4gICAqIGVqZWN1dGEgYGxvZ291dCgpYC4gU2kgY2FuY2VsYSwgbm8gcGFzYSBuYWRhLlxuICAgKlxuICAgKiBUZXh0byBwb3IgZGVmZWN0byBkZXNkZSBgX2dsb2JhbGAgaTE4bjogYGxvZ291dENvbmZpcm1UaXRsZWAsXG4gICAqIGBsb2dvdXRDb25maXJtTWVzc2FnZWAsIGBsb2dvdXRgLCBgY2FuY2VsYC4gT3ZlcnJpZGUgdmlhIGBvcHRzYC5cbiAgICpcbiAgICogQHJldHVybnMgdHJ1ZSBzaSBlbCB1c3VhcmlvIGNvbmZpcm3DsyAobG9nb3V0IGVqZWN1dGFkbyksIGZhbHNlIHNpIGNhbmNlbMOzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBvbkxvZ291dENsaWNrKCkgeyB0aGlzLmF1dGgubG9nb3V0V2l0aENvbmZpcm1hdGlvbigpOyB9XG4gICAqL1xuICBhc3luYyBsb2dvdXRXaXRoQ29uZmlybWF0aW9uKG9wdHM/OiB7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgbWVzc2FnZT86IHN0cmluZztcbiAgICBjb25maXJtVGV4dD86IHN0cmluZztcbiAgICBjYW5jZWxUZXh0Pzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdCA9IChrZXk6IHN0cmluZywgZmFsbGJhY2s6IHN0cmluZykgPT4gdGhpcy5pMThuU2VydmljZT8udChrZXkpIHx8IGZhbGxiYWNrO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtRGVzdHJ1Y3RpdmUoe1xuICAgICAgdGl0bGU6IG9wdHM/LnRpdGxlID8/IHQoJ2xvZ291dENvbmZpcm1UaXRsZScsICdDZXJyYXIgc2VzacOzbicpLFxuICAgICAgbWVzc2FnZTogb3B0cz8ubWVzc2FnZSA/PyB0KCdsb2dvdXRDb25maXJtTWVzc2FnZScsICfCv1NlZ3VybyBxdWUgZGVzZWFzIGNlcnJhciBzZXNpw7NuPycpLFxuICAgICAgY29uZmlybUJ1dHRvbjogeyB0ZXh0OiBvcHRzPy5jb25maXJtVGV4dCA/PyB0KCdsb2dvdXQnLCAnQ2VycmFyIHNlc2nDs24nKSB9LFxuICAgICAgY2FuY2VsQnV0dG9uOiB7IHRleHQ6IG9wdHM/LmNhbmNlbFRleHQgPz8gdCgnY2FuY2VsJywgJ0NhbmNlbGFyJykgfSxcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHQuY29uZmlybWVkKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvZ291dCgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaWVycmEgc2VzacOzbi5cbiAgICovXG4gIGFzeW5jIGxvZ291dCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZWZyZXNoVG9rZW4gPSB0aGlzLnN0YXRlKCkucmVmcmVzaFRva2VuO1xuXG4gICAgLy8gRWxpbWluYXIgZGlzcG9zaXRpdm8gZGVsIGJhY2tlbmQgYW50ZXMgZGUgY2VycmFyIHNlc2nDs25cbiAgICBhd2FpdCB0aGlzLnVucmVnaXN0ZXJEZXZpY2UoKTtcblxuICAgIC8vIE5vdGlmaWNhciBhbCBiYWNrZW5kIChmaXJlIGFuZCBmb3JnZXQpXG4gICAgaWYgKHJlZnJlc2hUb2tlbikge1xuICAgICAgdGhpcy5odHRwXG4gICAgICAgIC5wb3N0KGAke3RoaXMuYmFzZVVybH0vbG9nb3V0YCwgeyByZWZyZXNoVG9rZW4gfSlcbiAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvLyBDZXJyYXIgc2VzacOzbiBkZSBGaXJlYmFzZSBzaSBlc3TDoSBpbnRlZ3JhZG9cbiAgICB0aGlzLnNpZ25PdXRGaXJlYmFzZSgpO1xuXG4gICAgdGhpcy5jbGVhclN0YXRlKCk7XG4gICAgdGhpcy5zeW5jU2VydmljZS5icm9hZGNhc3QoeyB0eXBlOiAnTE9HT1VUJyB9KTtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5jb25maWcubG9naW5Sb3V0ZV0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE1GQSBTRVRVUCAodXN1YXJpbyBhdXRlbnRpY2FkbylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYSBNRkEgcGFyYSBlbCB1c3VhcmlvLlxuICAgKi9cbiAgc2V0dXBNRkEobWV0aG9kOiBNRkFNZXRob2QsIHBob25lPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxNRkFTZXR1cFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8TUZBU2V0dXBSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvc2V0dXBgLCB7IG1ldGhvZCwgcGhvbmUgfSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlybWEgbGEgY29uZmlndXJhY2nDs24gZGUgTUZBLlxuICAgKi9cbiAgY29uZmlybU1GQShjb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1GQUNvbmZpcm1SZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PE1GQUNvbmZpcm1SZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvY29uZmlybWAsIHsgY29kZSB9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNoYWJpbGl0YSBNRkEuXG4gICAqL1xuICBkaXNhYmxlTUZBKHBhc3N3b3JkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1GQURpc2FibGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PE1GQURpc2FibGVSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvZGlzYWJsZWAsIHsgcGFzc3dvcmQgfSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVE9UUCBNRkEgKEdvb2dsZSBBdXRoZW50aWNhdG9yKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pY2lhIGNvbmZpZ3VyYWNpw7NuIGRlIFRPVFAgTUZBLlxuICAgKiBSZXRvcm5hIGVsIHNlY3JldG8sIFVSTCBwYXJhIFFSIGNvZGUgeSBjw7NkaWdvcyBkZSByZXNwYWxkby5cbiAgICovXG4gIHNldHVwVE9UUCgpOiBPYnNlcnZhYmxlPFRPVFBTZXR1cFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8VE9UUFNldHVwUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3RvdHAvc2V0dXBgLCB7fSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2EgZWwgY8OzZGlnbyBUT1RQIHkgYWN0aXZhIE1GQS5cbiAgICogRGViZSBsbGFtYXJzZSBkZXNwdcOpcyBkZSBzZXR1cFRPVFAgY29uIGVsIGPDs2RpZ28gZGVsIGF1dGhlbnRpY2F0b3IuXG4gICAqL1xuICB2ZXJpZnlUT1RQU2V0dXAoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxUT1RQVmVyaWZ5U2V0dXBSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFRPVFBWZXJpZnlTZXR1cFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS90b3RwL3ZlcmlmeWAsIHsgY29kZSB9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdlbmVyYSBsb3MgY8OzZGlnb3MgZGUgcmVzcGFsZG8gVE9UUC5cbiAgICogTG9zIGPDs2RpZ29zIGFudGVyaW9yZXMgc29uIGludmFsaWRhZG9zLlxuICAgKi9cbiAgcmVnZW5lcmF0ZUJhY2t1cENvZGVzKCk6IE9ic2VydmFibGU8UmVnZW5lcmF0ZUJhY2t1cENvZGVzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxSZWdlbmVyYXRlQmFja3VwQ29kZXNSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvdG90cC9iYWNrdXAtY29kZXNgLCB7fSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBsYSBjYW50aWRhZCBkZSBjw7NkaWdvcyBkZSByZXNwYWxkbyByZXN0YW50ZXMuXG4gICAqL1xuICBnZXRCYWNrdXBDb2Rlc0NvdW50KCk6IE9ic2VydmFibGU8QmFja3VwQ29kZXNDb3VudFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmdldDxCYWNrdXBDb2Rlc0NvdW50UmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3RvdHAvYmFja3VwLWNvZGVzL2NvdW50YClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogRGVzYWN0aXZhIFRPVFAgTUZBIChyZXF1aWVyZSBjb250cmFzZcOxYSkuXG4gICAqL1xuICBkaXNhYmxlVE9UUChwYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxUT1RQRGlzYWJsZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8VE9UUERpc2FibGVSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvdG90cC9kaXNhYmxlYCwgeyBwYXNzd29yZCB9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBPUkdBTklaQUNJT05FU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQ2FtYmlhIGxhIG9yZ2FuaXphY2nDs24gYWN0aXZhIGRlbCB1c3VhcmlvLlxuICAgKiBHZW5lcmEgdW4gbnVldm8gRmlyZWJhc2UgdG9rZW4gY29uIGVsIGFjdGl2ZU9yZyBhY3R1YWxpemFkby5cbiAgICpcbiAgICogQHBhcmFtIG9yZ2FuaXphdGlvbklkIC0gSUQgZGUgbGEgb3JnYW5pemFjacOzbiBhIGxhIHF1ZSBjYW1iaWFyXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgY29uIGVsIG51ZXZvIEZpcmViYXNlIHRva2VuIHkgYWN0aXZlT3JnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5hdXRoLnN3aXRjaE9yZygnb3JnX3h5ejc4OScpKTtcbiAgICogLy8gRmlyZWJhc2UgeWEgZXN0w6EgcmUtYXV0ZW50aWNhZG8gY29uIGxhIG51ZXZhIG9yZ1xuICAgKiBjb25zdCBhY3RpdmVPcmcgPSBhd2FpdCB0aGlzLmZpcmViYXNlLmdldEFjdGl2ZU9yZygpO1xuICAgKiBgYGBcbiAgICovXG4gIHN3aXRjaE9yZyhvcmdhbml6YXRpb25JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTd2l0Y2hPcmdSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxTd2l0Y2hPcmdSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9zd2l0Y2gtb3JnYCwgeyBvcmdhbml6YXRpb25JZCB9KS5waXBlKFxuICAgICAgc3dpdGNoTWFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgLy8gUmUtYXV0ZW50aWNhciBlbiBGaXJlYmFzZSBjb24gZWwgbnVldm8gdG9rZW5cbiAgICAgICAgLy8gVXNhciBzd2l0Y2hNYXAgKyBmcm9tIHBhcmEgZXNwZXJhciBhIHF1ZSBGaXJlYmFzZSBjb21wbGV0ZVxuICAgICAgICBjb25zdCBmaXJlYmFzZUF1dGgkID0gcmVzcG9uc2UuZmlyZWJhc2VUb2tlblxuICAgICAgICAgID8gZnJvbSh0aGlzLnNpZ25JbldpdGhGaXJlYmFzZShyZXNwb25zZS5maXJlYmFzZVRva2VuKSlcbiAgICAgICAgICA6IG9mKHVuZGVmaW5lZCk7XG5cbiAgICAgICAgcmV0dXJuIGZpcmViYXNlQXV0aCQucGlwZShcbiAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgLy8gTm90aWZpY2FyIGNhbWJpbyBhIG90cmFzIHBlc3Rhw7Fhc1xuICAgICAgICAgICAgdGhpcy5zeW5jU2VydmljZS5icm9hZGNhc3Qoe1xuICAgICAgICAgICAgICB0eXBlOiAnT1JHX1NXSVRDSCcsXG4gICAgICAgICAgICAgIHBheWxvYWQ6IHsgYWN0aXZlT3JnOiByZXNwb25zZS5hY3RpdmVPcmcgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIC8vIFJldG9ybmFyIHJlc3BvbnNlIG9yaWdpbmFsIGRlc3B1w6lzIGRlIHF1ZSBGaXJlYmFzZSBjb21wbGV0ZVxuICAgICAgICAgIG1hcCgoKSA9PiByZXNwb25zZSlcbiAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQRVJGSUwgREUgVVNVQVJJT1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogT2J0aWVuZSBlbCBwZXJmaWwgZGVsIHVzdWFyaW8gYXV0ZW50aWNhZG8uXG4gICAqIEluY2x1eWUgaW5mb3JtYWNpw7NuIGRlIE1GQSB5IHRlbMOpZm9uby4gSGlkcmF0YSBlbCBzdGF0ZSBhdXRvbcOhdGljYW1lbnRlXG4gICAqIGNvbiBgbmFtZS9oYW5kbGUvYXZhdGFyVXJsL3Bob25lYCBwYXJhIHF1ZSBgYXV0aC51c2VyKClgIGxvcyByZXRvcm5lLlxuICAgKi9cbiAgZ2V0UHJvZmlsZSgpOiBPYnNlcnZhYmxlPEdldFByb2ZpbGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEdldFByb2ZpbGVSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9wcm9maWxlYCkucGlwZShcbiAgICAgIHRhcChwcm9maWxlID0+XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVByb2ZpbGVGaWVsZHMoe1xuICAgICAgICAgIG5hbWU6IHByb2ZpbGUubmFtZSxcbiAgICAgICAgICBoYW5kbGU6IHByb2ZpbGUuaGFuZGxlID8/IG51bGwsXG4gICAgICAgICAgYXZhdGFyVXJsOiBwcm9maWxlLmF2YXRhclVybCA/PyBudWxsLFxuICAgICAgICAgIHBob25lOiBwcm9maWxlLnBob25lID8/IG51bGwsXG4gICAgICAgIH0pXG4gICAgICApLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3R1YWxpemEgZWwgcGVyZmlsIGRlbCB1c3VhcmlvLiBTaW5jcm9uaXphIHN0YXRlIGNvbiBsb3MgbnVldm9zIHZhbHVlc1xuICAgKiAobmFtZS9waG9uZSkg4oCUIGVsIGJhY2tlbmQgcmVzcG9uc2Ugbm8gbG9zIGVjaG8nYSBwZXJvIGVsIGNhbGxlciB5YSB0aWVuZVxuICAgKiBsb3MgdmFsb3JlcyBxdWUgbWFuZMOzLlxuICAgKi9cbiAgdXBkYXRlUHJvZmlsZShyZXF1ZXN0OiBVcGRhdGVQcm9maWxlUmVxdWVzdCk6IE9ic2VydmFibGU8VXBkYXRlUHJvZmlsZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8VXBkYXRlUHJvZmlsZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Byb2ZpbGVgLCByZXF1ZXN0KS5waXBlKFxuICAgICAgdGFwKCgpID0+IHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVByb2ZpbGVGaWVsZHMocmVxdWVzdCkpLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3R1YWxpemEgZWwgYXZhdGFyIGRlbCB1c3VhcmlvIGVuIGVsIGJhY2tlbmQuIFNpbmNyb25pemEgc3RhdGUgY29uIGVsXG4gICAqIGBhdmF0YXJVcmxgIHJldG9ybmFkbyBwYXJhIHF1ZSBlbCBoZWFkZXIgLyBkYXNoYm9hcmQgc2UgcmVmcmVzcXVlbiBzaW5cbiAgICogbmVjZXNpZGFkIGRlIHVuIGdldFByb2ZpbGUgYWRpY2lvbmFsLlxuICAgKi9cbiAgdXBkYXRlQXZhdGFyKHJlcXVlc3Q6IFVwZGF0ZUF2YXRhclJlcXVlc3QpOiBPYnNlcnZhYmxlPFVwZGF0ZUF2YXRhclJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8VXBkYXRlQXZhdGFyUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vcHJvZmlsZS9hdmF0YXJgLCByZXF1ZXN0KS5waXBlKFxuICAgICAgdGFwKHJlcyA9PiB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVQcm9maWxlRmllbGRzKHsgYXZhdGFyVXJsOiByZXMuYXZhdGFyVXJsIH0pKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUkVDVVBFUkFDScOTTiBERSBDT05UUkFTRcORQVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pY2lhIGVsIHByb2Nlc28gZGUgcmVjdXBlcmFjacOzbiBkZSBjb250cmFzZcOxYS5cbiAgICogRW52w61hIHVuIGPDs2RpZ28gYWwgZW1haWwgZGVsIHVzdWFyaW8uXG4gICAqL1xuICBmb3Jnb3RQYXNzd29yZChyZXF1ZXN0OiBGb3Jnb3RQYXNzd29yZFJlcXVlc3QpOiBPYnNlcnZhYmxlPEZvcmdvdFBhc3N3b3JkUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxGb3Jnb3RQYXNzd29yZFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L2ZvcmdvdC1wYXNzd29yZGAsIHJlcXVlc3QpXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0ZWEgbGEgY29udHJhc2XDsWEgdXNhbmRvIGVsIGPDs2RpZ28gZW52aWFkbyBwb3IgZW1haWwuXG4gICAqL1xuICByZXNldFBhc3N3b3JkKHJlcXVlc3Q6IFJlc2V0UGFzc3dvcmRSZXF1ZXN0KTogT2JzZXJ2YWJsZTxSZXNldFBhc3N3b3JkUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxSZXNldFBhc3N3b3JkUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vcmVzZXQtcGFzc3dvcmRgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW1iaWEgbGEgY29udHJhc2XDsWEgZGVsIHVzdWFyaW8gYXV0ZW50aWNhZG8uXG4gICAqIFJlcXVpZXJlIGxhIGNvbnRyYXNlw7FhIGFjdHVhbCBwYXJhIHZlcmlmaWNhY2nDs24uXG4gICAqL1xuICBjaGFuZ2VQYXNzd29yZChjdXJyZW50UGFzc3dvcmQ6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hhbmdlUGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3Q6IENoYW5nZVBhc3N3b3JkUmVxdWVzdCA9IHsgY3VycmVudFBhc3N3b3JkLCBuZXdQYXNzd29yZCB9O1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PENoYW5nZVBhc3N3b3JkUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vY2hhbmdlLXBhc3N3b3JkYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRUxJTUlOQUNJw5NOIERFIENVRU5UQVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRWxpbWluYSBsYSBjdWVudGEgZGVsIHVzdWFyaW8gKHNvZnQgZGVsZXRlKS5cbiAgICogUmVxdWllcmUgY29uZmlybWFjacOzbiBkZSBjb250cmFzZcOxYSBwb3Igc2VndXJpZGFkLlxuICAgKiBEZXNwdcOpcyBkZSBlbGltaW5hciwgY2llcnJhIHNlc2nDs24gYXV0b23DoXRpY2FtZW50ZS5cbiAgICpcbiAgICogQHBhcmFtIHBhc3N3b3JkIC0gQ29udHJhc2XDsWEgYWN0dWFsIHBhcmEgY29uZmlybWFyXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgY29uIHJlc3VsdGFkbyBkZSBsYSBlbGltaW5hY2nDs25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhc3luYyBjb25maXJtRGVsZXRlQWNjb3VudChwYXNzd29yZDogc3RyaW5nKSB7XG4gICAqICAgdHJ5IHtcbiAgICogICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuYXV0aC5kZWxldGVBY2NvdW50KHBhc3N3b3JkKSk7XG4gICAqICAgICBjb25zb2xlLmxvZyhyZXN1bHQubWVzc2FnZSk7IC8vIFwiVHUgY3VlbnRhIGhhIHNpZG8gZWxpbWluYWRhLi4uXCJcbiAgICogICAgIC8vIFVzdWFyaW8gZXMgcmVkaXJpZ2lkbyBhdXRvbcOhdGljYW1lbnRlIGFsIGxvZ2luXG4gICAqICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICogICAgIC8vIE1hbmVqYXIgZXJyb3IgKGNvbnRyYXNlw7FhIGluY29ycmVjdGEsIGV0YylcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBkZWxldGVBY2NvdW50KHBhc3N3b3JkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPERlbGV0ZUFjY291bnRSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3Q6IERlbGV0ZUFjY291bnRSZXF1ZXN0ID0geyBwYXNzd29yZCB9O1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5kZWxldGU8RGVsZXRlQWNjb3VudFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L2FjY291bnRgLCB7IGJvZHk6IHJlcXVlc3QgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5kZWxldGVkKSB7XG4gICAgICAgICAgICAvLyBMaW1waWFyIGVzdGFkbyB5IGNlcnJhciBzZXNpw7NuIHNpbiBub3RpZmljYXIgYWwgYmFja2VuZFxuICAgICAgICAgICAgLy8gKGxhIHNlc2nDs24geWEgZnVlIHJldm9jYWRhIHBvciBlbCBiYWNrZW5kKVxuICAgICAgICAgICAgdGhpcy5zaWduT3V0RmlyZWJhc2UoKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5zeW5jU2VydmljZS5icm9hZGNhc3QoeyB0eXBlOiAnTE9HT1VUJyB9KTtcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLmNvbmZpZy5sb2dpblJvdXRlXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBFUk1JU09TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxvcyBwZXJtaXNvcyBhY3R1YWxpemFkb3MgZGVsIGJhY2tlbmQuXG4gICAqL1xuICBmZXRjaFBlcm1pc3Npb25zKCk6IE9ic2VydmFibGU8R2V0UGVybWlzc2lvbnNSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEdldFBlcm1pc3Npb25zUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vcGVybWlzc2lvbnNgKS5waXBlKFxuICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUGVybWlzc2lvbnMoXG4gICAgICAgICAgcmVzcG9uc2Uucm9sZXMsXG4gICAgICAgICAgcmVzcG9uc2UucGVybWlzc2lvbnMsXG4gICAgICAgICAgcmVzcG9uc2UuaXNTdXBlckFkbWluXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVBlcm1pc3Npb25zKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5zeW5jU2VydmljZS5icm9hZGNhc3QoeyB0eXBlOiAnUEVSTUlTU0lPTlNfVVBEQVRFJyB9KTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHRpZW5lIHVuIHBlcm1pc28gZXNwZWPDrWZpY28uXG4gICAqIEZvcm1hdG86IFwicmVzb3VyY2U6YWN0aW9uXCIgKGVqOiBcInRlbXBsYXRlczplZGl0XCIpXG4gICAqL1xuICBoYXNQZXJtaXNzaW9uKHBlcm1pc3Npb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzU3VwZXJBZG1pbigpKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IFtyZXNvdXJjZSwgYWN0aW9uXSA9IHBlcm1pc3Npb24uc3BsaXQoJzonKTtcbiAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9ucygpLnNvbWUocCA9PiB7XG4gICAgICBjb25zdCBbcFJlc291cmNlLCBwQWN0aW9uXSA9IHAuc3BsaXQoJzonKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChwUmVzb3VyY2UgPT09ICcqJyB8fCBwUmVzb3VyY2UgPT09IHJlc291cmNlKSAmJiAocEFjdGlvbiA9PT0gJyonIHx8IHBBY3Rpb24gPT09IGFjdGlvbilcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyB0aWVuZSBhbGd1bm8gZGUgbG9zIHBlcm1pc29zIGRhZG9zLlxuICAgKi9cbiAgaGFzQW55UGVybWlzc2lvbihwZXJtaXNzaW9uczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGVybWlzc2lvbnMuc29tZShwID0+IHRoaXMuaGFzUGVybWlzc2lvbihwKSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyB0aWVuZSB0b2RvcyBsb3MgcGVybWlzb3MgZGFkb3MuXG4gICAqL1xuICBoYXNBbGxQZXJtaXNzaW9ucyhwZXJtaXNzaW9uczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGVybWlzc2lvbnMuZXZlcnkocCA9PiB0aGlzLmhhc1Blcm1pc3Npb24ocCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gdGllbmUgdW4gcm9sIGVzcGVjw61maWNvLlxuICAgKi9cbiAgaGFzUm9sZShyb2xlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yb2xlcygpLnNvbWUociA9PiByLnRvTG93ZXJDYXNlKCkgPT09IHJvbGUudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSEFORExFIChVU0VSTkFNRSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEFjdHVhbGl6YSBlbCBoYW5kbGUgKEB1c2VybmFtZSkgZGVsIHVzdWFyaW8uXG4gICAqIEBwYXJhbSBoYW5kbGUgLSBOdWV2byBoYW5kbGUgKHNpbiBALCBlajogXCJ2aWN0b3J2XCIpXG4gICAqL1xuICB1cGRhdGVIYW5kbGUoaGFuZGxlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFVwZGF0ZUhhbmRsZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8VXBkYXRlSGFuZGxlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vcHJvZmlsZS9oYW5kbGVgLCB7IGhhbmRsZSB9KS5waXBlKFxuICAgICAgdGFwKCgpID0+IHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVByb2ZpbGVGaWVsZHMoeyBoYW5kbGUgfSkpLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSB1biBoYW5kbGUgZXN0w6EgZGlzcG9uaWJsZS5cbiAgICogQHBhcmFtIGhhbmRsZSAtIEhhbmRsZSBhIHZlcmlmaWNhciAoc2luIEApXG4gICAqL1xuICBjaGVja0hhbmRsZUF2YWlsYWJpbGl0eShoYW5kbGU6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hlY2tIYW5kbGVSZXNwb25zZT4ge1xuICAgIC8vIFNlcnZlciByZXNwb25zZTogeyBvcGVyYXRpb25JZCwgdXNlcj8sIGZvdW5kIH0uIGZvdW5kPXRydWUg4oaSIGhhbmRsZSB0YWtlbi5cbiAgICAvLyBMaWIgc2VtYW50aWM6IGF2YWlsYWJsZSA9ICFmb3VuZC5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZ2V0PHtcbiAgICAgICAgb3BlcmF0aW9uSWQ6IHN0cmluZztcbiAgICAgICAgZm91bmQ6IGJvb2xlYW47XG4gICAgICB9PihgJHt0aGlzLnVzZXJzQmFzZVVybH0vaGFuZGxlLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGhhbmRsZSl9YClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAocmF3ID0+ICh7XG4gICAgICAgICAgb3BlcmF0aW9uSWQ6IHJhdy5vcGVyYXRpb25JZCxcbiAgICAgICAgICBoYW5kbGUsXG4gICAgICAgICAgYXZhaWxhYmxlOiAhcmF3LmZvdW5kLFxuICAgICAgICB9KSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUklWQVRFIE1FVEhPRFNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSBnZXQgYmFzZVVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmNvbmZpZy5hcGlVcmx9JHt0aGlzLmNvbmZpZy5hdXRoUHJlZml4fWA7XG4gIH1cblxuICAvKiogQmFzZSBmb3IgL3YyL3VzZXJzIGVuZHBvaW50cyAoc2VwYXJhdGUgZnJvbSAvdjIvYXV0aCkuICovXG4gIHByaXZhdGUgZ2V0IHVzZXJzQmFzZVVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmNvbmZpZy5hcGlVcmx9L3YyL3VzZXJzYDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU3VjY2Vzc2Z1bEF1dGgocmVzcG9uc2U6IFNpZ25pblJlc3BvbnNlIHwgTUZBVmVyaWZ5UmVzcG9uc2UpOiB2b2lkIHtcbiAgICBjb25zdCBleHBpcmVzQXQgPSBEYXRlLm5vdygpICsgcmVzcG9uc2UuZXhwaXJlc0luISAqIDEwMDA7XG4gICAgY29uc3QgdG9rZW5EYXRhID0gdGhpcy50b2tlblNlcnZpY2UucGFyc2VUb2tlbihyZXNwb25zZS5hY2Nlc3NUb2tlbiEpO1xuICAgIGNvbnN0IGlzUHJlbWl1bSA9IHRva2VuRGF0YT8ucHJlbWl1bSA9PT0gdHJ1ZTtcblxuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldEF1dGhlbnRpY2F0ZWQoe1xuICAgICAgYWNjZXNzVG9rZW46IHJlc3BvbnNlLmFjY2Vzc1Rva2VuISxcbiAgICAgIHJlZnJlc2hUb2tlbjogcmVzcG9uc2UucmVmcmVzaFRva2VuISxcbiAgICAgIHVzZXJJZDogdG9rZW5EYXRhPy51aWQsXG4gICAgICBlbWFpbDogdG9rZW5EYXRhPy5lbWFpbCxcbiAgICAgIHJvbGVzOiByZXNwb25zZS5yb2xlcyB8fCBbXSxcbiAgICAgIHBlcm1pc3Npb25zOiByZXNwb25zZS5wZXJtaXNzaW9ucyB8fCBbXSxcbiAgICAgIGlzU3VwZXJBZG1pbjogcmVzcG9uc2UucGVybWlzc2lvbnM/LmluY2x1ZGVzKCcqOionKSB8fCBmYWxzZSxcbiAgICAgIGlzUHJlbWl1bSxcbiAgICAgIGV4cGlyZXNBdCxcbiAgICB9KTtcblxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVN0YXRlKHtcbiAgICAgIGFjY2Vzc1Rva2VuOiByZXNwb25zZS5hY2Nlc3NUb2tlbiEsXG4gICAgICByZWZyZXNoVG9rZW46IHJlc3BvbnNlLnJlZnJlc2hUb2tlbiEsXG4gICAgICByb2xlczogcmVzcG9uc2Uucm9sZXMgfHwgW10sXG4gICAgICBwZXJtaXNzaW9uczogcmVzcG9uc2UucGVybWlzc2lvbnMgfHwgW10sXG4gICAgICBpc1N1cGVyQWRtaW46IHJlc3BvbnNlLnBlcm1pc3Npb25zPy5pbmNsdWRlcygnKjoqJykgfHwgZmFsc2UsXG4gICAgICBpc1ByZW1pdW0sXG4gICAgICBleHBpcmVzQXQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnN0YXJ0UmVmcmVzaFRpbWVyKCk7XG4gICAgdGhpcy5zeW5jU2VydmljZS5icm9hZGNhc3QoeyB0eXBlOiAnTE9HSU4nIH0pO1xuXG4gICAgLy8gSW50ZWdyYWNpw7NuIGNvbiBGaXJlYmFzZVxuICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIGhhbmRsZVN1Y2Nlc3NmdWxBdXRoIC0gRmlyZWJhc2UgY2hlY2s6Jywge1xuICAgICAgZW5hYmxlRmlyZWJhc2VJbnRlZ3JhdGlvbjogdGhpcy5jb25maWcuZW5hYmxlRmlyZWJhc2VJbnRlZ3JhdGlvbixcbiAgICAgIGhhc0ZpcmViYXNlVG9rZW5LZXk6ICdmaXJlYmFzZVRva2VuJyBpbiByZXNwb25zZSxcbiAgICAgIGZpcmViYXNlVG9rZW5WYWx1ZTogISEocmVzcG9uc2UgYXMgYW55KS5maXJlYmFzZVRva2VuLFxuICAgICAgZmlyZWJhc2VUb2tlbkxlbmd0aDogKHJlc3BvbnNlIGFzIGFueSkuZmlyZWJhc2VUb2tlbj8ubGVuZ3RoIHx8IDAsXG4gICAgfSk7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbmZpZy5lbmFibGVGaXJlYmFzZUludGVncmF0aW9uICYmXG4gICAgICAnZmlyZWJhc2VUb2tlbicgaW4gcmVzcG9uc2UgJiZcbiAgICAgIHJlc3BvbnNlLmZpcmViYXNlVG9rZW5cbiAgICApIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnW1ZhbHRlY2hBdXRoXSBDYWxsaW5nIHNpZ25JbldpdGhGaXJlYmFzZSB3aXRoIHRva2VuIGxlbmd0aDonLFxuICAgICAgICByZXNwb25zZS5maXJlYmFzZVRva2VuLmxlbmd0aFxuICAgICAgKTtcbiAgICAgIHRoaXMuc2lnbkluV2l0aEZpcmViYXNlKHJlc3BvbnNlLmZpcmViYXNlVG9rZW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZSBzaWduaW4gc2tpcHBlZCAtIGNvbmRpdGlvbnMgbm90IG1ldCcpO1xuICAgIH1cblxuICAgIC8vIFJlZ2lzdHJvIGF1dG9tw6F0aWNvIGRlIGRpc3Bvc2l0aXZvIHBhcmEgcHVzaCBub3RpZmljYXRpb25zXG4gICAgaWYgKHRoaXMuY29uZmlnLmVuYWJsZURldmljZVJlZ2lzdHJhdGlvbikge1xuICAgICAgdGhpcy5yZWdpc3RlckRldmljZUlmTmVlZGVkKCk7IC8vIGZpcmUtYW5kLWZvcmdldFxuICAgIH1cblxuICAgIC8vIFNpbmNyb25pemFyIGlkaW9tYSBkZWwgdXN1YXJpbyBjb24gaTE4blxuICAgIGlmICh0aGlzLmkxOG5TZXJ2aWNlICYmICdsYW5ndWFnZScgaW4gcmVzcG9uc2UgJiYgcmVzcG9uc2UubGFuZ3VhZ2UpIHtcbiAgICAgIGNvbnN0IHVzZXJMYW5nID0gcmVzcG9uc2UubGFuZ3VhZ2UgYXMgSTE4bkxhbmc7XG4gICAgICBjb25zdCBjdXJyZW50TGFuZyA9IHRoaXMuaTE4blNlcnZpY2UubGFuZygpO1xuICAgICAgaWYgKHVzZXJMYW5nICE9PSBjdXJyZW50TGFuZykge1xuICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnNldExhbmd1YWdlKHVzZXJMYW5nKTtcbiAgICAgICAgY29uc29sZS5sb2coYFtWYWx0ZWNoQXV0aF0gTGFuZ3VhZ2Ugc3luY2VkIHRvOiAke3VzZXJMYW5nfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BSZWZyZXNoVGltZXIoKTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5yZXNldCgpO1xuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRSZWZyZXNoVGltZXIoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUmVmcmVzaFRpbWVyKCk7XG5cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGVTZXJ2aWNlLnN0YXRlKCk7XG4gICAgaWYgKCFzdGF0ZS5leHBpcmVzQXQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlZnJlc2hCZWZvcmVNcyA9ICh0aGlzLmNvbmZpZy5yZWZyZXNoQmVmb3JlRXhwaXJ5IHx8IDYwKSAqIDEwMDA7XG4gICAgY29uc3QgcmVmcmVzaEF0ID0gc3RhdGUuZXhwaXJlc0F0IC0gcmVmcmVzaEJlZm9yZU1zO1xuICAgIGNvbnN0IGRlbGF5ID0gcmVmcmVzaEF0IC0gRGF0ZS5ub3coKTtcblxuICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVySWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmxvZ291dCgpLFxuICAgICAgICB9KTtcbiAgICAgIH0sIGRlbGF5KTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLnJlZnJlc2hUb2tlbikge1xuICAgICAgLy8gVG9rZW4geWEgZGViZXLDrWEgcmVmcmVzY2Fyc2UsIGludGVudGFyIGFob3JhXG4gICAgICB0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpLnN1YnNjcmliZSh7XG4gICAgICAgIGVycm9yOiAoKSA9PiB0aGlzLmxvZ291dCgpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUmVmcmVzaFRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlZnJlc2hUaW1lcklkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWZyZXNoVGltZXJJZCk7XG4gICAgICB0aGlzLnJlZnJlc2hUaW1lcklkID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN5bmNFdmVudChldmVudDogQXV0aFN5bmNFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgY2FzZSAnTE9HSU4nOlxuICAgICAgY2FzZSAnVE9LRU5fUkVGUkVTSCc6IHtcbiAgICAgICAgLy8gUmVjYXJnYXIgZXN0YWRvIGRlc2RlIHN0b3JhZ2VcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmxvYWRTdGF0ZSgpO1xuICAgICAgICBpZiAoc3RhdGUuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5yZXN0b3JlRnJvbVN0b3JhZ2Uoc3RhdGUpO1xuICAgICAgICAgIGNvbnN0IGNsYWltcyA9IHRoaXMudG9rZW5TZXJ2aWNlLnBhcnNlVG9rZW4oc3RhdGUuYWNjZXNzVG9rZW4pO1xuICAgICAgICAgIGlmIChjbGFpbXMpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVVzZXJJbmZvKGNsYWltcy51aWQsIGNsYWltcy5lbWFpbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc3RhcnRSZWZyZXNoVGltZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0xPR09VVCc6XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuc3RvcFJlZnJlc2hUaW1lcigpO1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5jb25maWcubG9naW5Sb3V0ZV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1BFUk1JU1NJT05TX1VQREFURSc6IHtcbiAgICAgICAgY29uc3QgcGVybXMgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmxvYWRQZXJtaXNzaW9ucygpO1xuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVQZXJtaXNzaW9ucyhwZXJtcy5yb2xlcywgcGVybXMucGVybWlzc2lvbnMsIHBlcm1zLmlzU3VwZXJBZG1pbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnT1JHX1NXSVRDSCc6XG4gICAgICAgIC8vIE90cmEgcGVzdGHDsWEgY2FtYmnDsyBkZSBvcmdhbml6YWNpw7NuIC0gcmVjYXJnYXIgcMOhZ2luYSBwYXJhIG9idGVuZXIgbnVldm8gZXN0YWRvXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVBdXRoRXJyb3IoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKTogT2JzZXJ2YWJsZTxuZXZlcj4ge1xuICAgIGNvbnN0IGF1dGhFcnJvcjogQXV0aEVycm9yID0ge1xuICAgICAgY29kZTogZXJyb3IuZXJyb3I/LmNvZGUgfHwgJ1VOS05PV05fRVJST1InLFxuICAgICAgbWVzc2FnZTogZXJyb3IuZXJyb3I/Lm1lc3NhZ2UgfHwgJ0Vycm9yIGRlIGF1dGVudGljYWNpw7NuIGRlc2Nvbm9jaWRvJyxcbiAgICB9O1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldEVycm9yKGF1dGhFcnJvcik7XG4gICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gYXV0aEVycm9yKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBGSVJFQkFTRSBJTlRFR1JBVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIGFzeW5jIHNpZ25JbldpdGhGaXJlYmFzZShmaXJlYmFzZVRva2VuOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBbRkJBdXRoXSBhdXRoIGZsb3cg4oaSIHNpZ25JbldpdGhGaXJlYmFzZSBhdHRlbXB0IHRva2VuTGVuPSR7ZmlyZWJhc2VUb2tlbj8ubGVuZ3RoID8/IDB9IGAgK1xuICAgICAgICBgZmlyZWJhc2VTZXJ2aWNlUHJlc2VudD0keyEhdGhpcy5maXJlYmFzZVNlcnZpY2V9YFxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmZpcmViYXNlU2VydmljZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmZpcmViYXNlU2VydmljZS5zaWduSW5XaXRoQ3VzdG9tVG9rZW4oZmlyZWJhc2VUb2tlbik7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIEZpcmViYXNlIHNpZ25pbiBzdWNjZXNzZnVsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ1tWYWx0ZWNoQXV0aF0gRmlyZWJhc2VTZXJ2aWNlIG5vdCBwcm92aWRlZC4gQWRkIHByb3ZpZGVWYWx0ZWNoRmlyZWJhc2UoKSB0byB5b3VyIHByb3ZpZGVycy4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIE5vIGJsb3F1ZWFyIGVsIGxvZ2luIHByaW5jaXBhbCBzaSBGaXJlYmFzZSBmYWxsYVxuICAgICAgY29uc29sZS5lcnJvcignW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZSBzaWduaW4gZmFpbGVkOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNpZ25PdXRGaXJlYmFzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb24pIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5maXJlYmFzZVNlcnZpY2UpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5maXJlYmFzZVNlcnZpY2Uuc2lnbk91dCgpO1xuICAgICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZSBzaWdub3V0IHN1Y2Nlc3NmdWwnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWdub3JhciBlcnJvcmVzIGRlIEZpcmViYXNlIHNpZ25vdXRcbiAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZSBzaWdub3V0IGZhaWxlZDonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIERFVklDRSBSRUdJU1RSQVRJT04gKFB1c2ggTm90aWZpY2F0aW9ucylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFNvbGljaXRhIHBlcm1pc29zIGRlIG5vdGlmaWNhY2nDs24geSByZWdpc3RyYSBlbCBkaXNwb3NpdGl2by5cbiAgICogVXNhciBjdWFuZG8gZWwgdXN1YXJpbyBhY2VwdGEgcmVjaWJpciBub3RpZmljYWNpb25lcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhc3luYyBvbkVuYWJsZU5vdGlmaWNhdGlvbnMoKSB7XG4gICAqICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLmVuYWJsZU5vdGlmaWNhdGlvbnMoKTtcbiAgICogICBpZiAocmVzdWx0LmdyYW50ZWQpIHtcbiAgICogICAgIGNvbnNvbGUubG9nKCdOb3RpZmljYWNpb25lcyBoYWJpbGl0YWRhcycpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGVuYWJsZU5vdGlmaWNhdGlvbnMoKTogUHJvbWlzZTxFbmFibGVOb3RpZmljYXRpb25zUmVzdWx0PiB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2luZ1NlcnZpY2UpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBNZXNzYWdpbmdTZXJ2aWNlIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIHJldHVybiB7IGdyYW50ZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKCEoYXdhaXQgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmlzU3VwcG9ydGVkKCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tWYWx0ZWNoQXV0aF0gUHVzaCBub3RpZmljYXRpb25zIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgIHJldHVybiB7IGdyYW50ZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UucmVxdWVzdFBlcm1pc3Npb24oKTtcbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICByZXR1cm4geyBncmFudGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIC8vIFJlZ2lzdHJhciBkaXNwb3NpdGl2byBlbiBiYWNrZW5kXG4gICAgY29uc3QgcmVnaXN0ZXJlZCA9IGF3YWl0IHRoaXMucmVnaXN0ZXJEZXZpY2VJZk5lZWRlZCgpO1xuXG4gICAgcmV0dXJuIHsgZ3JhbnRlZDogdHJ1ZSwgdG9rZW4sIHJlZ2lzdGVyZWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNhY3RpdmEgbGFzIG5vdGlmaWNhY2lvbmVzIHBhcmEgZXN0ZSBkaXNwb3NpdGl2by5cbiAgICogRWxpbWluYSBlbCB0b2tlbiBkZWwgYmFja2VuZCB5IGRlIEZDTS5cbiAgICogVXNhciBkZXNkZSB1biB0b2dnbGUgZGUgcHJlZmVyZW5jaWFzIGN1YW5kbyBlbCB1c3VhcmlvIGRlc2FjdGl2YSBub3RpZmljYWNpb25lcy5cbiAgICpcbiAgICogTk9UQTogRXN0byBOTyByZXZvY2EgZWwgcGVybWlzbyBkZWwgbmF2ZWdhZG9yIChlbCB1c3VhcmlvIGRlYmUgaGFjZXJsbyBtYW51YWxtZW50ZVxuICAgKiBkZXNkZSBsYSBjb25maWd1cmFjacOzbiBkZWwgbmF2ZWdhZG9yKS4gU29sbyBlbGltaW5hIGVsIHJlZ2lzdHJvIGRlbCBkaXNwb3NpdGl2by5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhc3luYyBvblRvZ2dsZU5vdGlmaWNhdGlvbnMoZW5hYmxlZDogYm9vbGVhbikge1xuICAgKiAgIGlmIChlbmFibGVkKSB7XG4gICAqICAgICBhd2FpdCB0aGlzLmF1dGguZW5hYmxlTm90aWZpY2F0aW9ucygpO1xuICAgKiAgIH0gZWxzZSB7XG4gICAqICAgICBhd2FpdCB0aGlzLmF1dGguZGlzYWJsZU5vdGlmaWNhdGlvbnMoKTtcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBkaXNhYmxlTm90aWZpY2F0aW9ucygpOiBQcm9taXNlPHsgZGlzYWJsZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGlmICghdGhpcy5tZXNzYWdpbmdTZXJ2aWNlKSB7XG4gICAgICByZXR1cm4geyBkaXNhYmxlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuY3VycmVudFRva2VuO1xuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIC8vIEVsaW1pbmFyIGRlbCBiYWNrZW5kXG4gICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICAgIHRoaXMuaHR0cFxuICAgICAgICAgICAgLnJlcXVlc3QoJ0RFTEVURScsIGAke3RoaXMuY29uZmlnLmFwaVVybH0vdjIvdXNlcnMvbWUvZGV2aWNlcy9ieS10b2tlbmAsIHtcbiAgICAgICAgICAgICAgYm9keTogeyB0b2tlbiB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVsaW1pbmFyIHRva2VuIGRlIEZDTVxuICAgICAgICBhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZGVsZXRlVG9rZW4oKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gTm90aWZpY2F0aW9ucyBkaXNhYmxlZCcpO1xuICAgICAgICByZXR1cm4geyBkaXNhYmxlZDogdHJ1ZSB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBkaXNhYmxlZDogZmFsc2UgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIEZhaWxlZCB0byBkaXNhYmxlIG5vdGlmaWNhdGlvbnM6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgZGlzYWJsZWQ6IGZhbHNlIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldG9ybmEgZWwgZXN0YWRvIGFjdHVhbCBkZSBwZXJtaXNvcyBkZSBub3RpZmljYWNpw7NuLlxuICAgKlxuICAgKiBAcmV0dXJucyAnZ3JhbnRlZCcgfCAnZGVuaWVkJyB8ICdkZWZhdWx0JyB8ICd1bnN1cHBvcnRlZCdcbiAgICovXG4gIGdldE5vdGlmaWNhdGlvblBlcm1pc3Npb25TdGF0ZSgpOiBOb3RpZmljYXRpb25QZXJtaXNzaW9uU3RhdGUge1xuICAgIGlmICghdGhpcy5tZXNzYWdpbmdTZXJ2aWNlKSB7XG4gICAgICByZXR1cm4gJ3Vuc3VwcG9ydGVkJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnaW5nU2VydmljZS5nZXRQZXJtaXNzaW9uU3RhdGUoKSBhcyBOb3RpZmljYXRpb25QZXJtaXNzaW9uU3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0cmEgbWFudWFsbWVudGUgZWwgZGlzcG9zaXRpdm8gZW4gZWwgYmFja2VuZC5cbiAgICogw5p0aWwgcGFyYSBzaW5jcm9uaXphciBkaXNwb3NpdGl2b3MgcXVlIHRpZW5lbiB0b2tlbiBGQ00gcGVybyBubyBlc3TDoW4gcmVnaXN0cmFkb3MuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlZFRva2VuIFRva2VuIEZDTSBvcGNpb25hbC4gU2kgc2UgcHJvcG9yY2lvbmEsIHNlIHVzYSBkaXJlY3RhbWVudGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgc2luIGRlcGVuZGVyIGRlbCBNZXNzYWdpbmdTZXJ2aWNlIChldml0YSB0aW1pbmcgaXNzdWVzKS5cbiAgICogQHJldHVybnMgUmVzdWx0YWRvIGRlbCByZWdpc3RybyBjb24gZGV2aWNlSWQgc2kgZnVlIGV4aXRvc29cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBTaW5jcm9uaXphciBjb24gdG9rZW4gZXhpc3RlbnRlIChyZWNvbWVuZGFkbylcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnJlZ2lzdGVyRGV2aWNlKG15VG9rZW4pO1xuICAgKlxuICAgKiAvLyBTaW4gdG9rZW4sIGludGVudGFyw6Egb2J0ZW5lcmxvIGRlbCBNZXNzYWdpbmdTZXJ2aWNlXG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5yZWdpc3RlckRldmljZSgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyRGV2aWNlKHByb3ZpZGVkVG9rZW4/OiBzdHJpbmcpOiBQcm9taXNlPFJlZ2lzdGVyRGV2aWNlUmVzdWx0PiB7XG4gICAgaWYgKCF0aGlzLmlzQXV0aGVudGljYXRlZCgpKSB7XG4gICAgICByZXR1cm4geyByZWdpc3RlcmVkOiBmYWxzZSwgZXJyb3I6ICdVc3VhcmlvIG5vIGF1dGVudGljYWRvJyB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBWZXJpZmljYXIgcGVybWlzb3Mgc2kgdGVuZW1vcyBNZXNzYWdpbmdTZXJ2aWNlXG4gICAgICBpZiAodGhpcy5tZXNzYWdpbmdTZXJ2aWNlKSB7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb24gPSB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZ2V0UGVybWlzc2lvblN0YXRlKCk7XG4gICAgICAgIGlmIChwZXJtaXNzaW9uICE9PSAnZ3JhbnRlZCcpIHtcbiAgICAgICAgICByZXR1cm4geyByZWdpc3RlcmVkOiBmYWxzZSwgZXJyb3I6ICdQZXJtaXNvIGRlIG5vdGlmaWNhY2lvbmVzIG5vIG90b3JnYWRvJyB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVzYXIgdG9rZW4gcHJvcG9yY2lvbmFkbyBwcmltZXJvIChldml0YSB0aW1pbmcgaXNzdWVzIGNvbiBJbmplY3RvcilcbiAgICAgIGxldCB0b2tlbiA9IHByb3ZpZGVkVG9rZW4gfHwgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlPy5jdXJyZW50VG9rZW47XG5cbiAgICAgIC8vIFNpIG5vIGhheSB0b2tlbiwgaW50ZW50YXIgb2J0ZW5lcmxvIGRlbCBNZXNzYWdpbmdTZXJ2aWNlXG4gICAgICBpZiAoIXRva2VuICYmIHRoaXMubWVzc2FnaW5nU2VydmljZSkge1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuaXNTdXBwb3J0ZWQoKSkpIHtcbiAgICAgICAgICByZXR1cm4geyByZWdpc3RlcmVkOiBmYWxzZSwgZXJyb3I6ICdGQ00gbm8gc29wb3J0YWRvIGVuIGVzdGUgbmF2ZWdhZG9yJyB9O1xuICAgICAgICB9XG4gICAgICAgIHRva2VuID0gYXdhaXQgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmdldFRva2VuKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHsgcmVnaXN0ZXJlZDogZmFsc2UsIGVycm9yOiAnTm8gc2UgcHVkbyBvYnRlbmVyIHRva2VuIEZDTScgfTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVnaXN0cmFyIGVuIGJhY2tlbmRcbiAgICAgIGNvbnN0IHsgcGxhdGZvcm0sIGJyb3dzZXIsIG9zIH0gPSB0aGlzLmRldGVjdFBsYXRmb3JtSW5mbygpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgdGhpcy5odHRwLnBvc3Q8UmVnaXN0ZXJEZXZpY2VSZXNwb25zZT4oYCR7dGhpcy5jb25maWcuYXBpVXJsfS92Mi91c2Vycy9tZS9kZXZpY2VzYCwge1xuICAgICAgICAgIHRva2VuLFxuICAgICAgICAgIHBsYXRmb3JtLFxuICAgICAgICAgIGJyb3dzZXIsXG4gICAgICAgICAgb3MsXG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBEZXZpY2UgcmVnaXN0ZXJlZCBtYW51YWxseTonLCByZXNwb25zZS5kZXZpY2UuZGV2aWNlSWQpO1xuICAgICAgcmV0dXJuIHsgcmVnaXN0ZXJlZDogdHJ1ZSwgZGV2aWNlSWQ6IHJlc3BvbnNlLmRldmljZS5kZXZpY2VJZCwgdG9rZW4gfTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tWYWx0ZWNoQXV0aF0gTWFudWFsIGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZ2lzdGVyZWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogZXJyb3I/LmVycm9yPy5tZXNzYWdlIHx8IGVycm9yPy5tZXNzYWdlIHx8ICdFcnJvciBhbCByZWdpc3RyYXIgZGlzcG9zaXRpdm8nLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0cmEgZWwgZGlzcG9zaXRpdm8gZW4gZWwgYmFja2VuZCBzaSB0aWVuZSBwZXJtaXNvcyBkZSBub3RpZmljYWNpw7NuLlxuICAgKiBTZSBsbGFtYSBhdXRvbcOhdGljYW1lbnRlIGRlc3B1w6lzIGRlIHVuIGxvZ2luIGV4aXRvc28gc2kgZW5hYmxlRGV2aWNlUmVnaXN0cmF0aW9uPXRydWUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyRGV2aWNlSWZOZWVkZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gU29sbyBzaSBlc3TDoSBoYWJpbGl0YWRvIHkgbWVzc2FnaW5nIGVzdMOhIGRpc3BvbmlibGVcbiAgICBpZiAoIXRoaXMuY29uZmlnLmVuYWJsZURldmljZVJlZ2lzdHJhdGlvbiB8fCAhdGhpcy5tZXNzYWdpbmdTZXJ2aWNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFZlcmlmaWNhciBzaSBGQ00gZXN0w6Egc29wb3J0YWRvXG4gICAgICBpZiAoIShhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuaXNTdXBwb3J0ZWQoKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBWZXJpZmljYXIgc2kgeWEgdGllbmUgcGVybWlzb3NcbiAgICAgIGNvbnN0IHBlcm1pc3Npb24gPSB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZ2V0UGVybWlzc2lvblN0YXRlKCk7XG4gICAgICBpZiAocGVybWlzc2lvbiAhPT0gJ2dyYW50ZWQnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gc29saWNpdGFyIGF1dG9tw6F0aWNhbWVudGUsIHNvbG8gcmVnaXN0cmFyIHNpIHlhIHRpZW5lIHBlcm1pc29cbiAgICAgIH1cblxuICAgICAgLy8gT2J0ZW5lciB0b2tlbiBleGlzdGVudGUgKG5vIHNvbGljaXRhciBudWV2bylcbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmdldFRva2VuKCk7XG4gICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVnaXN0cmFyIGVuIGJhY2tlbmRcbiAgICAgIGNvbnN0IHsgcGxhdGZvcm0sIGJyb3dzZXIsIG9zIH0gPSB0aGlzLmRldGVjdFBsYXRmb3JtSW5mbygpO1xuICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgIHRoaXMuaHR0cC5wb3N0PFJlZ2lzdGVyRGV2aWNlUmVzcG9uc2U+KGAke3RoaXMuY29uZmlnLmFwaVVybH0vdjIvdXNlcnMvbWUvZGV2aWNlc2AsIHtcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgICBicm93c2VyLFxuICAgICAgICAgIG9zLFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gRGV2aWNlIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTm8gYmxvcXVlYXIgYXV0aCBzaSBmYWxsYSBkZXZpY2UgcmVnaXN0cmF0aW9uXG4gICAgICBjb25zb2xlLndhcm4oJ1tWYWx0ZWNoQXV0aF0gRGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbGltaW5hIGVsIGRpc3Bvc2l0aXZvIGRlbCBiYWNrZW5kIHkgYm9ycmEgZWwgdG9rZW4gRkNNLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB1bnJlZ2lzdGVyRGV2aWNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb25maWcuZW5hYmxlRGV2aWNlUmVnaXN0cmF0aW9uIHx8ICF0aGlzLm1lc3NhZ2luZ1NlcnZpY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuY3VycmVudFRva2VuO1xuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIC8vIERlbGV0ZSBmcm9tIGJhY2tlbmQgKGZpcmUgYW5kIGZvcmdldClcbiAgICAgICAgdGhpcy5odHRwXG4gICAgICAgICAgLnJlcXVlc3QoJ0RFTEVURScsIGAke3RoaXMuY29uZmlnLmFwaVVybH0vdjIvdXNlcnMvbWUvZGV2aWNlcy9ieS10b2tlbmAsIHtcbiAgICAgICAgICAgIGJvZHk6IHsgdG9rZW4gfSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgICAgICAvLyBEZWxldGUgZnJvbSBGQ01cbiAgICAgICAgYXdhaXQgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmRlbGV0ZVRva2VuKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIERldmljZSB1bnJlZ2lzdGVyZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIElnbm9yYXIgZXJyb3JlcyBlbiBjbGVhbnVwXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdGEgaW5mb3JtYWNpw7NuIGRlIGxhIHBsYXRhZm9ybWEgZGVsIGRpc3Bvc2l0aXZvLlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RQbGF0Zm9ybUluZm8oKTogeyBwbGF0Zm9ybTogJ3dlYic7IGJyb3dzZXI6IHN0cmluZzsgb3M6IHN0cmluZyB9IHtcbiAgICBjb25zdCB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQ7XG5cbiAgICAvLyBEZXRlY3RhciBuYXZlZ2Fkb3JcbiAgICBsZXQgYnJvd3NlciA9ICdVbmtub3duJztcbiAgICBpZiAodWEuaW5jbHVkZXMoJ0ZpcmVmb3gnKSkge1xuICAgICAgYnJvd3NlciA9ICdGaXJlZm94JztcbiAgICB9IGVsc2UgaWYgKHVhLmluY2x1ZGVzKCdFZGcnKSkge1xuICAgICAgYnJvd3NlciA9ICdFZGdlJztcbiAgICB9IGVsc2UgaWYgKHVhLmluY2x1ZGVzKCdDaHJvbWUnKSkge1xuICAgICAgYnJvd3NlciA9ICdDaHJvbWUnO1xuICAgIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ1NhZmFyaScpKSB7XG4gICAgICBicm93c2VyID0gJ1NhZmFyaSc7XG4gICAgfVxuXG4gICAgLy8gRGV0ZWN0YXIgT1NcbiAgICBsZXQgb3MgPSAnVW5rbm93bic7XG4gICAgaWYgKHVhLmluY2x1ZGVzKCdXaW5kb3dzJykpIHtcbiAgICAgIG9zID0gJ1dpbmRvd3MnO1xuICAgIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ01hYyBPUycpKSB7XG4gICAgICBvcyA9ICdtYWNPUyc7XG4gICAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnTGludXgnKSkge1xuICAgICAgb3MgPSAnTGludXgnO1xuICAgIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ0FuZHJvaWQnKSkge1xuICAgICAgb3MgPSAnQW5kcm9pZCc7XG4gICAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnaU9TJykgfHwgdWEuaW5jbHVkZXMoJ2lQaG9uZScpIHx8IHVhLmluY2x1ZGVzKCdpUGFkJykpIHtcbiAgICAgIG9zID0gJ2lPUyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcGxhdGZvcm06ICd3ZWInLCBicm93c2VyLCBvcyB9O1xuICB9XG59XG4iXX0=
|
|
1214
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9hdXRoL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBYSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHeEUsT0FBTyxFQUFjLFVBQVUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDdEYsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7Ozs7Ozs7Ozs7O0FBK0QvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsTUFBTSxPQUFPLFdBQVc7SUFLdEIsWUFDdUMsTUFBeUIsRUFDdEQsSUFBZ0IsRUFDaEIsTUFBYyxFQUNkLFlBQThCLEVBQzlCLFlBQTBCLEVBQzFCLGNBQWtDLEVBQ2xDLFdBQTRCLEVBQzVCLGVBQWdDLEVBQ2hDLFlBQTBCLEVBQ2QsZ0JBQXlDLEVBQ3pDLFdBQStCLEVBQzNDLG1CQUE4QztRQVhqQixXQUFNLEdBQU4sTUFBTSxDQUFtQjtRQUN0RCxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxpQkFBWSxHQUFaLFlBQVksQ0FBa0I7UUFDOUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsbUJBQWMsR0FBZCxjQUFjLENBQW9CO1FBQ2xDLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDZCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXlCO1FBQ3pDLGdCQUFXLEdBQVgs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RSxDQUFDO1lBQzNCLEVBQUUsR0FBRyxTQUFTLENBQUM7UUFDakIsQ0FBQzthQUFNLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ2pDLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDZixDQUFDO2FBQU0sSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDaEMsRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUNmLENBQUM7YUFBTSxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxFQUFFLEdBQUcsU0FBUyxDQUFDO1FBQ2pCLENBQUM7YUFBTSxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDOUUsRUFBRSxHQUFHLEtBQUssQ0FBQztRQUNiLENBQUM7UUFFRCxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDMUMsQ0FBQzsrR0E1MUNVLFdBQVcsa0JBTVosbUJBQW1CO21IQU5sQixXQUFXLGNBREUsTUFBTTs7NEZBQ25CLFdBQVc7a0JBRHZCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFPN0IsTUFBTTsyQkFBQyxtQkFBbUI7OzBCQVMxQixRQUFROzswQkFDUixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPbkRlc3Ryb3ksIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yLCBvZiwgZnJvbSwgZmlyc3RWYWx1ZUZyb20sIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFwLCBjYXRjaEVycm9yLCBzd2l0Y2hNYXAsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgVkFMVEVDSF9BVVRIX0NPTkZJRyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IEF1dGhTdGF0ZVNlcnZpY2UgfSBmcm9tICcuL2F1dGgtc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBUb2tlblNlcnZpY2UgfSBmcm9tICcuL3Rva2VuLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aFN5bmNTZXJ2aWNlIH0gZnJvbSAnLi9zeW5jLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgU2lnbmluUmVxdWVzdCxcbiAgU2lnbmluUmVzcG9uc2UsXG4gIFNpZ251cFJlcXVlc3QsXG4gIFNpZ251cFJlc3BvbnNlLFxuICBWZXJpZnlFbWFpbFJlcXVlc3QsXG4gIFZlcmlmeUVtYWlsUmVzcG9uc2UsXG4gIFJlc2VuZENvZGVSZXF1ZXN0LFxuICBSZXNlbmRDb2RlUmVzcG9uc2UsXG4gIE1GQVZlcmlmeVJlc3BvbnNlLFxuICBSZWZyZXNoUmVzcG9uc2UsXG4gIEdldFBlcm1pc3Npb25zUmVzcG9uc2UsXG4gIEdldFByb2ZpbGVSZXNwb25zZSxcbiAgVXBkYXRlUHJvZmlsZVJlcXVlc3QsXG4gIFVwZGF0ZVByb2ZpbGVSZXNwb25zZSxcbiAgTUZBU2V0dXBSZXNwb25zZSxcbiAgTUZBQ29uZmlybVJlc3BvbnNlLFxuICBNRkFEaXNhYmxlUmVzcG9uc2UsXG4gIEZvcmdvdFBhc3N3b3JkUmVxdWVzdCxcbiAgRm9yZ290UGFzc3dvcmRSZXNwb25zZSxcbiAgUmVzZXRQYXNzd29yZFJlcXVlc3QsXG4gIFJlc2V0UGFzc3dvcmRSZXNwb25zZSxcbiAgQ2hhbmdlUGFzc3dvcmRSZXF1ZXN0LFxuICBDaGFuZ2VQYXNzd29yZFJlc3BvbnNlLFxuICBEZWxldGVBY2NvdW50UmVxdWVzdCxcbiAgRGVsZXRlQWNjb3VudFJlc3BvbnNlLFxuICBTd2l0Y2hPcmdSZXNwb25zZSxcbiAgTUZBTWV0aG9kLFxuICBBdXRoRXJyb3IsXG4gIEF1dGhTeW5jRXZlbnQsXG4gIFZhbHRlY2hBdXRoQ29uZmlnLFxuICBSZWdpc3RlckRldmljZVJlc3BvbnNlLFxuICBFbmFibGVOb3RpZmljYXRpb25zUmVzdWx0LFxuICBOb3RpZmljYXRpb25QZXJtaXNzaW9uU3RhdGUsXG4gIFJlZ2lzdGVyRGV2aWNlUmVzdWx0LFxuICAvLyBUT1RQIE1GQSB0eXBlc1xuICBUT1RQU2V0dXBSZXNwb25zZSxcbiAgVE9UUFZlcmlmeVNldHVwUmVzcG9uc2UsXG4gIFRPVFBEaXNhYmxlUmVzcG9uc2UsXG4gIFJlZ2VuZXJhdGVCYWNrdXBDb2Rlc1Jlc3BvbnNlLFxuICBCYWNrdXBDb2Rlc0NvdW50UmVzcG9uc2UsXG4gIC8vIE9BdXRoIHR5cGVzXG4gIE9BdXRoUHJvdmlkZXIsXG4gIE9BdXRoUmVzdWx0LFxuICBMaW5rZWRQcm92aWRlcixcbiAgSGFzUGFzc3dvcmRSZXNwb25zZSxcbiAgLy8gSGFuZGxlIHR5cGVzXG4gIFVwZGF0ZUhhbmRsZVJlc3BvbnNlLFxuICBDaGVja0hhbmRsZVJlc3BvbnNlLFxuICAvLyBBdmF0YXIgdHlwZXNcbiAgVXBkYXRlQXZhdGFyUmVxdWVzdCxcbiAgVXBkYXRlQXZhdGFyUmVzcG9uc2UsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgT0F1dGhTZXJ2aWNlIH0gZnJvbSAnLi9vYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IEZpcmViYXNlU2VydmljZSwgTWVzc2FnaW5nU2VydmljZSB9IGZyb20gJy4uL2ZpcmViYXNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlLCBJMThuTGFuZyB9IGZyb20gJy4uL2kxOG4nO1xuaW1wb3J0IHsgQ29uZmlybWF0aW9uRGlhbG9nU2VydmljZSB9IGZyb20gJy4uL2NvbmZpcm1hdGlvbi1kaWFsb2cvY29uZmlybWF0aW9uLWRpYWxvZy5zZXJ2aWNlJztcblxuLyoqXG4gKiBTZXJ2aWNpbyBwcmluY2lwYWwgZGUgYXV0ZW50aWNhY2nDs24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAndmFsdGVjaC1jb21wb25lbnRzJztcbiAqXG4gKiBAQ29tcG9uZW50KHsuLi59KVxuICogZXhwb3J0IGNsYXNzIExvZ2luQ29tcG9uZW50IHtcbiAqICAgcHJpdmF0ZSBhdXRoID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAqXG4gKiAgIGFzeW5jIGxvZ2luKCkge1xuICogICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuYXV0aC5zaWduaW4oeyBlbWFpbCwgcGFzc3dvcmQgfSkpO1xuICogICAgIGlmICh0aGlzLmF1dGgubWZhUGVuZGluZygpLnJlcXVpcmVkKSB7XG4gKiAgICAgICAvLyBNb3N0cmFyIFVJIGRlIE1GQVxuICogICAgIH0gZWxzZSB7XG4gKiAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy8nXSk7XG4gKiAgICAgfVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBBdXRoU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIC8vIFRpbWVyIHBhcmEgcmVmcmVzaCBwcm9hY3Rpdm9cbiAgcHJpdmF0ZSByZWZyZXNoVGltZXJJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzeW5jU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFZBTFRFQ0hfQVVUSF9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBWYWx0ZWNoQXV0aENvbmZpZyxcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIHN0YXRlU2VydmljZTogQXV0aFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIHRva2VuU2VydmljZTogVG9rZW5TZXJ2aWNlLFxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IEF1dGhTdG9yYWdlU2VydmljZSxcbiAgICBwcml2YXRlIHN5bmNTZXJ2aWNlOiBBdXRoU3luY1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBmaXJlYmFzZVNlcnZpY2U6IEZpcmViYXNlU2VydmljZSxcbiAgICBwcml2YXRlIG9hdXRoU2VydmljZTogT0F1dGhTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbWVzc2FnaW5nU2VydmljZTogTWVzc2FnaW5nU2VydmljZSB8IG51bGwsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBpMThuU2VydmljZTogSTE4blNlcnZpY2UgfCBudWxsLFxuICAgIHByaXZhdGUgY29uZmlybWF0aW9uU2VydmljZTogQ29uZmlybWF0aW9uRGlhbG9nU2VydmljZVxuICApIHt9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEVTVEFETyBQw5pCTElDTyAoU2lnbmFscyByZWFkb25seSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEVzdGFkbyBjb21wbGV0byBkZSBhdXRlbnRpY2FjacOzbiAqL1xuICByZWFkb25seSBzdGF0ZSA9IHRoaXMuc3RhdGVTZXJ2aWNlLnN0YXRlO1xuXG4gIC8qKiBVc3VhcmlvIGVzdMOhIGF1dGVudGljYWRvICovXG4gIHJlYWRvbmx5IGlzQXV0aGVudGljYXRlZCA9IHRoaXMuc3RhdGVTZXJ2aWNlLmlzQXV0aGVudGljYXRlZDtcblxuICAvKiogRXN0YWRvIGRlIGNhcmdhICovXG4gIHJlYWRvbmx5IGlzTG9hZGluZyA9IHRoaXMuc3RhdGVTZXJ2aWNlLmlzTG9hZGluZztcblxuICAvKiogSW5mb3JtYWNpw7NuIGRlbCB1c3VhcmlvICovXG4gIHJlYWRvbmx5IHVzZXIgPSB0aGlzLnN0YXRlU2VydmljZS51c2VyO1xuXG4gIC8qKiBUb2tlbiBkZSBhY2Nlc28gKi9cbiAgcmVhZG9ubHkgYWNjZXNzVG9rZW4gPSB0aGlzLnN0YXRlU2VydmljZS5hY2Nlc3NUb2tlbjtcblxuICAvKiogUm9sZXMgZGVsIHVzdWFyaW8gKi9cbiAgcmVhZG9ubHkgcm9sZXMgPSB0aGlzLnN0YXRlU2VydmljZS5yb2xlcztcblxuICAvKiogUGVybWlzb3MgZGVsIHVzdWFyaW8gKi9cbiAgcmVhZG9ubHkgcGVybWlzc2lvbnMgPSB0aGlzLnN0YXRlU2VydmljZS5wZXJtaXNzaW9ucztcblxuICAvKiogVXN1YXJpbyBlcyBzdXBlciBhZG1pbiAqL1xuICByZWFkb25seSBpc1N1cGVyQWRtaW4gPSB0aGlzLnN0YXRlU2VydmljZS5pc1N1cGVyQWRtaW47XG5cbiAgLyoqIEVzdGFkbyBkZSBNRkEgcGVuZGllbnRlICovXG4gIHJlYWRvbmx5IG1mYVBlbmRpbmcgPSB0aGlzLnN0YXRlU2VydmljZS5tZmFQZW5kaW5nO1xuXG4gIC8qKiBFcnJvciBhY3R1YWwgKi9cbiAgcmVhZG9ubHkgZXJyb3IgPSB0aGlzLnN0YXRlU2VydmljZS5lcnJvcjtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSU5JQ0lBTElaQUNJw5NOXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbmljaWFsaXphIGVsIHNlcnZpY2lvIGRlIGF1dGVudGljYWNpw7NuLlxuICAgKiBMbGFtYWRvIGF1dG9tw6F0aWNhbWVudGUgcG9yIHByb3ZpZGVWYWx0ZWNoQXV0aC5cbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gMS4gQ2FyZ2FyIGVzdGFkbyBkZXNkZSBzdG9yYWdlXG4gICAgY29uc3Qgc3RvcmVkU3RhdGUgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmxvYWRTdGF0ZSgpO1xuXG4gICAgaWYgKHN0b3JlZFN0YXRlLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAvLyAyLiBWZXJpZmljYXIgc2kgdG9rZW4gZXMgdsOhbGlkb1xuICAgICAgaWYgKHRoaXMudG9rZW5TZXJ2aWNlLmlzVG9rZW5WYWxpZChzdG9yZWRTdGF0ZS5hY2Nlc3NUb2tlbikpIHtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UucmVzdG9yZUZyb21TdG9yYWdlKHN0b3JlZFN0YXRlKTtcblxuICAgICAgICAvLyBFeHRyYWVyIGluZm8gZGVsIHRva2VuXG4gICAgICAgIGNvbnN0IGNsYWltcyA9IHRoaXMudG9rZW5TZXJ2aWNlLnBhcnNlVG9rZW4oc3RvcmVkU3RhdGUuYWNjZXNzVG9rZW4pO1xuICAgICAgICBpZiAoY2xhaW1zKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlVXNlckluZm8oY2xhaW1zLnVpZCwgY2xhaW1zLmVtYWlsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMuIEluaWNpYXIgdGltZXIgZGUgcmVmcmVzY28gcHJvYWN0aXZvXG4gICAgICAgIHRoaXMuc3RhcnRSZWZyZXNoVGltZXIoKTtcblxuICAgICAgICAvLyA0LiBSZS1lc3RhYmxlY2VyIGxhIHNlc2nDs24gZGUgRmlyZWJhc2UgZW4gYm9vdHN0cmFwLlxuICAgICAgICAvLyBFbCBhY2Nlc3MgdG9rZW4gc2lndWUgdsOhbGlkbywgYXPDrSBxdWUgTk8gcGFzYW1vcyBwb3IgbGEgcmFtYSBkZVxuICAgICAgICAvLyByZWZyZXNoIOKAlCBwZXJvIGxhIHBlcnNpc3RlbmNpYSBJbmRleGVkREIgcHJvcGlhIGRlIEZpcmViYXNlIEF1dGggbm9cbiAgICAgICAgLy8gc29icmV2aXZlIGVsIGNvbnRlbmVkb3IgZGUgc3RvcmFnZSBkZSB1bmEgUFdBIHN0YW5kYWxvbmUgZW4gaU9TLlxuICAgICAgICAvLyBTaW4gZXN0bywgYGZpcmViYXNlQXV0aFJlYWR5YCBzZSBxdWVkYSBlbiBgZmFsc2VgIHBhcmEgc2llbXByZSB5XG4gICAgICAgIC8vIGN1YWxxdWllciBsaXN0ZW5lciBGaXJlc3RvcmUgKGVqLiBlbCBpbmJveCBkZSBub3RpZmljYWNpb25lcykgY3VlbGdhLlxuICAgICAgICAvLyBGaXJlLWFuZC1mb3JnZXQ6IE5PIGRlYmUgZGVtb3JhciBlbCByZXNvbHZlIGRlIGluaXRpYWxpemUoKS5cbiAgICAgICAgdm9pZCB0aGlzLmVuc3VyZUZpcmViYXNlU2Vzc2lvbk9uQm9vdHN0cmFwKCk7XG4gICAgICB9IGVsc2UgaWYgKHN0b3JlZFN0YXRlLnJlZnJlc2hUb2tlbikge1xuICAgICAgICAvLyA0LiBUb2tlbiBleHBpcmFkbyBwZXJvIGhheSByZWZyZXNoIHRva2VuIC0gaW50ZW50YXIgcmVmcmVzY2FyXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRoaXMuc2lnbk91dEZpcmViYXNlKCk7XG4gICAgICAgICAgdGhpcy5jbGVhclN0YXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2lnbk91dEZpcmViYXNlKCk7XG4gICAgICAgIHRoaXMuY2xlYXJTdGF0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDUuIEluaWNpYXIgc2luY3Jvbml6YWNpw7NuIGVudHJlIHBlc3Rhw7Fhc1xuICAgIGlmICh0aGlzLmNvbmZpZy5lbmFibGVUYWJTeW5jKSB7XG4gICAgICB0aGlzLnN5bmNTZXJ2aWNlLnN0YXJ0KCk7XG4gICAgICB0aGlzLnN5bmNTdWJzY3JpcHRpb24gPSB0aGlzLnN5bmNTZXJ2aWNlLm9uRXZlbnQkLnN1YnNjcmliZShldmVudCA9PlxuICAgICAgICB0aGlzLmhhbmRsZVN5bmNFdmVudChldmVudClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0TG9hZGluZyhmYWxzZSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BSZWZyZXNoVGltZXIoKTtcbiAgICB0aGlzLnN5bmNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQVVURU5USUNBQ0nDk05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluaWNpYSBzZXNpw7NuIGNvbiBlbWFpbCB5IGNvbnRyYXNlw7FhLlxuICAgKiBEZXRlY3RhIGF1dG9tw6F0aWNhbWVudGUgbGEgcGxhdGFmb3JtYSBwYXJhIGlkZW50aWZpY2FyIGRpc3Bvc2l0aXZvcyBudWV2b3MuXG4gICAqL1xuICBzaWduaW4ocmVxdWVzdDogU2lnbmluUmVxdWVzdCk6IE9ic2VydmFibGU8U2lnbmluUmVzcG9uc2U+IHtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5jbGVhckVycm9yKCk7XG5cbiAgICAvLyBBZ3JlZ2FyIGluZm8gZGUgcGxhdGFmb3JtYSBwYXJhIGRldmljZSBkZXRlY3Rpb25cbiAgICBjb25zdCBwbGF0Zm9ybUluZm8gPSB0aGlzLmRldGVjdFBsYXRmb3JtSW5mbygpO1xuICAgIGNvbnN0IGVucmljaGVkUmVxdWVzdDogU2lnbmluUmVxdWVzdCA9IHtcbiAgICAgIC4uLnJlcXVlc3QsXG4gICAgICBwbGF0Zm9ybTogcmVxdWVzdC5wbGF0Zm9ybSA/PyBwbGF0Zm9ybUluZm8ucGxhdGZvcm0sXG4gICAgICBicm93c2VyOiByZXF1ZXN0LmJyb3dzZXIgPz8gcGxhdGZvcm1JbmZvLmJyb3dzZXIsXG4gICAgICBvczogcmVxdWVzdC5vcyA/PyBwbGF0Zm9ybUluZm8ub3MsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxTaWduaW5SZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9zaWduaW5gLCBlbnJpY2hlZFJlcXVlc3QpLnBpcGUoXG4gICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICBpZiAocmVzcG9uc2UubWZhUmVxdWlyZWQpIHtcbiAgICAgICAgICAvLyBNRkEgcmVxdWVyaWRvIC0gZ3VhcmRhciBlc3RhZG8gdGVtcG9yYWxcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRNRkFQZW5kaW5nKHtcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbWZhVG9rZW46IHJlc3BvbnNlLm1mYVRva2VuISxcbiAgICAgICAgICAgIG1ldGhvZDogcmVzcG9uc2UubWZhTWV0aG9kISxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgIC8vIExvZ2luIGV4aXRvc28gc2luIE1GQVxuICAgICAgICAgIHRoaXMuaGFuZGxlU3VjY2Vzc2Z1bEF1dGgocmVzcG9uc2UpO1xuXG4gICAgICAgICAgLy8gTm90aWZpY2FyIHNpIGVzIHVuIGRpc3Bvc2l0aXZvIG51ZXZvXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmlzTmV3RGV2aWNlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBOZXcgZGV2aWNlIGRldGVjdGVkOicsIHJlc3BvbnNlLmRldmljZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBPQVVUSCAoTG9naW4gc29jaWFsKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pY2lhIHNlc2nDs24gY29uIE9BdXRoIChHb29nbGUsIEFwcGxlLCBNaWNyb3NvZnQpLlxuICAgKiBBYnJlIHVuIHBvcHVwIHBhcmEgZWwgZmx1am8gZGUgYXV0ZW50aWNhY2nDs24uXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlciAtIFByb3ZlZWRvciBPQXV0aCAoJ2dvb2dsZScsICdhcHBsZScsICdtaWNyb3NvZnQnKVxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHF1ZSBlbWl0ZSBTaWduaW5SZXNwb25zZSBjdWFuZG8gc2UgY29tcGxldGFcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB0aGlzLmF1dGguc2lnbmluV2l0aE9BdXRoKCdnb29nbGUnKS5zdWJzY3JpYmUoe1xuICAgKiAgIG5leHQ6ICgpID0+IHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLyddKSxcbiAgICogICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcignT0F1dGggZmFpbGVkOicsIGVycilcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgc2lnbmluV2l0aE9BdXRoKHByb3ZpZGVyOiBPQXV0aFByb3ZpZGVyKTogT2JzZXJ2YWJsZTxTaWduaW5SZXNwb25zZT4ge1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyRXJyb3IoKTtcblxuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5zdGFydEZsb3cocHJvdmlkZXIpLnBpcGUoXG4gICAgICB0YXAocmVzdWx0ID0+IHtcbiAgICAgICAgLy8gREVCVUc6IExvZyBPQXV0aCByZXN1bHQgdG8gY2hlY2sgZmlyZWJhc2VUb2tlblxuICAgICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBPQXV0aCByZXN1bHQgcmVjZWl2ZWQ6Jywge1xuICAgICAgICAgIGhhc0FjY2Vzc1Rva2VuOiAhIXJlc3VsdC5hY2Nlc3NUb2tlbixcbiAgICAgICAgICBoYXNSZWZyZXNoVG9rZW46ICEhcmVzdWx0LnJlZnJlc2hUb2tlbixcbiAgICAgICAgICBoYXNGaXJlYmFzZVRva2VuOiAhIXJlc3VsdC5maXJlYmFzZVRva2VuLFxuICAgICAgICAgIGZpcmViYXNlVG9rZW5MZW5ndGg6IHJlc3VsdC5maXJlYmFzZVRva2VuPy5sZW5ndGggfHwgMCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ29udmVydGlyIE9BdXRoUmVzdWx0IGEgU2lnbmluUmVzcG9uc2UgY29tcGF0aWJsZVxuICAgICAgICBjb25zdCByZXNwb25zZTogU2lnbmluUmVzcG9uc2UgPSB7XG4gICAgICAgICAgb3BlcmF0aW9uSWQ6ICdvYXV0aCcsXG4gICAgICAgICAgYWNjZXNzVG9rZW46IHJlc3VsdC5hY2Nlc3NUb2tlbixcbiAgICAgICAgICByZWZyZXNoVG9rZW46IHJlc3VsdC5yZWZyZXNoVG9rZW4sXG4gICAgICAgICAgZmlyZWJhc2VUb2tlbjogcmVzdWx0LmZpcmViYXNlVG9rZW4sXG4gICAgICAgICAgZXhwaXJlc0luOiByZXN1bHQuZXhwaXJlc0luLFxuICAgICAgICAgIHJvbGVzOiByZXN1bHQucm9sZXMsXG4gICAgICAgICAgcGVybWlzc2lvbnM6IHJlc3VsdC5wZXJtaXNzaW9ucyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzZnVsQXV0aChyZXNwb25zZSk7XG4gICAgICB9KSxcbiAgICAgIG1hcChcbiAgICAgICAgcmVzdWx0ID0+XG4gICAgICAgICAgKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbklkOiAnb2F1dGgnLFxuICAgICAgICAgICAgYWNjZXNzVG9rZW46IHJlc3VsdC5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgIHJlZnJlc2hUb2tlbjogcmVzdWx0LnJlZnJlc2hUb2tlbixcbiAgICAgICAgICAgIGZpcmViYXNlVG9rZW46IHJlc3VsdC5maXJlYmFzZVRva2VuLFxuICAgICAgICAgICAgZXhwaXJlc0luOiByZXN1bHQuZXhwaXJlc0luLFxuICAgICAgICAgICAgcm9sZXM6IHJlc3VsdC5yb2xlcyxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiByZXN1bHQucGVybWlzc2lvbnMsXG4gICAgICAgICAgfSkgYXMgU2lnbmluUmVzcG9uc2VcbiAgICAgICksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgY29uc3QgYXV0aEVycm9yOiBBdXRoRXJyb3IgPSB7XG4gICAgICAgICAgY29kZTogZXJyb3IuY29kZSB8fCAnT0FVVEhfRVJST1InLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfHwgJ0Vycm9yIGRlIGF1dGVudGljYWNpw7NuIE9BdXRoJyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0RXJyb3IoYXV0aEVycm9yKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gYXV0aEVycm9yKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWaW5jdWxhIHVuIHByb3ZlZWRvciBPQXV0aCBhZGljaW9uYWwgYSBsYSBjdWVudGEgYWN0dWFsLlxuICAgKiBSZXF1aWVyZSBxdWUgZWwgdXN1YXJpbyBlc3TDqSBhdXRlbnRpY2Fkby5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyIC0gUHJvdmVlZG9yIE9BdXRoIGEgdmluY3VsYXJcbiAgICovXG4gIGxpbmtPQXV0aFByb3ZpZGVyKHByb3ZpZGVyOiBPQXV0aFByb3ZpZGVyKTogT2JzZXJ2YWJsZTx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5zdGFydExpbmtGbG93KHByb3ZpZGVyKS5waXBlKFxuICAgICAgbWFwKCgpID0+ICh7IHN1Y2Nlc3M6IHRydWUgfSkpLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgIGNvbnN0IGF1dGhFcnJvcjogQXV0aEVycm9yID0ge1xuICAgICAgICAgIGNvZGU6IGVycm9yLmNvZGUgfHwgJ0xJTktfRVJST1InLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfHwgJ0Vycm9yIGFsIHZpbmN1bGFyIHByb3ZlZWRvcicsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldEVycm9yKGF1dGhFcnJvcik7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGF1dGhFcnJvcik7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBsb3MgcHJvdmVlZG9yZXMgT0F1dGggdmluY3VsYWRvcyBhbCB1c3VhcmlvLlxuICAgKi9cbiAgZ2V0TGlua2VkUHJvdmlkZXJzKCk6IE9ic2VydmFibGU8TGlua2VkUHJvdmlkZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5nZXRMaW5rZWRQcm92aWRlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN2aW5jdWxhIHVuIHByb3ZlZWRvciBPQXV0aCBkZSBsYSBjdWVudGEuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlciAtIFByb3ZlZWRvciBhIGRlc3ZpbmN1bGFyXG4gICAqL1xuICB1bmxpbmtPQXV0aFByb3ZpZGVyKHByb3ZpZGVyOiBPQXV0aFByb3ZpZGVyKTogT2JzZXJ2YWJsZTx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS51bmxpbmtQcm92aWRlcihwcm92aWRlcik7XG4gIH1cblxuICAvKipcbiAgICogRXN0YWJsZWNlIGNvbnRyYXNlw7FhIHBhcmEgdXN1YXJpb3MgcXVlIHNvbG8gdGllbmVuIE9BdXRoLlxuICAgKiBQZXJtaXRlIHF1ZSB1c3VhcmlvcyBPQXV0aC1vbmx5IHB1ZWRhbiB0YW1iacOpbiB1c2FyIGVtYWlsL3Bhc3N3b3JkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFzc3dvcmQgLSBOdWV2YSBjb250cmFzZcOxYVxuICAgKi9cbiAgc2V0UGFzc3dvcmRGb3JPQXV0aFVzZXIocGFzc3dvcmQ6IHN0cmluZyk6IE9ic2VydmFibGU8eyBzdWNjZXNzOiBib29sZWFuIH0+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aFNlcnZpY2Uuc2V0UGFzc3dvcmQocGFzc3dvcmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gdGllbmUgY29udHJhc2XDsWEgZXN0YWJsZWNpZGEuXG4gICAqIMOadGlsIHBhcmEgbW9zdHJhci9vY3VsdGFyIG9wY2lvbmVzIGRlIGNhbWJpbyBkZSBjb250cmFzZcOxYS5cbiAgICovXG4gIGNoZWNrSGFzUGFzc3dvcmQoKTogT2JzZXJ2YWJsZTxIYXNQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLmhhc1Bhc3N3b3JkKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0cmEgdW4gbnVldm8gdXN1YXJpby5cbiAgICogRWwgdXN1YXJpbyBxdWVkYSBlbiBlc3RhZG8gUEVORElORyBoYXN0YSB2ZXJpZmljYXIgc3UgZW1haWwuXG4gICAqL1xuICBzaWdudXAocmVxdWVzdDogU2lnbnVwUmVxdWVzdCk6IE9ic2VydmFibGU8U2lnbnVwUmVzcG9uc2U+IHtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5jbGVhckVycm9yKCk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxTaWdudXBSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9zaWdudXBgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBlbWFpbCBjb24gY8OzZGlnbyBkZSA2IGTDrWdpdG9zLlxuICAgKiBTaSBlcyBleGl0b3NvLCBoYWNlIGF1dG8tbG9naW4geSByZXRvcm5hIHRva2Vucy5cbiAgICovXG4gIHZlcmlmeUVtYWlsKHJlcXVlc3Q6IFZlcmlmeUVtYWlsUmVxdWVzdCk6IE9ic2VydmFibGU8VmVyaWZ5RW1haWxSZXNwb25zZT4ge1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyRXJyb3IoKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxWZXJpZnlFbWFpbFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3ZlcmlmeS1lbWFpbGAsIHJlcXVlc3QpLnBpcGUoXG4gICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICBpZiAocmVzcG9uc2UudmVyaWZpZWQgJiYgcmVzcG9uc2UuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAvLyBBdXRvLWxvZ2luOiBndWFyZGFyIHRva2VucyB5IGFjdHVhbGl6YXIgZXN0YWRvXG4gICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzZnVsQXV0aChyZXNwb25zZSBhcyB1bmtub3duIGFzIFNpZ25pblJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZW52w61hIGPDs2RpZ28gZGUgdmVyaWZpY2FjacOzbiBhbCBlbWFpbC5cbiAgICovXG4gIHJlc2VuZENvZGUocmVxdWVzdDogUmVzZW5kQ29kZVJlcXVlc3QpOiBPYnNlcnZhYmxlPFJlc2VuZENvZGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFJlc2VuZENvZGVSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9yZXNlbmQtY29kZWAsIHJlcXVlc3QpXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIGPDs2RpZ28gTUZBLlxuICAgKi9cbiAgdmVyaWZ5TUZBKGNvZGU6IHN0cmluZyk6IE9ic2VydmFibGU8TUZBVmVyaWZ5UmVzcG9uc2U+IHtcbiAgICBjb25zdCBtZmFTdGF0ZSA9IHRoaXMubWZhUGVuZGluZygpO1xuICAgIGlmICghbWZhU3RhdGUubWZhVG9rZW4pIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+ICh7XG4gICAgICAgIGNvZGU6ICdNRkFfTk9UX1BFTkRJTkcnLFxuICAgICAgICBtZXNzYWdlOiAnTm8gaGF5IHZlcmlmaWNhY2nDs24gTUZBIHBlbmRpZW50ZScsXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8TUZBVmVyaWZ5UmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3ZlcmlmeWAsIHtcbiAgICAgICAgbWZhVG9rZW46IG1mYVN0YXRlLm1mYVRva2VuLFxuICAgICAgICBjb2RlLFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyTUZBUGVuZGluZygpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlU3VjY2Vzc2Z1bEF1dGgocmVzcG9uc2UpO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2NhIGVsIHRva2VuIGRlIGFjY2Vzby5cbiAgICogSW1wbGVtZW50YSB0b2tlbiByb3RhdGlvbjogY2FkYSByZWZyZXNoIGdlbmVyYSB1biBudWV2byByZWZyZXNoIHRva2VuXG4gICAqIHF1ZSBlbCBjbGllbnRlIGRlYmUgZ3VhcmRhciBwYXJhIGVsIHByw7N4aW1vIHJlZnJlc2guXG4gICAqL1xuICByZWZyZXNoQWNjZXNzVG9rZW4oKTogT2JzZXJ2YWJsZTxSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZWZyZXNoVG9rZW4gPSB0aGlzLnN0YXRlKCkucmVmcmVzaFRva2VuO1xuICAgIGlmICghcmVmcmVzaFRva2VuKSB7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiAoe1xuICAgICAgICBjb2RlOiAnTk9fUkVGUkVTSF9UT0tFTicsXG4gICAgICAgIG1lc3NhZ2U6ICdObyBoYXkgdG9rZW4gZGUgcmVmcmVzY28nLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxSZWZyZXNoUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vcmVmcmVzaGAsIHsgcmVmcmVzaFRva2VuIH0pLnBpcGUoXG4gICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICBjb25zdCBleHBpcmVzQXQgPSBEYXRlLm5vdygpICsgcmVzcG9uc2UuZXhwaXJlc0luICogMTAwMDtcblxuICAgICAgICAvLyBUb2tlbiByb3RhdGlvbjogZ3VhcmRhciBudWV2byBhY2Nlc3MgdG9rZW4gWSByZWZyZXNoIHRva2VuXG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZUFjY2Vzc1Rva2VuKHJlc3BvbnNlLmFjY2Vzc1Rva2VuLCByZXNwb25zZS5leHBpcmVzSW4pO1xuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVSZWZyZXNoVG9rZW4ocmVzcG9uc2UucmVmcmVzaFRva2VuKTsgLy8gTlVFVk86IGd1YXJkYXIgcmVmcmVzaCByb3RhZG9cbiAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlQWNjZXNzVG9rZW4ocmVzcG9uc2UuYWNjZXNzVG9rZW4sIGV4cGlyZXNBdCk7XG4gICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVJlZnJlc2hUb2tlbihyZXNwb25zZS5yZWZyZXNoVG9rZW4pOyAvLyBOVUVWTzogcGVyc2lzdGlyIHJlZnJlc2ggcm90YWRvXG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb24gJiYgcmVzcG9uc2UuZmlyZWJhc2VUb2tlbikge1xuICAgICAgICAgIHRoaXMuc2lnbkluV2l0aEZpcmViYXNlKHJlc3BvbnNlLmZpcmViYXNlVG9rZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdGFydFJlZnJlc2hUaW1lcigpO1xuICAgICAgICB0aGlzLnN5bmNTZXJ2aWNlLmJyb2FkY2FzdCh7XG4gICAgICAgICAgdHlwZTogJ1RPS0VOX1JFRlJFU0gnLFxuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiByZXNwb25zZS5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgIHJlZnJlc2hUb2tlbjogcmVzcG9uc2UucmVmcmVzaFRva2VuLCAvLyBOVUVWTzogc2luY3Jvbml6YXIgZW50cmUgdGFic1xuICAgICAgICAgICAgZXhwaXJlc0F0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5sb2dvdXQoKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbmVqYSBhdXRlbnRpY2FjacOzbiBleGl0b3NhIGRlc2RlIGZ1ZW50ZXMgZXh0ZXJuYXMgKE9BdXRoLCBldGMpLlxuICAgKiBHdWFyZGEgdG9rZW5zLCBhY3R1YWxpemEgZXN0YWRvLCBpbmljaWEgRmlyZWJhc2Ugc2kgY29ycmVzcG9uZGUuXG4gICAqXG4gICAqIEBwYXJhbSBhdXRoUmVzdWx0IC0gUmVzdWx0YWRvIGRlIGF1dGVudGljYWNpw7NuIGNvbiB0b2tlbnNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBEZXNkZSB1biBmbHVqbyBPQXV0aCBleHRlcm5vXG4gICAqIGV4dGVybmFsT0F1dGguc2lnbkluKCkuc3Vic2NyaWJlKHtcbiAgICogICBuZXh0OiAocmVzdWx0KSA9PiB7XG4gICAqICAgICB0aGlzLmF1dGhTZXJ2aWNlLnNldEV4dGVybmFsQXV0aChyZXN1bHQpO1xuICAgKiAgIH1cbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgc2V0RXh0ZXJuYWxBdXRoKGF1dGhSZXN1bHQ6IHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIGZpcmViYXNlVG9rZW4/OiBzdHJpbmc7XG4gICAgZXhwaXJlc0luOiBudW1iZXI7XG4gICAgcm9sZXM/OiBzdHJpbmdbXTtcbiAgICBwZXJtaXNzaW9ucz86IHN0cmluZ1tdO1xuICB9KTogdm9pZCB7XG4gICAgdGhpcy5oYW5kbGVTdWNjZXNzZnVsQXV0aCh7XG4gICAgICAuLi5hdXRoUmVzdWx0LFxuICAgICAgb3BlcmF0aW9uSWQ6ICdleHRlcm5hbC1hdXRoJyxcbiAgICAgIHRva2VuVHlwZTogJ0JlYXJlcicsXG4gICAgfSBhcyBTaWduaW5SZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2llcnJhIHNlc2nDs24gdHJhcyBwZWRpciBjb25maXJtYWNpw7NuIGFsIHVzdWFyaW8uXG4gICAqXG4gICAqIE11ZXN0cmEgdW4gZGnDoWxvZ28gbmF0aXZvIChlc3RpbG8gZGVzdHJ1Y3Rpdm8pLiBTaSBlbCB1c3VhcmlvIGNvbmZpcm1hLFxuICAgKiBlamVjdXRhIGBsb2dvdXQoKWAuIFNpIGNhbmNlbGEsIG5vIHBhc2EgbmFkYS5cbiAgICpcbiAgICogVGV4dG8gcG9yIGRlZmVjdG8gZGVzZGUgYF9nbG9iYWxgIGkxOG46IGBsb2dvdXRDb25maXJtVGl0bGVgLFxuICAgKiBgbG9nb3V0Q29uZmlybU1lc3NhZ2VgLCBgbG9nb3V0YCwgYGNhbmNlbGAuIE92ZXJyaWRlIHZpYSBgb3B0c2AuXG4gICAqXG4gICAqIEByZXR1cm5zIHRydWUgc2kgZWwgdXN1YXJpbyBjb25maXJtw7MgKGxvZ291dCBlamVjdXRhZG8pLCBmYWxzZSBzaSBjYW5jZWzDsy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogb25Mb2dvdXRDbGljaygpIHsgdGhpcy5hdXRoLmxvZ291dFdpdGhDb25maXJtYXRpb24oKTsgfVxuICAgKi9cbiAgYXN5bmMgbG9nb3V0V2l0aENvbmZpcm1hdGlvbihvcHRzPzoge1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgY29uZmlybVRleHQ/OiBzdHJpbmc7XG4gICAgY2FuY2VsVGV4dD86IHN0cmluZztcbiAgfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHQgPSAoa2V5OiBzdHJpbmcsIGZhbGxiYWNrOiBzdHJpbmcpID0+IHRoaXMuaTE4blNlcnZpY2U/LnQoa2V5KSB8fCBmYWxsYmFjaztcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybURlc3RydWN0aXZlKHtcbiAgICAgIHRpdGxlOiBvcHRzPy50aXRsZSA/PyB0KCdsb2dvdXRDb25maXJtVGl0bGUnLCAnQ2VycmFyIHNlc2nDs24nKSxcbiAgICAgIG1lc3NhZ2U6IG9wdHM/Lm1lc3NhZ2UgPz8gdCgnbG9nb3V0Q29uZmlybU1lc3NhZ2UnLCAnwr9TZWd1cm8gcXVlIGRlc2VhcyBjZXJyYXIgc2VzacOzbj8nKSxcbiAgICAgIGNvbmZpcm1CdXR0b246IHsgdGV4dDogb3B0cz8uY29uZmlybVRleHQgPz8gdCgnbG9nb3V0JywgJ0NlcnJhciBzZXNpw7NuJykgfSxcbiAgICAgIGNhbmNlbEJ1dHRvbjogeyB0ZXh0OiBvcHRzPy5jYW5jZWxUZXh0ID8/IHQoJ2NhbmNlbCcsICdDYW5jZWxhcicpIH0sXG4gICAgfSk7XG5cbiAgICBpZiAocmVzdWx0LmNvbmZpcm1lZCkge1xuICAgICAgYXdhaXQgdGhpcy5sb2dvdXQoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2llcnJhIHNlc2nDs24uXG4gICAqL1xuICBhc3luYyBsb2dvdXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVmcmVzaFRva2VuID0gdGhpcy5zdGF0ZSgpLnJlZnJlc2hUb2tlbjtcblxuICAgIC8vIEVsaW1pbmFyIGRpc3Bvc2l0aXZvIGRlbCBiYWNrZW5kIGFudGVzIGRlIGNlcnJhciBzZXNpw7NuXG4gICAgYXdhaXQgdGhpcy51bnJlZ2lzdGVyRGV2aWNlKCk7XG5cbiAgICAvLyBOb3RpZmljYXIgYWwgYmFja2VuZCAoZmlyZSBhbmQgZm9yZ2V0KVxuICAgIGlmIChyZWZyZXNoVG9rZW4pIHtcbiAgICAgIHRoaXMuaHR0cFxuICAgICAgICAucG9zdChgJHt0aGlzLmJhc2VVcmx9L2xvZ291dGAsIHsgcmVmcmVzaFRva2VuIH0pXG4gICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLy8gQ2VycmFyIHNlc2nDs24gZGUgRmlyZWJhc2Ugc2kgZXN0w6EgaW50ZWdyYWRvXG4gICAgdGhpcy5zaWduT3V0RmlyZWJhc2UoKTtcblxuICAgIHRoaXMuY2xlYXJTdGF0ZSgpO1xuICAgIHRoaXMuc3luY1NlcnZpY2UuYnJvYWRjYXN0KHsgdHlwZTogJ0xPR09VVCcgfSk7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuY29uZmlnLmxvZ2luUm91dGVdKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNRkEgU0VUVVAgKHVzdWFyaW8gYXV0ZW50aWNhZG8pXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmEgTUZBIHBhcmEgZWwgdXN1YXJpby5cbiAgICovXG4gIHNldHVwTUZBKG1ldGhvZDogTUZBTWV0aG9kLCBwaG9uZT86IHN0cmluZyk6IE9ic2VydmFibGU8TUZBU2V0dXBSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PE1GQVNldHVwUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3NldHVwYCwgeyBtZXRob2QsIHBob25lIH0pXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpcm1hIGxhIGNvbmZpZ3VyYWNpw7NuIGRlIE1GQS5cbiAgICovXG4gIGNvbmZpcm1NRkEoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxNRkFDb25maXJtUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxNRkFDb25maXJtUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL2NvbmZpcm1gLCB7IGNvZGUgfSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogRGVzaGFiaWxpdGEgTUZBLlxuICAgKi9cbiAgZGlzYWJsZU1GQShwYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxNRkFEaXNhYmxlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxNRkFEaXNhYmxlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL2Rpc2FibGVgLCB7IHBhc3N3b3JkIH0pXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRPVFAgTUZBIChHb29nbGUgQXV0aGVudGljYXRvcilcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluaWNpYSBjb25maWd1cmFjacOzbiBkZSBUT1RQIE1GQS5cbiAgICogUmV0b3JuYSBlbCBzZWNyZXRvLCBVUkwgcGFyYSBRUiBjb2RlIHkgY8OzZGlnb3MgZGUgcmVzcGFsZG8uXG4gICAqL1xuICBzZXR1cFRPVFAoKTogT2JzZXJ2YWJsZTxUT1RQU2V0dXBSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFRPVFBTZXR1cFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS90b3RwL3NldHVwYCwge30pXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIGVsIGPDs2RpZ28gVE9UUCB5IGFjdGl2YSBNRkEuXG4gICAqIERlYmUgbGxhbWFyc2UgZGVzcHXDqXMgZGUgc2V0dXBUT1RQIGNvbiBlbCBjw7NkaWdvIGRlbCBhdXRoZW50aWNhdG9yLlxuICAgKi9cbiAgdmVyaWZ5VE9UUFNldHVwKGNvZGU6IHN0cmluZyk6IE9ic2VydmFibGU8VE9UUFZlcmlmeVNldHVwUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxUT1RQVmVyaWZ5U2V0dXBSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvdG90cC92ZXJpZnlgLCB7IGNvZGUgfSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnZW5lcmEgbG9zIGPDs2RpZ29zIGRlIHJlc3BhbGRvIFRPVFAuXG4gICAqIExvcyBjw7NkaWdvcyBhbnRlcmlvcmVzIHNvbiBpbnZhbGlkYWRvcy5cbiAgICovXG4gIHJlZ2VuZXJhdGVCYWNrdXBDb2RlcygpOiBPYnNlcnZhYmxlPFJlZ2VuZXJhdGVCYWNrdXBDb2Rlc1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8UmVnZW5lcmF0ZUJhY2t1cENvZGVzUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3RvdHAvYmFja3VwLWNvZGVzYCwge30pXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbGEgY2FudGlkYWQgZGUgY8OzZGlnb3MgZGUgcmVzcGFsZG8gcmVzdGFudGVzLlxuICAgKi9cbiAgZ2V0QmFja3VwQ29kZXNDb3VudCgpOiBPYnNlcnZhYmxlPEJhY2t1cENvZGVzQ291bnRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5nZXQ8QmFja3VwQ29kZXNDb3VudFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS90b3RwL2JhY2t1cC1jb2Rlcy9jb3VudGApXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2FjdGl2YSBUT1RQIE1GQSAocmVxdWllcmUgY29udHJhc2XDsWEpLlxuICAgKi9cbiAgZGlzYWJsZVRPVFAocGFzc3dvcmQ6IHN0cmluZyk6IE9ic2VydmFibGU8VE9UUERpc2FibGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFRPVFBEaXNhYmxlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3RvdHAvZGlzYWJsZWAsIHsgcGFzc3dvcmQgfSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gT1JHQU5JWkFDSU9ORVNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIENhbWJpYSBsYSBvcmdhbml6YWNpw7NuIGFjdGl2YSBkZWwgdXN1YXJpby5cbiAgICogR2VuZXJhIHVuIG51ZXZvIEZpcmViYXNlIHRva2VuIGNvbiBlbCBhY3RpdmVPcmcgYWN0dWFsaXphZG8uXG4gICAqXG4gICAqIEBwYXJhbSBvcmdhbml6YXRpb25JZCAtIElEIGRlIGxhIG9yZ2FuaXphY2nDs24gYSBsYSBxdWUgY2FtYmlhclxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIGNvbiBlbCBudWV2byBGaXJlYmFzZSB0b2tlbiB5IGFjdGl2ZU9yZ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuYXV0aC5zd2l0Y2hPcmcoJ29yZ194eXo3ODknKSk7XG4gICAqIC8vIEZpcmViYXNlIHlhIGVzdMOhIHJlLWF1dGVudGljYWRvIGNvbiBsYSBudWV2YSBvcmdcbiAgICogY29uc3QgYWN0aXZlT3JnID0gYXdhaXQgdGhpcy5maXJlYmFzZS5nZXRBY3RpdmVPcmcoKTtcbiAgICogYGBgXG4gICAqL1xuICBzd2l0Y2hPcmcob3JnYW5pemF0aW9uSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8U3dpdGNoT3JnUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8U3dpdGNoT3JnUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vc3dpdGNoLW9yZ2AsIHsgb3JnYW5pemF0aW9uSWQgfSkucGlwZShcbiAgICAgIHN3aXRjaE1hcChyZXNwb25zZSA9PiB7XG4gICAgICAgIC8vIFJlLWF1dGVudGljYXIgZW4gRmlyZWJhc2UgY29uIGVsIG51ZXZvIHRva2VuXG4gICAgICAgIC8vIFVzYXIgc3dpdGNoTWFwICsgZnJvbSBwYXJhIGVzcGVyYXIgYSBxdWUgRmlyZWJhc2UgY29tcGxldGVcbiAgICAgICAgY29uc3QgZmlyZWJhc2VBdXRoJCA9IHJlc3BvbnNlLmZpcmViYXNlVG9rZW5cbiAgICAgICAgICA/IGZyb20odGhpcy5zaWduSW5XaXRoRmlyZWJhc2UocmVzcG9uc2UuZmlyZWJhc2VUb2tlbikpXG4gICAgICAgICAgOiBvZih1bmRlZmluZWQpO1xuXG4gICAgICAgIHJldHVybiBmaXJlYmFzZUF1dGgkLnBpcGUoXG4gICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIC8vIE5vdGlmaWNhciBjYW1iaW8gYSBvdHJhcyBwZXN0YcOxYXNcbiAgICAgICAgICAgIHRoaXMuc3luY1NlcnZpY2UuYnJvYWRjYXN0KHtcbiAgICAgICAgICAgICAgdHlwZTogJ09SR19TV0lUQ0gnLFxuICAgICAgICAgICAgICBwYXlsb2FkOiB7IGFjdGl2ZU9yZzogcmVzcG9uc2UuYWN0aXZlT3JnIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAvLyBSZXRvcm5hciByZXNwb25zZSBvcmlnaW5hbCBkZXNwdcOpcyBkZSBxdWUgRmlyZWJhc2UgY29tcGxldGVcbiAgICAgICAgICBtYXAoKCkgPT4gcmVzcG9uc2UpXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUEVSRklMIERFIFVTVUFSSU9cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE9idGllbmUgZWwgcGVyZmlsIGRlbCB1c3VhcmlvIGF1dGVudGljYWRvLlxuICAgKiBJbmNsdXllIGluZm9ybWFjacOzbiBkZSBNRkEgeSB0ZWzDqWZvbm8uIEhpZHJhdGEgZWwgc3RhdGUgYXV0b23DoXRpY2FtZW50ZVxuICAgKiBjb24gYG5hbWUvaGFuZGxlL2F2YXRhclVybC9waG9uZWAgcGFyYSBxdWUgYGF1dGgudXNlcigpYCBsb3MgcmV0b3JuZS5cbiAgICovXG4gIGdldFByb2ZpbGUoKTogT2JzZXJ2YWJsZTxHZXRQcm9maWxlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxHZXRQcm9maWxlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vcHJvZmlsZWApLnBpcGUoXG4gICAgICB0YXAocHJvZmlsZSA9PlxuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVQcm9maWxlRmllbGRzKHtcbiAgICAgICAgICBuYW1lOiBwcm9maWxlLm5hbWUsXG4gICAgICAgICAgaGFuZGxlOiBwcm9maWxlLmhhbmRsZSA/PyBudWxsLFxuICAgICAgICAgIGF2YXRhclVybDogcHJvZmlsZS5hdmF0YXJVcmwgPz8gbnVsbCxcbiAgICAgICAgICBwaG9uZTogcHJvZmlsZS5waG9uZSA/PyBudWxsLFxuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWN0dWFsaXphIGVsIHBlcmZpbCBkZWwgdXN1YXJpby4gU2luY3Jvbml6YSBzdGF0ZSBjb24gbG9zIG51ZXZvcyB2YWx1ZXNcbiAgICogKG5hbWUvcGhvbmUpIOKAlCBlbCBiYWNrZW5kIHJlc3BvbnNlIG5vIGxvcyBlY2hvJ2EgcGVybyBlbCBjYWxsZXIgeWEgdGllbmVcbiAgICogbG9zIHZhbG9yZXMgcXVlIG1hbmTDsy5cbiAgICovXG4gIHVwZGF0ZVByb2ZpbGUocmVxdWVzdDogVXBkYXRlUHJvZmlsZVJlcXVlc3QpOiBPYnNlcnZhYmxlPFVwZGF0ZVByb2ZpbGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFVwZGF0ZVByb2ZpbGVSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9wcm9maWxlYCwgcmVxdWVzdCkucGlwZShcbiAgICAgIHRhcCgoKSA9PiB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVQcm9maWxlRmllbGRzKHJlcXVlc3QpKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWN0dWFsaXphIGVsIGF2YXRhciBkZWwgdXN1YXJpbyBlbiBlbCBiYWNrZW5kLiBTaW5jcm9uaXphIHN0YXRlIGNvbiBlbFxuICAgKiBgYXZhdGFyVXJsYCByZXRvcm5hZG8gcGFyYSBxdWUgZWwgaGVhZGVyIC8gZGFzaGJvYXJkIHNlIHJlZnJlc3F1ZW4gc2luXG4gICAqIG5lY2VzaWRhZCBkZSB1biBnZXRQcm9maWxlIGFkaWNpb25hbC5cbiAgICovXG4gIHVwZGF0ZUF2YXRhcihyZXF1ZXN0OiBVcGRhdGVBdmF0YXJSZXF1ZXN0KTogT2JzZXJ2YWJsZTxVcGRhdGVBdmF0YXJSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFVwZGF0ZUF2YXRhclJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Byb2ZpbGUvYXZhdGFyYCwgcmVxdWVzdCkucGlwZShcbiAgICAgIHRhcChyZXMgPT4gdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUHJvZmlsZUZpZWxkcyh7IGF2YXRhclVybDogcmVzLmF2YXRhclVybCB9KSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJFQ1VQRVJBQ0nDk04gREUgQ09OVFJBU0XDkUFcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluaWNpYSBlbCBwcm9jZXNvIGRlIHJlY3VwZXJhY2nDs24gZGUgY29udHJhc2XDsWEuXG4gICAqIEVudsOtYSB1biBjw7NkaWdvIGFsIGVtYWlsIGRlbCB1c3VhcmlvLlxuICAgKi9cbiAgZm9yZ290UGFzc3dvcmQocmVxdWVzdDogRm9yZ290UGFzc3dvcmRSZXF1ZXN0KTogT2JzZXJ2YWJsZTxGb3Jnb3RQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8Rm9yZ290UGFzc3dvcmRSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9mb3Jnb3QtcGFzc3dvcmRgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldGVhIGxhIGNvbnRyYXNlw7FhIHVzYW5kbyBlbCBjw7NkaWdvIGVudmlhZG8gcG9yIGVtYWlsLlxuICAgKi9cbiAgcmVzZXRQYXNzd29yZChyZXF1ZXN0OiBSZXNldFBhc3N3b3JkUmVxdWVzdCk6IE9ic2VydmFibGU8UmVzZXRQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8UmVzZXRQYXNzd29yZFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Jlc2V0LXBhc3N3b3JkYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FtYmlhIGxhIGNvbnRyYXNlw7FhIGRlbCB1c3VhcmlvIGF1dGVudGljYWRvLlxuICAgKiBSZXF1aWVyZSBsYSBjb250cmFzZcOxYSBhY3R1YWwgcGFyYSB2ZXJpZmljYWNpw7NuLlxuICAgKi9cbiAgY2hhbmdlUGFzc3dvcmQoY3VycmVudFBhc3N3b3JkOiBzdHJpbmcsIG5ld1Bhc3N3b3JkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoYW5nZVBhc3N3b3JkUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0OiBDaGFuZ2VQYXNzd29yZFJlcXVlc3QgPSB7IGN1cnJlbnRQYXNzd29yZCwgbmV3UGFzc3dvcmQgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxDaGFuZ2VQYXNzd29yZFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L2NoYW5nZS1wYXNzd29yZGAsIHJlcXVlc3QpXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEVMSU1JTkFDScOTTiBERSBDVUVOVEFcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEVsaW1pbmEgbGEgY3VlbnRhIGRlbCB1c3VhcmlvIChzb2Z0IGRlbGV0ZSkuXG4gICAqIFJlcXVpZXJlIGNvbmZpcm1hY2nDs24gZGUgY29udHJhc2XDsWEgcG9yIHNlZ3VyaWRhZC5cbiAgICogRGVzcHXDqXMgZGUgZWxpbWluYXIsIGNpZXJyYSBzZXNpw7NuIGF1dG9tw6F0aWNhbWVudGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXNzd29yZCAtIENvbnRyYXNlw7FhIGFjdHVhbCBwYXJhIGNvbmZpcm1hclxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIGNvbiByZXN1bHRhZG8gZGUgbGEgZWxpbWluYWNpw7NuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXN5bmMgY29uZmlybURlbGV0ZUFjY291bnQocGFzc3dvcmQ6IHN0cmluZykge1xuICAgKiAgIHRyeSB7XG4gICAqICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmF1dGguZGVsZXRlQWNjb3VudChwYXNzd29yZCkpO1xuICAgKiAgICAgY29uc29sZS5sb2cocmVzdWx0Lm1lc3NhZ2UpOyAvLyBcIlR1IGN1ZW50YSBoYSBzaWRvIGVsaW1pbmFkYS4uLlwiXG4gICAqICAgICAvLyBVc3VhcmlvIGVzIHJlZGlyaWdpZG8gYXV0b23DoXRpY2FtZW50ZSBhbCBsb2dpblxuICAgKiAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAqICAgICAvLyBNYW5lamFyIGVycm9yIChjb250cmFzZcOxYSBpbmNvcnJlY3RhLCBldGMpXG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZGVsZXRlQWNjb3VudChwYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxEZWxldGVBY2NvdW50UmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0OiBEZWxldGVBY2NvdW50UmVxdWVzdCA9IHsgcGFzc3dvcmQgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZGVsZXRlPERlbGV0ZUFjY291bnRSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9hY2NvdW50YCwgeyBib2R5OiByZXF1ZXN0IH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBpZiAocmVzcG9uc2UuZGVsZXRlZCkge1xuICAgICAgICAgICAgLy8gTGltcGlhciBlc3RhZG8geSBjZXJyYXIgc2VzacOzbiBzaW4gbm90aWZpY2FyIGFsIGJhY2tlbmRcbiAgICAgICAgICAgIC8vIChsYSBzZXNpw7NuIHlhIGZ1ZSByZXZvY2FkYSBwb3IgZWwgYmFja2VuZClcbiAgICAgICAgICAgIHRoaXMuc2lnbk91dEZpcmViYXNlKCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU3RhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuc3luY1NlcnZpY2UuYnJvYWRjYXN0KHsgdHlwZTogJ0xPR09VVCcgfSk7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5jb25maWcubG9naW5Sb3V0ZV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQRVJNSVNPU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogT2J0aWVuZSBsb3MgcGVybWlzb3MgYWN0dWFsaXphZG9zIGRlbCBiYWNrZW5kLlxuICAgKi9cbiAgZmV0Y2hQZXJtaXNzaW9ucygpOiBPYnNlcnZhYmxlPEdldFBlcm1pc3Npb25zUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxHZXRQZXJtaXNzaW9uc1Jlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Blcm1pc3Npb25zYCkucGlwZShcbiAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVBlcm1pc3Npb25zKFxuICAgICAgICAgIHJlc3BvbnNlLnJvbGVzLFxuICAgICAgICAgIHJlc3BvbnNlLnBlcm1pc3Npb25zLFxuICAgICAgICAgIHJlc3BvbnNlLmlzU3VwZXJBZG1pblxuICAgICAgICApO1xuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVQZXJtaXNzaW9ucyhyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuc3luY1NlcnZpY2UuYnJvYWRjYXN0KHsgdHlwZTogJ1BFUk1JU1NJT05TX1VQREFURScgfSk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyB0aWVuZSB1biBwZXJtaXNvIGVzcGVjw61maWNvLlxuICAgKiBGb3JtYXRvOiBcInJlc291cmNlOmFjdGlvblwiIChlajogXCJ0ZW1wbGF0ZXM6ZWRpdFwiKVxuICAgKi9cbiAgaGFzUGVybWlzc2lvbihwZXJtaXNzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1N1cGVyQWRtaW4oKSkgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCBbcmVzb3VyY2UsIGFjdGlvbl0gPSBwZXJtaXNzaW9uLnNwbGl0KCc6Jyk7XG4gICAgcmV0dXJuIHRoaXMucGVybWlzc2lvbnMoKS5zb21lKHAgPT4ge1xuICAgICAgY29uc3QgW3BSZXNvdXJjZSwgcEFjdGlvbl0gPSBwLnNwbGl0KCc6Jyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAocFJlc291cmNlID09PSAnKicgfHwgcFJlc291cmNlID09PSByZXNvdXJjZSkgJiYgKHBBY3Rpb24gPT09ICcqJyB8fCBwQWN0aW9uID09PSBhY3Rpb24pXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gdGllbmUgYWxndW5vIGRlIGxvcyBwZXJtaXNvcyBkYWRvcy5cbiAgICovXG4gIGhhc0FueVBlcm1pc3Npb24ocGVybWlzc2lvbnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zLnNvbWUocCA9PiB0aGlzLmhhc1Blcm1pc3Npb24ocCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gdGllbmUgdG9kb3MgbG9zIHBlcm1pc29zIGRhZG9zLlxuICAgKi9cbiAgaGFzQWxsUGVybWlzc2lvbnMocGVybWlzc2lvbnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zLmV2ZXJ5KHAgPT4gdGhpcy5oYXNQZXJtaXNzaW9uKHApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHRpZW5lIHVuIHJvbCBlc3BlY8OtZmljby5cbiAgICovXG4gIGhhc1JvbGUocm9sZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucm9sZXMoKS5zb21lKHIgPT4gci50b0xvd2VyQ2FzZSgpID09PSByb2xlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhBTkRMRSAoVVNFUk5BTUUpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBBY3R1YWxpemEgZWwgaGFuZGxlIChAdXNlcm5hbWUpIGRlbCB1c3VhcmlvLlxuICAgKiBAcGFyYW0gaGFuZGxlIC0gTnVldm8gaGFuZGxlIChzaW4gQCwgZWo6IFwidmljdG9ydlwiKVxuICAgKi9cbiAgdXBkYXRlSGFuZGxlKGhhbmRsZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxVcGRhdGVIYW5kbGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFVwZGF0ZUhhbmRsZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Byb2ZpbGUvaGFuZGxlYCwgeyBoYW5kbGUgfSkucGlwZShcbiAgICAgIHRhcCgoKSA9PiB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVQcm9maWxlRmllbGRzKHsgaGFuZGxlIH0pKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgdW4gaGFuZGxlIGVzdMOhIGRpc3BvbmlibGUuXG4gICAqIEBwYXJhbSBoYW5kbGUgLSBIYW5kbGUgYSB2ZXJpZmljYXIgKHNpbiBAKVxuICAgKi9cbiAgY2hlY2tIYW5kbGVBdmFpbGFiaWxpdHkoaGFuZGxlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoZWNrSGFuZGxlUmVzcG9uc2U+IHtcbiAgICAvLyBTZXJ2ZXIgcmVzcG9uc2U6IHsgb3BlcmF0aW9uSWQsIHVzZXI/LCBmb3VuZCB9LiBmb3VuZD10cnVlIOKGkiBoYW5kbGUgdGFrZW4uXG4gICAgLy8gTGliIHNlbWFudGljOiBhdmFpbGFibGUgPSAhZm91bmQuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmdldDx7XG4gICAgICAgIG9wZXJhdGlvbklkOiBzdHJpbmc7XG4gICAgICAgIGZvdW5kOiBib29sZWFuO1xuICAgICAgfT4oYCR7dGhpcy51c2Vyc0Jhc2VVcmx9L2hhbmRsZS8ke2VuY29kZVVSSUNvbXBvbmVudChoYW5kbGUpfWApXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKHJhdyA9PiAoe1xuICAgICAgICAgIG9wZXJhdGlvbklkOiByYXcub3BlcmF0aW9uSWQsXG4gICAgICAgICAgaGFuZGxlLFxuICAgICAgICAgIGF2YWlsYWJsZTogIXJhdy5mb3VuZCxcbiAgICAgICAgfSkpLFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICAgICk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBNRVRIT0RTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgZ2V0IGJhc2VVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5jb25maWcuYXBpVXJsfSR7dGhpcy5jb25maWcuYXV0aFByZWZpeH1gO1xuICB9XG5cbiAgLyoqIEJhc2UgZm9yIC92Mi91c2VycyBlbmRwb2ludHMgKHNlcGFyYXRlIGZyb20gL3YyL2F1dGgpLiAqL1xuICBwcml2YXRlIGdldCB1c2Vyc0Jhc2VVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5jb25maWcuYXBpVXJsfS92Mi91c2Vyc2A7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN1Y2Nlc3NmdWxBdXRoKHJlc3BvbnNlOiBTaWduaW5SZXNwb25zZSB8IE1GQVZlcmlmeVJlc3BvbnNlKTogdm9pZCB7XG4gICAgY29uc3QgZXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArIHJlc3BvbnNlLmV4cGlyZXNJbiEgKiAxMDAwO1xuICAgIGNvbnN0IHRva2VuRGF0YSA9IHRoaXMudG9rZW5TZXJ2aWNlLnBhcnNlVG9rZW4ocmVzcG9uc2UuYWNjZXNzVG9rZW4hKTtcbiAgICBjb25zdCBpc1ByZW1pdW0gPSB0b2tlbkRhdGE/LnByZW1pdW0gPT09IHRydWU7XG5cbiAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRBdXRoZW50aWNhdGVkKHtcbiAgICAgIGFjY2Vzc1Rva2VuOiByZXNwb25zZS5hY2Nlc3NUb2tlbiEsXG4gICAgICByZWZyZXNoVG9rZW46IHJlc3BvbnNlLnJlZnJlc2hUb2tlbiEsXG4gICAgICB1c2VySWQ6IHRva2VuRGF0YT8udWlkLFxuICAgICAgZW1haWw6IHRva2VuRGF0YT8uZW1haWwsXG4gICAgICByb2xlczogcmVzcG9uc2Uucm9sZXMgfHwgW10sXG4gICAgICBwZXJtaXNzaW9uczogcmVzcG9uc2UucGVybWlzc2lvbnMgfHwgW10sXG4gICAgICBpc1N1cGVyQWRtaW46IHJlc3BvbnNlLnBlcm1pc3Npb25zPy5pbmNsdWRlcygnKjoqJykgfHwgZmFsc2UsXG4gICAgICBpc1ByZW1pdW0sXG4gICAgICBleHBpcmVzQXQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVTdGF0ZSh7XG4gICAgICBhY2Nlc3NUb2tlbjogcmVzcG9uc2UuYWNjZXNzVG9rZW4hLFxuICAgICAgcmVmcmVzaFRva2VuOiByZXNwb25zZS5yZWZyZXNoVG9rZW4hLFxuICAgICAgcm9sZXM6IHJlc3BvbnNlLnJvbGVzIHx8IFtdLFxuICAgICAgcGVybWlzc2lvbnM6IHJlc3BvbnNlLnBlcm1pc3Npb25zIHx8IFtdLFxuICAgICAgaXNTdXBlckFkbWluOiByZXNwb25zZS5wZXJtaXNzaW9ucz8uaW5jbHVkZXMoJyo6KicpIHx8IGZhbHNlLFxuICAgICAgaXNQcmVtaXVtLFxuICAgICAgZXhwaXJlc0F0LFxuICAgIH0pO1xuXG4gICAgdGhpcy5zdGFydFJlZnJlc2hUaW1lcigpO1xuICAgIHRoaXMuc3luY1NlcnZpY2UuYnJvYWRjYXN0KHsgdHlwZTogJ0xPR0lOJyB9KTtcblxuICAgIC8vIEludGVncmFjacOzbiBjb24gRmlyZWJhc2VcbiAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBoYW5kbGVTdWNjZXNzZnVsQXV0aCAtIEZpcmViYXNlIGNoZWNrOicsIHtcbiAgICAgIGVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb246IHRoaXMuY29uZmlnLmVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb24sXG4gICAgICBoYXNGaXJlYmFzZVRva2VuS2V5OiAnZmlyZWJhc2VUb2tlbicgaW4gcmVzcG9uc2UsXG4gICAgICBmaXJlYmFzZVRva2VuVmFsdWU6ICEhKHJlc3BvbnNlIGFzIGFueSkuZmlyZWJhc2VUb2tlbixcbiAgICAgIGZpcmViYXNlVG9rZW5MZW5ndGg6IChyZXNwb25zZSBhcyBhbnkpLmZpcmViYXNlVG9rZW4/Lmxlbmd0aCB8fCAwLFxuICAgIH0pO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5jb25maWcuZW5hYmxlRmlyZWJhc2VJbnRlZ3JhdGlvbiAmJlxuICAgICAgJ2ZpcmViYXNlVG9rZW4nIGluIHJlc3BvbnNlICYmXG4gICAgICByZXNwb25zZS5maXJlYmFzZVRva2VuXG4gICAgKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJ1tWYWx0ZWNoQXV0aF0gQ2FsbGluZyBzaWduSW5XaXRoRmlyZWJhc2Ugd2l0aCB0b2tlbiBsZW5ndGg6JyxcbiAgICAgICAgcmVzcG9uc2UuZmlyZWJhc2VUb2tlbi5sZW5ndGhcbiAgICAgICk7XG4gICAgICB0aGlzLnNpZ25JbldpdGhGaXJlYmFzZShyZXNwb25zZS5maXJlYmFzZVRva2VuKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLmVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb24pIHtcbiAgICAgIC8vIEVsIGxvZ2luIE5PIHRyYWpvIGZpcmViYXNlVG9rZW4gKGVqLiBmbHVqbyBPQXV0aCBxdWUgbG8gcGVyZGnDsykuIEVuIHZlelxuICAgICAgLy8gZGUgcXVlZGFyIHNpbiBzZXNpw7NuIGRlIEZpcmViYXNlLCByZWN1cnJpbW9zIGFsIGZhbGxiYWNrIHNlbGYtaGVhbGluZzpcbiAgICAgIC8vIC9yZWZyZXNoIHPDrSBkZXZ1ZWx2ZSB1biBmaXJlYmFzZVRva2VuIGNvbmZpYWJsZS5cbiAgICAgIGNvbnNvbGUubG9nKCdbRkJBdXRoXSBsb2dpbiByZXNwb25zZSBzaW4gZmlyZWJhc2VUb2tlbiDihpIgcmVjdXJyaWVuZG8gYSBmYWxsYmFjayAvcmVmcmVzaCcpO1xuICAgICAgdm9pZCB0aGlzLnJlZXN0YWJsaXNoRmlyZWJhc2VWaWFSZWZyZXNoKCdsb2dpbi1taXNzaW5nLWZpcmViYXNlLXRva2VuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIEZpcmViYXNlIHNpZ25pbiBza2lwcGVkIC0gaW50ZWdyYWNpw7NuIEZpcmViYXNlIGRlc2FjdGl2YWRhJyk7XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0cm8gYXV0b23DoXRpY28gZGUgZGlzcG9zaXRpdm8gcGFyYSBwdXNoIG5vdGlmaWNhdGlvbnNcbiAgICBpZiAodGhpcy5jb25maWcuZW5hYmxlRGV2aWNlUmVnaXN0cmF0aW9uKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRGV2aWNlSWZOZWVkZWQoKTsgLy8gZmlyZS1hbmQtZm9yZ2V0XG4gICAgfVxuXG4gICAgLy8gU2luY3Jvbml6YXIgaWRpb21hIGRlbCB1c3VhcmlvIGNvbiBpMThuXG4gICAgaWYgKHRoaXMuaTE4blNlcnZpY2UgJiYgJ2xhbmd1YWdlJyBpbiByZXNwb25zZSAmJiByZXNwb25zZS5sYW5ndWFnZSkge1xuICAgICAgY29uc3QgdXNlckxhbmcgPSByZXNwb25zZS5sYW5ndWFnZSBhcyBJMThuTGFuZztcbiAgICAgIGNvbnN0IGN1cnJlbnRMYW5nID0gdGhpcy5pMThuU2VydmljZS5sYW5nKCk7XG4gICAgICBpZiAodXNlckxhbmcgIT09IGN1cnJlbnRMYW5nKSB7XG4gICAgICAgIHRoaXMuaTE4blNlcnZpY2Uuc2V0TGFuZ3VhZ2UodXNlckxhbmcpO1xuICAgICAgICBjb25zb2xlLmxvZyhgW1ZhbHRlY2hBdXRoXSBMYW5ndWFnZSBzeW5jZWQgdG86ICR7dXNlckxhbmd9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFJlZnJlc2hUaW1lcigpO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnJlc2V0KCk7XG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5jbGVhcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFJlZnJlc2hUaW1lcigpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BSZWZyZXNoVGltZXIoKTtcblxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZVNlcnZpY2Uuc3RhdGUoKTtcbiAgICBpZiAoIXN0YXRlLmV4cGlyZXNBdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVmcmVzaEJlZm9yZU1zID0gKHRoaXMuY29uZmlnLnJlZnJlc2hCZWZvcmVFeHBpcnkgfHwgNjApICogMTAwMDtcbiAgICBjb25zdCByZWZyZXNoQXQgPSBzdGF0ZS5leHBpcmVzQXQgLSByZWZyZXNoQmVmb3JlTXM7XG4gICAgY29uc3QgZGVsYXkgPSByZWZyZXNoQXQgLSBEYXRlLm5vdygpO1xuXG4gICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgdGhpcy5yZWZyZXNoVGltZXJJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpLnN1YnNjcmliZSh7XG4gICAgICAgICAgZXJyb3I6ICgpID0+IHRoaXMubG9nb3V0KCksXG4gICAgICAgIH0pO1xuICAgICAgfSwgZGVsYXkpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUucmVmcmVzaFRva2VuKSB7XG4gICAgICAvLyBUb2tlbiB5YSBkZWJlcsOtYSByZWZyZXNjYXJzZSwgaW50ZW50YXIgYWhvcmFcbiAgICAgIHRoaXMucmVmcmVzaEFjY2Vzc1Rva2VuKCkuc3Vic2NyaWJlKHtcbiAgICAgICAgZXJyb3I6ICgpID0+IHRoaXMubG9nb3V0KCksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0b3BSZWZyZXNoVGltZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVmcmVzaFRpbWVySWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlZnJlc2hUaW1lcklkKTtcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVySWQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU3luY0V2ZW50KGV2ZW50OiBBdXRoU3luY0V2ZW50KTogdm9pZCB7XG4gICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICBjYXNlICdMT0dJTic6XG4gICAgICBjYXNlICdUT0tFTl9SRUZSRVNIJzoge1xuICAgICAgICAvLyBSZWNhcmdhciBlc3RhZG8gZGVzZGUgc3RvcmFnZVxuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZFN0YXRlKCk7XG4gICAgICAgIGlmIChzdGF0ZS5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnJlc3RvcmVGcm9tU3RvcmFnZShzdGF0ZSk7XG4gICAgICAgICAgY29uc3QgY2xhaW1zID0gdGhpcy50b2tlblNlcnZpY2UucGFyc2VUb2tlbihzdGF0ZS5hY2Nlc3NUb2tlbik7XG4gICAgICAgICAgaWYgKGNsYWltcykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlVXNlckluZm8oY2xhaW1zLnVpZCwgY2xhaW1zLmVtYWlsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zdGFydFJlZnJlc2hUaW1lcigpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnTE9HT1VUJzpcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UucmVzZXQoKTtcbiAgICAgICAgdGhpcy5zdG9wUmVmcmVzaFRpbWVyKCk7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLmNvbmZpZy5sb2dpblJvdXRlXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnUEVSTUlTU0lPTlNfVVBEQVRFJzoge1xuICAgICAgICBjb25zdCBwZXJtcyA9IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZFBlcm1pc3Npb25zKCk7XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVBlcm1pc3Npb25zKHBlcm1zLnJvbGVzLCBwZXJtcy5wZXJtaXNzaW9ucywgcGVybXMuaXNTdXBlckFkbWluKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdPUkdfU1dJVENIJzpcbiAgICAgICAgLy8gT3RyYSBwZXN0YcOxYSBjYW1iacOzIGRlIG9yZ2FuaXphY2nDs24gLSByZWNhcmdhciBww6FnaW5hIHBhcmEgb2J0ZW5lciBudWV2byBlc3RhZG9cbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUF1dGhFcnJvcihlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpOiBPYnNlcnZhYmxlPG5ldmVyPiB7XG4gICAgY29uc3QgYXV0aEVycm9yOiBBdXRoRXJyb3IgPSB7XG4gICAgICBjb2RlOiBlcnJvci5lcnJvcj8uY29kZSB8fCAnVU5LTk9XTl9FUlJPUicsXG4gICAgICBtZXNzYWdlOiBlcnJvci5lcnJvcj8ubWVzc2FnZSB8fCAnRXJyb3IgZGUgYXV0ZW50aWNhY2nDs24gZGVzY29ub2NpZG8nLFxuICAgIH07XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0RXJyb3IoYXV0aEVycm9yKTtcbiAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBhdXRoRXJyb3IpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZJUkVCQVNFIElOVEVHUkFUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgYXN5bmMgc2lnbkluV2l0aEZpcmViYXNlKGZpcmViYXNlVG9rZW46IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFtGQkF1dGhdIGF1dGggZmxvdyDihpIgc2lnbkluV2l0aEZpcmViYXNlIGF0dGVtcHQgdG9rZW5MZW49JHtmaXJlYmFzZVRva2VuPy5sZW5ndGggPz8gMH0gYCArXG4gICAgICAgIGBmaXJlYmFzZVNlcnZpY2VQcmVzZW50PSR7ISF0aGlzLmZpcmViYXNlU2VydmljZX1gXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuZmlyZWJhc2VTZXJ2aWNlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmlyZWJhc2VTZXJ2aWNlLnNpZ25JbldpdGhDdXN0b21Ub2tlbihmaXJlYmFzZVRva2VuKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gRmlyZWJhc2Ugc2lnbmluIHN1Y2Nlc3NmdWwnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZVNlcnZpY2Ugbm90IHByb3ZpZGVkLiBBZGQgcHJvdmlkZVZhbHRlY2hGaXJlYmFzZSgpIHRvIHlvdXIgcHJvdmlkZXJzLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTm8gYmxvcXVlYXIgZWwgbG9naW4gcHJpbmNpcGFsIHNpIEZpcmViYXNlIGZhbGxhXG4gICAgICBjb25zb2xlLmVycm9yKCdbVmFsdGVjaEF1dGhdIEZpcmViYXNlIHNpZ25pbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2lnbk91dEZpcmViYXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb25maWcuZW5hYmxlRmlyZWJhc2VJbnRlZ3JhdGlvbikgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmZpcmViYXNlU2VydmljZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmZpcmViYXNlU2VydmljZS5zaWduT3V0KCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIEZpcmViYXNlIHNpZ25vdXQgc3VjY2Vzc2Z1bCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZ25vcmFyIGVycm9yZXMgZGUgRmlyZWJhc2Ugc2lnbm91dFxuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIEZpcmViYXNlIHNpZ25vdXQgZmFpbGVkOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmUtZXN0YWJsZWNlIGxhIHNlc2nDs24gZGUgRmlyZWJhc2UgQXV0aCBlbiBlbCBib290c3RyYXAgZGUgbGEgYXBwIGN1YW5kb1xuICAgKiBlbCBhY2Nlc3MgdG9rZW4gZGUgbGEgYXBwIHNpZ3VlIHbDoWxpZG8gKGxhIHJhbWEgZGUgaW5pdGlhbGl6ZSgpIHF1ZSBOT1xuICAgKiBwYXNhIHBvciByZWZyZXNoKS5cbiAgICpcbiAgICogRmlyZWJhc2UgQXV0aCBtYW50aWVuZSBzdSBQUk9QSUEgc2VzacOzbiBjb24gcGVyc2lzdGVuY2lhIEluZGV4ZWREQlxuICAgKiBpbmRlcGVuZGllbnRlIGRlbCBzdG9yYWdlIGRlIHRva2VucyBkZSBsYSBhcHAuIEVuIHVuIG5hdmVnYWRvciBub3JtYWwgZXNhXG4gICAqIHBlcnNpc3RlbmNpYSBzZSBhdXRvLXJlc3RhdXJhIHNvbGE7IGVuIHVuYSBQV0Egc3RhbmRhbG9uZSBlbiBpT1MgZWxcbiAgICogY29udGVuZWRvciBkZSBzdG9yYWdlIG5vIHNvYnJldml2ZSwgeSBgZmlyZWJhc2VBdXRoUmVhZHlgIHNlIHF1ZWRhIGVuXG4gICAqIGBmYWxzZWAgaW5kZWZpbmlkYW1lbnRlIOKGkiBsb3MgbGlzdGVuZXJzIEZpcmVzdG9yZSBjdWVsZ2FuICh+NDBzIHRpbWVvdXQpLlxuICAgKlxuICAgKiBFc3RyYXRlZ2lhOiBkYXIgdW5hIHZlbnRhbmEgY29ydGEgYSBsYSBhdXRvLXJlc3RhdXJhY2nDs24gZGUgRmlyZWJhc2UgeSwgc2lcbiAgICogbm8gb2N1cnJlLCBmb3J6YXIgdW4gYHJlZnJlc2hBY2Nlc3NUb2tlbigpYCDigJQgcXVlIHlhIGhhY2UgYHNpZ25JbldpdGhGaXJlYmFzZWBcbiAgICogY29uIGVsIGBmaXJlYmFzZVRva2VuYCBxdWUgZGV2dWVsdmUgYC9yZWZyZXNoYC5cbiAgICpcbiAgICogRmlyZS1hbmQtZm9yZ2V0OiBzZSBpbnZvY2EgY29uIGB2b2lkYCBwYXJhIG5vIGRlbW9yYXIgYGluaXRpYWxpemUoKWAuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUZpcmViYXNlU2Vzc2lvbk9uQm9vdHN0cmFwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb25maWcuZW5hYmxlRmlyZWJhc2VJbnRlZ3JhdGlvbiB8fCAhdGhpcy5maXJlYmFzZVNlcnZpY2UpIHJldHVybjtcblxuICAgIC8vIERhciBhIGxhIHBlcnNpc3RlbmNpYSBJbmRleGVkREIgcHJvcGlhIGRlIEZpcmViYXNlIEF1dGggdW5hIG9wb3J0dW5pZGFkXG4gICAgLy8gZGUgYXV0by1yZXN0YXVyYXJzZSAobmF2ZWdhZG9yIG5vcm1hbCkuIEVuIHVuYSBQV0Egc3RhbmRhbG9uZSBkZSBpT1NcbiAgICAvLyBub3JtYWxtZW50ZSBOTyBsbyBoYXLDoS5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgMjUwMCkpO1xuXG4gICAgaWYgKHRoaXMuZmlyZWJhc2VTZXJ2aWNlLmZpcmViYXNlQXV0aFJlYWR5KCkpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbRkJBdXRoXSBib290c3RyYXAg4oCUIEZpcmViYXNlIHNlc3Npb24gcmVzdG9yZWQgb24gaXRzIG93bicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgJ1tGQkF1dGhdIGJvb3RzdHJhcCDigJQgc2Vzc2lvbiB2YWxpZCBidXQgRmlyZWJhc2UgTk9UIHJlYWR5IOKGkiByZWN1cnJpZW5kbyBhIGZhbGxiYWNrJ1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5yZWVzdGFibGlzaEZpcmViYXNlVmlhUmVmcmVzaCgnYm9vdHN0cmFwLXNlc3Npb24tcmVzdG9yZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhbGxiYWNrIHNlbGYtaGVhbGluZyBkZSBGaXJlYmFzZSBBdXRoLiBQaWRlIHVuIGZpcmViYXNlVG9rZW4gZnJlc2NvIHbDrWFcbiAgICogYC9yZWZyZXNoYCAocXVlIHPDrSBsbyBkZXZ1ZWx2ZSBkZSBmb3JtYSBjb25maWFibGUpIHksIGVuIMOpeGl0byxcbiAgICogYHJlZnJlc2hBY2Nlc3NUb2tlbigpYCB5YSBlamVjdXRhIGBzaWduSW5XaXRoRmlyZWJhc2UoKWAuXG4gICAqXG4gICAqIFNlIGludm9jYSBjdWFuZG8gdW4gcGF0aCBkZSBhdXRoIGRlasOzIGxhIHNlc2nDs24gZGUgRmlyZWJhc2Ugc2luIGVzdGFibGVjZXI6XG4gICAqICAtIGxvZ2luIE9BdXRoL3Bhc3N3b3JkIHF1ZSB2b2x2acOzIHNpbiBgZmlyZWJhc2VUb2tlbmAsXG4gICAqICAtIGNvbGQgbGF1bmNoIGRlIFBXQSBpT1Mgc2luIHBlcnNpc3RlbmNpYSBkZSBGaXJlYmFzZS5cbiAgICpcbiAgICogYHJlYXNvbmAgYXBhcmVjZSBlbiBsb3MgbG9ncyBgW0ZCQXV0aF0gZmFsbGJhY2tgIHBhcmEgcG9kZXIgYXRlc3RpZ3VhclxuICAgKiBkZXNkZSBlbCBkZWJ1Zy1jb25zb2xlIHF1w6kgZGlzcGFyw7MgZWwgZmFsbGJhY2suXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZXN0YWJsaXNoRmlyZWJhc2VWaWFSZWZyZXNoKHJlYXNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5lbmFibGVGaXJlYmFzZUludGVncmF0aW9uIHx8ICF0aGlzLmZpcmViYXNlU2VydmljZSkgcmV0dXJuO1xuXG4gICAgY29uc29sZS5sb2coYFtGQkF1dGhdIGZhbGxiYWNrIOKAlCByZS1lc3RhYmxlY2llbmRvIEZpcmViYXNlIHbDrWEgL3JlZnJlc2ggKG1vdGl2bzogJHtyZWFzb259KWApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbRkJBdXRoXSBmYWxsYmFjayDigJQgL3JlZnJlc2ggT0ssIEZpcmViYXNlIHJlLWVzdGFibGVjaWRvIChtb3Rpdm86ICR7cmVhc29ufSlgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtGQkF1dGhdIGZhbGxiYWNrIOKAlCAvcmVmcmVzaCBmYWxsw7MgKG1vdGl2bzogJHtyZWFzb259KTpgLCBlKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gREVWSUNFIFJFR0lTVFJBVElPTiAoUHVzaCBOb3RpZmljYXRpb25zKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogU29saWNpdGEgcGVybWlzb3MgZGUgbm90aWZpY2FjacOzbiB5IHJlZ2lzdHJhIGVsIGRpc3Bvc2l0aXZvLlxuICAgKiBVc2FyIGN1YW5kbyBlbCB1c3VhcmlvIGFjZXB0YSByZWNpYmlyIG5vdGlmaWNhY2lvbmVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGFzeW5jIG9uRW5hYmxlTm90aWZpY2F0aW9ucygpIHtcbiAgICogICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGguZW5hYmxlTm90aWZpY2F0aW9ucygpO1xuICAgKiAgIGlmIChyZXN1bHQuZ3JhbnRlZCkge1xuICAgKiAgICAgY29uc29sZS5sb2coJ05vdGlmaWNhY2lvbmVzIGhhYmlsaXRhZGFzJyk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZW5hYmxlTm90aWZpY2F0aW9ucygpOiBQcm9taXNlPEVuYWJsZU5vdGlmaWNhdGlvbnNSZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMubWVzc2FnaW5nU2VydmljZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIE1lc3NhZ2luZ1NlcnZpY2Ugbm90IGF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuIHsgZ3JhbnRlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAoIShhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuaXNTdXBwb3J0ZWQoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBQdXNoIG5vdGlmaWNhdGlvbnMgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgcmV0dXJuIHsgZ3JhbnRlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMubWVzc2FnaW5nU2VydmljZS5yZXF1ZXN0UGVybWlzc2lvbigpO1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiB7IGdyYW50ZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0cmFyIGRpc3Bvc2l0aXZvIGVuIGJhY2tlbmRcbiAgICBjb25zdCByZWdpc3RlcmVkID0gYXdhaXQgdGhpcy5yZWdpc3RlckRldmljZUlmTmVlZGVkKCk7XG5cbiAgICByZXR1cm4geyBncmFudGVkOiB0cnVlLCB0b2tlbiwgcmVnaXN0ZXJlZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2FjdGl2YSBsYXMgbm90aWZpY2FjaW9uZXMgcGFyYSBlc3RlIGRpc3Bvc2l0aXZvLlxuICAgKiBFbGltaW5hIGVsIHRva2VuIGRlbCBiYWNrZW5kIHkgZGUgRkNNLlxuICAgKiBVc2FyIGRlc2RlIHVuIHRvZ2dsZSBkZSBwcmVmZXJlbmNpYXMgY3VhbmRvIGVsIHVzdWFyaW8gZGVzYWN0aXZhIG5vdGlmaWNhY2lvbmVzLlxuICAgKlxuICAgKiBOT1RBOiBFc3RvIE5PIHJldm9jYSBlbCBwZXJtaXNvIGRlbCBuYXZlZ2Fkb3IgKGVsIHVzdWFyaW8gZGViZSBoYWNlcmxvIG1hbnVhbG1lbnRlXG4gICAqIGRlc2RlIGxhIGNvbmZpZ3VyYWNpw7NuIGRlbCBuYXZlZ2Fkb3IpLiBTb2xvIGVsaW1pbmEgZWwgcmVnaXN0cm8gZGVsIGRpc3Bvc2l0aXZvLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGFzeW5jIG9uVG9nZ2xlTm90aWZpY2F0aW9ucyhlbmFibGVkOiBib29sZWFuKSB7XG4gICAqICAgaWYgKGVuYWJsZWQpIHtcbiAgICogICAgIGF3YWl0IHRoaXMuYXV0aC5lbmFibGVOb3RpZmljYXRpb25zKCk7XG4gICAqICAgfSBlbHNlIHtcbiAgICogICAgIGF3YWl0IHRoaXMuYXV0aC5kaXNhYmxlTm90aWZpY2F0aW9ucygpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGRpc2FibGVOb3RpZmljYXRpb25zKCk6IFByb21pc2U8eyBkaXNhYmxlZDogYm9vbGVhbiB9PiB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2luZ1NlcnZpY2UpIHtcbiAgICAgIHJldHVybiB7IGRpc2FibGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlbiA9IHRoaXMubWVzc2FnaW5nU2VydmljZS5jdXJyZW50VG9rZW47XG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgLy8gRWxpbWluYXIgZGVsIGJhY2tlbmRcbiAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgdGhpcy5odHRwXG4gICAgICAgICAgICAucmVxdWVzdCgnREVMRVRFJywgYCR7dGhpcy5jb25maWcuYXBpVXJsfS92Mi91c2Vycy9tZS9kZXZpY2VzL2J5LXRva2VuYCwge1xuICAgICAgICAgICAgICBib2R5OiB7IHRva2VuIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gRWxpbWluYXIgdG9rZW4gZGUgRkNNXG4gICAgICAgIGF3YWl0IHRoaXMubWVzc2FnaW5nU2VydmljZS5kZWxldGVUb2tlbigpO1xuICAgICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBOb3RpZmljYXRpb25zIGRpc2FibGVkJyk7XG4gICAgICAgIHJldHVybiB7IGRpc2FibGVkOiB0cnVlIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGRpc2FibGVkOiBmYWxzZSB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tWYWx0ZWNoQXV0aF0gRmFpbGVkIHRvIGRpc2FibGUgbm90aWZpY2F0aW9uczonLCBlcnJvcik7XG4gICAgICByZXR1cm4geyBkaXNhYmxlZDogZmFsc2UgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0b3JuYSBlbCBlc3RhZG8gYWN0dWFsIGRlIHBlcm1pc29zIGRlIG5vdGlmaWNhY2nDs24uXG4gICAqXG4gICAqIEByZXR1cm5zICdncmFudGVkJyB8ICdkZW5pZWQnIHwgJ2RlZmF1bHQnIHwgJ3Vuc3VwcG9ydGVkJ1xuICAgKi9cbiAgZ2V0Tm90aWZpY2F0aW9uUGVybWlzc2lvblN0YXRlKCk6IE5vdGlmaWNhdGlvblBlcm1pc3Npb25TdGF0ZSB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2luZ1NlcnZpY2UpIHtcbiAgICAgIHJldHVybiAndW5zdXBwb3J0ZWQnO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmdldFBlcm1pc3Npb25TdGF0ZSgpIGFzIE5vdGlmaWNhdGlvblBlcm1pc3Npb25TdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RyYSBtYW51YWxtZW50ZSBlbCBkaXNwb3NpdGl2byBlbiBlbCBiYWNrZW5kLlxuICAgKiDDmnRpbCBwYXJhIHNpbmNyb25pemFyIGRpc3Bvc2l0aXZvcyBxdWUgdGllbmVuIHRva2VuIEZDTSBwZXJvIG5vIGVzdMOhbiByZWdpc3RyYWRvcy5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVkVG9rZW4gVG9rZW4gRkNNIG9wY2lvbmFsLiBTaSBzZSBwcm9wb3JjaW9uYSwgc2UgdXNhIGRpcmVjdGFtZW50ZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICBzaW4gZGVwZW5kZXIgZGVsIE1lc3NhZ2luZ1NlcnZpY2UgKGV2aXRhIHRpbWluZyBpc3N1ZXMpLlxuICAgKiBAcmV0dXJucyBSZXN1bHRhZG8gZGVsIHJlZ2lzdHJvIGNvbiBkZXZpY2VJZCBzaSBmdWUgZXhpdG9zb1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFNpbmNyb25pemFyIGNvbiB0b2tlbiBleGlzdGVudGUgKHJlY29tZW5kYWRvKVxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgucmVnaXN0ZXJEZXZpY2UobXlUb2tlbik7XG4gICAqXG4gICAqIC8vIFNpbiB0b2tlbiwgaW50ZW50YXLDoSBvYnRlbmVybG8gZGVsIE1lc3NhZ2luZ1NlcnZpY2VcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnJlZ2lzdGVyRGV2aWNlKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVnaXN0ZXJEZXZpY2UocHJvdmlkZWRUb2tlbj86IHN0cmluZyk6IFByb21pc2U8UmVnaXN0ZXJEZXZpY2VSZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMuaXNBdXRoZW50aWNhdGVkKCkpIHtcbiAgICAgIHJldHVybiB7IHJlZ2lzdGVyZWQ6IGZhbHNlLCBlcnJvcjogJ1VzdWFyaW8gbm8gYXV0ZW50aWNhZG8nIH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFZlcmlmaWNhciBwZXJtaXNvcyBzaSB0ZW5lbW9zIE1lc3NhZ2luZ1NlcnZpY2VcbiAgICAgIGlmICh0aGlzLm1lc3NhZ2luZ1NlcnZpY2UpIHtcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbiA9IHRoaXMubWVzc2FnaW5nU2VydmljZS5nZXRQZXJtaXNzaW9uU3RhdGUoKTtcbiAgICAgICAgaWYgKHBlcm1pc3Npb24gIT09ICdncmFudGVkJykge1xuICAgICAgICAgIHJldHVybiB7IHJlZ2lzdGVyZWQ6IGZhbHNlLCBlcnJvcjogJ1Blcm1pc28gZGUgbm90aWZpY2FjaW9uZXMgbm8gb3RvcmdhZG8nIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVXNhciB0b2tlbiBwcm9wb3JjaW9uYWRvIHByaW1lcm8gKGV2aXRhIHRpbWluZyBpc3N1ZXMgY29uIEluamVjdG9yKVxuICAgICAgbGV0IHRva2VuID0gcHJvdmlkZWRUb2tlbiB8fCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2U/LmN1cnJlbnRUb2tlbjtcblxuICAgICAgLy8gU2kgbm8gaGF5IHRva2VuLCBpbnRlbnRhciBvYnRlbmVybG8gZGVsIE1lc3NhZ2luZ1NlcnZpY2VcbiAgICAgIGlmICghdG9rZW4gJiYgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlKSB7XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMubWVzc2FnaW5nU2VydmljZS5pc1N1cHBvcnRlZCgpKSkge1xuICAgICAgICAgIHJldHVybiB7IHJlZ2lzdGVyZWQ6IGZhbHNlLCBlcnJvcjogJ0ZDTSBubyBzb3BvcnRhZG8gZW4gZXN0ZSBuYXZlZ2Fkb3InIH07XG4gICAgICAgIH1cbiAgICAgICAgdG9rZW4gPSBhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZ2V0VG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICByZXR1cm4geyByZWdpc3RlcmVkOiBmYWxzZSwgZXJyb3I6ICdObyBzZSBwdWRvIG9idGVuZXIgdG9rZW4gRkNNJyB9O1xuICAgICAgfVxuXG4gICAgICAvLyBSZWdpc3RyYXIgZW4gYmFja2VuZFxuICAgICAgY29uc3QgeyBwbGF0Zm9ybSwgYnJvd3Nlciwgb3MgfSA9IHRoaXMuZGV0ZWN0UGxhdGZvcm1JbmZvKCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLmh0dHAucG9zdDxSZWdpc3RlckRldmljZVJlc3BvbnNlPihgJHt0aGlzLmNvbmZpZy5hcGlVcmx9L3YyL3VzZXJzL21lL2RldmljZXNgLCB7XG4gICAgICAgICAgdG9rZW4sXG4gICAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgICAgYnJvd3NlcixcbiAgICAgICAgICBvcyxcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIERldmljZSByZWdpc3RlcmVkIG1hbnVhbGx5OicsIHJlc3BvbnNlLmRldmljZS5kZXZpY2VJZCk7XG4gICAgICByZXR1cm4geyByZWdpc3RlcmVkOiB0cnVlLCBkZXZpY2VJZDogcmVzcG9uc2UuZGV2aWNlLmRldmljZUlkLCB0b2tlbiB9O1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBNYW51YWwgZGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVnaXN0ZXJlZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiBlcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3I/Lm1lc3NhZ2UgfHwgJ0Vycm9yIGFsIHJlZ2lzdHJhciBkaXNwb3NpdGl2bycsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RyYSBlbCBkaXNwb3NpdGl2byBlbiBlbCBiYWNrZW5kIHNpIHRpZW5lIHBlcm1pc29zIGRlIG5vdGlmaWNhY2nDs24uXG4gICAqIFNlIGxsYW1hIGF1dG9tw6F0aWNhbWVudGUgZGVzcHXDqXMgZGUgdW4gbG9naW4gZXhpdG9zbyBzaSBlbmFibGVEZXZpY2VSZWdpc3RyYXRpb249dHJ1ZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJEZXZpY2VJZk5lZWRlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBTb2xvIHNpIGVzdMOhIGhhYmlsaXRhZG8geSBtZXNzYWdpbmcgZXN0w6EgZGlzcG9uaWJsZVxuICAgIGlmICghdGhpcy5jb25maWcuZW5hYmxlRGV2aWNlUmVnaXN0cmF0aW9uIHx8ICF0aGlzLm1lc3NhZ2luZ1NlcnZpY2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gVmVyaWZpY2FyIHNpIEZDTSBlc3TDoSBzb3BvcnRhZG9cbiAgICAgIGlmICghKGF3YWl0IHRoaXMubWVzc2FnaW5nU2VydmljZS5pc1N1cHBvcnRlZCgpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmaWNhciBzaSB5YSB0aWVuZSBwZXJtaXNvc1xuICAgICAgY29uc3QgcGVybWlzc2lvbiA9IHRoaXMubWVzc2FnaW5nU2VydmljZS5nZXRQZXJtaXNzaW9uU3RhdGUoKTtcbiAgICAgIGlmIChwZXJtaXNzaW9uICE9PSAnZ3JhbnRlZCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBObyBzb2xpY2l0YXIgYXV0b23DoXRpY2FtZW50ZSwgc29sbyByZWdpc3RyYXIgc2kgeWEgdGllbmUgcGVybWlzb1xuICAgICAgfVxuXG4gICAgICAvLyBPYnRlbmVyIHRva2VuIGV4aXN0ZW50ZSAobm8gc29saWNpdGFyIG51ZXZvKVxuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZ2V0VG9rZW4oKTtcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWdpc3RyYXIgZW4gYmFja2VuZFxuICAgICAgY29uc3QgeyBwbGF0Zm9ybSwgYnJvd3Nlciwgb3MgfSA9IHRoaXMuZGV0ZWN0UGxhdGZvcm1JbmZvKCk7XG4gICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgdGhpcy5odHRwLnBvc3Q8UmVnaXN0ZXJEZXZpY2VSZXNwb25zZT4oYCR7dGhpcy5jb25maWcuYXBpVXJsfS92Mi91c2Vycy9tZS9kZXZpY2VzYCwge1xuICAgICAgICAgIHRva2VuLFxuICAgICAgICAgIHBsYXRmb3JtLFxuICAgICAgICAgIGJyb3dzZXIsXG4gICAgICAgICAgb3MsXG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBEZXZpY2UgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBObyBibG9xdWVhciBhdXRoIHNpIGZhbGxhIGRldmljZSByZWdpc3RyYXRpb25cbiAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBEZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVsaW1pbmEgZWwgZGlzcG9zaXRpdm8gZGVsIGJhY2tlbmQgeSBib3JyYSBlbCB0b2tlbiBGQ00uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHVucmVnaXN0ZXJEZXZpY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5lbmFibGVEZXZpY2VSZWdpc3RyYXRpb24gfHwgIXRoaXMubWVzc2FnaW5nU2VydmljZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlbiA9IHRoaXMubWVzc2FnaW5nU2VydmljZS5jdXJyZW50VG9rZW47XG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgLy8gRGVsZXRlIGZyb20gYmFja2VuZCAoZmlyZSBhbmQgZm9yZ2V0KVxuICAgICAgICB0aGlzLmh0dHBcbiAgICAgICAgICAucmVxdWVzdCgnREVMRVRFJywgYCR7dGhpcy5jb25maWcuYXBpVXJsfS92Mi91c2Vycy9tZS9kZXZpY2VzL2J5LXRva2VuYCwge1xuICAgICAgICAgICAgYm9keTogeyB0b2tlbiB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSkpXG4gICAgICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgICAgIC8vIERlbGV0ZSBmcm9tIEZDTVxuICAgICAgICBhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZGVsZXRlVG9rZW4oKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gRGV2aWNlIHVucmVnaXN0ZXJlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSWdub3JhciBlcnJvcmVzIGVuIGNsZWFudXBcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0YSBpbmZvcm1hY2nDs24gZGUgbGEgcGxhdGFmb3JtYSBkZWwgZGlzcG9zaXRpdm8uXG4gICAqL1xuICBwcml2YXRlIGRldGVjdFBsYXRmb3JtSW5mbygpOiB7IHBsYXRmb3JtOiAnd2ViJzsgYnJvd3Nlcjogc3RyaW5nOyBvczogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDtcblxuICAgIC8vIERldGVjdGFyIG5hdmVnYWRvclxuICAgIGxldCBicm93c2VyID0gJ1Vua25vd24nO1xuICAgIGlmICh1YS5pbmNsdWRlcygnRmlyZWZveCcpKSB7XG4gICAgICBicm93c2VyID0gJ0ZpcmVmb3gnO1xuICAgIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ0VkZycpKSB7XG4gICAgICBicm93c2VyID0gJ0VkZ2UnO1xuICAgIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ0Nocm9tZScpKSB7XG4gICAgICBicm93c2VyID0gJ0Nocm9tZSc7XG4gICAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnU2FmYXJpJykpIHtcbiAgICAgIGJyb3dzZXIgPSAnU2FmYXJpJztcbiAgICB9XG5cbiAgICAvLyBEZXRlY3RhciBPU1xuICAgIGxldCBvcyA9ICdVbmtub3duJztcbiAgICBpZiAodWEuaW5jbHVkZXMoJ1dpbmRvd3MnKSkge1xuICAgICAgb3MgPSAnV2luZG93cyc7XG4gICAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnTWFjIE9TJykpIHtcbiAgICAgIG9zID0gJ21hY09TJztcbiAgICB9IGVsc2UgaWYgKHVhLmluY2x1ZGVzKCdMaW51eCcpKSB7XG4gICAgICBvcyA9ICdMaW51eCc7XG4gICAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnQW5kcm9pZCcpKSB7XG4gICAgICBvcyA9ICdBbmRyb2lkJztcbiAgICB9IGVsc2UgaWYgKHVhLmluY2x1ZGVzKCdpT1MnKSB8fCB1YS5pbmNsdWRlcygnaVBob25lJykgfHwgdWEuaW5jbHVkZXMoJ2lQYWQnKSkge1xuICAgICAgb3MgPSAnaU9TJztcbiAgICB9XG5cbiAgICByZXR1cm4geyBwbGF0Zm9ybTogJ3dlYicsIGJyb3dzZXIsIG9zIH07XG4gIH1cbn1cbiJdfQ==
|
package/esm2022/lib/version.mjs
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
* Current version of valtech-components.
|
|
3
3
|
* This is automatically updated during the publish process.
|
|
4
4
|
*/
|
|
5
|
-
export const VERSION = '2.0.
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
export const VERSION = '2.0.829';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzIuMC44MjknO1xuIl19
|