valtech-components 4.0.1038 → 4.0.1039
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 +6 -2
- package/esm2022/lib/services/auth/types.mjs +1 -1
- package/esm2022/lib/services/i18n/i18n.service.mjs +10 -5
- package/esm2022/lib/services/preferences/preferences.service.mjs +25 -4
- package/esm2022/lib/version.mjs +2 -2
- package/fesm2022/valtech-components.mjs +39 -9
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/services/auth/types.d.ts +2 -0
- package/lib/services/preferences/preferences.service.d.ts +2 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
|
@@ -899,7 +899,11 @@ export class AuthService {
|
|
|
899
899
|
handle: profile.handle ?? null,
|
|
900
900
|
avatarUrl: profile.avatarUrl ?? null,
|
|
901
901
|
phone: profile.phone ?? null,
|
|
902
|
-
})),
|
|
902
|
+
})), tap(profile => {
|
|
903
|
+
if (this.i18nService && profile.language) {
|
|
904
|
+
this.i18nService.setLanguage(profile.language);
|
|
905
|
+
}
|
|
906
|
+
}), catchError(error => this.handleAuthError(error)));
|
|
903
907
|
}
|
|
904
908
|
/**
|
|
905
909
|
* Actualiza el perfil del usuario. Sincroniza state con los nuevos values
|
|
@@ -1776,4 +1780,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
1776
1780
|
}] }, { type: i10.ConfirmationDialogService }, { type: i11.Firestore, decorators: [{
|
|
1777
1781
|
type: Optional
|
|
1778
1782
|
}] }] });
|
|
1779
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9hdXRoL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQWEsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR25GLE9BQU8sRUFBYyxVQUFVLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3RGLE9BQU8sRUFDTCxHQUFHLEVBQ0gsVUFBVSxFQUNWLFNBQVMsRUFDVCxHQUFHLEVBQ0gsTUFBTSxFQUNOLElBQUksRUFDSixPQUFPLEVBQ1AsV0FBVyxFQUNYLFFBQVEsR0FDVCxNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQTJGL0MsT0FBTyxFQUFhLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDOzs7Ozs7Ozs7Ozs7O0FBM0YzQzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7QUFxRmpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxNQUFNLE9BQU8sV0FBVztJQWN0QixZQUNtRCxNQUFnQyxFQUN6RSxJQUFnQixFQUNoQixNQUFjLEVBQ2QsWUFBOEIsRUFDOUIsWUFBMEIsRUFDMUIsY0FBa0MsRUFDbEMsV0FBNEIsRUFDNUIsZUFBZ0MsRUFDaEMsWUFBMEIsRUFDZCxnQkFBeUMsRUFDekMsV0FBK0IsRUFDM0MsbUJBQThDLEVBQ2xDLGlCQUFtQztRQVpOLFdBQU0sR0FBTixNQUFNLENBQTBCO1FBQ3pFLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsV0FBTSxHQUFOLE1BQU0s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b250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgaXNEZXZNb2RlLCBPbkRlc3Ryb3ksIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yLCBvZiwgZnJvbSwgZmlyc3RWYWx1ZUZyb20sIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgdGFwLFxuICBjYXRjaEVycm9yLFxuICBzd2l0Y2hNYXAsXG4gIG1hcCxcbiAgZmlsdGVyLFxuICB0YWtlLFxuICB0aW1lb3V0LFxuICBzaGFyZVJlcGxheSxcbiAgZmluYWxpemUsXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgVkFMVEVDSF9BVVRIX0NPTkZJRyB9IGZyb20gJy4vY29uZmlnJztcblxuLyoqXG4gKiBUaW1lb3V0IGR1cm8gcGFyYSBlbCBgL3JlZnJlc2hgIChtcykuIFVuYSBMYW1iZGEgZnLDrWEgKyByZWQgbcOzdmlsIGZsYWt5IHB1ZWRlblxuICogZGVqYXIgZWwgUE9TVCBjb2xnYWRvIGluZGVmaW5pZGFtZW50ZTsgc2luIGVzdGUgbMOtbWl0ZSBlbCBgYXdhaXRgIGRlXG4gKiBgaW5pdGlhbGl6ZSgpYCAoQVBQX0lOSVRJQUxJWkVSKSBjb25nZWxhIGVsIGJvb3RzdHJhcCBlbiBlbCBza2VsZXRvbiwgeSBlbCBmbGFnXG4gKiBgaXNSZWZyZXNoaW5nYCBkZWwgaW50ZXJjZXB0b3Igc2UgcXVlZGEgcGVnYWRvIGJsb3F1ZWFuZG8gdG9kYSByZXF1ZXN0IHBvc3Rlcmlvci5cbiAqIENvbiB0aW1lb3V0LCBlbCByZWZyZXNoIFNJRU1QUkUgcmVzdWVsdmUgKG9rIG8gZXJyb3IpIOKGkiBsYSBVSSBudW5jYSBjdWVsZ2E6IGVsXG4gKiBib290c3RyYXAgY29udGluw7phIGNvbW8gaW52aXRhZG8geSBlbCBpbnRlcmNlcHRvciBsaWJlcmEgbGEgY29sYS5cbiAqL1xuY29uc3QgUkVGUkVTSF9USU1FT1VUX01TID0gMTAwMDA7XG5pbXBvcnQgeyBBdXRoU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9rZW5TZXJ2aWNlIH0gZnJvbSAnLi90b2tlbi5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhTdG9yYWdlU2VydmljZSB9IGZyb20gJy4vc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhTeW5jU2VydmljZSB9IGZyb20gJy4vc3luYy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFNpZ25pblJlcXVlc3QsXG4gIFNpZ25pblJlc3BvbnNlLFxuICBTaWdudXBSZXF1ZXN0LFxuICBTaWdudXBSZXNwb25zZSxcbiAgVmVyaWZ5RW1haWxSZXF1ZXN0LFxuICBWZXJpZnlFbWFpbFJlc3BvbnNlLFxuICBSZXNlbmRDb2RlUmVxdWVzdCxcbiAgUmVzZW5kQ29kZVJlc3BvbnNlLFxuICBNRkFWZXJpZnlSZXNwb25zZSxcbiAgUmVmcmVzaFJlcXVlc3QsXG4gIFJlZnJlc2hSZXNwb25zZSxcbiAgR2V0UGVybWlzc2lvbnNSZXNwb25zZSxcbiAgR2V0UHJvZmlsZVJlc3BvbnNlLFxuICBVcGRhdGVQcm9maWxlUmVxdWVzdCxcbiAgVXBkYXRlUHJvZmlsZVJlc3BvbnNlLFxuICBNRkFTZXR1cFJlc3BvbnNlLFxuICBNRkFDb25maXJtUmVzcG9uc2UsXG4gIE1GQURpc2FibGVSZXF1ZXN0LFxuICBNRkFEaXNhYmxlUmVzcG9uc2UsXG4gIEZvcmdvdFBhc3N3b3JkUmVxdWVzdCxcbiAgRm9yZ290UGFzc3dvcmRSZXNwb25zZSxcbiAgUmVzZXRQYXNzd29yZFJlcXVlc3QsXG4gIFJlc2V0UGFzc3dvcmRSZXNwb25zZSxcbiAgTUZBUmVzZXRSZXF1ZXN0UmVxdWVzdCxcbiAgTUZBUmVzZXRSZXF1ZXN0UmVzcG9uc2UsXG4gIE1GQVJlc2V0Q29uZmlybVJlcXVlc3QsXG4gIE1GQVJlc2V0Q29uZmlybVJlc3BvbnNlLFxuICBBY3RpdmF0ZUFjY291bnRSZXF1ZXN0LFxuICBBY3RpdmF0ZUFjY291bnRSZXNwb25zZSxcbiAgQ2hhbmdlUGFzc3dvcmRSZXF1ZXN0LFxuICBDaGFuZ2VQYXNzd29yZFJlc3BvbnNlLFxuICBEZWxldGVBY2NvdW50UmVxdWVzdCxcbiAgRGVsZXRlQWNjb3VudFJlc3BvbnNlLFxuICBTZW5kRGVsZXRlQWNjb3VudENvZGVSZXNwb25zZSxcbiAgU3dpdGNoT3JnUmVzcG9uc2UsXG4gIE1GQU1ldGhvZCxcbiAgQXV0aEVycm9yLFxuICBBdXRoU3luY0V2ZW50LFxuICBWYWx0ZWNoQXV0aENvbmZpZyxcbiAgUmVnaXN0ZXJEZXZpY2VSZXNwb25zZSxcbiAgRW5hYmxlTm90aWZpY2F0aW9uc1Jlc3VsdCxcbiAgTm90aWZpY2F0aW9uUGVybWlzc2lvblN0YXRlLFxuICBSZWdpc3RlckRldmljZVJlc3VsdCxcbiAgLy8gVE9UUCBNRkEgdHlwZXNcbiAgVE9UUFNldHVwUmVzcG9uc2UsXG4gIFRPVFBWZXJpZnlTZXR1cFJlc3BvbnNlLFxuICBUT1RQRGlzYWJsZVJlc3BvbnNlLFxuICBSZWdlbmVyYXRlQmFja3VwQ29kZXNSZXNwb25zZSxcbiAgQmFja3VwQ29kZXNDb3VudFJlc3BvbnNlLFxuICAvLyBPQXV0aCB0eXBlc1xuICBPQXV0aFByb3ZpZGVyLFxuICBPQXV0aFJlc3VsdCxcbiAgTGlua2VkUHJvdmlkZXIsXG4gIEhhc1Bhc3N3b3JkUmVzcG9uc2UsXG4gIC8vIEhhbmRsZSB0eXBlc1xuICBVcGRhdGVIYW5kbGVSZXNwb25zZSxcbiAgQ2hlY2tIYW5kbGVSZXNwb25zZSxcbiAgLy8gQXZhdGFyIHR5cGVzXG4gIFVwZGF0ZUF2YXRhclJlcXVlc3QsXG4gIFVwZGF0ZUF2YXRhclJlc3BvbnNlLFxuICAvLyBFbWFpbCBjaGFuZ2VcbiAgSW5pdGlhdGVFbWFpbENoYW5nZVJlcXVlc3QsXG4gIEluaXRpYXRlRW1haWxDaGFuZ2VSZXNwb25zZSxcbiAgQ29uZmlybUVtYWlsQ2hhbmdlU3RlcDFSZXF1ZXN0LFxuICBDb25maXJtRW1haWxDaGFuZ2VTdGVwMVJlc3BvbnNlLFxuICBDb25maXJtRW1haWxDaGFuZ2VTdGVwMlJlcXVlc3QsXG4gIENvbmZpcm1FbWFpbENoYW5nZVN0ZXAyUmVzcG9uc2UsXG4gIEFkZEVtYWlsUmVxdWVzdCxcbiAgQWRkRW1haWxSZXNwb25zZSxcbiAgQ29uZmlybUFkZEVtYWlsUmVxdWVzdCxcbiAgQ29uZmlybUFkZEVtYWlsUmVzcG9uc2UsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgT0F1dGhTZXJ2aWNlIH0gZnJvbSAnLi9vYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IEZpcmViYXNlU2VydmljZSwgTWVzc2FnaW5nU2VydmljZSB9IGZyb20gJy4uL2ZpcmViYXNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlLCBJMThuTGFuZyB9IGZyb20gJy4uL2kxOG4nO1xuaW1wb3J0IHsgRmlyZXN0b3JlLCBkb2MsIG9uU25hcHNob3QgfSBmcm9tICdAYW5ndWxhci9maXJlL2ZpcmVzdG9yZSc7XG5pbXBvcnQgeyBDb25maXJtYXRpb25EaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vY29uZmlybWF0aW9uLWRpYWxvZy9jb25maXJtYXRpb24tZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgaW50ZXJwcmV0RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG4vKipcbiAqIFNlcnZpY2lvIHByaW5jaXBhbCBkZSBhdXRlbnRpY2FjacOzbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICd2YWx0ZWNoLWNvbXBvbmVudHMnO1xuICpcbiAqIEBDb21wb25lbnQoey4uLn0pXG4gKiBleHBvcnQgY2xhc3MgTG9naW5Db21wb25lbnQge1xuICogICBwcml2YXRlIGF1dGggPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xuICpcbiAqICAgYXN5bmMgbG9naW4oKSB7XG4gKiAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5hdXRoLnNpZ25pbih7IGVtYWlsLCBwYXNzd29yZCB9KSk7XG4gKiAgICAgaWYgKHRoaXMuYXV0aC5tZmFQZW5kaW5nKCkucmVxdWlyZWQpIHtcbiAqICAgICAgIC8vIE1vc3RyYXIgVUkgZGUgTUZBXG4gKiAgICAgfSBlbHNlIHtcbiAqICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLyddKTtcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEF1dGhTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgLy8gVGltZXIgcGFyYSByZWZyZXNoIHByb2FjdGl2b1xuICBwcml2YXRlIHJlZnJlc2hUaW1lcklkOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN5bmNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGZpcmVzdG9yZVJCQUNVbnN1YnNjcmliZTogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gU2luZ2xlLWZsaWdodCByZWZyZXNoOiB1biBzb2xvIFBPU1QgL3JlZnJlc2ggZW4gdnVlbG8gYSBsYSB2ZXouIFRvZG9zIGxvc1xuICAvLyBjYWxsZXJzIChib290c3RyYXAsIHJlZXN0YWJsZWNlciBGaXJlYmFzZSwgaW50ZXJjZXB0b3IgNDAxLCB0aW1lciBwcm9hY3Rpdm8pXG4gIC8vIGNvbXBhcnRlbiBlbCBNSVNNTyBvYnNlcnZhYmxlLiBTaW4gZXN0bywgcmVmcmVzaGVzIGNvbmN1cnJlbnRlcyBjaG9jYW4gY29udHJhXG4gIC8vIGxhIHJvdGFjacOzbiBkZSByZWZyZXNoIHRva2VuIGRlbCBiYWNrZW5kOiBlbCBwcmltZXJvIHJvdGEgZWwgdG9rZW4geSBlbFxuICAvLyBzZWd1bmRvIGxsZWdhIGNvbiBlbCB0b2tlbiB5YSBpbnZhbGlkYWRvIOKGkiA0MDEg4oaSIGxvZ291dCBlc3B1cmlvIChlbCB1c3VhcmlvXG4gIC8vIGNhZSBhIGxhIGxhbmRpbmcgYWwgYWN0dWFsaXphcikuIFZlciBwcm9qZWN0X3B3YS1sb2dpbi1mcmVlemUuXG4gIHByaXZhdGUgaW5GbGlnaHRSZWZyZXNoJDogT2JzZXJ2YWJsZTxSZWZyZXNoUmVzcG9uc2U+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChWQUxURUNIX0FVVEhfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogVmFsdGVjaEF1dGhDb25maWcgfCBudWxsLFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgc3RhdGVTZXJ2aWNlOiBBdXRoU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9rZW5TZXJ2aWNlOiBUb2tlblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogQXV0aFN0b3JhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3luY1NlcnZpY2U6IEF1dGhTeW5jU2VydmljZSxcbiAgICBwcml2YXRlIGZpcmViYXNlU2VydmljZTogRmlyZWJhc2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgb2F1dGhTZXJ2aWNlOiBPQXV0aFNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBtZXNzYWdpbmdTZXJ2aWNlOiBNZXNzYWdpbmdTZXJ2aWNlIHwgbnVsbCxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSB8IG51bGwsXG4gICAgcHJpdmF0ZSBjb25maXJtYXRpb25TZXJ2aWNlOiBDb25maXJtYXRpb25EaWFsb2dTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZmlyZXN0b3JlSW5zdGFuY2U6IEZpcmVzdG9yZSB8IG51bGxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZyAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnW3ZhbHRlY2gtY29tcG9uZW50c10gQXV0aFNlcnZpY2U6IHByb3ZpZGVWYWx0ZWNoQXV0aCgpIG5vIGVzdMOhIGVuIG1haW4udHMuICcgK1xuICAgICAgICAgICdMb2dpbiwgcmVnaXN0cm8geSBzZXNpw7NuIG5vIGZ1bmNpb25hcsOhbi4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFU1RBRE8gUMOaQkxJQ08gKFNpZ25hbHMgcmVhZG9ubHkpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBFc3RhZG8gY29tcGxldG8gZGUgYXV0ZW50aWNhY2nDs24gKi9cbiAgcmVhZG9ubHkgc3RhdGUgPSB0aGlzLnN0YXRlU2VydmljZS5zdGF0ZTtcblxuICAvKiogVXN1YXJpbyBlc3TDoSBhdXRlbnRpY2FkbyAqL1xuICByZWFkb25seSBpc0F1dGhlbnRpY2F0ZWQgPSB0aGlzLnN0YXRlU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQ7XG5cbiAgLyoqIEVzdGFkbyBkZSBjYXJnYSAqL1xuICByZWFkb25seSBpc0xvYWRpbmcgPSB0aGlzLnN0YXRlU2VydmljZS5pc0xvYWRpbmc7XG5cbiAgLyoqIEluZm9ybWFjacOzbiBkZWwgdXN1YXJpbyAqL1xuICByZWFkb25seSB1c2VyID0gdGhpcy5zdGF0ZVNlcnZpY2UudXNlcjtcblxuICAvKiogQ2FtYmlvcyBkZSBvcmdhbml6YWNpw7NuIGFjdGl2YSBkZXRlY3RhZG9zIGRlc2RlIHRva2VuIHJlZnJlc2gsIHN3aXRjaC1vcmcgbyBzeW5jIGVudHJlIHBlc3Rhw7Fhcy4gKi9cbiAgcmVhZG9ubHkgYWN0aXZlT3JnQ2hhbmdlZCQgPSB0aGlzLnN0YXRlU2VydmljZS5hY3RpdmVPcmdDaGFuZ2VkJDtcblxuICAvKiogVG9rZW4gZGUgYWNjZXNvICovXG4gIHJlYWRvbmx5IGFjY2Vzc1Rva2VuID0gdGhpcy5zdGF0ZVNlcnZpY2UuYWNjZXNzVG9rZW47XG5cbiAgLyoqIFJvbGVzIGRlbCB1c3VhcmlvICovXG4gIHJlYWRvbmx5IHJvbGVzID0gdGhpcy5zdGF0ZVNlcnZpY2Uucm9sZXM7XG5cbiAgLyoqIFBlcm1pc29zIGRlbCB1c3VhcmlvICovXG4gIHJlYWRvbmx5IHBlcm1pc3Npb25zID0gdGhpcy5zdGF0ZVNlcnZpY2UucGVybWlzc2lvbnM7XG5cbiAgLyoqIFVzdWFyaW8gZXMgc3VwZXIgYWRtaW4gKi9cbiAgcmVhZG9ubHkgaXNTdXBlckFkbWluID0gdGhpcy5zdGF0ZVNlcnZpY2UuaXNTdXBlckFkbWluO1xuXG4gIC8qKiBFc3RhZG8gZGUgTUZBIHBlbmRpZW50ZSAqL1xuICByZWFkb25seSBtZmFQZW5kaW5nID0gdGhpcy5zdGF0ZVNlcnZpY2UubWZhUGVuZGluZztcblxuICAvKiogRXJyb3IgYWN0dWFsICovXG4gIHJlYWRvbmx5IGVycm9yID0gdGhpcy5zdGF0ZVNlcnZpY2UuZXJyb3I7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElOSUNJQUxJWkFDScOTTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pY2lhbGl6YSBlbCBzZXJ2aWNpbyBkZSBhdXRlbnRpY2FjacOzbi5cbiAgICogTGxhbWFkbyBhdXRvbcOhdGljYW1lbnRlIHBvciBwcm92aWRlVmFsdGVjaEF1dGguXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIDEuIENhcmdhciBlc3RhZG8gZGVzZGUgc3RvcmFnZVxuICAgIGNvbnN0IHN0b3JlZFN0YXRlID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkU3RhdGUoKTtcblxuICAgIGlmIChzdG9yZWRTdGF0ZS5hY2Nlc3NUb2tlbikge1xuICAgICAgLy8gMi4gVmVyaWZpY2FyIHNpIHRva2VuIGVzIHbDoWxpZG9cbiAgICAgIGlmICh0aGlzLnRva2VuU2VydmljZS5pc1Rva2VuVmFsaWQoc3RvcmVkU3RhdGUuYWNjZXNzVG9rZW4pKSB7XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnJlc3RvcmVGcm9tU3RvcmFnZShzdG9yZWRTdGF0ZSk7XG5cbiAgICAgICAgLy8gRXh0cmFlciBpbmZvIGRlbCB0b2tlblxuICAgICAgICBjb25zdCBjbGFpbXMgPSB0aGlzLnRva2VuU2VydmljZS5wYXJzZVRva2VuKHN0b3JlZFN0YXRlLmFjY2Vzc1Rva2VuKTtcbiAgICAgICAgY29uc3QgdGFiQWN0aXZlT3JnID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRBY3RpdmVPcmcoKTtcbiAgICAgICAgaWYgKGNsYWltcykge1xuICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVVzZXJJbmZvKGNsYWltcy51aWQsIGNsYWltcy5lbWFpbCk7XG4gICAgICAgICAgY29uc3QgYWN0aXZlT3JnID0gdGFiQWN0aXZlT3JnIHx8IGNsYWltcy5vcmc7XG4gICAgICAgICAgaWYgKGFjdGl2ZU9yZykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWN0aXZlT3JnKGFjdGl2ZU9yZyk7XG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVBY3RpdmVPcmcoYWN0aXZlT3JnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gU3luYyBpc1N1cGVyQWRtaW4gZnJvbSBKV1QgaW4gY2FzZSBJc1BsYXRmb3JtQWRtaW4gY2hhbmdlZCBzaW5jZSBsYXN0IGxvZ2luXG4gICAgICAgICAgY29uc3Qgand0QWRtaW4gPSBjbGFpbXMuYWRtaW4gPT09IHRydWU7XG4gICAgICAgICAgaWYgKGp3dEFkbWluICE9PSAoc3RvcmVkU3RhdGUuaXNTdXBlckFkbWluID8/IGZhbHNlKSkge1xuICAgICAgICAgICAgY29uc3Qgcm9sZXMgPSBzdG9yZWRTdGF0ZS5yb2xlcyA/PyBbXTtcbiAgICAgICAgICAgIGNvbnN0IHBlcm1zID0gc3RvcmVkU3RhdGUucGVybWlzc2lvbnMgPz8gW107XG4gICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVQZXJtaXNzaW9ucyhyb2xlcywgcGVybXMsIGp3dEFkbWluKTtcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVBlcm1pc3Npb25zKHtcbiAgICAgICAgICAgICAgb3BlcmF0aW9uSWQ6ICcnLFxuICAgICAgICAgICAgICByb2xlcyxcbiAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IHBlcm1zLFxuICAgICAgICAgICAgICBpc1N1cGVyQWRtaW46IGp3dEFkbWluLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRWwgYWNjZXNzIHRva2VuIGVzdMOhIGVuIGxvY2FsU3RvcmFnZSB5IHB1ZWRlIGhhYmVyIHNpZG8gZXNjcml0byBwb3JcbiAgICAgICAgLy8gb3RyYSBwZXN0YcOxYSBlbiBvdHJhIG9yZ2FuaXphY2nDs24uIFNpIGVzdGEgcGVzdGHDsWEgcmVjdWVyZGEgdW5hIG9yZ1xuICAgICAgICAvLyBkaXN0aW50YSBlbiBzZXNzaW9uU3RvcmFnZSwgcmVmcmVzY2Ftb3MgZGUgZm9ybWEgYmxvcXVlYW50ZSBhbnRlcyBkZVxuICAgICAgICAvLyBkZWphciBxdWUgbGFzIHJ1dGFzIG9yZy1zY29wZWQgcGlkYW4gZGF0b3MgY29uIHVuIEpXVCBlcXVpdm9jYWRvLlxuICAgICAgICBpZiAodGFiQWN0aXZlT3JnICYmIGNsYWltcz8ub3JnICYmIGNsYWltcy5vcmcgIT09IHRhYkFjdGl2ZU9yZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFtWYWx0ZWNoQXV0aF0gYm9vdHN0cmFwIOKAlCBzdG9yZWQgSldUIG9yZyAke2NsYWltcy5vcmd9IGRpZmZlcnMgZnJvbSB0YWIgb3JnICR7dGFiQWN0aXZlT3JnfTsgcmVmcmVzaGluZyBiZWZvcmUgcm91dGUgZGF0YWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMucmVmcmVzaEFjY2Vzc1Rva2VuKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gSW5pY2lhciB0aW1lciBkZSByZWZyZXNjbyBwcm9hY3Rpdm9cbiAgICAgICAgdGhpcy5zdGFydFJlZnJlc2hUaW1lcigpO1xuXG4gICAgICAgIC8vIDQuIFJlLWVzdGFibGVjZXIgbGEgc2VzacOzbiBkZSBGaXJlYmFzZSBlbiBib290c3RyYXAuXG4gICAgICAgIC8vIEVsIGFjY2VzcyB0b2tlbiBzaWd1ZSB2w6FsaWRvLCBhc8OtIHF1ZSBOTyBwYXNhbW9zIHBvciBsYSByYW1hIGRlXG4gICAgICAgIC8vIHJlZnJlc2gg4oCUIHBlcm8gbGEgcGVyc2lzdGVuY2lhIEluZGV4ZWREQiBwcm9waWEgZGUgRmlyZWJhc2UgQXV0aCBub1xuICAgICAgICAvLyBzb2JyZXZpdmUgZWwgY29udGVuZWRvciBkZSBzdG9yYWdlIGRlIHVuYSBQV0Egc3RhbmRhbG9uZSBlbiBpT1MuXG4gICAgICAgIC8vIFNpbiBlc3RvLCBgZmlyZWJhc2VBdXRoUmVhZHlgIHNlIHF1ZWRhIGVuIGBmYWxzZWAgcGFyYSBzaWVtcHJlIHlcbiAgICAgICAgLy8gY3VhbHF1aWVyIGxpc3RlbmVyIEZpcmVzdG9yZSAoZWouIGVsIGluYm94IGRlIG5vdGlmaWNhY2lvbmVzKSBjdWVsZ2EuXG4gICAgICAgIC8vIEZpcmUtYW5kLWZvcmdldDogTk8gZGViZSBkZW1vcmFyIGVsIHJlc29sdmUgZGUgaW5pdGlhbGl6ZSgpLlxuICAgICAgICB2b2lkIHRoaXMuZW5zdXJlRmlyZWJhc2VTZXNzaW9uT25Cb290c3RyYXAoKTtcblxuICAgICAgICAvLyA1LiBMaXN0ZW5lciBSQkFDIEZpcmVzdG9yZSDigJQgcmUtZXN0YWJsZWNlciB0cmFzIHJlbG9hZCBkZSBww6FnaW5hLlxuICAgICAgICAvLyBoYW5kbGVTdWNjZXNzZnVsQXV0aCBsbyBjb25maWd1cmEgZW4gZWwgbG9naW4gaW5pY2lhbCwgcGVybyBubyBzb2JyZXZpdmVcbiAgICAgICAgLy8gcmVjYXJnYXM6IGluaXRpYWxpemUoKSByZXN0YXVyYSBlbCBzdGF0ZSBkZXNkZSBzdG9yYWdlIHBlcm8gbm8gZWwgbGlzdGVuZXIuXG4gICAgICAgIC8vIHNldHVwRmlyZXN0b3JlUkJBQ1N5bmMgZXNwZXJhIGludGVybmFtZW50ZSBhIHF1ZSBGaXJlYmFzZSBBdXRoIGVzdMOpIGxpc3RhLlxuICAgICAgICBpZiAoY2xhaW1zPy51aWQpIHtcbiAgICAgICAgICB0aGlzLnNldHVwRmlyZXN0b3JlUkJBQ1N5bmMoY2xhaW1zLnVpZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RvcmVkU3RhdGUuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgLy8gNC4gVG9rZW4gZGUgYWNjZXNvIGV4cGlyYWRvLiBDb29raWUtb25seSAoSC0wNSk6IGVsIHJlZnJlc2ggeWEgTk8gZXN0w6FcbiAgICAgICAgLy8gZW4gc3RvcmFnZSwgYXPDrSBxdWUgZWwgZGlzcGFyYWRvciBlcyBcImhhYsOtYSB1biBhY2Nlc3MgdG9rZW5cIiAoc2VzacOzblxuICAgICAgICAvLyBwcmV2aWEpOyBlbCAvcmVmcmVzaCBkZSBmb25kbyB1c2EgbGEgY29va2llIEh0dHBPbmx5LlxuICAgICAgICAvL1xuICAgICAgICAvLyBOTyBibG9xdWVhbW9zIGVsIGJvb3RzdHJhcCBlc3BlcmFuZG8gbGEgcmVkOiB1biAvcmVmcmVzaCBlbiB1bmFcbiAgICAgICAgLy8gTGFtYmRhIGZyw61hIHNvbiAyLTVzIGRlIHBhbnRhbGxhIGVuIGJsYW5jbyAoQW5ndWxhciBubyByZW5kZXJpemFcbiAgICAgICAgLy8gbmFkYSBoYXN0YSBxdWUgZWwgQVBQX0lOSVRJQUxJWkVSIHJlc3VlbHZlKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gUmVzdGF1cmFjacOzbiBvcHRpbWlzdGE6IGVsIGFjY2VzcyB0b2tlbiBleHBpcsOzIHBlcm8gc3VzIGNsYWltc1xuICAgICAgICAvLyAodWlkL2VtYWlsL3JvbGVzKSBzaWd1ZW4gZGVjb2RpZmljYWJsZXMg4oCUIGBwYXJzZVRva2VuYCBOTyB2YWxpZGFcbiAgICAgICAgLy8gYGV4cGAuIFJlc3RhdXJhbW9zIGxhIHNlc2nDs24gZGVzZGUgZXNvcyBjbGFpbXMgcGFyYSBxdWUgbGEgYXBwXG4gICAgICAgIC8vIHJlbmRlcmljZSBlbCBzaGVsbCBhdXRlbnRpY2FkbyBkZSBpbm1lZGlhdG8sIHkgZGlzcGFyYW1vcyBlbFxuICAgICAgICAvLyAvcmVmcmVzaCBlbiBzZWd1bmRvIHBsYW5vIChmaXJlLWFuZC1mb3JnZXQpLlxuICAgICAgICAvL1xuICAgICAgICAvLyBTZWd1cmlkYWQgZGUgbGEgdmVudGFuYSBzdWItc2VndW5kbyBhbnRlcyBkZSBxdWUgZWwgcmVmcmVzaCBsbGVndWU6XG4gICAgICAgIC8vIGN1YWxxdWllciBBUEkgY2FsbCBzYWxlIGNvbiBlbCB0b2tlbiBleHBpcmFkbyDihpIgNDAxIOKGkiBlbFxuICAgICAgICAvLyBhdXRoSW50ZXJjZXB0b3IgcmVmcmVzY2EgKyByZWludGVudGEgYXV0b23DoXRpY2FtZW50ZS4gU2kgZWwgcmVmcmVzaFxuICAgICAgICAvLyBkZSBmb25kbyBmYWxsYSDihpIgc2lnbk91dCArIGNsZWFyU3RhdGUuXG4gICAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIGJvb3RzdHJhcCDigJQgYWNjZXNzIHRva2VuIGV4cGlyZWQsIHJlZnJlc2hpbmcgaW4gYmFja2dyb3VuZCcpO1xuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5yZXN0b3JlRnJvbVN0b3JhZ2Uoc3RvcmVkU3RhdGUpO1xuXG4gICAgICAgIGNvbnN0IGV4cGlyZWRDbGFpbXMgPSB0aGlzLnRva2VuU2VydmljZS5wYXJzZVRva2VuKHN0b3JlZFN0YXRlLmFjY2Vzc1Rva2VuKTtcbiAgICAgICAgY29uc3QgdGFiQWN0aXZlT3JnID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRBY3RpdmVPcmcoKTtcbiAgICAgICAgaWYgKGV4cGlyZWRDbGFpbXMpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVVc2VySW5mbyhleHBpcmVkQ2xhaW1zLnVpZCwgZXhwaXJlZENsYWltcy5lbWFpbCk7XG4gICAgICAgICAgY29uc3QgYWN0aXZlT3JnID0gdGFiQWN0aXZlT3JnIHx8IGV4cGlyZWRDbGFpbXMub3JnO1xuICAgICAgICAgIGlmIChhY3RpdmVPcmcpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZUFjdGl2ZU9yZyhhY3RpdmVPcmcpO1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlQWN0aXZlT3JnKGFjdGl2ZU9yZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChleHBpcmVkQ2xhaW1zLnVpZCkge1xuICAgICAgICAgICAgdGhpcy5zZXR1cEZpcmVzdG9yZVJCQUNTeW5jKGV4cGlyZWRDbGFpbXMudWlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWZyZXNoIGVuIHNlZ3VuZG8gcGxhbm8g4oCUIE5PIHNlIGhhY2UgYXdhaXQ6IGluaXRpYWxpemUoKSByZXN1ZWx2ZSB5YS5cbiAgICAgICAgZmlyc3RWYWx1ZUZyb20odGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBib290c3RyYXAg4oCUIGJhY2tncm91bmQgcmVmcmVzaCBmYWlsZWQsIHNpZ25pbmcgb3V0Jyk7XG4gICAgICAgICAgdGhpcy5zaWduT3V0RmlyZWJhc2UoKTtcbiAgICAgICAgICB0aGlzLmNsZWFyU3RhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNpZ25PdXRGaXJlYmFzZSgpO1xuICAgICAgICB0aGlzLmNsZWFyU3RhdGUoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5jb25maWc/LmJvb3RzdHJhcFNlc3Npb25Gcm9tSGludCAmJlxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5oYXNMb2dnZWRJbkhpbnQodGhpcy5jb25maWc/LmxvZ2dlZEluSGludENvb2tpZSlcbiAgICApIHtcbiAgICAgIC8vIE5vIGhheSB0b2tlbiBsb2NhbCBlbiBlc3RlIG9yaWdpbiwgcGVybyBsYSBjb29raWUtaGludCBpbmRpY2Egc2VzacOzblxuICAgICAgLy8gYWN0aXZhIGVuIGxhIGZhbWlsaWEgKGxvZ3VlYWRvIGVuIG90cmEgYXBwIGRlbCBmYWN0b3J5KS4gQm9vdHN0cmFwZWFtb3NcbiAgICAgIC8vIGxhIHNlc2nDs24gY3Jvc3Mtb3JpZ2luIHbDrWEgL3JlZnJlc2gg4oCUIGJsb3F1ZWFudGUgcGFyYSBxdWUgbG9zIGd1YXJkcyBsYVxuICAgICAgLy8gdmVhbi4gVmVyIFZhbHRlY2hBdXRoQ29uZmlnLmJvb3RzdHJhcFNlc3Npb25Gcm9tSGludC5cbiAgICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwU2Vzc2lvbkZyb21IaW50Q29va2llKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNob3VsZEJvb3RzdHJhcFZpYVNTT0JyaWRnZSgpKSB7XG4gICAgICAvLyBBRFItMDUwIE1vZG8gQjogZXN0YSBhcHAgbm8gY29tcGFydGUgZG9taW5pbyByYcOteiBjb24gZWwgcmVzdG8gZGVsXG4gICAgICAvLyBmYWN0b3J5IChib290c3RyYXBTZXNzaW9uRnJvbUhpbnQgbm8gYXBsaWNhIOKAlCBsYSBjb29raWUtaGludCBudW5jYVxuICAgICAgLy8gbGxlZ2EgYXF1w60pLiBOYXZlZ2FjacOzbiBkZSBww6FnaW5hIGNvbXBsZXRhIGFsIEF1dGggUHJveHkgQ2VudHJhbDtcbiAgICAgIC8vIHZ1ZWx2ZSBjb24gYD9oYW5kb2ZmPWAgc2kgaGF5IHNlc2nDs24gYWN0aXZhLiBWZXJcbiAgICAgIC8vIFZhbHRlY2hBdXRoQ29uZmlnLmJvb3RzdHJhcFNlc3Npb25Gcm9tQnJpZGdlLlxuICAgICAgdGhpcy5yZWRpcmVjdFRvU1NPQnJpZGdlKCk7XG4gICAgICAvLyBObyBzZWd1aW1vcyBlbCByZXN0byBkZSBpbml0aWFsaXplKCkg4oCUIGxhIHDDoWdpbmEgZXN0w6EgcG9yIG5hdmVnYXJcbiAgICAgIC8vIGZ1ZXJhLiBEZWphbW9zIGxvYWRpbmc9dHJ1ZSBhIHByb3DDs3NpdG86IGVsIHVubG9hZCBlcyBpbm1pbmVudGUuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gNS4gSW5pY2lhciBzaW5jcm9uaXphY2nDs24gZW50cmUgcGVzdGHDsWFzXG4gICAgaWYgKHRoaXMuY29uZmlnPy5lbmFibGVUYWJTeW5jKSB7XG4gICAgICB0aGlzLnN5bmNTZXJ2aWNlLnN0YXJ0KCk7XG4gICAgICB0aGlzLnN5bmNTdWJzY3JpcHRpb24gPSB0aGlzLnN5bmNTZXJ2aWNlLm9uRXZlbnQkLnN1YnNjcmliZShldmVudCA9PlxuICAgICAgICB0aGlzLmhhbmRsZVN5bmNFdmVudChldmVudClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0TG9hZGluZyhmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogwr9IYXkgc2VzacOzbiBhY3RpdmEgZW4gbGEgZmFtaWxpYSBzZWfDum4gbGEgY29va2llLWhpbnQgSlMtcmVhZGFibGU/XG4gICAqXG4gICAqIEVzcGVqbyBsZWdpYmxlIGRlIGxhIGNvb2tpZSBIdHRwT25seSBgdmFsdGVjaF9yZWZyZXNoYCAocXVlIEpTIG5vIHB1ZWRlIGxlZXIpLlxuICAgKiDDmnRpbCBwYXJhIHF1ZSB1biBzaXRpbyBww7pibGljbyBkZWNpZGEgbGFuZGluZy12cy1hcHAgZGUgZm9ybWEgc8OtbmNyb25hLCBzaW5cbiAgICogZXNwZXJhciBlbCBgL3JlZnJlc2hgLiBOTyBlcyBwcnVlYmEgZGUgc2VzacOzbiB2w6FsaWRhIChsYSBoaW50IHB1ZWRlIHF1ZWRhclxuICAgKiBzdGFsZSkg4oCUIHBhcmEgdW5hIHNlc2nDs24gcmVhbCB1c2FyIGBpc0F1dGhlbnRpY2F0ZWQoKWAgKyBgYm9vdHN0cmFwU2Vzc2lvbkZyb21IaW50YC5cbiAgICovXG4gIGhhc0xvZ2dlZEluSGludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlU2VydmljZS5oYXNMb2dnZWRJbkhpbnQodGhpcy5jb25maWc/LmxvZ2dlZEluSGludENvb2tpZSk7XG4gIH1cblxuICAvKipcbiAgICogQm9vdHN0cmFwIGNyb3NzLW9yaWdpbiBkZSBsYSBzZXNpw7NuIGRlc2RlIGxhIGNvb2tpZS1oaW50IGRlIGZhbWlsaWEuXG4gICAqXG4gICAqIFNlIGludm9jYSBkZXNkZSBgaW5pdGlhbGl6ZSgpYCBjdWFuZG8gbm8gaGF5IHRva2VuIGxvY2FsIHBlcm8gbGEgYXBwIG9wdMOzIHBvclxuICAgKiBgYm9vdHN0cmFwU2Vzc2lvbkZyb21IaW50YCB5IGxhIGhpbnQgZXN0w6EgcHJlc2VudGUuIEVsIGAvcmVmcmVzaGAgdXNhIGVsXG4gICAqIHJlZnJlc2ggdG9rZW4gSHR0cE9ubHkgKGBTYW1lU2l0ZT1Ob25lYCkgdsOhbGlkbyBjcm9zcy1vcmlnaW4uIGByZWZyZXNoQWNjZXNzVG9rZW5gXG4gICAqIHBlcnNpc3RlIGVsIHRva2VuICsgRmlyZWJhc2UgKyB0aW1lciwgcGVybyBOTyBtYXJjYSBgaXNBdXRoZW50aWNhdGVkYCBuaVxuICAgKiByZXN0YXVyYSBjbGFpbXMvcm9sZXMg4oaSIHNlIGNvbXBsZXRhIGxhIHNlc2nDs24gYWPDoS4gRmFsbGEgbGltcGlvIChoaW50IHN0YWxlIG9cbiAgICogZGV2IGNyb3NzLXNpdGUgY29uIGNvb2tpZSBkZSB0ZXJjZXJvcyBibG9xdWVhZGEpIOKGkiBpbnZpdGFkby5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYm9vdHN0cmFwU2Vzc2lvbkZyb21IaW50Q29va2llKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIGJvb3RzdHJhcCDigJQgbm8gbG9jYWwgdG9rZW4gYnV0IGZhbWlseSBoaW50IHByZXNlbnQsIHJlZnJlc2hpbmcnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMucmVmcmVzaEFjY2Vzc1Rva2VuKCkpO1xuICAgICAgY29uc3QgY2xhaW1zID0gdGhpcy50b2tlblNlcnZpY2UucGFyc2VUb2tlbihyZXNwLmFjY2Vzc1Rva2VuKTtcbiAgICAgIGNvbnN0IGV4cGlyZXNBdCA9IERhdGUubm93KCkgKyByZXNwLmV4cGlyZXNJbiAqIDEwMDA7XG4gICAgICBjb25zdCBpc1N1cGVyQWRtaW4gPSAocmVzcC5wZXJtaXNzaW9ucz8uaW5jbHVkZXMoJyo6KicpIHx8IGNsYWltcz8uYWRtaW4gPT09IHRydWUpID8/IGZhbHNlO1xuICAgICAgY29uc3QgaXNQcmVtaXVtID0gY2xhaW1zPy5wcmVtaXVtID09PSB0cnVlO1xuXG4gICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRBdXRoZW50aWNhdGVkKHtcbiAgICAgICAgYWNjZXNzVG9rZW46IHJlc3AuYWNjZXNzVG9rZW4sXG4gICAgICAgIHJlZnJlc2hUb2tlbjogcmVzcC5yZWZyZXNoVG9rZW4sXG4gICAgICAgIHVzZXJJZDogY2xhaW1zPy51aWQsXG4gICAgICAgIGVtYWlsOiBjbGFpbXM/LmVtYWlsLFxuICAgICAgICByb2xlczogcmVzcC5yb2xlcyA/PyBbXSxcbiAgICAgICAgcGVybWlzc2lvbnM6IHJlc3AucGVybWlzc2lvbnMgPz8gW10sXG4gICAgICAgIGlzU3VwZXJBZG1pbixcbiAgICAgICAgaXNQcmVtaXVtLFxuICAgICAgICBleHBpcmVzQXQsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVN0YXRlKHtcbiAgICAgICAgYWNjZXNzVG9rZW46IHJlc3AuYWNjZXNzVG9rZW4sXG4gICAgICAgIHJlZnJlc2hUb2tlbjogcmVzcC5yZWZyZXNoVG9rZW4sXG4gICAgICAgIHJvbGVzOiByZXNwLnJvbGVzID8/IFtdLFxuICAgICAgICBwZXJtaXNzaW9uczogcmVzcC5wZXJtaXNzaW9ucyA/PyBbXSxcbiAgICAgICAgaXNTdXBlckFkbWluLFxuICAgICAgICBpc1ByZW1pdW0sXG4gICAgICAgIGV4cGlyZXNBdCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoY2xhaW1zPy5vcmcpIHtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWN0aXZlT3JnKGNsYWltcy5vcmcpO1xuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVBY3RpdmVPcmcoY2xhaW1zLm9yZyk7XG4gICAgICB9XG4gICAgICBpZiAoY2xhaW1zPy51aWQpIHtcbiAgICAgICAgdGhpcy5zZXR1cEZpcmVzdG9yZVJCQUNTeW5jKGNsYWltcy51aWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIGJvb3RzdHJhcCDigJQgZmFtaWx5IGhpbnQgcmVmcmVzaCBmYWlsZWQsIGNvbnRpbnVpbmcgYXMgZ3Vlc3QnKTtcbiAgICAgIHRoaXMuY2xlYXJTdGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb21icmUgZGUgbGEgc2Vzc2lvblN0b3JhZ2Uga2V5IHVzYWRhIGNvbW8gZ3VhcmRhIGFudGktbG9vcCBkZWwgYnJpZGdlLlxuICAgKiBgc2Vzc2lvblN0b3JhZ2VgIChubyBsb2NhbFN0b3JhZ2UpIOKAlCBlbCBndWFyZCBkZWJlIGV4cGlyYXIgbmF0dXJhbG1lbnRlIGFsXG4gICAqIGNlcnJhciBsYSBwZXN0YcOxYTsgdW5hIHNlc2nDs24gZGUgZmFtaWxpYSByZWNpw6luIGluaWNpYWRhIGVuIG90cmEgcGVzdGHDsWFcbiAgICogZGViZSBwb2RlciByZWludGVudGFyIGVsIGJyaWRnZSBlbiB1bmEgcGVzdGHDsWEgbnVldmEuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTU09fQlJJREdFX0dVQVJEX0tFWSA9ICd2YWx0ZWNoX3Nzb19icmlkZ2VfYXR0ZW1wdGVkJztcblxuICAvKipcbiAgICogwr9Db3JyZXNwb25kZSBkaXNwYXJhciBlbCByZWRpcmVjdCBhbCBBdXRoIFByb3h5IENlbnRyYWwgKEFEUi0wNTAgTW9kbyBCKT9cbiAgICpcbiAgICogRmFsc28gc2k6IGxhIGNvbmZpZyBubyBsbyBoYWJpbGl0YSwgZmFsdGEgYHNzb0JyaWRnZVVybGAsIG5vIGNvcnJlbW9zIGVuXG4gICAqIHVuIGJyb3dzZXIgcmVhbCAoU1NSL3Rlc3RzKSwgbyBlc3RhIHBlc3Rhw7FhIFlBIHZvbHZpw7MgZGUgdW4gaW50ZW50byBkZVxuICAgKiBicmlkZ2Ug4oCUIHNpbiBlc3RlIMO6bHRpbW8gZ3VhcmQsIHVuIGJyaWRnZSBxdWUgcmVkaXJpZ2Ugc2luIGA/aGFuZG9mZmBcbiAgICogKHNpbiBzZXNpw7NuKSBkaXNwYXJhcsOtYSB1biBidWNsZSBpbmZpbml0byBkZSByZWRpcmVjdHMgZW4gY2FkYVxuICAgKiBgaW5pdGlhbGl6ZSgpYCBwb3N0ZXJpb3IgZGUgbGEgbWlzbWEgcGVzdGHDsWEuXG4gICAqL1xuICBwcml2YXRlIHNob3VsZEJvb3RzdHJhcFZpYVNTT0JyaWRnZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5ib290c3RyYXBTZXNzaW9uRnJvbUJyaWRnZSB8fCAhdGhpcy5jb25maWc/LnNzb0JyaWRnZVVybCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHNlc3Npb25TdG9yYWdlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgaWYgKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oQXV0aFNlcnZpY2UuU1NPX0JSSURHRV9HVUFSRF9LRVkpID09PSAnMScpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gc2Vzc2lvblN0b3JhZ2UgYmxvcXVlYWRvIChtb2RvIHByaXZhZG8gYWdyZXNpdm8pIOKAlCBubyBhcnJpZXNnYXIgdW5cbiAgICAgIC8vIGxvb3Agc2luIHBvZGVyIG1hcmNhciBlbCBndWFyZDsgbm9zIGFic3RlbmVtb3MgZGVsIGJyaWRnZS5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogTmF2ZWdhIGxhIHDDoWdpbmEgY29tcGxldGEgYWwgQXV0aCBQcm94eSBDZW50cmFsIGNvbiBgcmVkaXJlY3RfdXJpYCA9IGxhXG4gICAqIFVSTCBhY3R1YWwuIEVsIGJhY2tlbmQgdmFsaWRhIGxhIGNvb2tpZSBgdmFsdGVjaF9yZWZyZXNoYCAodmlzaWJsZSBzb2xvXG4gICAqIGVuIHN1IHByb3BpbyBkb21pbmlvLCBwb3IgZXNvIGVsIHJlZGlyZWN0IGRlYmUgc2VyIHRvcC1sZXZlbCBuYXZpZ2F0aW9uXG4gICAqIHkgbm8gdW4gZmV0Y2gpIHkgcmVkaXJpZ2UgZGUgdnVlbHRhIGNvbiBgP2hhbmRvZmY9VE9LRU5gIHNpIGhheSBzZXNpw7NuLlxuICAgKlxuICAgKiBNYXJjYSBlbCBndWFyZCBBTlRFUyBkZSBuYXZlZ2FyIOKAlCBzaSBlbCBicmlkZ2UgcmVkaXJpZ2Ugc2luIGA/aGFuZG9mZmBcbiAgICogKHNpbiBzZXNpw7NuKSwgZWwgc2lndWllbnRlIGBpbml0aWFsaXplKClgIGRlIGVzdGEgcGVzdGHDsWEgbm8gZGViZSB2b2x2ZXJcbiAgICogYSBpbnRlbnRhciBlbCBicmlkZ2UuXG4gICAqL1xuICBwcml2YXRlIHJlZGlyZWN0VG9TU09CcmlkZ2UoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oQXV0aFNlcnZpY2UuU1NPX0JSSURHRV9HVUFSRF9LRVksICcxJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTaSBubyBwb2RlbW9zIG1hcmNhciBlbCBndWFyZCwgbWVqb3Igbm8gbmF2ZWdhciDigJQgZXZpdGEgZWwgbG9vcC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVkaXJlY3RVcmkgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICBjb25zdCBicmlkZ2VVcmwgPSBuZXcgVVJMKHRoaXMuY29uZmlnIS5zc29CcmlkZ2VVcmwhKTtcbiAgICBicmlkZ2VVcmwuc2VhcmNoUGFyYW1zLnNldCgncmVkaXJlY3RfdXJpJywgcmVkaXJlY3RVcmkpO1xuICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIGJvb3RzdHJhcCDigJQgbm8gbG9jYWwgc2Vzc2lvbiwgcmVkaXJlY3RpbmcgdG8gU1NPIGJyaWRnZScpO1xuICAgIHRoaXMubmF2aWdhdGVUb1NTT0JyaWRnZVVybChicmlkZ2VVcmwudG9TdHJpbmcoKSk7XG4gIH1cblxuICAvKipcbiAgICogTmF2ZWdhY2nDs24gcmVhbCAoYWlzbGFkYSBlbiBzdSBwcm9waW8gbcOpdG9kbyBwYXJhIHBvZGVyIGVzcGlhcmxhIGVuXG4gICAqIHRlc3RzIHVuaXRhcmlvcyBzaW4gcXVlIEthcm1hIG5hdmVndWUgZGUgdmVyZGFkIGVsIHJ1bm5lcikuXG4gICAqL1xuICBwcml2YXRlIG5hdmlnYXRlVG9TU09CcmlkZ2VVcmwodXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFJlZnJlc2hUaW1lcigpO1xuICAgIHRoaXMuc3luY1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnRlYXJkb3duRmlyZXN0b3JlUkJBQ1N5bmMoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBVVRFTlRJQ0FDScOTTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pY2lhIHNlc2nDs24gY29uIGVtYWlsIHkgY29udHJhc2XDsWEuXG4gICAqIERldGVjdGEgYXV0b23DoXRpY2FtZW50ZSBsYSBwbGF0YWZvcm1hIHBhcmEgaWRlbnRpZmljYXIgZGlzcG9zaXRpdm9zIG51ZXZvcy5cbiAgICovXG4gIHNpZ25pbihyZXF1ZXN0OiBTaWduaW5SZXF1ZXN0KTogT2JzZXJ2YWJsZTxTaWduaW5SZXNwb25zZT4ge1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyRXJyb3IoKTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5jbGVhck1GQVBlbmRpbmcoKTtcblxuICAgIC8vIEFncmVnYXIgaW5mbyBkZSBwbGF0YWZvcm1hIHBhcmEgZGV2aWNlIGRldGVjdGlvblxuICAgIGNvbnN0IHBsYXRmb3JtSW5mbyA9IHRoaXMuZGV0ZWN0UGxhdGZvcm1JbmZvKCk7XG4gICAgY29uc3QgZW5yaWNoZWRSZXF1ZXN0OiBTaWduaW5SZXF1ZXN0ID0ge1xuICAgICAgLi4ucmVxdWVzdCxcbiAgICAgIGFwcElkOiByZXF1ZXN0LmFwcElkID8/IHRoaXMuY29uZmlnPy5hcHBJZCxcbiAgICAgIHBsYXRmb3JtOiByZXF1ZXN0LnBsYXRmb3JtID8/IHBsYXRmb3JtSW5mby5wbGF0Zm9ybSxcbiAgICAgIGJyb3dzZXI6IHJlcXVlc3QuYnJvd3NlciA/PyBwbGF0Zm9ybUluZm8uYnJvd3NlcixcbiAgICAgIG9zOiByZXF1ZXN0Lm9zID8/IHBsYXRmb3JtSW5mby5vcyxcbiAgICB9O1xuXG4gICAgLy8gd2l0aENyZWRlbnRpYWxzOiBlbCBiYWNrZW5kIHNldGVhIGxhIGNvb2tpZSBIdHRwT25seSBkZSByZWZyZXNoICh2YWx0ZWNoX3JlZnJlc2gpXG4gICAgLy8gZW4gbGEgcmVzcHVlc3RhLiBFbCBicm93c2VyIHNvbG8gYWxtYWNlbmEgZXNlIFNldC1Db29raWUgY3Jvc3Mtb3JpZ2luIHNpIGxhXG4gICAgLy8gcmVxdWVzdCBzZSBoaXpvIGNvbiBjcmVkZW5jaWFsZXMuIFNpbiBlc3RvIGxhIGNvb2tpZSBubyBwZXJzaXN0ZSB5IC9yZWZyZXNoXG4gICAgLy8gZmFsbGEgc2llbXByZSAoNDAwKSDihpIgbGEgc2VzacOzbiBubyBkdXJhIChILTA1KS5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxTaWduaW5SZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9zaWduaW5gLCBlbnJpY2hlZFJlcXVlc3QsIHsgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBpZiAocmVzcG9uc2UubWZhUmVxdWlyZWQpIHtcbiAgICAgICAgICAgIC8vIE1GQSByZXF1ZXJpZG8gLSBndWFyZGFyIGVzdGFkbyB0ZW1wb3JhbFxuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0TUZBUGVuZGluZyh7XG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBtZmFUb2tlbjogcmVzcG9uc2UubWZhVG9rZW4hLFxuICAgICAgICAgICAgICBtZXRob2Q6IHJlc3BvbnNlLm1mYU1ldGhvZCEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICAvLyBMb2dpbiBleGl0b3NvIHNpbiBNRkFcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU3VjY2Vzc2Z1bEF1dGgocmVzcG9uc2UpO1xuXG4gICAgICAgICAgICAvLyBOb3RpZmljYXIgc2kgZXMgdW4gZGlzcG9zaXRpdm8gbnVldm9cbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5pc05ld0RldmljZSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBOZXcgZGV2aWNlIGRldGVjdGVkOicsIHJlc3BvbnNlLmRldmljZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICAgICk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gT0FVVEggKExvZ2luIHNvY2lhbClcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluaWNpYSBzZXNpw7NuIGNvbiBPQXV0aCAoR29vZ2xlLCBBcHBsZSwgTWljcm9zb2Z0LCBGYWNlYm9vaykuXG4gICAqIEFicmUgdW4gcG9wdXAgcGFyYSBlbCBmbHVqbyBkZSBhdXRlbnRpY2FjacOzbi5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyIC0gUHJvdmVlZG9yIE9BdXRoICgnZ29vZ2xlJywgJ2FwcGxlJywgJ21pY3Jvc29mdCcsICdmYWNlYm9vaycpXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgcXVlIGVtaXRlIFNpZ25pblJlc3BvbnNlIGN1YW5kbyBzZSBjb21wbGV0YVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHRoaXMuYXV0aC5zaWduaW5XaXRoT0F1dGgoJ2dvb2dsZScpLnN1YnNjcmliZSh7XG4gICAqICAgbmV4dDogKCkgPT4gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvJ10pLFxuICAgKiAgIGVycm9yOiAoZXJyKSA9PiBjb25zb2xlLmVycm9yKCdPQXV0aCBmYWlsZWQ6JywgZXJyKVxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBzaWduaW5XaXRoT0F1dGgocHJvdmlkZXI6IE9BdXRoUHJvdmlkZXIpOiBPYnNlcnZhYmxlPFNpZ25pblJlc3BvbnNlPiB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJFcnJvcigpO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyTUZBUGVuZGluZygpO1xuXG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLnN0YXJ0Rmxvdyhwcm92aWRlcikucGlwZShcbiAgICAgIHRhcChyZXN1bHQgPT4ge1xuICAgICAgICAvLyBNRkEgcmVxdWVyaWRvIHRyYXMgT0F1dGgg4oCUIGd1YXJkYXIgZXN0YWRvIHRlbXBvcmFsLCBOTyBhdXRlbnRpY2FyLlxuICAgICAgICAvLyBFbCBsb2dpbiBjb21wb25lbnQgcmVhY2Npb25hIGEgYG1mYVBlbmRpbmcoKWAgeSBhYnJlIGVsIG1vZGFsIHZlcmlmeS5cbiAgICAgICAgaWYgKHJlc3VsdC5tZmFSZXF1aXJlZCkge1xuICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldE1GQVBlbmRpbmcoe1xuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBtZmFUb2tlbjogcmVzdWx0Lm1mYVRva2VuISxcbiAgICAgICAgICAgIG1ldGhvZDogcmVzdWx0Lm1mYU1ldGhvZCEsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydGlyIE9BdXRoUmVzdWx0IGEgU2lnbmluUmVzcG9uc2UgY29tcGF0aWJsZVxuICAgICAgICBjb25zdCByZXNwb25zZTogU2lnbmluUmVzcG9uc2UgPSB7XG4gICAgICAgICAgb3BlcmF0aW9uSWQ6ICdvYXV0aCcsXG4gICAgICAgICAgYWNjZXNzVG9rZW46IHJlc3VsdC5hY2Nlc3NUb2tlbixcbiAgICAgICAgICByZWZyZXNoVG9rZW46IHJlc3VsdC5yZWZyZXNoVG9rZW4sXG4gICAgICAgICAgZmlyZWJhc2VUb2tlbjogcmVzdWx0LmZpcmViYXNlVG9rZW4sXG4gICAgICAgICAgZXhwaXJlc0luOiByZXN1bHQuZXhwaXJlc0luLFxuICAgICAgICAgIHJvbGVzOiByZXN1bHQucm9sZXMsXG4gICAgICAgICAgcGVybWlzc2lvbnM6IHJlc3VsdC5wZXJtaXNzaW9ucyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzZnVsQXV0aChyZXNwb25zZSk7XG4gICAgICB9KSxcbiAgICAgIG1hcChyZXN1bHQgPT5cbiAgICAgICAgcmVzdWx0Lm1mYVJlcXVpcmVkXG4gICAgICAgICAgPyAoe1xuICAgICAgICAgICAgICBvcGVyYXRpb25JZDogJ29hdXRoJyxcbiAgICAgICAgICAgICAgbWZhUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIG1mYVRva2VuOiByZXN1bHQubWZhVG9rZW4sXG4gICAgICAgICAgICAgIG1mYU1ldGhvZDogcmVzdWx0Lm1mYU1ldGhvZCxcbiAgICAgICAgICAgIH0gYXMgU2lnbmluUmVzcG9uc2UpXG4gICAgICAgICAgOiAoe1xuICAgICAgICAgICAgICBvcGVyYXRpb25JZDogJ29hdXRoJyxcbiAgICAgICAgICAgICAgYWNjZXNzVG9rZW46IHJlc3VsdC5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgICAgcmVmcmVzaFRva2VuOiByZXN1bHQucmVmcmVzaFRva2VuLFxuICAgICAgICAgICAgICBmaXJlYmFzZVRva2VuOiByZXN1bHQuZmlyZWJhc2VUb2tlbixcbiAgICAgICAgICAgICAgZXhwaXJlc0luOiByZXN1bHQuZXhwaXJlc0luLFxuICAgICAgICAgICAgICByb2xlczogcmVzdWx0LnJvbGVzLFxuICAgICAgICAgICAgICBwZXJtaXNzaW9uczogcmVzdWx0LnBlcm1pc3Npb25zLFxuICAgICAgICAgICAgfSBhcyBTaWduaW5SZXNwb25zZSlcbiAgICAgICksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgY29uc3QgYXV0aEVycm9yOiBBdXRoRXJyb3IgPSB7XG4gICAgICAgICAgY29kZTogZXJyb3IuY29kZSB8fCAnT0FVVEhfRVJST1InLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfHwgJ0Vycm9yIGRlIGF1dGVudGljYWNpw7NuIE9BdXRoJyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0RXJyb3IoYXV0aEVycm9yKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gYXV0aEVycm9yKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb250aW7DumEgdW4gbG9naW4gT0F1dGggcXVlIHZvbHZpw7MgcG9yIHJlZGlyZWN0IHByaW5jaXBhbCBjb24gTUZBIHJlcXVlcmlkby5cbiAgICogRW4gZXNlIGNhc28gYHNpZ25pbldpdGhPQXV0aCgpYCBubyBwdWVkZSBlbWl0aXIgcG9ycXVlIGxhIHDDoWdpbmEgbmF2ZWfDsyBhbFxuICAgKiBiYWNrZW5kIE9BdXRoIHkgZWwgY2FsbGJhY2sgY29ycmUgZW4gdW5hIHJ1dGEgbnVldmEgZGUgbGEgbWlzbWEgU1BBLlxuICAgKi9cbiAgc2V0T0F1dGhNRkFQZW5kaW5nKG1mYVRva2VuOiBzdHJpbmcsIG1ldGhvZDogTUZBTWV0aG9kKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJFcnJvcigpO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldE1GQVBlbmRpbmcoe1xuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBtZmFUb2tlbixcbiAgICAgIG1ldGhvZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWaW5jdWxhIHVuIHByb3ZlZWRvciBPQXV0aCBhZGljaW9uYWwgYSBsYSBjdWVudGEgYWN0dWFsLlxuICAgKiBSZXF1aWVyZSBxdWUgZWwgdXN1YXJpbyBlc3TDqSBhdXRlbnRpY2Fkby5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyIC0gUHJvdmVlZG9yIE9BdXRoIGEgdmluY3VsYXJcbiAgICovXG4gIGxpbmtPQXV0aFByb3ZpZGVyKHByb3ZpZGVyOiBPQXV0aFByb3ZpZGVyKTogT2JzZXJ2YWJsZTx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5zdGFydExpbmtGbG93KHByb3ZpZGVyKS5waXBlKFxuICAgICAgbWFwKCgpID0+ICh7IHN1Y2Nlc3M6IHRydWUgfSkpLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgIGNvbnN0IGF1dGhFcnJvcjogQXV0aEVycm9yID0ge1xuICAgICAgICAgIGNvZGU6IGVycm9yLmNvZGUgfHwgJ0xJTktfRVJST1InLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfHwgJ0Vycm9yIGFsIHZpbmN1bGFyIHByb3ZlZWRvcicsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldEVycm9yKGF1dGhFcnJvcik7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGF1dGhFcnJvcik7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBsb3MgcHJvdmVlZG9yZXMgT0F1dGggdmluY3VsYWRvcyBhbCB1c3VhcmlvLlxuICAgKi9cbiAgZ2V0TGlua2VkUHJvdmlkZXJzKCk6IE9ic2VydmFibGU8TGlua2VkUHJvdmlkZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5nZXRMaW5rZWRQcm92aWRlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN2aW5jdWxhIHVuIHByb3ZlZWRvciBPQXV0aCBkZSBsYSBjdWVudGEuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlciAtIFByb3ZlZWRvciBhIGRlc3ZpbmN1bGFyXG4gICAqL1xuICB1bmxpbmtPQXV0aFByb3ZpZGVyKHByb3ZpZGVyOiBPQXV0aFByb3ZpZGVyKTogT2JzZXJ2YWJsZTx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS51bmxpbmtQcm92aWRlcihwcm92aWRlcik7XG4gIH1cblxuICAvKipcbiAgICogRXN0YWJsZWNlIGNvbnRyYXNlw7FhIHBhcmEgdXN1YXJpb3MgcXVlIHNvbG8gdGllbmVuIE9BdXRoLlxuICAgKiBQZXJtaXRlIHF1ZSB1c3VhcmlvcyBPQXV0aC1vbmx5IHB1ZWRhbiB0YW1iacOpbiB1c2FyIGVtYWlsL3Bhc3N3b3JkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFzc3dvcmQgLSBOdWV2YSBjb250cmFzZcOxYVxuICAgKi9cbiAgc2V0UGFzc3dvcmRGb3JPQXV0aFVzZXIocGFzc3dvcmQ6IHN0cmluZyk6IE9ic2VydmFibGU8eyBzdWNjZXNzOiBib29sZWFuIH0+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aFNlcnZpY2Uuc2V0UGFzc3dvcmQocGFzc3dvcmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gdGllbmUgY29udHJhc2XDsWEgZXN0YWJsZWNpZGEuXG4gICAqIMOadGlsIHBhcmEgbW9zdHJhci9vY3VsdGFyIG9wY2lvbmVzIGRlIGNhbWJpbyBkZSBjb250cmFzZcOxYS5cbiAgICovXG4gIGNoZWNrSGFzUGFzc3dvcmQoKTogT2JzZXJ2YWJsZTxIYXNQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLmhhc1Bhc3N3b3JkKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0cmEgdW4gbnVldm8gdXN1YXJpby5cbiAgICogRWwgdXN1YXJpbyBxdWVkYSBlbiBlc3RhZG8gUEVORElORyBoYXN0YSB2ZXJpZmljYXIgc3UgZW1haWwuXG4gICAqL1xuICBzaWdudXAocmVxdWVzdDogU2lnbnVwUmVxdWVzdCk6IE9ic2VydmFibGU8U2lnbnVwUmVzcG9uc2U+IHtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5jbGVhckVycm9yKCk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxTaWdudXBSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9zaWdudXBgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBlbWFpbCBjb24gY8OzZGlnbyBkZSA2IGTDrWdpdG9zLlxuICAgKiBTaSBlcyBleGl0b3NvLCBoYWNlIGF1dG8tbG9naW4geSByZXRvcm5hIHRva2Vucy5cbiAgICovXG4gIHZlcmlmeUVtYWlsKHJlcXVlc3Q6IFZlcmlmeUVtYWlsUmVxdWVzdCk6IE9ic2VydmFibGU8VmVyaWZ5RW1haWxSZXNwb25zZT4ge1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyRXJyb3IoKTtcblxuICAgIC8vIHdpdGhDcmVkZW50aWFsczogZWwgdmVyaWZ5LWVtYWlsIGF1dG8tbG9ndWVhIHkgc2V0ZWEgbGEgY29va2llIEh0dHBPbmx5IGRlXG4gICAgLy8gcmVmcmVzaC4gU2luIGNyZWRlbmNpYWxlcyBlbCBicm93c2VyIGRlc2NhcnRhIGVsIFNldC1Db29raWUg4oaSIC9yZWZyZXNoIDQwMCAoSC0wNSkuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8VmVyaWZ5RW1haWxSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS92ZXJpZnktZW1haWxgLCByZXF1ZXN0LCB7IHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnZlcmlmaWVkICYmIHJlc3BvbnNlLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICAvLyBBdXRvLWxvZ2luOiBndWFyZGFyIHRva2VucyB5IGFjdHVhbGl6YXIgZXN0YWRvXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3NmdWxBdXRoKHJlc3BvbnNlIGFzIHVua25vd24gYXMgU2lnbmluUmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWVudsOtYSBjw7NkaWdvIGRlIHZlcmlmaWNhY2nDs24gYWwgZW1haWwuXG4gICAqL1xuICByZXNlbmRDb2RlKHJlcXVlc3Q6IFJlc2VuZENvZGVSZXF1ZXN0KTogT2JzZXJ2YWJsZTxSZXNlbmRDb2RlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxSZXNlbmRDb2RlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vcmVzZW5kLWNvZGVgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBjw7NkaWdvIE1GQS5cbiAgICovXG4gIHZlcmlmeU1GQShjb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1GQVZlcmlmeVJlc3BvbnNlPiB7XG4gICAgY29uc3QgbWZhU3RhdGUgPSB0aGlzLm1mYVBlbmRpbmcoKTtcbiAgICBpZiAoIW1mYVN0YXRlLm1mYVRva2VuKSB7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiAoe1xuICAgICAgICBjb2RlOiAnTUZBX05PVF9QRU5ESU5HJyxcbiAgICAgICAgbWVzc2FnZTogJ05vIGhheSB2ZXJpZmljYWNpw7NuIE1GQSBwZW5kaWVudGUnLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PE1GQVZlcmlmeVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS92ZXJpZnlgLCB7XG4gICAgICAgIG1mYVRva2VuOiBtZmFTdGF0ZS5tZmFUb2tlbixcbiAgICAgICAgY29kZSxcbiAgICAgICAgYXBwSWQ6IHRoaXMuY29uZmlnPy5hcHBJZCxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5jbGVhck1GQVBlbmRpbmcoKTtcbiAgICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3NmdWxBdXRoKHJlc3BvbnNlKTtcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNjYSBlbCB0b2tlbiBkZSBhY2Nlc28uXG4gICAqIEltcGxlbWVudGEgdG9rZW4gcm90YXRpb246IGNhZGEgcmVmcmVzaCBnZW5lcmEgdW4gbnVldm8gcmVmcmVzaCB0b2tlblxuICAgKiBxdWUgZWwgY2xpZW50ZSBkZWJlIGd1YXJkYXIgcGFyYSBlbCBwcsOzeGltbyByZWZyZXNoLlxuICAgKi9cbiAgcmVmcmVzaEFjY2Vzc1Rva2VuKCk6IE9ic2VydmFibGU8UmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgLy8gU2luZ2xlLWZsaWdodDogc2kgeWEgaGF5IHVuIC9yZWZyZXNoIGVuIHZ1ZWxvLCBkZXZvbHZlbW9zIGVsIE1JU01PXG4gICAgLy8gb2JzZXJ2YWJsZSAobXVsdGljYXN0IHbDrWEgc2hhcmVSZXBsYXkpLiBFdml0YSBsYSBjYXJyZXJhIGNvbnRyYSBsYSByb3RhY2nDs25cbiAgICAvLyBkZSByZWZyZXNoIHRva2VuIGRlbCBiYWNrZW5kLCBxdWUgcHJvZHVjw61hIDQwMSBlc3B1cmlvcyDihpIgbG9nb3V0IGFsXG4gICAgLy8gYWN0dWFsaXphci4gVmVyIGluRmxpZ2h0UmVmcmVzaCQgeSBwcm9qZWN0X3B3YS1sb2dpbi1mcmVlemUuXG4gICAgaWYgKHRoaXMuaW5GbGlnaHRSZWZyZXNoJCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5GbGlnaHRSZWZyZXNoJDtcbiAgICB9XG5cbiAgICAvLyBILTA1IHNhbWUtc2l0ZS1hd2FyZTogZW4gc2FtZS1zaXRlIChwcm9kKSBlbCByZWZyZXNoIHZhIFNPTE8gcG9yIGxhIGNvb2tpZVxuICAgIC8vIEh0dHBPbmx5IChib2R5IHZhY8OtbyksIG5vIHNlIHBlcnNpc3RlIGVuIGxvY2FsU3RvcmFnZSDihpIgdW4gWFNTIG5vIGxvIHJvYmEuXG4gICAgLy8gRW4gY3Jvc3Mtc2l0ZSAoZGV2KSBsYSBjb29raWUgZGUgdGVyY2Vyb3Mgc2UgYmxvcXVlYSAoU2FmYXJpIElUUCAvIENocm9tZVxuICAgIC8vIDNyZC1wYXJ0eSBwaGFzZS1vdXQpIOKGkiBzZSBtYW5kYSBlbiBlbCBib2R5ICsgc2UgcGVyc2lzdGUgKGZhbGxiYWNrKS5cbiAgICAvLyB3aXRoQ3JlZGVudGlhbHMgYWRqdW50YSBsYSBjb29raWUgY3VhbmRvIGVsIGJyb3dzZXIgbGEgcGVybWl0ZS5cbiAgICBjb25zdCBjdXJyZW50QWN0aXZlT3JnID0gdGhpcy5zdGF0ZSgpLmFjdGl2ZU9yZyB8fCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldEFjdGl2ZU9yZygpO1xuICAgIGNvbnN0IGJvZHk6IFJlZnJlc2hSZXF1ZXN0ID0gdGhpcy5zdG9yYWdlU2VydmljZS5jb29raWVPbmx5XG4gICAgICA/IHsgYWN0aXZlT3JnSWQ6IGN1cnJlbnRBY3RpdmVPcmcsIGFwcElkOiB0aGlzLmNvbmZpZz8uYXBwSWQgfVxuICAgICAgOiB7XG4gICAgICAgICAgcmVmcmVzaFRva2VuOiB0aGlzLnN0YXRlKCkucmVmcmVzaFRva2VuLFxuICAgICAgICAgIGFjdGl2ZU9yZ0lkOiBjdXJyZW50QWN0aXZlT3JnLFxuICAgICAgICAgIGFwcElkOiB0aGlzLmNvbmZpZz8uYXBwSWQsXG4gICAgICAgIH07XG5cbiAgICB0aGlzLmluRmxpZ2h0UmVmcmVzaCQgPSB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFJlZnJlc2hSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9yZWZyZXNoYCwgYm9keSwgeyB3aXRoQ3JlZGVudGlhbHM6IHRydWUgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICAvLyBOdW5jYSBkZWphciBlbCByZWZyZXNoIGNvbGdhZG86IHNpIGxhIHJlZC9MYW1iZGEgbm8gcmVzcG9uZGUgYSB0aWVtcG8sXG4gICAgICAgIC8vIGVtaXRpbW9zIGVycm9yIOKGkiBsb3MgY2FsbGVycyAoaW5pdGlhbGl6ZSwgaW50ZXJjZXB0b3IpIGxvIG1hbmVqYW4geSBsYVxuICAgICAgICAvLyBVSSBkZWphIGRlIGVzcGVyYXIuIFZlciBSRUZSRVNIX1RJTUVPVVRfTVMuXG4gICAgICAgIHRpbWVvdXQoUkVGUkVTSF9USU1FT1VUX01TKSxcbiAgICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBjb25zdCBleHBpcmVzQXQgPSBEYXRlLm5vdygpICsgcmVzcG9uc2UuZXhwaXJlc0luICogMTAwMDtcblxuICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZUFjY2Vzc1Rva2VuKHJlc3BvbnNlLmFjY2Vzc1Rva2VuLCByZXNwb25zZS5leHBpcmVzSW4pO1xuICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVJlZnJlc2hUb2tlbihyZXNwb25zZS5yZWZyZXNoVG9rZW4pO1xuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZUFjY2Vzc1Rva2VuKHJlc3BvbnNlLmFjY2Vzc1Rva2VuLCBleHBpcmVzQXQpO1xuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVJlZnJlc2hUb2tlbihyZXNwb25zZS5yZWZyZXNoVG9rZW4pOyAvLyBzZWxmLWdhdGU6IG5vLW9wIGVuIGNvb2tpZU9ubHlcblxuICAgICAgICAgIC8vIFN5bmMgaXNTdXBlckFkbWluIGZyb20gcmVmcmVzaGVkIEpXVCBzbyBwbGF0Zm9ybSBhZG1pbiBwcm9tb3Rpb24vcmV2b2NhdGlvblxuICAgICAgICAgIC8vIHRha2VzIGVmZmVjdCB3aXRob3V0IHJlcXVpcmluZyBhIGZ1bGwgcmUtbG9naW4uXG4gICAgICAgICAgY29uc3QgcGFyc2VkVG9rZW4gPSB0aGlzLnRva2VuU2VydmljZS5wYXJzZVRva2VuKHJlc3BvbnNlLmFjY2Vzc1Rva2VuKTtcbiAgICAgICAgICBpZiAocGFyc2VkVG9rZW4/Lm9yZykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWN0aXZlT3JnKHBhcnNlZFRva2VuLm9yZyk7XG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVBY3RpdmVPcmcocGFyc2VkVG9rZW4ub3JnLCB7IHBlcnNpc3RQcmVmZXJyZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBuZXdJc1N1cGVyQWRtaW4gPVxuICAgICAgICAgICAgcmVzcG9uc2UucGVybWlzc2lvbnM/LmluY2x1ZGVzKCcqOionKSB8fCBwYXJzZWRUb2tlbj8uYWRtaW4gPT09IHRydWUgfHwgZmFsc2U7XG4gICAgICAgICAgY29uc3QgbmV3Um9sZXMgPSByZXNwb25zZS5yb2xlcyA/PyB0aGlzLnN0YXRlKCkucm9sZXM7XG4gICAgICAgICAgY29uc3QgbmV3UGVybXMgPSByZXNwb25zZS5wZXJtaXNzaW9ucyA/PyB0aGlzLnN0YXRlKCkucGVybWlzc2lvbnM7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUGVybWlzc2lvbnMobmV3Um9sZXMsIG5ld1Blcm1zLCBuZXdJc1N1cGVyQWRtaW4pO1xuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVBlcm1pc3Npb25zKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbklkOiAnJyxcbiAgICAgICAgICAgIHJvbGVzOiBuZXdSb2xlcyxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiBuZXdQZXJtcyxcbiAgICAgICAgICAgIGlzU3VwZXJBZG1pbjogbmV3SXNTdXBlckFkbWluLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnPy5lbmFibGVGaXJlYmFzZUludGVncmF0aW9uICYmIHJlc3BvbnNlLmZpcmViYXNlVG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2lnbkluV2l0aEZpcmViYXNlKHJlc3BvbnNlLmZpcmViYXNlVG9rZW4pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuc3RhcnRSZWZyZXNoVGltZXIoKTtcbiAgICAgICAgICB0aGlzLnN5bmNTZXJ2aWNlLmJyb2FkY2FzdCh7XG4gICAgICAgICAgICB0eXBlOiAnVE9LRU5fUkVGUkVTSCcsXG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiByZXNwb25zZS5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgICAgcmVmcmVzaFRva2VuOiByZXNwb25zZS5yZWZyZXNoVG9rZW4sIC8vIE5VRVZPOiBzaW5jcm9uaXphciBlbnRyZSB0YWJzXG4gICAgICAgICAgICAgIGV4cGlyZXNBdCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICAvLyBEbyBOT1QgY2FsbCBsb2dvdXQoKSBoZXJlIOKAlCBjYWxsZXJzIGRlY2lkZSB3aGF0IHRvIGRvIG9uIGZhaWx1cmUuXG4gICAgICAgICAgLy8gVGhlIGF1dGggaW50ZXJjZXB0b3IgYWxyZWFkeSBjYWxscyBsb2dvdXQoKSBleHBsaWNpdGx5LCBhbmRcbiAgICAgICAgICAvLyBpbml0aWFsaXplKCkgb25seSBjbGVhcnMgc3RhdGUgKG5vIHJlZGlyZWN0KS4gQXV0by1uYXZpZ2F0aW5nIHRvXG4gICAgICAgICAgLy8gL2xvZ2luIGZyb20gdGhpcyBtZXRob2QgcmVkaXJlY3RzIGV2ZW4gdXNlcnMgb24gcHVibGljIHJvdXRlcy5cbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICAgIH0pLFxuICAgICAgICAvLyBMaWJlcmFyIGVsIHNsb3QgYWwgdGVybWluYXIgKMOpeGl0bywgZXJyb3IgbyB0aW1lb3V0KSBwYXJhIHF1ZSBlbFxuICAgICAgICAvLyBwcsOzeGltbyByZWZyZXNoIHJlYWwgYXJyYW5xdWUgdW5vIG51ZXZvLlxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbkZsaWdodFJlZnJlc2gkID0gbnVsbDtcbiAgICAgICAgfSksXG4gICAgICAgIC8vIE11bHRpY2FzdDogbG9zIHNpZGUtZWZmZWN0cyBkZWwgdGFwIGNvcnJlbiBVTkEgdmV6IHkgdG9kb3MgbG9zIGNhbGxlcnNcbiAgICAgICAgLy8gY29uY3VycmVudGVzIHJlY2liZW4gbGEgbWlzbWEgcmVzcHVlc3RhL2Vycm9yLiByZWZDb3VudDpmYWxzZSDihpIgcXVlIHVuXG4gICAgICAgIC8vIGNhbGxlciBzZSBkZXN1c2NyaWJlIHRlbXByYW5vIE5PIGNhbmNlbGEgbGEgcm90YWNpw7NuIGRlIHRva2VuIGVuIHZ1ZWxvLlxuICAgICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiBmYWxzZSB9KVxuICAgICAgKTtcblxuICAgIHJldHVybiB0aGlzLmluRmxpZ2h0UmVmcmVzaCQ7XG4gIH1cblxuICAvKipcbiAgICogTWFuZWphIGF1dGVudGljYWNpw7NuIGV4aXRvc2EgZGVzZGUgZnVlbnRlcyBleHRlcm5hcyAoT0F1dGgsIGV0YykuXG4gICAqIEd1YXJkYSB0b2tlbnMsIGFjdHVhbGl6YSBlc3RhZG8sIGluaWNpYSBGaXJlYmFzZSBzaSBjb3JyZXNwb25kZS5cbiAgICpcbiAgICogQHBhcmFtIGF1dGhSZXN1bHQgLSBSZXN1bHRhZG8gZGUgYXV0ZW50aWNhY2nDs24gY29uIHRva2Vuc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIERlc2RlIHVuIGZsdWpvIE9BdXRoIGV4dGVybm9cbiAgICogZXh0ZXJuYWxPQXV0aC5zaWduSW4oKS5zdWJzY3JpYmUoe1xuICAgKiAgIG5leHQ6IChyZXN1bHQpID0+IHtcbiAgICogICAgIHRoaXMuYXV0aFNlcnZpY2Uuc2V0RXh0ZXJuYWxBdXRoKHJlc3VsdCk7XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzZXRFeHRlcm5hbEF1dGgoYXV0aFJlc3VsdDoge1xuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gICAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gICAgZmlyZWJhc2VUb2tlbj86IHN0cmluZztcbiAgICBleHBpcmVzSW46IG51bWJlcjtcbiAgICByb2xlcz86IHN0cmluZ1tdO1xuICAgIHBlcm1pc3Npb25zPzogc3RyaW5nW107XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmhhbmRsZVN1Y2Nlc3NmdWxBdXRoKHtcbiAgICAgIC4uLmF1dGhSZXN1bHQsXG4gICAgICBvcGVyYXRpb25JZDogJ2V4dGVybmFsLWF1dGgnLFxuICAgICAgdG9rZW5UeXBlOiAnQmVhcmVyJyxcbiAgICB9IGFzIFNpZ25pblJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaWVycmEgc2VzacOzbiB0cmFzIHBlZGlyIGNvbmZpcm1hY2nDs24gYWwgdXN1YXJpby5cbiAgICpcbiAgICogTXVlc3RyYSB1biBkacOhbG9nbyBuYXRpdm8gKGVzdGlsbyBkZXN0cnVjdGl2bykuIFNpIGVsIHVzdWFyaW8gY29uZmlybWEsXG4gICAqIGVqZWN1dGEgYGxvZ291dCgpYC4gU2kgY2FuY2VsYSwgbm8gcGFzYSBuYWRhLlxuICAgKlxuICAgKiBUZXh0byBwb3IgZGVmZWN0byBkZXNkZSBgX2dsb2JhbGAgaTE4bjogYGxvZ291dENvbmZpcm1UaXRsZWAsXG4gICAqIGBsb2dvdXRDb25maXJtTWVzc2FnZWAsIGBsb2dvdXRgLCBgY2FuY2VsYC4gT3ZlcnJpZGUgdmlhIGBvcHRzYC5cbiAgICpcbiAgICogQHJldHVybnMgdHJ1ZSBzaSBlbCB1c3VhcmlvIGNvbmZpcm3DsyAobG9nb3V0IGVqZWN1dGFkbyksIGZhbHNlIHNpIGNhbmNlbMOzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBvbkxvZ291dENsaWNrKCkgeyB0aGlzLmF1dGgubG9nb3V0V2l0aENvbmZpcm1hdGlvbigpOyB9XG4gICAqL1xuICBhc3luYyBsb2dvdXRXaXRoQ29uZmlybWF0aW9uKG9wdHM/OiB7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgbWVzc2FnZT86IHN0cmluZztcbiAgICBjb25maXJtVGV4dD86IHN0cmluZztcbiAgICBjYW5jZWxUZXh0Pzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdCA9IChrZXk6IHN0cmluZywgZmFsbGJhY2s6IHN0cmluZykgPT4gdGhpcy5pMThuU2VydmljZT8udChrZXkpIHx8IGZhbGxiYWNrO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtRGVzdHJ1Y3RpdmUoe1xuICAgICAgdGl0bGU6IG9wdHM/LnRpdGxlID8/IHQoJ2xvZ291dENvbmZpcm1UaXRsZScsICdDZXJyYXIgc2VzacOzbicpLFxuICAgICAgbWVzc2FnZTogb3B0cz8ubWVzc2FnZSA/PyB0KCdsb2dvdXRDb25maXJtTWVzc2FnZScsICfCv1NlZ3VybyBxdWUgZGVzZWFzIGNlcnJhciBzZXNpw7NuPycpLFxuICAgICAgY29uZmlybUJ1dHRvbjogeyB0ZXh0OiBvcHRzPy5jb25maXJtVGV4dCA/PyB0KCdsb2dvdXQnLCAnQ2VycmFyIHNlc2nDs24nKSB9LFxuICAgICAgY2FuY2VsQnV0dG9uOiB7IHRleHQ6IG9wdHM/LmNhbmNlbFRleHQgPz8gdCgnY2FuY2VsJywgJ0NhbmNlbGFyJykgfSxcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHQuY29uZmlybWVkKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvZ291dCgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaWVycmEgc2VzacOzbi5cbiAgICovXG4gIGFzeW5jIGxvZ291dChvcHRpb25zOiB7IHJlZGlyZWN0PzogYm9vbGVhbjsgYnJvYWRjYXN0PzogYm9vbGVhbiB9ID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZWRpcmVjdCA9IG9wdGlvbnMucmVkaXJlY3QgPz8gIXRoaXMuaXNDdXJyZW50Um91dGVQdWJsaWMoKTtcbiAgICBjb25zdCBicm9hZGNhc3QgPSBvcHRpb25zLmJyb2FkY2FzdCA/PyB0cnVlO1xuXG4gICAgLy8gRWxpbWluYXIgZGlzcG9zaXRpdm8gZGVsIGJhY2tlbmQgYW50ZXMgZGUgY2VycmFyIHNlc2nDs25cbiAgICBhd2FpdCB0aGlzLnVucmVnaXN0ZXJEZXZpY2UoKTtcblxuICAgIC8vIE5vdGlmaWNhciBhbCBiYWNrZW5kIChmaXJlIGFuZCBmb3JnZXQpLiBILTA1IHNhbWUtc2l0ZS1hd2FyZTogZW4gc2FtZS1zaXRlXG4gICAgLy8gZWwgcmVmcmVzaCB2YSBwb3IgbGEgY29va2llIEh0dHBPbmx5OyBlbiBjcm9zcy1zaXRlIHNlIG1hbmRhIGVuIGVsIGJvZHkuXG4gICAgLy8gd2l0aENyZWRlbnRpYWxzIGFkanVudGEgbGEgY29va2llOyBlbCBiYWNrZW5kIHJldm9jYSBsYSBzZXNpw7NuICsgbGEgZXhwaXJhLlxuICAgIGNvbnN0IGJvZHkgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmNvb2tpZU9ubHkgPyB7fSA6IHsgcmVmcmVzaFRva2VuOiB0aGlzLnN0YXRlKCkucmVmcmVzaFRva2VuIH07XG4gICAgdGhpcy5odHRwXG4gICAgICAucG9zdChgJHt0aGlzLmJhc2VVcmx9L2xvZ291dGAsIGJvZHksIHsgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH0pXG4gICAgICAucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSlcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIC8vIENlcnJhciBzZXNpw7NuIGRlIEZpcmViYXNlIHNpIGVzdMOhIGludGVncmFkb1xuICAgIHRoaXMuc2lnbk91dEZpcmViYXNlKCk7XG5cbiAgICB0aGlzLmNsZWFyU3RhdGUoKTtcbiAgICBpZiAoYnJvYWRjYXN0KSB7XG4gICAgICB0aGlzLnN5bmNTZXJ2aWNlLmJyb2FkY2FzdCh7IHR5cGU6ICdMT0dPVVQnIH0pO1xuICAgIH1cbiAgICBpZiAocmVkaXJlY3QpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLmNvbmZpZz8ubG9naW5Sb3V0ZV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNRkEgU0VUVVAgKHVzdWFyaW8gYXV0ZW50aWNhZG8pXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmEgTUZBIHBhcmEgZWwgdXN1YXJpby5cbiAgICovXG4gIHNldHVwTUZBKG1ldGhvZDogTUZBTWV0aG9kLCBwaG9uZT86IHN0cmluZyk6IE9ic2VydmFibGU8TUZBU2V0dXBSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PE1GQVNldHVwUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3NldHVwYCwgeyBtZXRob2QsIHBob25lIH0pXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpcm1hIGxhIGNvbmZpZ3VyYWNpw7NuIGRlIE1GQS5cbiAgICovXG4gIGNvbmZpcm1NRkEoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxNRkFDb25maXJtUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxNRkFDb25maXJtUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL2NvbmZpcm1gLCB7IGNvZGUgfSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogRGVzaGFiaWxpdGEgTUZBLiBBY2VwdGEgYHBhc3N3b3JkYCBvIGBtZmFDb2RlYCAodW5vIHJlcXVlcmlkbykuXG4gICAqIGBtZmFDb2RlYCBlcyBwYXJhIHVzdWFyaW9zIE9BdXRoLW9ubHkgY29uIFRPVFAgcXVlIG5vIHRpZW5lbiBjb250cmFzZcOxYS5cbiAgICovXG4gIGRpc2FibGVNRkEoaW5wdXQ6IE1GQURpc2FibGVSZXF1ZXN0KTogT2JzZXJ2YWJsZTxNRkFEaXNhYmxlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxNRkFEaXNhYmxlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL2Rpc2FibGVgLCBpbnB1dClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICBzZW5kTUZBRGlzYWJsZUNvZGUoKTogT2JzZXJ2YWJsZTx7IG9wZXJhdGlvbklkOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PHsgb3BlcmF0aW9uSWQ6IHN0cmluZyB9PihgJHt0aGlzLmJhc2VVcmx9L21mYS9kaXNhYmxlLWNvZGVgLCB7fSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVE9UUCBNRkEgKEdvb2dsZSBBdXRoZW50aWNhdG9yKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pY2lhIGNvbmZpZ3VyYWNpw7NuIGRlIFRPVFAgTUZBLlxuICAgKiBSZXRvcm5hIGVsIHNlY3JldG8sIFVSTCBwYXJhIFFSIGNvZGUgeSBjw7NkaWdvcyBkZSByZXNwYWxkby5cbiAgICovXG4gIHNldHVwVE9UUCgpOiBPYnNlcnZhYmxlPFRPVFBTZXR1cFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8VE9UUFNldHVwUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3RvdHAvc2V0dXBgLCB7fSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2EgZWwgY8OzZGlnbyBUT1RQIHkgYWN0aXZhIE1GQS5cbiAgICogRGViZSBsbGFtYXJzZSBkZXNwdcOpcyBkZSBzZXR1cFRPVFAgY29uIGVsIGPDs2RpZ28gZGVsIGF1dGhlbnRpY2F0b3IuXG4gICAqL1xuICB2ZXJpZnlUT1RQU2V0dXAoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxUT1RQVmVyaWZ5U2V0dXBSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFRPVFBWZXJpZnlTZXR1cFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS90b3RwL3ZlcmlmeWAsIHsgY29kZSB9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdlbmVyYSBsb3MgY8OzZGlnb3MgZGUgcmVzcGFsZG8gVE9UUC5cbiAgICogTG9zIGPDs2RpZ29zIGFudGVyaW9yZXMgc29uIGludmFsaWRhZG9zLlxuICAgKi9cbiAgcmVnZW5lcmF0ZUJhY2t1cENvZGVzKCk6IE9ic2VydmFibGU8UmVnZW5lcmF0ZUJhY2t1cENvZGVzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxSZWdlbmVyYXRlQmFja3VwQ29kZXNSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvdG90cC9iYWNrdXAtY29kZXNgLCB7fSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBsYSBjYW50aWRhZCBkZSBjw7NkaWdvcyBkZSByZXNwYWxkbyByZXN0YW50ZXMuXG4gICAqL1xuICBnZXRCYWNrdXBDb2Rlc0NvdW50KCk6IE9ic2VydmFibGU8QmFja3VwQ29kZXNDb3VudFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmdldDxCYWNrdXBDb2Rlc0NvdW50UmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3RvdHAvYmFja3VwLWNvZGVzL2NvdW50YClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogRGVzYWN0aXZhIFRPVFAgTUZBIChyZXF1aWVyZSBjb250cmFzZcOxYSkuXG4gICAqL1xuICBkaXNhYmxlVE9UUChwYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxUT1RQRGlzYWJsZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8VE9UUERpc2FibGVSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvdG90cC9kaXNhYmxlYCwgeyBwYXNzd29yZCB9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBPUkdBTklaQUNJT05FU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQ2FtYmlhIGxhIG9yZ2FuaXphY2nDs24gYWN0aXZhIGRlbCB1c3VhcmlvLlxuICAgKiBHZW5lcmEgdW4gbnVldm8gRmlyZWJhc2UgdG9rZW4gY29uIGVsIGFjdGl2ZU9yZyBhY3R1YWxpemFkby5cbiAgICpcbiAgICogQHBhcmFtIG9yZ2FuaXphdGlvbklkIC0gSUQgZGUgbGEgb3JnYW5pemFjacOzbiBhIGxhIHF1ZSBjYW1iaWFyXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgY29uIGVsIG51ZXZvIEZpcmViYXNlIHRva2VuIHkgYWN0aXZlT3JnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5hdXRoLnN3aXRjaE9yZygnb3JnX3h5ejc4OScpKTtcbiAgICogLy8gRmlyZWJhc2UgeWEgZXN0w6EgcmUtYXV0ZW50aWNhZG8gY29uIGxhIG51ZXZhIG9yZ1xuICAgKiBjb25zdCBhY3RpdmVPcmcgPSBhd2FpdCB0aGlzLmZpcmViYXNlLmdldEFjdGl2ZU9yZygpO1xuICAgKiBgYGBcbiAgICovXG4gIHN3aXRjaE9yZyhvcmdhbml6YXRpb25JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTd2l0Y2hPcmdSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxTd2l0Y2hPcmdSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9zd2l0Y2gtb3JnYCwgeyBvcmdhbml6YXRpb25JZCwgYXBwSWQ6IHRoaXMuY29uZmlnPy5hcHBJZCB9KS5waXBlKFxuICAgICAgc3dpdGNoTWFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgLy8gUmUtYXV0ZW50aWNhciBlbiBGaXJlYmFzZSBjb24gZWwgbnVldm8gdG9rZW5cbiAgICAgICAgLy8gVXNhciBzd2l0Y2hNYXAgKyBmcm9tIHBhcmEgZXNwZXJhciBhIHF1ZSBGaXJlYmFzZSBjb21wbGV0ZVxuICAgICAgICBjb25zdCBmaXJlYmFzZUF1dGgkID0gcmVzcG9uc2UuZmlyZWJhc2VUb2tlblxuICAgICAgICAgID8gZnJvbSh0aGlzLnNpZ25JbldpdGhGaXJlYmFzZShyZXNwb25zZS5maXJlYmFzZVRva2VuKSlcbiAgICAgICAgICA6IG9mKHVuZGVmaW5lZCk7XG5cbiAgICAgICAgcmV0dXJuIGZpcmViYXNlQXV0aCQucGlwZShcbiAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgLy8gQWN0dWFsaXphciBhY3RpdmVPcmcgZW4gZWwgc3RhdGUgbG9jYWxcbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZUFjdGl2ZU9yZyhyZXNwb25zZS5hY3RpdmVPcmcpO1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlQWN0aXZlT3JnKHJlc3BvbnNlLmFjdGl2ZU9yZyk7XG4gICAgICAgICAgICAvLyBQZXJzaXN0aXIgZWwgbnVldm8gYWNjZXNzIHRva2VuIChpbmNsdXllIGFjdGl2ZU9yZyBhY3R1YWxpemFkbykuXG4gICAgICAgICAgICAvLyBTaW4gZXN0bywgZWwgYm9vdHN0cmFwIHBvc3QtcmVmcmVzaCB1c2EgZWwgSldUIGNhY2hlYWRvIGNvbiBsYSBvcmcgYW50ZXJpb3IuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArIChyZXNwb25zZS5leHBpcmVzSW4gPz8gOTAwKSAqIDEwMDA7XG4gICAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZUFjY2Vzc1Rva2VuKHJlc3BvbnNlLmFjY2Vzc1Rva2VuLCByZXNwb25zZS5leHBpcmVzSW4gPz8gOTAwKTtcbiAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlQWNjZXNzVG9rZW4ocmVzcG9uc2UuYWNjZXNzVG9rZW4sIGV4cGlyZXNBdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBOb3RpZmljYXIgY2FtYmlvIGEgb3RyYXMgcGVzdGHDsWFzXG4gICAgICAgICAgICB0aGlzLnN5bmNTZXJ2aWNlLmJyb2FkY2FzdCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdPUkdfU1dJVENIJyxcbiAgICAgICAgICAgICAgcGF5bG9hZDogeyBhY3RpdmVPcmc6IHJlc3BvbnNlLmFjdGl2ZU9yZyB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgLy8gUmV0b3JuYXIgcmVzcG9uc2Ugb3JpZ2luYWwgZGVzcHXDqXMgZGUgcXVlIEZpcmViYXNlIGNvbXBsZXRlXG4gICAgICAgICAgbWFwKCgpID0+IHJlc3BvbnNlKVxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBFUkZJTCBERSBVU1VBUklPXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGVsIHBlcmZpbCBkZWwgdXN1YXJpbyBhdXRlbnRpY2Fkby5cbiAgICogSW5jbHV5ZSBpbmZvcm1hY2nDs24gZGUgTUZBIHkgdGVsw6lmb25vLiBIaWRyYXRhIGVsIHN0YXRlIGF1dG9tw6F0aWNhbWVudGVcbiAgICogY29uIGBuYW1lL2hhbmRsZS9hdmF0YXJVcmwvcGhvbmVgIHBhcmEgcXVlIGBhdXRoLnVzZXIoKWAgbG9zIHJldG9ybmUuXG4gICAqL1xuICBnZXRQcm9maWxlKCk6IE9ic2VydmFibGU8R2V0UHJvZmlsZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8R2V0UHJvZmlsZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Byb2ZpbGVgKS5waXBlKFxuICAgICAgdGFwKHByb2ZpbGUgPT5cbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUHJvZmlsZUZpZWxkcyh7XG4gICAgICAgICAgbmFtZTogcHJvZmlsZS5uYW1lLFxuICAgICAgICAgIGhhbmRsZTogcHJvZmlsZS5oYW5kbGUgPz8gbnVsbCxcbiAgICAgICAgICBhdmF0YXJVcmw6IHByb2ZpbGUuYXZhdGFyVXJsID8/IG51bGwsXG4gICAgICAgICAgcGhvbmU6IHByb2ZpbGUucGhvbmUgPz8gbnVsbCxcbiAgICAgICAgfSlcbiAgICAgICksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdHVhbGl6YSBlbCBwZXJmaWwgZGVsIHVzdWFyaW8uIFNpbmNyb25pemEgc3RhdGUgY29uIGxvcyBudWV2b3MgdmFsdWVzXG4gICAqIChuYW1lL3Bob25lKSDigJQgZWwgYmFja2VuZCByZXNwb25zZSBubyBsb3MgZWNobydhIHBlcm8gZWwgY2FsbGVyIHlhIHRpZW5lXG4gICAqIGxvcyB2YWxvcmVzIHF1ZSBtYW5kw7MuXG4gICAqL1xuICB1cGRhdGVQcm9maWxlKHJlcXVlc3Q6IFVwZGF0ZVByb2ZpbGVSZXF1ZXN0KTogT2JzZXJ2YWJsZTxVcGRhdGVQcm9maWxlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxVcGRhdGVQcm9maWxlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vcHJvZmlsZWAsIHJlcXVlc3QpLnBpcGUoXG4gICAgICB0YXAoKCkgPT4gdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUHJvZmlsZUZpZWxkcyhyZXF1ZXN0KSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdHVhbGl6YSBlbCBhdmF0YXIgZGVsIHVzdWFyaW8gZW4gZWwgYmFja2VuZC4gU2luY3Jvbml6YSBzdGF0ZSBjb24gZWxcbiAgICogYGF2YXRhclVybGAgcmV0b3JuYWRvIHBhcmEgcXVlIGVsIGhlYWRlciAvIGRhc2hib2FyZCBzZSByZWZyZXNxdWVuIHNpblxuICAgKiBuZWNlc2lkYWQgZGUgdW4gZ2V0UHJvZmlsZSBhZGljaW9uYWwuXG4gICAqL1xuICB1cGRhdGVBdmF0YXIocmVxdWVzdDogVXBkYXRlQXZhdGFyUmVxdWVzdCk6IE9ic2VydmFibGU8VXBkYXRlQXZhdGFyUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxVcGRhdGVBdmF0YXJSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9wcm9maWxlL2F2YXRhcmAsIHJlcXVlc3QpLnBpcGUoXG4gICAgICB0YXAocmVzID0+IHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVByb2ZpbGVGaWVsZHMoeyBhdmF0YXJVcmw6IHJlcy5hdmF0YXJVcmwgfSkpLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSRUNVUEVSQUNJw5NOIERFIENPTlRSQVNFw5FBXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbmljaWEgZWwgcHJvY2VzbyBkZSByZWN1cGVyYWNpw7NuIGRlIGNvbnRyYXNlw7FhLlxuICAgKiBFbnbDrWEgdW4gY8OzZGlnbyBhbCBlbWFpbCBkZWwgdXN1YXJpby5cbiAgICovXG4gIGZvcmdvdFBhc3N3b3JkKHJlcXVlc3Q6IEZvcmdvdFBhc3N3b3JkUmVxdWVzdCk6IE9ic2VydmFibGU8Rm9yZ290UGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PEZvcmdvdFBhc3N3b3JkUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vZm9yZ290LXBhc3N3b3JkYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRlYSBsYSBjb250cmFzZcOxYSB1c2FuZG8gZWwgY8OzZGlnbyBlbnZpYWRvIHBvciBlbWFpbC5cbiAgICovXG4gIHJlc2V0UGFzc3dvcmQocmVxdWVzdDogUmVzZXRQYXNzd29yZFJlcXVlc3QpOiBPYnNlcnZhYmxlPFJlc2V0UGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFJlc2V0UGFzc3dvcmRSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9yZXNldC1wYXNzd29yZGAsIHJlcXVlc3QpXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaWNpYSBlbCByZXNldCBkZSBNRkEgcG9yIGVtYWlsIGN1YW5kbyBlbCB1c2VyIHBlcmRpw7Mgc3UgMsK6IGZhY3RvclxuICAgKiAoVE9UUCArIGJhY2t1cCBjb2RlcykuIEVudsOtYSB1biBjw7NkaWdvIGRlIDYgZMOtZ2l0b3MgYWwgZW1haWwgdmVyaWZpY2Fkby5cbiAgICogUmVzcG9uc2Ugc2llbXByZSBnZW7DqXJpY2EgKGFudGktZW51bWVyYWNpw7NuKS5cbiAgICovXG4gIHJlcXVlc3RNRkFSZXNldChyZXF1ZXN0OiBNRkFSZXNldFJlcXVlc3RSZXF1ZXN0KTogT2JzZXJ2YWJsZTxNRkFSZXNldFJlcXVlc3RSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PE1GQVJlc2V0UmVxdWVzdFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS9yZXNldC1yZXF1ZXN0YCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlybWEgZWwgcmVzZXQgZGUgTUZBIGNvbiBlbCBjw7NkaWdvIHJlY2liaWRvIHBvciBlbWFpbCDihpIgZGVzaGFiaWxpdGEgTUZBLlxuICAgKiBUcmFzIGVzdG8gZWwgdXNlciBpbmljaWEgc2VzacOzbiBub3JtYWxtZW50ZSAoc2luIDLCuiBmYWN0b3IpIHkgcmUtZW5yb2xhLlxuICAgKi9cbiAgY29uZmlybU1GQVJlc2V0KHJlcXVlc3Q6IE1GQVJlc2V0Q29uZmlybVJlcXVlc3QpOiBPYnNlcnZhYmxlPE1GQVJlc2V0Q29uZmlybVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8TUZBUmVzZXRDb25maXJtUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3Jlc2V0YCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhIHVuYSBjdWVudGEgcHJlLWFwcm92aXNpb25hZGEgcG9yIHVuYSBvcmdhbml6YWNpw7NuIChBRFItMDIzKTogZGVmaW5lXG4gICAqIGxhIGNvbnRyYXNlw7FhIGNvbiBlbCB0b2tlbiBkZWwgZW5sYWNlIGRlIGVtYWlsLiBFbiDDqXhpdG8gZWwgYmFja2VuZCBkZXZ1ZWx2ZVxuICAgKiB0b2tlbnMgZGUgYXV0by1zaWduaW4g4oaSIGVsIHVzdWFyaW8gcXVlZGEgbG9ndWVhZG8gKG1pc21vIGZsdWpvIHF1ZSB2ZXJpZnktZW1haWwpLlxuICAgKi9cbiAgYWN0aXZhdGVBY2NvdW50KHJlcXVlc3Q6IEFjdGl2YXRlQWNjb3VudFJlcXVlc3QpOiBPYnNlcnZhYmxlPEFjdGl2YXRlQWNjb3VudFJlc3BvbnNlPiB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJFcnJvcigpO1xuICAgIC8vIHdpdGhDcmVkZW50aWFsczogYWN0aXZhdGUgYXV0by1sb2d1ZWEgeSBzZXRlYSBsYSBjb29raWUgSHR0cE9ubHkgZGUgcmVmcmVzaC5cbiAgICAvLyBTaW4gY3JlZGVuY2lhbGVzIGVsIGJyb3dzZXIgZGVzY2FydGEgZWwgU2V0LUNvb2tpZSDihpIgL3JlZnJlc2ggNDAwIChILTA1KS5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxBY3RpdmF0ZUFjY291bnRSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9hY3RpdmF0ZWAsIHJlcXVlc3QsIHsgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBpZiAocmVzcG9uc2UuYWN0aXZhdGVkICYmIHJlc3BvbnNlLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3NmdWxBdXRoKHJlc3BvbnNlIGFzIHVua25vd24gYXMgU2lnbmluUmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW1iaWEgbGEgY29udHJhc2XDsWEgZGVsIHVzdWFyaW8gYXV0ZW50aWNhZG8uXG4gICAqIFJlcXVpZXJlIGxhIGNvbnRyYXNlw7FhIGFjdHVhbCBwYXJhIHZlcmlmaWNhY2nDs24uXG4gICAqL1xuICBjaGFuZ2VQYXNzd29yZChjdXJyZW50UGFzc3dvcmQ6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hhbmdlUGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3Q6IENoYW5nZVBhc3N3b3JkUmVxdWVzdCA9IHsgY3VycmVudFBhc3N3b3JkLCBuZXdQYXNzd29yZCB9O1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PENoYW5nZVBhc3N3b3JkUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vY2hhbmdlLXBhc3N3b3JkYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ0FNQklPIERFIEVNQUlMIOKAlCBmbHVqbyBkZSAzIHBhc29zXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGluaXRpYXRlRW1haWxDaGFuZ2UoXG4gICAgY3VycmVudFBhc3N3b3JkOiBzdHJpbmcsXG4gICAgbmV3RW1haWw6IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPEluaXRpYXRlRW1haWxDaGFuZ2VSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3Q6IEluaXRpYXRlRW1haWxDaGFuZ2VSZXF1ZXN0ID0geyBjdXJyZW50UGFzc3dvcmQsIG5ld0VtYWlsIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8SW5pdGlhdGVFbWFpbENoYW5nZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L2VtYWlsL2luaXRpYXRlYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICBjb25maXJtRW1haWxDaGFuZ2VTdGVwMShjb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENvbmZpcm1FbWFpbENoYW5nZVN0ZXAxUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0OiBDb25maXJtRW1haWxDaGFuZ2VTdGVwMVJlcXVlc3QgPSB7IGNvZGUgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxDb25maXJtRW1haWxDaGFuZ2VTdGVwMVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L2VtYWlsL2NvbmZpcm0vMWAsIHJlcXVlc3QpXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgY29uZmlybUVtYWlsQ2hhbmdlU3RlcDIoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxDb25maXJtRW1haWxDaGFuZ2VTdGVwMlJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdDogQ29uZmlybUVtYWlsQ2hhbmdlU3RlcDJSZXF1ZXN0ID0geyBjb2RlIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8Q29uZmlybUVtYWlsQ2hhbmdlU3RlcDJSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9lbWFpbC9jb25maXJtLzJgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBTFRBIERFIENPUlJFTyDigJQgY3VlbnRhcyBzaW4gZW1haWxcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluaWNpYSBlbCBhbHRhIGRlIGNvcnJlbyBwYXJhIHVuYSBjdWVudGEgcXVlIG5vIHRpZW5lIHVubyAodmVyXG4gICAqIGBPQXV0aFJlc3VsdC5yZXF1aXJlc0VtYWlsYCkuIEVudsOtYSB1biBjw7NkaWdvIGFsIGNvcnJlbyBpbmRpY2Fkby5cbiAgICpcbiAgICogTm8gcGlkZSBjb250cmFzZcOxYSBwb3JxdWUgZXN0YXMgY3VlbnRhcyBzb24gT0F1dGgtb25seS4gTGEgYXV0b3JpemFjacOzblxuICAgKiB2aWVuZSBkZWwgYWNjZXNzIHRva2VuLlxuICAgKi9cbiAgYWRkRW1haWwoZW1haWw6IHN0cmluZyk6IE9ic2VydmFibGU8QWRkRW1haWxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3Q6IEFkZEVtYWlsUmVxdWVzdCA9IHsgZW1haWwgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxBZGRFbWFpbFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L2VtYWlsL2FkZGAsIHJlcXVlc3QpXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqIENvbmZpcm1hIGVsIGFsdGEgZGUgY29ycmVvIGNvbiBlbCBjw7NkaWdvIHJlY2liaWRvLiAqL1xuICBjb25maXJtQWRkRW1haWwoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxDb25maXJtQWRkRW1haWxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3Q6IENvbmZpcm1BZGRFbWFpbFJlcXVlc3QgPSB7IGNvZGUgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxDb25maXJtQWRkRW1haWxSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9lbWFpbC9hZGQvY29uZmlybWAsIHJlcXVlc3QpXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEVMSU1JTkFDScOTTiBERSBDVUVOVEFcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEVsaW1pbmEgbGEgY3VlbnRhIGRlbCB1c3VhcmlvIChzb2Z0IGRlbGV0ZSkuXG4gICAqIFJlcXVpZXJlIGNvbmZpcm1hY2nDs24gZGUgY29udHJhc2XDsWEgcG9yIHNlZ3VyaWRhZC5cbiAgICogRGVzcHXDqXMgZGUgZWxpbWluYXIsIGNpZXJyYSBzZXNpw7NuIGF1dG9tw6F0aWNhbWVudGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXNzd29yZCAtIENvbnRyYXNlw7FhIGFjdHVhbCBwYXJhIGNvbmZpcm1hclxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIGNvbiByZXN1bHRhZG8gZGUgbGEgZWxpbWluYWNpw7NuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXN5bmMgY29uZmlybURlbGV0ZUFjY291bnQocGFzc3dvcmQ6IHN0cmluZykge1xuICAgKiAgIHRyeSB7XG4gICAqICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmF1dGguZGVsZXRlQWNjb3VudChwYXNzd29yZCkpO1xuICAgKiAgICAgY29uc29sZS5sb2cocmVzdWx0Lm1lc3NhZ2UpOyAvLyBcIlR1IGN1ZW50YSBoYSBzaWRvIGVsaW1pbmFkYS4uLlwiXG4gICAqICAgICAvLyBVc3VhcmlvIGVzIHJlZGlyaWdpZG8gYXV0b23DoXRpY2FtZW50ZSBhbCBsb2dpblxuICAgKiAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAqICAgICAvLyBNYW5lamFyIGVycm9yIChjb250cmFzZcOxYSBpbmNvcnJlY3RhLCBldGMpXG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgLyoqXG4gICAqIEVudsOtYSB1biBjw7NkaWdvIE9UUCBhbCBlbWFpbCBkZWwgdXN1YXJpbyBwYXJhIGNvbmZpcm1hciBsYSBlbGltaW5hY2nDs24uXG4gICAqIFNvbG8gYXBsaWNhIGEgdXN1YXJpb3MgT0F1dGggc2luIGNvbnRyYXNlw7FhIChgaGFzUGFzc3dvcmQoKSA9PT0gZmFsc2VgKS5cbiAgICovXG4gIHNlbmREZWxldGVBY2NvdW50Q29kZSgpOiBPYnNlcnZhYmxlPFNlbmREZWxldGVBY2NvdW50Q29kZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8U2VuZERlbGV0ZUFjY291bnRDb2RlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vYWNjb3VudC9kZWxldGUtY29kZWAsIHt9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbGltaW5hIGxhIGN1ZW50YSBkZWwgdXN1YXJpbyAoc29mdCBkZWxldGUpLlxuICAgKiAtIFVzdWFyaW9zIGNvbiBjb250cmFzZcOxYTogcGFzYXIgYHsgcGFzc3dvcmQgfWAuXG4gICAqIC0gVXN1YXJpb3MgT0F1dGggc2luIGNvbnRyYXNlw7FhOiBwYXNhciBgeyBjb2RlIH1gIChvYnRlbmlkbyB2aWEgc2VuZERlbGV0ZUFjY291bnRDb2RlKS5cbiAgICogRGVzcHXDqXMgZGUgZWxpbWluYXIsIGNpZXJyYSBzZXNpw7NuIHkgcmVkaXJpZ2UgYWwgbG9naW4gYXV0b23DoXRpY2FtZW50ZS5cbiAgICovXG4gIGRlbGV0ZUFjY291bnQoY3JlZGVudGlhbHM6IHtcbiAgICBwYXNzd29yZD86IHN0cmluZztcbiAgICBjb2RlPzogc3RyaW5nO1xuICB9KTogT2JzZXJ2YWJsZTxEZWxldGVBY2NvdW50UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZGVsZXRlPERlbGV0ZUFjY291bnRSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9hY2NvdW50YCwgeyBib2R5OiBjcmVkZW50aWFscyB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmRlbGV0ZWQpIHtcbiAgICAgICAgICAgIC8vIExpbXBpYXIgZXN0YWRvIHkgY2VycmFyIHNlc2nDs24gc2luIG5vdGlmaWNhciBhbCBiYWNrZW5kXG4gICAgICAgICAgICAvLyAobGEgc2VzacOzbiB5YSBmdWUgcmV2b2NhZGEgcG9yIGVsIGJhY2tlbmQpXG4gICAgICAgICAgICB0aGlzLnNpZ25PdXRGaXJlYmFzZSgpO1xuICAgICAgICAgICAgdGhpcy5jbGVhclN0YXRlKCk7XG4gICAgICAgICAgICB0aGlzLnN5bmNTZXJ2aWNlLmJyb2FkY2FzdCh7IHR5cGU6ICdMT0dPVVQnIH0pO1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuY29uZmlnPy5sb2dpblJvdXRlXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBFUk1JU09TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxvcyBwZXJtaXNvcyBhY3R1YWxpemFkb3MgZGVsIGJhY2tlbmQuXG4gICAqL1xuICBmZXRjaFBlcm1pc3Npb25zKCk6IE9ic2VydmFibGU8R2V0UGVybWlzc2lvbnNSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEdldFBlcm1pc3Npb25zUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vcGVybWlzc2lvbnNgKS5waXBlKFxuICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUGVybWlzc2lvbnMoXG4gICAgICAgICAgcmVzcG9uc2Uucm9sZXMsXG4gICAgICAgICAgcmVzcG9uc2UucGVybWlzc2lvbnMsXG4gICAgICAgICAgcmVzcG9uc2UuaXNTdXBlckFkbWluXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVBlcm1pc3Npb25zKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5zeW5jU2VydmljZS5icm9hZGNhc3QoeyB0eXBlOiAnUEVSTUlTU0lPTlNfVVBEQVRFJyB9KTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHRpZW5lIHVuIHBlcm1pc28gZXNwZWPDrWZpY28uXG4gICAqIEZvcm1hdG86IFwicmVzb3VyY2U6YWN0aW9uXCIgKGVqOiBcInRlbXBsYXRlczplZGl0XCIpXG4gICAqL1xuICBoYXNQZXJtaXNzaW9uKHBlcm1pc3Npb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzU3VwZXJBZG1pbigpKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IFtyZXNvdXJjZSwgYWN0aW9uXSA9IHBlcm1pc3Npb24uc3BsaXQoJzonKTtcbiAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9ucygpLnNvbWUocCA9PiB7XG4gICAgICBjb25zdCBbcFJlc291cmNlLCBwQWN0aW9uXSA9IHAuc3BsaXQoJzonKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChwUmVzb3VyY2UgPT09ICcqJyB8fCBwUmVzb3VyY2UgPT09IHJlc291cmNlKSAmJiAocEFjdGlvbiA9PT0gJyonIHx8IHBBY3Rpb24gPT09IGFjdGlvbilcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyB0aWVuZSBhbGd1bm8gZGUgbG9zIHBlcm1pc29zIGRhZG9zLlxuICAgKi9cbiAgaGFzQW55UGVybWlzc2lvbihwZXJtaXNzaW9uczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGVybWlzc2lvbnMuc29tZShwID0+IHRoaXMuaGFzUGVybWlzc2lvbihwKSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyB0aWVuZSB0b2RvcyBsb3MgcGVybWlzb3MgZGFkb3MuXG4gICAqL1xuICBoYXNBbGxQZXJtaXNzaW9ucyhwZXJtaXNzaW9uczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGVybWlzc2lvbnMuZXZlcnkocCA9PiB0aGlzLmhhc1Blcm1pc3Npb24ocCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gdGllbmUgdW4gcm9sIGVzcGVjw61maWNvLlxuICAgKi9cbiAgaGFzUm9sZShyb2xlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yb2xlcygpLnNvbWUociA9PiByLnRvTG93ZXJDYXNlKCkgPT09IHJvbGUudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSEFORExFIChVU0VSTkFNRSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEFjdHVhbGl6YSBlbCBoYW5kbGUgKEB1c2VybmFtZSkgZGVsIHVzdWFyaW8uXG4gICAqIEBwYXJhbSBoYW5kbGUgLSBOdWV2byBoYW5kbGUgKHNpbiBALCBlajogXCJ2aWN0b3J2XCIpXG4gICAqL1xuICB1cGRhdGVIYW5kbGUoaGFuZGxlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFVwZGF0ZUhhbmRsZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8VXBkYXRlSGFuZGxlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vcHJvZmlsZS9oYW5kbGVgLCB7IGhhbmRsZSB9KS5waXBlKFxuICAgICAgdGFwKCgpID0+IHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVByb2ZpbGVGaWVsZHMoeyBoYW5kbGUgfSkpLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSB1biBoYW5kbGUgZXN0w6EgZGlzcG9uaWJsZS5cbiAgICogQHBhcmFtIGhhbmRsZSAtIEhhbmRsZSBhIHZlcmlmaWNhciAoc2luIEApXG4gICAqL1xuICBjaGVja0hhbmRsZUF2YWlsYWJpbGl0eShoYW5kbGU6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hlY2tIYW5kbGVSZXNwb25zZT4ge1xuICAgIC8vIFNlcnZlciByZXNwb25zZTogeyBvcGVyYXRpb25JZCwgdXNlcj8sIGZvdW5kIH0uIGZvdW5kPXRydWUg4oaSIGhhbmRsZSB0YWtlbi5cbiAgICAvLyBMaWIgc2VtYW50aWM6IGF2YWlsYWJsZSA9ICFmb3VuZC5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZ2V0PHtcbiAgICAgICAgb3BlcmF0aW9uSWQ6IHN0cmluZztcbiAgICAgICAgZm91bmQ6IGJvb2xlYW47XG4gICAgICB9PihgJHt0aGlzLnVzZXJzQmFzZVVybH0vaGFuZGxlLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGhhbmRsZSl9YClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAocmF3ID0+ICh7XG4gICAgICAgICAgb3BlcmF0aW9uSWQ6IHJhdy5vcGVyYXRpb25JZCxcbiAgICAgICAgICBoYW5kbGUsXG4gICAgICAgICAgYXZhaWxhYmxlOiAhcmF3LmZvdW5kLFxuICAgICAgICB9KSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUklWQVRFIE1FVEhPRFNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSBnZXQgYmFzZVVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmNvbmZpZz8uYXBpVXJsfSR7dGhpcy5jb25maWc/LmF1dGhQcmVmaXh9YDtcbiAgfVxuXG4gIC8qKiBCYXNlIGZvciAvdjIvdXNlcnMgZW5kcG9pbnRzIChzZXBhcmF0ZSBmcm9tIC92Mi9hdXRoKS4gKi9cbiAgcHJpdmF0ZSBnZXQgdXNlcnNCYXNlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuY29uZmlnPy5hcGlVcmx9L3YyL3VzZXJzYDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlU3VjY2Vzc2Z1bEF1dGgocmVzcG9uc2U6IFNpZ25pblJlc3BvbnNlIHwgTUZBVmVyaWZ5UmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBleHBpcmVzQXQgPSBEYXRlLm5vdygpICsgcmVzcG9uc2UuZXhwaXJlc0luISAqIDEwMDA7XG4gICAgY29uc3QgdG9rZW5EYXRhID0gdGhpcy50b2tlblNlcnZpY2UucGFyc2VUb2tlbihyZXNwb25zZS5hY2Nlc3NUb2tlbiEpO1xuICAgIGNvbnN0IGlzUHJlbWl1bSA9IHRva2VuRGF0YT8ucHJlbWl1bSA9PT0gdHJ1ZTtcblxuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldEF1dGhlbnRpY2F0ZWQoe1xuICAgICAgYWNjZXNzVG9rZW46IHJlc3BvbnNlLmFjY2Vzc1Rva2VuISxcbiAgICAgIHJlZnJlc2hUb2tlbjogcmVzcG9uc2UucmVmcmVzaFRva2VuISxcbiAgICAgIHVzZXJJZDogdG9rZW5EYXRhPy51aWQsXG4gICAgICBlbWFpbDogdG9rZW5EYXRhPy5lbWFpbCxcbiAgICAgIHJvbGVzOiByZXNwb25zZS5yb2xlcyB8fCBbXSxcbiAgICAgIHBlcm1pc3Npb25zOiByZXNwb25zZS5wZXJtaXNzaW9ucyB8fCBbXSxcbiAgICAgIGlzU3VwZXJBZG1pbjogcmVzcG9uc2UucGVybWlzc2lvbnM/LmluY2x1ZGVzKCcqOionKSB8fCB0b2tlbkRhdGE/LmFkbWluID09PSB0cnVlIHx8IGZhbHNlLFxuICAgICAgaXNQcmVtaXVtLFxuICAgICAgZXhwaXJlc0F0LFxuICAgIH0pO1xuXG4gICAgaWYgKHRva2VuRGF0YT8ub3JnKSB7XG4gICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVBY3RpdmVPcmcodG9rZW5EYXRhLm9yZyk7XG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVBY3RpdmVPcmcodG9rZW5EYXRhLm9yZyk7XG4gICAgfVxuXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlU3RhdGUoe1xuICAgICAgYWNjZXNzVG9rZW46IHJlc3BvbnNlLmFjY2Vzc1Rva2VuISxcbiAgICAgIHJlZnJlc2hUb2tlbjogcmVzcG9uc2UucmVmcmVzaFRva2VuISxcbiAgICAgIHJvbGVzOiByZXNwb25zZS5yb2xlcyB8fCBbXSxcbiAgICAgIHBlcm1pc3Npb25zOiByZXNwb25zZS5wZXJtaXNzaW9ucyB8fCBbXSxcbiAgICAgIGlzU3VwZXJBZG1pbjogcmVzcG9uc2UucGVybWlzc2lvbnM/LmluY2x1ZGVzKCcqOionKSB8fCB0b2tlbkRhdGE/LmFkbWluID09PSB0cnVlIHx8IGZhbHNlLFxuICAgICAgaXNQcmVtaXVtLFxuICAgICAgZXhwaXJlc0F0LFxuICAgIH0pO1xuXG4gICAgdGhpcy5zdGFydFJlZnJlc2hUaW1lcigpO1xuICAgIHRoaXMuc3luY1NlcnZpY2UuYnJvYWRjYXN0KHsgdHlwZTogJ0xPR0lOJyB9KTtcblxuICAgIC8vIEludGVncmFjacOzbiBjb24gRmlyZWJhc2VcbiAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBoYW5kbGVTdWNjZXNzZnVsQXV0aCAtIEZpcmViYXNlIGNoZWNrOicsIHtcbiAgICAgIGVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb246IHRoaXMuY29uZmlnPy5lbmFibGVGaXJlYmFzZUludGVncmF0aW9uLFxuICAgICAgaGFzRmlyZWJhc2VUb2tlbjogISFyZXNwb25zZS5maXJlYmFzZVRva2VuLFxuICAgIH0pO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5jb25maWc/LmVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb24gJiZcbiAgICAgICdmaXJlYmFzZVRva2VuJyBpbiByZXNwb25zZSAmJlxuICAgICAgcmVzcG9uc2UuZmlyZWJhc2VUb2tlblxuICAgICkge1xuICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gQ2FsbGluZyBzaWduSW5XaXRoRmlyZWJhc2UnKTtcbiAgICAgIGF3YWl0IHRoaXMuc2lnbkluV2l0aEZpcmViYXNlKHJlc3BvbnNlLmZpcmViYXNlVG9rZW4pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWc/LmVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb24pIHtcbiAgICAgIC8vIEVsIGxvZ2luIE5PIHRyYWpvIGZpcmViYXNlVG9rZW4gKGVqLiBmbHVqbyBPQXV0aCBxdWUgbG8gcGVyZGnDsykuIEVuIHZlelxuICAgICAgLy8gZGUgcXVlZGFyIHNpbiBzZXNpw7NuIGRlIEZpcmViYXNlLCByZWN1cnJpbW9zIGFsIGZhbGxiYWNrIHNlbGYtaGVhbGluZzpcbiAgICAgIC8vIC9yZWZyZXNoIHPDrSBkZXZ1ZWx2ZSB1biBmaXJlYmFzZVRva2VuIGNvbmZpYWJsZS5cbiAgICAgIGNvbnNvbGUubG9nKCdbRkJBdXRoXSBsb2dpbiByZXNwb25zZSBzaW4gZmlyZWJhc2VUb2tlbiDihpIgcmVjdXJyaWVuZG8gYSBmYWxsYmFjayAvcmVmcmVzaCcpO1xuICAgICAgdm9pZCB0aGlzLnJlZXN0YWJsaXNoRmlyZWJhc2VWaWFSZWZyZXNoKCdsb2dpbi1taXNzaW5nLWZpcmViYXNlLXRva2VuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIEZpcmViYXNlIHNpZ25pbiBza2lwcGVkIC0gaW50ZWdyYWNpw7NuIEZpcmViYXNlIGRlc2FjdGl2YWRhJyk7XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0cm8gYXV0b23DoXRpY28gZGUgZGlzcG9zaXRpdm8gcGFyYSBwdXNoIG5vdGlmaWNhdGlvbnNcbiAgICBpZiAodGhpcy5jb25maWc/LmVuYWJsZURldmljZVJlZ2lzdHJhdGlvbikge1xuICAgICAgdGhpcy5yZWdpc3RlckRldmljZUlmTmVlZGVkKCk7IC8vIGZpcmUtYW5kLWZvcmdldFxuICAgIH1cblxuICAgIC8vIFNpbmNyb25pemFyIGlkaW9tYSBkZWwgdXN1YXJpbyBjb24gaTE4blxuICAgIGlmICh0aGlzLmkxOG5TZXJ2aWNlICYmICdsYW5ndWFnZScgaW4gcmVzcG9uc2UgJiYgcmVzcG9uc2UubGFuZ3VhZ2UpIHtcbiAgICAgIGNvbnN0IHVzZXJMYW5nID0gcmVzcG9uc2UubGFuZ3VhZ2UgYXMgSTE4bkxhbmc7XG4gICAgICBjb25zdCBjdXJyZW50TGFuZyA9IHRoaXMuaTE4blNlcnZpY2UubGFuZygpO1xuICAgICAgaWYgKHVzZXJMYW5nICE9PSBjdXJyZW50TGFuZykge1xuICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnNldExhbmd1YWdlKHVzZXJMYW5nKTtcbiAgICAgICAgY29uc29sZS5sb2coYFtWYWx0ZWNoQXV0aF0gTGFuZ3VhZ2Ugc3luY2VkIHRvOiAke3VzZXJMYW5nfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExpc3RlbmVyIEZpcmVzdG9yZSBSQkFDIOKAlCBvcHQtaW4gdmlhIGVuYWJsZUZpcmVzdG9yZVJCQUM6IHRydWVcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLnN0YXRlU2VydmljZS5zdGF0ZSgpLnVzZXJJZDtcbiAgICBpZiAodXNlcklkKSB7XG4gICAgICB0aGlzLnNldHVwRmlyZXN0b3JlUkJBQ1N5bmModXNlcklkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFyU3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUmVmcmVzaFRpbWVyKCk7XG4gICAgdGhpcy50ZWFyZG93bkZpcmVzdG9yZVJCQUNTeW5jKCk7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UucmVzZXQoKTtcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmNsZWFyKCk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwRmlyZXN0b3JlUkJBQ1N5bmModXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVGaXJlc3RvcmVSQkFDIHx8ICF0aGlzLmZpcmVzdG9yZUluc3RhbmNlKSByZXR1cm47XG4gICAgdGhpcy50ZWFyZG93bkZpcmVzdG9yZVJCQUNTeW5jKCk7XG5cbiAgICBpZiAoIXRoaXMuZmlyZWJhc2VTZXJ2aWNlIHx8IHRoaXMuZmlyZWJhc2VTZXJ2aWNlLmZpcmViYXNlQXV0aFJlYWR5KCkpIHtcbiAgICAgIC8vIEZpcmViYXNlIG5vdCB1c2VkIG9yIGFscmVhZHkgYXV0aGVudGljYXRlZCDigJQgYXR0YWNoIGxpc3RlbmVyIG5vdy5cbiAgICAgIHRoaXMuX2F0dGFjaEZpcmVzdG9yZVJCQUNMaXN0ZW5lcih1c2VySWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaXJlYmFzZSBBdXRoIG5vdCByZWFkeSB5ZXQuIEZpcmVzdG9yZSBwZXJtaXNzaW9uLWRlbmllZCBlcnJvcnMgdGVybWluYXRlXG4gICAgICAvLyBvblNuYXBzaG90IHBlcm1hbmVudGx5IChubyBhdXRvbWF0aWMgcmV0cnkgd2hlbiBhdXRoIHN0YXRlIGNoYW5nZXMpLlxuICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkLCB0aGVuIGF0dGFjaC5cbiAgICAgIHRoaXMuZmlyZWJhc2VTZXJ2aWNlLmZpcmViYXNlQXV0aFJlYWR5JFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIocmVhZHkgPT4gcmVhZHkpLFxuICAgICAgICAgIHRha2UoMSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2F0dGFjaEZpcmVzdG9yZVJCQUNMaXN0ZW5lcih1c2VySWQpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hdHRhY2hGaXJlc3RvcmVSQkFDTGlzdGVuZXIodXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkb2NSZWYgPSBkb2ModGhpcy5maXJlc3RvcmVJbnN0YW5jZSEsICd1c2VycycsIHVzZXJJZCk7XG4gICAgdGhpcy5maXJlc3RvcmVSQkFDVW5zdWJzY3JpYmUgPSBvblNuYXBzaG90KGRvY1JlZiwgc25hcCA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gc25hcC5kYXRhKCk7XG4gICAgICBpZiAoIWRhdGEpIHJldHVybjtcblxuICAgICAgLy8gU3luYyBkZSBwZXJmaWwg4oCUIGVsIG1pcnJvciBGaXJlc3RvcmUgYC91c2Vycy97dWlkfWAgZXMgZWwgZXNwZWpvIGNhbsOzbmljb1xuICAgICAgLy8gcXVlIGVsIGJhY2tlbmQgZXNjcmliZSAoYFN5bmNQcm9maWxlVG9GaXJlc3RvcmVgKS4gUmVmcmVzY2FyIGFjw6EgbWFudGllbmVcbiAgICAgIC8vIGBhdXRoLnVzZXIoKWAgVklWTyAoYXZhdGFyIGRlbCBoZWFkZXIsIGdyZWV0aW5nLCBldGMuKSBzaW4gZGVwZW5kZXIgZGUgdW5cbiAgICAgIC8vIGBnZXRQcm9maWxlKClgIG1hbnVhbDogZWRpdGFyIGVsIHBlcmZpbCBlbiB1bmEgdmlzdGEgc2UgcmVmbGVqYSBlbiB0b2Rhc1xuICAgICAgLy8gKGhvbWUgaW5jbHVpZG8pIGVuIGN1YW50byBlbCBiYWNrZW5kIGFjdHVhbGl6YSBlbCBtaXJyb3IuXG4gICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVQcm9maWxlRmllbGRzKHtcbiAgICAgICAgbmFtZTogZGF0YVsnbmFtZSddID8/IHVuZGVmaW5lZCxcbiAgICAgICAgaGFuZGxlOiBkYXRhWydoYW5kbGUnXSA/PyB1bmRlZmluZWQsXG4gICAgICAgIGF2YXRhclVybDogZGF0YVsnYXZhdGFyVXJsJ10gPz8gdW5kZWZpbmVkLFxuICAgICAgICBwaG9uZTogZGF0YVsncGhvbmUnXSA/PyB1bmRlZmluZWQsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmJhYyA9IGRhdGFbJ3JiYWMnXTtcbiAgICAgIGlmICghcmJhYykgcmV0dXJuO1xuICAgICAgY29uc3QgYWN0aXZlT3JnID0gdGhpcy5zdGF0ZVNlcnZpY2Uuc3RhdGUoKS5hY3RpdmVPcmc7XG4gICAgICBpZiAocmJhY1snYWN0aXZlT3JnJ10gJiYgcmJhY1snYWN0aXZlT3JnJ10gIT09IGFjdGl2ZU9yZykgcmV0dXJuO1xuICAgICAgY29uc3Qgcm9sZXM6IHN0cmluZ1tdID0gcmJhY1sncm9sZXMnXSA/PyBbXTtcbiAgICAgIGNvbnN0IHBlcm1pc3Npb25zOiBzdHJpbmdbXSA9IHJiYWNbJ3Blcm1pc3Npb25zJ10gPz8gW107XG4gICAgICAvLyBQcmVzZXJ2ZSBwbGF0Zm9ybSBhZG1pbiBzdGF0dXMgZnJvbSBKV1Qg4oCUIEZpcmVzdG9yZSBSQkFDIHJlZmxlY3RzIG9yZy1sZXZlbFxuICAgICAgLy8gcGVybWlzc2lvbnMgd2hpY2ggZG9uJ3QgaW5jbHVkZSAqOiogZm9yIG9yZ3MgdGhlIGFkbWluIGRvZXNuJ3Qgb3duLlxuICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLnN0YXRlU2VydmljZS5hY2Nlc3NUb2tlbigpO1xuICAgICAgY29uc3Qgand0QWRtaW4gPSB0b2tlbiA/IHRoaXMudG9rZW5TZXJ2aWNlLnBhcnNlVG9rZW4odG9rZW4pPy5hZG1pbiA9PT0gdHJ1ZSA6IGZhbHNlO1xuICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUGVybWlzc2lvbnMoXG4gICAgICAgIHJvbGVzLFxuICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgcGVybWlzc2lvbnMuaW5jbHVkZXMoJyo6KicpIHx8IGp3dEFkbWluXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB0ZWFyZG93bkZpcmVzdG9yZVJCQUNTeW5jKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZpcmVzdG9yZVJCQUNVbnN1YnNjcmliZSkge1xuICAgICAgdGhpcy5maXJlc3RvcmVSQkFDVW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuZmlyZXN0b3JlUkJBQ1Vuc3Vic2NyaWJlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0UmVmcmVzaFRpbWVyKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFJlZnJlc2hUaW1lcigpO1xuXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0YXRlU2VydmljZS5zdGF0ZSgpO1xuICAgIGlmICghc3RhdGUuZXhwaXJlc0F0KSByZXR1cm47XG5cbiAgICBjb25zdCByZWZyZXNoQmVmb3JlTXMgPSAodGhpcy5jb25maWc/LnJlZnJlc2hCZWZvcmVFeHBpcnkgfHwgNjApICogMTAwMDtcbiAgICBjb25zdCByZWZyZXNoQXQgPSBzdGF0ZS5leHBpcmVzQXQgLSByZWZyZXNoQmVmb3JlTXM7XG4gICAgY29uc3QgZGVsYXkgPSByZWZyZXNoQXQgLSBEYXRlLm5vdygpO1xuXG4gICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgdGhpcy5yZWZyZXNoVGltZXJJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpLnN1YnNjcmliZSh7XG4gICAgICAgICAgZXJyb3I6ICgpID0+IHRoaXMubG9nb3V0KCksXG4gICAgICAgIH0pO1xuICAgICAgfSwgZGVsYXkpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUucmVmcmVzaFRva2VuKSB7XG4gICAgICAvLyBUb2tlbiB5YSBkZWJlcsOtYSByZWZyZXNjYXJzZSwgaW50ZW50YXIgYWhvcmFcbiAgICAgIHRoaXMucmVmcmVzaEFjY2Vzc1Rva2VuKCkuc3Vic2NyaWJlKHtcbiAgICAgICAgZXJyb3I6ICgpID0+IHRoaXMubG9nb3V0KCksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0b3BSZWZyZXNoVGltZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVmcmVzaFRpbWVySWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlZnJlc2hUaW1lcklkKTtcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVySWQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU3luY0V2ZW50KGV2ZW50OiBBdXRoU3luY0V2ZW50KTogdm9pZCB7XG4gICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICBjYXNlICdMT0dJTic6IHtcbiAgICAgICAgLy8gUmVjYXJnYXIgZXN0YWRvIGRlc2RlIHN0b3JhZ2VcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmxvYWRTdGF0ZSgpO1xuICAgICAgICBpZiAoc3RhdGUuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5yZXN0b3JlRnJvbVN0b3JhZ2Uoc3RhdGUpO1xuICAgICAgICAgIGNvbnN0IGNsYWltcyA9IHRoaXMudG9rZW5TZXJ2aWNlLnBhcnNlVG9rZW4oc3RhdGUuYWNjZXNzVG9rZW4pO1xuICAgICAgICAgIGlmIChjbGFpbXMpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVVzZXJJbmZvKGNsYWltcy51aWQsIGNsYWltcy5lbWFpbCk7XG4gICAgICAgICAgICBpZiAoY2xhaW1zLm9yZykge1xuICAgICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVBY3RpdmVPcmcoY2xhaW1zLm9yZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc3RhcnRSZWZyZXNoVGltZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1RPS0VOX1JFRlJFU0gnOiB7XG4gICAgICAgIC8vIFJlY2FyZ2FyIGNyZWRlbmNpYWxlcyBkZXNkZSBzdG9yYWdlIHNvbG8gc2kgY29ycmVzcG9uZGVuIGEgbGEgbWlzbWFcbiAgICAgICAgLy8gb3JnIGRlIGVzdGEgcGVzdGHDsWEuIEVsIGFjY2VzcyB0b2tlbiBlc3TDoSBlbiBsb2NhbFN0b3JhZ2UgeSBvdHJhXG4gICAgICAgIC8vIHBlc3Rhw7FhIHB1ZWRlIHJlZnJlc2NhciBlbiB1bmEgb3JnIGRpc3RpbnRhOyBlc28gTk8gZGViZSBjYW1iaWFyIGVsXG4gICAgICAgIC8vIGNvbnRleHRvIHZpc2libGUgYWN0dWFsLiBQYXJhIGNhbWJpYXIgb3JnIGV4aXN0ZSBPUkdfU1dJVENILlxuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZFN0YXRlKCk7XG4gICAgICAgIGlmIChzdGF0ZS5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgIGNvbnN0IGNsYWltcyA9IHRoaXMudG9rZW5TZXJ2aWNlLnBhcnNlVG9rZW4oc3RhdGUuYWNjZXNzVG9rZW4pO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRPcmcgPVxuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc3RhdGUoKS5hY3RpdmVPcmcgfHwgdGhpcy5zdG9yYWdlU2VydmljZS5nZXRBY3RpdmVPcmcoKTtcbiAgICAgICAgICBpZiAoY3VycmVudE9yZyAmJiBjbGFpbXM/Lm9yZyAmJiBjbGFpbXMub3JnICE9PSBjdXJyZW50T3JnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgYFtWYWx0ZWNoQXV0aF0gc3luYyDigJQgaWdub3JpbmcgVE9LRU5fUkVGUkVTSCBmb3Igb3JnICR7Y2xhaW1zLm9yZ307IGN1cnJlbnQgdGFiIG9yZyBpcyAke2N1cnJlbnRPcmd9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5yZXN0b3JlRnJvbVN0b3JhZ2Uoc3RhdGUpO1xuICAgICAgICAgIGlmIChjbGFpbXMpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVVzZXJJbmZvKGNsYWltcy51aWQsIGNsYWltcy5lbWFpbCk7XG4gICAgICAgICAgICBpZiAoY2xhaW1zLm9yZykge1xuICAgICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVBY3RpdmVPcmcoY2xhaW1zLm9yZyk7XG4gICAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZUFjdGl2ZU9yZyhjbGFpbXMub3JnLCB7IHBlcnNpc3RQcmVmZXJyZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnN0YXJ0UmVmcmVzaFRpbWVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdMT0dPVVQnOlxuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5yZXNldCgpO1xuICAgICAgICB0aGlzLnN0b3BSZWZyZXNoVGltZXIoKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzQ3VycmVudFJvdXRlUHVibGljKCkpIHtcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5jb25maWc/LmxvZ2luUm91dGVdKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1BFUk1JU1NJT05TX1VQREFURSc6IHtcbiAgICAgICAgY29uc3QgcGVybXMgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmxvYWRQZXJtaXNzaW9ucygpO1xuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVQZXJtaXNzaW9ucyhwZXJtcy5yb2xlcywgcGVybXMucGVybWlzc2lvbnMsIHBlcm1zLmlzU3VwZXJBZG1pbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnT1JHX1NXSVRDSCc6XG4gICAgICAgIC8vIE90cmEgcGVzdGHDsWEgY2FtYmnDsyBkZSBvcmdhbml6YWNpw7NuLiBObyByZWNhcmdhbW9zIGxhIFVSTCBhY3R1YWw6XG4gICAgICAgIC8vIHB1ZWRlIHNlciB1bmEgcnV0YSBvcmctc2NvcGVkIChldmVudHMvOmlkLCBzZXR0aW5ncyBkZSB1bmEgb3JnLCBldGMuKVxuICAgICAgICAvLyBxdWUgcXVlZGEgaW52w6FsaWRhIGJham8gbGEgbnVldmEgb3JnLiBWb2x2ZW1vcyBhIGxhIGhvbWUgYXV0ZW50aWNhZGEuXG4gICAgICAgIGlmICghdGhpcy5pc0N1cnJlbnRSb3V0ZVB1YmxpYygpKSB7XG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLmNvbmZpZz8uaG9tZVJvdXRlIHx8ICcvJywgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdXRhcyBww7pibGljYXMgY29tcGFydGlibGVzIG5vIGRlYmVuIHNlciBzZWN1ZXN0cmFkYXMgcG9yIGV2ZW50b3MgZ2xvYmFsZXNcbiAgICogZGUgc2VzacOzbi4gVW4gbG9nb3V0IGVuIG90cmEgcGVzdGHDsWEgbm8gZGViZSBtYW5kYXIgYSBgL2xvZ2luYCBhIGFsZ3VpZW4gcXVlXG4gICAqIGVzdMOhIGNvbXByYW5kbyBwb3IgYC9idXkvOnRva2VuYCwgbmkgcm9tcGVyIHVuIGxpbmsgZGUgdmVuZGVkb3IuXG4gICAqL1xuICBwcml2YXRlIGlzQ3VycmVudFJvdXRlUHVibGljKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHByZWZpeGVzID0gdGhpcy5jb25maWc/LnB1YmxpY1JvdXRlUHJlZml4ZXMgPz8gW107XG4gICAgaWYgKHByZWZpeGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucm91dGVyLnVybCB8fCAnLyc7XG4gICAgY29uc3QgcGF0aCA9IGN1cnJlbnQuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdIHx8ICcvJztcbiAgICByZXR1cm4gcHJlZml4ZXMuc29tZShwcmVmaXggPT4ge1xuICAgICAgaWYgKCFwcmVmaXgpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBwcmVmaXguc3RhcnRzV2l0aCgnLycpID8gcHJlZml4IDogYC8ke3ByZWZpeH1gO1xuICAgICAgcmV0dXJuIHBhdGggPT09IG5vcm1hbGl6ZWQgfHwgcGF0aC5zdGFydHNXaXRoKGAke25vcm1hbGl6ZWR9L2ApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVBdXRoRXJyb3IoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKTogT2JzZXJ2YWJsZTxuZXZlcj4ge1xuICAgIC8vIGBpbnRlcnByZXRFcnJvcmAgKGhlbHBlciBjb21wYXJ0aWRvIGRlIGxhIGxpYikgbm9ybWFsaXphIGVsXG4gICAgLy8gSHR0cEVycm9yUmVzcG9uc2Ug4oCUIGluY2x1eWVuZG8gZmFsbG9zIGRlIHJlZCAoc3RhdHVzIDApLiBBcGxhbmFtb3MgYVxuICAgIC8vIEF1dGhFcnJvciBwYXJhIG1hbnRlbmVyIGxhIEFQSSBww7pibGljYSBkZSBBdXRoU2VydmljZSBlc3RhYmxlLlxuICAgIGNvbnN0IGludGVycHJldGVkID0gaW50ZXJwcmV0RXJyb3IoZXJyb3IpO1xuICAgIGNvbnN0IGF1dGhFcnJvcjogQXV0aEVycm9yID0ge1xuICAgICAgY29kZTogaW50ZXJwcmV0ZWQuY29kZSxcbiAgICAgIG1lc3NhZ2U6IGludGVycHJldGVkLm1lc3NhZ2UsXG4gICAgfTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRFcnJvcihhdXRoRXJyb3IpO1xuICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGF1dGhFcnJvcik7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRklSRUJBU0UgSU5URUdSQVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSBhc3luYyBzaWduSW5XaXRoRmlyZWJhc2UoZmlyZWJhc2VUb2tlbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgW0ZCQXV0aF0gYXV0aCBmbG93IC0+IHNpZ25JbldpdGhGaXJlYmFzZSBhdHRlbXB0IGAgK1xuICAgICAgICBgZmlyZWJhc2VTZXJ2aWNlUHJlc2VudD0keyEhdGhpcy5maXJlYmFzZVNlcnZpY2V9YFxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmZpcmViYXNlU2VydmljZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmZpcmViYXNlU2VydmljZS5zaWduSW5XaXRoQ3VzdG9tVG9rZW4oZmlyZWJhc2VUb2tlbik7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIEZpcmViYXNlIHNpZ25pbiBzdWNjZXNzZnVsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ1tWYWx0ZWNoQXV0aF0gRmlyZWJhc2VTZXJ2aWNlIG5vdCBwcm92aWRlZC4gQWRkIHByb3ZpZGVWYWx0ZWNoRmlyZWJhc2UoKSB0byB5b3VyIHByb3ZpZGVycy4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIE5vIGJsb3F1ZWFyIGVsIGxvZ2luIHByaW5jaXBhbCBzaSBGaXJlYmFzZSBmYWxsYVxuICAgICAgY29uc29sZS5lcnJvcignW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZSBzaWduaW4gZmFpbGVkOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNpZ25PdXRGaXJlYmFzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVGaXJlYmFzZUludGVncmF0aW9uKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuZmlyZWJhc2VTZXJ2aWNlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmlyZWJhc2VTZXJ2aWNlLnNpZ25PdXQoKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gRmlyZWJhc2Ugc2lnbm91dCBzdWNjZXNzZnVsJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElnbm9yYXIgZXJyb3JlcyBkZSBGaXJlYmFzZSBzaWdub3V0XG4gICAgICBjb25zb2xlLndhcm4oJ1tWYWx0ZWNoQXV0aF0gRmlyZWJhc2Ugc2lnbm91dCBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1lc3RhYmxlY2UgbGEgc2VzacOzbiBkZSBGaXJlYmFzZSBBdXRoIGVuIGVsIGJvb3RzdHJhcCBkZSBsYSBhcHAgY3VhbmRvXG4gICAqIGVsIGFjY2VzcyB0b2tlbiBkZSBsYSBhcHAgc2lndWUgdsOhbGlkbyAobGEgcmFtYSBkZSBpbml0aWFsaXplKCkgcXVlIE5PXG4gICAqIHBhc2EgcG9yIHJlZnJlc2gpLlxuICAgKlxuICAgKiBGaXJlYmFzZSBBdXRoIG1hbnRpZW5lIHN1IFBST1BJQSBzZXNpw7NuIGNvbiBwZXJzaXN0ZW5jaWEgSW5kZXhlZERCXG4gICAqIGluZGVwZW5kaWVudGUgZGVsIHN0b3JhZ2UgZGUgdG9rZW5zIGRlIGxhIGFwcC4gRW4gdW4gbmF2ZWdhZG9yIG5vcm1hbCBlc2FcbiAgICogcGVyc2lzdGVuY2lhIHNlIGF1dG8tcmVzdGF1cmEgc29sYTsgZW4gdW5hIFBXQSBzdGFuZGFsb25lIGVuIGlPUyBlbFxuICAgKiBjb250ZW5lZG9yIGRlIHN0b3JhZ2Ugbm8gc29icmV2aXZlLCB5IGBmaXJlYmFzZUF1dGhSZWFkeWAgc2UgcXVlZGEgZW5cbiAgICogYGZhbHNlYCBpbmRlZmluaWRhbWVudGUg4oaSIGxvcyBsaXN0ZW5lcnMgRmlyZXN0b3JlIGN1ZWxnYW4gKH40MHMgdGltZW91dCkuXG4gICAqXG4gICAqIEVzdHJhdGVnaWE6IGRhciB1bmEgdmVudGFuYSBjb3J0YSBhIGxhIGF1dG8tcmVzdGF1cmFjacOzbiBkZSBGaXJlYmFzZSB5LCBzaVxuICAgKiBubyBvY3VycmUsIGZvcnphciB1biBgcmVmcmVzaEFjY2Vzc1Rva2VuKClgIOKAlCBxdWUgeWEgaGFjZSBgc2lnbkluV2l0aEZpcmViYXNlYFxuICAgKiBjb24gZWwgYGZpcmViYXNlVG9rZW5gIHF1ZSBkZXZ1ZWx2ZSBgL3JlZnJlc2hgLlxuICAgKlxuICAgKiBGaXJlLWFuZC1mb3JnZXQ6IHNlIGludm9jYSBjb24gYHZvaWRgIHBhcmEgbm8gZGVtb3JhciBgaW5pdGlhbGl6ZSgpYC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlRmlyZWJhc2VTZXNzaW9uT25Cb290c3RyYXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZz8uZW5hYmxlRmlyZWJhc2VJbnRlZ3JhdGlvbiB8fCAhdGhpcy5maXJlYmFzZVNlcnZpY2UpIHJldHVybjtcblxuICAgIC8vIERhciBhIGxhIHBlcnNpc3RlbmNpYSBJbmRleGVkREIgcHJvcGlhIGRlIEZpcmViYXNlIEF1dGggdW5hIG9wb3J0dW5pZGFkXG4gICAgLy8gZGUgYXV0by1yZXN0YXVyYXJzZSAobmF2ZWdhZG9yIG5vcm1hbCkuIEVuIHVuYSBQV0Egc3RhbmRhbG9uZSBkZSBpT1NcbiAgICAvLyBub3JtYWxtZW50ZSBOTyBsbyBoYXLDoS5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgMjUwMCkpO1xuXG4gICAgaWYgKHRoaXMuZmlyZWJhc2VTZXJ2aWNlLmZpcmViYXNlQXV0aFJlYWR5KCkpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbRkJBdXRoXSBib290c3RyYXAg4oCUIEZpcmViYXNlIHNlc3Npb24gcmVzdG9yZWQgb24gaXRzIG93bicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgJ1tGQkF1dGhdIGJvb3RzdHJhcCDigJQgc2Vzc2lvbiB2YWxpZCBidXQgRmlyZWJhc2UgTk9UIHJlYWR5IOKGkiByZWN1cnJpZW5kbyBhIGZhbGxiYWNrJ1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5yZWVzdGFibGlzaEZpcmViYXNlVmlhUmVmcmVzaCgnYm9vdHN0cmFwLXNlc3Npb24tcmVzdG9yZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhbGxiYWNrIHNlbGYtaGVhbGluZyBkZSBGaXJlYmFzZSBBdXRoLiBQaWRlIHVuIGZpcmViYXNlVG9rZW4gZnJlc2NvIHbDrWFcbiAgICogYC9yZWZyZXNoYCAocXVlIHPDrSBsbyBkZXZ1ZWx2ZSBkZSBmb3JtYSBjb25maWFibGUpIHksIGVuIMOpeGl0byxcbiAgICogYHJlZnJlc2hBY2Nlc3NUb2tlbigpYCB5YSBlamVjdXRhIGBzaWduSW5XaXRoRmlyZWJhc2UoKWAuXG4gICAqXG4gICAqIFNlIGludm9jYSBjdWFuZG8gdW4gcGF0aCBkZSBhdXRoIGRlasOzIGxhIHNlc2nDs24gZGUgRmlyZWJhc2Ugc2luIGVzdGFibGVjZXI6XG4gICAqICAtIGxvZ2luIE9BdXRoL3Bhc3N3b3JkIHF1ZSB2b2x2acOzIHNpbiBgZmlyZWJhc2VUb2tlbmAsXG4gICAqICAtIGNvbGQgbGF1bmNoIGRlIFBXQSBpT1Mgc2luIHBlcnNpc3RlbmNpYSBkZSBGaXJlYmFzZS5cbiAgICpcbiAgICogYHJlYXNvbmAgYXBhcmVjZSBlbiBsb3MgbG9ncyBgW0ZCQXV0aF0gZmFsbGJhY2tgIHBhcmEgcG9kZXIgYXRlc3RpZ3VhclxuICAgKiBkZXNkZSBlbCBkZWJ1Zy1jb25zb2xlIHF1w6kgZGlzcGFyw7MgZWwgZmFsbGJhY2suXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZXN0YWJsaXNoRmlyZWJhc2VWaWFSZWZyZXNoKHJlYXNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZz8uZW5hYmxlRmlyZWJhc2VJbnRlZ3JhdGlvbiB8fCAhdGhpcy5maXJlYmFzZVNlcnZpY2UpIHJldHVybjtcblxuICAgIGNvbnNvbGUubG9nKGBbRkJBdXRoXSBmYWxsYmFjayDigJQgcmUtZXN0YWJsZWNpZW5kbyBGaXJlYmFzZSB2w61hIC9yZWZyZXNoIChtb3Rpdm86ICR7cmVhc29ufSlgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKSk7XG4gICAgICBjb25zb2xlLmxvZyhgW0ZCQXV0aF0gZmFsbGJhY2sg4oCUIC9yZWZyZXNoIE9LLCBGaXJlYmFzZSByZS1lc3RhYmxlY2lkbyAobW90aXZvOiAke3JlYXNvbn0pYCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKGBbRkJBdXRoXSBmYWxsYmFjayDigJQgL3JlZnJlc2ggZmFsbMOzIChtb3Rpdm86ICR7cmVhc29ufSk6YCwgZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIERFVklDRSBSRUdJU1RSQVRJT04gKFB1c2ggTm90aWZpY2F0aW9ucylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFNvbGljaXRhIHBlcm1pc29zIGRlIG5vdGlmaWNhY2nDs24geSByZWdpc3RyYSBlbCBkaXNwb3NpdGl2by5cbiAgICogVXNhciBjdWFuZG8gZWwgdXN1YXJpbyBhY2VwdGEgcmVjaWJpciBub3RpZmljYWNpb25lcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhc3luYyBvbkVuYWJsZU5vdGlmaWNhdGlvbnMoKSB7XG4gICAqICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLmVuYWJsZU5vdGlmaWNhdGlvbnMoKTtcbiAgICogICBpZiAocmVzdWx0LmdyYW50ZWQpIHtcbiAgICogICAgIGNvbnNvbGUubG9nKCdOb3RpZmljYWNpb25lcyBoYWJpbGl0YWRhcycpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGVuYWJsZU5vdGlmaWNhdGlvbnMoKTogUHJvbWlzZTxFbmFibGVOb3RpZmljYXRpb25zUmVzdWx0PiB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2luZ1NlcnZpY2UpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBNZXNzYWdpbmdTZXJ2aWNlIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIHJldHVybiB7IGdyYW50ZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKCEoYXdhaXQgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmlzU3VwcG9ydGVkKCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tWYWx0ZWNoQXV0aF0gUHVzaCBub3RpZmljYXRpb25zIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgIHJldHVybiB7IGdyYW50ZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UucmVxdWVzdFBlcm1pc3Npb24oKTtcbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICByZXR1cm4geyBncmFudGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIC8vIFJlZ2lzdHJhciBkaXNwb3NpdGl2byBlbiBiYWNrZW5kXG4gICAgY29uc3QgcmVnaXN0ZXJlZCA9IGF3YWl0IHRoaXMucmVnaXN0ZXJEZXZpY2VJZk5lZWRlZCgpO1xuXG4gICAgcmV0dXJuIHsgZ3JhbnRlZDogdHJ1ZSwgdG9rZW4sIHJlZ2lzdGVyZWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNhY3RpdmEgbGFzIG5vdGlmaWNhY2lvbmVzIHBhcmEgZXN0ZSBkaXNwb3NpdGl2by5cbiAgICogRWxpbWluYSBlbCB0b2tlbiBkZWwgYmFja2VuZCB5IGRlIEZDTS5cbiAgICogVXNhciBkZXNkZSB1biB0b2dnbGUgZGUgcHJlZmVyZW5jaWFzIGN1YW5kbyBlbCB1c3VhcmlvIGRlc2FjdGl2YSBub3RpZmljYWNpb25lcy5cbiAgICpcbiAgICogTk9UQTogRXN0byBOTyByZXZvY2EgZWwgcGVybWlzbyBkZWwgbmF2ZWdhZG9yIChlbCB1c3VhcmlvIGRlYmUgaGFjZXJsbyBtYW51YWxtZW50ZVxuICAgKiBkZXNkZSBsYSBjb25maWd1cmFjacOzbiBkZWwgbmF2ZWdhZG9yKS4gU29sbyBlbGltaW5hIGVsIHJlZ2lzdHJvIGRlbCBkaXNwb3NpdGl2by5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhc3luYyBvblRvZ2dsZU5vdGlmaWNhdGlvbnMoZW5hYmxlZDogYm9vbGVhbikge1xuICAgKiAgIGlmIChlbmFibGVkKSB7XG4gICAqICAgICBhd2FpdCB0aGlzLmF1dGguZW5hYmxlTm90aWZpY2F0aW9ucygpO1xuICAgKiAgIH0gZWxzZSB7XG4gICAqICAgICBhd2FpdCB0aGlzLmF1dGguZGlzYWJsZU5vdGlmaWNhdGlvbnMoKTtcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBkaXNhYmxlTm90aWZpY2F0aW9ucygpOiBQcm9taXNlPHsgZGlzYWJsZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGlmICghdGhpcy5tZXNzYWdpbmdTZXJ2aWNlKSB7XG4gICAgICByZXR1cm4geyBkaXNhYmxlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuY3VycmVudFRva2VuO1xuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIC8vIEVsaW1pbmFyIGRlbCBiYWNrZW5kXG4gICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICAgIHRoaXMuaHR0cFxuICAgICAgICAgICAgLnJlcXVlc3QoJ0RFTEVURScsIGAke3RoaXMuY29uZmlnPy5hcGlVcmx9L3YyL3VzZXJzL21lL2RldmljZXMvYnktdG9rZW5gLCB7XG4gICAgICAgICAgICAgIGJvZHk6IHsgdG9rZW4gfSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSlcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBFbGltaW5hciB0b2tlbiBkZSBGQ01cbiAgICAgICAgYXdhaXQgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmRlbGV0ZVRva2VuKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIE5vdGlmaWNhdGlvbnMgZGlzYWJsZWQnKTtcbiAgICAgICAgcmV0dXJuIHsgZGlzYWJsZWQ6IHRydWUgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgZGlzYWJsZWQ6IGZhbHNlIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBGYWlsZWQgdG8gZGlzYWJsZSBub3RpZmljYXRpb25zOicsIGVycm9yKTtcbiAgICAgIHJldHVybiB7IGRpc2FibGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRvcm5hIGVsIGVzdGFkbyBhY3R1YWwgZGUgcGVybWlzb3MgZGUgbm90aWZpY2FjacOzbi5cbiAgICpcbiAgICogQHJldHVybnMgJ2dyYW50ZWQnIHwgJ2RlbmllZCcgfCAnZGVmYXVsdCcgfCAndW5zdXBwb3J0ZWQnXG4gICAqL1xuICBnZXROb3RpZmljYXRpb25QZXJtaXNzaW9uU3RhdGUoKTogTm90aWZpY2F0aW9uUGVybWlzc2lvblN0YXRlIHtcbiAgICBpZiAoIXRoaXMubWVzc2FnaW5nU2VydmljZSkge1xuICAgICAgcmV0dXJuICd1bnN1cHBvcnRlZCc7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZ2V0UGVybWlzc2lvblN0YXRlKCkgYXMgTm90aWZpY2F0aW9uUGVybWlzc2lvblN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdHJhIG1hbnVhbG1lbnRlIGVsIGRpc3Bvc2l0aXZvIGVuIGVsIGJhY2tlbmQuXG4gICAqIMOadGlsIHBhcmEgc2luY3Jvbml6YXIgZGlzcG9zaXRpdm9zIHF1ZSB0aWVuZW4gdG9rZW4gRkNNIHBlcm8gbm8gZXN0w6FuIHJlZ2lzdHJhZG9zLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZWRUb2tlbiBUb2tlbiBGQ00gb3BjaW9uYWwuIFNpIHNlIHByb3BvcmNpb25hLCBzZSB1c2EgZGlyZWN0YW1lbnRlXG4gICAqICAgICAgICAgICAgICAgICAgICAgIHNpbiBkZXBlbmRlciBkZWwgTWVzc2FnaW5nU2VydmljZSAoZXZpdGEgdGltaW5nIGlzc3VlcykuXG4gICAqIEByZXR1cm5zIFJlc3VsdGFkbyBkZWwgcmVnaXN0cm8gY29uIGRldmljZUlkIHNpIGZ1ZSBleGl0b3NvXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gU2luY3Jvbml6YXIgY29uIHRva2VuIGV4aXN0ZW50ZSAocmVjb21lbmRhZG8pXG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5yZWdpc3RlckRldmljZShteVRva2VuKTtcbiAgICpcbiAgICogLy8gU2luIHRva2VuLCBpbnRlbnRhcsOhIG9idGVuZXJsbyBkZWwgTWVzc2FnaW5nU2VydmljZVxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgucmVnaXN0ZXJEZXZpY2UoKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZWdpc3RlckRldmljZShwcm92aWRlZFRva2VuPzogc3RyaW5nKTogUHJvbWlzZTxSZWdpc3RlckRldmljZVJlc3VsdD4ge1xuICAgIGlmICghdGhpcy5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgcmV0dXJuIHsgcmVnaXN0ZXJlZDogZmFsc2UsIGVycm9yOiAnVXN1YXJpbyBubyBhdXRlbnRpY2FkbycgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gVmVyaWZpY2FyIHBlcm1pc29zIHNpIHRlbmVtb3MgTWVzc2FnaW5nU2VydmljZVxuICAgICAgaWYgKHRoaXMubWVzc2FnaW5nU2VydmljZSkge1xuICAgICAgICBjb25zdCBwZXJtaXNzaW9uID0gdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmdldFBlcm1pc3Npb25TdGF0ZSgpO1xuICAgICAgICBpZiAocGVybWlzc2lvbiAhPT0gJ2dyYW50ZWQnKSB7XG4gICAgICAgICAgcmV0dXJuIHsgcmVnaXN0ZXJlZDogZmFsc2UsIGVycm9yOiAnUGVybWlzbyBkZSBub3RpZmljYWNpb25lcyBubyBvdG9yZ2FkbycgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVc2FyIHRva2VuIHByb3BvcmNpb25hZG8gcHJpbWVybyAoZXZpdGEgdGltaW5nIGlzc3VlcyBjb24gSW5qZWN0b3IpXG4gICAgICBsZXQgdG9rZW4gPSBwcm92aWRlZFRva2VuIHx8IHRoaXMubWVzc2FnaW5nU2VydmljZT8uY3VycmVudFRva2VuO1xuXG4gICAgICAvLyBTaSBubyBoYXkgdG9rZW4sIGludGVudGFyIG9idGVuZXJsbyBkZWwgTWVzc2FnaW5nU2VydmljZVxuICAgICAgaWYgKCF0b2tlbiAmJiB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UpIHtcbiAgICAgICAgaWYgKCEoYXdhaXQgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmlzU3VwcG9ydGVkKCkpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgcmVnaXN0ZXJlZDogZmFsc2UsIGVycm9yOiAnRkNNIG5vIHNvcG9ydGFkbyBlbiBlc3RlIG5hdmVnYWRvcicgfTtcbiAgICAgICAgfVxuICAgICAgICB0b2tlbiA9IGF3YWl0IHRoaXMubWVzc2FnaW5nU2VydmljZS5nZXRUb2tlbigpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIHJldHVybiB7IHJlZ2lzdGVyZWQ6IGZhbHNlLCBlcnJvcjogJ05vIHNlIHB1ZG8gb2J0ZW5lciB0b2tlbiBGQ00nIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZ2lzdHJhciBlbiBiYWNrZW5kXG4gICAgICBjb25zdCB7IHBsYXRmb3JtLCBicm93c2VyLCBvcyB9ID0gdGhpcy5kZXRlY3RQbGF0Zm9ybUluZm8oKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgIHRoaXMuaHR0cC5wb3N0PFJlZ2lzdGVyRGV2aWNlUmVzcG9uc2U+KGAke3RoaXMuY29uZmlnPy5hcGlVcmx9L3YyL3VzZXJzL21lL2RldmljZXNgLCB7XG4gICAgICAgICAgdG9rZW4sXG4gICAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgICAgYXBwSWQ6IHRoaXMuY29uZmlnPy5hcHBJZCxcbiAgICAgICAgICBicm93c2VyLFxuICAgICAgICAgIG9zLFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gRGV2aWNlIHJlZ2lzdGVyZWQgbWFudWFsbHk6JywgcmVzcG9uc2UuZGV2aWNlLmRldmljZUlkKTtcbiAgICAgIHJldHVybiB7IHJlZ2lzdGVyZWQ6IHRydWUsIGRldmljZUlkOiByZXNwb25zZS5kZXZpY2UuZGV2aWNlSWQsIHRva2VuIH07XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIE1hbnVhbCBkZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWdpc3RlcmVkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IGVycm9yPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnJvcj8ubWVzc2FnZSB8fCAnRXJyb3IgYWwgcmVnaXN0cmFyIGRpc3Bvc2l0aXZvJyxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdHJhIGVsIGRpc3Bvc2l0aXZvIGVuIGVsIGJhY2tlbmQgc2kgdGllbmUgcGVybWlzb3MgZGUgbm90aWZpY2FjacOzbi5cbiAgICogU2UgbGxhbWEgYXV0b23DoXRpY2FtZW50ZSBkZXNwdcOpcyBkZSB1biBsb2dpbiBleGl0b3NvIHNpIGVuYWJsZURldmljZVJlZ2lzdHJhdGlvbj10cnVlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3RlckRldmljZUlmTmVlZGVkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIFNvbG8gc2kgZXN0w6EgaGFiaWxpdGFkbyB5IG1lc3NhZ2luZyBlc3TDoSBkaXNwb25pYmxlXG4gICAgaWYgKCF0aGlzLmNvbmZpZz8uZW5hYmxlRGV2aWNlUmVnaXN0cmF0aW9uIHx8ICF0aGlzLm1lc3NhZ2luZ1NlcnZpY2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gVmVyaWZpY2FyIHNpIEZDTSBlc3TDoSBzb3BvcnRhZG9cbiAgICAgIGlmICghKGF3YWl0IHRoaXMubWVzc2FnaW5nU2VydmljZS5pc1N1cHBvcnRlZCgpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmaWNhciBzaSB5YSB0aWVuZSBwZXJtaXNvc1xuICAgICAgY29uc3QgcGVybWlzc2lvbiA9IHRoaXMubWVzc2FnaW5nU2VydmljZS5nZXRQZXJtaXNzaW9uU3RhdGUoKTtcbiAgICAgIGlmIChwZXJtaXNzaW9uICE9PSAnZ3JhbnRlZCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBObyBzb2xpY2l0YXIgYXV0b23DoXRpY2FtZW50ZSwgc29sbyByZWdpc3RyYXIgc2kgeWEgdGllbmUgcGVybWlzb1xuICAgICAgfVxuXG4gICAgICAvLyBPYnRlbmVyIHRva2VuIGV4aXN0ZW50ZSAobm8gc29saWNpdGFyIG51ZXZvKVxuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZ2V0VG9rZW4oKTtcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWdpc3RyYXIgZW4gYmFja2VuZFxuICAgICAgY29uc3QgeyBwbGF0Zm9ybSwgYnJvd3Nlciwgb3MgfSA9IHRoaXMuZGV0ZWN0UGxhdGZvcm1JbmZvKCk7XG4gICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgdGhpcy5odHRwLnBvc3Q8UmVnaXN0ZXJEZXZpY2VSZXNwb25zZT4oYCR7dGhpcy5jb25maWc/LmFwaVVybH0vdjIvdXNlcnMvbWUvZGV2aWNlc2AsIHtcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgICBhcHBJZDogdGhpcy5jb25maWc/LmFwcElkLFxuICAgICAgICAgIGJyb3dzZXIsXG4gICAgICAgICAgb3MsXG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBEZXZpY2UgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBObyBibG9xdWVhciBhdXRoIHNpIGZhbGxhIGRldmljZSByZWdpc3RyYXRpb25cbiAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBEZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVsaW1pbmEgZWwgZGlzcG9zaXRpdm8gZGVsIGJhY2tlbmQgeSBib3JyYSBlbCB0b2tlbiBGQ00uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHVucmVnaXN0ZXJEZXZpY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZz8uZW5hYmxlRGV2aWNlUmVnaXN0cmF0aW9uIHx8ICF0aGlzLm1lc3NhZ2luZ1NlcnZpY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuY3VycmVudFRva2VuO1xuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIC8vIERlbGV0ZSBmcm9tIGJhY2tlbmQgKGZpcmUgYW5kIGZvcmdldClcbiAgICAgICAgdGhpcy5odHRwXG4gICAgICAgICAgLnJlcXVlc3QoJ0RFTEVURScsIGAke3RoaXMuY29uZmlnPy5hcGlVcmx9L3YyL3VzZXJzL21lL2RldmljZXMvYnktdG9rZW5gLCB7XG4gICAgICAgICAgICBib2R5OiB7IHRva2VuIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSlcbiAgICAgICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgLy8gRGVsZXRlIGZyb20gRkNNXG4gICAgICAgIGF3YWl0IHRoaXMubWVzc2FnaW5nU2VydmljZS5kZWxldGVUb2tlbigpO1xuICAgICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBEZXZpY2UgdW5yZWdpc3RlcmVkJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBJZ25vcmFyIGVycm9yZXMgZW4gY2xlYW51cFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3RhIGluZm9ybWFjacOzbiBkZSBsYSBwbGF0YWZvcm1hIGRlbCBkaXNwb3NpdGl2by5cbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0UGxhdGZvcm1JbmZvKCk6IHsgcGxhdGZvcm06ICd3ZWInOyBicm93c2VyOiBzdHJpbmc7IG9zOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50O1xuXG4gICAgLy8gRGV0ZWN0YXIgbmF2ZWdhZG9yXG4gICAgbGV0IGJyb3dzZXIgPSAnVW5rbm93bic7XG4gICAgaWYgKHVhLmluY2x1ZGVzKCdGaXJlZm94JykpIHtcbiAgICAgIGJyb3dzZXIgPSAnRmlyZWZveCc7XG4gICAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnRWRnJykpIHtcbiAgICAgIGJyb3dzZXIgPSAnRWRnZSc7XG4gICAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnQ2hyb21lJykpIHtcbiAgICAgIGJyb3dzZXIgPSAnQ2hyb21lJztcbiAgICB9IGVsc2UgaWYgKHVhLmluY2x1ZGVzKCdTYWZhcmknKSkge1xuICAgICAgYnJvd3NlciA9ICdTYWZhcmknO1xuICAgIH1cblxuICAgIC8vIERldGVjdGFyIE9TXG4gICAgbGV0IG9zID0gJ1Vua25vd24nO1xuICAgIGlmICh1YS5pbmNsdWRlcygnV2luZG93cycpKSB7XG4gICAgICBvcyA9ICdXaW5kb3dzJztcbiAgICB9IGVsc2UgaWYgKHVhLmluY2x1ZGVzKCdNYWMgT1MnKSkge1xuICAgICAgb3MgPSAnbWFjT1MnO1xuICAgIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ0xpbnV4JykpIHtcbiAgICAgIG9zID0gJ0xpbnV4JztcbiAgICB9IGVsc2UgaWYgKHVhLmluY2x1ZGVzKCdBbmRyb2lkJykpIHtcbiAgICAgIG9zID0gJ0FuZHJvaWQnO1xuICAgIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ2lPUycpIHx8IHVhLmluY2x1ZGVzKCdpUGhvbmUnKSB8fCB1YS5pbmNsdWRlcygnaVBhZCcpKSB7XG4gICAgICBvcyA9ICdpT1MnO1xuICAgIH1cblxuICAgIHJldHVybiB7IHBsYXRmb3JtOiAnd2ViJywgYnJvd3Nlciwgb3MgfTtcbiAgfVxufVxuIl19
|
|
1783
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9hdXRoL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQWEsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR25GLE9BQU8sRUFBYyxVQUFVLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3RGLE9BQU8sRUFDTCxHQUFHLEVBQ0gsVUFBVSxFQUNWLFNBQVMsRUFDVCxHQUFHLEVBQ0gsTUFBTSxFQUNOLElBQUksRUFDSixPQUFPLEVBQ1AsV0FBVyxFQUNYLFFBQVEsR0FDVCxNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQTJGL0MsT0FBTyxFQUFhLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDOzs7Ozs7Ozs7Ozs7O0FBM0YzQzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7QUFxRmpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxNQUFNLE9BQU8sV0FBVztJQWN0QixZQUNtRCxNQUFnQyxFQUN6RSxJQUFnQixFQUNoQixNQUFjLEVBQ2QsWUFBOEIsRUFDOUIsWUFBMEIsRUFDMUIsY0FBa0MsRUFDbEMsV0FBNEIsRUFDNUIsZUFBZ0MsRUFDaEMsWUFBMEIsRUFDZCxnQkFBeUMsRUFDekMsV0FBK0IsRUFDM0MsbUJBQThDLEVBQ2xDLGlCQUFtQztRQVpOLFdBQU0sR0FBTixNQUFNLENBQTBCO1FBQ3pFLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsV0FBTSxHQUFOLE1BQU0s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ZUEsbUJBQW1CO21IQWY5QixXQUFXLGNBREUsTUFBTTs7NEZBQ25CLFdBQVc7a0JBRHZCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFnQjdCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsbUJBQW1COzswQkFTdEMsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBRVIsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgaXNEZXZNb2RlLCBPbkRlc3Ryb3ksIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yLCBvZiwgZnJvbSwgZmlyc3RWYWx1ZUZyb20sIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgdGFwLFxuICBjYXRjaEVycm9yLFxuICBzd2l0Y2hNYXAsXG4gIG1hcCxcbiAgZmlsdGVyLFxuICB0YWtlLFxuICB0aW1lb3V0LFxuICBzaGFyZVJlcGxheSxcbiAgZmluYWxpemUsXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgVkFMVEVDSF9BVVRIX0NPTkZJRyB9IGZyb20gJy4vY29uZmlnJztcblxuLyoqXG4gKiBUaW1lb3V0IGR1cm8gcGFyYSBlbCBgL3JlZnJlc2hgIChtcykuIFVuYSBMYW1iZGEgZnLDrWEgKyByZWQgbcOzdmlsIGZsYWt5IHB1ZWRlblxuICogZGVqYXIgZWwgUE9TVCBjb2xnYWRvIGluZGVmaW5pZGFtZW50ZTsgc2luIGVzdGUgbMOtbWl0ZSBlbCBgYXdhaXRgIGRlXG4gKiBgaW5pdGlhbGl6ZSgpYCAoQVBQX0lOSVRJQUxJWkVSKSBjb25nZWxhIGVsIGJvb3RzdHJhcCBlbiBlbCBza2VsZXRvbiwgeSBlbCBmbGFnXG4gKiBgaXNSZWZyZXNoaW5nYCBkZWwgaW50ZXJjZXB0b3Igc2UgcXVlZGEgcGVnYWRvIGJsb3F1ZWFuZG8gdG9kYSByZXF1ZXN0IHBvc3Rlcmlvci5cbiAqIENvbiB0aW1lb3V0LCBlbCByZWZyZXNoIFNJRU1QUkUgcmVzdWVsdmUgKG9rIG8gZXJyb3IpIOKGkiBsYSBVSSBudW5jYSBjdWVsZ2E6IGVsXG4gKiBib290c3RyYXAgY29udGluw7phIGNvbW8gaW52aXRhZG8geSBlbCBpbnRlcmNlcHRvciBsaWJlcmEgbGEgY29sYS5cbiAqL1xuY29uc3QgUkVGUkVTSF9USU1FT1VUX01TID0gMTAwMDA7XG5pbXBvcnQgeyBBdXRoU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9rZW5TZXJ2aWNlIH0gZnJvbSAnLi90b2tlbi5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhTdG9yYWdlU2VydmljZSB9IGZyb20gJy4vc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhTeW5jU2VydmljZSB9IGZyb20gJy4vc3luYy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFNpZ25pblJlcXVlc3QsXG4gIFNpZ25pblJlc3BvbnNlLFxuICBTaWdudXBSZXF1ZXN0LFxuICBTaWdudXBSZXNwb25zZSxcbiAgVmVyaWZ5RW1haWxSZXF1ZXN0LFxuICBWZXJpZnlFbWFpbFJlc3BvbnNlLFxuICBSZXNlbmRDb2RlUmVxdWVzdCxcbiAgUmVzZW5kQ29kZVJlc3BvbnNlLFxuICBNRkFWZXJpZnlSZXNwb25zZSxcbiAgUmVmcmVzaFJlcXVlc3QsXG4gIFJlZnJlc2hSZXNwb25zZSxcbiAgR2V0UGVybWlzc2lvbnNSZXNwb25zZSxcbiAgR2V0UHJvZmlsZVJlc3BvbnNlLFxuICBVcGRhdGVQcm9maWxlUmVxdWVzdCxcbiAgVXBkYXRlUHJvZmlsZVJlc3BvbnNlLFxuICBNRkFTZXR1cFJlc3BvbnNlLFxuICBNRkFDb25maXJtUmVzcG9uc2UsXG4gIE1GQURpc2FibGVSZXF1ZXN0LFxuICBNRkFEaXNhYmxlUmVzcG9uc2UsXG4gIEZvcmdvdFBhc3N3b3JkUmVxdWVzdCxcbiAgRm9yZ290UGFzc3dvcmRSZXNwb25zZSxcbiAgUmVzZXRQYXNzd29yZFJlcXVlc3QsXG4gIFJlc2V0UGFzc3dvcmRSZXNwb25zZSxcbiAgTUZBUmVzZXRSZXF1ZXN0UmVxdWVzdCxcbiAgTUZBUmVzZXRSZXF1ZXN0UmVzcG9uc2UsXG4gIE1GQVJlc2V0Q29uZmlybVJlcXVlc3QsXG4gIE1GQVJlc2V0Q29uZmlybVJlc3BvbnNlLFxuICBBY3RpdmF0ZUFjY291bnRSZXF1ZXN0LFxuICBBY3RpdmF0ZUFjY291bnRSZXNwb25zZSxcbiAgQ2hhbmdlUGFzc3dvcmRSZXF1ZXN0LFxuICBDaGFuZ2VQYXNzd29yZFJlc3BvbnNlLFxuICBEZWxldGVBY2NvdW50UmVxdWVzdCxcbiAgRGVsZXRlQWNjb3VudFJlc3BvbnNlLFxuICBTZW5kRGVsZXRlQWNjb3VudENvZGVSZXNwb25zZSxcbiAgU3dpdGNoT3JnUmVzcG9uc2UsXG4gIE1GQU1ldGhvZCxcbiAgQXV0aEVycm9yLFxuICBBdXRoU3luY0V2ZW50LFxuICBWYWx0ZWNoQXV0aENvbmZpZyxcbiAgUmVnaXN0ZXJEZXZpY2VSZXNwb25zZSxcbiAgRW5hYmxlTm90aWZpY2F0aW9uc1Jlc3VsdCxcbiAgTm90aWZpY2F0aW9uUGVybWlzc2lvblN0YXRlLFxuICBSZWdpc3RlckRldmljZVJlc3VsdCxcbiAgLy8gVE9UUCBNRkEgdHlwZXNcbiAgVE9UUFNldHVwUmVzcG9uc2UsXG4gIFRPVFBWZXJpZnlTZXR1cFJlc3BvbnNlLFxuICBUT1RQRGlzYWJsZVJlc3BvbnNlLFxuICBSZWdlbmVyYXRlQmFja3VwQ29kZXNSZXNwb25zZSxcbiAgQmFja3VwQ29kZXNDb3VudFJlc3BvbnNlLFxuICAvLyBPQXV0aCB0eXBlc1xuICBPQXV0aFByb3ZpZGVyLFxuICBPQXV0aFJlc3VsdCxcbiAgTGlua2VkUHJvdmlkZXIsXG4gIEhhc1Bhc3N3b3JkUmVzcG9uc2UsXG4gIC8vIEhhbmRsZSB0eXBlc1xuICBVcGRhdGVIYW5kbGVSZXNwb25zZSxcbiAgQ2hlY2tIYW5kbGVSZXNwb25zZSxcbiAgLy8gQXZhdGFyIHR5cGVzXG4gIFVwZGF0ZUF2YXRhclJlcXVlc3QsXG4gIFVwZGF0ZUF2YXRhclJlc3BvbnNlLFxuICAvLyBFbWFpbCBjaGFuZ2VcbiAgSW5pdGlhdGVFbWFpbENoYW5nZVJlcXVlc3QsXG4gIEluaXRpYXRlRW1haWxDaGFuZ2VSZXNwb25zZSxcbiAgQ29uZmlybUVtYWlsQ2hhbmdlU3RlcDFSZXF1ZXN0LFxuICBDb25maXJtRW1haWxDaGFuZ2VTdGVwMVJlc3BvbnNlLFxuICBDb25maXJtRW1haWxDaGFuZ2VTdGVwMlJlcXVlc3QsXG4gIENvbmZpcm1FbWFpbENoYW5nZVN0ZXAyUmVzcG9uc2UsXG4gIEFkZEVtYWlsUmVxdWVzdCxcbiAgQWRkRW1haWxSZXNwb25zZSxcbiAgQ29uZmlybUFkZEVtYWlsUmVxdWVzdCxcbiAgQ29uZmlybUFkZEVtYWlsUmVzcG9uc2UsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgT0F1dGhTZXJ2aWNlIH0gZnJvbSAnLi9vYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IEZpcmViYXNlU2VydmljZSwgTWVzc2FnaW5nU2VydmljZSB9IGZyb20gJy4uL2ZpcmViYXNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlLCBJMThuTGFuZyB9IGZyb20gJy4uL2kxOG4nO1xuaW1wb3J0IHsgRmlyZXN0b3JlLCBkb2MsIG9uU25hcHNob3QgfSBmcm9tICdAYW5ndWxhci9maXJlL2ZpcmVzdG9yZSc7XG5pbXBvcnQgeyBDb25maXJtYXRpb25EaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vY29uZmlybWF0aW9uLWRpYWxvZy9jb25maXJtYXRpb24tZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgaW50ZXJwcmV0RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG4vKipcbiAqIFNlcnZpY2lvIHByaW5jaXBhbCBkZSBhdXRlbnRpY2FjacOzbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICd2YWx0ZWNoLWNvbXBvbmVudHMnO1xuICpcbiAqIEBDb21wb25lbnQoey4uLn0pXG4gKiBleHBvcnQgY2xhc3MgTG9naW5Db21wb25lbnQge1xuICogICBwcml2YXRlIGF1dGggPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xuICpcbiAqICAgYXN5bmMgbG9naW4oKSB7XG4gKiAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5hdXRoLnNpZ25pbih7IGVtYWlsLCBwYXNzd29yZCB9KSk7XG4gKiAgICAgaWYgKHRoaXMuYXV0aC5tZmFQZW5kaW5nKCkucmVxdWlyZWQpIHtcbiAqICAgICAgIC8vIE1vc3RyYXIgVUkgZGUgTUZBXG4gKiAgICAgfSBlbHNlIHtcbiAqICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLyddKTtcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEF1dGhTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgLy8gVGltZXIgcGFyYSByZWZyZXNoIHByb2FjdGl2b1xuICBwcml2YXRlIHJlZnJlc2hUaW1lcklkOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN5bmNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGZpcmVzdG9yZVJCQUNVbnN1YnNjcmliZTogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gU2luZ2xlLWZsaWdodCByZWZyZXNoOiB1biBzb2xvIFBPU1QgL3JlZnJlc2ggZW4gdnVlbG8gYSBsYSB2ZXouIFRvZG9zIGxvc1xuICAvLyBjYWxsZXJzIChib290c3RyYXAsIHJlZXN0YWJsZWNlciBGaXJlYmFzZSwgaW50ZXJjZXB0b3IgNDAxLCB0aW1lciBwcm9hY3Rpdm8pXG4gIC8vIGNvbXBhcnRlbiBlbCBNSVNNTyBvYnNlcnZhYmxlLiBTaW4gZXN0bywgcmVmcmVzaGVzIGNvbmN1cnJlbnRlcyBjaG9jYW4gY29udHJhXG4gIC8vIGxhIHJvdGFjacOzbiBkZSByZWZyZXNoIHRva2VuIGRlbCBiYWNrZW5kOiBlbCBwcmltZXJvIHJvdGEgZWwgdG9rZW4geSBlbFxuICAvLyBzZWd1bmRvIGxsZWdhIGNvbiBlbCB0b2tlbiB5YSBpbnZhbGlkYWRvIOKGkiA0MDEg4oaSIGxvZ291dCBlc3B1cmlvIChlbCB1c3VhcmlvXG4gIC8vIGNhZSBhIGxhIGxhbmRpbmcgYWwgYWN0dWFsaXphcikuIFZlciBwcm9qZWN0X3B3YS1sb2dpbi1mcmVlemUuXG4gIHByaXZhdGUgaW5GbGlnaHRSZWZyZXNoJDogT2JzZXJ2YWJsZTxSZWZyZXNoUmVzcG9uc2U+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChWQUxURUNIX0FVVEhfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogVmFsdGVjaEF1dGhDb25maWcgfCBudWxsLFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgc3RhdGVTZXJ2aWNlOiBBdXRoU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9rZW5TZXJ2aWNlOiBUb2tlblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogQXV0aFN0b3JhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3luY1NlcnZpY2U6IEF1dGhTeW5jU2VydmljZSxcbiAgICBwcml2YXRlIGZpcmViYXNlU2VydmljZTogRmlyZWJhc2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgb2F1dGhTZXJ2aWNlOiBPQXV0aFNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBtZXNzYWdpbmdTZXJ2aWNlOiBNZXNzYWdpbmdTZXJ2aWNlIHwgbnVsbCxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSB8IG51bGwsXG4gICAgcHJpdmF0ZSBjb25maXJtYXRpb25TZXJ2aWNlOiBDb25maXJtYXRpb25EaWFsb2dTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZmlyZXN0b3JlSW5zdGFuY2U6IEZpcmVzdG9yZSB8IG51bGxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZyAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnW3ZhbHRlY2gtY29tcG9uZW50c10gQXV0aFNlcnZpY2U6IHByb3ZpZGVWYWx0ZWNoQXV0aCgpIG5vIGVzdMOhIGVuIG1haW4udHMuICcgK1xuICAgICAgICAgICdMb2dpbiwgcmVnaXN0cm8geSBzZXNpw7NuIG5vIGZ1bmNpb25hcsOhbi4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFU1RBRE8gUMOaQkxJQ08gKFNpZ25hbHMgcmVhZG9ubHkpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBFc3RhZG8gY29tcGxldG8gZGUgYXV0ZW50aWNhY2nDs24gKi9cbiAgcmVhZG9ubHkgc3RhdGUgPSB0aGlzLnN0YXRlU2VydmljZS5zdGF0ZTtcblxuICAvKiogVXN1YXJpbyBlc3TDoSBhdXRlbnRpY2FkbyAqL1xuICByZWFkb25seSBpc0F1dGhlbnRpY2F0ZWQgPSB0aGlzLnN0YXRlU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQ7XG5cbiAgLyoqIEVzdGFkbyBkZSBjYXJnYSAqL1xuICByZWFkb25seSBpc0xvYWRpbmcgPSB0aGlzLnN0YXRlU2VydmljZS5pc0xvYWRpbmc7XG5cbiAgLyoqIEluZm9ybWFjacOzbiBkZWwgdXN1YXJpbyAqL1xuICByZWFkb25seSB1c2VyID0gdGhpcy5zdGF0ZVNlcnZpY2UudXNlcjtcblxuICAvKiogQ2FtYmlvcyBkZSBvcmdhbml6YWNpw7NuIGFjdGl2YSBkZXRlY3RhZG9zIGRlc2RlIHRva2VuIHJlZnJlc2gsIHN3aXRjaC1vcmcgbyBzeW5jIGVudHJlIHBlc3Rhw7Fhcy4gKi9cbiAgcmVhZG9ubHkgYWN0aXZlT3JnQ2hhbmdlZCQgPSB0aGlzLnN0YXRlU2VydmljZS5hY3RpdmVPcmdDaGFuZ2VkJDtcblxuICAvKiogVG9rZW4gZGUgYWNjZXNvICovXG4gIHJlYWRvbmx5IGFjY2Vzc1Rva2VuID0gdGhpcy5zdGF0ZVNlcnZpY2UuYWNjZXNzVG9rZW47XG5cbiAgLyoqIFJvbGVzIGRlbCB1c3VhcmlvICovXG4gIHJlYWRvbmx5IHJvbGVzID0gdGhpcy5zdGF0ZVNlcnZpY2Uucm9sZXM7XG5cbiAgLyoqIFBlcm1pc29zIGRlbCB1c3VhcmlvICovXG4gIHJlYWRvbmx5IHBlcm1pc3Npb25zID0gdGhpcy5zdGF0ZVNlcnZpY2UucGVybWlzc2lvbnM7XG5cbiAgLyoqIFVzdWFyaW8gZXMgc3VwZXIgYWRtaW4gKi9cbiAgcmVhZG9ubHkgaXNTdXBlckFkbWluID0gdGhpcy5zdGF0ZVNlcnZpY2UuaXNTdXBlckFkbWluO1xuXG4gIC8qKiBFc3RhZG8gZGUgTUZBIHBlbmRpZW50ZSAqL1xuICByZWFkb25seSBtZmFQZW5kaW5nID0gdGhpcy5zdGF0ZVNlcnZpY2UubWZhUGVuZGluZztcblxuICAvKiogRXJyb3IgYWN0dWFsICovXG4gIHJlYWRvbmx5IGVycm9yID0gdGhpcy5zdGF0ZVNlcnZpY2UuZXJyb3I7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElOSUNJQUxJWkFDScOTTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pY2lhbGl6YSBlbCBzZXJ2aWNpbyBkZSBhdXRlbnRpY2FjacOzbi5cbiAgICogTGxhbWFkbyBhdXRvbcOhdGljYW1lbnRlIHBvciBwcm92aWRlVmFsdGVjaEF1dGguXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIDEuIENhcmdhciBlc3RhZG8gZGVzZGUgc3RvcmFnZVxuICAgIGNvbnN0IHN0b3JlZFN0YXRlID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkU3RhdGUoKTtcblxuICAgIGlmIChzdG9yZWRTdGF0ZS5hY2Nlc3NUb2tlbikge1xuICAgICAgLy8gMi4gVmVyaWZpY2FyIHNpIHRva2VuIGVzIHbDoWxpZG9cbiAgICAgIGlmICh0aGlzLnRva2VuU2VydmljZS5pc1Rva2VuVmFsaWQoc3RvcmVkU3RhdGUuYWNjZXNzVG9rZW4pKSB7XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnJlc3RvcmVGcm9tU3RvcmFnZShzdG9yZWRTdGF0ZSk7XG5cbiAgICAgICAgLy8gRXh0cmFlciBpbmZvIGRlbCB0b2tlblxuICAgICAgICBjb25zdCBjbGFpbXMgPSB0aGlzLnRva2VuU2VydmljZS5wYXJzZVRva2VuKHN0b3JlZFN0YXRlLmFjY2Vzc1Rva2VuKTtcbiAgICAgICAgY29uc3QgdGFiQWN0aXZlT3JnID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRBY3RpdmVPcmcoKTtcbiAgICAgICAgaWYgKGNsYWltcykge1xuICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVVzZXJJbmZvKGNsYWltcy51aWQsIGNsYWltcy5lbWFpbCk7XG4gICAgICAgICAgY29uc3QgYWN0aXZlT3JnID0gdGFiQWN0aXZlT3JnIHx8IGNsYWltcy5vcmc7XG4gICAgICAgICAgaWYgKGFjdGl2ZU9yZykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWN0aXZlT3JnKGFjdGl2ZU9yZyk7XG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVBY3RpdmVPcmcoYWN0aXZlT3JnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gU3luYyBpc1N1cGVyQWRtaW4gZnJvbSBKV1QgaW4gY2FzZSBJc1BsYXRmb3JtQWRtaW4gY2hhbmdlZCBzaW5jZSBsYXN0IGxvZ2luXG4gICAgICAgICAgY29uc3Qgand0QWRtaW4gPSBjbGFpbXMuYWRtaW4gPT09IHRydWU7XG4gICAgICAgICAgaWYgKGp3dEFkbWluICE9PSAoc3RvcmVkU3RhdGUuaXNTdXBlckFkbWluID8/IGZhbHNlKSkge1xuICAgICAgICAgICAgY29uc3Qgcm9sZXMgPSBzdG9yZWRTdGF0ZS5yb2xlcyA/PyBbXTtcbiAgICAgICAgICAgIGNvbnN0IHBlcm1zID0gc3RvcmVkU3RhdGUucGVybWlzc2lvbnMgPz8gW107XG4gICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVQZXJtaXNzaW9ucyhyb2xlcywgcGVybXMsIGp3dEFkbWluKTtcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVBlcm1pc3Npb25zKHtcbiAgICAgICAgICAgICAgb3BlcmF0aW9uSWQ6ICcnLFxuICAgICAgICAgICAgICByb2xlcyxcbiAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IHBlcm1zLFxuICAgICAgICAgICAgICBpc1N1cGVyQWRtaW46IGp3dEFkbWluLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRWwgYWNjZXNzIHRva2VuIGVzdMOhIGVuIGxvY2FsU3RvcmFnZSB5IHB1ZWRlIGhhYmVyIHNpZG8gZXNjcml0byBwb3JcbiAgICAgICAgLy8gb3RyYSBwZXN0YcOxYSBlbiBvdHJhIG9yZ2FuaXphY2nDs24uIFNpIGVzdGEgcGVzdGHDsWEgcmVjdWVyZGEgdW5hIG9yZ1xuICAgICAgICAvLyBkaXN0aW50YSBlbiBzZXNzaW9uU3RvcmFnZSwgcmVmcmVzY2Ftb3MgZGUgZm9ybWEgYmxvcXVlYW50ZSBhbnRlcyBkZVxuICAgICAgICAvLyBkZWphciBxdWUgbGFzIHJ1dGFzIG9yZy1zY29wZWQgcGlkYW4gZGF0b3MgY29uIHVuIEpXVCBlcXVpdm9jYWRvLlxuICAgICAgICBpZiAodGFiQWN0aXZlT3JnICYmIGNsYWltcz8ub3JnICYmIGNsYWltcy5vcmcgIT09IHRhYkFjdGl2ZU9yZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFtWYWx0ZWNoQXV0aF0gYm9vdHN0cmFwIOKAlCBzdG9yZWQgSldUIG9yZyAke2NsYWltcy5vcmd9IGRpZmZlcnMgZnJvbSB0YWIgb3JnICR7dGFiQWN0aXZlT3JnfTsgcmVmcmVzaGluZyBiZWZvcmUgcm91dGUgZGF0YWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMucmVmcmVzaEFjY2Vzc1Rva2VuKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gSW5pY2lhciB0aW1lciBkZSByZWZyZXNjbyBwcm9hY3Rpdm9cbiAgICAgICAgdGhpcy5zdGFydFJlZnJlc2hUaW1lcigpO1xuXG4gICAgICAgIC8vIDQuIFJlLWVzdGFibGVjZXIgbGEgc2VzacOzbiBkZSBGaXJlYmFzZSBlbiBib290c3RyYXAuXG4gICAgICAgIC8vIEVsIGFjY2VzcyB0b2tlbiBzaWd1ZSB2w6FsaWRvLCBhc8OtIHF1ZSBOTyBwYXNhbW9zIHBvciBsYSByYW1hIGRlXG4gICAgICAgIC8vIHJlZnJlc2gg4oCUIHBlcm8gbGEgcGVyc2lzdGVuY2lhIEluZGV4ZWREQiBwcm9waWEgZGUgRmlyZWJhc2UgQXV0aCBub1xuICAgICAgICAvLyBzb2JyZXZpdmUgZWwgY29udGVuZWRvciBkZSBzdG9yYWdlIGRlIHVuYSBQV0Egc3RhbmRhbG9uZSBlbiBpT1MuXG4gICAgICAgIC8vIFNpbiBlc3RvLCBgZmlyZWJhc2VBdXRoUmVhZHlgIHNlIHF1ZWRhIGVuIGBmYWxzZWAgcGFyYSBzaWVtcHJlIHlcbiAgICAgICAgLy8gY3VhbHF1aWVyIGxpc3RlbmVyIEZpcmVzdG9yZSAoZWouIGVsIGluYm94IGRlIG5vdGlmaWNhY2lvbmVzKSBjdWVsZ2EuXG4gICAgICAgIC8vIEZpcmUtYW5kLWZvcmdldDogTk8gZGViZSBkZW1vcmFyIGVsIHJlc29sdmUgZGUgaW5pdGlhbGl6ZSgpLlxuICAgICAgICB2b2lkIHRoaXMuZW5zdXJlRmlyZWJhc2VTZXNzaW9uT25Cb290c3RyYXAoKTtcblxuICAgICAgICAvLyA1LiBMaXN0ZW5lciBSQkFDIEZpcmVzdG9yZSDigJQgcmUtZXN0YWJsZWNlciB0cmFzIHJlbG9hZCBkZSBww6FnaW5hLlxuICAgICAgICAvLyBoYW5kbGVTdWNjZXNzZnVsQXV0aCBsbyBjb25maWd1cmEgZW4gZWwgbG9naW4gaW5pY2lhbCwgcGVybyBubyBzb2JyZXZpdmVcbiAgICAgICAgLy8gcmVjYXJnYXM6IGluaXRpYWxpemUoKSByZXN0YXVyYSBlbCBzdGF0ZSBkZXNkZSBzdG9yYWdlIHBlcm8gbm8gZWwgbGlzdGVuZXIuXG4gICAgICAgIC8vIHNldHVwRmlyZXN0b3JlUkJBQ1N5bmMgZXNwZXJhIGludGVybmFtZW50ZSBhIHF1ZSBGaXJlYmFzZSBBdXRoIGVzdMOpIGxpc3RhLlxuICAgICAgICBpZiAoY2xhaW1zPy51aWQpIHtcbiAgICAgICAgICB0aGlzLnNldHVwRmlyZXN0b3JlUkJBQ1N5bmMoY2xhaW1zLnVpZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RvcmVkU3RhdGUuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgLy8gNC4gVG9rZW4gZGUgYWNjZXNvIGV4cGlyYWRvLiBDb29raWUtb25seSAoSC0wNSk6IGVsIHJlZnJlc2ggeWEgTk8gZXN0w6FcbiAgICAgICAgLy8gZW4gc3RvcmFnZSwgYXPDrSBxdWUgZWwgZGlzcGFyYWRvciBlcyBcImhhYsOtYSB1biBhY2Nlc3MgdG9rZW5cIiAoc2VzacOzblxuICAgICAgICAvLyBwcmV2aWEpOyBlbCAvcmVmcmVzaCBkZSBmb25kbyB1c2EgbGEgY29va2llIEh0dHBPbmx5LlxuICAgICAgICAvL1xuICAgICAgICAvLyBOTyBibG9xdWVhbW9zIGVsIGJvb3RzdHJhcCBlc3BlcmFuZG8gbGEgcmVkOiB1biAvcmVmcmVzaCBlbiB1bmFcbiAgICAgICAgLy8gTGFtYmRhIGZyw61hIHNvbiAyLTVzIGRlIHBhbnRhbGxhIGVuIGJsYW5jbyAoQW5ndWxhciBubyByZW5kZXJpemFcbiAgICAgICAgLy8gbmFkYSBoYXN0YSBxdWUgZWwgQVBQX0lOSVRJQUxJWkVSIHJlc3VlbHZlKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gUmVzdGF1cmFjacOzbiBvcHRpbWlzdGE6IGVsIGFjY2VzcyB0b2tlbiBleHBpcsOzIHBlcm8gc3VzIGNsYWltc1xuICAgICAgICAvLyAodWlkL2VtYWlsL3JvbGVzKSBzaWd1ZW4gZGVjb2RpZmljYWJsZXMg4oCUIGBwYXJzZVRva2VuYCBOTyB2YWxpZGFcbiAgICAgICAgLy8gYGV4cGAuIFJlc3RhdXJhbW9zIGxhIHNlc2nDs24gZGVzZGUgZXNvcyBjbGFpbXMgcGFyYSBxdWUgbGEgYXBwXG4gICAgICAgIC8vIHJlbmRlcmljZSBlbCBzaGVsbCBhdXRlbnRpY2FkbyBkZSBpbm1lZGlhdG8sIHkgZGlzcGFyYW1vcyBlbFxuICAgICAgICAvLyAvcmVmcmVzaCBlbiBzZWd1bmRvIHBsYW5vIChmaXJlLWFuZC1mb3JnZXQpLlxuICAgICAgICAvL1xuICAgICAgICAvLyBTZWd1cmlkYWQgZGUgbGEgdmVudGFuYSBzdWItc2VndW5kbyBhbnRlcyBkZSBxdWUgZWwgcmVmcmVzaCBsbGVndWU6XG4gICAgICAgIC8vIGN1YWxxdWllciBBUEkgY2FsbCBzYWxlIGNvbiBlbCB0b2tlbiBleHBpcmFkbyDihpIgNDAxIOKGkiBlbFxuICAgICAgICAvLyBhdXRoSW50ZXJjZXB0b3IgcmVmcmVzY2EgKyByZWludGVudGEgYXV0b23DoXRpY2FtZW50ZS4gU2kgZWwgcmVmcmVzaFxuICAgICAgICAvLyBkZSBmb25kbyBmYWxsYSDihpIgc2lnbk91dCArIGNsZWFyU3RhdGUuXG4gICAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIGJvb3RzdHJhcCDigJQgYWNjZXNzIHRva2VuIGV4cGlyZWQsIHJlZnJlc2hpbmcgaW4gYmFja2dyb3VuZCcpO1xuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5yZXN0b3JlRnJvbVN0b3JhZ2Uoc3RvcmVkU3RhdGUpO1xuXG4gICAgICAgIGNvbnN0IGV4cGlyZWRDbGFpbXMgPSB0aGlzLnRva2VuU2VydmljZS5wYXJzZVRva2VuKHN0b3JlZFN0YXRlLmFjY2Vzc1Rva2VuKTtcbiAgICAgICAgY29uc3QgdGFiQWN0aXZlT3JnID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRBY3RpdmVPcmcoKTtcbiAgICAgICAgaWYgKGV4cGlyZWRDbGFpbXMpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVVc2VySW5mbyhleHBpcmVkQ2xhaW1zLnVpZCwgZXhwaXJlZENsYWltcy5lbWFpbCk7XG4gICAgICAgICAgY29uc3QgYWN0aXZlT3JnID0gdGFiQWN0aXZlT3JnIHx8IGV4cGlyZWRDbGFpbXMub3JnO1xuICAgICAgICAgIGlmIChhY3RpdmVPcmcpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZUFjdGl2ZU9yZyhhY3RpdmVPcmcpO1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlQWN0aXZlT3JnKGFjdGl2ZU9yZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChleHBpcmVkQ2xhaW1zLnVpZCkge1xuICAgICAgICAgICAgdGhpcy5zZXR1cEZpcmVzdG9yZVJCQUNTeW5jKGV4cGlyZWRDbGFpbXMudWlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWZyZXNoIGVuIHNlZ3VuZG8gcGxhbm8g4oCUIE5PIHNlIGhhY2UgYXdhaXQ6IGluaXRpYWxpemUoKSByZXN1ZWx2ZSB5YS5cbiAgICAgICAgZmlyc3RWYWx1ZUZyb20odGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBib290c3RyYXAg4oCUIGJhY2tncm91bmQgcmVmcmVzaCBmYWlsZWQsIHNpZ25pbmcgb3V0Jyk7XG4gICAgICAgICAgdGhpcy5zaWduT3V0RmlyZWJhc2UoKTtcbiAgICAgICAgICB0aGlzLmNsZWFyU3RhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNpZ25PdXRGaXJlYmFzZSgpO1xuICAgICAgICB0aGlzLmNsZWFyU3RhdGUoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5jb25maWc/LmJvb3RzdHJhcFNlc3Npb25Gcm9tSGludCAmJlxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5oYXNMb2dnZWRJbkhpbnQodGhpcy5jb25maWc/LmxvZ2dlZEluSGludENvb2tpZSlcbiAgICApIHtcbiAgICAgIC8vIE5vIGhheSB0b2tlbiBsb2NhbCBlbiBlc3RlIG9yaWdpbiwgcGVybyBsYSBjb29raWUtaGludCBpbmRpY2Egc2VzacOzblxuICAgICAgLy8gYWN0aXZhIGVuIGxhIGZhbWlsaWEgKGxvZ3VlYWRvIGVuIG90cmEgYXBwIGRlbCBmYWN0b3J5KS4gQm9vdHN0cmFwZWFtb3NcbiAgICAgIC8vIGxhIHNlc2nDs24gY3Jvc3Mtb3JpZ2luIHbDrWEgL3JlZnJlc2gg4oCUIGJsb3F1ZWFudGUgcGFyYSBxdWUgbG9zIGd1YXJkcyBsYVxuICAgICAgLy8gdmVhbi4gVmVyIFZhbHRlY2hBdXRoQ29uZmlnLmJvb3RzdHJhcFNlc3Npb25Gcm9tSGludC5cbiAgICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwU2Vzc2lvbkZyb21IaW50Q29va2llKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNob3VsZEJvb3RzdHJhcFZpYVNTT0JyaWRnZSgpKSB7XG4gICAgICAvLyBBRFItMDUwIE1vZG8gQjogZXN0YSBhcHAgbm8gY29tcGFydGUgZG9taW5pbyByYcOteiBjb24gZWwgcmVzdG8gZGVsXG4gICAgICAvLyBmYWN0b3J5IChib290c3RyYXBTZXNzaW9uRnJvbUhpbnQgbm8gYXBsaWNhIOKAlCBsYSBjb29raWUtaGludCBudW5jYVxuICAgICAgLy8gbGxlZ2EgYXF1w60pLiBOYXZlZ2FjacOzbiBkZSBww6FnaW5hIGNvbXBsZXRhIGFsIEF1dGggUHJveHkgQ2VudHJhbDtcbiAgICAgIC8vIHZ1ZWx2ZSBjb24gYD9oYW5kb2ZmPWAgc2kgaGF5IHNlc2nDs24gYWN0aXZhLiBWZXJcbiAgICAgIC8vIFZhbHRlY2hBdXRoQ29uZmlnLmJvb3RzdHJhcFNlc3Npb25Gcm9tQnJpZGdlLlxuICAgICAgdGhpcy5yZWRpcmVjdFRvU1NPQnJpZGdlKCk7XG4gICAgICAvLyBObyBzZWd1aW1vcyBlbCByZXN0byBkZSBpbml0aWFsaXplKCkg4oCUIGxhIHDDoWdpbmEgZXN0w6EgcG9yIG5hdmVnYXJcbiAgICAgIC8vIGZ1ZXJhLiBEZWphbW9zIGxvYWRpbmc9dHJ1ZSBhIHByb3DDs3NpdG86IGVsIHVubG9hZCBlcyBpbm1pbmVudGUuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gNS4gSW5pY2lhciBzaW5jcm9uaXphY2nDs24gZW50cmUgcGVzdGHDsWFzXG4gICAgaWYgKHRoaXMuY29uZmlnPy5lbmFibGVUYWJTeW5jKSB7XG4gICAgICB0aGlzLnN5bmNTZXJ2aWNlLnN0YXJ0KCk7XG4gICAgICB0aGlzLnN5bmNTdWJzY3JpcHRpb24gPSB0aGlzLnN5bmNTZXJ2aWNlLm9uRXZlbnQkLnN1YnNjcmliZShldmVudCA9PlxuICAgICAgICB0aGlzLmhhbmRsZVN5bmNFdmVudChldmVudClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0TG9hZGluZyhmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogwr9IYXkgc2VzacOzbiBhY3RpdmEgZW4gbGEgZmFtaWxpYSBzZWfDum4gbGEgY29va2llLWhpbnQgSlMtcmVhZGFibGU/XG4gICAqXG4gICAqIEVzcGVqbyBsZWdpYmxlIGRlIGxhIGNvb2tpZSBIdHRwT25seSBgdmFsdGVjaF9yZWZyZXNoYCAocXVlIEpTIG5vIHB1ZWRlIGxlZXIpLlxuICAgKiDDmnRpbCBwYXJhIHF1ZSB1biBzaXRpbyBww7pibGljbyBkZWNpZGEgbGFuZGluZy12cy1hcHAgZGUgZm9ybWEgc8OtbmNyb25hLCBzaW5cbiAgICogZXNwZXJhciBlbCBgL3JlZnJlc2hgLiBOTyBlcyBwcnVlYmEgZGUgc2VzacOzbiB2w6FsaWRhIChsYSBoaW50IHB1ZWRlIHF1ZWRhclxuICAgKiBzdGFsZSkg4oCUIHBhcmEgdW5hIHNlc2nDs24gcmVhbCB1c2FyIGBpc0F1dGhlbnRpY2F0ZWQoKWAgKyBgYm9vdHN0cmFwU2Vzc2lvbkZyb21IaW50YC5cbiAgICovXG4gIGhhc0xvZ2dlZEluSGludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlU2VydmljZS5oYXNMb2dnZWRJbkhpbnQodGhpcy5jb25maWc/LmxvZ2dlZEluSGludENvb2tpZSk7XG4gIH1cblxuICAvKipcbiAgICogQm9vdHN0cmFwIGNyb3NzLW9yaWdpbiBkZSBsYSBzZXNpw7NuIGRlc2RlIGxhIGNvb2tpZS1oaW50IGRlIGZhbWlsaWEuXG4gICAqXG4gICAqIFNlIGludm9jYSBkZXNkZSBgaW5pdGlhbGl6ZSgpYCBjdWFuZG8gbm8gaGF5IHRva2VuIGxvY2FsIHBlcm8gbGEgYXBwIG9wdMOzIHBvclxuICAgKiBgYm9vdHN0cmFwU2Vzc2lvbkZyb21IaW50YCB5IGxhIGhpbnQgZXN0w6EgcHJlc2VudGUuIEVsIGAvcmVmcmVzaGAgdXNhIGVsXG4gICAqIHJlZnJlc2ggdG9rZW4gSHR0cE9ubHkgKGBTYW1lU2l0ZT1Ob25lYCkgdsOhbGlkbyBjcm9zcy1vcmlnaW4uIGByZWZyZXNoQWNjZXNzVG9rZW5gXG4gICAqIHBlcnNpc3RlIGVsIHRva2VuICsgRmlyZWJhc2UgKyB0aW1lciwgcGVybyBOTyBtYXJjYSBgaXNBdXRoZW50aWNhdGVkYCBuaVxuICAgKiByZXN0YXVyYSBjbGFpbXMvcm9sZXMg4oaSIHNlIGNvbXBsZXRhIGxhIHNlc2nDs24gYWPDoS4gRmFsbGEgbGltcGlvIChoaW50IHN0YWxlIG9cbiAgICogZGV2IGNyb3NzLXNpdGUgY29uIGNvb2tpZSBkZSB0ZXJjZXJvcyBibG9xdWVhZGEpIOKGkiBpbnZpdGFkby5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYm9vdHN0cmFwU2Vzc2lvbkZyb21IaW50Q29va2llKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIGJvb3RzdHJhcCDigJQgbm8gbG9jYWwgdG9rZW4gYnV0IGZhbWlseSBoaW50IHByZXNlbnQsIHJlZnJlc2hpbmcnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMucmVmcmVzaEFjY2Vzc1Rva2VuKCkpO1xuICAgICAgY29uc3QgY2xhaW1zID0gdGhpcy50b2tlblNlcnZpY2UucGFyc2VUb2tlbihyZXNwLmFjY2Vzc1Rva2VuKTtcbiAgICAgIGNvbnN0IGV4cGlyZXNBdCA9IERhdGUubm93KCkgKyByZXNwLmV4cGlyZXNJbiAqIDEwMDA7XG4gICAgICBjb25zdCBpc1N1cGVyQWRtaW4gPSAocmVzcC5wZXJtaXNzaW9ucz8uaW5jbHVkZXMoJyo6KicpIHx8IGNsYWltcz8uYWRtaW4gPT09IHRydWUpID8/IGZhbHNlO1xuICAgICAgY29uc3QgaXNQcmVtaXVtID0gY2xhaW1zPy5wcmVtaXVtID09PSB0cnVlO1xuXG4gICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRBdXRoZW50aWNhdGVkKHtcbiAgICAgICAgYWNjZXNzVG9rZW46IHJlc3AuYWNjZXNzVG9rZW4sXG4gICAgICAgIHJlZnJlc2hUb2tlbjogcmVzcC5yZWZyZXNoVG9rZW4sXG4gICAgICAgIHVzZXJJZDogY2xhaW1zPy51aWQsXG4gICAgICAgIGVtYWlsOiBjbGFpbXM/LmVtYWlsLFxuICAgICAgICByb2xlczogcmVzcC5yb2xlcyA/PyBbXSxcbiAgICAgICAgcGVybWlzc2lvbnM6IHJlc3AucGVybWlzc2lvbnMgPz8gW10sXG4gICAgICAgIGlzU3VwZXJBZG1pbixcbiAgICAgICAgaXNQcmVtaXVtLFxuICAgICAgICBleHBpcmVzQXQsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVN0YXRlKHtcbiAgICAgICAgYWNjZXNzVG9rZW46IHJlc3AuYWNjZXNzVG9rZW4sXG4gICAgICAgIHJlZnJlc2hUb2tlbjogcmVzcC5yZWZyZXNoVG9rZW4sXG4gICAgICAgIHJvbGVzOiByZXNwLnJvbGVzID8/IFtdLFxuICAgICAgICBwZXJtaXNzaW9uczogcmVzcC5wZXJtaXNzaW9ucyA/PyBbXSxcbiAgICAgICAgaXNTdXBlckFkbWluLFxuICAgICAgICBpc1ByZW1pdW0sXG4gICAgICAgIGV4cGlyZXNBdCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoY2xhaW1zPy5vcmcpIHtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWN0aXZlT3JnKGNsYWltcy5vcmcpO1xuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVBY3RpdmVPcmcoY2xhaW1zLm9yZyk7XG4gICAgICB9XG4gICAgICBpZiAoY2xhaW1zPy51aWQpIHtcbiAgICAgICAgdGhpcy5zZXR1cEZpcmVzdG9yZVJCQUNTeW5jKGNsYWltcy51aWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIGJvb3RzdHJhcCDigJQgZmFtaWx5IGhpbnQgcmVmcmVzaCBmYWlsZWQsIGNvbnRpbnVpbmcgYXMgZ3Vlc3QnKTtcbiAgICAgIHRoaXMuY2xlYXJTdGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb21icmUgZGUgbGEgc2Vzc2lvblN0b3JhZ2Uga2V5IHVzYWRhIGNvbW8gZ3VhcmRhIGFudGktbG9vcCBkZWwgYnJpZGdlLlxuICAgKiBgc2Vzc2lvblN0b3JhZ2VgIChubyBsb2NhbFN0b3JhZ2UpIOKAlCBlbCBndWFyZCBkZWJlIGV4cGlyYXIgbmF0dXJhbG1lbnRlIGFsXG4gICAqIGNlcnJhciBsYSBwZXN0YcOxYTsgdW5hIHNlc2nDs24gZGUgZmFtaWxpYSByZWNpw6luIGluaWNpYWRhIGVuIG90cmEgcGVzdGHDsWFcbiAgICogZGViZSBwb2RlciByZWludGVudGFyIGVsIGJyaWRnZSBlbiB1bmEgcGVzdGHDsWEgbnVldmEuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTU09fQlJJREdFX0dVQVJEX0tFWSA9ICd2YWx0ZWNoX3Nzb19icmlkZ2VfYXR0ZW1wdGVkJztcblxuICAvKipcbiAgICogwr9Db3JyZXNwb25kZSBkaXNwYXJhciBlbCByZWRpcmVjdCBhbCBBdXRoIFByb3h5IENlbnRyYWwgKEFEUi0wNTAgTW9kbyBCKT9cbiAgICpcbiAgICogRmFsc28gc2k6IGxhIGNvbmZpZyBubyBsbyBoYWJpbGl0YSwgZmFsdGEgYHNzb0JyaWRnZVVybGAsIG5vIGNvcnJlbW9zIGVuXG4gICAqIHVuIGJyb3dzZXIgcmVhbCAoU1NSL3Rlc3RzKSwgbyBlc3RhIHBlc3Rhw7FhIFlBIHZvbHZpw7MgZGUgdW4gaW50ZW50byBkZVxuICAgKiBicmlkZ2Ug4oCUIHNpbiBlc3RlIMO6bHRpbW8gZ3VhcmQsIHVuIGJyaWRnZSBxdWUgcmVkaXJpZ2Ugc2luIGA/aGFuZG9mZmBcbiAgICogKHNpbiBzZXNpw7NuKSBkaXNwYXJhcsOtYSB1biBidWNsZSBpbmZpbml0byBkZSByZWRpcmVjdHMgZW4gY2FkYVxuICAgKiBgaW5pdGlhbGl6ZSgpYCBwb3N0ZXJpb3IgZGUgbGEgbWlzbWEgcGVzdGHDsWEuXG4gICAqL1xuICBwcml2YXRlIHNob3VsZEJvb3RzdHJhcFZpYVNTT0JyaWRnZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5ib290c3RyYXBTZXNzaW9uRnJvbUJyaWRnZSB8fCAhdGhpcy5jb25maWc/LnNzb0JyaWRnZVVybCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHNlc3Npb25TdG9yYWdlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgaWYgKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oQXV0aFNlcnZpY2UuU1NPX0JSSURHRV9HVUFSRF9LRVkpID09PSAnMScpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gc2Vzc2lvblN0b3JhZ2UgYmxvcXVlYWRvIChtb2RvIHByaXZhZG8gYWdyZXNpdm8pIOKAlCBubyBhcnJpZXNnYXIgdW5cbiAgICAgIC8vIGxvb3Agc2luIHBvZGVyIG1hcmNhciBlbCBndWFyZDsgbm9zIGFic3RlbmVtb3MgZGVsIGJyaWRnZS5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogTmF2ZWdhIGxhIHDDoWdpbmEgY29tcGxldGEgYWwgQXV0aCBQcm94eSBDZW50cmFsIGNvbiBgcmVkaXJlY3RfdXJpYCA9IGxhXG4gICAqIFVSTCBhY3R1YWwuIEVsIGJhY2tlbmQgdmFsaWRhIGxhIGNvb2tpZSBgdmFsdGVjaF9yZWZyZXNoYCAodmlzaWJsZSBzb2xvXG4gICAqIGVuIHN1IHByb3BpbyBkb21pbmlvLCBwb3IgZXNvIGVsIHJlZGlyZWN0IGRlYmUgc2VyIHRvcC1sZXZlbCBuYXZpZ2F0aW9uXG4gICAqIHkgbm8gdW4gZmV0Y2gpIHkgcmVkaXJpZ2UgZGUgdnVlbHRhIGNvbiBgP2hhbmRvZmY9VE9LRU5gIHNpIGhheSBzZXNpw7NuLlxuICAgKlxuICAgKiBNYXJjYSBlbCBndWFyZCBBTlRFUyBkZSBuYXZlZ2FyIOKAlCBzaSBlbCBicmlkZ2UgcmVkaXJpZ2Ugc2luIGA/aGFuZG9mZmBcbiAgICogKHNpbiBzZXNpw7NuKSwgZWwgc2lndWllbnRlIGBpbml0aWFsaXplKClgIGRlIGVzdGEgcGVzdGHDsWEgbm8gZGViZSB2b2x2ZXJcbiAgICogYSBpbnRlbnRhciBlbCBicmlkZ2UuXG4gICAqL1xuICBwcml2YXRlIHJlZGlyZWN0VG9TU09CcmlkZ2UoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oQXV0aFNlcnZpY2UuU1NPX0JSSURHRV9HVUFSRF9LRVksICcxJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTaSBubyBwb2RlbW9zIG1hcmNhciBlbCBndWFyZCwgbWVqb3Igbm8gbmF2ZWdhciDigJQgZXZpdGEgZWwgbG9vcC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVkaXJlY3RVcmkgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICBjb25zdCBicmlkZ2VVcmwgPSBuZXcgVVJMKHRoaXMuY29uZmlnIS5zc29CcmlkZ2VVcmwhKTtcbiAgICBicmlkZ2VVcmwuc2VhcmNoUGFyYW1zLnNldCgncmVkaXJlY3RfdXJpJywgcmVkaXJlY3RVcmkpO1xuICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIGJvb3RzdHJhcCDigJQgbm8gbG9jYWwgc2Vzc2lvbiwgcmVkaXJlY3RpbmcgdG8gU1NPIGJyaWRnZScpO1xuICAgIHRoaXMubmF2aWdhdGVUb1NTT0JyaWRnZVVybChicmlkZ2VVcmwudG9TdHJpbmcoKSk7XG4gIH1cblxuICAvKipcbiAgICogTmF2ZWdhY2nDs24gcmVhbCAoYWlzbGFkYSBlbiBzdSBwcm9waW8gbcOpdG9kbyBwYXJhIHBvZGVyIGVzcGlhcmxhIGVuXG4gICAqIHRlc3RzIHVuaXRhcmlvcyBzaW4gcXVlIEthcm1hIG5hdmVndWUgZGUgdmVyZGFkIGVsIHJ1bm5lcikuXG4gICAqL1xuICBwcml2YXRlIG5hdmlnYXRlVG9TU09CcmlkZ2VVcmwodXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFJlZnJlc2hUaW1lcigpO1xuICAgIHRoaXMuc3luY1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnRlYXJkb3duRmlyZXN0b3JlUkJBQ1N5bmMoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBVVRFTlRJQ0FDScOTTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pY2lhIHNlc2nDs24gY29uIGVtYWlsIHkgY29udHJhc2XDsWEuXG4gICAqIERldGVjdGEgYXV0b23DoXRpY2FtZW50ZSBsYSBwbGF0YWZvcm1hIHBhcmEgaWRlbnRpZmljYXIgZGlzcG9zaXRpdm9zIG51ZXZvcy5cbiAgICovXG4gIHNpZ25pbihyZXF1ZXN0OiBTaWduaW5SZXF1ZXN0KTogT2JzZXJ2YWJsZTxTaWduaW5SZXNwb25zZT4ge1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyRXJyb3IoKTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5jbGVhck1GQVBlbmRpbmcoKTtcblxuICAgIC8vIEFncmVnYXIgaW5mbyBkZSBwbGF0YWZvcm1hIHBhcmEgZGV2aWNlIGRldGVjdGlvblxuICAgIGNvbnN0IHBsYXRmb3JtSW5mbyA9IHRoaXMuZGV0ZWN0UGxhdGZvcm1JbmZvKCk7XG4gICAgY29uc3QgZW5yaWNoZWRSZXF1ZXN0OiBTaWduaW5SZXF1ZXN0ID0ge1xuICAgICAgLi4ucmVxdWVzdCxcbiAgICAgIGFwcElkOiByZXF1ZXN0LmFwcElkID8/IHRoaXMuY29uZmlnPy5hcHBJZCxcbiAgICAgIHBsYXRmb3JtOiByZXF1ZXN0LnBsYXRmb3JtID8/IHBsYXRmb3JtSW5mby5wbGF0Zm9ybSxcbiAgICAgIGJyb3dzZXI6IHJlcXVlc3QuYnJvd3NlciA/PyBwbGF0Zm9ybUluZm8uYnJvd3NlcixcbiAgICAgIG9zOiByZXF1ZXN0Lm9zID8/IHBsYXRmb3JtSW5mby5vcyxcbiAgICB9O1xuXG4gICAgLy8gd2l0aENyZWRlbnRpYWxzOiBlbCBiYWNrZW5kIHNldGVhIGxhIGNvb2tpZSBIdHRwT25seSBkZSByZWZyZXNoICh2YWx0ZWNoX3JlZnJlc2gpXG4gICAgLy8gZW4gbGEgcmVzcHVlc3RhLiBFbCBicm93c2VyIHNvbG8gYWxtYWNlbmEgZXNlIFNldC1Db29raWUgY3Jvc3Mtb3JpZ2luIHNpIGxhXG4gICAgLy8gcmVxdWVzdCBzZSBoaXpvIGNvbiBjcmVkZW5jaWFsZXMuIFNpbiBlc3RvIGxhIGNvb2tpZSBubyBwZXJzaXN0ZSB5IC9yZWZyZXNoXG4gICAgLy8gZmFsbGEgc2llbXByZSAoNDAwKSDihpIgbGEgc2VzacOzbiBubyBkdXJhIChILTA1KS5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxTaWduaW5SZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9zaWduaW5gLCBlbnJpY2hlZFJlcXVlc3QsIHsgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBpZiAocmVzcG9uc2UubWZhUmVxdWlyZWQpIHtcbiAgICAgICAgICAgIC8vIE1GQSByZXF1ZXJpZG8gLSBndWFyZGFyIGVzdGFkbyB0ZW1wb3JhbFxuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0TUZBUGVuZGluZyh7XG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBtZmFUb2tlbjogcmVzcG9uc2UubWZhVG9rZW4hLFxuICAgICAgICAgICAgICBtZXRob2Q6IHJlc3BvbnNlLm1mYU1ldGhvZCEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICAvLyBMb2dpbiBleGl0b3NvIHNpbiBNRkFcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU3VjY2Vzc2Z1bEF1dGgocmVzcG9uc2UpO1xuXG4gICAgICAgICAgICAvLyBOb3RpZmljYXIgc2kgZXMgdW4gZGlzcG9zaXRpdm8gbnVldm9cbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5pc05ld0RldmljZSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBOZXcgZGV2aWNlIGRldGVjdGVkOicsIHJlc3BvbnNlLmRldmljZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICAgICk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gT0FVVEggKExvZ2luIHNvY2lhbClcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluaWNpYSBzZXNpw7NuIGNvbiBPQXV0aCAoR29vZ2xlLCBBcHBsZSwgTWljcm9zb2Z0LCBGYWNlYm9vaykuXG4gICAqIEFicmUgdW4gcG9wdXAgcGFyYSBlbCBmbHVqbyBkZSBhdXRlbnRpY2FjacOzbi5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyIC0gUHJvdmVlZG9yIE9BdXRoICgnZ29vZ2xlJywgJ2FwcGxlJywgJ21pY3Jvc29mdCcsICdmYWNlYm9vaycpXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgcXVlIGVtaXRlIFNpZ25pblJlc3BvbnNlIGN1YW5kbyBzZSBjb21wbGV0YVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHRoaXMuYXV0aC5zaWduaW5XaXRoT0F1dGgoJ2dvb2dsZScpLnN1YnNjcmliZSh7XG4gICAqICAgbmV4dDogKCkgPT4gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvJ10pLFxuICAgKiAgIGVycm9yOiAoZXJyKSA9PiBjb25zb2xlLmVycm9yKCdPQXV0aCBmYWlsZWQ6JywgZXJyKVxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBzaWduaW5XaXRoT0F1dGgocHJvdmlkZXI6IE9BdXRoUHJvdmlkZXIpOiBPYnNlcnZhYmxlPFNpZ25pblJlc3BvbnNlPiB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJFcnJvcigpO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyTUZBUGVuZGluZygpO1xuXG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLnN0YXJ0Rmxvdyhwcm92aWRlcikucGlwZShcbiAgICAgIHRhcChyZXN1bHQgPT4ge1xuICAgICAgICAvLyBNRkEgcmVxdWVyaWRvIHRyYXMgT0F1dGgg4oCUIGd1YXJkYXIgZXN0YWRvIHRlbXBvcmFsLCBOTyBhdXRlbnRpY2FyLlxuICAgICAgICAvLyBFbCBsb2dpbiBjb21wb25lbnQgcmVhY2Npb25hIGEgYG1mYVBlbmRpbmcoKWAgeSBhYnJlIGVsIG1vZGFsIHZlcmlmeS5cbiAgICAgICAgaWYgKHJlc3VsdC5tZmFSZXF1aXJlZCkge1xuICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldE1GQVBlbmRpbmcoe1xuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBtZmFUb2tlbjogcmVzdWx0Lm1mYVRva2VuISxcbiAgICAgICAgICAgIG1ldGhvZDogcmVzdWx0Lm1mYU1ldGhvZCEsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydGlyIE9BdXRoUmVzdWx0IGEgU2lnbmluUmVzcG9uc2UgY29tcGF0aWJsZVxuICAgICAgICBjb25zdCByZXNwb25zZTogU2lnbmluUmVzcG9uc2UgPSB7XG4gICAgICAgICAgb3BlcmF0aW9uSWQ6ICdvYXV0aCcsXG4gICAgICAgICAgYWNjZXNzVG9rZW46IHJlc3VsdC5hY2Nlc3NUb2tlbixcbiAgICAgICAgICByZWZyZXNoVG9rZW46IHJlc3VsdC5yZWZyZXNoVG9rZW4sXG4gICAgICAgICAgZmlyZWJhc2VUb2tlbjogcmVzdWx0LmZpcmViYXNlVG9rZW4sXG4gICAgICAgICAgZXhwaXJlc0luOiByZXN1bHQuZXhwaXJlc0luLFxuICAgICAgICAgIHJvbGVzOiByZXN1bHQucm9sZXMsXG4gICAgICAgICAgcGVybWlzc2lvbnM6IHJlc3VsdC5wZXJtaXNzaW9ucyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzZnVsQXV0aChyZXNwb25zZSk7XG4gICAgICB9KSxcbiAgICAgIG1hcChyZXN1bHQgPT5cbiAgICAgICAgcmVzdWx0Lm1mYVJlcXVpcmVkXG4gICAgICAgICAgPyAoe1xuICAgICAgICAgICAgICBvcGVyYXRpb25JZDogJ29hdXRoJyxcbiAgICAgICAgICAgICAgbWZhUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIG1mYVRva2VuOiByZXN1bHQubWZhVG9rZW4sXG4gICAgICAgICAgICAgIG1mYU1ldGhvZDogcmVzdWx0Lm1mYU1ldGhvZCxcbiAgICAgICAgICAgIH0gYXMgU2lnbmluUmVzcG9uc2UpXG4gICAgICAgICAgOiAoe1xuICAgICAgICAgICAgICBvcGVyYXRpb25JZDogJ29hdXRoJyxcbiAgICAgICAgICAgICAgYWNjZXNzVG9rZW46IHJlc3VsdC5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgICAgcmVmcmVzaFRva2VuOiByZXN1bHQucmVmcmVzaFRva2VuLFxuICAgICAgICAgICAgICBmaXJlYmFzZVRva2VuOiByZXN1bHQuZmlyZWJhc2VUb2tlbixcbiAgICAgICAgICAgICAgZXhwaXJlc0luOiByZXN1bHQuZXhwaXJlc0luLFxuICAgICAgICAgICAgICByb2xlczogcmVzdWx0LnJvbGVzLFxuICAgICAgICAgICAgICBwZXJtaXNzaW9uczogcmVzdWx0LnBlcm1pc3Npb25zLFxuICAgICAgICAgICAgfSBhcyBTaWduaW5SZXNwb25zZSlcbiAgICAgICksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgY29uc3QgYXV0aEVycm9yOiBBdXRoRXJyb3IgPSB7XG4gICAgICAgICAgY29kZTogZXJyb3IuY29kZSB8fCAnT0FVVEhfRVJST1InLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfHwgJ0Vycm9yIGRlIGF1dGVudGljYWNpw7NuIE9BdXRoJyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0RXJyb3IoYXV0aEVycm9yKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gYXV0aEVycm9yKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb250aW7DumEgdW4gbG9naW4gT0F1dGggcXVlIHZvbHZpw7MgcG9yIHJlZGlyZWN0IHByaW5jaXBhbCBjb24gTUZBIHJlcXVlcmlkby5cbiAgICogRW4gZXNlIGNhc28gYHNpZ25pbldpdGhPQXV0aCgpYCBubyBwdWVkZSBlbWl0aXIgcG9ycXVlIGxhIHDDoWdpbmEgbmF2ZWfDsyBhbFxuICAgKiBiYWNrZW5kIE9BdXRoIHkgZWwgY2FsbGJhY2sgY29ycmUgZW4gdW5hIHJ1dGEgbnVldmEgZGUgbGEgbWlzbWEgU1BBLlxuICAgKi9cbiAgc2V0T0F1dGhNRkFQZW5kaW5nKG1mYVRva2VuOiBzdHJpbmcsIG1ldGhvZDogTUZBTWV0aG9kKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xlYXJFcnJvcigpO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldE1GQVBlbmRpbmcoe1xuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBtZmFUb2tlbixcbiAgICAgIG1ldGhvZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWaW5jdWxhIHVuIHByb3ZlZWRvciBPQXV0aCBhZGljaW9uYWwgYSBsYSBjdWVudGEgYWN0dWFsLlxuICAgKiBSZXF1aWVyZSBxdWUgZWwgdXN1YXJpbyBlc3TDqSBhdXRlbnRpY2Fkby5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyIC0gUHJvdmVlZG9yIE9BdXRoIGEgdmluY3VsYXJcbiAgICovXG4gIGxpbmtPQXV0aFByb3ZpZGVyKHByb3ZpZGVyOiBPQXV0aFByb3ZpZGVyKTogT2JzZXJ2YWJsZTx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5zdGFydExpbmtGbG93KHByb3ZpZGVyKS5waXBlKFxuICAgICAgbWFwKCgpID0+ICh7IHN1Y2Nlc3M6IHRydWUgfSkpLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgIGNvbnN0IGF1dGhFcnJvcjogQXV0aEVycm9yID0ge1xuICAgICAgICAgIGNvZGU6IGVycm9yLmNvZGUgfHwgJ0xJTktfRVJST1InLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfHwgJ0Vycm9yIGFsIHZpbmN1bGFyIHByb3ZlZWRvcicsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldEVycm9yKGF1dGhFcnJvcik7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGF1dGhFcnJvcik7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBsb3MgcHJvdmVlZG9yZXMgT0F1dGggdmluY3VsYWRvcyBhbCB1c3VhcmlvLlxuICAgKi9cbiAgZ2V0TGlua2VkUHJvdmlkZXJzKCk6IE9ic2VydmFibGU8TGlua2VkUHJvdmlkZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5nZXRMaW5rZWRQcm92aWRlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN2aW5jdWxhIHVuIHByb3ZlZWRvciBPQXV0aCBkZSBsYSBjdWVudGEuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlciAtIFByb3ZlZWRvciBhIGRlc3ZpbmN1bGFyXG4gICAqL1xuICB1bmxpbmtPQXV0aFByb3ZpZGVyKHByb3ZpZGVyOiBPQXV0aFByb3ZpZGVyKTogT2JzZXJ2YWJsZTx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS51bmxpbmtQcm92aWRlcihwcm92aWRlcik7XG4gIH1cblxuICAvKipcbiAgICogRXN0YWJsZWNlIGNvbnRyYXNlw7FhIHBhcmEgdXN1YXJpb3MgcXVlIHNvbG8gdGllbmVuIE9BdXRoLlxuICAgKiBQZXJtaXRlIHF1ZSB1c3VhcmlvcyBPQXV0aC1vbmx5IHB1ZWRhbiB0YW1iacOpbiB1c2FyIGVtYWlsL3Bhc3N3b3JkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFzc3dvcmQgLSBOdWV2YSBjb250cmFzZcOxYVxuICAgKi9cbiAgc2V0UGFzc3dvcmRGb3JPQXV0aFVzZXIocGFzc3dvcmQ6IHN0cmluZyk6IE9ic2VydmFibGU8eyBzdWNjZXNzOiBib29sZWFuIH0+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aFNlcnZpY2Uuc2V0UGFzc3dvcmQocGFzc3dvcmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gdGllbmUgY29udHJhc2XDsWEgZXN0YWJsZWNpZGEuXG4gICAqIMOadGlsIHBhcmEgbW9zdHJhci9vY3VsdGFyIG9wY2lvbmVzIGRlIGNhbWJpbyBkZSBjb250cmFzZcOxYS5cbiAgICovXG4gIGNoZWNrSGFzUGFzc3dvcmQoKTogT2JzZXJ2YWJsZTxIYXNQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLmhhc1Bhc3N3b3JkKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0cmEgdW4gbnVldm8gdXN1YXJpby5cbiAgICogRWwgdXN1YXJpbyBxdWVkYSBlbiBlc3RhZG8gUEVORElORyBoYXN0YSB2ZXJpZmljYXIgc3UgZW1haWwuXG4gICAqL1xuICBzaWdudXAocmVxdWVzdDogU2lnbnVwUmVxdWVzdCk6IE9ic2VydmFibGU8U2lnbnVwUmVzcG9uc2U+IHtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5jbGVhckVycm9yKCk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxTaWdudXBSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9zaWdudXBgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBlbWFpbCBjb24gY8OzZGlnbyBkZSA2IGTDrWdpdG9zLlxuICAgKiBTaSBlcyBleGl0b3NvLCBoYWNlIGF1dG8tbG9naW4geSByZXRvcm5hIHRva2Vucy5cbiAgICovXG4gIHZlcmlmeUVtYWlsKHJlcXVlc3Q6IFZlcmlmeUVtYWlsUmVxdWVzdCk6IE9ic2VydmFibGU8VmVyaWZ5RW1haWxSZXNwb25zZT4ge1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsZWFyRXJyb3IoKTtcblxuICAgIC8vIHdpdGhDcmVkZW50aWFsczogZWwgdmVyaWZ5LWVtYWlsIGF1dG8tbG9ndWVhIHkgc2V0ZWEgbGEgY29va2llIEh0dHBPbmx5IGRlXG4gICAgLy8gcmVmcmVzaC4gU2luIGNyZWRlbmNpYWxlcyBlbCBicm93c2VyIGRlc2NhcnRhIGVsIFNldC1Db29raWUg4oaSIC9yZWZyZXNoIDQwMCAoSC0wNSkuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8VmVyaWZ5RW1haWxSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS92ZXJpZnktZW1haWxgLCByZXF1ZXN0LCB7IHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnZlcmlmaWVkICYmIHJlc3BvbnNlLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICAvLyBBdXRvLWxvZ2luOiBndWFyZGFyIHRva2VucyB5IGFjdHVhbGl6YXIgZXN0YWRvXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3NmdWxBdXRoKHJlc3BvbnNlIGFzIHVua25vd24gYXMgU2lnbmluUmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWVudsOtYSBjw7NkaWdvIGRlIHZlcmlmaWNhY2nDs24gYWwgZW1haWwuXG4gICAqL1xuICByZXNlbmRDb2RlKHJlcXVlc3Q6IFJlc2VuZENvZGVSZXF1ZXN0KTogT2JzZXJ2YWJsZTxSZXNlbmRDb2RlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxSZXNlbmRDb2RlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vcmVzZW5kLWNvZGVgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBjw7NkaWdvIE1GQS5cbiAgICovXG4gIHZlcmlmeU1GQShjb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1GQVZlcmlmeVJlc3BvbnNlPiB7XG4gICAgY29uc3QgbWZhU3RhdGUgPSB0aGlzLm1mYVBlbmRpbmcoKTtcbiAgICBpZiAoIW1mYVN0YXRlLm1mYVRva2VuKSB7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiAoe1xuICAgICAgICBjb2RlOiAnTUZBX05PVF9QRU5ESU5HJyxcbiAgICAgICAgbWVzc2FnZTogJ05vIGhheSB2ZXJpZmljYWNpw7NuIE1GQSBwZW5kaWVudGUnLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PE1GQVZlcmlmeVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS92ZXJpZnlgLCB7XG4gICAgICAgIG1mYVRva2VuOiBtZmFTdGF0ZS5tZmFUb2tlbixcbiAgICAgICAgY29kZSxcbiAgICAgICAgYXBwSWQ6IHRoaXMuY29uZmlnPy5hcHBJZCxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5jbGVhck1GQVBlbmRpbmcoKTtcbiAgICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3NmdWxBdXRoKHJlc3BvbnNlKTtcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNjYSBlbCB0b2tlbiBkZSBhY2Nlc28uXG4gICAqIEltcGxlbWVudGEgdG9rZW4gcm90YXRpb246IGNhZGEgcmVmcmVzaCBnZW5lcmEgdW4gbnVldm8gcmVmcmVzaCB0b2tlblxuICAgKiBxdWUgZWwgY2xpZW50ZSBkZWJlIGd1YXJkYXIgcGFyYSBlbCBwcsOzeGltbyByZWZyZXNoLlxuICAgKi9cbiAgcmVmcmVzaEFjY2Vzc1Rva2VuKCk6IE9ic2VydmFibGU8UmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgLy8gU2luZ2xlLWZsaWdodDogc2kgeWEgaGF5IHVuIC9yZWZyZXNoIGVuIHZ1ZWxvLCBkZXZvbHZlbW9zIGVsIE1JU01PXG4gICAgLy8gb2JzZXJ2YWJsZSAobXVsdGljYXN0IHbDrWEgc2hhcmVSZXBsYXkpLiBFdml0YSBsYSBjYXJyZXJhIGNvbnRyYSBsYSByb3RhY2nDs25cbiAgICAvLyBkZSByZWZyZXNoIHRva2VuIGRlbCBiYWNrZW5kLCBxdWUgcHJvZHVjw61hIDQwMSBlc3B1cmlvcyDihpIgbG9nb3V0IGFsXG4gICAgLy8gYWN0dWFsaXphci4gVmVyIGluRmxpZ2h0UmVmcmVzaCQgeSBwcm9qZWN0X3B3YS1sb2dpbi1mcmVlemUuXG4gICAgaWYgKHRoaXMuaW5GbGlnaHRSZWZyZXNoJCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5GbGlnaHRSZWZyZXNoJDtcbiAgICB9XG5cbiAgICAvLyBILTA1IHNhbWUtc2l0ZS1hd2FyZTogZW4gc2FtZS1zaXRlIChwcm9kKSBlbCByZWZyZXNoIHZhIFNPTE8gcG9yIGxhIGNvb2tpZVxuICAgIC8vIEh0dHBPbmx5IChib2R5IHZhY8OtbyksIG5vIHNlIHBlcnNpc3RlIGVuIGxvY2FsU3RvcmFnZSDihpIgdW4gWFNTIG5vIGxvIHJvYmEuXG4gICAgLy8gRW4gY3Jvc3Mtc2l0ZSAoZGV2KSBsYSBjb29raWUgZGUgdGVyY2Vyb3Mgc2UgYmxvcXVlYSAoU2FmYXJpIElUUCAvIENocm9tZVxuICAgIC8vIDNyZC1wYXJ0eSBwaGFzZS1vdXQpIOKGkiBzZSBtYW5kYSBlbiBlbCBib2R5ICsgc2UgcGVyc2lzdGUgKGZhbGxiYWNrKS5cbiAgICAvLyB3aXRoQ3JlZGVudGlhbHMgYWRqdW50YSBsYSBjb29raWUgY3VhbmRvIGVsIGJyb3dzZXIgbGEgcGVybWl0ZS5cbiAgICBjb25zdCBjdXJyZW50QWN0aXZlT3JnID0gdGhpcy5zdGF0ZSgpLmFjdGl2ZU9yZyB8fCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldEFjdGl2ZU9yZygpO1xuICAgIGNvbnN0IGJvZHk6IFJlZnJlc2hSZXF1ZXN0ID0gdGhpcy5zdG9yYWdlU2VydmljZS5jb29raWVPbmx5XG4gICAgICA/IHsgYWN0aXZlT3JnSWQ6IGN1cnJlbnRBY3RpdmVPcmcsIGFwcElkOiB0aGlzLmNvbmZpZz8uYXBwSWQgfVxuICAgICAgOiB7XG4gICAgICAgICAgcmVmcmVzaFRva2VuOiB0aGlzLnN0YXRlKCkucmVmcmVzaFRva2VuLFxuICAgICAgICAgIGFjdGl2ZU9yZ0lkOiBjdXJyZW50QWN0aXZlT3JnLFxuICAgICAgICAgIGFwcElkOiB0aGlzLmNvbmZpZz8uYXBwSWQsXG4gICAgICAgIH07XG5cbiAgICB0aGlzLmluRmxpZ2h0UmVmcmVzaCQgPSB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFJlZnJlc2hSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9yZWZyZXNoYCwgYm9keSwgeyB3aXRoQ3JlZGVudGlhbHM6IHRydWUgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICAvLyBOdW5jYSBkZWphciBlbCByZWZyZXNoIGNvbGdhZG86IHNpIGxhIHJlZC9MYW1iZGEgbm8gcmVzcG9uZGUgYSB0aWVtcG8sXG4gICAgICAgIC8vIGVtaXRpbW9zIGVycm9yIOKGkiBsb3MgY2FsbGVycyAoaW5pdGlhbGl6ZSwgaW50ZXJjZXB0b3IpIGxvIG1hbmVqYW4geSBsYVxuICAgICAgICAvLyBVSSBkZWphIGRlIGVzcGVyYXIuIFZlciBSRUZSRVNIX1RJTUVPVVRfTVMuXG4gICAgICAgIHRpbWVvdXQoUkVGUkVTSF9USU1FT1VUX01TKSxcbiAgICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBjb25zdCBleHBpcmVzQXQgPSBEYXRlLm5vdygpICsgcmVzcG9uc2UuZXhwaXJlc0luICogMTAwMDtcblxuICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZUFjY2Vzc1Rva2VuKHJlc3BvbnNlLmFjY2Vzc1Rva2VuLCByZXNwb25zZS5leHBpcmVzSW4pO1xuICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVJlZnJlc2hUb2tlbihyZXNwb25zZS5yZWZyZXNoVG9rZW4pO1xuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZUFjY2Vzc1Rva2VuKHJlc3BvbnNlLmFjY2Vzc1Rva2VuLCBleHBpcmVzQXQpO1xuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVJlZnJlc2hUb2tlbihyZXNwb25zZS5yZWZyZXNoVG9rZW4pOyAvLyBzZWxmLWdhdGU6IG5vLW9wIGVuIGNvb2tpZU9ubHlcblxuICAgICAgICAgIC8vIFN5bmMgaXNTdXBlckFkbWluIGZyb20gcmVmcmVzaGVkIEpXVCBzbyBwbGF0Zm9ybSBhZG1pbiBwcm9tb3Rpb24vcmV2b2NhdGlvblxuICAgICAgICAgIC8vIHRha2VzIGVmZmVjdCB3aXRob3V0IHJlcXVpcmluZyBhIGZ1bGwgcmUtbG9naW4uXG4gICAgICAgICAgY29uc3QgcGFyc2VkVG9rZW4gPSB0aGlzLnRva2VuU2VydmljZS5wYXJzZVRva2VuKHJlc3BvbnNlLmFjY2Vzc1Rva2VuKTtcbiAgICAgICAgICBpZiAocGFyc2VkVG9rZW4/Lm9yZykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlQWN0aXZlT3JnKHBhcnNlZFRva2VuLm9yZyk7XG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVBY3RpdmVPcmcocGFyc2VkVG9rZW4ub3JnLCB7IHBlcnNpc3RQcmVmZXJyZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBuZXdJc1N1cGVyQWRtaW4gPVxuICAgICAgICAgICAgcmVzcG9uc2UucGVybWlzc2lvbnM/LmluY2x1ZGVzKCcqOionKSB8fCBwYXJzZWRUb2tlbj8uYWRtaW4gPT09IHRydWUgfHwgZmFsc2U7XG4gICAgICAgICAgY29uc3QgbmV3Um9sZXMgPSByZXNwb25zZS5yb2xlcyA/PyB0aGlzLnN0YXRlKCkucm9sZXM7XG4gICAgICAgICAgY29uc3QgbmV3UGVybXMgPSByZXNwb25zZS5wZXJtaXNzaW9ucyA/PyB0aGlzLnN0YXRlKCkucGVybWlzc2lvbnM7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUGVybWlzc2lvbnMobmV3Um9sZXMsIG5ld1Blcm1zLCBuZXdJc1N1cGVyQWRtaW4pO1xuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZVBlcm1pc3Npb25zKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbklkOiAnJyxcbiAgICAgICAgICAgIHJvbGVzOiBuZXdSb2xlcyxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiBuZXdQZXJtcyxcbiAgICAgICAgICAgIGlzU3VwZXJBZG1pbjogbmV3SXNTdXBlckFkbWluLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnPy5lbmFibGVGaXJlYmFzZUludGVncmF0aW9uICYmIHJlc3BvbnNlLmZpcmViYXNlVG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2lnbkluV2l0aEZpcmViYXNlKHJlc3BvbnNlLmZpcmViYXNlVG9rZW4pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuc3RhcnRSZWZyZXNoVGltZXIoKTtcbiAgICAgICAgICB0aGlzLnN5bmNTZXJ2aWNlLmJyb2FkY2FzdCh7XG4gICAgICAgICAgICB0eXBlOiAnVE9LRU5fUkVGUkVTSCcsXG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiByZXNwb25zZS5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgICAgcmVmcmVzaFRva2VuOiByZXNwb25zZS5yZWZyZXNoVG9rZW4sIC8vIE5VRVZPOiBzaW5jcm9uaXphciBlbnRyZSB0YWJzXG4gICAgICAgICAgICAgIGV4cGlyZXNBdCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICAvLyBEbyBOT1QgY2FsbCBsb2dvdXQoKSBoZXJlIOKAlCBjYWxsZXJzIGRlY2lkZSB3aGF0IHRvIGRvIG9uIGZhaWx1cmUuXG4gICAgICAgICAgLy8gVGhlIGF1dGggaW50ZXJjZXB0b3IgYWxyZWFkeSBjYWxscyBsb2dvdXQoKSBleHBsaWNpdGx5LCBhbmRcbiAgICAgICAgICAvLyBpbml0aWFsaXplKCkgb25seSBjbGVhcnMgc3RhdGUgKG5vIHJlZGlyZWN0KS4gQXV0by1uYXZpZ2F0aW5nIHRvXG4gICAgICAgICAgLy8gL2xvZ2luIGZyb20gdGhpcyBtZXRob2QgcmVkaXJlY3RzIGV2ZW4gdXNlcnMgb24gcHVibGljIHJvdXRlcy5cbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICAgIH0pLFxuICAgICAgICAvLyBMaWJlcmFyIGVsIHNsb3QgYWwgdGVybWluYXIgKMOpeGl0bywgZXJyb3IgbyB0aW1lb3V0KSBwYXJhIHF1ZSBlbFxuICAgICAgICAvLyBwcsOzeGltbyByZWZyZXNoIHJlYWwgYXJyYW5xdWUgdW5vIG51ZXZvLlxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbkZsaWdodFJlZnJlc2gkID0gbnVsbDtcbiAgICAgICAgfSksXG4gICAgICAgIC8vIE11bHRpY2FzdDogbG9zIHNpZGUtZWZmZWN0cyBkZWwgdGFwIGNvcnJlbiBVTkEgdmV6IHkgdG9kb3MgbG9zIGNhbGxlcnNcbiAgICAgICAgLy8gY29uY3VycmVudGVzIHJlY2liZW4gbGEgbWlzbWEgcmVzcHVlc3RhL2Vycm9yLiByZWZDb3VudDpmYWxzZSDihpIgcXVlIHVuXG4gICAgICAgIC8vIGNhbGxlciBzZSBkZXN1c2NyaWJlIHRlbXByYW5vIE5PIGNhbmNlbGEgbGEgcm90YWNpw7NuIGRlIHRva2VuIGVuIHZ1ZWxvLlxuICAgICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiBmYWxzZSB9KVxuICAgICAgKTtcblxuICAgIHJldHVybiB0aGlzLmluRmxpZ2h0UmVmcmVzaCQ7XG4gIH1cblxuICAvKipcbiAgICogTWFuZWphIGF1dGVudGljYWNpw7NuIGV4aXRvc2EgZGVzZGUgZnVlbnRlcyBleHRlcm5hcyAoT0F1dGgsIGV0YykuXG4gICAqIEd1YXJkYSB0b2tlbnMsIGFjdHVhbGl6YSBlc3RhZG8sIGluaWNpYSBGaXJlYmFzZSBzaSBjb3JyZXNwb25kZS5cbiAgICpcbiAgICogQHBhcmFtIGF1dGhSZXN1bHQgLSBSZXN1bHRhZG8gZGUgYXV0ZW50aWNhY2nDs24gY29uIHRva2Vuc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIERlc2RlIHVuIGZsdWpvIE9BdXRoIGV4dGVybm9cbiAgICogZXh0ZXJuYWxPQXV0aC5zaWduSW4oKS5zdWJzY3JpYmUoe1xuICAgKiAgIG5leHQ6IChyZXN1bHQpID0+IHtcbiAgICogICAgIHRoaXMuYXV0aFNlcnZpY2Uuc2V0RXh0ZXJuYWxBdXRoKHJlc3VsdCk7XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzZXRFeHRlcm5hbEF1dGgoYXV0aFJlc3VsdDoge1xuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gICAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gICAgZmlyZWJhc2VUb2tlbj86IHN0cmluZztcbiAgICBleHBpcmVzSW46IG51bWJlcjtcbiAgICByb2xlcz86IHN0cmluZ1tdO1xuICAgIHBlcm1pc3Npb25zPzogc3RyaW5nW107XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmhhbmRsZVN1Y2Nlc3NmdWxBdXRoKHtcbiAgICAgIC4uLmF1dGhSZXN1bHQsXG4gICAgICBvcGVyYXRpb25JZDogJ2V4dGVybmFsLWF1dGgnLFxuICAgICAgdG9rZW5UeXBlOiAnQmVhcmVyJyxcbiAgICB9IGFzIFNpZ25pblJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaWVycmEgc2VzacOzbiB0cmFzIHBlZGlyIGNvbmZpcm1hY2nDs24gYWwgdXN1YXJpby5cbiAgICpcbiAgICogTXVlc3RyYSB1biBkacOhbG9nbyBuYXRpdm8gKGVzdGlsbyBkZXN0cnVjdGl2bykuIFNpIGVsIHVzdWFyaW8gY29uZmlybWEsXG4gICAqIGVqZWN1dGEgYGxvZ291dCgpYC4gU2kgY2FuY2VsYSwgbm8gcGFzYSBuYWRhLlxuICAgKlxuICAgKiBUZXh0byBwb3IgZGVmZWN0byBkZXNkZSBgX2dsb2JhbGAgaTE4bjogYGxvZ291dENvbmZpcm1UaXRsZWAsXG4gICAqIGBsb2dvdXRDb25maXJtTWVzc2FnZWAsIGBsb2dvdXRgLCBgY2FuY2VsYC4gT3ZlcnJpZGUgdmlhIGBvcHRzYC5cbiAgICpcbiAgICogQHJldHVybnMgdHJ1ZSBzaSBlbCB1c3VhcmlvIGNvbmZpcm3DsyAobG9nb3V0IGVqZWN1dGFkbyksIGZhbHNlIHNpIGNhbmNlbMOzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBvbkxvZ291dENsaWNrKCkgeyB0aGlzLmF1dGgubG9nb3V0V2l0aENvbmZpcm1hdGlvbigpOyB9XG4gICAqL1xuICBhc3luYyBsb2dvdXRXaXRoQ29uZmlybWF0aW9uKG9wdHM/OiB7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgbWVzc2FnZT86IHN0cmluZztcbiAgICBjb25maXJtVGV4dD86IHN0cmluZztcbiAgICBjYW5jZWxUZXh0Pzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdCA9IChrZXk6IHN0cmluZywgZmFsbGJhY2s6IHN0cmluZykgPT4gdGhpcy5pMThuU2VydmljZT8udChrZXkpIHx8IGZhbGxiYWNrO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtRGVzdHJ1Y3RpdmUoe1xuICAgICAgdGl0bGU6IG9wdHM/LnRpdGxlID8/IHQoJ2xvZ291dENvbmZpcm1UaXRsZScsICdDZXJyYXIgc2VzacOzbicpLFxuICAgICAgbWVzc2FnZTogb3B0cz8ubWVzc2FnZSA/PyB0KCdsb2dvdXRDb25maXJtTWVzc2FnZScsICfCv1NlZ3VybyBxdWUgZGVzZWFzIGNlcnJhciBzZXNpw7NuPycpLFxuICAgICAgY29uZmlybUJ1dHRvbjogeyB0ZXh0OiBvcHRzPy5jb25maXJtVGV4dCA/PyB0KCdsb2dvdXQnLCAnQ2VycmFyIHNlc2nDs24nKSB9LFxuICAgICAgY2FuY2VsQnV0dG9uOiB7IHRleHQ6IG9wdHM/LmNhbmNlbFRleHQgPz8gdCgnY2FuY2VsJywgJ0NhbmNlbGFyJykgfSxcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHQuY29uZmlybWVkKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvZ291dCgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaWVycmEgc2VzacOzbi5cbiAgICovXG4gIGFzeW5jIGxvZ291dChvcHRpb25zOiB7IHJlZGlyZWN0PzogYm9vbGVhbjsgYnJvYWRjYXN0PzogYm9vbGVhbiB9ID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZWRpcmVjdCA9IG9wdGlvbnMucmVkaXJlY3QgPz8gIXRoaXMuaXNDdXJyZW50Um91dGVQdWJsaWMoKTtcbiAgICBjb25zdCBicm9hZGNhc3QgPSBvcHRpb25zLmJyb2FkY2FzdCA/PyB0cnVlO1xuXG4gICAgLy8gRWxpbWluYXIgZGlzcG9zaXRpdm8gZGVsIGJhY2tlbmQgYW50ZXMgZGUgY2VycmFyIHNlc2nDs25cbiAgICBhd2FpdCB0aGlzLnVucmVnaXN0ZXJEZXZpY2UoKTtcblxuICAgIC8vIE5vdGlmaWNhciBhbCBiYWNrZW5kIChmaXJlIGFuZCBmb3JnZXQpLiBILTA1IHNhbWUtc2l0ZS1hd2FyZTogZW4gc2FtZS1zaXRlXG4gICAgLy8gZWwgcmVmcmVzaCB2YSBwb3IgbGEgY29va2llIEh0dHBPbmx5OyBlbiBjcm9zcy1zaXRlIHNlIG1hbmRhIGVuIGVsIGJvZHkuXG4gICAgLy8gd2l0aENyZWRlbnRpYWxzIGFkanVudGEgbGEgY29va2llOyBlbCBiYWNrZW5kIHJldm9jYSBsYSBzZXNpw7NuICsgbGEgZXhwaXJhLlxuICAgIGNvbnN0IGJvZHkgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmNvb2tpZU9ubHkgPyB7fSA6IHsgcmVmcmVzaFRva2VuOiB0aGlzLnN0YXRlKCkucmVmcmVzaFRva2VuIH07XG4gICAgdGhpcy5odHRwXG4gICAgICAucG9zdChgJHt0aGlzLmJhc2VVcmx9L2xvZ291dGAsIGJvZHksIHsgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH0pXG4gICAgICAucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSlcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIC8vIENlcnJhciBzZXNpw7NuIGRlIEZpcmViYXNlIHNpIGVzdMOhIGludGVncmFkb1xuICAgIHRoaXMuc2lnbk91dEZpcmViYXNlKCk7XG5cbiAgICB0aGlzLmNsZWFyU3RhdGUoKTtcbiAgICBpZiAoYnJvYWRjYXN0KSB7XG4gICAgICB0aGlzLnN5bmNTZXJ2aWNlLmJyb2FkY2FzdCh7IHR5cGU6ICdMT0dPVVQnIH0pO1xuICAgIH1cbiAgICBpZiAocmVkaXJlY3QpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLmNvbmZpZz8ubG9naW5Sb3V0ZV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNRkEgU0VUVVAgKHVzdWFyaW8gYXV0ZW50aWNhZG8pXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmEgTUZBIHBhcmEgZWwgdXN1YXJpby5cbiAgICovXG4gIHNldHVwTUZBKG1ldGhvZDogTUZBTWV0aG9kLCBwaG9uZT86IHN0cmluZyk6IE9ic2VydmFibGU8TUZBU2V0dXBSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PE1GQVNldHVwUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3NldHVwYCwgeyBtZXRob2QsIHBob25lIH0pXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpcm1hIGxhIGNvbmZpZ3VyYWNpw7NuIGRlIE1GQS5cbiAgICovXG4gIGNvbmZpcm1NRkEoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxNRkFDb25maXJtUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxNRkFDb25maXJtUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL2NvbmZpcm1gLCB7IGNvZGUgfSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogRGVzaGFiaWxpdGEgTUZBLiBBY2VwdGEgYHBhc3N3b3JkYCBvIGBtZmFDb2RlYCAodW5vIHJlcXVlcmlkbykuXG4gICAqIGBtZmFDb2RlYCBlcyBwYXJhIHVzdWFyaW9zIE9BdXRoLW9ubHkgY29uIFRPVFAgcXVlIG5vIHRpZW5lbiBjb250cmFzZcOxYS5cbiAgICovXG4gIGRpc2FibGVNRkEoaW5wdXQ6IE1GQURpc2FibGVSZXF1ZXN0KTogT2JzZXJ2YWJsZTxNRkFEaXNhYmxlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxNRkFEaXNhYmxlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL2Rpc2FibGVgLCBpbnB1dClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICBzZW5kTUZBRGlzYWJsZUNvZGUoKTogT2JzZXJ2YWJsZTx7IG9wZXJhdGlvbklkOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PHsgb3BlcmF0aW9uSWQ6IHN0cmluZyB9PihgJHt0aGlzLmJhc2VVcmx9L21mYS9kaXNhYmxlLWNvZGVgLCB7fSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVE9UUCBNRkEgKEdvb2dsZSBBdXRoZW50aWNhdG9yKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pY2lhIGNvbmZpZ3VyYWNpw7NuIGRlIFRPVFAgTUZBLlxuICAgKiBSZXRvcm5hIGVsIHNlY3JldG8sIFVSTCBwYXJhIFFSIGNvZGUgeSBjw7NkaWdvcyBkZSByZXNwYWxkby5cbiAgICovXG4gIHNldHVwVE9UUCgpOiBPYnNlcnZhYmxlPFRPVFBTZXR1cFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8VE9UUFNldHVwUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3RvdHAvc2V0dXBgLCB7fSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2EgZWwgY8OzZGlnbyBUT1RQIHkgYWN0aXZhIE1GQS5cbiAgICogRGViZSBsbGFtYXJzZSBkZXNwdcOpcyBkZSBzZXR1cFRPVFAgY29uIGVsIGPDs2RpZ28gZGVsIGF1dGhlbnRpY2F0b3IuXG4gICAqL1xuICB2ZXJpZnlUT1RQU2V0dXAoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxUT1RQVmVyaWZ5U2V0dXBSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFRPVFBWZXJpZnlTZXR1cFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L21mYS90b3RwL3ZlcmlmeWAsIHsgY29kZSB9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdlbmVyYSBsb3MgY8OzZGlnb3MgZGUgcmVzcGFsZG8gVE9UUC5cbiAgICogTG9zIGPDs2RpZ29zIGFudGVyaW9yZXMgc29uIGludmFsaWRhZG9zLlxuICAgKi9cbiAgcmVnZW5lcmF0ZUJhY2t1cENvZGVzKCk6IE9ic2VydmFibGU8UmVnZW5lcmF0ZUJhY2t1cENvZGVzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxSZWdlbmVyYXRlQmFja3VwQ29kZXNSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvdG90cC9iYWNrdXAtY29kZXNgLCB7fSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBsYSBjYW50aWRhZCBkZSBjw7NkaWdvcyBkZSByZXNwYWxkbyByZXN0YW50ZXMuXG4gICAqL1xuICBnZXRCYWNrdXBDb2Rlc0NvdW50KCk6IE9ic2VydmFibGU8QmFja3VwQ29kZXNDb3VudFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmdldDxCYWNrdXBDb2Rlc0NvdW50UmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3RvdHAvYmFja3VwLWNvZGVzL2NvdW50YClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogRGVzYWN0aXZhIFRPVFAgTUZBIChyZXF1aWVyZSBjb250cmFzZcOxYSkuXG4gICAqL1xuICBkaXNhYmxlVE9UUChwYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxUT1RQRGlzYWJsZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8VE9UUERpc2FibGVSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvdG90cC9kaXNhYmxlYCwgeyBwYXNzd29yZCB9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBPUkdBTklaQUNJT05FU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQ2FtYmlhIGxhIG9yZ2FuaXphY2nDs24gYWN0aXZhIGRlbCB1c3VhcmlvLlxuICAgKiBHZW5lcmEgdW4gbnVldm8gRmlyZWJhc2UgdG9rZW4gY29uIGVsIGFjdGl2ZU9yZyBhY3R1YWxpemFkby5cbiAgICpcbiAgICogQHBhcmFtIG9yZ2FuaXphdGlvbklkIC0gSUQgZGUgbGEgb3JnYW5pemFjacOzbiBhIGxhIHF1ZSBjYW1iaWFyXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgY29uIGVsIG51ZXZvIEZpcmViYXNlIHRva2VuIHkgYWN0aXZlT3JnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5hdXRoLnN3aXRjaE9yZygnb3JnX3h5ejc4OScpKTtcbiAgICogLy8gRmlyZWJhc2UgeWEgZXN0w6EgcmUtYXV0ZW50aWNhZG8gY29uIGxhIG51ZXZhIG9yZ1xuICAgKiBjb25zdCBhY3RpdmVPcmcgPSBhd2FpdCB0aGlzLmZpcmViYXNlLmdldEFjdGl2ZU9yZygpO1xuICAgKiBgYGBcbiAgICovXG4gIHN3aXRjaE9yZyhvcmdhbml6YXRpb25JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTd2l0Y2hPcmdSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxTd2l0Y2hPcmdSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9zd2l0Y2gtb3JnYCwgeyBvcmdhbml6YXRpb25JZCwgYXBwSWQ6IHRoaXMuY29uZmlnPy5hcHBJZCB9KS5waXBlKFxuICAgICAgc3dpdGNoTWFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgLy8gUmUtYXV0ZW50aWNhciBlbiBGaXJlYmFzZSBjb24gZWwgbnVldm8gdG9rZW5cbiAgICAgICAgLy8gVXNhciBzd2l0Y2hNYXAgKyBmcm9tIHBhcmEgZXNwZXJhciBhIHF1ZSBGaXJlYmFzZSBjb21wbGV0ZVxuICAgICAgICBjb25zdCBmaXJlYmFzZUF1dGgkID0gcmVzcG9uc2UuZmlyZWJhc2VUb2tlblxuICAgICAgICAgID8gZnJvbSh0aGlzLnNpZ25JbldpdGhGaXJlYmFzZShyZXNwb25zZS5maXJlYmFzZVRva2VuKSlcbiAgICAgICAgICA6IG9mKHVuZGVmaW5lZCk7XG5cbiAgICAgICAgcmV0dXJuIGZpcmViYXNlQXV0aCQucGlwZShcbiAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgLy8gQWN0dWFsaXphciBhY3RpdmVPcmcgZW4gZWwgc3RhdGUgbG9jYWxcbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZUFjdGl2ZU9yZyhyZXNwb25zZS5hY3RpdmVPcmcpO1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlQWN0aXZlT3JnKHJlc3BvbnNlLmFjdGl2ZU9yZyk7XG4gICAgICAgICAgICAvLyBQZXJzaXN0aXIgZWwgbnVldm8gYWNjZXNzIHRva2VuIChpbmNsdXllIGFjdGl2ZU9yZyBhY3R1YWxpemFkbykuXG4gICAgICAgICAgICAvLyBTaW4gZXN0bywgZWwgYm9vdHN0cmFwIHBvc3QtcmVmcmVzaCB1c2EgZWwgSldUIGNhY2hlYWRvIGNvbiBsYSBvcmcgYW50ZXJpb3IuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArIChyZXNwb25zZS5leHBpcmVzSW4gPz8gOTAwKSAqIDEwMDA7XG4gICAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZUFjY2Vzc1Rva2VuKHJlc3BvbnNlLmFjY2Vzc1Rva2VuLCByZXNwb25zZS5leHBpcmVzSW4gPz8gOTAwKTtcbiAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlQWNjZXNzVG9rZW4ocmVzcG9uc2UuYWNjZXNzVG9rZW4sIGV4cGlyZXNBdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBOb3RpZmljYXIgY2FtYmlvIGEgb3RyYXMgcGVzdGHDsWFzXG4gICAgICAgICAgICB0aGlzLnN5bmNTZXJ2aWNlLmJyb2FkY2FzdCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdPUkdfU1dJVENIJyxcbiAgICAgICAgICAgICAgcGF5bG9hZDogeyBhY3RpdmVPcmc6IHJlc3BvbnNlLmFjdGl2ZU9yZyB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgLy8gUmV0b3JuYXIgcmVzcG9uc2Ugb3JpZ2luYWwgZGVzcHXDqXMgZGUgcXVlIEZpcmViYXNlIGNvbXBsZXRlXG4gICAgICAgICAgbWFwKCgpID0+IHJlc3BvbnNlKVxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBFUkZJTCBERSBVU1VBUklPXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGVsIHBlcmZpbCBkZWwgdXN1YXJpbyBhdXRlbnRpY2Fkby5cbiAgICogSW5jbHV5ZSBpbmZvcm1hY2nDs24gZGUgTUZBIHkgdGVsw6lmb25vLiBIaWRyYXRhIGVsIHN0YXRlIGF1dG9tw6F0aWNhbWVudGVcbiAgICogY29uIGBuYW1lL2hhbmRsZS9hdmF0YXJVcmwvcGhvbmVgIHBhcmEgcXVlIGBhdXRoLnVzZXIoKWAgbG9zIHJldG9ybmUuXG4gICAqL1xuICBnZXRQcm9maWxlKCk6IE9ic2VydmFibGU8R2V0UHJvZmlsZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8R2V0UHJvZmlsZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Byb2ZpbGVgKS5waXBlKFxuICAgICAgdGFwKHByb2ZpbGUgPT5cbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUHJvZmlsZUZpZWxkcyh7XG4gICAgICAgICAgbmFtZTogcHJvZmlsZS5uYW1lLFxuICAgICAgICAgIGhhbmRsZTogcHJvZmlsZS5oYW5kbGUgPz8gbnVsbCxcbiAgICAgICAgICBhdmF0YXJVcmw6IHByb2ZpbGUuYXZhdGFyVXJsID8/IG51bGwsXG4gICAgICAgICAgcGhvbmU6IHByb2ZpbGUucGhvbmUgPz8gbnVsbCxcbiAgICAgICAgfSlcbiAgICAgICksXG4gICAgICB0YXAocHJvZmlsZSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmkxOG5TZXJ2aWNlICYmIHByb2ZpbGUubGFuZ3VhZ2UpIHtcbiAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnNldExhbmd1YWdlKHByb2ZpbGUubGFuZ3VhZ2UgYXMgSTE4bkxhbmcpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWN0dWFsaXphIGVsIHBlcmZpbCBkZWwgdXN1YXJpby4gU2luY3Jvbml6YSBzdGF0ZSBjb24gbG9zIG51ZXZvcyB2YWx1ZXNcbiAgICogKG5hbWUvcGhvbmUpIOKAlCBlbCBiYWNrZW5kIHJlc3BvbnNlIG5vIGxvcyBlY2hvJ2EgcGVybyBlbCBjYWxsZXIgeWEgdGllbmVcbiAgICogbG9zIHZhbG9yZXMgcXVlIG1hbmTDsy5cbiAgICovXG4gIHVwZGF0ZVByb2ZpbGUocmVxdWVzdDogVXBkYXRlUHJvZmlsZVJlcXVlc3QpOiBPYnNlcnZhYmxlPFVwZGF0ZVByb2ZpbGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFVwZGF0ZVByb2ZpbGVSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9wcm9maWxlYCwgcmVxdWVzdCkucGlwZShcbiAgICAgIHRhcCgoKSA9PiB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVQcm9maWxlRmllbGRzKHJlcXVlc3QpKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWN0dWFsaXphIGVsIGF2YXRhciBkZWwgdXN1YXJpbyBlbiBlbCBiYWNrZW5kLiBTaW5jcm9uaXphIHN0YXRlIGNvbiBlbFxuICAgKiBgYXZhdGFyVXJsYCByZXRvcm5hZG8gcGFyYSBxdWUgZWwgaGVhZGVyIC8gZGFzaGJvYXJkIHNlIHJlZnJlc3F1ZW4gc2luXG4gICAqIG5lY2VzaWRhZCBkZSB1biBnZXRQcm9maWxlIGFkaWNpb25hbC5cbiAgICovXG4gIHVwZGF0ZUF2YXRhcihyZXF1ZXN0OiBVcGRhdGVBdmF0YXJSZXF1ZXN0KTogT2JzZXJ2YWJsZTxVcGRhdGVBdmF0YXJSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFVwZGF0ZUF2YXRhclJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Byb2ZpbGUvYXZhdGFyYCwgcmVxdWVzdCkucGlwZShcbiAgICAgIHRhcChyZXMgPT4gdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUHJvZmlsZUZpZWxkcyh7IGF2YXRhclVybDogcmVzLmF2YXRhclVybCB9KSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJFQ1VQRVJBQ0nDk04gREUgQ09OVFJBU0XDkUFcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluaWNpYSBlbCBwcm9jZXNvIGRlIHJlY3VwZXJhY2nDs24gZGUgY29udHJhc2XDsWEuXG4gICAqIEVudsOtYSB1biBjw7NkaWdvIGFsIGVtYWlsIGRlbCB1c3VhcmlvLlxuICAgKi9cbiAgZm9yZ290UGFzc3dvcmQocmVxdWVzdDogRm9yZ290UGFzc3dvcmRSZXF1ZXN0KTogT2JzZXJ2YWJsZTxGb3Jnb3RQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8Rm9yZ290UGFzc3dvcmRSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9mb3Jnb3QtcGFzc3dvcmRgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldGVhIGxhIGNvbnRyYXNlw7FhIHVzYW5kbyBlbCBjw7NkaWdvIGVudmlhZG8gcG9yIGVtYWlsLlxuICAgKi9cbiAgcmVzZXRQYXNzd29yZChyZXF1ZXN0OiBSZXNldFBhc3N3b3JkUmVxdWVzdCk6IE9ic2VydmFibGU8UmVzZXRQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8UmVzZXRQYXNzd29yZFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L3Jlc2V0LXBhc3N3b3JkYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pY2lhIGVsIHJlc2V0IGRlIE1GQSBwb3IgZW1haWwgY3VhbmRvIGVsIHVzZXIgcGVyZGnDsyBzdSAywrogZmFjdG9yXG4gICAqIChUT1RQICsgYmFja3VwIGNvZGVzKS4gRW52w61hIHVuIGPDs2RpZ28gZGUgNiBkw61naXRvcyBhbCBlbWFpbCB2ZXJpZmljYWRvLlxuICAgKiBSZXNwb25zZSBzaWVtcHJlIGdlbsOpcmljYSAoYW50aS1lbnVtZXJhY2nDs24pLlxuICAgKi9cbiAgcmVxdWVzdE1GQVJlc2V0KHJlcXVlc3Q6IE1GQVJlc2V0UmVxdWVzdFJlcXVlc3QpOiBPYnNlcnZhYmxlPE1GQVJlc2V0UmVxdWVzdFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8TUZBUmVzZXRSZXF1ZXN0UmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vbWZhL3Jlc2V0LXJlcXVlc3RgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maXJtYSBlbCByZXNldCBkZSBNRkEgY29uIGVsIGPDs2RpZ28gcmVjaWJpZG8gcG9yIGVtYWlsIOKGkiBkZXNoYWJpbGl0YSBNRkEuXG4gICAqIFRyYXMgZXN0byBlbCB1c2VyIGluaWNpYSBzZXNpw7NuIG5vcm1hbG1lbnRlIChzaW4gMsK6IGZhY3RvcikgeSByZS1lbnJvbGEuXG4gICAqL1xuICBjb25maXJtTUZBUmVzZXQocmVxdWVzdDogTUZBUmVzZXRDb25maXJtUmVxdWVzdCk6IE9ic2VydmFibGU8TUZBUmVzZXRDb25maXJtUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxNRkFSZXNldENvbmZpcm1SZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9tZmEvcmVzZXRgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmEgdW5hIGN1ZW50YSBwcmUtYXByb3Zpc2lvbmFkYSBwb3IgdW5hIG9yZ2FuaXphY2nDs24gKEFEUi0wMjMpOiBkZWZpbmVcbiAgICogbGEgY29udHJhc2XDsWEgY29uIGVsIHRva2VuIGRlbCBlbmxhY2UgZGUgZW1haWwuIEVuIMOpeGl0byBlbCBiYWNrZW5kIGRldnVlbHZlXG4gICAqIHRva2VucyBkZSBhdXRvLXNpZ25pbiDihpIgZWwgdXN1YXJpbyBxdWVkYSBsb2d1ZWFkbyAobWlzbW8gZmx1am8gcXVlIHZlcmlmeS1lbWFpbCkuXG4gICAqL1xuICBhY3RpdmF0ZUFjY291bnQocmVxdWVzdDogQWN0aXZhdGVBY2NvdW50UmVxdWVzdCk6IE9ic2VydmFibGU8QWN0aXZhdGVBY2NvdW50UmVzcG9uc2U+IHtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5jbGVhckVycm9yKCk7XG4gICAgLy8gd2l0aENyZWRlbnRpYWxzOiBhY3RpdmF0ZSBhdXRvLWxvZ3VlYSB5IHNldGVhIGxhIGNvb2tpZSBIdHRwT25seSBkZSByZWZyZXNoLlxuICAgIC8vIFNpbiBjcmVkZW5jaWFsZXMgZWwgYnJvd3NlciBkZXNjYXJ0YSBlbCBTZXQtQ29va2llIOKGkiAvcmVmcmVzaCA0MDAgKEgtMDUpLlxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PEFjdGl2YXRlQWNjb3VudFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L2FjdGl2YXRlYCwgcmVxdWVzdCwgeyB3aXRoQ3JlZGVudGlhbHM6IHRydWUgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5hY3RpdmF0ZWQgJiYgcmVzcG9uc2UuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU3VjY2Vzc2Z1bEF1dGgocmVzcG9uc2UgYXMgdW5rbm93biBhcyBTaWduaW5SZXNwb25zZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbWJpYSBsYSBjb250cmFzZcOxYSBkZWwgdXN1YXJpbyBhdXRlbnRpY2Fkby5cbiAgICogUmVxdWllcmUgbGEgY29udHJhc2XDsWEgYWN0dWFsIHBhcmEgdmVyaWZpY2FjacOzbi5cbiAgICovXG4gIGNoYW5nZVBhc3N3b3JkKGN1cnJlbnRQYXNzd29yZDogc3RyaW5nLCBuZXdQYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxDaGFuZ2VQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdDogQ2hhbmdlUGFzc3dvcmRSZXF1ZXN0ID0geyBjdXJyZW50UGFzc3dvcmQsIG5ld1Bhc3N3b3JkIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8Q2hhbmdlUGFzc3dvcmRSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9jaGFuZ2UtcGFzc3dvcmRgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDQU1CSU8gREUgRU1BSUwg4oCUIGZsdWpvIGRlIDMgcGFzb3NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgaW5pdGlhdGVFbWFpbENoYW5nZShcbiAgICBjdXJyZW50UGFzc3dvcmQ6IHN0cmluZyxcbiAgICBuZXdFbWFpbDogc3RyaW5nXG4gICk6IE9ic2VydmFibGU8SW5pdGlhdGVFbWFpbENoYW5nZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdDogSW5pdGlhdGVFbWFpbENoYW5nZVJlcXVlc3QgPSB7IGN1cnJlbnRQYXNzd29yZCwgbmV3RW1haWwgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxJbml0aWF0ZUVtYWlsQ2hhbmdlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vZW1haWwvaW5pdGlhdGVgLCByZXF1ZXN0KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpKTtcbiAgfVxuXG4gIGNvbmZpcm1FbWFpbENoYW5nZVN0ZXAxKGNvZGU6IHN0cmluZyk6IE9ic2VydmFibGU8Q29uZmlybUVtYWlsQ2hhbmdlU3RlcDFSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3Q6IENvbmZpcm1FbWFpbENoYW5nZVN0ZXAxUmVxdWVzdCA9IHsgY29kZSB9O1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PENvbmZpcm1FbWFpbENoYW5nZVN0ZXAxUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vZW1haWwvY29uZmlybS8xYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICBjb25maXJtRW1haWxDaGFuZ2VTdGVwMihjb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENvbmZpcm1FbWFpbENoYW5nZVN0ZXAyUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0OiBDb25maXJtRW1haWxDaGFuZ2VTdGVwMlJlcXVlc3QgPSB7IGNvZGUgfTtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxDb25maXJtRW1haWxDaGFuZ2VTdGVwMlJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L2VtYWlsL2NvbmZpcm0vMmAsIHJlcXVlc3QpXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFMVEEgREUgQ09SUkVPIOKAlCBjdWVudGFzIHNpbiBlbWFpbFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pY2lhIGVsIGFsdGEgZGUgY29ycmVvIHBhcmEgdW5hIGN1ZW50YSBxdWUgbm8gdGllbmUgdW5vICh2ZXJcbiAgICogYE9BdXRoUmVzdWx0LnJlcXVpcmVzRW1haWxgKS4gRW52w61hIHVuIGPDs2RpZ28gYWwgY29ycmVvIGluZGljYWRvLlxuICAgKlxuICAgKiBObyBwaWRlIGNvbnRyYXNlw7FhIHBvcnF1ZSBlc3RhcyBjdWVudGFzIHNvbiBPQXV0aC1vbmx5LiBMYSBhdXRvcml6YWNpw7NuXG4gICAqIHZpZW5lIGRlbCBhY2Nlc3MgdG9rZW4uXG4gICAqL1xuICBhZGRFbWFpbChlbWFpbDogc3RyaW5nKTogT2JzZXJ2YWJsZTxBZGRFbWFpbFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdDogQWRkRW1haWxSZXF1ZXN0ID0geyBlbWFpbCB9O1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PEFkZEVtYWlsUmVzcG9uc2U+KGAke3RoaXMuYmFzZVVybH0vZW1haWwvYWRkYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvKiogQ29uZmlybWEgZWwgYWx0YSBkZSBjb3JyZW8gY29uIGVsIGPDs2RpZ28gcmVjaWJpZG8uICovXG4gIGNvbmZpcm1BZGRFbWFpbChjb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENvbmZpcm1BZGRFbWFpbFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdDogQ29uZmlybUFkZEVtYWlsUmVxdWVzdCA9IHsgY29kZSB9O1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PENvbmZpcm1BZGRFbWFpbFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L2VtYWlsL2FkZC9jb25maXJtYCwgcmVxdWVzdClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyb3IgPT4gdGhpcy5oYW5kbGVBdXRoRXJyb3IoZXJyb3IpKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRUxJTUlOQUNJw5NOIERFIENVRU5UQVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRWxpbWluYSBsYSBjdWVudGEgZGVsIHVzdWFyaW8gKHNvZnQgZGVsZXRlKS5cbiAgICogUmVxdWllcmUgY29uZmlybWFjacOzbiBkZSBjb250cmFzZcOxYSBwb3Igc2VndXJpZGFkLlxuICAgKiBEZXNwdcOpcyBkZSBlbGltaW5hciwgY2llcnJhIHNlc2nDs24gYXV0b23DoXRpY2FtZW50ZS5cbiAgICpcbiAgICogQHBhcmFtIHBhc3N3b3JkIC0gQ29udHJhc2XDsWEgYWN0dWFsIHBhcmEgY29uZmlybWFyXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgY29uIHJlc3VsdGFkbyBkZSBsYSBlbGltaW5hY2nDs25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhc3luYyBjb25maXJtRGVsZXRlQWNjb3VudChwYXNzd29yZDogc3RyaW5nKSB7XG4gICAqICAgdHJ5IHtcbiAgICogICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuYXV0aC5kZWxldGVBY2NvdW50KHBhc3N3b3JkKSk7XG4gICAqICAgICBjb25zb2xlLmxvZyhyZXN1bHQubWVzc2FnZSk7IC8vIFwiVHUgY3VlbnRhIGhhIHNpZG8gZWxpbWluYWRhLi4uXCJcbiAgICogICAgIC8vIFVzdWFyaW8gZXMgcmVkaXJpZ2lkbyBhdXRvbcOhdGljYW1lbnRlIGFsIGxvZ2luXG4gICAqICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICogICAgIC8vIE1hbmVqYXIgZXJyb3IgKGNvbnRyYXNlw7FhIGluY29ycmVjdGEsIGV0YylcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICAvKipcbiAgICogRW52w61hIHVuIGPDs2RpZ28gT1RQIGFsIGVtYWlsIGRlbCB1c3VhcmlvIHBhcmEgY29uZmlybWFyIGxhIGVsaW1pbmFjacOzbi5cbiAgICogU29sbyBhcGxpY2EgYSB1c3VhcmlvcyBPQXV0aCBzaW4gY29udHJhc2XDsWEgKGBoYXNQYXNzd29yZCgpID09PSBmYWxzZWApLlxuICAgKi9cbiAgc2VuZERlbGV0ZUFjY291bnRDb2RlKCk6IE9ic2VydmFibGU8U2VuZERlbGV0ZUFjY291bnRDb2RlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDxTZW5kRGVsZXRlQWNjb3VudENvZGVSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9hY2NvdW50L2RlbGV0ZS1jb2RlYCwge30pXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVsaW1pbmEgbGEgY3VlbnRhIGRlbCB1c3VhcmlvIChzb2Z0IGRlbGV0ZSkuXG4gICAqIC0gVXN1YXJpb3MgY29uIGNvbnRyYXNlw7FhOiBwYXNhciBgeyBwYXNzd29yZCB9YC5cbiAgICogLSBVc3VhcmlvcyBPQXV0aCBzaW4gY29udHJhc2XDsWE6IHBhc2FyIGB7IGNvZGUgfWAgKG9idGVuaWRvIHZpYSBzZW5kRGVsZXRlQWNjb3VudENvZGUpLlxuICAgKiBEZXNwdcOpcyBkZSBlbGltaW5hciwgY2llcnJhIHNlc2nDs24geSByZWRpcmlnZSBhbCBsb2dpbiBhdXRvbcOhdGljYW1lbnRlLlxuICAgKi9cbiAgZGVsZXRlQWNjb3VudChjcmVkZW50aWFsczoge1xuICAgIHBhc3N3b3JkPzogc3RyaW5nO1xuICAgIGNvZGU/OiBzdHJpbmc7XG4gIH0pOiBPYnNlcnZhYmxlPERlbGV0ZUFjY291bnRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5kZWxldGU8RGVsZXRlQWNjb3VudFJlc3BvbnNlPihgJHt0aGlzLmJhc2VVcmx9L2FjY291bnRgLCB7IGJvZHk6IGNyZWRlbnRpYWxzIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBpZiAocmVzcG9uc2UuZGVsZXRlZCkge1xuICAgICAgICAgICAgLy8gTGltcGlhciBlc3RhZG8geSBjZXJyYXIgc2VzacOzbiBzaW4gbm90aWZpY2FyIGFsIGJhY2tlbmRcbiAgICAgICAgICAgIC8vIChsYSBzZXNpw7NuIHlhIGZ1ZSByZXZvY2FkYSBwb3IgZWwgYmFja2VuZClcbiAgICAgICAgICAgIHRoaXMuc2lnbk91dEZpcmViYXNlKCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU3RhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuc3luY1NlcnZpY2UuYnJvYWRjYXN0KHsgdHlwZTogJ0xPR09VVCcgfSk7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5jb25maWc/LmxvZ2luUm91dGVdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICAgICk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUEVSTUlTT1NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbG9zIHBlcm1pc29zIGFjdHVhbGl6YWRvcyBkZWwgYmFja2VuZC5cbiAgICovXG4gIGZldGNoUGVybWlzc2lvbnMoKTogT2JzZXJ2YWJsZTxHZXRQZXJtaXNzaW9uc1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8R2V0UGVybWlzc2lvbnNSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9wZXJtaXNzaW9uc2ApLnBpcGUoXG4gICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVQZXJtaXNzaW9ucyhcbiAgICAgICAgICByZXNwb25zZS5yb2xlcyxcbiAgICAgICAgICByZXNwb25zZS5wZXJtaXNzaW9ucyxcbiAgICAgICAgICByZXNwb25zZS5pc1N1cGVyQWRtaW5cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlUGVybWlzc2lvbnMocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLnN5bmNTZXJ2aWNlLmJyb2FkY2FzdCh7IHR5cGU6ICdQRVJNSVNTSU9OU19VUERBVEUnIH0pO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gdGllbmUgdW4gcGVybWlzbyBlc3BlY8OtZmljby5cbiAgICogRm9ybWF0bzogXCJyZXNvdXJjZTphY3Rpb25cIiAoZWo6IFwidGVtcGxhdGVzOmVkaXRcIilcbiAgICovXG4gIGhhc1Blcm1pc3Npb24ocGVybWlzc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNTdXBlckFkbWluKCkpIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgW3Jlc291cmNlLCBhY3Rpb25dID0gcGVybWlzc2lvbi5zcGxpdCgnOicpO1xuICAgIHJldHVybiB0aGlzLnBlcm1pc3Npb25zKCkuc29tZShwID0+IHtcbiAgICAgIGNvbnN0IFtwUmVzb3VyY2UsIHBBY3Rpb25dID0gcC5zcGxpdCgnOicpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKHBSZXNvdXJjZSA9PT0gJyonIHx8IHBSZXNvdXJjZSA9PT0gcmVzb3VyY2UpICYmIChwQWN0aW9uID09PSAnKicgfHwgcEFjdGlvbiA9PT0gYWN0aW9uKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHRpZW5lIGFsZ3VubyBkZSBsb3MgcGVybWlzb3MgZGFkb3MuXG4gICAqL1xuICBoYXNBbnlQZXJtaXNzaW9uKHBlcm1pc3Npb25zOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwZXJtaXNzaW9ucy5zb21lKHAgPT4gdGhpcy5oYXNQZXJtaXNzaW9uKHApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHRpZW5lIHRvZG9zIGxvcyBwZXJtaXNvcyBkYWRvcy5cbiAgICovXG4gIGhhc0FsbFBlcm1pc3Npb25zKHBlcm1pc3Npb25zOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwZXJtaXNzaW9ucy5ldmVyeShwID0+IHRoaXMuaGFzUGVybWlzc2lvbihwKSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyB0aWVuZSB1biByb2wgZXNwZWPDrWZpY28uXG4gICAqL1xuICBoYXNSb2xlKHJvbGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJvbGVzKCkuc29tZShyID0+IHIudG9Mb3dlckNhc2UoKSA9PT0gcm9sZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIQU5ETEUgKFVTRVJOQU1FKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQWN0dWFsaXphIGVsIGhhbmRsZSAoQHVzZXJuYW1lKSBkZWwgdXN1YXJpby5cbiAgICogQHBhcmFtIGhhbmRsZSAtIE51ZXZvIGhhbmRsZSAoc2luIEAsIGVqOiBcInZpY3RvcnZcIilcbiAgICovXG4gIHVwZGF0ZUhhbmRsZShoYW5kbGU6IHN0cmluZyk6IE9ic2VydmFibGU8VXBkYXRlSGFuZGxlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxVcGRhdGVIYW5kbGVSZXNwb25zZT4oYCR7dGhpcy5iYXNlVXJsfS9wcm9maWxlL2hhbmRsZWAsIHsgaGFuZGxlIH0pLnBpcGUoXG4gICAgICB0YXAoKCkgPT4gdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlUHJvZmlsZUZpZWxkcyh7IGhhbmRsZSB9KSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuaGFuZGxlQXV0aEVycm9yKGVycm9yKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIHVuIGhhbmRsZSBlc3TDoSBkaXNwb25pYmxlLlxuICAgKiBAcGFyYW0gaGFuZGxlIC0gSGFuZGxlIGEgdmVyaWZpY2FyIChzaW4gQClcbiAgICovXG4gIGNoZWNrSGFuZGxlQXZhaWxhYmlsaXR5KGhhbmRsZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxDaGVja0hhbmRsZVJlc3BvbnNlPiB7XG4gICAgLy8gU2VydmVyIHJlc3BvbnNlOiB7IG9wZXJhdGlvbklkLCB1c2VyPywgZm91bmQgfS4gZm91bmQ9dHJ1ZSDihpIgaGFuZGxlIHRha2VuLlxuICAgIC8vIExpYiBzZW1hbnRpYzogYXZhaWxhYmxlID0gIWZvdW5kLlxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5nZXQ8e1xuICAgICAgICBvcGVyYXRpb25JZDogc3RyaW5nO1xuICAgICAgICBmb3VuZDogYm9vbGVhbjtcbiAgICAgIH0+KGAke3RoaXMudXNlcnNCYXNlVXJsfS9oYW5kbGUvJHtlbmNvZGVVUklDb21wb25lbnQoaGFuZGxlKX1gKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChyYXcgPT4gKHtcbiAgICAgICAgICBvcGVyYXRpb25JZDogcmF3Lm9wZXJhdGlvbklkLFxuICAgICAgICAgIGhhbmRsZSxcbiAgICAgICAgICBhdmFpbGFibGU6ICFyYXcuZm91bmQsXG4gICAgICAgIH0pKSxcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLmhhbmRsZUF1dGhFcnJvcihlcnJvcikpXG4gICAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBSSVZBVEUgTUVUSE9EU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIGdldCBiYXNlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuY29uZmlnPy5hcGlVcmx9JHt0aGlzLmNvbmZpZz8uYXV0aFByZWZpeH1gO1xuICB9XG5cbiAgLyoqIEJhc2UgZm9yIC92Mi91c2VycyBlbmRwb2ludHMgKHNlcGFyYXRlIGZyb20gL3YyL2F1dGgpLiAqL1xuICBwcml2YXRlIGdldCB1c2Vyc0Jhc2VVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5jb25maWc/LmFwaVVybH0vdjIvdXNlcnNgO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTdWNjZXNzZnVsQXV0aChyZXNwb25zZTogU2lnbmluUmVzcG9uc2UgfCBNRkFWZXJpZnlSZXNwb25zZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4cGlyZXNBdCA9IERhdGUubm93KCkgKyByZXNwb25zZS5leHBpcmVzSW4hICogMTAwMDtcbiAgICBjb25zdCB0b2tlbkRhdGEgPSB0aGlzLnRva2VuU2VydmljZS5wYXJzZVRva2VuKHJlc3BvbnNlLmFjY2Vzc1Rva2VuISk7XG4gICAgY29uc3QgaXNQcmVtaXVtID0gdG9rZW5EYXRhPy5wcmVtaXVtID09PSB0cnVlO1xuXG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0QXV0aGVudGljYXRlZCh7XG4gICAgICBhY2Nlc3NUb2tlbjogcmVzcG9uc2UuYWNjZXNzVG9rZW4hLFxuICAgICAgcmVmcmVzaFRva2VuOiByZXNwb25zZS5yZWZyZXNoVG9rZW4hLFxuICAgICAgdXNlcklkOiB0b2tlbkRhdGE/LnVpZCxcbiAgICAgIGVtYWlsOiB0b2tlbkRhdGE/LmVtYWlsLFxuICAgICAgcm9sZXM6IHJlc3BvbnNlLnJvbGVzIHx8IFtdLFxuICAgICAgcGVybWlzc2lvbnM6IHJlc3BvbnNlLnBlcm1pc3Npb25zIHx8IFtdLFxuICAgICAgaXNTdXBlckFkbWluOiByZXNwb25zZS5wZXJtaXNzaW9ucz8uaW5jbHVkZXMoJyo6KicpIHx8IHRva2VuRGF0YT8uYWRtaW4gPT09IHRydWUgfHwgZmFsc2UsXG4gICAgICBpc1ByZW1pdW0sXG4gICAgICBleHBpcmVzQXQsXG4gICAgfSk7XG5cbiAgICBpZiAodG9rZW5EYXRhPy5vcmcpIHtcbiAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZUFjdGl2ZU9yZyh0b2tlbkRhdGEub3JnKTtcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZUFjdGl2ZU9yZyh0b2tlbkRhdGEub3JnKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmVTdGF0ZSh7XG4gICAgICBhY2Nlc3NUb2tlbjogcmVzcG9uc2UuYWNjZXNzVG9rZW4hLFxuICAgICAgcmVmcmVzaFRva2VuOiByZXNwb25zZS5yZWZyZXNoVG9rZW4hLFxuICAgICAgcm9sZXM6IHJlc3BvbnNlLnJvbGVzIHx8IFtdLFxuICAgICAgcGVybWlzc2lvbnM6IHJlc3BvbnNlLnBlcm1pc3Npb25zIHx8IFtdLFxuICAgICAgaXNTdXBlckFkbWluOiByZXNwb25zZS5wZXJtaXNzaW9ucz8uaW5jbHVkZXMoJyo6KicpIHx8IHRva2VuRGF0YT8uYWRtaW4gPT09IHRydWUgfHwgZmFsc2UsXG4gICAgICBpc1ByZW1pdW0sXG4gICAgICBleHBpcmVzQXQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnN0YXJ0UmVmcmVzaFRpbWVyKCk7XG4gICAgdGhpcy5zeW5jU2VydmljZS5icm9hZGNhc3QoeyB0eXBlOiAnTE9HSU4nIH0pO1xuXG4gICAgLy8gSW50ZWdyYWNpw7NuIGNvbiBGaXJlYmFzZVxuICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIGhhbmRsZVN1Y2Nlc3NmdWxBdXRoIC0gRmlyZWJhc2UgY2hlY2s6Jywge1xuICAgICAgZW5hYmxlRmlyZWJhc2VJbnRlZ3JhdGlvbjogdGhpcy5jb25maWc/LmVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb24sXG4gICAgICBoYXNGaXJlYmFzZVRva2VuOiAhIXJlc3BvbnNlLmZpcmViYXNlVG9rZW4sXG4gICAgfSk7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbmZpZz8uZW5hYmxlRmlyZWJhc2VJbnRlZ3JhdGlvbiAmJlxuICAgICAgJ2ZpcmViYXNlVG9rZW4nIGluIHJlc3BvbnNlICYmXG4gICAgICByZXNwb25zZS5maXJlYmFzZVRva2VuXG4gICAgKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBDYWxsaW5nIHNpZ25JbldpdGhGaXJlYmFzZScpO1xuICAgICAgYXdhaXQgdGhpcy5zaWduSW5XaXRoRmlyZWJhc2UocmVzcG9uc2UuZmlyZWJhc2VUb2tlbik7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8uZW5hYmxlRmlyZWJhc2VJbnRlZ3JhdGlvbikge1xuICAgICAgLy8gRWwgbG9naW4gTk8gdHJham8gZmlyZWJhc2VUb2tlbiAoZWouIGZsdWpvIE9BdXRoIHF1ZSBsbyBwZXJkacOzKS4gRW4gdmV6XG4gICAgICAvLyBkZSBxdWVkYXIgc2luIHNlc2nDs24gZGUgRmlyZWJhc2UsIHJlY3Vycmltb3MgYWwgZmFsbGJhY2sgc2VsZi1oZWFsaW5nOlxuICAgICAgLy8gL3JlZnJlc2ggc8OtIGRldnVlbHZlIHVuIGZpcmViYXNlVG9rZW4gY29uZmlhYmxlLlxuICAgICAgY29uc29sZS5sb2coJ1tGQkF1dGhdIGxvZ2luIHJlc3BvbnNlIHNpbiBmaXJlYmFzZVRva2VuIOKGkiByZWN1cnJpZW5kbyBhIGZhbGxiYWNrIC9yZWZyZXNoJyk7XG4gICAgICB2b2lkIHRoaXMucmVlc3RhYmxpc2hGaXJlYmFzZVZpYVJlZnJlc2goJ2xvZ2luLW1pc3NpbmctZmlyZWJhc2UtdG9rZW4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gRmlyZWJhc2Ugc2lnbmluIHNraXBwZWQgLSBpbnRlZ3JhY2nDs24gRmlyZWJhc2UgZGVzYWN0aXZhZGEnKTtcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RybyBhdXRvbcOhdGljbyBkZSBkaXNwb3NpdGl2byBwYXJhIHB1c2ggbm90aWZpY2F0aW9uc1xuICAgIGlmICh0aGlzLmNvbmZpZz8uZW5hYmxlRGV2aWNlUmVnaXN0cmF0aW9uKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRGV2aWNlSWZOZWVkZWQoKTsgLy8gZmlyZS1hbmQtZm9yZ2V0XG4gICAgfVxuXG4gICAgLy8gU2luY3Jvbml6YXIgaWRpb21hIGRlbCB1c3VhcmlvIGNvbiBpMThuXG4gICAgaWYgKHRoaXMuaTE4blNlcnZpY2UgJiYgJ2xhbmd1YWdlJyBpbiByZXNwb25zZSAmJiByZXNwb25zZS5sYW5ndWFnZSkge1xuICAgICAgY29uc3QgdXNlckxhbmcgPSByZXNwb25zZS5sYW5ndWFnZSBhcyBJMThuTGFuZztcbiAgICAgIGNvbnN0IGN1cnJlbnRMYW5nID0gdGhpcy5pMThuU2VydmljZS5sYW5nKCk7XG4gICAgICBpZiAodXNlckxhbmcgIT09IGN1cnJlbnRMYW5nKSB7XG4gICAgICAgIHRoaXMuaTE4blNlcnZpY2Uuc2V0TGFuZ3VhZ2UodXNlckxhbmcpO1xuICAgICAgICBjb25zb2xlLmxvZyhgW1ZhbHRlY2hBdXRoXSBMYW5ndWFnZSBzeW5jZWQgdG86ICR7dXNlckxhbmd9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTGlzdGVuZXIgRmlyZXN0b3JlIFJCQUMg4oCUIG9wdC1pbiB2aWEgZW5hYmxlRmlyZXN0b3JlUkJBQzogdHJ1ZVxuICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuc3RhdGVTZXJ2aWNlLnN0YXRlKCkudXNlcklkO1xuICAgIGlmICh1c2VySWQpIHtcbiAgICAgIHRoaXMuc2V0dXBGaXJlc3RvcmVSQkFDU3luYyh1c2VySWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BSZWZyZXNoVGltZXIoKTtcbiAgICB0aGlzLnRlYXJkb3duRmlyZXN0b3JlUkJBQ1N5bmMoKTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5yZXNldCgpO1xuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBGaXJlc3RvcmVSQkFDU3luYyh1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWc/LmVuYWJsZUZpcmVzdG9yZVJCQUMgfHwgIXRoaXMuZmlyZXN0b3JlSW5zdGFuY2UpIHJldHVybjtcbiAgICB0aGlzLnRlYXJkb3duRmlyZXN0b3JlUkJBQ1N5bmMoKTtcblxuICAgIGlmICghdGhpcy5maXJlYmFzZVNlcnZpY2UgfHwgdGhpcy5maXJlYmFzZVNlcnZpY2UuZmlyZWJhc2VBdXRoUmVhZHkoKSkge1xuICAgICAgLy8gRmlyZWJhc2Ugbm90IHVzZWQgb3IgYWxyZWFkeSBhdXRoZW50aWNhdGVkIOKAlCBhdHRhY2ggbGlzdGVuZXIgbm93LlxuICAgICAgdGhpcy5fYXR0YWNoRmlyZXN0b3JlUkJBQ0xpc3RlbmVyKHVzZXJJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpcmViYXNlIEF1dGggbm90IHJlYWR5IHlldC4gRmlyZXN0b3JlIHBlcm1pc3Npb24tZGVuaWVkIGVycm9ycyB0ZXJtaW5hdGVcbiAgICAgIC8vIG9uU25hcHNob3QgcGVybWFuZW50bHkgKG5vIGF1dG9tYXRpYyByZXRyeSB3aGVuIGF1dGggc3RhdGUgY2hhbmdlcykuXG4gICAgICAvLyBXYWl0IHVudGlsIHRoZSB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQsIHRoZW4gYXR0YWNoLlxuICAgICAgdGhpcy5maXJlYmFzZVNlcnZpY2UuZmlyZWJhc2VBdXRoUmVhZHkkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihyZWFkeSA9PiByZWFkeSksXG4gICAgICAgICAgdGFrZSgxKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fYXR0YWNoRmlyZXN0b3JlUkJBQ0xpc3RlbmVyKHVzZXJJZCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2F0dGFjaEZpcmVzdG9yZVJCQUNMaXN0ZW5lcih1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGRvY1JlZiA9IGRvYyh0aGlzLmZpcmVzdG9yZUluc3RhbmNlISwgJ3VzZXJzJywgdXNlcklkKTtcbiAgICB0aGlzLmZpcmVzdG9yZVJCQUNVbnN1YnNjcmliZSA9IG9uU25hcHNob3QoZG9jUmVmLCBzbmFwID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBzbmFwLmRhdGEoKTtcbiAgICAgIGlmICghZGF0YSkgcmV0dXJuO1xuXG4gICAgICAvLyBTeW5jIGRlIHBlcmZpbCDigJQgZWwgbWlycm9yIEZpcmVzdG9yZSBgL3VzZXJzL3t1aWR9YCBlcyBlbCBlc3Blam8gY2Fuw7NuaWNvXG4gICAgICAvLyBxdWUgZWwgYmFja2VuZCBlc2NyaWJlIChgU3luY1Byb2ZpbGVUb0ZpcmVzdG9yZWApLiBSZWZyZXNjYXIgYWPDoSBtYW50aWVuZVxuICAgICAgLy8gYGF1dGgudXNlcigpYCBWSVZPIChhdmF0YXIgZGVsIGhlYWRlciwgZ3JlZXRpbmcsIGV0Yy4pIHNpbiBkZXBlbmRlciBkZSB1blxuICAgICAgLy8gYGdldFByb2ZpbGUoKWAgbWFudWFsOiBlZGl0YXIgZWwgcGVyZmlsIGVuIHVuYSB2aXN0YSBzZSByZWZsZWphIGVuIHRvZGFzXG4gICAgICAvLyAoaG9tZSBpbmNsdWlkbykgZW4gY3VhbnRvIGVsIGJhY2tlbmQgYWN0dWFsaXphIGVsIG1pcnJvci5cbiAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVByb2ZpbGVGaWVsZHMoe1xuICAgICAgICBuYW1lOiBkYXRhWyduYW1lJ10gPz8gdW5kZWZpbmVkLFxuICAgICAgICBoYW5kbGU6IGRhdGFbJ2hhbmRsZSddID8/IHVuZGVmaW5lZCxcbiAgICAgICAgYXZhdGFyVXJsOiBkYXRhWydhdmF0YXJVcmwnXSA/PyB1bmRlZmluZWQsXG4gICAgICAgIHBob25lOiBkYXRhWydwaG9uZSddID8/IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByYmFjID0gZGF0YVsncmJhYyddO1xuICAgICAgaWYgKCFyYmFjKSByZXR1cm47XG4gICAgICBjb25zdCBhY3RpdmVPcmcgPSB0aGlzLnN0YXRlU2VydmljZS5zdGF0ZSgpLmFjdGl2ZU9yZztcbiAgICAgIGlmIChyYmFjWydhY3RpdmVPcmcnXSAmJiByYmFjWydhY3RpdmVPcmcnXSAhPT0gYWN0aXZlT3JnKSByZXR1cm47XG4gICAgICBjb25zdCByb2xlczogc3RyaW5nW10gPSByYmFjWydyb2xlcyddID8/IFtdO1xuICAgICAgY29uc3QgcGVybWlzc2lvbnM6IHN0cmluZ1tdID0gcmJhY1sncGVybWlzc2lvbnMnXSA/PyBbXTtcbiAgICAgIC8vIFByZXNlcnZlIHBsYXRmb3JtIGFkbWluIHN0YXR1cyBmcm9tIEpXVCDigJQgRmlyZXN0b3JlIFJCQUMgcmVmbGVjdHMgb3JnLWxldmVsXG4gICAgICAvLyBwZXJtaXNzaW9ucyB3aGljaCBkb24ndCBpbmNsdWRlICo6KiBmb3Igb3JncyB0aGUgYWRtaW4gZG9lc24ndCBvd24uXG4gICAgICBjb25zdCB0b2tlbiA9IHRoaXMuc3RhdGVTZXJ2aWNlLmFjY2Vzc1Rva2VuKCk7XG4gICAgICBjb25zdCBqd3RBZG1pbiA9IHRva2VuID8gdGhpcy50b2tlblNlcnZpY2UucGFyc2VUb2tlbih0b2tlbik/LmFkbWluID09PSB0cnVlIDogZmFsc2U7XG4gICAgICB0aGlzLnN0YXRlU2VydmljZS51cGRhdGVQZXJtaXNzaW9ucyhcbiAgICAgICAgcm9sZXMsXG4gICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICBwZXJtaXNzaW9ucy5pbmNsdWRlcygnKjoqJykgfHwgand0QWRtaW5cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRlYXJkb3duRmlyZXN0b3JlUkJBQ1N5bmMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmlyZXN0b3JlUkJBQ1Vuc3Vic2NyaWJlKSB7XG4gICAgICB0aGlzLmZpcmVzdG9yZVJCQUNVbnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5maXJlc3RvcmVSQkFDVW5zdWJzY3JpYmUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRSZWZyZXNoVGltZXIoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUmVmcmVzaFRpbWVyKCk7XG5cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGVTZXJ2aWNlLnN0YXRlKCk7XG4gICAgaWYgKCFzdGF0ZS5leHBpcmVzQXQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlZnJlc2hCZWZvcmVNcyA9ICh0aGlzLmNvbmZpZz8ucmVmcmVzaEJlZm9yZUV4cGlyeSB8fCA2MCkgKiAxMDAwO1xuICAgIGNvbnN0IHJlZnJlc2hBdCA9IHN0YXRlLmV4cGlyZXNBdCAtIHJlZnJlc2hCZWZvcmVNcztcbiAgICBjb25zdCBkZWxheSA9IHJlZnJlc2hBdCAtIERhdGUubm93KCk7XG5cbiAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICB0aGlzLnJlZnJlc2hUaW1lcklkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVmcmVzaEFjY2Vzc1Rva2VuKCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBlcnJvcjogKCkgPT4gdGhpcy5sb2dvdXQoKSxcbiAgICAgICAgfSk7XG4gICAgICB9LCBkZWxheSk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5yZWZyZXNoVG9rZW4pIHtcbiAgICAgIC8vIFRva2VuIHlhIGRlYmVyw61hIHJlZnJlc2NhcnNlLCBpbnRlbnRhciBhaG9yYVxuICAgICAgdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKS5zdWJzY3JpYmUoe1xuICAgICAgICBlcnJvcjogKCkgPT4gdGhpcy5sb2dvdXQoKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RvcFJlZnJlc2hUaW1lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWZyZXNoVGltZXJJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVmcmVzaFRpbWVySWQpO1xuICAgICAgdGhpcy5yZWZyZXNoVGltZXJJZCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTeW5jRXZlbnQoZXZlbnQ6IEF1dGhTeW5jRXZlbnQpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgJ0xPR0lOJzoge1xuICAgICAgICAvLyBSZWNhcmdhciBlc3RhZG8gZGVzZGUgc3RvcmFnZVxuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZFN0YXRlKCk7XG4gICAgICAgIGlmIChzdGF0ZS5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnJlc3RvcmVGcm9tU3RvcmFnZShzdGF0ZSk7XG4gICAgICAgICAgY29uc3QgY2xhaW1zID0gdGhpcy50b2tlblNlcnZpY2UucGFyc2VUb2tlbihzdGF0ZS5hY2Nlc3NUb2tlbik7XG4gICAgICAgICAgaWYgKGNsYWltcykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlVXNlckluZm8oY2xhaW1zLnVpZCwgY2xhaW1zLmVtYWlsKTtcbiAgICAgICAgICAgIGlmIChjbGFpbXMub3JnKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZUFjdGl2ZU9yZyhjbGFpbXMub3JnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zdGFydFJlZnJlc2hUaW1lcigpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnVE9LRU5fUkVGUkVTSCc6IHtcbiAgICAgICAgLy8gUmVjYXJnYXIgY3JlZGVuY2lhbGVzIGRlc2RlIHN0b3JhZ2Ugc29sbyBzaSBjb3JyZXNwb25kZW4gYSBsYSBtaXNtYVxuICAgICAgICAvLyBvcmcgZGUgZXN0YSBwZXN0YcOxYS4gRWwgYWNjZXNzIHRva2VuIGVzdMOhIGVuIGxvY2FsU3RvcmFnZSB5IG90cmFcbiAgICAgICAgLy8gcGVzdGHDsWEgcHVlZGUgcmVmcmVzY2FyIGVuIHVuYSBvcmcgZGlzdGludGE7IGVzbyBOTyBkZWJlIGNhbWJpYXIgZWxcbiAgICAgICAgLy8gY29udGV4dG8gdmlzaWJsZSBhY3R1YWwuIFBhcmEgY2FtYmlhciBvcmcgZXhpc3RlIE9SR19TV0lUQ0guXG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkU3RhdGUoKTtcbiAgICAgICAgaWYgKHN0YXRlLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgY29uc3QgY2xhaW1zID0gdGhpcy50b2tlblNlcnZpY2UucGFyc2VUb2tlbihzdGF0ZS5hY2Nlc3NUb2tlbik7XG4gICAgICAgICAgY29uc3QgY3VycmVudE9yZyA9XG4gICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5zdGF0ZSgpLmFjdGl2ZU9yZyB8fCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldEFjdGl2ZU9yZygpO1xuICAgICAgICAgIGlmIChjdXJyZW50T3JnICYmIGNsYWltcz8ub3JnICYmIGNsYWltcy5vcmcgIT09IGN1cnJlbnRPcmcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBgW1ZhbHRlY2hBdXRoXSBzeW5jIOKAlCBpZ25vcmluZyBUT0tFTl9SRUZSRVNIIGZvciBvcmcgJHtjbGFpbXMub3JnfTsgY3VycmVudCB0YWIgb3JnIGlzICR7Y3VycmVudE9yZ31gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnJlc3RvcmVGcm9tU3RvcmFnZShzdGF0ZSk7XG4gICAgICAgICAgaWYgKGNsYWltcykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UudXBkYXRlVXNlckluZm8oY2xhaW1zLnVpZCwgY2xhaW1zLmVtYWlsKTtcbiAgICAgICAgICAgIGlmIChjbGFpbXMub3JnKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZUFjdGl2ZU9yZyhjbGFpbXMub3JnKTtcbiAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlQWN0aXZlT3JnKGNsYWltcy5vcmcsIHsgcGVyc2lzdFByZWZlcnJlZDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc3RhcnRSZWZyZXNoVGltZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0xPR09VVCc6XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuc3RvcFJlZnJlc2hUaW1lcigpO1xuICAgICAgICBpZiAoIXRoaXMuaXNDdXJyZW50Um91dGVQdWJsaWMoKSkge1xuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLmNvbmZpZz8ubG9naW5Sb3V0ZV0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnUEVSTUlTU0lPTlNfVVBEQVRFJzoge1xuICAgICAgICBjb25zdCBwZXJtcyA9IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZFBlcm1pc3Npb25zKCk7XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnVwZGF0ZVBlcm1pc3Npb25zKHBlcm1zLnJvbGVzLCBwZXJtcy5wZXJtaXNzaW9ucywgcGVybXMuaXNTdXBlckFkbWluKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdPUkdfU1dJVENIJzpcbiAgICAgICAgLy8gT3RyYSBwZXN0YcOxYSBjYW1iacOzIGRlIG9yZ2FuaXphY2nDs24uIE5vIHJlY2FyZ2Ftb3MgbGEgVVJMIGFjdHVhbDpcbiAgICAgICAgLy8gcHVlZGUgc2VyIHVuYSBydXRhIG9yZy1zY29wZWQgKGV2ZW50cy86aWQsIHNldHRpbmdzIGRlIHVuYSBvcmcsIGV0Yy4pXG4gICAgICAgIC8vIHF1ZSBxdWVkYSBpbnbDoWxpZGEgYmFqbyBsYSBudWV2YSBvcmcuIFZvbHZlbW9zIGEgbGEgaG9tZSBhdXRlbnRpY2FkYS5cbiAgICAgICAgaWYgKCF0aGlzLmlzQ3VycmVudFJvdXRlUHVibGljKCkpIHtcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMuY29uZmlnPy5ob21lUm91dGUgfHwgJy8nLCB7IHJlcGxhY2VVcmw6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1dGFzIHDDumJsaWNhcyBjb21wYXJ0aWJsZXMgbm8gZGViZW4gc2VyIHNlY3Vlc3RyYWRhcyBwb3IgZXZlbnRvcyBnbG9iYWxlc1xuICAgKiBkZSBzZXNpw7NuLiBVbiBsb2dvdXQgZW4gb3RyYSBwZXN0YcOxYSBubyBkZWJlIG1hbmRhciBhIGAvbG9naW5gIGEgYWxndWllbiBxdWVcbiAgICogZXN0w6EgY29tcHJhbmRvIHBvciBgL2J1eS86dG9rZW5gLCBuaSByb21wZXIgdW4gbGluayBkZSB2ZW5kZWRvci5cbiAgICovXG4gIHByaXZhdGUgaXNDdXJyZW50Um91dGVQdWJsaWMoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHJlZml4ZXMgPSB0aGlzLmNvbmZpZz8ucHVibGljUm91dGVQcmVmaXhlcyA/PyBbXTtcbiAgICBpZiAocHJlZml4ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5yb3V0ZXIudXJsIHx8ICcvJztcbiAgICBjb25zdCBwYXRoID0gY3VycmVudC5zcGxpdCgnPycpWzBdLnNwbGl0KCcjJylbMF0gfHwgJy8nO1xuICAgIHJldHVybiBwcmVmaXhlcy5zb21lKHByZWZpeCA9PiB7XG4gICAgICBpZiAoIXByZWZpeCkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHByZWZpeC5zdGFydHNXaXRoKCcvJykgPyBwcmVmaXggOiBgLyR7cHJlZml4fWA7XG4gICAgICByZXR1cm4gcGF0aCA9PT0gbm9ybWFsaXplZCB8fCBwYXRoLnN0YXJ0c1dpdGgoYCR7bm9ybWFsaXplZH0vYCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUF1dGhFcnJvcihlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpOiBPYnNlcnZhYmxlPG5ldmVyPiB7XG4gICAgLy8gYGludGVycHJldEVycm9yYCAoaGVscGVyIGNvbXBhcnRpZG8gZGUgbGEgbGliKSBub3JtYWxpemEgZWxcbiAgICAvLyBIdHRwRXJyb3JSZXNwb25zZSDigJQgaW5jbHV5ZW5kbyBmYWxsb3MgZGUgcmVkIChzdGF0dXMgMCkuIEFwbGFuYW1vcyBhXG4gICAgLy8gQXV0aEVycm9yIHBhcmEgbWFudGVuZXIgbGEgQVBJIHDDumJsaWNhIGRlIEF1dGhTZXJ2aWNlIGVzdGFibGUuXG4gICAgY29uc3QgaW50ZXJwcmV0ZWQgPSBpbnRlcnByZXRFcnJvcihlcnJvcik7XG4gICAgY29uc3QgYXV0aEVycm9yOiBBdXRoRXJyb3IgPSB7XG4gICAgICBjb2RlOiBpbnRlcnByZXRlZC5jb2RlLFxuICAgICAgbWVzc2FnZTogaW50ZXJwcmV0ZWQubWVzc2FnZSxcbiAgICB9O1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldEVycm9yKGF1dGhFcnJvcik7XG4gICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gYXV0aEVycm9yKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBGSVJFQkFTRSBJTlRFR1JBVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIGFzeW5jIHNpZ25JbldpdGhGaXJlYmFzZShmaXJlYmFzZVRva2VuOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBbRkJBdXRoXSBhdXRoIGZsb3cgLT4gc2lnbkluV2l0aEZpcmViYXNlIGF0dGVtcHQgYCArXG4gICAgICAgIGBmaXJlYmFzZVNlcnZpY2VQcmVzZW50PSR7ISF0aGlzLmZpcmViYXNlU2VydmljZX1gXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuZmlyZWJhc2VTZXJ2aWNlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmlyZWJhc2VTZXJ2aWNlLnNpZ25JbldpdGhDdXN0b21Ub2tlbihmaXJlYmFzZVRva2VuKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gRmlyZWJhc2Ugc2lnbmluIHN1Y2Nlc3NmdWwnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZVNlcnZpY2Ugbm90IHByb3ZpZGVkLiBBZGQgcHJvdmlkZVZhbHRlY2hGaXJlYmFzZSgpIHRvIHlvdXIgcHJvdmlkZXJzLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTm8gYmxvcXVlYXIgZWwgbG9naW4gcHJpbmNpcGFsIHNpIEZpcmViYXNlIGZhbGxhXG4gICAgICBjb25zb2xlLmVycm9yKCdbVmFsdGVjaEF1dGhdIEZpcmViYXNlIHNpZ25pbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2lnbk91dEZpcmViYXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb25maWc/LmVuYWJsZUZpcmViYXNlSW50ZWdyYXRpb24pIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5maXJlYmFzZVNlcnZpY2UpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5maXJlYmFzZVNlcnZpY2Uuc2lnbk91dCgpO1xuICAgICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZSBzaWdub3V0IHN1Y2Nlc3NmdWwnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWdub3JhciBlcnJvcmVzIGRlIEZpcmViYXNlIHNpZ25vdXRcbiAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBGaXJlYmFzZSBzaWdub3V0IGZhaWxlZDonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlLWVzdGFibGVjZSBsYSBzZXNpw7NuIGRlIEZpcmViYXNlIEF1dGggZW4gZWwgYm9vdHN0cmFwIGRlIGxhIGFwcCBjdWFuZG9cbiAgICogZWwgYWNjZXNzIHRva2VuIGRlIGxhIGFwcCBzaWd1ZSB2w6FsaWRvIChsYSByYW1hIGRlIGluaXRpYWxpemUoKSBxdWUgTk9cbiAgICogcGFzYSBwb3IgcmVmcmVzaCkuXG4gICAqXG4gICAqIEZpcmViYXNlIEF1dGggbWFudGllbmUgc3UgUFJPUElBIHNlc2nDs24gY29uIHBlcnNpc3RlbmNpYSBJbmRleGVkREJcbiAgICogaW5kZXBlbmRpZW50ZSBkZWwgc3RvcmFnZSBkZSB0b2tlbnMgZGUgbGEgYXBwLiBFbiB1biBuYXZlZ2Fkb3Igbm9ybWFsIGVzYVxuICAgKiBwZXJzaXN0ZW5jaWEgc2UgYXV0by1yZXN0YXVyYSBzb2xhOyBlbiB1bmEgUFdBIHN0YW5kYWxvbmUgZW4gaU9TIGVsXG4gICAqIGNvbnRlbmVkb3IgZGUgc3RvcmFnZSBubyBzb2JyZXZpdmUsIHkgYGZpcmViYXNlQXV0aFJlYWR5YCBzZSBxdWVkYSBlblxuICAgKiBgZmFsc2VgIGluZGVmaW5pZGFtZW50ZSDihpIgbG9zIGxpc3RlbmVycyBGaXJlc3RvcmUgY3VlbGdhbiAofjQwcyB0aW1lb3V0KS5cbiAgICpcbiAgICogRXN0cmF0ZWdpYTogZGFyIHVuYSB2ZW50YW5hIGNvcnRhIGEgbGEgYXV0by1yZXN0YXVyYWNpw7NuIGRlIEZpcmViYXNlIHksIHNpXG4gICAqIG5vIG9jdXJyZSwgZm9yemFyIHVuIGByZWZyZXNoQWNjZXNzVG9rZW4oKWAg4oCUIHF1ZSB5YSBoYWNlIGBzaWduSW5XaXRoRmlyZWJhc2VgXG4gICAqIGNvbiBlbCBgZmlyZWJhc2VUb2tlbmAgcXVlIGRldnVlbHZlIGAvcmVmcmVzaGAuXG4gICAqXG4gICAqIEZpcmUtYW5kLWZvcmdldDogc2UgaW52b2NhIGNvbiBgdm9pZGAgcGFyYSBubyBkZW1vcmFyIGBpbml0aWFsaXplKClgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVGaXJlYmFzZVNlc3Npb25PbkJvb3RzdHJhcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVGaXJlYmFzZUludGVncmF0aW9uIHx8ICF0aGlzLmZpcmViYXNlU2VydmljZSkgcmV0dXJuO1xuXG4gICAgLy8gRGFyIGEgbGEgcGVyc2lzdGVuY2lhIEluZGV4ZWREQiBwcm9waWEgZGUgRmlyZWJhc2UgQXV0aCB1bmEgb3BvcnR1bmlkYWRcbiAgICAvLyBkZSBhdXRvLXJlc3RhdXJhcnNlIChuYXZlZ2Fkb3Igbm9ybWFsKS4gRW4gdW5hIFBXQSBzdGFuZGFsb25lIGRlIGlPU1xuICAgIC8vIG5vcm1hbG1lbnRlIE5PIGxvIGhhcsOhLlxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCAyNTAwKSk7XG5cbiAgICBpZiAodGhpcy5maXJlYmFzZVNlcnZpY2UuZmlyZWJhc2VBdXRoUmVhZHkoKSkge1xuICAgICAgY29uc29sZS5sb2coJ1tGQkF1dGhdIGJvb3RzdHJhcCDigJQgRmlyZWJhc2Ugc2Vzc2lvbiByZXN0b3JlZCBvbiBpdHMgb3duJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coXG4gICAgICAnW0ZCQXV0aF0gYm9vdHN0cmFwIOKAlCBzZXNzaW9uIHZhbGlkIGJ1dCBGaXJlYmFzZSBOT1QgcmVhZHkg4oaSIHJlY3VycmllbmRvIGEgZmFsbGJhY2snXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLnJlZXN0YWJsaXNoRmlyZWJhc2VWaWFSZWZyZXNoKCdib290c3RyYXAtc2Vzc2lvbi1yZXN0b3JlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmFsbGJhY2sgc2VsZi1oZWFsaW5nIGRlIEZpcmViYXNlIEF1dGguIFBpZGUgdW4gZmlyZWJhc2VUb2tlbiBmcmVzY28gdsOtYVxuICAgKiBgL3JlZnJlc2hgIChxdWUgc8OtIGxvIGRldnVlbHZlIGRlIGZvcm1hIGNvbmZpYWJsZSkgeSwgZW4gw6l4aXRvLFxuICAgKiBgcmVmcmVzaEFjY2Vzc1Rva2VuKClgIHlhIGVqZWN1dGEgYHNpZ25JbldpdGhGaXJlYmFzZSgpYC5cbiAgICpcbiAgICogU2UgaW52b2NhIGN1YW5kbyB1biBwYXRoIGRlIGF1dGggZGVqw7MgbGEgc2VzacOzbiBkZSBGaXJlYmFzZSBzaW4gZXN0YWJsZWNlcjpcbiAgICogIC0gbG9naW4gT0F1dGgvcGFzc3dvcmQgcXVlIHZvbHZpw7Mgc2luIGBmaXJlYmFzZVRva2VuYCxcbiAgICogIC0gY29sZCBsYXVuY2ggZGUgUFdBIGlPUyBzaW4gcGVyc2lzdGVuY2lhIGRlIEZpcmViYXNlLlxuICAgKlxuICAgKiBgcmVhc29uYCBhcGFyZWNlIGVuIGxvcyBsb2dzIGBbRkJBdXRoXSBmYWxsYmFja2AgcGFyYSBwb2RlciBhdGVzdGlndWFyXG4gICAqIGRlc2RlIGVsIGRlYnVnLWNvbnNvbGUgcXXDqSBkaXNwYXLDsyBlbCBmYWxsYmFjay5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVlc3RhYmxpc2hGaXJlYmFzZVZpYVJlZnJlc2gocmVhc29uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVGaXJlYmFzZUludGVncmF0aW9uIHx8ICF0aGlzLmZpcmViYXNlU2VydmljZSkgcmV0dXJuO1xuXG4gICAgY29uc29sZS5sb2coYFtGQkF1dGhdIGZhbGxiYWNrIOKAlCByZS1lc3RhYmxlY2llbmRvIEZpcmViYXNlIHbDrWEgL3JlZnJlc2ggKG1vdGl2bzogJHtyZWFzb259KWApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbRkJBdXRoXSBmYWxsYmFjayDigJQgL3JlZnJlc2ggT0ssIEZpcmViYXNlIHJlLWVzdGFibGVjaWRvIChtb3Rpdm86ICR7cmVhc29ufSlgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtGQkF1dGhdIGZhbGxiYWNrIOKAlCAvcmVmcmVzaCBmYWxsw7MgKG1vdGl2bzogJHtyZWFzb259KTpgLCBlKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gREVWSUNFIFJFR0lTVFJBVElPTiAoUHVzaCBOb3RpZmljYXRpb25zKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogU29saWNpdGEgcGVybWlzb3MgZGUgbm90aWZpY2FjacOzbiB5IHJlZ2lzdHJhIGVsIGRpc3Bvc2l0aXZvLlxuICAgKiBVc2FyIGN1YW5kbyBlbCB1c3VhcmlvIGFjZXB0YSByZWNpYmlyIG5vdGlmaWNhY2lvbmVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGFzeW5jIG9uRW5hYmxlTm90aWZpY2F0aW9ucygpIHtcbiAgICogICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGguZW5hYmxlTm90aWZpY2F0aW9ucygpO1xuICAgKiAgIGlmIChyZXN1bHQuZ3JhbnRlZCkge1xuICAgKiAgICAgY29uc29sZS5sb2coJ05vdGlmaWNhY2lvbmVzIGhhYmlsaXRhZGFzJyk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZW5hYmxlTm90aWZpY2F0aW9ucygpOiBQcm9taXNlPEVuYWJsZU5vdGlmaWNhdGlvbnNSZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMubWVzc2FnaW5nU2VydmljZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIE1lc3NhZ2luZ1NlcnZpY2Ugbm90IGF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuIHsgZ3JhbnRlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAoIShhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuaXNTdXBwb3J0ZWQoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1ZhbHRlY2hBdXRoXSBQdXNoIG5vdGlmaWNhdGlvbnMgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgcmV0dXJuIHsgZ3JhbnRlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMubWVzc2FnaW5nU2VydmljZS5yZXF1ZXN0UGVybWlzc2lvbigpO1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiB7IGdyYW50ZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0cmFyIGRpc3Bvc2l0aXZvIGVuIGJhY2tlbmRcbiAgICBjb25zdCByZWdpc3RlcmVkID0gYXdhaXQgdGhpcy5yZWdpc3RlckRldmljZUlmTmVlZGVkKCk7XG5cbiAgICByZXR1cm4geyBncmFudGVkOiB0cnVlLCB0b2tlbiwgcmVnaXN0ZXJlZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2FjdGl2YSBsYXMgbm90aWZpY2FjaW9uZXMgcGFyYSBlc3RlIGRpc3Bvc2l0aXZvLlxuICAgKiBFbGltaW5hIGVsIHRva2VuIGRlbCBiYWNrZW5kIHkgZGUgRkNNLlxuICAgKiBVc2FyIGRlc2RlIHVuIHRvZ2dsZSBkZSBwcmVmZXJlbmNpYXMgY3VhbmRvIGVsIHVzdWFyaW8gZGVzYWN0aXZhIG5vdGlmaWNhY2lvbmVzLlxuICAgKlxuICAgKiBOT1RBOiBFc3RvIE5PIHJldm9jYSBlbCBwZXJtaXNvIGRlbCBuYXZlZ2Fkb3IgKGVsIHVzdWFyaW8gZGViZSBoYWNlcmxvIG1hbnVhbG1lbnRlXG4gICAqIGRlc2RlIGxhIGNvbmZpZ3VyYWNpw7NuIGRlbCBuYXZlZ2Fkb3IpLiBTb2xvIGVsaW1pbmEgZWwgcmVnaXN0cm8gZGVsIGRpc3Bvc2l0aXZvLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGFzeW5jIG9uVG9nZ2xlTm90aWZpY2F0aW9ucyhlbmFibGVkOiBib29sZWFuKSB7XG4gICAqICAgaWYgKGVuYWJsZWQpIHtcbiAgICogICAgIGF3YWl0IHRoaXMuYXV0aC5lbmFibGVOb3RpZmljYXRpb25zKCk7XG4gICAqICAgfSBlbHNlIHtcbiAgICogICAgIGF3YWl0IHRoaXMuYXV0aC5kaXNhYmxlTm90aWZpY2F0aW9ucygpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGRpc2FibGVOb3RpZmljYXRpb25zKCk6IFByb21pc2U8eyBkaXNhYmxlZDogYm9vbGVhbiB9PiB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2luZ1NlcnZpY2UpIHtcbiAgICAgIHJldHVybiB7IGRpc2FibGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlbiA9IHRoaXMubWVzc2FnaW5nU2VydmljZS5jdXJyZW50VG9rZW47XG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgLy8gRWxpbWluYXIgZGVsIGJhY2tlbmRcbiAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgdGhpcy5odHRwXG4gICAgICAgICAgICAucmVxdWVzdCgnREVMRVRFJywgYCR7dGhpcy5jb25maWc/LmFwaVVybH0vdjIvdXNlcnMvbWUvZGV2aWNlcy9ieS10b2tlbmAsIHtcbiAgICAgICAgICAgICAgYm9keTogeyB0b2tlbiB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVsaW1pbmFyIHRva2VuIGRlIEZDTVxuICAgICAgICBhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZGVsZXRlVG9rZW4oKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1tWYWx0ZWNoQXV0aF0gTm90aWZpY2F0aW9ucyBkaXNhYmxlZCcpO1xuICAgICAgICByZXR1cm4geyBkaXNhYmxlZDogdHJ1ZSB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBkaXNhYmxlZDogZmFsc2UgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIEZhaWxlZCB0byBkaXNhYmxlIG5vdGlmaWNhdGlvbnM6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgZGlzYWJsZWQ6IGZhbHNlIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldG9ybmEgZWwgZXN0YWRvIGFjdHVhbCBkZSBwZXJtaXNvcyBkZSBub3RpZmljYWNpw7NuLlxuICAgKlxuICAgKiBAcmV0dXJucyAnZ3JhbnRlZCcgfCAnZGVuaWVkJyB8ICdkZWZhdWx0JyB8ICd1bnN1cHBvcnRlZCdcbiAgICovXG4gIGdldE5vdGlmaWNhdGlvblBlcm1pc3Npb25TdGF0ZSgpOiBOb3RpZmljYXRpb25QZXJtaXNzaW9uU3RhdGUge1xuICAgIGlmICghdGhpcy5tZXNzYWdpbmdTZXJ2aWNlKSB7XG4gICAgICByZXR1cm4gJ3Vuc3VwcG9ydGVkJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnaW5nU2VydmljZS5nZXRQZXJtaXNzaW9uU3RhdGUoKSBhcyBOb3RpZmljYXRpb25QZXJtaXNzaW9uU3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0cmEgbWFudWFsbWVudGUgZWwgZGlzcG9zaXRpdm8gZW4gZWwgYmFja2VuZC5cbiAgICogw5p0aWwgcGFyYSBzaW5jcm9uaXphciBkaXNwb3NpdGl2b3MgcXVlIHRpZW5lbiB0b2tlbiBGQ00gcGVybyBubyBlc3TDoW4gcmVnaXN0cmFkb3MuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlZFRva2VuIFRva2VuIEZDTSBvcGNpb25hbC4gU2kgc2UgcHJvcG9yY2lvbmEsIHNlIHVzYSBkaXJlY3RhbWVudGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgc2luIGRlcGVuZGVyIGRlbCBNZXNzYWdpbmdTZXJ2aWNlIChldml0YSB0aW1pbmcgaXNzdWVzKS5cbiAgICogQHJldHVybnMgUmVzdWx0YWRvIGRlbCByZWdpc3RybyBjb24gZGV2aWNlSWQgc2kgZnVlIGV4aXRvc29cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBTaW5jcm9uaXphciBjb24gdG9rZW4gZXhpc3RlbnRlIChyZWNvbWVuZGFkbylcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnJlZ2lzdGVyRGV2aWNlKG15VG9rZW4pO1xuICAgKlxuICAgKiAvLyBTaW4gdG9rZW4sIGludGVudGFyw6Egb2J0ZW5lcmxvIGRlbCBNZXNzYWdpbmdTZXJ2aWNlXG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5yZWdpc3RlckRldmljZSgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyRGV2aWNlKHByb3ZpZGVkVG9rZW4/OiBzdHJpbmcpOiBQcm9taXNlPFJlZ2lzdGVyRGV2aWNlUmVzdWx0PiB7XG4gICAgaWYgKCF0aGlzLmlzQXV0aGVudGljYXRlZCgpKSB7XG4gICAgICByZXR1cm4geyByZWdpc3RlcmVkOiBmYWxzZSwgZXJyb3I6ICdVc3VhcmlvIG5vIGF1dGVudGljYWRvJyB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBWZXJpZmljYXIgcGVybWlzb3Mgc2kgdGVuZW1vcyBNZXNzYWdpbmdTZXJ2aWNlXG4gICAgICBpZiAodGhpcy5tZXNzYWdpbmdTZXJ2aWNlKSB7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb24gPSB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuZ2V0UGVybWlzc2lvblN0YXRlKCk7XG4gICAgICAgIGlmIChwZXJtaXNzaW9uICE9PSAnZ3JhbnRlZCcpIHtcbiAgICAgICAgICByZXR1cm4geyByZWdpc3RlcmVkOiBmYWxzZSwgZXJyb3I6ICdQZXJtaXNvIGRlIG5vdGlmaWNhY2lvbmVzIG5vIG90b3JnYWRvJyB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVzYXIgdG9rZW4gcHJvcG9yY2lvbmFkbyBwcmltZXJvIChldml0YSB0aW1pbmcgaXNzdWVzIGNvbiBJbmplY3RvcilcbiAgICAgIGxldCB0b2tlbiA9IHByb3ZpZGVkVG9rZW4gfHwgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlPy5jdXJyZW50VG9rZW47XG5cbiAgICAgIC8vIFNpIG5vIGhheSB0b2tlbiwgaW50ZW50YXIgb2J0ZW5lcmxvIGRlbCBNZXNzYWdpbmdTZXJ2aWNlXG4gICAgICBpZiAoIXRva2VuICYmIHRoaXMubWVzc2FnaW5nU2VydmljZSkge1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLm1lc3NhZ2luZ1NlcnZpY2UuaXNTdXBwb3J0ZWQoKSkpIHtcbiAgICAgICAgICByZXR1cm4geyByZWdpc3RlcmVkOiBmYWxzZSwgZXJyb3I6ICdGQ00gbm8gc29wb3J0YWRvIGVuIGVzdGUgbmF2ZWdhZG9yJyB9O1xuICAgICAgICB9XG4gICAgICAgIHRva2VuID0gYXdhaXQgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmdldFRva2VuKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHsgcmVnaXN0ZXJlZDogZmFsc2UsIGVycm9yOiAnTm8gc2UgcHVkbyBvYnRlbmVyIHRva2VuIEZDTScgfTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVnaXN0cmFyIGVuIGJhY2tlbmRcbiAgICAgIGNvbnN0IHsgcGxhdGZvcm0sIGJyb3dzZXIsIG9zIH0gPSB0aGlzLmRldGVjdFBsYXRmb3JtSW5mbygpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgdGhpcy5odHRwLnBvc3Q8UmVnaXN0ZXJEZXZpY2VSZXNwb25zZT4oYCR7dGhpcy5jb25maWc/LmFwaVVybH0vdjIvdXNlcnMvbWUvZGV2aWNlc2AsIHtcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgICBhcHBJZDogdGhpcy5jb25maWc/LmFwcElkLFxuICAgICAgICAgIGJyb3dzZXIsXG4gICAgICAgICAgb3MsXG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICBjb25zb2xlLmxvZygnW1ZhbHRlY2hBdXRoXSBEZXZpY2UgcmVnaXN0ZXJlZCBtYW51YWxseTonLCByZXNwb25zZS5kZXZpY2UuZGV2aWNlSWQpO1xuICAgICAgcmV0dXJuIHsgcmVnaXN0ZXJlZDogdHJ1ZSwgZGV2aWNlSWQ6IHJlc3BvbnNlLmRldmljZS5kZXZpY2VJZCwgdG9rZW4gfTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tWYWx0ZWNoQXV0aF0gTWFudWFsIGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZ2lzdGVyZWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogZXJyb3I/LmVycm9yPy5tZXNzYWdlIHx8IGVycm9yPy5tZXNzYWdlIHx8ICdFcnJvciBhbCByZWdpc3RyYXIgZGlzcG9zaXRpdm8nLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0cmEgZWwgZGlzcG9zaXRpdm8gZW4gZWwgYmFja2VuZCBzaSB0aWVuZSBwZXJtaXNvcyBkZSBub3RpZmljYWNpw7NuLlxuICAgKiBTZSBsbGFtYSBhdXRvbcOhdGljYW1lbnRlIGRlc3B1w6lzIGRlIHVuIGxvZ2luIGV4aXRvc28gc2kgZW5hYmxlRGV2aWNlUmVnaXN0cmF0aW9uPXRydWUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyRGV2aWNlSWZOZWVkZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gU29sbyBzaSBlc3TDoSBoYWJpbGl0YWRvIHkgbWVzc2FnaW5nIGVzdMOhIGRpc3BvbmlibGVcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVEZXZpY2VSZWdpc3RyYXRpb24gfHwgIXRoaXMubWVzc2FnaW5nU2VydmljZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBWZXJpZmljYXIgc2kgRkNNIGVzdMOhIHNvcG9ydGFkb1xuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmlzU3VwcG9ydGVkKCkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gVmVyaWZpY2FyIHNpIHlhIHRpZW5lIHBlcm1pc29zXG4gICAgICBjb25zdCBwZXJtaXNzaW9uID0gdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmdldFBlcm1pc3Npb25TdGF0ZSgpO1xuICAgICAgaWYgKHBlcm1pc3Npb24gIT09ICdncmFudGVkJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIE5vIHNvbGljaXRhciBhdXRvbcOhdGljYW1lbnRlLCBzb2xvIHJlZ2lzdHJhciBzaSB5YSB0aWVuZSBwZXJtaXNvXG4gICAgICB9XG5cbiAgICAgIC8vIE9idGVuZXIgdG9rZW4gZXhpc3RlbnRlIChubyBzb2xpY2l0YXIgbnVldm8pXG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMubWVzc2FnaW5nU2VydmljZS5nZXRUb2tlbigpO1xuICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZ2lzdHJhciBlbiBiYWNrZW5kXG4gICAgICBjb25zdCB7IHBsYXRmb3JtLCBicm93c2VyLCBvcyB9ID0gdGhpcy5kZXRlY3RQbGF0Zm9ybUluZm8oKTtcbiAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLmh0dHAucG9zdDxSZWdpc3RlckRldmljZVJlc3BvbnNlPihgJHt0aGlzLmNvbmZpZz8uYXBpVXJsfS92Mi91c2Vycy9tZS9kZXZpY2VzYCwge1xuICAgICAgICAgIHRva2VuLFxuICAgICAgICAgIHBsYXRmb3JtLFxuICAgICAgICAgIGFwcElkOiB0aGlzLmNvbmZpZz8uYXBwSWQsXG4gICAgICAgICAgYnJvd3NlcixcbiAgICAgICAgICBvcyxcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIERldmljZSByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIE5vIGJsb3F1ZWFyIGF1dGggc2kgZmFsbGEgZGV2aWNlIHJlZ2lzdHJhdGlvblxuICAgICAgY29uc29sZS53YXJuKCdbVmFsdGVjaEF1dGhdIERldmljZSByZWdpc3RyYXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRWxpbWluYSBlbCBkaXNwb3NpdGl2byBkZWwgYmFja2VuZCB5IGJvcnJhIGVsIHRva2VuIEZDTS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdW5yZWdpc3RlckRldmljZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVEZXZpY2VSZWdpc3RyYXRpb24gfHwgIXRoaXMubWVzc2FnaW5nU2VydmljZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlbiA9IHRoaXMubWVzc2FnaW5nU2VydmljZS5jdXJyZW50VG9rZW47XG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgLy8gRGVsZXRlIGZyb20gYmFja2VuZCAoZmlyZSBhbmQgZm9yZ2V0KVxuICAgICAgICB0aGlzLmh0dHBcbiAgICAgICAgICAucmVxdWVzdCgnREVMRVRFJywgYCR7dGhpcy5jb25maWc/LmFwaVVybH0vdjIvdXNlcnMvbWUvZGV2aWNlcy9ieS10b2tlbmAsIHtcbiAgICAgICAgICAgIGJvZHk6IHsgdG9rZW4gfSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgICAgICAvLyBEZWxldGUgZnJvbSBGQ01cbiAgICAgICAgYXdhaXQgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLmRlbGV0ZVRva2VuKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbVmFsdGVjaEF1dGhdIERldmljZSB1bnJlZ2lzdGVyZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIElnbm9yYXIgZXJyb3JlcyBlbiBjbGVhbnVwXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdGEgaW5mb3JtYWNpw7NuIGRlIGxhIHBsYXRhZm9ybWEgZGVsIGRpc3Bvc2l0aXZvLlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RQbGF0Zm9ybUluZm8oKTogeyBwbGF0Zm9ybTogJ3dlYic7IGJyb3dzZXI6IHN0cmluZzsgb3M6IHN0cmluZyB9IHtcbiAgICBjb25zdCB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQ7XG5cbiAgICAvLyBEZXRlY3RhciBuYXZlZ2Fkb3JcbiAgICBsZXQgYnJvd3NlciA9ICdVbmtub3duJztcbiAgICBpZiAodWEuaW5jbHVkZXMoJ0ZpcmVmb3gnKSkge1xuICAgICAgYnJvd3NlciA9ICdGaXJlZm94JztcbiAgICB9IGVsc2UgaWYgKHVhLmluY2x1ZGVzKCdFZGcnKSkge1xuICAgICAgYnJvd3NlciA9ICdFZGdlJztcbiAgICB9IGVsc2UgaWYgKHVhLmluY2x1ZGVzKCdDaHJvbWUnKSkge1xuICAgICAgYnJvd3NlciA9ICdDaHJvbWUnO1xuICAgIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ1NhZmFyaScpKSB7XG4gICAgICBicm93c2VyID0gJ1NhZmFyaSc7XG4gICAgfVxuXG4gICAgLy8gRGV0ZWN0YXIgT1NcbiAgICBsZXQgb3MgPSAnVW5rbm93bic7XG4gICAgaWYgKHVhLmluY2x1ZGVzKCdXaW5kb3dzJykpIHtcbiAgICAgIG9zID0gJ1dpbmRvd3MnO1xuICAgIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ01hYyBPUycpKSB7XG4gICAgICBvcyA9ICdtYWNPUyc7XG4gICAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnTGludXgnKSkge1xuICAgICAgb3MgPSAnTGludXgnO1xuICAgIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ0FuZHJvaWQnKSkge1xuICAgICAgb3MgPSAnQW5kcm9pZCc7XG4gICAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnaU9TJykgfHwgdWEuaW5jbHVkZXMoJ2lQaG9uZScpIHx8IHVhLmluY2x1ZGVzKCdpUGFkJykpIHtcbiAgICAgIG9zID0gJ2lPUyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcGxhdGZvcm06ICd3ZWInLCBicm93c2VyLCBvcyB9O1xuICB9XG59XG4iXX0=
|