@huntsman-cancer-institute/authentication 17.2.5 → 17.2.6

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.
@@ -82,6 +82,7 @@ export declare class AuthenticationService {
82
82
  */
83
83
  set redirectUrl(redirectUrl: string);
84
84
  get redirectUrl(): string;
85
+ isRedirectBasedLogin(): boolean;
85
86
  initiateLogin(): void;
86
87
  requestAccessToken(fromRouteGuard: boolean, redirectOnSuccess: boolean): void;
87
88
  /**
@@ -148,6 +148,14 @@ export class AuthenticationService {
148
148
  get redirectUrl() {
149
149
  return this._redirectUrl;
150
150
  }
151
+ isRedirectBasedLogin() {
152
+ if (this._loginPath) {
153
+ return true;
154
+ }
155
+ else {
156
+ return false;
157
+ }
158
+ }
151
159
  initiateLogin() {
152
160
  if (isDevMode()) {
153
161
  console.debug("Authentication Service: Initiate Login");
@@ -415,4 +423,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
415
423
  type: Inject,
416
424
  args: [LocationStrategy]
417
425
  }] }] });
418
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2F1dGhlbnRpY2F0aW9uL3NyYy9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsT0FBTyxFQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEYsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxVQUFVLEVBQUUsV0FBVyxFQUE0QixNQUFNLHNCQUFzQixDQUFDO0FBRXhGLE9BQU8sRUFBQyxRQUFRLEVBQWMsZUFBZSxFQUFnQixVQUFVLEVBQUssTUFBTSxNQUFNLENBQUM7QUFDekYsT0FBTyxFQUFDLFVBQVUsRUFBUyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVwRCxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7QUFFekQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxJQUFJLHlCQUF5QixHQUFHLElBQUksY0FBYyxDQUFTLGdDQUFnQyxDQUFDLENBQUM7QUFDcEcsTUFBTSxDQUFDLElBQUkseUJBQXlCLEdBQUcsSUFBSSxjQUFjLENBQVMsMkJBQTJCLENBQUMsQ0FBQztBQUMvRixNQUFNLENBQUMsSUFBSSwwQkFBMEIsR0FBRyxJQUFJLGNBQWMsQ0FBUyw0QkFBNEIsQ0FBQyxDQUFDO0FBQ2pHLE1BQU0sQ0FBQyxJQUFJLDhCQUE4QixHQUFHLElBQUks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QUFzQixDQUFDLHNCQUFzQixLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3RHLE1BQU0sSUFBSSxLQUFLLENBQUMsa0dBQWtHLENBQUMsQ0FBQztRQUN0SCxDQUFDO0lBQ0gsQ0FBQztJQUVPLFdBQVcsQ0FBQyxLQUFVO1FBQzVCLElBQUksTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUM7UUFDckYsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUIsQ0FBQzs4R0FqWlUscUJBQXFCLHdLQXdDWiwwQkFBMEIsYUFDMUIsNkJBQTZCLGFBQ2pCLHlCQUF5Qiw2QkFDekIsb0JBQW9CLDZCQUNwQix5QkFBeUIsNkJBQ3pCLDhCQUE4Qiw2QkFDOUIscUNBQXFDLDZCQUNyQyxxQ0FBcUMsNkJBQ3JDLHFDQUFxQyw2QkFDckMsZ0JBQWdCO2tIQWpEckMscUJBQXFCOzsyRkFBckIscUJBQXFCO2tCQURqQyxVQUFVOzswQkF5Q0ksTUFBTTsyQkFBQywwQkFBMEI7OzBCQUNqQyxNQUFNOzJCQUFDLDZCQUE2Qjs7MEJBQ3BDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMseUJBQXlCOzswQkFDNUMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxvQkFBb0I7OzBCQUN2QyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLHlCQUF5Qjs7MEJBQzVDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsOEJBQThCOzswQkFDakQsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxxQ0FBcUM7OzBCQUN4RCxRQUFROzswQkFBSSxNQUFNOzJCQUFDLHFDQUFxQzs7MEJBQ3hELFFBQVE7OzBCQUFJLE1BQU07MkJBQUMscUNBQXFDOzswQkFDeEQsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgSHVudHNtYW4gQ2FuY2VyIEluc3RpdHV0ZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoLCBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5XHJcbiAqL1xyXG5pbXBvcnQge0luamVjdGFibGUsIEluamVjdGlvblRva2VuLCBJbmplY3QsIE9wdGlvbmFsLCBpc0Rldk1vZGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7TG9jYXRpb25TdHJhdGVneX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQge1JvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuXHJcbmltcG9ydCB7aW50ZXJ2YWwsIE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aHJvd0Vycm9yLCBvZn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtjYXRjaEVycm9yLCBmaXJzdCwgbWFwfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHtKd3RIZWxwZXJTZXJ2aWNlfSBmcm9tIFwiQGF1dGgwL2FuZ3VsYXItand0XCI7XHJcblxyXG5pbXBvcnQge0F1dGhlbnRpY2F0aW9uUHJvdmlkZXJ9IGZyb20gXCIuL2F1dGhlbnRpY2F0aW9uLnByb3ZpZGVyXCI7XHJcbmltcG9ydCB7IENvb2xMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiQGFuZ3VsYXItY29vbC9zdG9yYWdlXCI7XHJcblxyXG4vKipcclxuICogVGhlIHRva2VuIHVzZWQgZm9yIGluamVjdGlvbiBvZiB0aGUgc2VydmVyIHNpZGUgZW5kcG9pbnQgZm9yIHRoZSBjdXJyZW50bHkgYXV0aGVudGljYXRlZCBzdWJqZWN0LlxyXG4gKlxyXG4gKiBAdHlwZSB7SW5qZWN0aW9uVG9rZW59XHJcbiAqL1xyXG5leHBvcnQgbGV0IEFVVEhFTlRJQ0FUSU9OX1NFUlZFUl9VUkwgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcImF1dGhlbnRpY2F0aW9uX3NlcnZlcl9yZXN0X2FwaVwiKTtcclxuZXhwb3J0IGxldCBBVVRIRU5USUNBVElPTl9MT0dJTl9QQVRIID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oXCJhdXRoZW50aWNhdGlvbl9sb2dpbl9wYXRoXCIpO1xyXG5leHBvcnQgbGV0IEFVVEhFTlRJQ0FUSU9OX0xPR09VVF9QQVRIID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oXCJhdXRoZW50aWNhdGlvbl9sb2dvdXRfcGF0aFwiKTtcclxuZXhwb3J0IGxldCBBVVRIRU5USUNBVElPTl9ESVJFQ1RfRU5EUE9JTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcImF1dGhlbnRpY2F0aW9uX2RpcmVjdF9lbmRwb2ludFwiKTtcclxuZXhwb3J0IGxldCBBVVRIRU5USUNBVElPTl9UT0tFTl9FTkRQT0lOVCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KFwiYXV0aGVudGljYXRpb25fdG9rZW5fZW5kcG9pbnRcIik7XHJcbmV4cG9ydCBsZXQgQVVUSEVOVElDQVRJT05fUk9VVEUgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcImF1dGhlbnRpY2F0aW9uX3JvdXRlXCIpO1xyXG5leHBvcnQgbGV0IEFVVEhFTlRJQ0FUSU9OX01BWF9JTkFDVElWSVRZX01JTlVURVMgPSBuZXcgSW5qZWN0aW9uVG9rZW48bnVtYmVyPihcImF1dGhlbnRpY2F0aW9uX21heF9pbmFjdGl2aXR5XCIpO1xyXG5leHBvcnQgbGV0IEFVVEhFTlRJQ0FUSU9OX1VTRVJfQ09VTlRET1dOX1NFQ09ORFMgPSBuZXcgSW5qZWN0aW9uVG9rZW48bnVtYmVyPihcImF1dGhlbnRpY2F0aW9uX3VzZXJfY291bnRkb3duX3NlY29uZHNcIik7XHJcbmV4cG9ydCBsZXQgQVVUSEVOVElDQVRJT05fSURQX0lOQUNUSVZJVFlfTUlOVVRFUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxudW1iZXI+KFwiYXV0aGVudGljYXRpb25faWRwX2luYWN0aXZpdHlfbWludXRlc1wiKTtcclxuXHJcbi8qKlxyXG4gKiBAc2luY2UgMS4wLjBcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEF1dGhlbnRpY2F0aW9uU2VydmljZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBnZW5lcmljIGVycm9yIG1lc3NhZ2UgdXNlZCB3aGVuIGEgc2VydmVyIGVycm9yIGlzIHRocm93biB3aXRob3V0IGEgc3RhdHVzLlxyXG4gICAqXHJcbiAgICogQHR5cGUge3N0cmluZ31cclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIEdFTkVSSUNfRVJSX01TRzogc3RyaW5nID0gXCJTZXJ2ZXIgZXJyb3JcIjtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgQ09OVEVOVF9UWVBFOiBzdHJpbmcgPSBcIkNvbnRlbnQtVHlwZVwiO1xyXG4gIHByaXZhdGUgc3RhdGljIFNFQ19HT1ZfQ0xBU1NfSEVBREVSOiBzdHJpbmcgPSBcIlNlY3VyaXR5R292ZXJub3JDbGFzc1wiO1xyXG4gIHByaXZhdGUgc3RhdGljIFNFQ19HT1ZfSURfSEVBREVSOiBzdHJpbmcgPSBcIlNlY3VyaXR5R292ZXJub3JJZFwiO1xyXG4gIHByaXZhdGUgc3RhdGljIERFSURFTlRfSEVBREVSOiBzdHJpbmcgPSBcIkRlaWRlbnRpZmllZENvbnRleHRcIjtcclxuICBwcml2YXRlIHN0YXRpYyBMSU1JVEVEX0hFQURFUjogc3RyaW5nID0gXCJMaW1pdGVkQ29udGV4dFwiO1xyXG5cclxuICBwdWJsaWMgdXNlckNvdW50ZG93blNlY29uZHM6IG51bWJlciA9IDYwO1xyXG4gIHB1YmxpYyBpZHBJbmFjdGl2aXR5TWludXRlczogbnVtYmVyID0gNTtcclxuXHJcbiAgcHVibGljIGNvbnRlbnRUeXBlOiBzdHJpbmcgPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcclxuICBwdWJsaWMgc2VjdXJpdHlHb3Zlcm5vckNsYXNzOiBzdHJpbmc7XHJcbiAgcHVibGljIHNlY3VyaXR5R292ZXJub3JJZDogbnVtYmVyO1xyXG4gIHB1YmxpYyBsaW1pdGVkQ29udGV4dDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBkZWlkZW50aWZpZWRDb250ZXh0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgbWF4Vmlld1Blcm1pc3Npb246IEJlaGF2aW9yU3ViamVjdDxcInZpZXdcIiB8IFwidmlld2lkZW50XCIgfCBcInZpZXdsaW1pdGVkXCI+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcInZpZXdcIiB8IFwidmlld2lkZW50XCIgfCBcInZpZXdsaW1pdGVkXCI+KFwidmlld2lkZW50XCIpO1xyXG4gIHByaXZhdGUgX2lzQXV0aGVudGljYXRlZFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHByaXZhdGUgX3VzZXJJc0Fib3V0VG9UaW1lT3V0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBwcml2YXRlIF9yZWRpcmVjdFVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgX3JlZnJlc2hTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIF9sYXN0VXNlckludGVyYWN0aW9uOiBEYXRlO1xyXG4gIHByaXZhdGUgX21heEluYWN0aXZpdHlNaW51dGVzOiBudW1iZXIgPSAxMjA7XHJcblxyXG4gIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgY29udGV4dFJvb3Q6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2h0dHA6IEh0dHBDbGllbnQsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfbG9jYWxTdG9yYWdlU2VydmljZTogQ29vbExvY2FsU3RvcmFnZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIF9qd3RIZWxwZXI6IEp3dEhlbHBlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBhdXRoZW50aWNhdGlvblByb3ZpZGVyOiBBdXRoZW50aWNhdGlvblByb3ZpZGVyLFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoQVVUSEVOVElDQVRJT05fTE9HT1VUX1BBVEgpIHByaXZhdGUgX2xvZ291dFBhdGg6IHN0cmluZyxcclxuICAgICAgICAgICAgICBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX1RPS0VOX0VORFBPSU5UKSBwcml2YXRlIF90b2tlbkVuZHBvaW50OiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBVVRIRU5USUNBVElPTl9MT0dJTl9QQVRIKSBwcml2YXRlIF9sb2dpblBhdGg6IHN0cmluZyxcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX1JPVVRFKSBwcml2YXRlIF9hdXRoZW50aWNhdGlvblJvdXRlOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBVVRIRU5USUNBVElPTl9TRVJWRVJfVVJMKSBwcml2YXRlIF9zZXJ2ZXJVcmw6IHN0cmluZyxcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX0RJUkVDVF9FTkRQT0lOVCkgcHJpdmF0ZSBfZGlyZWN0RW5kcG9pbnQ6IHN0cmluZyxcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX01BWF9JTkFDVElWSVRZX01JTlVURVMpIHByaXZhdGUgX21heEluYWN0aXZpdHk6IG51bWJlcixcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX1VTRVJfQ09VTlRET1dOX1NFQ09ORFMpIHByaXZhdGUgX3VzZXJDb3VudGRvd25TZWNvbmRzOiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBVVRIRU5USUNBVElPTl9JRFBfSU5BQ1RJVklUWV9NSU5VVEVTKSBwcml2YXRlIF9pZHBJbmFjdGl2aXR5TWludXRlczogbnVtYmVyLFxyXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTG9jYXRpb25TdHJhdGVneSkgcHJpdmF0ZSBsb2NhdGlvblN0cmF0ZWd5OiBMb2NhdGlvblN0cmF0ZWd5KSB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIndpbmRvdy5sb2NhdGlvbi5ocmVmOiBcIiArIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAod2luZG93LmxvY2F0aW9uKSB7XHJcbiAgICAgIGxldCBwYXJ0czogc3RyaW5nW10gPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdChcIi9cIik7XHJcbiAgICAgIHRoaXMuYmFzZVVybCA9IHBhcnRzWzBdICsgXCIvL1wiICsgcGFydHNbMl07XHJcbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAzKSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0Um9vdCA9IHBhcnRzWzNdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2xvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbShcIm1heFZpZXdQZXJtaXNzaW9uXCIpKSB7XHJcbiAgICAgIHRoaXMubWF4Vmlld1Blcm1pc3Npb24ubmV4dCg8XCJ2aWV3XCIgfCBcInZpZXdpZGVudFwiIHwgXCJ2aWV3bGltaXRlZFwiPnRoaXMuX2xvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbShcIm1heFZpZXdQZXJtaXNzaW9uXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoX21heEluYWN0aXZpdHkpIHtcclxuICAgICAgdGhpcy5fbWF4SW5hY3Rpdml0eU1pbnV0ZXMgPSBfbWF4SW5hY3Rpdml0eTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoX3VzZXJDb3VudGRvd25TZWNvbmRzKSB7XHJcbiAgICAgIHRoaXMudXNlckNvdW50ZG93blNlY29uZHMgPSBfdXNlckNvdW50ZG93blNlY29uZHM7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKF9pZHBJbmFjdGl2aXR5TWludXRlcykge1xyXG4gICAgICB0aGlzLmlkcEluYWN0aXZpdHlNaW51dGVzID0gX2lkcEluYWN0aXZpdHlNaW51dGVzO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGFzVmFsaWRDb25maWcoKTtcclxuICB9XHJcblxyXG4gIGdldEJhc2VVcmwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAodGhpcy5iYXNlVXJsKSA/IHRoaXMuYmFzZVVybCA6IFwiXCI7XHJcbiAgfVxyXG5cclxuICBnZXRDb250ZXh0Um9vdCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udGV4dFJvb3Q7XHJcbiAgfVxyXG5cclxuICBnZXRIZWFkZXJzKHJlcTogSHR0cFJlcXVlc3Q8YW55Pik6IEh0dHBIZWFkZXJzIHtcclxuICAgIGxldCBoZWFkZXJzOiBIdHRwSGVhZGVycyA9IHJlcS5oZWFkZXJzO1xyXG5cclxuICAgIC8vRG9uJ3Qgc2V0IGNvbnRlbnQgdHlwZSBpZiBhbHJlYWR5IHNldFxyXG4gICAgaWYgKCFyZXEuaGVhZGVycy5nZXQoQXV0aGVudGljYXRpb25TZXJ2aWNlLkNPTlRFTlRfVFlQRSkpIHtcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5DT05URU5UX1RZUEUsIHRoaXMuY29udGVudFR5cGUudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhlYWRlcnMuZ2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5TRUNfR09WX0NMQVNTX0hFQURFUikgPT09IFwiXCIpIHtcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuZGVsZXRlKEF1dGhlbnRpY2F0aW9uU2VydmljZS5TRUNfR09WX0NMQVNTX0hFQURFUik7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VjdXJpdHlHb3Zlcm5vckNsYXNzICYmICFoZWFkZXJzLmdldChBdXRoZW50aWNhdGlvblNlcnZpY2UuU0VDX0dPVl9DTEFTU19IRUFERVIpKSB7XHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldChBdXRoZW50aWNhdGlvblNlcnZpY2UuU0VDX0dPVl9DTEFTU19IRUFERVIsIHRoaXMuc2VjdXJpdHlHb3Zlcm5vckNsYXNzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaGVhZGVycy5nZXQoQXV0aGVudGljYXRpb25TZXJ2aWNlLlNFQ19HT1ZfSURfSEVBREVSKSA9PT0gXCJcIikge1xyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5kZWxldGUoQXV0aGVudGljYXRpb25TZXJ2aWNlLlNFQ19HT1ZfSURfSEVBREVSKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zZWN1cml0eUdvdmVybm9ySWQgJiYgIWhlYWRlcnMuZ2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5TRUNfR09WX0lEX0hFQURFUikpIHtcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5TRUNfR09WX0lEX0hFQURFUiwgdGhpcy5zZWN1cml0eUdvdmVybm9ySWQudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5ERUlERU5UX0hFQURFUiwgdGhpcy5kZWlkZW50aWZpZWRDb250ZXh0LnRvU3RyaW5nKCkpO1xyXG4gICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5MSU1JVEVEX0hFQURFUiwgdGhpcy5saW1pdGVkQ29udGV4dC50b1N0cmluZygpKTtcclxuXHJcbiAgICByZXR1cm4gaGVhZGVycztcclxuICB9XHJcblxyXG4gIGdldCBhdXRoZW50aWNhdGlvblRva2VuS2V5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5hdXRoZW50aWNhdGlvblByb3ZpZGVyLmF1dGhlbnRpY2F0aW9uVG9rZW5LZXk7XHJcbiAgfVxyXG5cclxuICBnZXQgYXV0aFRva2VuKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5hdXRoZW50aWNhdGlvblByb3ZpZGVyLmF1dGhUb2tlbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVVc2VyQWN0aXZpdHkoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faXNBdXRoZW50aWNhdGVkU3ViamVjdC52YWx1ZSkge1xyXG4gICAgICB0aGlzLl9sYXN0VXNlckludGVyYWN0aW9uID0gbmV3IERhdGUoKTtcclxuICAgICAgdGhpcy5fdXNlcklzQWJvdXRUb1RpbWVPdXQubmV4dChmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIG11dGF0b3IgZm9yIGlkZW50aWZ5aW5nIHRoZSBjbGllbnRzIG9yaWdpbmFsIHJlcXVlc3QgbG9jYXRpb24uIFNldHRpbmcgdGhpcyB2YWx1ZSB3aWxsIGluZmx1ZW5jZSB0aGUgZW5kIGxvY2F0aW9uXHJcbiAgICogbmF2aWdhdGVkIHRvIGJ5IHtAbGluayAjbmF2aWdhdGVUb1BhdGh9LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHJlZGlyZWN0VXJsIGxvY2F0aW9uIG9mIHRoZSB1c2VycyByZXF1ZXN0IGJlZm9yZSBhdXRoZW50aWNhdGlvblxyXG4gICAqL1xyXG4gIHNldCByZWRpcmVjdFVybChyZWRpcmVjdFVybDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9yZWRpcmVjdFVybCA9IHJlZGlyZWN0VXJsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJlZGlyZWN0VXJsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlZGlyZWN0VXJsO1xyXG4gIH1cclxuICBcclxuICBcclxuICBpbml0aWF0ZUxvZ2luKCkge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJBdXRoZW50aWNhdGlvbiBTZXJ2aWNlOiBJbml0aWF0ZSBMb2dpblwiKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy9SZWRpcmVjdCBiYXNlZCBhdXRoZW50aWNhdGlvblxyXG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0aGlzLmdldEJhc2VVcmwoKSArICh0aGlzLl9sb2dpblBhdGguc3RhcnRzV2l0aChcIi9cIik/XCJcIjpcIi9cIikgKyB0aGlzLl9sb2dpblBhdGg7XHJcbiAgfVxyXG5cclxuICByZXF1ZXN0QWNjZXNzVG9rZW4oZnJvbVJvdXRlR3VhcmQ6IGJvb2xlYW4sIHJlZGlyZWN0T25TdWNjZXNzOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwiQXV0aGVudGljYXRpb24gU2VydmljZTogUmVxdWVzdCBBY2NlcyBUb2tlblwiKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9odHRwLmdldCh0aGlzLnRva2VuTG9jYXRpb24oKSwge3dpdGhDcmVkZW50aWFsczogdHJ1ZSwgcmVzcG9uc2VUeXBlOiBcImpzb25cIn0pXHJcbiAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuc3RvcmVUb2tlbihyZXNwb25zZS5hdXRoX3Rva2VuKTtcclxuICAgICAgICAgIGlmIChyZWRpcmVjdE9uU3VjY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLnByb2NlZWRJZkF1dGhlbnRpY2F0ZWQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgLy9Ob3QgbG9nZ2VkIGluIC0gc3RhcnQgYXV0aGVudGljYXRpb25cclxuICAgICAgICAgIGlmIChmcm9tUm91dGVHdWFyZCkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRpYXRlTG9naW4oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vQmFja2dyb3VuZCB0b2tlbiByZXF1ZXN0IGZhaWxlZCAtIGxvZ291dCBhbmQgY2xlYXJcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQXV0aGVudGljYXRpb24gU2VydmljZTogUmVxdWVzdCBBY2NlcyBUb2tlbiAtIExvZ291dFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5sb2dvdXQodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmVyaWZpZXMgd2hldGhlciBvciBub3QgYSBjdXJyZW50IHVzZXIgc2Vzc2lvbiBleGlzdHMuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxib29sZWFuPn0gZXZhbHVhdGVzIHRvIHRydWUgaWYgdGhlIHVzZXIgaXMgYXV0aGVudGljYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIGlzQXV0aGVudGljYXRlZCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLl9pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgaXNBYm91dFRvVGltZU91dCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLl91c2VySXNBYm91dFRvVGltZU91dC5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIGdldFRpbWVvdXRTdGFydCgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuX2xhc3RVc2VySW50ZXJhY3Rpb24pIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2xhc3RVc2VySW50ZXJhY3Rpb24udmFsdWVPZigpICsgKCgodGhpcy5fbWF4SW5hY3Rpdml0eU1pbnV0ZXMgKiA2MCkgLSB0aGlzLnVzZXJDb3VudGRvd25TZWNvbmRzKSAqIDEwMDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9rZW5Mb2NhdGlvbigpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX3NlcnZlclVybCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fc2VydmVyVXJsICsgdGhpcy5fdG9rZW5FbmRwb2ludDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl90b2tlbkVuZHBvaW50O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGlyZWN0TG9naW5Mb2NhdGlvbigpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX3NlcnZlclVybCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fc2VydmVyVXJsICsgdGhpcy5fZGlyZWN0RW5kcG9pbnQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5fZGlyZWN0RW5kcG9pbnQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsb2dvdXRMb2NhdGlvbigpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX3NlcnZlclVybCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fc2VydmVyVXJsICsgdGhpcy5fbG9nb3V0UGF0aDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9sb2dvdXRQYXRoO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBmdW5jdGlvbiB0byBhdXRoZW50aWNhdGVkIHRoZSB1c2VyIHdpdGggdGhlIHByb3ZpZGVkIGNyZWRlbnRpYWxzLiBGYWlsdXJlIHJlc3VsdHMgaW4gYW4gZXJyb3IgdGhhdCBkZXNjcmliZXMgdGhlXHJcbiAgICogc2VydmVyIHJlc3BvbnNlIChzdGF0dXMgYW5kIHN0YXR1cyBtZXNzYWdlKSBhbmQgc2hvdWxkIGJlIGFjdGlvbmFibGUgYnkgdGhlIGNsaWVudCBhcHBsaWNhdGlvbi5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB1c2VybmFtZSBvZiB0aGUgYXV0aGVudGljYXRpbmcgdXNlciB0byB2ZXJpZnlcclxuICAgKiBAcGFyYW0gcGFzc3dvcmQgb2YgdGhlIGF1dGhlbnRpY2F0aW5nIHVzZXIgdG8gdmVyaWZ5XHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8Uj59IGRlc2NyaWJpbmcgdGhlIHJlc3VsdCBvZiB0aGUgbG9naW4gYWN0aW9uLCB0cnVlIG9yIGFuIGVycm9yXHJcbiAgICovXHJcbiAgbG9naW4oX3VzZXJuYW1lOiBzdHJpbmcsIF9wYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5faHR0cC5wb3N0KFxyXG4gICAgICB0aGlzLmRpcmVjdExvZ2luTG9jYXRpb24oKSxcclxuICAgICAge3VzZXJuYW1lOiBfdXNlcm5hbWUsIHBhc3N3b3JkOiBfcGFzc3dvcmR9LFxyXG4gICAgICB7b2JzZXJ2ZTogXCJyZXNwb25zZVwifVxyXG4gICAgKS5waXBlKG1hcCgocmVzcDogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgaWYgKHJlc3Auc3RhdHVzID09PSAyMDEpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdXRoZW50aWNhdGlvbiBmYWlsZWQuIFwiICsgcmVzcC5zdGF0dXMgKyBcIjogXCIgKyByZXNwLnN0YXR1c1RleHQpO1xyXG4gICAgICB9XHJcbiAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKSkgYXMgT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICB9XHJcblxyXG5cclxuICBjbGVhckxvZ2luKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICAvL0Zyb250LWVuZCBsb2dvdXRcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbSh0aGlzLmF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuYXV0aGVudGljYXRpb25Ub2tlbktleSk7XHJcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tVG9rZW5SZWZyZXNoKCk7XHJcbiAgICAgIHRoaXMuX2lzQXV0aGVudGljYXRlZFN1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgIHRoaXMuX3VzZXJJc0Fib3V0VG9UaW1lT3V0Lm5leHQoZmFsc2UpO1xyXG4gICAgfSBjYXRjaCAoRXJyb3IpIHtcclxuICAgIH1cclxuXHJcbiAgICAvL0JhY2stZW5kIGxvZ291dFxyXG4gICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoQXV0aGVudGljYXRpb25TZXJ2aWNlLkNPTlRFTlRfVFlQRSwgXCJ0ZXh0L3BsYWluXCIpO1xyXG4gICAgcmV0dXJuIDxPYnNlcnZhYmxlPHN0cmluZz4+dGhpcy5faHR0cC5nZXQodGhpcy5sb2dvdXRMb2NhdGlvbigpLCB7aGVhZGVyczogaGVhZGVycywgcmVzcG9uc2VUeXBlOiBcInRleHRcIn0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBmdW5jdGlvbiB0byBzaWduYWwgdGhlIHRlcm1pbmF0aW9uIG9mIHRoZSBjdXJyZW50IHNlc3Npb24uIEludm9raW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBjbGVhbiB1cCBhbnkgcmVsZXZhbnQgc3RhdGVcclxuICAgKiByZWxhdGVkIHRvIHRoZSBsYXN0IGFjdGl2ZSBzZXNzaW9uLlxyXG4gICAqL1xyXG4gIGxvZ291dChrZWVwQ3VycmVudFJvdXRlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIC8vUHJldmVudCBsb2dvdXQgaWYgYWxyZWFkeSBvbiBhdXRoZW50aWNhdGlvbiByb3V0ZS4gRG9pbmcgb3RoZXJ3aXNlIHNjcmV3cyB1cCBTQU1MXHJcbiAgICBpZiAoISB0aGlzLl9yb3V0ZXIucm91dGVyU3RhdGUgfHwgdGhpcy5fcm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90LnVybCAhPT0gdGhpcy5fYXV0aGVudGljYXRpb25Sb3V0ZSkge1xyXG4gICAgICB0aGlzLl9yZWRpcmVjdFVybCA9IChrZWVwQ3VycmVudFJvdXRlICYmIHRoaXMuX3JvdXRlci5yb3V0ZXJTdGF0ZSAmJiB0aGlzLl9yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QpID8gdGhpcy5fcm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90LnVybCA6IFwiXCI7XHJcblxyXG4gICAgICBpZiAodGhpcy5fcmVkaXJlY3RVcmwuc3RhcnRzV2l0aChcIi9cIikpIHtcclxuICAgICAgICB0aGlzLl9yZWRpcmVjdFVybCA9IHRoaXMuX3JlZGlyZWN0VXJsLnN1YnN0cmluZygxKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jbGVhckxvZ2luKCkuc3Vic2NyaWJlKFxyXG4gICAgICAgIChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UodGhpcy5fcmVkaXJlY3RVcmwpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHRoaXMuX3JlZGlyZWN0VXJsKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdG9yZVRva2VuKHRva2VuOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCB2YWxpZCA9IHRoaXMudmFsaWRhdGVUb2tlbih0b2tlbik7XHJcblxyXG4gICAgLy8gdW5zdWJzY3JpYmUgZnJvbSByZWZlc2ggYmVmb3JlIHdlIGRlY2lkZSB3ZXRoZXIgdG8gcmVzdWJzY3JpYmVcclxuICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tVG9rZW5SZWZyZXNoKCk7XHJcblxyXG4gICAgaWYgKHZhbGlkKSB7XHJcbiAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbSh0aGlzLmF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuYXV0aGVudGljYXRpb25Ub2tlbktleSwgdG9rZW4pO1xyXG4gICAgICB0aGlzLnN1YnNjcmliZVRvVG9rZW5SZWZyZXNoKHRva2VuKTtcclxuXHJcbiAgICAgIC8vQ2hhbmdlIHRoZSBCZWhhdmlvclN1YmplY3QgaWYgdGhlIHVzZXIgd2FzIG5vdCBwcmV2aW91c2x5IGF1dGhlbnRpY2F0ZWQuXHJcbiAgICAgIC8vU2luY2Ugb3RoZXIgY29kZSBtYXkgYmUgc3Vic2NyaWJpbmcgdG8gdGhpcyBvYnNlcnZhYmxlLCB3ZSBkb24ndCB3YW50IHRvIGNhdXNlIG5ldyBldmVudHMgdG8gZmlyZSBpZiBqdXN0IHJlZnJlc2hpbmcgdGhlIEpXVC5cclxuICAgICAgaWYgKCEgdGhpcy5faXNBdXRoZW50aWNhdGVkU3ViamVjdC52YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX2lzQXV0aGVudGljYXRlZFN1YmplY3QubmV4dCh0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fbG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKHRoaXMuYXV0aGVudGljYXRpb25Qcm92aWRlci5hdXRoZW50aWNhdGlvblRva2VuS2V5KTtcclxuICAgICAgdGhpcy5faXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb2NlZWRJZkF1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkF1dGhlbnRpY2F0aW9uU2VydmljZS5wcm9jZWVkSWZBdXRoZW50aWNhdGVkOiBcIiArIHRoaXMuX3JlZGlyZWN0VXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5faXNBdXRoZW50aWNhdGVkU3ViamVjdC52YWx1ZSkge1xyXG4gICAgICAvL0xvZ2luIGNvdW50cyBhcyB1c2VyIGFjdGl2aXR5LCB0b29cclxuICAgICAgdGhpcy51cGRhdGVVc2VyQWN0aXZpdHkoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9yZWRpcmVjdFVybCAmJiB0aGlzLl9yZWRpcmVjdFVybCAmJiB0aGlzLl9yZWRpcmVjdFVybCAhPT0gXCJcIikge1xyXG4gICAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMuX3JlZGlyZWN0VXJsKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW1wiXCJdKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZVRva2VuKHRva2VuOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodG9rZW4gJiYgIXRoaXMuX2p3dEhlbHBlci5pc1Rva2VuRXhwaXJlZCh0b2tlbikpO1xyXG4gIH1cclxuXHJcbiAgc3Vic2NyaWJlVG9Ub2tlblJlZnJlc2godG9rZW46IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IGV4cCA9IHRoaXMuX2p3dEhlbHBlci5nZXRUb2tlbkV4cGlyYXRpb25EYXRlKHRva2VuKTtcclxuXHJcbiAgICAvLyBVc2UgYSB0aW1lciB0byBwZXJpb2RpY2FsbHkgY2hlY2sgdGltZW91dHNcclxuICAgIHRoaXMuX3JlZnJlc2hTdWJzY3JpcHRpb24gPSBpbnRlcnZhbCgxMDAwKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuXHJcbiAgICAgICAgLy8gSWYgYSB0YWIgaXMgaW5hY3RpdmUgd2UgY2FuJ3Qga25vdyBpZiBvdXIgdGltZXIgaXMgYWNjdXJhdGVcclxuICAgICAgICAvLyBzbyB3aGVuIHRoZSBpbnRlcnZhbCBoaXRzIGNoZWNrIGFnYWluc3QgdGltZXN0YW1wc1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0LnZhbHVlICYmIERhdGUubm93KCkgPiB0aGlzLmdldFRpbWVvdXRTdGFydCgpKSB7XHJcbiAgICAgICAgICAvL0Rvbid0IHVwZGF0ZSB0aGUgc3ViamVjdCBtb3JlIHRoYW4gb25jZSEgRG9pbmcgc28gaW5pdGlhbGl6ZXMgbW9yZSB0aGFuIG9uZSBjb3VudGRvd24gdGltZXIhXHJcbiAgICAgICAgICBpZiAodGhpcy5fdXNlcklzQWJvdXRUb1RpbWVPdXQuZ2V0VmFsdWUoKSAhPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl91c2VySXNBYm91dFRvVGltZU91dC5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIHJlZnJlc2ggdG9rZW5cclxuICAgICAgICBsZXQgbXNUb0V4cGlyeSA9IChleHAudmFsdWVPZigpIC0gbmV3IERhdGUoKS52YWx1ZU9mKCkpO1xyXG5cclxuICAgICAgICAvLyBSZWZyZXNoIDYwIHNlY29uZHMgYmVmb3JlIGV4cGlyeVxyXG4gICAgICAgIGlmIChtc1RvRXhwaXJ5IDw9IDYwMDAwKSB7XHJcbiAgICAgICAgICB0aGlzLnJlZnJlc2hUb2tlbklmVXNlcklzQWN0aXZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHVuc3Vic2NyaWJlRnJvbVRva2VuUmVmcmVzaCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9yZWZyZXNoU3Vic2NyaXB0aW9uICYmICEgdGhpcy5fcmVmcmVzaFN1YnNjcmlwdGlvbi5jbG9zZWQpIHtcclxuICAgICAgdGhpcy5fcmVmcmVzaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0TWF4Vmlld1Blcm1pc3Npb24oKTogXCJ2aWV3XCIgfCBcInZpZXdpZGVudFwiIHwgXCJ2aWV3bGltaXRlZFwiIHtcclxuICAgIHJldHVybiB0aGlzLm1heFZpZXdQZXJtaXNzaW9uLmdldFZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICBnZXRNYXhWaWV3UGVybWlzc2lvblN1YmplY3QoKTogQmVoYXZpb3JTdWJqZWN0PFwidmlld1wiIHwgXCJ2aWV3aWRlbnRcIiB8IFwidmlld2xpbWl0ZWRcIj4ge1xyXG4gICAgcmV0dXJuIHRoaXMubWF4Vmlld1Blcm1pc3Npb247XHJcbiAgfVxyXG5cclxuICBzZXRNYXhWaWV3UGVybWlzc2lvbihtYXhWaWV3UGVybWlzc2lvbjogXCJ2aWV3XCIgfCBcInZpZXdpZGVudFwiIHwgXCJ2aWV3bGltaXRlZFwiKTogdm9pZCB7XHJcbiAgICB0aGlzLl9sb2NhbFN0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0oXCJtYXhWaWV3UGVybWlzc2lvblwiLCBtYXhWaWV3UGVybWlzc2lvbik7XHJcbiAgICB0aGlzLm1heFZpZXdQZXJtaXNzaW9uLm5leHQobWF4Vmlld1Blcm1pc3Npb24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWZyZXNoVG9rZW5JZlVzZXJJc0FjdGl2ZSgpOiB2b2lkIHtcclxuICAgIC8vT25seSByZWZyZXNoIGlmIHRoZSB1c2VyIGhhcyBiZWVuIGFjdGl2ZVxyXG4gICAgaWYgKHRoaXMuX2xhc3RVc2VySW50ZXJhY3Rpb24gJiYgKChuZXcgRGF0ZSgpLnZhbHVlT2YoKSAtIHRoaXMuX2xhc3RVc2VySW50ZXJhY3Rpb24udmFsdWVPZigpKSA8PSAodGhpcy5fbWF4SW5hY3Rpdml0eU1pbnV0ZXMgKiA2MCAqIDEwMDApKSkge1xyXG4gICAgICB0aGlzLnJlcXVlc3RBY2Nlc3NUb2tlbihmYWxzZSwgZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYXNWYWxpZENvbmZpZygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90b2tlbkVuZHBvaW50ID09IG51bGwgJiYgKHRoaXMuX3NlcnZlclVybCA9PT0gbnVsbCB8fCB0aGlzLl9sb2dvdXRQYXRoID09PSBudWxsKSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCVUcgQUxFUlQhIEludmFsaWQgQXV0aGVudGljYXRpb25TZXJ2aWNlIGNvbmZpZ3VyYXRpb24uIE5vIHZhbGlkIGNvbmZpZ3VyYXRpb24gZm9yIGF1dGhlbnRpY2F0aW9uIGVuZHBvaW50KHMpLlwiKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9sb2NhbFN0b3JhZ2VTZXJ2aWNlID09PSBudWxsIHx8IHRoaXMuYXV0aGVudGljYXRpb25Qcm92aWRlci5hdXRoZW50aWNhdGlvblRva2VuS2V5ID09PSBudWxsKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkJVRyBBTEVSVCEgSW52YWxpZCBBdXRoZW50aWNhdGlvblNlcnZpY2UgY29uZmlndXJhdGlvbi4gTm8gdmFsaWQgY29uZmlndXJhdGlvbiBmb3IgbG9jYWwgc3RvcmFnZVwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlRXJyb3IoZXJyb3I6IGFueSkgOiBPYnNlcnZhYmxlPG5ldmVyPiB7XHJcbiAgICBsZXQgZXJyTXNnID0gKGVycm9yLm1lc3NhZ2UpID8gZXJyb3IubWVzc2FnZSA6IEF1dGhlbnRpY2F0aW9uU2VydmljZS5HRU5FUklDX0VSUl9NU0c7XHJcbiAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJNc2cpO1xyXG4gIH1cclxufVxyXG4iXX0=
426
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2F1dGhlbnRpY2F0aW9uL3NyYy9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsT0FBTyxFQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEYsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxVQUFVLEVBQUUsV0FBVyxFQUE0QixNQUFNLHNCQUFzQixDQUFDO0FBRXhGLE9BQU8sRUFBQyxRQUFRLEVBQWMsZUFBZSxFQUFnQixVQUFVLEVBQUssTUFBTSxNQUFNLENBQUM7QUFDekYsT0FBTyxFQUFDLFVBQVUsRUFBUyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVwRCxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7QUFFekQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxJQUFJLHlCQUF5QixHQUFHLElBQUksY0FBYyxDQUFTLGdDQUFnQyxDQUFDLENBQUM7QUFDcEcsTUFBTSxDQUFDLElBQUkseUJBQXlCLEdBQUcsSUFBSSxjQUFjLENBQVMsMkJBQTJCLENBQUMsQ0FBQztBQUMvRixNQUFNLENBQUMsSUFBSSwwQkFBMEIsR0FBRyxJQUFJLGNBQWMsQ0FBUyw0QkFBNEIsQ0FBQyxDQUFDO0FBQ2pHLE1BQU0sQ0FBQyxJQUFJLDhCQUE4QixHQUFHLElBQUks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QUFJLE1BQU07MkJBQUMscUNBQXFDOzswQkFDeEQsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgSHVudHNtYW4gQ2FuY2VyIEluc3RpdHV0ZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoLCBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5XHJcbiAqL1xyXG5pbXBvcnQge0luamVjdGFibGUsIEluamVjdGlvblRva2VuLCBJbmplY3QsIE9wdGlvbmFsLCBpc0Rldk1vZGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7TG9jYXRpb25TdHJhdGVneX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQge1JvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuXHJcbmltcG9ydCB7aW50ZXJ2YWwsIE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aHJvd0Vycm9yLCBvZn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtjYXRjaEVycm9yLCBmaXJzdCwgbWFwfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHtKd3RIZWxwZXJTZXJ2aWNlfSBmcm9tIFwiQGF1dGgwL2FuZ3VsYXItand0XCI7XHJcblxyXG5pbXBvcnQge0F1dGhlbnRpY2F0aW9uUHJvdmlkZXJ9IGZyb20gXCIuL2F1dGhlbnRpY2F0aW9uLnByb3ZpZGVyXCI7XHJcbmltcG9ydCB7IENvb2xMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiQGFuZ3VsYXItY29vbC9zdG9yYWdlXCI7XHJcblxyXG4vKipcclxuICogVGhlIHRva2VuIHVzZWQgZm9yIGluamVjdGlvbiBvZiB0aGUgc2VydmVyIHNpZGUgZW5kcG9pbnQgZm9yIHRoZSBjdXJyZW50bHkgYXV0aGVudGljYXRlZCBzdWJqZWN0LlxyXG4gKlxyXG4gKiBAdHlwZSB7SW5qZWN0aW9uVG9rZW59XHJcbiAqL1xyXG5leHBvcnQgbGV0IEFVVEhFTlRJQ0FUSU9OX1NFUlZFUl9VUkwgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcImF1dGhlbnRpY2F0aW9uX3NlcnZlcl9yZXN0X2FwaVwiKTtcclxuZXhwb3J0IGxldCBBVVRIRU5USUNBVElPTl9MT0dJTl9QQVRIID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oXCJhdXRoZW50aWNhdGlvbl9sb2dpbl9wYXRoXCIpO1xyXG5leHBvcnQgbGV0IEFVVEhFTlRJQ0FUSU9OX0xPR09VVF9QQVRIID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oXCJhdXRoZW50aWNhdGlvbl9sb2dvdXRfcGF0aFwiKTtcclxuZXhwb3J0IGxldCBBVVRIRU5USUNBVElPTl9ESVJFQ1RfRU5EUE9JTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcImF1dGhlbnRpY2F0aW9uX2RpcmVjdF9lbmRwb2ludFwiKTtcclxuZXhwb3J0IGxldCBBVVRIRU5USUNBVElPTl9UT0tFTl9FTkRQT0lOVCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KFwiYXV0aGVudGljYXRpb25fdG9rZW5fZW5kcG9pbnRcIik7XHJcbmV4cG9ydCBsZXQgQVVUSEVOVElDQVRJT05fUk9VVEUgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcImF1dGhlbnRpY2F0aW9uX3JvdXRlXCIpO1xyXG5leHBvcnQgbGV0IEFVVEhFTlRJQ0FUSU9OX01BWF9JTkFDVElWSVRZX01JTlVURVMgPSBuZXcgSW5qZWN0aW9uVG9rZW48bnVtYmVyPihcImF1dGhlbnRpY2F0aW9uX21heF9pbmFjdGl2aXR5XCIpO1xyXG5leHBvcnQgbGV0IEFVVEhFTlRJQ0FUSU9OX1VTRVJfQ09VTlRET1dOX1NFQ09ORFMgPSBuZXcgSW5qZWN0aW9uVG9rZW48bnVtYmVyPihcImF1dGhlbnRpY2F0aW9uX3VzZXJfY291bnRkb3duX3NlY29uZHNcIik7XHJcbmV4cG9ydCBsZXQgQVVUSEVOVElDQVRJT05fSURQX0lOQUNUSVZJVFlfTUlOVVRFUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxudW1iZXI+KFwiYXV0aGVudGljYXRpb25faWRwX2luYWN0aXZpdHlfbWludXRlc1wiKTtcclxuXHJcbi8qKlxyXG4gKiBAc2luY2UgMS4wLjBcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEF1dGhlbnRpY2F0aW9uU2VydmljZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBnZW5lcmljIGVycm9yIG1lc3NhZ2UgdXNlZCB3aGVuIGEgc2VydmVyIGVycm9yIGlzIHRocm93biB3aXRob3V0IGEgc3RhdHVzLlxyXG4gICAqXHJcbiAgICogQHR5cGUge3N0cmluZ31cclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIEdFTkVSSUNfRVJSX01TRzogc3RyaW5nID0gXCJTZXJ2ZXIgZXJyb3JcIjtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgQ09OVEVOVF9UWVBFOiBzdHJpbmcgPSBcIkNvbnRlbnQtVHlwZVwiO1xyXG4gIHByaXZhdGUgc3RhdGljIFNFQ19HT1ZfQ0xBU1NfSEVBREVSOiBzdHJpbmcgPSBcIlNlY3VyaXR5R292ZXJub3JDbGFzc1wiO1xyXG4gIHByaXZhdGUgc3RhdGljIFNFQ19HT1ZfSURfSEVBREVSOiBzdHJpbmcgPSBcIlNlY3VyaXR5R292ZXJub3JJZFwiO1xyXG4gIHByaXZhdGUgc3RhdGljIERFSURFTlRfSEVBREVSOiBzdHJpbmcgPSBcIkRlaWRlbnRpZmllZENvbnRleHRcIjtcclxuICBwcml2YXRlIHN0YXRpYyBMSU1JVEVEX0hFQURFUjogc3RyaW5nID0gXCJMaW1pdGVkQ29udGV4dFwiO1xyXG5cclxuICBwdWJsaWMgdXNlckNvdW50ZG93blNlY29uZHM6IG51bWJlciA9IDYwO1xyXG4gIHB1YmxpYyBpZHBJbmFjdGl2aXR5TWludXRlczogbnVtYmVyID0gNTtcclxuXHJcbiAgcHVibGljIGNvbnRlbnRUeXBlOiBzdHJpbmcgPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcclxuICBwdWJsaWMgc2VjdXJpdHlHb3Zlcm5vckNsYXNzOiBzdHJpbmc7XHJcbiAgcHVibGljIHNlY3VyaXR5R292ZXJub3JJZDogbnVtYmVyO1xyXG4gIHB1YmxpYyBsaW1pdGVkQ29udGV4dDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBkZWlkZW50aWZpZWRDb250ZXh0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgbWF4Vmlld1Blcm1pc3Npb246IEJlaGF2aW9yU3ViamVjdDxcInZpZXdcIiB8IFwidmlld2lkZW50XCIgfCBcInZpZXdsaW1pdGVkXCI+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcInZpZXdcIiB8IFwidmlld2lkZW50XCIgfCBcInZpZXdsaW1pdGVkXCI+KFwidmlld2lkZW50XCIpO1xyXG4gIHByaXZhdGUgX2lzQXV0aGVudGljYXRlZFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHByaXZhdGUgX3VzZXJJc0Fib3V0VG9UaW1lT3V0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBwcml2YXRlIF9yZWRpcmVjdFVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgX3JlZnJlc2hTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIF9sYXN0VXNlckludGVyYWN0aW9uOiBEYXRlO1xyXG4gIHByaXZhdGUgX21heEluYWN0aXZpdHlNaW51dGVzOiBudW1iZXIgPSAxMjA7XHJcblxyXG4gIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgY29udGV4dFJvb3Q6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2h0dHA6IEh0dHBDbGllbnQsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfbG9jYWxTdG9yYWdlU2VydmljZTogQ29vbExvY2FsU3RvcmFnZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIF9qd3RIZWxwZXI6IEp3dEhlbHBlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBhdXRoZW50aWNhdGlvblByb3ZpZGVyOiBBdXRoZW50aWNhdGlvblByb3ZpZGVyLFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoQVVUSEVOVElDQVRJT05fTE9HT1VUX1BBVEgpIHByaXZhdGUgX2xvZ291dFBhdGg6IHN0cmluZyxcclxuICAgICAgICAgICAgICBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX1RPS0VOX0VORFBPSU5UKSBwcml2YXRlIF90b2tlbkVuZHBvaW50OiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBVVRIRU5USUNBVElPTl9MT0dJTl9QQVRIKSBwcml2YXRlIF9sb2dpblBhdGg6IHN0cmluZyxcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX1JPVVRFKSBwcml2YXRlIF9hdXRoZW50aWNhdGlvblJvdXRlOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBVVRIRU5USUNBVElPTl9TRVJWRVJfVVJMKSBwcml2YXRlIF9zZXJ2ZXJVcmw6IHN0cmluZyxcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX0RJUkVDVF9FTkRQT0lOVCkgcHJpdmF0ZSBfZGlyZWN0RW5kcG9pbnQ6IHN0cmluZyxcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX01BWF9JTkFDVElWSVRZX01JTlVURVMpIHByaXZhdGUgX21heEluYWN0aXZpdHk6IG51bWJlcixcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX1VTRVJfQ09VTlRET1dOX1NFQ09ORFMpIHByaXZhdGUgX3VzZXJDb3VudGRvd25TZWNvbmRzOiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBVVRIRU5USUNBVElPTl9JRFBfSU5BQ1RJVklUWV9NSU5VVEVTKSBwcml2YXRlIF9pZHBJbmFjdGl2aXR5TWludXRlczogbnVtYmVyLFxyXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTG9jYXRpb25TdHJhdGVneSkgcHJpdmF0ZSBsb2NhdGlvblN0cmF0ZWd5OiBMb2NhdGlvblN0cmF0ZWd5KSB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIndpbmRvdy5sb2NhdGlvbi5ocmVmOiBcIiArIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAod2luZG93LmxvY2F0aW9uKSB7XHJcbiAgICAgIGxldCBwYXJ0czogc3RyaW5nW10gPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdChcIi9cIik7XHJcbiAgICAgIHRoaXMuYmFzZVVybCA9IHBhcnRzWzBdICsgXCIvL1wiICsgcGFydHNbMl07XHJcbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAzKSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0Um9vdCA9IHBhcnRzWzNdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2xvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbShcIm1heFZpZXdQZXJtaXNzaW9uXCIpKSB7XHJcbiAgICAgIHRoaXMubWF4Vmlld1Blcm1pc3Npb24ubmV4dCg8XCJ2aWV3XCIgfCBcInZpZXdpZGVudFwiIHwgXCJ2aWV3bGltaXRlZFwiPnRoaXMuX2xvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbShcIm1heFZpZXdQZXJtaXNzaW9uXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoX21heEluYWN0aXZpdHkpIHtcclxuICAgICAgdGhpcy5fbWF4SW5hY3Rpdml0eU1pbnV0ZXMgPSBfbWF4SW5hY3Rpdml0eTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoX3VzZXJDb3VudGRvd25TZWNvbmRzKSB7XHJcbiAgICAgIHRoaXMudXNlckNvdW50ZG93blNlY29uZHMgPSBfdXNlckNvdW50ZG93blNlY29uZHM7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKF9pZHBJbmFjdGl2aXR5TWludXRlcykge1xyXG4gICAgICB0aGlzLmlkcEluYWN0aXZpdHlNaW51dGVzID0gX2lkcEluYWN0aXZpdHlNaW51dGVzO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGFzVmFsaWRDb25maWcoKTtcclxuICB9XHJcblxyXG4gIGdldEJhc2VVcmwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAodGhpcy5iYXNlVXJsKSA/IHRoaXMuYmFzZVVybCA6IFwiXCI7XHJcbiAgfVxyXG5cclxuICBnZXRDb250ZXh0Um9vdCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udGV4dFJvb3Q7XHJcbiAgfVxyXG5cclxuICBnZXRIZWFkZXJzKHJlcTogSHR0cFJlcXVlc3Q8YW55Pik6IEh0dHBIZWFkZXJzIHtcclxuICAgIGxldCBoZWFkZXJzOiBIdHRwSGVhZGVycyA9IHJlcS5oZWFkZXJzO1xyXG5cclxuICAgIC8vRG9uJ3Qgc2V0IGNvbnRlbnQgdHlwZSBpZiBhbHJlYWR5IHNldFxyXG4gICAgaWYgKCFyZXEuaGVhZGVycy5nZXQoQXV0aGVudGljYXRpb25TZXJ2aWNlLkNPTlRFTlRfVFlQRSkpIHtcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5DT05URU5UX1RZUEUsIHRoaXMuY29udGVudFR5cGUudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhlYWRlcnMuZ2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5TRUNfR09WX0NMQVNTX0hFQURFUikgPT09IFwiXCIpIHtcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuZGVsZXRlKEF1dGhlbnRpY2F0aW9uU2VydmljZS5TRUNfR09WX0NMQVNTX0hFQURFUik7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VjdXJpdHlHb3Zlcm5vckNsYXNzICYmICFoZWFkZXJzLmdldChBdXRoZW50aWNhdGlvblNlcnZpY2UuU0VDX0dPVl9DTEFTU19IRUFERVIpKSB7XHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldChBdXRoZW50aWNhdGlvblNlcnZpY2UuU0VDX0dPVl9DTEFTU19IRUFERVIsIHRoaXMuc2VjdXJpdHlHb3Zlcm5vckNsYXNzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaGVhZGVycy5nZXQoQXV0aGVudGljYXRpb25TZXJ2aWNlLlNFQ19HT1ZfSURfSEVBREVSKSA9PT0gXCJcIikge1xyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5kZWxldGUoQXV0aGVudGljYXRpb25TZXJ2aWNlLlNFQ19HT1ZfSURfSEVBREVSKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zZWN1cml0eUdvdmVybm9ySWQgJiYgIWhlYWRlcnMuZ2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5TRUNfR09WX0lEX0hFQURFUikpIHtcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5TRUNfR09WX0lEX0hFQURFUiwgdGhpcy5zZWN1cml0eUdvdmVybm9ySWQudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5ERUlERU5UX0hFQURFUiwgdGhpcy5kZWlkZW50aWZpZWRDb250ZXh0LnRvU3RyaW5nKCkpO1xyXG4gICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KEF1dGhlbnRpY2F0aW9uU2VydmljZS5MSU1JVEVEX0hFQURFUiwgdGhpcy5saW1pdGVkQ29udGV4dC50b1N0cmluZygpKTtcclxuXHJcbiAgICByZXR1cm4gaGVhZGVycztcclxuICB9XHJcblxyXG4gIGdldCBhdXRoZW50aWNhdGlvblRva2VuS2V5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5hdXRoZW50aWNhdGlvblByb3ZpZGVyLmF1dGhlbnRpY2F0aW9uVG9rZW5LZXk7XHJcbiAgfVxyXG5cclxuICBnZXQgYXV0aFRva2VuKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5hdXRoZW50aWNhdGlvblByb3ZpZGVyLmF1dGhUb2tlbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVVc2VyQWN0aXZpdHkoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faXNBdXRoZW50aWNhdGVkU3ViamVjdC52YWx1ZSkge1xyXG4gICAgICB0aGlzLl9sYXN0VXNlckludGVyYWN0aW9uID0gbmV3IERhdGUoKTtcclxuICAgICAgdGhpcy5fdXNlcklzQWJvdXRUb1RpbWVPdXQubmV4dChmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIG11dGF0b3IgZm9yIGlkZW50aWZ5aW5nIHRoZSBjbGllbnRzIG9yaWdpbmFsIHJlcXVlc3QgbG9jYXRpb24uIFNldHRpbmcgdGhpcyB2YWx1ZSB3aWxsIGluZmx1ZW5jZSB0aGUgZW5kIGxvY2F0aW9uXHJcbiAgICogbmF2aWdhdGVkIHRvIGJ5IHtAbGluayAjbmF2aWdhdGVUb1BhdGh9LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHJlZGlyZWN0VXJsIGxvY2F0aW9uIG9mIHRoZSB1c2VycyByZXF1ZXN0IGJlZm9yZSBhdXRoZW50aWNhdGlvblxyXG4gICAqL1xyXG4gIHNldCByZWRpcmVjdFVybChyZWRpcmVjdFVybDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9yZWRpcmVjdFVybCA9IHJlZGlyZWN0VXJsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJlZGlyZWN0VXJsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlZGlyZWN0VXJsO1xyXG4gIH1cclxuICBcclxuICBcclxuICBpc1JlZGlyZWN0QmFzZWRMb2dpbigpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLl9sb2dpblBhdGgpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBcclxuICBpbml0aWF0ZUxvZ2luKCkge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJBdXRoZW50aWNhdGlvbiBTZXJ2aWNlOiBJbml0aWF0ZSBMb2dpblwiKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy9SZWRpcmVjdCBiYXNlZCBhdXRoZW50aWNhdGlvblxyXG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0aGlzLmdldEJhc2VVcmwoKSArICh0aGlzLl9sb2dpblBhdGguc3RhcnRzV2l0aChcIi9cIik/XCJcIjpcIi9cIikgKyB0aGlzLl9sb2dpblBhdGg7XHJcbiAgfVxyXG5cclxuICByZXF1ZXN0QWNjZXNzVG9rZW4oZnJvbVJvdXRlR3VhcmQ6IGJvb2xlYW4sIHJlZGlyZWN0T25TdWNjZXNzOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwiQXV0aGVudGljYXRpb24gU2VydmljZTogUmVxdWVzdCBBY2NlcyBUb2tlblwiKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9odHRwLmdldCh0aGlzLnRva2VuTG9jYXRpb24oKSwge3dpdGhDcmVkZW50aWFsczogdHJ1ZSwgcmVzcG9uc2VUeXBlOiBcImpzb25cIn0pXHJcbiAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuc3RvcmVUb2tlbihyZXNwb25zZS5hdXRoX3Rva2VuKTtcclxuICAgICAgICAgIGlmIChyZWRpcmVjdE9uU3VjY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLnByb2NlZWRJZkF1dGhlbnRpY2F0ZWQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgLy9Ob3QgbG9nZ2VkIGluIC0gc3RhcnQgYXV0aGVudGljYXRpb25cclxuICAgICAgICAgIGlmIChmcm9tUm91dGVHdWFyZCkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRpYXRlTG9naW4oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vQmFja2dyb3VuZCB0b2tlbiByZXF1ZXN0IGZhaWxlZCAtIGxvZ291dCBhbmQgY2xlYXJcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQXV0aGVudGljYXRpb24gU2VydmljZTogUmVxdWVzdCBBY2NlcyBUb2tlbiAtIExvZ291dFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5sb2dvdXQodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmVyaWZpZXMgd2hldGhlciBvciBub3QgYSBjdXJyZW50IHVzZXIgc2Vzc2lvbiBleGlzdHMuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxib29sZWFuPn0gZXZhbHVhdGVzIHRvIHRydWUgaWYgdGhlIHVzZXIgaXMgYXV0aGVudGljYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIGlzQXV0aGVudGljYXRlZCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLl9pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgaXNBYm91dFRvVGltZU91dCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLl91c2VySXNBYm91dFRvVGltZU91dC5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIGdldFRpbWVvdXRTdGFydCgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuX2xhc3RVc2VySW50ZXJhY3Rpb24pIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2xhc3RVc2VySW50ZXJhY3Rpb24udmFsdWVPZigpICsgKCgodGhpcy5fbWF4SW5hY3Rpdml0eU1pbnV0ZXMgKiA2MCkgLSB0aGlzLnVzZXJDb3VudGRvd25TZWNvbmRzKSAqIDEwMDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9rZW5Mb2NhdGlvbigpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX3NlcnZlclVybCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fc2VydmVyVXJsICsgdGhpcy5fdG9rZW5FbmRwb2ludDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl90b2tlbkVuZHBvaW50O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGlyZWN0TG9naW5Mb2NhdGlvbigpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX3NlcnZlclVybCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fc2VydmVyVXJsICsgdGhpcy5fZGlyZWN0RW5kcG9pbnQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5fZGlyZWN0RW5kcG9pbnQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsb2dvdXRMb2NhdGlvbigpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX3NlcnZlclVybCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fc2VydmVyVXJsICsgdGhpcy5fbG9nb3V0UGF0aDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9sb2dvdXRQYXRoO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBmdW5jdGlvbiB0byBhdXRoZW50aWNhdGVkIHRoZSB1c2VyIHdpdGggdGhlIHByb3ZpZGVkIGNyZWRlbnRpYWxzLiBGYWlsdXJlIHJlc3VsdHMgaW4gYW4gZXJyb3IgdGhhdCBkZXNjcmliZXMgdGhlXHJcbiAgICogc2VydmVyIHJlc3BvbnNlIChzdGF0dXMgYW5kIHN0YXR1cyBtZXNzYWdlKSBhbmQgc2hvdWxkIGJlIGFjdGlvbmFibGUgYnkgdGhlIGNsaWVudCBhcHBsaWNhdGlvbi5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB1c2VybmFtZSBvZiB0aGUgYXV0aGVudGljYXRpbmcgdXNlciB0byB2ZXJpZnlcclxuICAgKiBAcGFyYW0gcGFzc3dvcmQgb2YgdGhlIGF1dGhlbnRpY2F0aW5nIHVzZXIgdG8gdmVyaWZ5XHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8Uj59IGRlc2NyaWJpbmcgdGhlIHJlc3VsdCBvZiB0aGUgbG9naW4gYWN0aW9uLCB0cnVlIG9yIGFuIGVycm9yXHJcbiAgICovXHJcbiAgbG9naW4oX3VzZXJuYW1lOiBzdHJpbmcsIF9wYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5faHR0cC5wb3N0KFxyXG4gICAgICB0aGlzLmRpcmVjdExvZ2luTG9jYXRpb24oKSxcclxuICAgICAge3VzZXJuYW1lOiBfdXNlcm5hbWUsIHBhc3N3b3JkOiBfcGFzc3dvcmR9LFxyXG4gICAgICB7b2JzZXJ2ZTogXCJyZXNwb25zZVwifVxyXG4gICAgKS5waXBlKG1hcCgocmVzcDogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgaWYgKHJlc3Auc3RhdHVzID09PSAyMDEpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdXRoZW50aWNhdGlvbiBmYWlsZWQuIFwiICsgcmVzcC5zdGF0dXMgKyBcIjogXCIgKyByZXNwLnN0YXR1c1RleHQpO1xyXG4gICAgICB9XHJcbiAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKSkgYXMgT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICB9XHJcblxyXG5cclxuICBjbGVhckxvZ2luKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICAvL0Zyb250LWVuZCBsb2dvdXRcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbSh0aGlzLmF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuYXV0aGVudGljYXRpb25Ub2tlbktleSk7XHJcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tVG9rZW5SZWZyZXNoKCk7XHJcbiAgICAgIHRoaXMuX2lzQXV0aGVudGljYXRlZFN1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgIHRoaXMuX3VzZXJJc0Fib3V0VG9UaW1lT3V0Lm5leHQoZmFsc2UpO1xyXG4gICAgfSBjYXRjaCAoRXJyb3IpIHtcclxuICAgIH1cclxuXHJcbiAgICAvL0JhY2stZW5kIGxvZ291dFxyXG4gICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoQXV0aGVudGljYXRpb25TZXJ2aWNlLkNPTlRFTlRfVFlQRSwgXCJ0ZXh0L3BsYWluXCIpO1xyXG4gICAgcmV0dXJuIDxPYnNlcnZhYmxlPHN0cmluZz4+dGhpcy5faHR0cC5nZXQodGhpcy5sb2dvdXRMb2NhdGlvbigpLCB7aGVhZGVyczogaGVhZGVycywgcmVzcG9uc2VUeXBlOiBcInRleHRcIn0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBmdW5jdGlvbiB0byBzaWduYWwgdGhlIHRlcm1pbmF0aW9uIG9mIHRoZSBjdXJyZW50IHNlc3Npb24uIEludm9raW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBjbGVhbiB1cCBhbnkgcmVsZXZhbnQgc3RhdGVcclxuICAgKiByZWxhdGVkIHRvIHRoZSBsYXN0IGFjdGl2ZSBzZXNzaW9uLlxyXG4gICAqL1xyXG4gIGxvZ291dChrZWVwQ3VycmVudFJvdXRlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIC8vUHJldmVudCBsb2dvdXQgaWYgYWxyZWFkeSBvbiBhdXRoZW50aWNhdGlvbiByb3V0ZS4gRG9pbmcgb3RoZXJ3aXNlIHNjcmV3cyB1cCBTQU1MXHJcbiAgICBpZiAoISB0aGlzLl9yb3V0ZXIucm91dGVyU3RhdGUgfHwgdGhpcy5fcm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90LnVybCAhPT0gdGhpcy5fYXV0aGVudGljYXRpb25Sb3V0ZSkge1xyXG4gICAgICB0aGlzLl9yZWRpcmVjdFVybCA9IChrZWVwQ3VycmVudFJvdXRlICYmIHRoaXMuX3JvdXRlci5yb3V0ZXJTdGF0ZSAmJiB0aGlzLl9yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QpID8gdGhpcy5fcm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90LnVybCA6IFwiXCI7XHJcblxyXG4gICAgICBpZiAodGhpcy5fcmVkaXJlY3RVcmwuc3RhcnRzV2l0aChcIi9cIikpIHtcclxuICAgICAgICB0aGlzLl9yZWRpcmVjdFVybCA9IHRoaXMuX3JlZGlyZWN0VXJsLnN1YnN0cmluZygxKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jbGVhckxvZ2luKCkuc3Vic2NyaWJlKFxyXG4gICAgICAgIChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UodGhpcy5fcmVkaXJlY3RVcmwpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHRoaXMuX3JlZGlyZWN0VXJsKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdG9yZVRva2VuKHRva2VuOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCB2YWxpZCA9IHRoaXMudmFsaWRhdGVUb2tlbih0b2tlbik7XHJcblxyXG4gICAgLy8gdW5zdWJzY3JpYmUgZnJvbSByZWZlc2ggYmVmb3JlIHdlIGRlY2lkZSB3ZXRoZXIgdG8gcmVzdWJzY3JpYmVcclxuICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tVG9rZW5SZWZyZXNoKCk7XHJcblxyXG4gICAgaWYgKHZhbGlkKSB7XHJcbiAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbSh0aGlzLmF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuYXV0aGVudGljYXRpb25Ub2tlbktleSwgdG9rZW4pO1xyXG4gICAgICB0aGlzLnN1YnNjcmliZVRvVG9rZW5SZWZyZXNoKHRva2VuKTtcclxuXHJcbiAgICAgIC8vQ2hhbmdlIHRoZSBCZWhhdmlvclN1YmplY3QgaWYgdGhlIHVzZXIgd2FzIG5vdCBwcmV2aW91c2x5IGF1dGhlbnRpY2F0ZWQuXHJcbiAgICAgIC8vU2luY2Ugb3RoZXIgY29kZSBtYXkgYmUgc3Vic2NyaWJpbmcgdG8gdGhpcyBvYnNlcnZhYmxlLCB3ZSBkb24ndCB3YW50IHRvIGNhdXNlIG5ldyBldmVudHMgdG8gZmlyZSBpZiBqdXN0IHJlZnJlc2hpbmcgdGhlIEpXVC5cclxuICAgICAgaWYgKCEgdGhpcy5faXNBdXRoZW50aWNhdGVkU3ViamVjdC52YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX2lzQXV0aGVudGljYXRlZFN1YmplY3QubmV4dCh0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fbG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKHRoaXMuYXV0aGVudGljYXRpb25Qcm92aWRlci5hdXRoZW50aWNhdGlvblRva2VuS2V5KTtcclxuICAgICAgdGhpcy5faXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb2NlZWRJZkF1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkF1dGhlbnRpY2F0aW9uU2VydmljZS5wcm9jZWVkSWZBdXRoZW50aWNhdGVkOiBcIiArIHRoaXMuX3JlZGlyZWN0VXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5faXNBdXRoZW50aWNhdGVkU3ViamVjdC52YWx1ZSkge1xyXG4gICAgICAvL0xvZ2luIGNvdW50cyBhcyB1c2VyIGFjdGl2aXR5LCB0b29cclxuICAgICAgdGhpcy51cGRhdGVVc2VyQWN0aXZpdHkoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9yZWRpcmVjdFVybCAmJiB0aGlzLl9yZWRpcmVjdFVybCAmJiB0aGlzLl9yZWRpcmVjdFVybCAhPT0gXCJcIikge1xyXG4gICAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMuX3JlZGlyZWN0VXJsKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW1wiXCJdKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZVRva2VuKHRva2VuOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodG9rZW4gJiYgIXRoaXMuX2p3dEhlbHBlci5pc1Rva2VuRXhwaXJlZCh0b2tlbikpO1xyXG4gIH1cclxuXHJcbiAgc3Vic2NyaWJlVG9Ub2tlblJlZnJlc2godG9rZW46IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IGV4cCA9IHRoaXMuX2p3dEhlbHBlci5nZXRUb2tlbkV4cGlyYXRpb25EYXRlKHRva2VuKTtcclxuXHJcbiAgICAvLyBVc2UgYSB0aW1lciB0byBwZXJpb2RpY2FsbHkgY2hlY2sgdGltZW91dHNcclxuICAgIHRoaXMuX3JlZnJlc2hTdWJzY3JpcHRpb24gPSBpbnRlcnZhbCgxMDAwKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuXHJcbiAgICAgICAgLy8gSWYgYSB0YWIgaXMgaW5hY3RpdmUgd2UgY2FuJ3Qga25vdyBpZiBvdXIgdGltZXIgaXMgYWNjdXJhdGVcclxuICAgICAgICAvLyBzbyB3aGVuIHRoZSBpbnRlcnZhbCBoaXRzIGNoZWNrIGFnYWluc3QgdGltZXN0YW1wc1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0LnZhbHVlICYmIERhdGUubm93KCkgPiB0aGlzLmdldFRpbWVvdXRTdGFydCgpKSB7XHJcbiAgICAgICAgICAvL0Rvbid0IHVwZGF0ZSB0aGUgc3ViamVjdCBtb3JlIHRoYW4gb25jZSEgRG9pbmcgc28gaW5pdGlhbGl6ZXMgbW9yZSB0aGFuIG9uZSBjb3VudGRvd24gdGltZXIhXHJcbiAgICAgICAgICBpZiAodGhpcy5fdXNlcklzQWJvdXRUb1RpbWVPdXQuZ2V0VmFsdWUoKSAhPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl91c2VySXNBYm91dFRvVGltZU91dC5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIHJlZnJlc2ggdG9rZW5cclxuICAgICAgICBsZXQgbXNUb0V4cGlyeSA9IChleHAudmFsdWVPZigpIC0gbmV3IERhdGUoKS52YWx1ZU9mKCkpO1xyXG5cclxuICAgICAgICAvLyBSZWZyZXNoIDYwIHNlY29uZHMgYmVmb3JlIGV4cGlyeVxyXG4gICAgICAgIGlmIChtc1RvRXhwaXJ5IDw9IDYwMDAwKSB7XHJcbiAgICAgICAgICB0aGlzLnJlZnJlc2hUb2tlbklmVXNlcklzQWN0aXZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHVuc3Vic2NyaWJlRnJvbVRva2VuUmVmcmVzaCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9yZWZyZXNoU3Vic2NyaXB0aW9uICYmICEgdGhpcy5fcmVmcmVzaFN1YnNjcmlwdGlvbi5jbG9zZWQpIHtcclxuICAgICAgdGhpcy5fcmVmcmVzaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0TWF4Vmlld1Blcm1pc3Npb24oKTogXCJ2aWV3XCIgfCBcInZpZXdpZGVudFwiIHwgXCJ2aWV3bGltaXRlZFwiIHtcclxuICAgIHJldHVybiB0aGlzLm1heFZpZXdQZXJtaXNzaW9uLmdldFZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICBnZXRNYXhWaWV3UGVybWlzc2lvblN1YmplY3QoKTogQmVoYXZpb3JTdWJqZWN0PFwidmlld1wiIHwgXCJ2aWV3aWRlbnRcIiB8IFwidmlld2xpbWl0ZWRcIj4ge1xyXG4gICAgcmV0dXJuIHRoaXMubWF4Vmlld1Blcm1pc3Npb247XHJcbiAgfVxyXG5cclxuICBzZXRNYXhWaWV3UGVybWlzc2lvbihtYXhWaWV3UGVybWlzc2lvbjogXCJ2aWV3XCIgfCBcInZpZXdpZGVudFwiIHwgXCJ2aWV3bGltaXRlZFwiKTogdm9pZCB7XHJcbiAgICB0aGlzLl9sb2NhbFN0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0oXCJtYXhWaWV3UGVybWlzc2lvblwiLCBtYXhWaWV3UGVybWlzc2lvbik7XHJcbiAgICB0aGlzLm1heFZpZXdQZXJtaXNzaW9uLm5leHQobWF4Vmlld1Blcm1pc3Npb24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWZyZXNoVG9rZW5JZlVzZXJJc0FjdGl2ZSgpOiB2b2lkIHtcclxuICAgIC8vT25seSByZWZyZXNoIGlmIHRoZSB1c2VyIGhhcyBiZWVuIGFjdGl2ZVxyXG4gICAgaWYgKHRoaXMuX2xhc3RVc2VySW50ZXJhY3Rpb24gJiYgKChuZXcgRGF0ZSgpLnZhbHVlT2YoKSAtIHRoaXMuX2xhc3RVc2VySW50ZXJhY3Rpb24udmFsdWVPZigpKSA8PSAodGhpcy5fbWF4SW5hY3Rpdml0eU1pbnV0ZXMgKiA2MCAqIDEwMDApKSkge1xyXG4gICAgICB0aGlzLnJlcXVlc3RBY2Nlc3NUb2tlbihmYWxzZSwgZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYXNWYWxpZENvbmZpZygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90b2tlbkVuZHBvaW50ID09IG51bGwgJiYgKHRoaXMuX3NlcnZlclVybCA9PT0gbnVsbCB8fCB0aGlzLl9sb2dvdXRQYXRoID09PSBudWxsKSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCVUcgQUxFUlQhIEludmFsaWQgQXV0aGVudGljYXRpb25TZXJ2aWNlIGNvbmZpZ3VyYXRpb24uIE5vIHZhbGlkIGNvbmZpZ3VyYXRpb24gZm9yIGF1dGhlbnRpY2F0aW9uIGVuZHBvaW50KHMpLlwiKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9sb2NhbFN0b3JhZ2VTZXJ2aWNlID09PSBudWxsIHx8IHRoaXMuYXV0aGVudGljYXRpb25Qcm92aWRlci5hdXRoZW50aWNhdGlvblRva2VuS2V5ID09PSBudWxsKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkJVRyBBTEVSVCEgSW52YWxpZCBBdXRoZW50aWNhdGlvblNlcnZpY2UgY29uZmlndXJhdGlvbi4gTm8gdmFsaWQgY29uZmlndXJhdGlvbiBmb3IgbG9jYWwgc3RvcmFnZVwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlRXJyb3IoZXJyb3I6IGFueSkgOiBPYnNlcnZhYmxlPG5ldmVyPiB7XHJcbiAgICBsZXQgZXJyTXNnID0gKGVycm9yLm1lc3NhZ2UpID8gZXJyb3IubWVzc2FnZSA6IEF1dGhlbnRpY2F0aW9uU2VydmljZS5HRU5FUklDX0VSUl9NU0c7XHJcbiAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJNc2cpO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -4,12 +4,11 @@
4
4
  import { inject } from "@angular/core";
5
5
  import { Router } from "@angular/router";
6
6
  import { map } from "rxjs/operators";
7
- import { AuthenticationService, AUTHENTICATION_ROUTE, AUTHENTICATION_LOGIN_PATH } from "./authentication.service";
7
+ import { AuthenticationService, AUTHENTICATION_ROUTE } from "./authentication.service";
8
8
  export const RouteGuardService = (route, state) => {
9
9
  const authenticationService = inject(AuthenticationService);
10
10
  const router = inject(Router);
11
11
  const authenticationRoute = inject(AUTHENTICATION_ROUTE);
12
- const authenticationLoginPath = inject(AUTHENTICATION_LOGIN_PATH);
13
12
  return authenticationService.isAuthenticated().pipe(map((authenticated) => {
14
13
  if (authenticated) {
15
14
  return true;
@@ -17,10 +16,12 @@ export const RouteGuardService = (route, state) => {
17
16
  else {
18
17
  // Store the attempted URL for redirecting
19
18
  authenticationService.redirectUrl = state.url;
20
- if (authenticationLoginPath) {
19
+ //Redirect based login
20
+ if (authenticationService.isRedirectBasedLogin()) {
21
21
  //Try to get an access token
22
22
  authenticationService.requestAccessToken(true, true);
23
23
  }
24
+ //Authentication component based login
24
25
  else {
25
26
  // Navigate to the login page
26
27
  return router.createUrlTree([authenticationRoute]);
@@ -28,4 +29,4 @@ export const RouteGuardService = (route, state) => {
28
29
  }
29
30
  }));
30
31
  };
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtZ3VhcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2F1dGhlbnRpY2F0aW9uL3NyYy9yb3V0ZS1ndWFyZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsTUFBTSxFQUE4QyxNQUFNLGlCQUFpQixDQUFDO0FBR3BGLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuQyxPQUFPLEVBQUMscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUseUJBQXlCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUdoSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEtBQTZCLEVBQUUsS0FBMEIsRUFBRSxFQUFFO0lBQzdGLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDNUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDekQsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUVsRSxPQUFPLHFCQUFxQixDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRTtRQUN4RSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUNJLENBQUM7WUFDSiwwQ0FBMEM7WUFDMUMscUJBQXFCLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFFOUMsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO2dCQUM1Qiw0QkFBNEI7Z0JBQzVCLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN2RCxDQUFDO2lCQUNJLENBQUM7Z0JBQ0osNkJBQTZCO2dCQUM3QixPQUFPLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7WUFDckQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChjKSAyMDE2IEh1bnRzbWFuIENhbmNlciBJbnN0aXR1dGUgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCwgQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeVxyXG4gKi9cclxuaW1wb3J0IHtpbmplY3R9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7Um91dGVyLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBSb3V0ZXJTdGF0ZVNuYXBzaG90fSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcblxyXG5pbXBvcnQge09ic2VydmFibGV9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7bWFwfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuXHJcbmltcG9ydCB7QXV0aGVudGljYXRpb25TZXJ2aWNlLCBBVVRIRU5USUNBVElPTl9ST1VURSwgQVVUSEVOVElDQVRJT05fTE9HSU5fUEFUSH0gZnJvbSBcIi4vYXV0aGVudGljYXRpb24uc2VydmljZVwiO1xyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBSb3V0ZUd1YXJkU2VydmljZSA9IChyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpID0+IHtcclxuICBjb25zdCBhdXRoZW50aWNhdGlvblNlcnZpY2UgPSBpbmplY3QoQXV0aGVudGljYXRpb25TZXJ2aWNlKTtcclxuICBjb25zdCByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcclxuICBjb25zdCBhdXRoZW50aWNhdGlvblJvdXRlID0gaW5qZWN0KEFVVEhFTlRJQ0FUSU9OX1JPVVRFKTtcclxuICBjb25zdCBhdXRoZW50aWNhdGlvbkxvZ2luUGF0aCA9IGluamVjdChBVVRIRU5USUNBVElPTl9MT0dJTl9QQVRIKTtcclxuXHJcbiAgcmV0dXJuIGF1dGhlbnRpY2F0aW9uU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKS5waXBlKG1hcCgoYXV0aGVudGljYXRlZCkgPT4ge1xyXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWQpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gU3RvcmUgdGhlIGF0dGVtcHRlZCBVUkwgZm9yIHJlZGlyZWN0aW5nXHJcbiAgICAgIGF1dGhlbnRpY2F0aW9uU2VydmljZS5yZWRpcmVjdFVybCA9IHN0YXRlLnVybDtcclxuICAgICAgXHJcbiAgICAgIGlmIChhdXRoZW50aWNhdGlvbkxvZ2luUGF0aCkge1xyXG4gICAgICAgIC8vVHJ5IHRvIGdldCBhbiBhY2Nlc3MgdG9rZW5cclxuICAgICAgICBhdXRoZW50aWNhdGlvblNlcnZpY2UucmVxdWVzdEFjY2Vzc1Rva2VuKHRydWUsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBsb2dpbiBwYWdlXHJcbiAgICAgICAgcmV0dXJuIHJvdXRlci5jcmVhdGVVcmxUcmVlKFthdXRoZW50aWNhdGlvblJvdXRlXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KSk7XHJcbn07XHJcblxyXG5cclxuIl19
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtZ3VhcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2F1dGhlbnRpY2F0aW9uL3NyYy9yb3V0ZS1ndWFyZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsTUFBTSxFQUE4QyxNQUFNLGlCQUFpQixDQUFDO0FBR3BGLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuQyxPQUFPLEVBQUMscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUdyRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEtBQTZCLEVBQUUsS0FBMEIsRUFBRSxFQUFFO0lBQzdGLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDNUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFFekQsT0FBTyxxQkFBcUIsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7UUFDeEUsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFDSSxDQUFDO1lBQ0osMENBQTBDO1lBQzFDLHFCQUFxQixDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO1lBRTlDLHNCQUFzQjtZQUN0QixJQUFJLHFCQUFxQixDQUFDLG9CQUFvQixFQUFFLEVBQUUsQ0FBQztnQkFDakQsNEJBQTRCO2dCQUM1QixxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdkQsQ0FBQztZQUNELHNDQUFzQztpQkFDakMsQ0FBQztnQkFDSiw2QkFBNkI7Z0JBQzdCLE9BQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztZQUNyRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgSHVudHNtYW4gQ2FuY2VyIEluc3RpdHV0ZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoLCBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5XHJcbiAqL1xyXG5pbXBvcnQge2luamVjdH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtSb3V0ZXIsIEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIFJvdXRlclN0YXRlU25hcHNob3R9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuXHJcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHttYXB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5cclxuaW1wb3J0IHtBdXRoZW50aWNhdGlvblNlcnZpY2UsIEFVVEhFTlRJQ0FUSU9OX1JPVVRFfSBmcm9tIFwiLi9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlXCI7XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IFJvdXRlR3VhcmRTZXJ2aWNlID0gKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCkgPT4ge1xyXG4gIGNvbnN0IGF1dGhlbnRpY2F0aW9uU2VydmljZSA9IGluamVjdChBdXRoZW50aWNhdGlvblNlcnZpY2UpO1xyXG4gIGNvbnN0IHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xyXG4gIGNvbnN0IGF1dGhlbnRpY2F0aW9uUm91dGUgPSBpbmplY3QoQVVUSEVOVElDQVRJT05fUk9VVEUpO1xyXG5cclxuICByZXR1cm4gYXV0aGVudGljYXRpb25TZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpLnBpcGUobWFwKChhdXRoZW50aWNhdGVkKSA9PiB7XHJcbiAgICBpZiAoYXV0aGVudGljYXRlZCkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBTdG9yZSB0aGUgYXR0ZW1wdGVkIFVSTCBmb3IgcmVkaXJlY3RpbmdcclxuICAgICAgYXV0aGVudGljYXRpb25TZXJ2aWNlLnJlZGlyZWN0VXJsID0gc3RhdGUudXJsO1xyXG4gICAgICBcclxuICAgICAgLy9SZWRpcmVjdCBiYXNlZCBsb2dpblxyXG4gICAgICBpZiAoYXV0aGVudGljYXRpb25TZXJ2aWNlLmlzUmVkaXJlY3RCYXNlZExvZ2luKCkpIHtcclxuICAgICAgICAvL1RyeSB0byBnZXQgYW4gYWNjZXNzIHRva2VuXHJcbiAgICAgICAgYXV0aGVudGljYXRpb25TZXJ2aWNlLnJlcXVlc3RBY2Nlc3NUb2tlbih0cnVlLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgICAvL0F1dGhlbnRpY2F0aW9uIGNvbXBvbmVudCBiYXNlZCBsb2dpblxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBOYXZpZ2F0ZSB0byB0aGUgbG9naW4gcGFnZVxyXG4gICAgICAgIHJldHVybiByb3V0ZXIuY3JlYXRlVXJsVHJlZShbYXV0aGVudGljYXRpb25Sb3V0ZV0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSkpO1xyXG59O1xyXG5cclxuXHJcbiJdfQ==
@@ -183,6 +183,14 @@ class AuthenticationService {
183
183
  get redirectUrl() {
184
184
  return this._redirectUrl;
185
185
  }
186
+ isRedirectBasedLogin() {
187
+ if (this._loginPath) {
188
+ return true;
189
+ }
190
+ else {
191
+ return false;
192
+ }
193
+ }
186
194
  initiateLogin() {
187
195
  if (isDevMode()) {
188
196
  console.debug("Authentication Service: Initiate Login");
@@ -969,7 +977,6 @@ const RouteGuardService = (route, state) => {
969
977
  const authenticationService = inject(AuthenticationService);
970
978
  const router = inject(Router);
971
979
  const authenticationRoute = inject(AUTHENTICATION_ROUTE);
972
- const authenticationLoginPath = inject(AUTHENTICATION_LOGIN_PATH);
973
980
  return authenticationService.isAuthenticated().pipe(map((authenticated) => {
974
981
  if (authenticated) {
975
982
  return true;
@@ -977,10 +984,12 @@ const RouteGuardService = (route, state) => {
977
984
  else {
978
985
  // Store the attempted URL for redirecting
979
986
  authenticationService.redirectUrl = state.url;
980
- if (authenticationLoginPath) {
987
+ //Redirect based login
988
+ if (authenticationService.isRedirectBasedLogin()) {
981
989
  //Try to get an access token
982
990
  authenticationService.requestAccessToken(true, true);
983
991
  }
992
+ //Authentication component based login
984
993
  else {
985
994
  // Navigate to the login page
986
995
  return router.createUrlTree([authenticationRoute]);
@@ -1 +1 @@
1
- {"version":3,"file":"huntsman-cancer-institute-authentication.mjs","sources":["../../../projects/authentication/src/authentication.provider.ts","../../../projects/authentication/src/authentication.service.ts","../../../projects/authentication/src/authentication.component.ts","../../../projects/authentication/src/directlogin.component.ts","../../../projects/authentication/src/timeout-notification.component.ts","../../../projects/authentication/src/authorization.interceptor.ts","../../../projects/authentication/src/authentication.module.ts","../../../projects/authentication/src/route-guard.service.ts","../../../projects/authentication/src/huntsman-cancer-institute-authentication.ts"],"sourcesContent":["import {Inject, Injectable, InjectionToken, Injector} from \"@angular/core\";\r\n\r\nimport {Subject} from \"rxjs\";\r\n\r\nimport {CoolLocalStorage} from '@angular-cool/storage';\r\n\r\nexport let AUTHENTICATION_TOKEN_KEY = new InjectionToken<string>(\"authentication_token_key\");\r\n\r\n@Injectable()\r\nexport class AuthenticationProvider {\r\n\r\n public whitelistedDomains = [\r\n \"localhost\",\r\n new RegExp(\".*[.]utah[.]edu\")\r\n ];\r\n\r\n constructor(private _localStorageService: CoolLocalStorage,\r\n @Inject(AUTHENTICATION_TOKEN_KEY) private _authenticationTokenKey: string) {}\r\n\r\n public tokenGetter = () => {\r\n return this.authToken;\r\n }\r\n\r\n get authenticationTokenKey(): string {\r\n return this._authenticationTokenKey;\r\n }\r\n\r\n set authenticationTokenKey(_authenticationTokenKey: string) {\r\n this._authenticationTokenKey = _authenticationTokenKey;\r\n }\r\n\r\n get authToken(): string {\r\n return <string>this._localStorageService.getItem(this._authenticationTokenKey);\r\n }\r\n\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {Injectable, InjectionToken, Inject, Optional, isDevMode} from \"@angular/core\";\r\nimport {LocationStrategy} from \"@angular/common\";\r\nimport {Router} from \"@angular/router\";\r\nimport {HttpClient, HttpHeaders, HttpRequest, HttpResponse} from \"@angular/common/http\";\r\n\r\nimport {interval, Observable, BehaviorSubject, Subscription, throwError, of} from \"rxjs\";\r\nimport {catchError, first, map} from \"rxjs/operators\";\r\nimport {JwtHelperService} from \"@auth0/angular-jwt\";\r\n\r\nimport {AuthenticationProvider} from \"./authentication.provider\";\r\nimport { CoolLocalStorage } from \"@angular-cool/storage\";\r\n\r\n/**\r\n * The token used for injection of the server side endpoint for the currently authenticated subject.\r\n *\r\n * @type {InjectionToken}\r\n */\r\nexport let AUTHENTICATION_SERVER_URL = new InjectionToken<string>(\"authentication_server_rest_api\");\r\nexport let AUTHENTICATION_LOGIN_PATH = new InjectionToken<string>(\"authentication_login_path\");\r\nexport let AUTHENTICATION_LOGOUT_PATH = new InjectionToken<string>(\"authentication_logout_path\");\r\nexport let AUTHENTICATION_DIRECT_ENDPOINT = new InjectionToken<string>(\"authentication_direct_endpoint\");\r\nexport let AUTHENTICATION_TOKEN_ENDPOINT = new InjectionToken<string>(\"authentication_token_endpoint\");\r\nexport let AUTHENTICATION_ROUTE = new InjectionToken<string>(\"authentication_route\");\r\nexport let AUTHENTICATION_MAX_INACTIVITY_MINUTES = new InjectionToken<number>(\"authentication_max_inactivity\");\r\nexport let AUTHENTICATION_USER_COUNTDOWN_SECONDS = new InjectionToken<number>(\"authentication_user_countdown_seconds\");\r\nexport let AUTHENTICATION_IDP_INACTIVITY_MINUTES = new InjectionToken<number>(\"authentication_idp_inactivity_minutes\");\r\n\r\n/**\r\n * @since 1.0.0\r\n */\r\n@Injectable()\r\nexport class AuthenticationService {\r\n\r\n /**\r\n * The generic error message used when a server error is thrown without a status.\r\n *\r\n * @type {string}\r\n */\r\n public static GENERIC_ERR_MSG: string = \"Server error\";\r\n\r\n private static CONTENT_TYPE: string = \"Content-Type\";\r\n private static SEC_GOV_CLASS_HEADER: string = \"SecurityGovernorClass\";\r\n private static SEC_GOV_ID_HEADER: string = \"SecurityGovernorId\";\r\n private static DEIDENT_HEADER: string = \"DeidentifiedContext\";\r\n private static LIMITED_HEADER: string = \"LimitedContext\";\r\n\r\n public userCountdownSeconds: number = 60;\r\n public idpInactivityMinutes: number = 5;\r\n\r\n public contentType: string = \"application/json\";\r\n public securityGovernorClass: string;\r\n public securityGovernorId: number;\r\n public limitedContext: boolean = false;\r\n public deidentifiedContext: boolean = false;\r\n\r\n private maxViewPermission: BehaviorSubject<\"view\" | \"viewident\" | \"viewlimited\"> = new BehaviorSubject<\"view\" | \"viewident\" | \"viewlimited\">(\"viewident\");\r\n private _isAuthenticatedSubject: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);\r\n private _userIsAboutToTimeOut: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);\r\n private _redirectUrl: string;\r\n private _refreshSubscription: Subscription;\r\n private _lastUserInteraction: Date;\r\n private _maxInactivityMinutes: number = 120;\r\n\r\n private baseUrl: string;\r\n private contextRoot: string = \"\";\r\n\r\n constructor(private _http: HttpClient,\r\n private _router: Router,\r\n private _localStorageService: CoolLocalStorage,\r\n private _jwtHelper: JwtHelperService,\r\n private authenticationProvider: AuthenticationProvider,\r\n @Inject(AUTHENTICATION_LOGOUT_PATH) private _logoutPath: string,\r\n @Inject(AUTHENTICATION_TOKEN_ENDPOINT) private _tokenEndpoint: string,\r\n @Optional() @Inject(AUTHENTICATION_LOGIN_PATH) private _loginPath: string,\r\n @Optional() @Inject(AUTHENTICATION_ROUTE) private _authenticationRoute: string,\r\n @Optional() @Inject(AUTHENTICATION_SERVER_URL) private _serverUrl: string,\r\n @Optional() @Inject(AUTHENTICATION_DIRECT_ENDPOINT) private _directEndpoint: string,\r\n @Optional() @Inject(AUTHENTICATION_MAX_INACTIVITY_MINUTES) private _maxInactivity: number,\r\n @Optional() @Inject(AUTHENTICATION_USER_COUNTDOWN_SECONDS) private _userCountdownSeconds: number,\r\n @Optional() @Inject(AUTHENTICATION_IDP_INACTIVITY_MINUTES) private _idpInactivityMinutes: number,\r\n @Optional() @Inject(LocationStrategy) private locationStrategy: LocationStrategy) {\r\n if (isDevMode()) {\r\n console.debug(\"window.location.href: \" + window.location.href);\r\n }\r\n\r\n if (window.location) {\r\n let parts: string[] = window.location.href.split(\"/\");\r\n this.baseUrl = parts[0] + \"//\" + parts[2];\r\n if (parts.length > 3) {\r\n this.contextRoot = parts[3];\r\n }\r\n }\r\n\r\n if (this._localStorageService.getItem(\"maxViewPermission\")) {\r\n this.maxViewPermission.next(<\"view\" | \"viewident\" | \"viewlimited\">this._localStorageService.getItem(\"maxViewPermission\"));\r\n }\r\n\r\n if (_maxInactivity) {\r\n this._maxInactivityMinutes = _maxInactivity;\r\n }\r\n\r\n if (_userCountdownSeconds) {\r\n this.userCountdownSeconds = _userCountdownSeconds;\r\n }\r\n\r\n if (_idpInactivityMinutes) {\r\n this.idpInactivityMinutes = _idpInactivityMinutes;\r\n }\r\n\r\n this.hasValidConfig();\r\n }\r\n\r\n getBaseUrl(): string {\r\n return (this.baseUrl) ? this.baseUrl : \"\";\r\n }\r\n\r\n getContextRoot(): string {\r\n return this.contextRoot;\r\n }\r\n\r\n getHeaders(req: HttpRequest<any>): HttpHeaders {\r\n let headers: HttpHeaders = req.headers;\r\n\r\n //Don't set content type if already set\r\n if (!req.headers.get(AuthenticationService.CONTENT_TYPE)) {\r\n headers = headers.set(AuthenticationService.CONTENT_TYPE, this.contentType.toString());\r\n }\r\n\r\n if (headers.get(AuthenticationService.SEC_GOV_CLASS_HEADER) === \"\") {\r\n headers = headers.delete(AuthenticationService.SEC_GOV_CLASS_HEADER);\r\n } else if (this.securityGovernorClass && !headers.get(AuthenticationService.SEC_GOV_CLASS_HEADER)) {\r\n headers = headers.set(AuthenticationService.SEC_GOV_CLASS_HEADER, this.securityGovernorClass);\r\n }\r\n\r\n if (headers.get(AuthenticationService.SEC_GOV_ID_HEADER) === \"\") {\r\n headers = headers.delete(AuthenticationService.SEC_GOV_ID_HEADER);\r\n } else if (this.securityGovernorId && !headers.get(AuthenticationService.SEC_GOV_ID_HEADER)) {\r\n headers = headers.set(AuthenticationService.SEC_GOV_ID_HEADER, this.securityGovernorId.toString());\r\n }\r\n\r\n headers = headers.set(AuthenticationService.DEIDENT_HEADER, this.deidentifiedContext.toString());\r\n headers = headers.set(AuthenticationService.LIMITED_HEADER, this.limitedContext.toString());\r\n\r\n return headers;\r\n }\r\n\r\n get authenticationTokenKey(): string {\r\n return this.authenticationProvider.authenticationTokenKey;\r\n }\r\n\r\n get authToken(): string {\r\n return this.authenticationProvider.authToken;\r\n }\r\n\r\n public updateUserActivity(): void {\r\n if (this._isAuthenticatedSubject.value) {\r\n this._lastUserInteraction = new Date();\r\n this._userIsAboutToTimeOut.next(false);\r\n }\r\n }\r\n\r\n /**\r\n * A mutator for identifying the clients original request location. Setting this value will influence the end location\r\n * navigated to by {@link #navigateToPath}.\r\n *\r\n * @param redirectUrl location of the users request before authentication\r\n */\r\n set redirectUrl(redirectUrl: string) {\r\n this._redirectUrl = redirectUrl;\r\n }\r\n\r\n get redirectUrl() {\r\n return this._redirectUrl;\r\n }\r\n \r\n \r\n initiateLogin() {\r\n if (isDevMode()) {\r\n console.debug(\"Authentication Service: Initiate Login\");\r\n }\r\n \r\n //Redirect based authentication\r\n window.location.href = this.getBaseUrl() + (this._loginPath.startsWith(\"/\")?\"\":\"/\") + this._loginPath;\r\n }\r\n\r\n requestAccessToken(fromRouteGuard: boolean, redirectOnSuccess: boolean): void {\r\n \r\n if (isDevMode()) {\r\n console.debug(\"Authentication Service: Request Acces Token\");\r\n }\r\n\r\n this._http.get(this.tokenLocation(), {withCredentials: true, responseType: \"json\"})\r\n .subscribe(\r\n (response: any) => {\r\n this.storeToken(response.auth_token);\r\n if (redirectOnSuccess) {\r\n this.proceedIfAuthenticated();\r\n }\r\n },\r\n (error) => {\r\n //Not logged in - start authentication\r\n if (fromRouteGuard) {\r\n this.initiateLogin();\r\n }\r\n //Background token request failed - logout and clear\r\n else {\r\n if (isDevMode()) {\r\n console.error(\"Authentication Service: Request Acces Token - Logout\");\r\n }\r\n \r\n this.logout(true);\r\n }\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Verifies whether or not a current user session exists.\r\n *\r\n * @returns {Observable<boolean>} evaluates to true if the user is authenticated, false otherwise.\r\n */\r\n isAuthenticated(): Observable<boolean> {\r\n return this._isAuthenticatedSubject.asObservable();\r\n }\r\n\r\n isAboutToTimeOut(): Observable<boolean> {\r\n return this._userIsAboutToTimeOut.asObservable();\r\n }\r\n\r\n getTimeoutStart(): number {\r\n if (this._lastUserInteraction) {\r\n return this._lastUserInteraction.valueOf() + (((this._maxInactivityMinutes * 60) - this.userCountdownSeconds) * 1000);\r\n }\r\n }\r\n\r\n tokenLocation(): string {\r\n if (this._serverUrl) {\r\n return this._serverUrl + this._tokenEndpoint;\r\n } else {\r\n return this._tokenEndpoint;\r\n }\r\n }\r\n\r\n directLoginLocation(): string {\r\n if (this._serverUrl) {\r\n return this._serverUrl + this._directEndpoint;\r\n } else {\r\n return this._directEndpoint;\r\n }\r\n }\r\n\r\n logoutLocation(): string {\r\n if (this._serverUrl) {\r\n return this._serverUrl + this._logoutPath;\r\n } else {\r\n return this._logoutPath;\r\n }\r\n }\r\n\r\n /**\r\n * A function to authenticated the user with the provided credentials. Failure results in an error that describes the\r\n * server response (status and status message) and should be actionable by the client application.\r\n *\r\n * @param username of the authenticating user to verify\r\n * @param password of the authenticating user to verify\r\n * @returns {Observable<R>} describing the result of the login action, true or an error\r\n */\r\n login(_username: string, _password: string): Observable<boolean> {\r\n return this._http.post(\r\n this.directLoginLocation(),\r\n {username: _username, password: _password},\r\n {observe: \"response\"}\r\n ).pipe(map((resp: HttpResponse<any>) => {\r\n if (resp.status === 201) {\r\n return true;\r\n } else {\r\n throw new Error(\"Authentication failed. \" + resp.status + \": \" + resp.statusText);\r\n }\r\n }),\r\n catchError(this.handleError)) as Observable<boolean>;\r\n }\r\n\r\n\r\n clearLogin(): Observable<string> {\r\n //Front-end logout\r\n try {\r\n this._localStorageService.removeItem(this.authenticationProvider.authenticationTokenKey);\r\n this.unsubscribeFromTokenRefresh();\r\n this._isAuthenticatedSubject.next(false);\r\n this._userIsAboutToTimeOut.next(false);\r\n } catch (Error) {\r\n }\r\n\r\n //Back-end logout\r\n let headers = new HttpHeaders().set(AuthenticationService.CONTENT_TYPE, \"text/plain\");\r\n return <Observable<string>>this._http.get(this.logoutLocation(), {headers: headers, responseType: \"text\"});\r\n }\r\n\r\n /**\r\n * A function to signal the termination of the current session. Invoking this function will clean up any relevant state\r\n * related to the last active session.\r\n */\r\n logout(keepCurrentRoute: boolean = false): void {\r\n //Prevent logout if already on authentication route. Doing otherwise screws up SAML\r\n if (! this._router.routerState || this._router.routerState.snapshot.url !== this._authenticationRoute) {\r\n this._redirectUrl = (keepCurrentRoute && this._router.routerState && this._router.routerState.snapshot) ? this._router.routerState.snapshot.url : \"\";\r\n\r\n if (this._redirectUrl.startsWith(\"/\")) {\r\n this._redirectUrl = this._redirectUrl.substring(1);\r\n }\r\n\r\n this.clearLogin().subscribe(\r\n (response) => {\r\n window.location.replace(this._redirectUrl);\r\n },\r\n (error) => {\r\n window.location.replace(this._redirectUrl);\r\n }\r\n );\r\n }\r\n }\r\n\r\n storeToken(token: string): void {\r\n let valid = this.validateToken(token);\r\n\r\n // unsubscribe from refesh before we decide wether to resubscribe\r\n this.unsubscribeFromTokenRefresh();\r\n\r\n if (valid) {\r\n this._localStorageService.setItem(this.authenticationProvider.authenticationTokenKey, token);\r\n this.subscribeToTokenRefresh(token);\r\n\r\n //Change the BehaviorSubject if the user was not previously authenticated.\r\n //Since other code may be subscribing to this observable, we don't want to cause new events to fire if just refreshing the JWT.\r\n if (! this._isAuthenticatedSubject.value) {\r\n this._isAuthenticatedSubject.next(true);\r\n }\r\n } else {\r\n this._localStorageService.removeItem(this.authenticationProvider.authenticationTokenKey);\r\n this._isAuthenticatedSubject.next(false);\r\n }\r\n }\r\n\r\n proceedIfAuthenticated(): boolean {\r\n if (isDevMode()) {\r\n console.debug(\"AuthenticationService.proceedIfAuthenticated: \" + this._redirectUrl);\r\n }\r\n\r\n if (this._isAuthenticatedSubject.value) {\r\n //Login counts as user activity, too\r\n this.updateUserActivity();\r\n\r\n if (this._redirectUrl && this._redirectUrl && this._redirectUrl !== \"\") {\r\n this._router.navigateByUrl(this._redirectUrl);\r\n } else {\r\n this._router.navigate([\"\"]);\r\n }\r\n\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n validateToken(token: string): boolean {\r\n return (token && !this._jwtHelper.isTokenExpired(token));\r\n }\r\n\r\n subscribeToTokenRefresh(token: any): void {\r\n let exp = this._jwtHelper.getTokenExpirationDate(token);\r\n\r\n // Use a timer to periodically check timeouts\r\n this._refreshSubscription = interval(1000)\r\n .subscribe(() => {\r\n\r\n // If a tab is inactive we can't know if our timer is accurate\r\n // so when the interval hits check against timestamps\r\n if (this._isAuthenticatedSubject.value && Date.now() > this.getTimeoutStart()) {\r\n //Don't update the subject more than once! Doing so initializes more than one countdown timer!\r\n if (this._userIsAboutToTimeOut.getValue() !== true) {\r\n this._userIsAboutToTimeOut.next(true);\r\n }\r\n }\r\n\r\n // check for refresh token\r\n let msToExpiry = (exp.valueOf() - new Date().valueOf());\r\n\r\n // Refresh 60 seconds before expiry\r\n if (msToExpiry <= 60000) {\r\n this.refreshTokenIfUserIsActive();\r\n }\r\n });\r\n }\r\n\r\n unsubscribeFromTokenRefresh(): void {\r\n if (this._refreshSubscription && ! this._refreshSubscription.closed) {\r\n this._refreshSubscription.unsubscribe();\r\n }\r\n }\r\n\r\n getMaxViewPermission(): \"view\" | \"viewident\" | \"viewlimited\" {\r\n return this.maxViewPermission.getValue();\r\n }\r\n\r\n getMaxViewPermissionSubject(): BehaviorSubject<\"view\" | \"viewident\" | \"viewlimited\"> {\r\n return this.maxViewPermission;\r\n }\r\n\r\n setMaxViewPermission(maxViewPermission: \"view\" | \"viewident\" | \"viewlimited\"): void {\r\n this._localStorageService.setItem(\"maxViewPermission\", maxViewPermission);\r\n this.maxViewPermission.next(maxViewPermission);\r\n }\r\n\r\n private refreshTokenIfUserIsActive(): void {\r\n //Only refresh if the user has been active\r\n if (this._lastUserInteraction && ((new Date().valueOf() - this._lastUserInteraction.valueOf()) <= (this._maxInactivityMinutes * 60 * 1000))) {\r\n this.requestAccessToken(false, false);\r\n }\r\n }\r\n\r\n private hasValidConfig(): void {\r\n if (this._tokenEndpoint == null && (this._serverUrl === null || this._logoutPath === null)) {\r\n throw new Error(\"BUG ALERT! Invalid AuthenticationService configuration. No valid configuration for authentication endpoint(s).\");\r\n }\r\n if (this._localStorageService === null || this.authenticationProvider.authenticationTokenKey === null) {\r\n throw new Error(\"BUG ALERT! Invalid AuthenticationService configuration. No valid configuration for local storage\");\r\n }\r\n }\r\n\r\n private handleError(error: any) : Observable<never> {\r\n let errMsg = (error.message) ? error.message : AuthenticationService.GENERIC_ERR_MSG;\r\n return throwError(errMsg);\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {Component, ElementRef, ViewChild, Inject, Renderer2} from \"@angular/core\";\r\nimport {Location, PopStateEvent} from \"@angular/common\";\r\nimport {Router} from \"@angular/router\";\r\nimport {DomSanitizer} from \"@angular/platform-browser\";\r\n\r\nimport {interval, Subscription} from \"rxjs\";\r\nimport {first} from \"rxjs/operators\";\r\n\r\nimport {AuthenticationService, AUTHENTICATION_ROUTE} from \"./authentication.service\";\r\n\r\n@Component({\r\n selector: \"authentication-iframe\",\r\n template: `\r\n <div class=\"container\">\r\n <iframe #iframe class=\"frame\" [src]=\"url\" (load)=\"handleChanges()\"></iframe>\r\n <div *ngIf=\"_errorMsg\" class=\"alert-box\">\r\n <div class=\"alert alert-danger\">\r\n <h5 class=\"alert-heading\">Authentication Failed</h5>\r\n <span id=\"hci-login-error\" class=\"alert-text\">{{_errorMsg}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n \r\n :host {\r\n background-color: white;\r\n }\r\n \r\n .container {\r\n max-width: 100%;\r\n margin-top: 60px;\r\n padding-top: 15px;\r\n }\r\n\r\n .frame {\r\n width: 100%;\r\n height: 100%;\r\n border: 0px;\r\n }\r\n `],\r\n host: {class: \"outlet-row\"}\r\n})\r\nexport class AuthenticationComponent {\r\n\r\n public url;\r\n public _errorMsg: string;\r\n\r\n @ViewChild(\"iframe\", {static: true}) iframe : ElementRef;\r\n\r\n private resetSubscription: Subscription;\r\n private popstateSubscription: Subscription;\r\n\r\n constructor(private authenticationService: AuthenticationService,\r\n private domSanitizer : DomSanitizer,\r\n private router: Router,\r\n private location: Location,\r\n private renderer: Renderer2,\r\n @Inject(AUTHENTICATION_ROUTE) private authenticationRoute: string) {\r\n }\r\n\r\n ngOnInit() {\r\n /*\r\n * Fix back bug\r\n * Issue is that the browser will go back to the previous route. If it's guarded, the route guard will just load the login again\r\n * Eventually the browser gets to the /authenticate route and going back from there loads the iframe history and Shibboleth displays\r\n * an error relating to navigating back.\r\n */\r\n history.pushState(null, null, this.location.prepareExternalUrl(this.authenticationRoute));\r\n\r\n this.popstateSubscription = <Subscription> this.location.subscribe((value: PopStateEvent) => {\r\n //This is going to prevent back from working from the login component\r\n history.go(1);\r\n });\r\n\r\n this.beginAuthenticationProcess();\r\n }\r\n\r\n handleChanges(): void {\r\n if (!this.iframe.nativeElement.contentDocument) {\r\n return;\r\n }\r\n\r\n try {\r\n let element: HTMLElement = this.iframe.nativeElement.contentDocument.body;\r\n if (element.querySelector(\"pre\")) {\r\n element = element.querySelector(\"pre\");\r\n }\r\n\r\n this._errorMsg = null;\r\n var jsonText = element.innerText;\r\n\r\n var json = JSON.parse(jsonText);\r\n this.authenticationService.storeToken(json.auth_token);\r\n var authenticated = this.authenticationService.proceedIfAuthenticated();\r\n\r\n if (!authenticated) {\r\n this.resetSubscription.unsubscribe();\r\n this.beginAuthenticationProcess();\r\n }\r\n } catch (error) {\r\n if (this.iframe.nativeElement.contentDocument.title.toUpperCase() === \"ERROR\") {\r\n if (this.iframe.nativeElement.contentDocument.body.innerHTML.toUpperCase() === \"FORBIDDEN\") {\r\n this._errorMsg = \"You do not have permission to log into this application\";\r\n } else {\r\n this._errorMsg = null;\r\n }\r\n\r\n //A bit of a workaround for a WildFly issue. Success on Pac4j authentication, but failure on DB load of user put things in a weird state. Just logout, and redo the login.\r\n this.clearLoginAndRetry();\r\n }\r\n }\r\n\r\n // After the iframe loads, make the background transparent so we use the implementation's background and not the sso background.\r\n this.renderer.setStyle(this.iframe.nativeElement.contentDocument.body, \"background-color\", \"transparent\");\r\n }\r\n\r\n ngOnDestroy() {\r\n this.resetSubscription.unsubscribe();\r\n this.popstateSubscription.unsubscribe();\r\n }\r\n\r\n private clearLoginAndRetry(): void {\r\n this.resetSubscription.unsubscribe();\r\n this.authenticationService.clearLogin().subscribe(\r\n () => { this.beginAuthenticationProcess(); },\r\n (error) => { this.beginAuthenticationProcess(); }\r\n );\r\n }\r\n\r\n private beginAuthenticationProcess(): void {\r\n var tokenEndpoint = this.authenticationService.tokenLocation();\r\n \r\n if (tokenEndpoint !== \"\") {\r\n this.url = this.domSanitizer.bypassSecurityTrustResourceUrl(tokenEndpoint);\r\n }\r\n\r\n /**\r\n * If the user doesn't complete authentication before the IdP session times out, that will be a problem when they eventually\r\n * attampt to log in. It is likely that users will do this often when they log out or are timed out in the evening, leave\r\n * their browser open, then attempt to log back in in the morning. In order to work around this, this component will re-request\r\n * the token prior to IdP timeout, which will reset the process. This will happen 1 minute before idpInactivityMinutes\r\n **/\r\n this.resetSubscription = interval((this.authenticationService.idpInactivityMinutes - 1) * 60 * 1000)\r\n .pipe(first())\r\n .subscribe((value) => {\r\n this.beginAuthenticationProcess();\r\n });\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {Component, OnInit} from \"@angular/core\";\r\nimport {AuthenticationService} from \"./authentication.service\";\r\nimport {UntypedFormBuilder, UntypedFormGroup, Validators} from \"@angular/forms\";\r\n\r\n@Component({\r\n selector: \"hci-login-form\",\r\n template: `\r\n <div class=\"container\">\r\n <div class=\"login-box\" id=\"hci-login-form-box\">\r\n <div class=\"login-heading\" id=\"hci-login-form-heading\">\r\n <h3>Sign in</h3>\r\n </div>\r\n <div class=\"panel-body\">\r\n <form [formGroup]=\"_loginForm\" (ngSubmit)=\"login()\">\r\n <input formControlName=\"username\" class=\"form-control\" id=\"username\" name=\"username\" placeholder=\"Username\" type=\"text\">\r\n <input formControlName=\"password\" class=\"form-control\" id=\"password\" name=\"password\" type=\"password\" placeholder=\"Password\">\r\n \r\n <div *ngIf=\"_errorMsg\" class=\"alert-box\">\r\n <div class=\"alert alert-danger\">\r\n <h5 class=\"alert-heading\">Authentication Failed</h5>\r\n <span id=\"hci-login-error\" class=\"alert-text\">{{_errorMsg}}</span>\r\n </div>\r\n </div>\r\n \r\n <div class=\"btn-box\">\r\n <button class=\"btn btn-primary\" id=\"hci-login-form-submit-button\" type=\"submit\" [disabled]=\"!_loginForm.valid\">Login</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n .container {\r\n max-width: 400px;\r\n margin-top: 20px;\r\n padding-top: 15px;\r\n }\r\n \r\n .login-box {\r\n border-radius: 10px;\r\n box-shadow: 0 0 2px #ccc;\r\n padding: 15px;\r\n }\r\n \r\n .login-box .login-heading h3 {\r\n line-height:1.5;\r\n margin: 0 0 10px\r\n }\r\n \r\n .login-box .form-control {\r\n padding: 10px;\r\n border: 1px solid #ccc;\r\n }\r\n \r\n .login-box input[type=\"password\"] {\r\n margin-bottom: 10px;\r\n border-top-left-radius: 0;\r\n border-top-right-radius: 0;\r\n }\r\n \r\n .login-box input[type=\"text\"] {\r\n margin-bottom: -1px;\r\n border-bottom-right-radius: 0;\r\n border-bottom-left-radius: 0;\r\n }\r\n \r\n .login-box .alert-box {\r\n margin: 10px 0 -5px 0\r\n }\r\n \r\n .login-box .alert-text {\r\n font-size: small;\r\n }\r\n \r\n .login-box .btn-box {\r\n margin: 10px 0 0px 0\r\n }\r\n `]\r\n})\r\nexport class DirectLoginComponent implements OnInit {\r\n public _loginForm: UntypedFormGroup;\r\n public _errorMsg: string;\r\n\r\n constructor(private _authenticationService: AuthenticationService, private _formBuilder: UntypedFormBuilder) {}\r\n\r\n /**\r\n * Initializes the authentication form.\r\n */\r\n ngOnInit(): void {\r\n this._loginForm = this._formBuilder.group({\r\n username: [\"\", Validators.required],\r\n password: [\"\", Validators.required]\r\n });\r\n }\r\n\r\n /**\r\n * A function to submit the login form the the {@link UserService}.\r\n */\r\n login() {\r\n this._authenticationService.login(this._loginForm.value.username, this._loginForm.value.password)\r\n .subscribe((res) => {\r\n if (res) {\r\n this._errorMsg = null;\r\n this._authenticationService.requestAccessToken(false, true);\r\n }\r\n }, (error: any) => {\r\n this._errorMsg = \"Please check your username and password.\";\r\n });\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {Component} from \"@angular/core\";\r\nimport {animate, state, style, transition, trigger} from \"@angular/animations\";\r\n\r\nimport {Observable, Subscription, timer} from \"rxjs\";\r\nimport {map, takeWhile} from \"rxjs/operators\";\r\n\r\nimport {AuthenticationService} from \"./authentication.service\";\r\n\r\n@Component({\r\n selector: \"timeout-notification\",\r\n template: `\r\n <div class=\"flyout-max\" [@openBacksplash]=\"openState\">\r\n <div class=\"modal-dialog\" [@openModal]=\"openState\" role=\"document\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">Your Session Is About To Expire</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <p>For your security, your session is about to automatically time out in the next <b>{{seconds | async}}</b> seconds. Would you like to stay signed in?</p>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <ng-container>\r\n <button id=\"updateBtn\" type=\"button\" class=\"btn btn-secondary\" (click)=\"click()\">Yes, Keep me signed in</button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n animations: [\r\n trigger(\"openBacksplash\",\r\n [\r\n state(\"in\", style({\r\n \"display\": \"none\"\r\n })),\r\n state(\"hidden\", style({\r\n \"display\": \"none\"\r\n })),\r\n state(\"opened\", style({\r\n \"display\": \"inherit\"\r\n })),\r\n transition(\"hidden => opened\", animate(100)),\r\n transition(\"opened => hidden\", animate(200))\r\n ]\r\n ),\r\n trigger(\"openModal\",\r\n [\r\n state(\"in\", style({\r\n \"opacity\": \"0\",\r\n \"left\": \"-50vw\"\r\n })),\r\n state(\"hidden\", style({\r\n \"opacity\": \"0\",\r\n \"left\": \"-50vw\"\r\n })),\r\n state(\"opened\", style({\r\n \"opacity\": \"1\",\r\n \"left\": \"25vw\"\r\n })),\r\n transition(\"hidden => opened\", animate(500)),\r\n transition(\"opened => hidden\", animate(300))\r\n ]\r\n )\r\n ],\r\n styles: [`\r\n\r\n .flyout-max {\r\n position: fixed;\r\n z-index: 9999;\r\n top: 0;\r\n bottom: 0;\r\n background-color: rgba(0, 0, 0, 0.4);\r\n width: 100vw;\r\n }\r\n \r\n .modal-dialog {\r\n position: fixed;\r\n max-width: 50vw;\r\n min-width: 50vw;\r\n left: -50vw;\r\n top: 25vw;\r\n margin: 0;\r\n background-color: white;\r\n border: black 1px solid;\r\n border-left: none;\r\n border-top-right-radius: 20px;\r\n border-bottom-right-radius: 20px;\r\n border-top-left-radius: 20px;\r\n border-bottom-left-radius: 20px;\r\n pointer-events: all;\r\n }\r\n \r\n .modal-body {\r\n width: 100%;\r\n display: inline-block;\r\n }\r\n \r\n .modal-body-left {\r\n display: inline-block;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n min-height: 300px;\r\n max-height: 300px;\r\n }\r\n \r\n .modal-body-right {\r\n width: 70%;\r\n vertical-align: top;\r\n padding-left: 15px;\r\n border-left: black 1px solid;\r\n margin-left: 15px;\r\n display: inline-block;\r\n overflow-y: auto;\r\n min-height: 300px;\r\n max-height: 300px;\r\n }\r\n `]\r\n})\r\nexport class TimeoutNotificationComponent {\r\n public seconds: Observable<number>;\r\n public openState: string = \"hidden\";\r\n\r\n private subscription: Subscription;\r\n\r\n constructor(private authenticationService: AuthenticationService) {\r\n authenticationService.isAboutToTimeOut().subscribe((isAboutToTimeOut) => {\r\n\r\n if (isAboutToTimeOut) {\r\n this.openState = \"opened\";\r\n this.startCountdown();\r\n } else {\r\n this.openState = \"hidden\";\r\n //If something changed mid-timeout, cancel the timeout/logout.\r\n if (this.subscription != null && !this.subscription.closed) {\r\n this.subscription.unsubscribe();\r\n }\r\n }\r\n });\r\n }\r\n\r\n startCountdown(): void {\r\n this.seconds = timer(0, 1000)\r\n .pipe(\r\n map(() => {\r\n const elapsed: number = Math.round((Date.now() - this.authenticationService.getTimeoutStart()) / 1000);\r\n return this.authenticationService.userCountdownSeconds - elapsed;\r\n }),\r\n // The true argument emits the final value that completed the observable\r\n takeWhile((value) => value > 0, true),\r\n );\r\n\r\n this.subscription = this.seconds.subscribe((value) => {\r\n if (value < 1) {\r\n this.subscription.unsubscribe();\r\n this.authenticationService.logout(true);\r\n }\r\n });\r\n }\r\n\r\n click(): void {\r\n this.subscription.unsubscribe();\r\n this.authenticationService.updateUserActivity();\r\n }\r\n}\r\n","import {Injectable, Injector, isDevMode} from \"@angular/core\";\r\nimport {HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpHeaders, HttpParams, HttpErrorResponse} from \"@angular/common/http\";\r\n\r\nimport {Observable, throwError} from \"rxjs\";\r\nimport {catchError, map} from \"rxjs/operators\";\r\n\r\nimport {AuthenticationService} from \"./authentication.service\";\r\n\r\n@Injectable()\r\nexport class AuthorizationInterceptor implements HttpInterceptor {\r\n\r\n constructor(private injector: Injector) {}\r\n\r\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n if (isDevMode()) {\r\n console.debug(\"AuthorizationInterceptor.intercept\");\r\n }\r\n \r\n let authService: AuthenticationService = this.injector.get(AuthenticationService);\r\n \r\n //Don't want to include background token refreshes in considering the user 'active'\r\n if (req.url !== authService.tokenLocation()) {\r\n //Update user activity. Done here instead of the previous method using a subscription to a subject in AuthenticationProvider\r\n authService.updateUserActivity();\r\n }\r\n \r\n let headers: HttpHeaders = authService.getHeaders(req);\r\n let url: string = req.url;\r\n if (url.startsWith(\"/\")) {\r\n url = authService.getBaseUrl() + url;\r\n } else if (!url.startsWith(\"http\")) {\r\n if (authService.getContextRoot().length > 0) {\r\n url = authService.getBaseUrl() + \"/\" + authService.getContextRoot() + \"/\" + url;\r\n } else {\r\n url = authService.getBaseUrl() + \"/\" + url;\r\n }\r\n }\r\n\r\n let params: HttpParams = req.params;\r\n if (url.indexOf(\"/crud/\") > 0) {\r\n params = params.set(\"maxViewPermission\", authService.getMaxViewPermission());\r\n }\r\n\r\n let reqClone = req.clone({\r\n url: url,\r\n withCredentials: true,\r\n headers: headers,\r\n params: params\r\n });\r\n\r\n return next.handle(reqClone)\r\n .pipe(catchError((error: HttpErrorResponse) => {\r\n if (isDevMode()) {\r\n console.debug(\"AuthorizationInterceptor.error\");\r\n }\r\n\r\n /**\r\n * If the token is not authenticated which angular does not know about, then a REST request to the backend will\r\n * return a 401. To duplicate this, open Core in two tabs. In one tab, logout, in the other, perform a request\r\n * that hits a protected resource.\r\n */\r\n if (error && error.status === 401) {\r\n authService.isAuthenticated().pipe(map((authenticated) => {\r\n if (authenticated) {\r\n // If the user was previously authenticated, then logout which will redirect.\r\n authService.logout(true);\r\n return throwError(error.message);\r\n } else {\r\n //This happens for legitimate reasons. Attempting to get the JWT when not authenticated returns the login form, for example, which NG will see as an error\r\n return throwError(error);\r\n }\r\n }));\r\n }\r\n else if (error && error.status === 403) {\r\n // TODO: Trigger notification for unauthorized.\r\n }\r\n else {\r\n return throwError(error);\r\n }\r\n })) as Observable<HttpEvent<any>>;\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {ModuleWithProviders, NgModule, Optional, SkipSelf} from \"@angular/core\";\r\nimport {CommonModule} from \"@angular/common\";\r\nimport {ReactiveFormsModule, FormsModule} from \"@angular/forms\";\r\nimport {HTTP_INTERCEPTORS, HttpClientModule} from \"@angular/common/http\";\r\nimport {RouterModule} from \"@angular/router\";\r\n\r\nimport {CoolStorageModule} from \"@angular-cool/storage\";\r\nimport {JWT_OPTIONS, JwtHelperService, JwtInterceptor, JwtModule} from \"@auth0/angular-jwt\";\r\n\r\nimport {AuthenticationService} from \"./authentication.service\";\r\nimport {AuthenticationComponent} from \"./authentication.component\";\r\nimport {DirectLoginComponent} from \"./directlogin.component\";\r\nimport {TimeoutNotificationComponent} from \"./timeout-notification.component\";\r\nimport {AuthorizationInterceptor} from \"./authorization.interceptor\";\r\nimport {AuthenticationProvider} from \"./authentication.provider\";\r\n\r\n/**\r\n * Provide a single auth service and interceptor for the implementing application. Also provide everything\r\n * from the angular-jwt library.\r\n *\r\n * @since 1.0.0\r\n */\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n HttpClientModule,\r\n //JwtModule,\r\n RouterModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n CoolStorageModule\r\n ],\r\n declarations: [\r\n AuthenticationComponent,\r\n DirectLoginComponent,\r\n TimeoutNotificationComponent\r\n ],\r\n exports: [\r\n AuthenticationComponent,\r\n DirectLoginComponent,\r\n TimeoutNotificationComponent\r\n ]\r\n})\r\nexport class AuthenticationModule {\r\n constructor(@Optional() @SkipSelf() parentModule: JwtModule) {\r\n if (parentModule) {\r\n throw new Error(\"AuthenticationModule is already loaded.\");\r\n }\r\n }\r\n static forRoot(): ModuleWithProviders<AuthenticationModule> {\r\n return {\r\n providers: [\r\n AuthenticationProvider,\r\n JwtHelperService,\r\n AuthenticationService,\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: AuthorizationInterceptor,\r\n multi: true\r\n },\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: JwtInterceptor,\r\n multi: true\r\n },\r\n {\r\n provide: JWT_OPTIONS,\r\n useClass: AuthenticationProvider\r\n }\r\n ],\r\n ngModule: AuthenticationModule\r\n }\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {inject} from \"@angular/core\";\r\nimport {Router, ActivatedRouteSnapshot, RouterStateSnapshot} from \"@angular/router\";\r\n\r\nimport {Observable} from \"rxjs\";\r\nimport {map} from \"rxjs/operators\";\r\n\r\nimport {AuthenticationService, AUTHENTICATION_ROUTE, AUTHENTICATION_LOGIN_PATH} from \"./authentication.service\";\r\n\r\n\r\nexport const RouteGuardService = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\r\n const authenticationService = inject(AuthenticationService);\r\n const router = inject(Router);\r\n const authenticationRoute = inject(AUTHENTICATION_ROUTE);\r\n const authenticationLoginPath = inject(AUTHENTICATION_LOGIN_PATH);\r\n\r\n return authenticationService.isAuthenticated().pipe(map((authenticated) => {\r\n if (authenticated) {\r\n return true;\r\n }\r\n else {\r\n // Store the attempted URL for redirecting\r\n authenticationService.redirectUrl = state.url;\r\n \r\n if (authenticationLoginPath) {\r\n //Try to get an access token\r\n authenticationService.requestAccessToken(true, true);\r\n }\r\n else {\r\n // Navigate to the login page\r\n return router.createUrlTree([authenticationRoute]);\r\n }\r\n }\r\n }));\r\n};\r\n\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i4","i1.AuthenticationService","i2","i3","i1"],"mappings":"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"}
1
+ {"version":3,"file":"huntsman-cancer-institute-authentication.mjs","sources":["../../../projects/authentication/src/authentication.provider.ts","../../../projects/authentication/src/authentication.service.ts","../../../projects/authentication/src/authentication.component.ts","../../../projects/authentication/src/directlogin.component.ts","../../../projects/authentication/src/timeout-notification.component.ts","../../../projects/authentication/src/authorization.interceptor.ts","../../../projects/authentication/src/authentication.module.ts","../../../projects/authentication/src/route-guard.service.ts","../../../projects/authentication/src/huntsman-cancer-institute-authentication.ts"],"sourcesContent":["import {Inject, Injectable, InjectionToken, Injector} from \"@angular/core\";\r\n\r\nimport {Subject} from \"rxjs\";\r\n\r\nimport {CoolLocalStorage} from '@angular-cool/storage';\r\n\r\nexport let AUTHENTICATION_TOKEN_KEY = new InjectionToken<string>(\"authentication_token_key\");\r\n\r\n@Injectable()\r\nexport class AuthenticationProvider {\r\n\r\n public whitelistedDomains = [\r\n \"localhost\",\r\n new RegExp(\".*[.]utah[.]edu\")\r\n ];\r\n\r\n constructor(private _localStorageService: CoolLocalStorage,\r\n @Inject(AUTHENTICATION_TOKEN_KEY) private _authenticationTokenKey: string) {}\r\n\r\n public tokenGetter = () => {\r\n return this.authToken;\r\n }\r\n\r\n get authenticationTokenKey(): string {\r\n return this._authenticationTokenKey;\r\n }\r\n\r\n set authenticationTokenKey(_authenticationTokenKey: string) {\r\n this._authenticationTokenKey = _authenticationTokenKey;\r\n }\r\n\r\n get authToken(): string {\r\n return <string>this._localStorageService.getItem(this._authenticationTokenKey);\r\n }\r\n\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {Injectable, InjectionToken, Inject, Optional, isDevMode} from \"@angular/core\";\r\nimport {LocationStrategy} from \"@angular/common\";\r\nimport {Router} from \"@angular/router\";\r\nimport {HttpClient, HttpHeaders, HttpRequest, HttpResponse} from \"@angular/common/http\";\r\n\r\nimport {interval, Observable, BehaviorSubject, Subscription, throwError, of} from \"rxjs\";\r\nimport {catchError, first, map} from \"rxjs/operators\";\r\nimport {JwtHelperService} from \"@auth0/angular-jwt\";\r\n\r\nimport {AuthenticationProvider} from \"./authentication.provider\";\r\nimport { CoolLocalStorage } from \"@angular-cool/storage\";\r\n\r\n/**\r\n * The token used for injection of the server side endpoint for the currently authenticated subject.\r\n *\r\n * @type {InjectionToken}\r\n */\r\nexport let AUTHENTICATION_SERVER_URL = new InjectionToken<string>(\"authentication_server_rest_api\");\r\nexport let AUTHENTICATION_LOGIN_PATH = new InjectionToken<string>(\"authentication_login_path\");\r\nexport let AUTHENTICATION_LOGOUT_PATH = new InjectionToken<string>(\"authentication_logout_path\");\r\nexport let AUTHENTICATION_DIRECT_ENDPOINT = new InjectionToken<string>(\"authentication_direct_endpoint\");\r\nexport let AUTHENTICATION_TOKEN_ENDPOINT = new InjectionToken<string>(\"authentication_token_endpoint\");\r\nexport let AUTHENTICATION_ROUTE = new InjectionToken<string>(\"authentication_route\");\r\nexport let AUTHENTICATION_MAX_INACTIVITY_MINUTES = new InjectionToken<number>(\"authentication_max_inactivity\");\r\nexport let AUTHENTICATION_USER_COUNTDOWN_SECONDS = new InjectionToken<number>(\"authentication_user_countdown_seconds\");\r\nexport let AUTHENTICATION_IDP_INACTIVITY_MINUTES = new InjectionToken<number>(\"authentication_idp_inactivity_minutes\");\r\n\r\n/**\r\n * @since 1.0.0\r\n */\r\n@Injectable()\r\nexport class AuthenticationService {\r\n\r\n /**\r\n * The generic error message used when a server error is thrown without a status.\r\n *\r\n * @type {string}\r\n */\r\n public static GENERIC_ERR_MSG: string = \"Server error\";\r\n\r\n private static CONTENT_TYPE: string = \"Content-Type\";\r\n private static SEC_GOV_CLASS_HEADER: string = \"SecurityGovernorClass\";\r\n private static SEC_GOV_ID_HEADER: string = \"SecurityGovernorId\";\r\n private static DEIDENT_HEADER: string = \"DeidentifiedContext\";\r\n private static LIMITED_HEADER: string = \"LimitedContext\";\r\n\r\n public userCountdownSeconds: number = 60;\r\n public idpInactivityMinutes: number = 5;\r\n\r\n public contentType: string = \"application/json\";\r\n public securityGovernorClass: string;\r\n public securityGovernorId: number;\r\n public limitedContext: boolean = false;\r\n public deidentifiedContext: boolean = false;\r\n\r\n private maxViewPermission: BehaviorSubject<\"view\" | \"viewident\" | \"viewlimited\"> = new BehaviorSubject<\"view\" | \"viewident\" | \"viewlimited\">(\"viewident\");\r\n private _isAuthenticatedSubject: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);\r\n private _userIsAboutToTimeOut: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);\r\n private _redirectUrl: string;\r\n private _refreshSubscription: Subscription;\r\n private _lastUserInteraction: Date;\r\n private _maxInactivityMinutes: number = 120;\r\n\r\n private baseUrl: string;\r\n private contextRoot: string = \"\";\r\n\r\n constructor(private _http: HttpClient,\r\n private _router: Router,\r\n private _localStorageService: CoolLocalStorage,\r\n private _jwtHelper: JwtHelperService,\r\n private authenticationProvider: AuthenticationProvider,\r\n @Inject(AUTHENTICATION_LOGOUT_PATH) private _logoutPath: string,\r\n @Inject(AUTHENTICATION_TOKEN_ENDPOINT) private _tokenEndpoint: string,\r\n @Optional() @Inject(AUTHENTICATION_LOGIN_PATH) private _loginPath: string,\r\n @Optional() @Inject(AUTHENTICATION_ROUTE) private _authenticationRoute: string,\r\n @Optional() @Inject(AUTHENTICATION_SERVER_URL) private _serverUrl: string,\r\n @Optional() @Inject(AUTHENTICATION_DIRECT_ENDPOINT) private _directEndpoint: string,\r\n @Optional() @Inject(AUTHENTICATION_MAX_INACTIVITY_MINUTES) private _maxInactivity: number,\r\n @Optional() @Inject(AUTHENTICATION_USER_COUNTDOWN_SECONDS) private _userCountdownSeconds: number,\r\n @Optional() @Inject(AUTHENTICATION_IDP_INACTIVITY_MINUTES) private _idpInactivityMinutes: number,\r\n @Optional() @Inject(LocationStrategy) private locationStrategy: LocationStrategy) {\r\n if (isDevMode()) {\r\n console.debug(\"window.location.href: \" + window.location.href);\r\n }\r\n\r\n if (window.location) {\r\n let parts: string[] = window.location.href.split(\"/\");\r\n this.baseUrl = parts[0] + \"//\" + parts[2];\r\n if (parts.length > 3) {\r\n this.contextRoot = parts[3];\r\n }\r\n }\r\n\r\n if (this._localStorageService.getItem(\"maxViewPermission\")) {\r\n this.maxViewPermission.next(<\"view\" | \"viewident\" | \"viewlimited\">this._localStorageService.getItem(\"maxViewPermission\"));\r\n }\r\n\r\n if (_maxInactivity) {\r\n this._maxInactivityMinutes = _maxInactivity;\r\n }\r\n\r\n if (_userCountdownSeconds) {\r\n this.userCountdownSeconds = _userCountdownSeconds;\r\n }\r\n\r\n if (_idpInactivityMinutes) {\r\n this.idpInactivityMinutes = _idpInactivityMinutes;\r\n }\r\n\r\n this.hasValidConfig();\r\n }\r\n\r\n getBaseUrl(): string {\r\n return (this.baseUrl) ? this.baseUrl : \"\";\r\n }\r\n\r\n getContextRoot(): string {\r\n return this.contextRoot;\r\n }\r\n\r\n getHeaders(req: HttpRequest<any>): HttpHeaders {\r\n let headers: HttpHeaders = req.headers;\r\n\r\n //Don't set content type if already set\r\n if (!req.headers.get(AuthenticationService.CONTENT_TYPE)) {\r\n headers = headers.set(AuthenticationService.CONTENT_TYPE, this.contentType.toString());\r\n }\r\n\r\n if (headers.get(AuthenticationService.SEC_GOV_CLASS_HEADER) === \"\") {\r\n headers = headers.delete(AuthenticationService.SEC_GOV_CLASS_HEADER);\r\n } else if (this.securityGovernorClass && !headers.get(AuthenticationService.SEC_GOV_CLASS_HEADER)) {\r\n headers = headers.set(AuthenticationService.SEC_GOV_CLASS_HEADER, this.securityGovernorClass);\r\n }\r\n\r\n if (headers.get(AuthenticationService.SEC_GOV_ID_HEADER) === \"\") {\r\n headers = headers.delete(AuthenticationService.SEC_GOV_ID_HEADER);\r\n } else if (this.securityGovernorId && !headers.get(AuthenticationService.SEC_GOV_ID_HEADER)) {\r\n headers = headers.set(AuthenticationService.SEC_GOV_ID_HEADER, this.securityGovernorId.toString());\r\n }\r\n\r\n headers = headers.set(AuthenticationService.DEIDENT_HEADER, this.deidentifiedContext.toString());\r\n headers = headers.set(AuthenticationService.LIMITED_HEADER, this.limitedContext.toString());\r\n\r\n return headers;\r\n }\r\n\r\n get authenticationTokenKey(): string {\r\n return this.authenticationProvider.authenticationTokenKey;\r\n }\r\n\r\n get authToken(): string {\r\n return this.authenticationProvider.authToken;\r\n }\r\n\r\n public updateUserActivity(): void {\r\n if (this._isAuthenticatedSubject.value) {\r\n this._lastUserInteraction = new Date();\r\n this._userIsAboutToTimeOut.next(false);\r\n }\r\n }\r\n\r\n /**\r\n * A mutator for identifying the clients original request location. Setting this value will influence the end location\r\n * navigated to by {@link #navigateToPath}.\r\n *\r\n * @param redirectUrl location of the users request before authentication\r\n */\r\n set redirectUrl(redirectUrl: string) {\r\n this._redirectUrl = redirectUrl;\r\n }\r\n\r\n get redirectUrl() {\r\n return this._redirectUrl;\r\n }\r\n \r\n \r\n isRedirectBasedLogin(): boolean {\r\n if (this._loginPath) {\r\n return true;\r\n }\r\n else {\r\n return false;\r\n }\r\n }\r\n \r\n \r\n initiateLogin() {\r\n if (isDevMode()) {\r\n console.debug(\"Authentication Service: Initiate Login\");\r\n }\r\n \r\n //Redirect based authentication\r\n window.location.href = this.getBaseUrl() + (this._loginPath.startsWith(\"/\")?\"\":\"/\") + this._loginPath;\r\n }\r\n\r\n requestAccessToken(fromRouteGuard: boolean, redirectOnSuccess: boolean): void {\r\n \r\n if (isDevMode()) {\r\n console.debug(\"Authentication Service: Request Acces Token\");\r\n }\r\n\r\n this._http.get(this.tokenLocation(), {withCredentials: true, responseType: \"json\"})\r\n .subscribe(\r\n (response: any) => {\r\n this.storeToken(response.auth_token);\r\n if (redirectOnSuccess) {\r\n this.proceedIfAuthenticated();\r\n }\r\n },\r\n (error) => {\r\n //Not logged in - start authentication\r\n if (fromRouteGuard) {\r\n this.initiateLogin();\r\n }\r\n //Background token request failed - logout and clear\r\n else {\r\n if (isDevMode()) {\r\n console.error(\"Authentication Service: Request Acces Token - Logout\");\r\n }\r\n \r\n this.logout(true);\r\n }\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Verifies whether or not a current user session exists.\r\n *\r\n * @returns {Observable<boolean>} evaluates to true if the user is authenticated, false otherwise.\r\n */\r\n isAuthenticated(): Observable<boolean> {\r\n return this._isAuthenticatedSubject.asObservable();\r\n }\r\n\r\n isAboutToTimeOut(): Observable<boolean> {\r\n return this._userIsAboutToTimeOut.asObservable();\r\n }\r\n\r\n getTimeoutStart(): number {\r\n if (this._lastUserInteraction) {\r\n return this._lastUserInteraction.valueOf() + (((this._maxInactivityMinutes * 60) - this.userCountdownSeconds) * 1000);\r\n }\r\n }\r\n\r\n tokenLocation(): string {\r\n if (this._serverUrl) {\r\n return this._serverUrl + this._tokenEndpoint;\r\n } else {\r\n return this._tokenEndpoint;\r\n }\r\n }\r\n\r\n directLoginLocation(): string {\r\n if (this._serverUrl) {\r\n return this._serverUrl + this._directEndpoint;\r\n } else {\r\n return this._directEndpoint;\r\n }\r\n }\r\n\r\n logoutLocation(): string {\r\n if (this._serverUrl) {\r\n return this._serverUrl + this._logoutPath;\r\n } else {\r\n return this._logoutPath;\r\n }\r\n }\r\n\r\n /**\r\n * A function to authenticated the user with the provided credentials. Failure results in an error that describes the\r\n * server response (status and status message) and should be actionable by the client application.\r\n *\r\n * @param username of the authenticating user to verify\r\n * @param password of the authenticating user to verify\r\n * @returns {Observable<R>} describing the result of the login action, true or an error\r\n */\r\n login(_username: string, _password: string): Observable<boolean> {\r\n return this._http.post(\r\n this.directLoginLocation(),\r\n {username: _username, password: _password},\r\n {observe: \"response\"}\r\n ).pipe(map((resp: HttpResponse<any>) => {\r\n if (resp.status === 201) {\r\n return true;\r\n } else {\r\n throw new Error(\"Authentication failed. \" + resp.status + \": \" + resp.statusText);\r\n }\r\n }),\r\n catchError(this.handleError)) as Observable<boolean>;\r\n }\r\n\r\n\r\n clearLogin(): Observable<string> {\r\n //Front-end logout\r\n try {\r\n this._localStorageService.removeItem(this.authenticationProvider.authenticationTokenKey);\r\n this.unsubscribeFromTokenRefresh();\r\n this._isAuthenticatedSubject.next(false);\r\n this._userIsAboutToTimeOut.next(false);\r\n } catch (Error) {\r\n }\r\n\r\n //Back-end logout\r\n let headers = new HttpHeaders().set(AuthenticationService.CONTENT_TYPE, \"text/plain\");\r\n return <Observable<string>>this._http.get(this.logoutLocation(), {headers: headers, responseType: \"text\"});\r\n }\r\n\r\n /**\r\n * A function to signal the termination of the current session. Invoking this function will clean up any relevant state\r\n * related to the last active session.\r\n */\r\n logout(keepCurrentRoute: boolean = false): void {\r\n //Prevent logout if already on authentication route. Doing otherwise screws up SAML\r\n if (! this._router.routerState || this._router.routerState.snapshot.url !== this._authenticationRoute) {\r\n this._redirectUrl = (keepCurrentRoute && this._router.routerState && this._router.routerState.snapshot) ? this._router.routerState.snapshot.url : \"\";\r\n\r\n if (this._redirectUrl.startsWith(\"/\")) {\r\n this._redirectUrl = this._redirectUrl.substring(1);\r\n }\r\n\r\n this.clearLogin().subscribe(\r\n (response) => {\r\n window.location.replace(this._redirectUrl);\r\n },\r\n (error) => {\r\n window.location.replace(this._redirectUrl);\r\n }\r\n );\r\n }\r\n }\r\n\r\n storeToken(token: string): void {\r\n let valid = this.validateToken(token);\r\n\r\n // unsubscribe from refesh before we decide wether to resubscribe\r\n this.unsubscribeFromTokenRefresh();\r\n\r\n if (valid) {\r\n this._localStorageService.setItem(this.authenticationProvider.authenticationTokenKey, token);\r\n this.subscribeToTokenRefresh(token);\r\n\r\n //Change the BehaviorSubject if the user was not previously authenticated.\r\n //Since other code may be subscribing to this observable, we don't want to cause new events to fire if just refreshing the JWT.\r\n if (! this._isAuthenticatedSubject.value) {\r\n this._isAuthenticatedSubject.next(true);\r\n }\r\n } else {\r\n this._localStorageService.removeItem(this.authenticationProvider.authenticationTokenKey);\r\n this._isAuthenticatedSubject.next(false);\r\n }\r\n }\r\n\r\n proceedIfAuthenticated(): boolean {\r\n if (isDevMode()) {\r\n console.debug(\"AuthenticationService.proceedIfAuthenticated: \" + this._redirectUrl);\r\n }\r\n\r\n if (this._isAuthenticatedSubject.value) {\r\n //Login counts as user activity, too\r\n this.updateUserActivity();\r\n\r\n if (this._redirectUrl && this._redirectUrl && this._redirectUrl !== \"\") {\r\n this._router.navigateByUrl(this._redirectUrl);\r\n } else {\r\n this._router.navigate([\"\"]);\r\n }\r\n\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n validateToken(token: string): boolean {\r\n return (token && !this._jwtHelper.isTokenExpired(token));\r\n }\r\n\r\n subscribeToTokenRefresh(token: any): void {\r\n let exp = this._jwtHelper.getTokenExpirationDate(token);\r\n\r\n // Use a timer to periodically check timeouts\r\n this._refreshSubscription = interval(1000)\r\n .subscribe(() => {\r\n\r\n // If a tab is inactive we can't know if our timer is accurate\r\n // so when the interval hits check against timestamps\r\n if (this._isAuthenticatedSubject.value && Date.now() > this.getTimeoutStart()) {\r\n //Don't update the subject more than once! Doing so initializes more than one countdown timer!\r\n if (this._userIsAboutToTimeOut.getValue() !== true) {\r\n this._userIsAboutToTimeOut.next(true);\r\n }\r\n }\r\n\r\n // check for refresh token\r\n let msToExpiry = (exp.valueOf() - new Date().valueOf());\r\n\r\n // Refresh 60 seconds before expiry\r\n if (msToExpiry <= 60000) {\r\n this.refreshTokenIfUserIsActive();\r\n }\r\n });\r\n }\r\n\r\n unsubscribeFromTokenRefresh(): void {\r\n if (this._refreshSubscription && ! this._refreshSubscription.closed) {\r\n this._refreshSubscription.unsubscribe();\r\n }\r\n }\r\n\r\n getMaxViewPermission(): \"view\" | \"viewident\" | \"viewlimited\" {\r\n return this.maxViewPermission.getValue();\r\n }\r\n\r\n getMaxViewPermissionSubject(): BehaviorSubject<\"view\" | \"viewident\" | \"viewlimited\"> {\r\n return this.maxViewPermission;\r\n }\r\n\r\n setMaxViewPermission(maxViewPermission: \"view\" | \"viewident\" | \"viewlimited\"): void {\r\n this._localStorageService.setItem(\"maxViewPermission\", maxViewPermission);\r\n this.maxViewPermission.next(maxViewPermission);\r\n }\r\n\r\n private refreshTokenIfUserIsActive(): void {\r\n //Only refresh if the user has been active\r\n if (this._lastUserInteraction && ((new Date().valueOf() - this._lastUserInteraction.valueOf()) <= (this._maxInactivityMinutes * 60 * 1000))) {\r\n this.requestAccessToken(false, false);\r\n }\r\n }\r\n\r\n private hasValidConfig(): void {\r\n if (this._tokenEndpoint == null && (this._serverUrl === null || this._logoutPath === null)) {\r\n throw new Error(\"BUG ALERT! Invalid AuthenticationService configuration. No valid configuration for authentication endpoint(s).\");\r\n }\r\n if (this._localStorageService === null || this.authenticationProvider.authenticationTokenKey === null) {\r\n throw new Error(\"BUG ALERT! Invalid AuthenticationService configuration. No valid configuration for local storage\");\r\n }\r\n }\r\n\r\n private handleError(error: any) : Observable<never> {\r\n let errMsg = (error.message) ? error.message : AuthenticationService.GENERIC_ERR_MSG;\r\n return throwError(errMsg);\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {Component, ElementRef, ViewChild, Inject, Renderer2} from \"@angular/core\";\r\nimport {Location, PopStateEvent} from \"@angular/common\";\r\nimport {Router} from \"@angular/router\";\r\nimport {DomSanitizer} from \"@angular/platform-browser\";\r\n\r\nimport {interval, Subscription} from \"rxjs\";\r\nimport {first} from \"rxjs/operators\";\r\n\r\nimport {AuthenticationService, AUTHENTICATION_ROUTE} from \"./authentication.service\";\r\n\r\n@Component({\r\n selector: \"authentication-iframe\",\r\n template: `\r\n <div class=\"container\">\r\n <iframe #iframe class=\"frame\" [src]=\"url\" (load)=\"handleChanges()\"></iframe>\r\n <div *ngIf=\"_errorMsg\" class=\"alert-box\">\r\n <div class=\"alert alert-danger\">\r\n <h5 class=\"alert-heading\">Authentication Failed</h5>\r\n <span id=\"hci-login-error\" class=\"alert-text\">{{_errorMsg}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n \r\n :host {\r\n background-color: white;\r\n }\r\n \r\n .container {\r\n max-width: 100%;\r\n margin-top: 60px;\r\n padding-top: 15px;\r\n }\r\n\r\n .frame {\r\n width: 100%;\r\n height: 100%;\r\n border: 0px;\r\n }\r\n `],\r\n host: {class: \"outlet-row\"}\r\n})\r\nexport class AuthenticationComponent {\r\n\r\n public url;\r\n public _errorMsg: string;\r\n\r\n @ViewChild(\"iframe\", {static: true}) iframe : ElementRef;\r\n\r\n private resetSubscription: Subscription;\r\n private popstateSubscription: Subscription;\r\n\r\n constructor(private authenticationService: AuthenticationService,\r\n private domSanitizer : DomSanitizer,\r\n private router: Router,\r\n private location: Location,\r\n private renderer: Renderer2,\r\n @Inject(AUTHENTICATION_ROUTE) private authenticationRoute: string) {\r\n }\r\n\r\n ngOnInit() {\r\n /*\r\n * Fix back bug\r\n * Issue is that the browser will go back to the previous route. If it's guarded, the route guard will just load the login again\r\n * Eventually the browser gets to the /authenticate route and going back from there loads the iframe history and Shibboleth displays\r\n * an error relating to navigating back.\r\n */\r\n history.pushState(null, null, this.location.prepareExternalUrl(this.authenticationRoute));\r\n\r\n this.popstateSubscription = <Subscription> this.location.subscribe((value: PopStateEvent) => {\r\n //This is going to prevent back from working from the login component\r\n history.go(1);\r\n });\r\n\r\n this.beginAuthenticationProcess();\r\n }\r\n\r\n handleChanges(): void {\r\n if (!this.iframe.nativeElement.contentDocument) {\r\n return;\r\n }\r\n\r\n try {\r\n let element: HTMLElement = this.iframe.nativeElement.contentDocument.body;\r\n if (element.querySelector(\"pre\")) {\r\n element = element.querySelector(\"pre\");\r\n }\r\n\r\n this._errorMsg = null;\r\n var jsonText = element.innerText;\r\n\r\n var json = JSON.parse(jsonText);\r\n this.authenticationService.storeToken(json.auth_token);\r\n var authenticated = this.authenticationService.proceedIfAuthenticated();\r\n\r\n if (!authenticated) {\r\n this.resetSubscription.unsubscribe();\r\n this.beginAuthenticationProcess();\r\n }\r\n } catch (error) {\r\n if (this.iframe.nativeElement.contentDocument.title.toUpperCase() === \"ERROR\") {\r\n if (this.iframe.nativeElement.contentDocument.body.innerHTML.toUpperCase() === \"FORBIDDEN\") {\r\n this._errorMsg = \"You do not have permission to log into this application\";\r\n } else {\r\n this._errorMsg = null;\r\n }\r\n\r\n //A bit of a workaround for a WildFly issue. Success on Pac4j authentication, but failure on DB load of user put things in a weird state. Just logout, and redo the login.\r\n this.clearLoginAndRetry();\r\n }\r\n }\r\n\r\n // After the iframe loads, make the background transparent so we use the implementation's background and not the sso background.\r\n this.renderer.setStyle(this.iframe.nativeElement.contentDocument.body, \"background-color\", \"transparent\");\r\n }\r\n\r\n ngOnDestroy() {\r\n this.resetSubscription.unsubscribe();\r\n this.popstateSubscription.unsubscribe();\r\n }\r\n\r\n private clearLoginAndRetry(): void {\r\n this.resetSubscription.unsubscribe();\r\n this.authenticationService.clearLogin().subscribe(\r\n () => { this.beginAuthenticationProcess(); },\r\n (error) => { this.beginAuthenticationProcess(); }\r\n );\r\n }\r\n\r\n private beginAuthenticationProcess(): void {\r\n var tokenEndpoint = this.authenticationService.tokenLocation();\r\n \r\n if (tokenEndpoint !== \"\") {\r\n this.url = this.domSanitizer.bypassSecurityTrustResourceUrl(tokenEndpoint);\r\n }\r\n\r\n /**\r\n * If the user doesn't complete authentication before the IdP session times out, that will be a problem when they eventually\r\n * attampt to log in. It is likely that users will do this often when they log out or are timed out in the evening, leave\r\n * their browser open, then attempt to log back in in the morning. In order to work around this, this component will re-request\r\n * the token prior to IdP timeout, which will reset the process. This will happen 1 minute before idpInactivityMinutes\r\n **/\r\n this.resetSubscription = interval((this.authenticationService.idpInactivityMinutes - 1) * 60 * 1000)\r\n .pipe(first())\r\n .subscribe((value) => {\r\n this.beginAuthenticationProcess();\r\n });\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {Component, OnInit} from \"@angular/core\";\r\nimport {AuthenticationService} from \"./authentication.service\";\r\nimport {UntypedFormBuilder, UntypedFormGroup, Validators} from \"@angular/forms\";\r\n\r\n@Component({\r\n selector: \"hci-login-form\",\r\n template: `\r\n <div class=\"container\">\r\n <div class=\"login-box\" id=\"hci-login-form-box\">\r\n <div class=\"login-heading\" id=\"hci-login-form-heading\">\r\n <h3>Sign in</h3>\r\n </div>\r\n <div class=\"panel-body\">\r\n <form [formGroup]=\"_loginForm\" (ngSubmit)=\"login()\">\r\n <input formControlName=\"username\" class=\"form-control\" id=\"username\" name=\"username\" placeholder=\"Username\" type=\"text\">\r\n <input formControlName=\"password\" class=\"form-control\" id=\"password\" name=\"password\" type=\"password\" placeholder=\"Password\">\r\n \r\n <div *ngIf=\"_errorMsg\" class=\"alert-box\">\r\n <div class=\"alert alert-danger\">\r\n <h5 class=\"alert-heading\">Authentication Failed</h5>\r\n <span id=\"hci-login-error\" class=\"alert-text\">{{_errorMsg}}</span>\r\n </div>\r\n </div>\r\n \r\n <div class=\"btn-box\">\r\n <button class=\"btn btn-primary\" id=\"hci-login-form-submit-button\" type=\"submit\" [disabled]=\"!_loginForm.valid\">Login</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n .container {\r\n max-width: 400px;\r\n margin-top: 20px;\r\n padding-top: 15px;\r\n }\r\n \r\n .login-box {\r\n border-radius: 10px;\r\n box-shadow: 0 0 2px #ccc;\r\n padding: 15px;\r\n }\r\n \r\n .login-box .login-heading h3 {\r\n line-height:1.5;\r\n margin: 0 0 10px\r\n }\r\n \r\n .login-box .form-control {\r\n padding: 10px;\r\n border: 1px solid #ccc;\r\n }\r\n \r\n .login-box input[type=\"password\"] {\r\n margin-bottom: 10px;\r\n border-top-left-radius: 0;\r\n border-top-right-radius: 0;\r\n }\r\n \r\n .login-box input[type=\"text\"] {\r\n margin-bottom: -1px;\r\n border-bottom-right-radius: 0;\r\n border-bottom-left-radius: 0;\r\n }\r\n \r\n .login-box .alert-box {\r\n margin: 10px 0 -5px 0\r\n }\r\n \r\n .login-box .alert-text {\r\n font-size: small;\r\n }\r\n \r\n .login-box .btn-box {\r\n margin: 10px 0 0px 0\r\n }\r\n `]\r\n})\r\nexport class DirectLoginComponent implements OnInit {\r\n public _loginForm: UntypedFormGroup;\r\n public _errorMsg: string;\r\n\r\n constructor(private _authenticationService: AuthenticationService, private _formBuilder: UntypedFormBuilder) {}\r\n\r\n /**\r\n * Initializes the authentication form.\r\n */\r\n ngOnInit(): void {\r\n this._loginForm = this._formBuilder.group({\r\n username: [\"\", Validators.required],\r\n password: [\"\", Validators.required]\r\n });\r\n }\r\n\r\n /**\r\n * A function to submit the login form the the {@link UserService}.\r\n */\r\n login() {\r\n this._authenticationService.login(this._loginForm.value.username, this._loginForm.value.password)\r\n .subscribe((res) => {\r\n if (res) {\r\n this._errorMsg = null;\r\n this._authenticationService.requestAccessToken(false, true);\r\n }\r\n }, (error: any) => {\r\n this._errorMsg = \"Please check your username and password.\";\r\n });\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {Component} from \"@angular/core\";\r\nimport {animate, state, style, transition, trigger} from \"@angular/animations\";\r\n\r\nimport {Observable, Subscription, timer} from \"rxjs\";\r\nimport {map, takeWhile} from \"rxjs/operators\";\r\n\r\nimport {AuthenticationService} from \"./authentication.service\";\r\n\r\n@Component({\r\n selector: \"timeout-notification\",\r\n template: `\r\n <div class=\"flyout-max\" [@openBacksplash]=\"openState\">\r\n <div class=\"modal-dialog\" [@openModal]=\"openState\" role=\"document\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">Your Session Is About To Expire</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <p>For your security, your session is about to automatically time out in the next <b>{{seconds | async}}</b> seconds. Would you like to stay signed in?</p>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <ng-container>\r\n <button id=\"updateBtn\" type=\"button\" class=\"btn btn-secondary\" (click)=\"click()\">Yes, Keep me signed in</button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n animations: [\r\n trigger(\"openBacksplash\",\r\n [\r\n state(\"in\", style({\r\n \"display\": \"none\"\r\n })),\r\n state(\"hidden\", style({\r\n \"display\": \"none\"\r\n })),\r\n state(\"opened\", style({\r\n \"display\": \"inherit\"\r\n })),\r\n transition(\"hidden => opened\", animate(100)),\r\n transition(\"opened => hidden\", animate(200))\r\n ]\r\n ),\r\n trigger(\"openModal\",\r\n [\r\n state(\"in\", style({\r\n \"opacity\": \"0\",\r\n \"left\": \"-50vw\"\r\n })),\r\n state(\"hidden\", style({\r\n \"opacity\": \"0\",\r\n \"left\": \"-50vw\"\r\n })),\r\n state(\"opened\", style({\r\n \"opacity\": \"1\",\r\n \"left\": \"25vw\"\r\n })),\r\n transition(\"hidden => opened\", animate(500)),\r\n transition(\"opened => hidden\", animate(300))\r\n ]\r\n )\r\n ],\r\n styles: [`\r\n\r\n .flyout-max {\r\n position: fixed;\r\n z-index: 9999;\r\n top: 0;\r\n bottom: 0;\r\n background-color: rgba(0, 0, 0, 0.4);\r\n width: 100vw;\r\n }\r\n \r\n .modal-dialog {\r\n position: fixed;\r\n max-width: 50vw;\r\n min-width: 50vw;\r\n left: -50vw;\r\n top: 25vw;\r\n margin: 0;\r\n background-color: white;\r\n border: black 1px solid;\r\n border-left: none;\r\n border-top-right-radius: 20px;\r\n border-bottom-right-radius: 20px;\r\n border-top-left-radius: 20px;\r\n border-bottom-left-radius: 20px;\r\n pointer-events: all;\r\n }\r\n \r\n .modal-body {\r\n width: 100%;\r\n display: inline-block;\r\n }\r\n \r\n .modal-body-left {\r\n display: inline-block;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n min-height: 300px;\r\n max-height: 300px;\r\n }\r\n \r\n .modal-body-right {\r\n width: 70%;\r\n vertical-align: top;\r\n padding-left: 15px;\r\n border-left: black 1px solid;\r\n margin-left: 15px;\r\n display: inline-block;\r\n overflow-y: auto;\r\n min-height: 300px;\r\n max-height: 300px;\r\n }\r\n `]\r\n})\r\nexport class TimeoutNotificationComponent {\r\n public seconds: Observable<number>;\r\n public openState: string = \"hidden\";\r\n\r\n private subscription: Subscription;\r\n\r\n constructor(private authenticationService: AuthenticationService) {\r\n authenticationService.isAboutToTimeOut().subscribe((isAboutToTimeOut) => {\r\n\r\n if (isAboutToTimeOut) {\r\n this.openState = \"opened\";\r\n this.startCountdown();\r\n } else {\r\n this.openState = \"hidden\";\r\n //If something changed mid-timeout, cancel the timeout/logout.\r\n if (this.subscription != null && !this.subscription.closed) {\r\n this.subscription.unsubscribe();\r\n }\r\n }\r\n });\r\n }\r\n\r\n startCountdown(): void {\r\n this.seconds = timer(0, 1000)\r\n .pipe(\r\n map(() => {\r\n const elapsed: number = Math.round((Date.now() - this.authenticationService.getTimeoutStart()) / 1000);\r\n return this.authenticationService.userCountdownSeconds - elapsed;\r\n }),\r\n // The true argument emits the final value that completed the observable\r\n takeWhile((value) => value > 0, true),\r\n );\r\n\r\n this.subscription = this.seconds.subscribe((value) => {\r\n if (value < 1) {\r\n this.subscription.unsubscribe();\r\n this.authenticationService.logout(true);\r\n }\r\n });\r\n }\r\n\r\n click(): void {\r\n this.subscription.unsubscribe();\r\n this.authenticationService.updateUserActivity();\r\n }\r\n}\r\n","import {Injectable, Injector, isDevMode} from \"@angular/core\";\r\nimport {HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpHeaders, HttpParams, HttpErrorResponse} from \"@angular/common/http\";\r\n\r\nimport {Observable, throwError} from \"rxjs\";\r\nimport {catchError, map} from \"rxjs/operators\";\r\n\r\nimport {AuthenticationService} from \"./authentication.service\";\r\n\r\n@Injectable()\r\nexport class AuthorizationInterceptor implements HttpInterceptor {\r\n\r\n constructor(private injector: Injector) {}\r\n\r\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n if (isDevMode()) {\r\n console.debug(\"AuthorizationInterceptor.intercept\");\r\n }\r\n \r\n let authService: AuthenticationService = this.injector.get(AuthenticationService);\r\n \r\n //Don't want to include background token refreshes in considering the user 'active'\r\n if (req.url !== authService.tokenLocation()) {\r\n //Update user activity. Done here instead of the previous method using a subscription to a subject in AuthenticationProvider\r\n authService.updateUserActivity();\r\n }\r\n \r\n let headers: HttpHeaders = authService.getHeaders(req);\r\n let url: string = req.url;\r\n if (url.startsWith(\"/\")) {\r\n url = authService.getBaseUrl() + url;\r\n } else if (!url.startsWith(\"http\")) {\r\n if (authService.getContextRoot().length > 0) {\r\n url = authService.getBaseUrl() + \"/\" + authService.getContextRoot() + \"/\" + url;\r\n } else {\r\n url = authService.getBaseUrl() + \"/\" + url;\r\n }\r\n }\r\n\r\n let params: HttpParams = req.params;\r\n if (url.indexOf(\"/crud/\") > 0) {\r\n params = params.set(\"maxViewPermission\", authService.getMaxViewPermission());\r\n }\r\n\r\n let reqClone = req.clone({\r\n url: url,\r\n withCredentials: true,\r\n headers: headers,\r\n params: params\r\n });\r\n\r\n return next.handle(reqClone)\r\n .pipe(catchError((error: HttpErrorResponse) => {\r\n if (isDevMode()) {\r\n console.debug(\"AuthorizationInterceptor.error\");\r\n }\r\n\r\n /**\r\n * If the token is not authenticated which angular does not know about, then a REST request to the backend will\r\n * return a 401. To duplicate this, open Core in two tabs. In one tab, logout, in the other, perform a request\r\n * that hits a protected resource.\r\n */\r\n if (error && error.status === 401) {\r\n authService.isAuthenticated().pipe(map((authenticated) => {\r\n if (authenticated) {\r\n // If the user was previously authenticated, then logout which will redirect.\r\n authService.logout(true);\r\n return throwError(error.message);\r\n } else {\r\n //This happens for legitimate reasons. Attempting to get the JWT when not authenticated returns the login form, for example, which NG will see as an error\r\n return throwError(error);\r\n }\r\n }));\r\n }\r\n else if (error && error.status === 403) {\r\n // TODO: Trigger notification for unauthorized.\r\n }\r\n else {\r\n return throwError(error);\r\n }\r\n })) as Observable<HttpEvent<any>>;\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {ModuleWithProviders, NgModule, Optional, SkipSelf} from \"@angular/core\";\r\nimport {CommonModule} from \"@angular/common\";\r\nimport {ReactiveFormsModule, FormsModule} from \"@angular/forms\";\r\nimport {HTTP_INTERCEPTORS, HttpClientModule} from \"@angular/common/http\";\r\nimport {RouterModule} from \"@angular/router\";\r\n\r\nimport {CoolStorageModule} from \"@angular-cool/storage\";\r\nimport {JWT_OPTIONS, JwtHelperService, JwtInterceptor, JwtModule} from \"@auth0/angular-jwt\";\r\n\r\nimport {AuthenticationService} from \"./authentication.service\";\r\nimport {AuthenticationComponent} from \"./authentication.component\";\r\nimport {DirectLoginComponent} from \"./directlogin.component\";\r\nimport {TimeoutNotificationComponent} from \"./timeout-notification.component\";\r\nimport {AuthorizationInterceptor} from \"./authorization.interceptor\";\r\nimport {AuthenticationProvider} from \"./authentication.provider\";\r\n\r\n/**\r\n * Provide a single auth service and interceptor for the implementing application. Also provide everything\r\n * from the angular-jwt library.\r\n *\r\n * @since 1.0.0\r\n */\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n HttpClientModule,\r\n //JwtModule,\r\n RouterModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n CoolStorageModule\r\n ],\r\n declarations: [\r\n AuthenticationComponent,\r\n DirectLoginComponent,\r\n TimeoutNotificationComponent\r\n ],\r\n exports: [\r\n AuthenticationComponent,\r\n DirectLoginComponent,\r\n TimeoutNotificationComponent\r\n ]\r\n})\r\nexport class AuthenticationModule {\r\n constructor(@Optional() @SkipSelf() parentModule: JwtModule) {\r\n if (parentModule) {\r\n throw new Error(\"AuthenticationModule is already loaded.\");\r\n }\r\n }\r\n static forRoot(): ModuleWithProviders<AuthenticationModule> {\r\n return {\r\n providers: [\r\n AuthenticationProvider,\r\n JwtHelperService,\r\n AuthenticationService,\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: AuthorizationInterceptor,\r\n multi: true\r\n },\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: JwtInterceptor,\r\n multi: true\r\n },\r\n {\r\n provide: JWT_OPTIONS,\r\n useClass: AuthenticationProvider\r\n }\r\n ],\r\n ngModule: AuthenticationModule\r\n }\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {inject} from \"@angular/core\";\r\nimport {Router, ActivatedRouteSnapshot, RouterStateSnapshot} from \"@angular/router\";\r\n\r\nimport {Observable} from \"rxjs\";\r\nimport {map} from \"rxjs/operators\";\r\n\r\nimport {AuthenticationService, AUTHENTICATION_ROUTE} from \"./authentication.service\";\r\n\r\n\r\nexport const RouteGuardService = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\r\n const authenticationService = inject(AuthenticationService);\r\n const router = inject(Router);\r\n const authenticationRoute = inject(AUTHENTICATION_ROUTE);\r\n\r\n return authenticationService.isAuthenticated().pipe(map((authenticated) => {\r\n if (authenticated) {\r\n return true;\r\n }\r\n else {\r\n // Store the attempted URL for redirecting\r\n authenticationService.redirectUrl = state.url;\r\n \r\n //Redirect based login\r\n if (authenticationService.isRedirectBasedLogin()) {\r\n //Try to get an access token\r\n authenticationService.requestAccessToken(true, true);\r\n }\r\n //Authentication component based login\r\n else {\r\n // Navigate to the login page\r\n return router.createUrlTree([authenticationRoute]);\r\n }\r\n }\r\n }));\r\n};\r\n\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i4","i1.AuthenticationService","i2","i3","i1"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huntsman-cancer-institute/authentication",
3
- "version": "17.2.5",
3
+ "version": "17.2.6",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git@gitlab.com:huntsman-cancer-institute/risr/ng/hci-ng-lib.git"