@cleavelandprice/ngx-lib 3.5.2 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/active-directory/gui/components/user-chooser/user-chooser.component.d.ts +4 -4
  2. package/active-directory/gui/components/user-form-field/user-form-field.component.d.ts +2 -2
  3. package/active-directory/gui/gui.module.d.ts +11 -11
  4. package/authentication/token/gui/components/login/login.component.d.ts +2 -2
  5. package/authentication/token/gui/components/login-form/login-form.component.d.ts +2 -2
  6. package/dialog/components/base/base.component.d.ts +1 -1
  7. package/dialog/components/choice/choice.component.d.ts +2 -2
  8. package/dialog/components/confirmation/confirmation.component.d.ts +2 -2
  9. package/dialog/components/input/input.component.d.ts +2 -2
  10. package/dialog/components/message/message.component.d.ts +2 -2
  11. package/esm2020/active-directory/active-directory.module.mjs +5 -5
  12. package/esm2020/active-directory/gui/components/user-chooser/user-chooser.component.mjs +16 -16
  13. package/esm2020/active-directory/gui/components/user-form-field/user-form-field.component.mjs +11 -11
  14. package/esm2020/active-directory/gui/gui.module.mjs +15 -15
  15. package/esm2020/active-directory/services/active-directory.service.mjs +4 -4
  16. package/esm2020/authentication/authentication.base.module.mjs +5 -5
  17. package/esm2020/authentication/object/object.module.mjs +5 -5
  18. package/esm2020/authentication/object/services/authentication.service.mjs +4 -4
  19. package/esm2020/authentication/token/gui/components/login/login.component.mjs +6 -6
  20. package/esm2020/authentication/token/gui/components/login-form/login-form.component.mjs +12 -11
  21. package/esm2020/authentication/token/gui/services/authentication.service.mjs +4 -4
  22. package/esm2020/authentication/token/gui/token-gui.module.mjs +5 -5
  23. package/esm2020/authentication/token/services/authentication.service.mjs +4 -4
  24. package/esm2020/authentication/token/token.module.mjs +5 -5
  25. package/esm2020/dialog/components/base/base.component.mjs +4 -4
  26. package/esm2020/dialog/components/choice/choice.component.mjs +7 -7
  27. package/esm2020/dialog/components/confirmation/confirmation.component.mjs +7 -7
  28. package/esm2020/dialog/components/input/input.component.mjs +7 -7
  29. package/esm2020/dialog/components/message/message.component.mjs +7 -7
  30. package/esm2020/dialog/dialog.module.mjs +5 -5
  31. package/esm2020/lib/ngx-lib.module.mjs +5 -5
  32. package/esm2020/lib/services/app-path-config.service.mjs +4 -4
  33. package/esm2020/msgraph/msgraph.module.mjs +5 -5
  34. package/esm2020/quill/components/editor/editor.component.mjs +8 -8
  35. package/esm2020/quill/components/raw/raw.component.mjs +5 -5
  36. package/esm2020/quill/mention/components/editor/editor.component.mjs +8 -8
  37. package/esm2020/quill/mention/quill-mention.module.mjs +5 -5
  38. package/esm2020/quill/quill.module.mjs +5 -5
  39. package/esm2020/sharepoint/components/employee-photo/employee-photo.component.mjs +4 -4
  40. package/esm2020/sharepoint/pipes/employee-photo-url.pipe.mjs +4 -4
  41. package/esm2020/sharepoint/services/sharepoint.service.mjs +4 -4
  42. package/esm2020/sharepoint/sharepoint.module.mjs +5 -5
  43. package/esm2020/upload/components/upload/upload.component.mjs +6 -6
  44. package/esm2020/upload/components/upload-dialog/upload-dialog.component.mjs +8 -8
  45. package/esm2020/upload/services/upload.service.mjs +4 -4
  46. package/esm2020/upload/upload.module.mjs +5 -5
  47. package/esm2020/url-utilities/pipes/safe-resource-url.pipe.mjs +4 -4
  48. package/esm2020/url-utilities/pipes/safe-url.pipe.mjs +4 -4
  49. package/esm2020/url-utilities/pipes/uri-scheme.pipe.mjs +4 -4
  50. package/esm2020/url-utilities/url-utilities.module.mjs +5 -5
  51. package/fesm2015/cleavelandprice-ngx-lib-active-directory-gui.mjs +65 -64
  52. package/fesm2015/cleavelandprice-ngx-lib-active-directory-gui.mjs.map +1 -1
  53. package/fesm2015/cleavelandprice-ngx-lib-active-directory.mjs +8 -7
  54. package/fesm2015/cleavelandprice-ngx-lib-active-directory.mjs.map +1 -1
  55. package/fesm2015/cleavelandprice-ngx-lib-authentication-object.mjs +8 -7
  56. package/fesm2015/cleavelandprice-ngx-lib-authentication-object.mjs.map +1 -1
  57. package/fesm2015/cleavelandprice-ngx-lib-authentication-token-gui.mjs +25 -22
  58. package/fesm2015/cleavelandprice-ngx-lib-authentication-token-gui.mjs.map +1 -1
  59. package/fesm2015/cleavelandprice-ngx-lib-authentication-token.mjs +8 -7
  60. package/fesm2015/cleavelandprice-ngx-lib-authentication-token.mjs.map +1 -1
  61. package/fesm2015/cleavelandprice-ngx-lib-authentication.mjs +5 -4
  62. package/fesm2015/cleavelandprice-ngx-lib-authentication.mjs.map +1 -1
  63. package/fesm2015/cleavelandprice-ngx-lib-dialog.mjs +32 -29
  64. package/fesm2015/cleavelandprice-ngx-lib-dialog.mjs.map +1 -1
  65. package/fesm2015/cleavelandprice-ngx-lib-msgraph.mjs +5 -4
  66. package/fesm2015/cleavelandprice-ngx-lib-msgraph.mjs.map +1 -1
  67. package/fesm2015/cleavelandprice-ngx-lib-quill-mention.mjs +14 -12
  68. package/fesm2015/cleavelandprice-ngx-lib-quill-mention.mjs.map +1 -1
  69. package/fesm2015/cleavelandprice-ngx-lib-quill.mjs +19 -16
  70. package/fesm2015/cleavelandprice-ngx-lib-quill.mjs.map +1 -1
  71. package/fesm2015/cleavelandprice-ngx-lib-sharepoint.mjs +14 -13
  72. package/fesm2015/cleavelandprice-ngx-lib-sharepoint.mjs.map +1 -1
  73. package/fesm2015/cleavelandprice-ngx-lib-upload.mjs +20 -19
  74. package/fesm2015/cleavelandprice-ngx-lib-upload.mjs.map +1 -1
  75. package/fesm2015/cleavelandprice-ngx-lib-url-utilities.mjs +14 -13
  76. package/fesm2015/cleavelandprice-ngx-lib-url-utilities.mjs.map +1 -1
  77. package/fesm2015/cleavelandprice-ngx-lib.mjs +8 -7
  78. package/fesm2015/cleavelandprice-ngx-lib.mjs.map +1 -1
  79. package/fesm2020/cleavelandprice-ngx-lib-active-directory-gui.mjs +65 -64
  80. package/fesm2020/cleavelandprice-ngx-lib-active-directory-gui.mjs.map +1 -1
  81. package/fesm2020/cleavelandprice-ngx-lib-active-directory.mjs +8 -7
  82. package/fesm2020/cleavelandprice-ngx-lib-active-directory.mjs.map +1 -1
  83. package/fesm2020/cleavelandprice-ngx-lib-authentication-object.mjs +8 -7
  84. package/fesm2020/cleavelandprice-ngx-lib-authentication-object.mjs.map +1 -1
  85. package/fesm2020/cleavelandprice-ngx-lib-authentication-token-gui.mjs +25 -22
  86. package/fesm2020/cleavelandprice-ngx-lib-authentication-token-gui.mjs.map +1 -1
  87. package/fesm2020/cleavelandprice-ngx-lib-authentication-token.mjs +8 -7
  88. package/fesm2020/cleavelandprice-ngx-lib-authentication-token.mjs.map +1 -1
  89. package/fesm2020/cleavelandprice-ngx-lib-authentication.mjs +5 -4
  90. package/fesm2020/cleavelandprice-ngx-lib-authentication.mjs.map +1 -1
  91. package/fesm2020/cleavelandprice-ngx-lib-dialog.mjs +32 -29
  92. package/fesm2020/cleavelandprice-ngx-lib-dialog.mjs.map +1 -1
  93. package/fesm2020/cleavelandprice-ngx-lib-msgraph.mjs +5 -4
  94. package/fesm2020/cleavelandprice-ngx-lib-msgraph.mjs.map +1 -1
  95. package/fesm2020/cleavelandprice-ngx-lib-quill-mention.mjs +14 -12
  96. package/fesm2020/cleavelandprice-ngx-lib-quill-mention.mjs.map +1 -1
  97. package/fesm2020/cleavelandprice-ngx-lib-quill.mjs +19 -16
  98. package/fesm2020/cleavelandprice-ngx-lib-quill.mjs.map +1 -1
  99. package/fesm2020/cleavelandprice-ngx-lib-sharepoint.mjs +14 -13
  100. package/fesm2020/cleavelandprice-ngx-lib-sharepoint.mjs.map +1 -1
  101. package/fesm2020/cleavelandprice-ngx-lib-upload.mjs +20 -19
  102. package/fesm2020/cleavelandprice-ngx-lib-upload.mjs.map +1 -1
  103. package/fesm2020/cleavelandprice-ngx-lib-url-utilities.mjs +14 -13
  104. package/fesm2020/cleavelandprice-ngx-lib-url-utilities.mjs.map +1 -1
  105. package/fesm2020/cleavelandprice-ngx-lib.mjs +8 -7
  106. package/fesm2020/cleavelandprice-ngx-lib.mjs.map +1 -1
  107. package/package.json +4 -4
  108. package/quill/components/editor/editor.component.d.ts +2 -2
  109. package/quill/components/raw/raw.component.d.ts +1 -1
  110. package/quill/mention/components/editor/editor.component.d.ts +2 -2
  111. package/sharepoint/components/employee-photo/employee-photo.component.d.ts +1 -1
  112. package/upload/components/upload/upload.component.d.ts +2 -2
  113. package/upload/components/upload-dialog/upload-dialog.component.d.ts +2 -2
@@ -1,8 +1,8 @@
1
1
  import { OnInit, AfterViewChecked, ElementRef } from '@angular/core';
2
2
  import { FormControl, FormGroup } from '@angular/forms';
3
- import { MatDialogRef } from '@angular/material/dialog';
4
- import { MatListOption, MatSelectionList } from '@angular/material/list';
5
- import { MatTableDataSource } from '@angular/material/table';
3
+ import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog';
4
+ import { MatLegacyListOption as MatListOption, MatLegacySelectionList as MatSelectionList } from '@angular/material/legacy-list';
5
+ import { MatLegacyTableDataSource as MatTableDataSource } from '@angular/material/legacy-table';
6
6
  import { ActiveDirectoryService, Group } from '@cleavelandprice/ngx-lib/active-directory';
7
7
  import { SharePointService, PhotoItem } from '@cleavelandprice/ngx-lib/sharepoint';
8
8
  import { SelectableUser } from '../../model/selectable-user';
@@ -54,5 +54,5 @@ export declare class UserChooserComponent implements OnInit, AfterViewChecked {
54
54
  private listenForFilterChanges;
55
55
  tooltip(user: SelectableUser): string;
56
56
  static ɵfac: i0.ɵɵFactoryDeclaration<UserChooserComponent, never>;
57
- static ɵcmp: i0.ɵɵComponentDeclaration<UserChooserComponent, "ng-component", never, {}, {}, never, never, false>;
57
+ static ɵcmp: i0.ɵɵComponentDeclaration<UserChooserComponent, "ng-component", never, {}, {}, never, never, false, never>;
58
58
  }
@@ -1,5 +1,5 @@
1
1
  import { EventEmitter, OnInit } from '@angular/core';
2
- import { MatDialog } from '@angular/material/dialog';
2
+ import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog';
3
3
  import { ActiveDirectoryService, User } from '@cleavelandprice/ngx-lib/active-directory';
4
4
  import { PhotoItem, SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';
5
5
  import { UserChooserData } from '../../model/user-chooser-data';
@@ -25,5 +25,5 @@ export declare class UserFormFieldComponent implements OnInit {
25
25
  getUser(accountName: string): User | undefined;
26
26
  getPhoto(accountName: string): string | undefined;
27
27
  static ɵfac: i0.ɵɵFactoryDeclaration<UserFormFieldComponent, never>;
28
- static ɵcmp: i0.ɵɵComponentDeclaration<UserFormFieldComponent, "cp-user-field", never, { "placeholder": "placeholder"; "clickable": "clickable"; "userChooserData": "userChooserData"; }, { "usersSelected": "usersSelected"; "userUnSelected": "userUnSelected"; }, never, never, false>;
28
+ static ɵcmp: i0.ɵɵComponentDeclaration<UserFormFieldComponent, "cp-user-field", never, { "placeholder": "placeholder"; "clickable": "clickable"; "userChooserData": "userChooserData"; }, { "usersSelected": "usersSelected"; "userUnSelected": "userUnSelected"; }, never, never, false, never>;
29
29
  }
@@ -3,19 +3,19 @@ import * as i1 from "./components/user-chooser/user-chooser.component";
3
3
  import * as i2 from "./components/user-form-field/user-form-field.component";
4
4
  import * as i3 from "@angular/common";
5
5
  import * as i4 from "@angular/forms";
6
- import * as i5 from "@angular/material/button";
7
- import * as i6 from "@angular/material/dialog";
8
- import * as i7 from "@angular/material/form-field";
6
+ import * as i5 from "@angular/material/legacy-button";
7
+ import * as i6 from "@angular/material/legacy-dialog";
8
+ import * as i7 from "@angular/material/legacy-form-field";
9
9
  import * as i8 from "@angular/material/icon";
10
- import * as i9 from "@angular/material/input";
11
- import * as i10 from "@angular/material/list";
12
- import * as i11 from "@angular/material/progress-bar";
13
- import * as i12 from "@angular/material/progress-spinner";
14
- import * as i13 from "@angular/material/slide-toggle";
15
- import * as i14 from "@angular/material/table";
16
- import * as i15 from "@angular/material/tooltip";
10
+ import * as i9 from "@angular/material/legacy-input";
11
+ import * as i10 from "@angular/material/legacy-list";
12
+ import * as i11 from "@angular/material/legacy-progress-bar";
13
+ import * as i12 from "@angular/material/legacy-progress-spinner";
14
+ import * as i13 from "@angular/material/legacy-slide-toggle";
15
+ import * as i14 from "@angular/material/legacy-table";
16
+ import * as i15 from "@angular/material/legacy-tooltip";
17
17
  export declare class GuiModule {
18
18
  static ɵfac: i0.ɵɵFactoryDeclaration<GuiModule, never>;
19
- static ɵmod: i0.ɵɵNgModuleDeclaration<GuiModule, [typeof i1.UserChooserComponent, typeof i2.UserFormFieldComponent], [typeof i3.CommonModule, typeof i4.ReactiveFormsModule, typeof i5.MatButtonModule, typeof i6.MatDialogModule, typeof i7.MatFormFieldModule, typeof i8.MatIconModule, typeof i9.MatInputModule, typeof i10.MatListModule, typeof i11.MatProgressBarModule, typeof i12.MatProgressSpinnerModule, typeof i13.MatSlideToggleModule, typeof i14.MatTableModule, typeof i15.MatTooltipModule], [typeof i1.UserChooserComponent, typeof i2.UserFormFieldComponent]>;
19
+ static ɵmod: i0.ɵɵNgModuleDeclaration<GuiModule, [typeof i1.UserChooserComponent, typeof i2.UserFormFieldComponent], [typeof i3.CommonModule, typeof i4.ReactiveFormsModule, typeof i5.MatLegacyButtonModule, typeof i6.MatLegacyDialogModule, typeof i7.MatLegacyFormFieldModule, typeof i8.MatIconModule, typeof i9.MatLegacyInputModule, typeof i10.MatLegacyListModule, typeof i11.MatLegacyProgressBarModule, typeof i12.MatLegacyProgressSpinnerModule, typeof i13.MatLegacySlideToggleModule, typeof i14.MatLegacyTableModule, typeof i15.MatLegacyTooltipModule], [typeof i1.UserChooserComponent, typeof i2.UserFormFieldComponent]>;
20
20
  static ɵinj: i0.ɵɵInjectorDeclaration<GuiModule>;
21
21
  }
@@ -1,4 +1,4 @@
1
- import { MatDialog } from '@angular/material/dialog';
1
+ import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog';
2
2
  import { AuthenticationService } from '../../services/authentication.service';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class LoginComponent {
@@ -9,5 +9,5 @@ export declare class LoginComponent {
9
9
  login(): void;
10
10
  confirmLogout(): void;
11
11
  static ɵfac: i0.ɵɵFactoryDeclaration<LoginComponent, never>;
12
- static ɵcmp: i0.ɵɵComponentDeclaration<LoginComponent, "cp-login", never, { "adminGroup": "adminGroup"; }, {}, never, never, false>;
12
+ static ɵcmp: i0.ɵɵComponentDeclaration<LoginComponent, "cp-login", never, { "adminGroup": "adminGroup"; }, {}, never, never, false, never>;
13
13
  }
@@ -1,6 +1,6 @@
1
1
  import { OnInit, OnDestroy } from '@angular/core';
2
2
  import { UntypedFormGroup } from '@angular/forms';
3
- import { MatDialogRef } from '@angular/material/dialog';
3
+ import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog';
4
4
  import { Subscription } from 'rxjs';
5
5
  import { LoginFormData } from '../../model/login-form-data';
6
6
  import { AuthenticationService } from '../../services/authentication.service';
@@ -19,5 +19,5 @@ export declare class LoginFormComponent implements OnInit, OnDestroy {
19
19
  private authChangedHandler;
20
20
  private errorHandler;
21
21
  static ɵfac: i0.ɵɵFactoryDeclaration<LoginFormComponent, never>;
22
- static ɵcmp: i0.ɵɵComponentDeclaration<LoginFormComponent, "ng-component", never, {}, {}, never, never, false>;
22
+ static ɵcmp: i0.ɵɵComponentDeclaration<LoginFormComponent, "ng-component", never, {}, {}, never, never, false, never>;
23
23
  }
@@ -17,5 +17,5 @@ export declare class BaseComponent {
17
17
  close(): void;
18
18
  cancel(): void;
19
19
  static ɵfac: i0.ɵɵFactoryDeclaration<BaseComponent, never>;
20
- static ɵcmp: i0.ɵɵComponentDeclaration<BaseComponent, "cp-dialog-base", never, { "dialogType": "dialogType"; "data": "data"; }, { "closed": "closed"; }, never, never, false>;
20
+ static ɵcmp: i0.ɵɵComponentDeclaration<BaseComponent, "cp-dialog-base", never, { "dialogType": "dialogType"; "data": "data"; }, { "closed": "closed"; }, never, never, false, never>;
21
21
  }
@@ -1,4 +1,4 @@
1
- import { MatDialogRef } from '@angular/material/dialog';
1
+ import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog';
2
2
  import { DialogChoiceData } from '../../model/dialog-choice-data';
3
3
  import { DialogType } from '../../model/dialog-type';
4
4
  import * as i0 from "@angular/core";
@@ -8,5 +8,5 @@ export declare class ChoiceComponent {
8
8
  dialogType: DialogType;
9
9
  constructor(data: DialogChoiceData, dialogRef: MatDialogRef<ChoiceComponent>);
10
10
  static ɵfac: i0.ɵɵFactoryDeclaration<ChoiceComponent, never>;
11
- static ɵcmp: i0.ɵɵComponentDeclaration<ChoiceComponent, "ng-component", never, {}, {}, never, never, false>;
11
+ static ɵcmp: i0.ɵɵComponentDeclaration<ChoiceComponent, "ng-component", never, {}, {}, never, never, false, never>;
12
12
  }
@@ -1,4 +1,4 @@
1
- import { MatDialogRef } from '@angular/material/dialog';
1
+ import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog';
2
2
  import { DialogBaseData } from '../../model/dialog-base-data';
3
3
  import { DialogType } from '../../model/dialog-type';
4
4
  import * as i0 from "@angular/core";
@@ -8,5 +8,5 @@ export declare class ConfirmationComponent {
8
8
  dialogType: DialogType;
9
9
  constructor(data: DialogBaseData, dialogRef: MatDialogRef<ConfirmationComponent>);
10
10
  static ɵfac: i0.ɵɵFactoryDeclaration<ConfirmationComponent, never>;
11
- static ɵcmp: i0.ɵɵComponentDeclaration<ConfirmationComponent, "ng-component", never, {}, {}, never, never, false>;
11
+ static ɵcmp: i0.ɵɵComponentDeclaration<ConfirmationComponent, "ng-component", never, {}, {}, never, never, false, never>;
12
12
  }
@@ -1,4 +1,4 @@
1
- import { MatDialogRef } from '@angular/material/dialog';
1
+ import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog';
2
2
  import { DialogBaseData } from '../../model/dialog-base-data';
3
3
  import { DialogType } from '../../model/dialog-type';
4
4
  import * as i0 from "@angular/core";
@@ -8,5 +8,5 @@ export declare class InputComponent {
8
8
  dialogType: DialogType;
9
9
  constructor(data: DialogBaseData, dialogRef: MatDialogRef<InputComponent>);
10
10
  static ɵfac: i0.ɵɵFactoryDeclaration<InputComponent, never>;
11
- static ɵcmp: i0.ɵɵComponentDeclaration<InputComponent, "ng-component", never, {}, {}, never, never, false>;
11
+ static ɵcmp: i0.ɵɵComponentDeclaration<InputComponent, "ng-component", never, {}, {}, never, never, false, never>;
12
12
  }
@@ -1,4 +1,4 @@
1
- import { MatDialogRef } from '@angular/material/dialog';
1
+ import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog';
2
2
  import { DialogBaseData } from '../../model/dialog-base-data';
3
3
  import { DialogType } from '../../model/dialog-type';
4
4
  import * as i0 from "@angular/core";
@@ -8,5 +8,5 @@ export declare class MessageComponent {
8
8
  dialogType: DialogType;
9
9
  constructor(data: DialogBaseData, dialogRef: MatDialogRef<MessageComponent>);
10
10
  static ɵfac: i0.ɵɵFactoryDeclaration<MessageComponent, never>;
11
- static ɵcmp: i0.ɵɵComponentDeclaration<MessageComponent, "ng-component", never, {}, {}, never, never, false>;
11
+ static ɵcmp: i0.ɵɵComponentDeclaration<MessageComponent, "ng-component", never, {}, {}, never, never, false, never>;
12
12
  }
@@ -19,10 +19,10 @@ export class ActiveDirectoryModule {
19
19
  };
20
20
  }
21
21
  }
22
- ActiveDirectoryModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: ActiveDirectoryModule, deps: [{ token: ActiveDirectoryModule, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.NgModule });
23
- ActiveDirectoryModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.2.10", ngImport: i0, type: ActiveDirectoryModule, imports: [CommonModule] });
24
- ActiveDirectoryModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: ActiveDirectoryModule, imports: [CommonModule] });
25
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: ActiveDirectoryModule, decorators: [{
22
+ ActiveDirectoryModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: ActiveDirectoryModule, deps: [{ token: ActiveDirectoryModule, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.NgModule });
23
+ ActiveDirectoryModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.0.4", ngImport: i0, type: ActiveDirectoryModule, imports: [CommonModule] });
24
+ ActiveDirectoryModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: ActiveDirectoryModule, imports: [CommonModule] });
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: ActiveDirectoryModule, decorators: [{
26
26
  type: NgModule,
27
27
  args: [{
28
28
  declarations: [],
@@ -36,4 +36,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.10", ngImpo
36
36
  }, {
37
37
  type: SkipSelf
38
38
  }] }]; } });
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZlLWRpcmVjdG9yeS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGVhdmVsYW5kcHJpY2Uvbmd4LWxpYi9hY3RpdmUtZGlyZWN0b3J5L3NyYy9hY3RpdmUtZGlyZWN0b3J5Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXVCLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFdkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUNBQXFDLENBQUM7O0FBUzdFLE1BQU0sT0FBTyxxQkFBcUI7SUFXaEMsWUFBb0MsWUFBbUM7UUFDckUsSUFBSSxZQUFZLEVBQUU7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FDYiwwRUFBMEUsQ0FBQyxDQUFDO1NBQy9FO0lBQ0gsQ0FBQztJQWZELE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBcUI7UUFDbEMsT0FBTztZQUNMLFFBQVEsRUFBRSxxQkFBcUI7WUFDL0IsU0FBUyxFQUFFO2dCQUNULHNCQUFzQjtnQkFDdEIsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUU7YUFDN0M7U0FDRixDQUFDO0lBQ0osQ0FBQzs7bUhBVFUscUJBQXFCO29IQUFyQixxQkFBcUIsWUFKOUIsWUFBWTtvSEFJSCxxQkFBcUIsWUFKOUIsWUFBWTs0RkFJSCxxQkFBcUI7a0JBUGpDLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLEVBQUU7b0JBQ2hCLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3FCQUNiO29CQUNELE9BQU8sRUFBRSxFQUFFO2lCQUNaOzswQkFZYyxRQUFROzswQkFBSSxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kdWxlV2l0aFByb3ZpZGVycywgTmdNb2R1bGUsIE9wdGlvbmFsLCBTa2lwU2VsZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuaW1wb3J0IHsgU2VydmljZUNvbmZpZyB9IGZyb20gJy4vbW9kZWwvc2VydmljZS1jb25maWcnO1xyXG5cclxuaW1wb3J0IHsgQWN0aXZlRGlyZWN0b3J5U2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvYWN0aXZlLWRpcmVjdG9yeS5zZXJ2aWNlJztcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgZGVjbGFyYXRpb25zOiBbXSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGVcclxuICBdLFxyXG4gIGV4cG9ydHM6IFtdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBY3RpdmVEaXJlY3RvcnlNb2R1bGUge1xyXG4gIHN0YXRpYyBmb3JSb290KGNvbmZpZzogU2VydmljZUNvbmZpZyk6IE1vZHVsZVdpdGhQcm92aWRlcnM8QWN0aXZlRGlyZWN0b3J5TW9kdWxlPiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuZ01vZHVsZTogQWN0aXZlRGlyZWN0b3J5TW9kdWxlLFxyXG4gICAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICBBY3RpdmVEaXJlY3RvcnlTZXJ2aWNlLFxyXG4gICAgICAgIHsgcHJvdmlkZTogU2VydmljZUNvbmZpZywgdXNlVmFsdWU6IGNvbmZpZyB9XHJcbiAgICAgIF1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSBwYXJlbnRNb2R1bGU6IEFjdGl2ZURpcmVjdG9yeU1vZHVsZSkge1xyXG4gICAgaWYgKHBhcmVudE1vZHVsZSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ0FjdGl2ZURpcmVjdG9yeU1vZHVsZSBpcyBhbHJlYWR5IGxvYWRlZC4gSW1wb3J0IGl0IGluIHRoZSBBcHBNb2R1bGUgb25seScpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZlLWRpcmVjdG9yeS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGVhdmVsYW5kcHJpY2Uvbmd4LWxpYi9hY3RpdmUtZGlyZWN0b3J5L3NyYy9hY3RpdmUtZGlyZWN0b3J5Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXVCLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFdkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUNBQXFDLENBQUM7O0FBUzdFLE1BQU0sT0FBTyxxQkFBcUI7SUFXaEMsWUFBb0MsWUFBbUM7UUFDckUsSUFBSSxZQUFZLEVBQUU7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FDYiwwRUFBMEUsQ0FBQyxDQUFDO1NBQy9FO0lBQ0gsQ0FBQztJQWZELE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBcUI7UUFDbEMsT0FBTztZQUNMLFFBQVEsRUFBRSxxQkFBcUI7WUFDL0IsU0FBUyxFQUFFO2dCQUNULHNCQUFzQjtnQkFDdEIsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUU7YUFDN0M7U0FDRixDQUFDO0lBQ0osQ0FBQzs7a0hBVFUscUJBQXFCO21IQUFyQixxQkFBcUIsWUFKOUIsWUFBWTttSEFJSCxxQkFBcUIsWUFKOUIsWUFBWTsyRkFJSCxxQkFBcUI7a0JBUGpDLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLEVBQUU7b0JBQ2hCLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3FCQUNiO29CQUNELE9BQU8sRUFBRSxFQUFFO2lCQUNaOzswQkFZYyxRQUFROzswQkFBSSxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kdWxlV2l0aFByb3ZpZGVycywgTmdNb2R1bGUsIE9wdGlvbmFsLCBTa2lwU2VsZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuaW1wb3J0IHsgU2VydmljZUNvbmZpZyB9IGZyb20gJy4vbW9kZWwvc2VydmljZS1jb25maWcnO1xyXG5cclxuaW1wb3J0IHsgQWN0aXZlRGlyZWN0b3J5U2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvYWN0aXZlLWRpcmVjdG9yeS5zZXJ2aWNlJztcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgZGVjbGFyYXRpb25zOiBbXSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGVcclxuICBdLFxyXG4gIGV4cG9ydHM6IFtdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBY3RpdmVEaXJlY3RvcnlNb2R1bGUge1xyXG4gIHN0YXRpYyBmb3JSb290KGNvbmZpZzogU2VydmljZUNvbmZpZyk6IE1vZHVsZVdpdGhQcm92aWRlcnM8QWN0aXZlRGlyZWN0b3J5TW9kdWxlPiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuZ01vZHVsZTogQWN0aXZlRGlyZWN0b3J5TW9kdWxlLFxyXG4gICAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICBBY3RpdmVEaXJlY3RvcnlTZXJ2aWNlLFxyXG4gICAgICAgIHsgcHJvdmlkZTogU2VydmljZUNvbmZpZywgdXNlVmFsdWU6IGNvbmZpZyB9XHJcbiAgICAgIF1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSBwYXJlbnRNb2R1bGU6IEFjdGl2ZURpcmVjdG9yeU1vZHVsZSkge1xyXG4gICAgaWYgKHBhcmVudE1vZHVsZSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ0FjdGl2ZURpcmVjdG9yeU1vZHVsZSBpcyBhbHJlYWR5IGxvYWRlZC4gSW1wb3J0IGl0IGluIHRoZSBBcHBNb2R1bGUgb25seScpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
@@ -1,25 +1,25 @@
1
1
  import { Component, Inject, ViewChild } from '@angular/core';
2
2
  import { FormControl, FormGroup } from '@angular/forms';
3
- import { MAT_DIALOG_DATA } from '@angular/material/dialog';
4
- import { MatSelectionList } from '@angular/material/list';
5
- import { MatTableDataSource } from '@angular/material/table';
3
+ import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
4
+ import { MatLegacySelectionList as MatSelectionList } from '@angular/material/legacy-list';
5
+ import { MatLegacyTableDataSource as MatTableDataSource } from '@angular/material/legacy-table';
6
6
  import { debounceTime, forkJoin, of } from 'rxjs';
7
7
  import { UserChooserData } from '../../model/user-chooser-data';
8
8
  import { UserChooserMode } from '../../public_api';
9
9
  import * as i0 from "@angular/core";
10
- import * as i1 from "@angular/material/dialog";
10
+ import * as i1 from "@angular/material/legacy-dialog";
11
11
  import * as i2 from "@cleavelandprice/ngx-lib/active-directory";
12
12
  import * as i3 from "@cleavelandprice/ngx-lib/sharepoint";
13
13
  import * as i4 from "@angular/common";
14
14
  import * as i5 from "@angular/forms";
15
- import * as i6 from "@angular/material/button";
16
- import * as i7 from "@angular/material/form-field";
15
+ import * as i6 from "@angular/material/legacy-button";
16
+ import * as i7 from "@angular/material/legacy-form-field";
17
17
  import * as i8 from "@angular/material/icon";
18
- import * as i9 from "@angular/material/input";
19
- import * as i10 from "@angular/material/list";
20
- import * as i11 from "@angular/material/progress-spinner";
21
- import * as i12 from "@angular/material/slide-toggle";
22
- import * as i13 from "@angular/material/tooltip";
18
+ import * as i9 from "@angular/material/legacy-input";
19
+ import * as i10 from "@angular/material/legacy-list";
20
+ import * as i11 from "@angular/material/legacy-progress-spinner";
21
+ import * as i12 from "@angular/material/legacy-slide-toggle";
22
+ import * as i13 from "@angular/material/legacy-tooltip";
23
23
  import * as i14 from "../../model/user-chooser-data";
24
24
  export class UserChooserComponent {
25
25
  //#endregion
@@ -356,19 +356,19 @@ export class UserChooserComponent {
356
356
  '';
357
357
  }
358
358
  }
359
- UserChooserComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: UserChooserComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.MatDialogRef }, { token: i2.ActiveDirectoryService }, { token: i3.SharePointService }], target: i0.ɵɵFactoryTarget.Component });
360
- UserChooserComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.10", type: UserChooserComponent, selector: "ng-component", viewQueries: [{ propertyName: "selectionList", first: true, predicate: MatSelectionList, descendants: true }, { propertyName: "filterInput", first: true, predicate: ["filterInput"], descendants: true }], ngImport: i0, template: "<div id=\"dialog-title\">\n <h2 mat-dialog-title>{{ data.title }}</h2>\n\n <div>\n {{ selectedOptions.length }} selected\n </div>\n</div>\n\n<mat-dialog-content>\n <div *ngIf=\"!(dataSource && photos)\">\n <mat-spinner [diameter]=\"50\"></mat-spinner>\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\n </div>\n\n <ng-container *ngIf=\"dataSource && photos\">\n <form [formGroup]=\"filterForm\">\n <mat-form-field *ngIf=\"dataSource\">\n <input matInput placeholder=\"Search\" formControlName=\"filter\" #filterInput>\n\n <button *ngIf=\"filterForm.value.filter\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterForm.get('filter')?.setValue('')\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n </button>\n </mat-form-field>\n </form>\n\n <mat-selection-list [multiple]=\"isMultiMode\"\n (selectionChange)=\"listSelectionChanged($event.options)\">\n\n <mat-list-option *ngFor=\"let user of dataSource?.filteredData\" [value]=\"user\" [selected]=\"user.selected\"\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\n\n <img *ngIf=\"getPhoto(user)\" matListAvatar alt=\"\" [src]=\"getPhoto(user)\">\n\n <mat-icon *ngIf=\"!getPhoto(user)\" matListAvatar class=\"no-photo\"\n fontIcon=\"account_circle\">\n </mat-icon>\n \n <div class=\"user\">\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\n {{ user.displayName }}\n <div *ngIf=\"data.showPhone && user.telephoneNumber\">{{ user.telephoneNumber }}</div>\n </div>\n \n <div>{{ user.department }}</div>\n \n <div class=\"title\">{{ user.title }}</div>\n </div>\n </mat-list-option>\n </mat-selection-list>\n </ng-container>\n</mat-dialog-content>\n\n<mat-dialog-actions>\n <ng-container *ngIf=\"dataSource && photos\">\n <mat-slide-toggle *ngIf=\"selectedOptions.length\" (change)=\"hideUnselectedChanged($event.checked)\">\n Hide Unselected\n </mat-slide-toggle>\n\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\n *ngIf=\"isMultiMode\">\n <mat-icon fontIcon=\"select_all\"></mat-icon>\n <span class=\"hide-mobile\">Select All</span>\n </button>\n \n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\n *ngIf=\"isMultiMode && selectedOptions.length\">\n <mat-icon fontIcon=\"clear_all\"></mat-icon>\n <span class=\"hide-mobile\">Clear All</span>\n </button>\n\n <button *ngIf=\"isMultiMode || !data.closeWhenSelectionMade\" mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\n [disabled]=\"!selectedOptions.length\">\n <mat-icon fontIcon=\"check\"></mat-icon>\n <span class=\"hide-mobile\">Ok</span>\n </button>\n </ng-container>\n\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n <span class=\"hide-mobile\">Cancel</span>\n </button>\n</mat-dialog-actions>", styles: ["::ng-deep .mat-tooltip{font-size:1em!important;white-space:pre-line}mat-dialog-content{min-width:50vw}#dialog-title{display:flex;justify-content:space-between}.mat-spinner{margin:0 auto}#spinner-message{text-align:center;padding:.5em}mat-form-field{width:100%}.title{font-style:italic;color:#757575}img,.no-photo{width:2rem;height:2rem;font-size:2.3rem!important;border-radius:100%}.hide-mobile{display:none}mat-dialog-actions{display:grid;grid-auto-flow:column;grid-gap:1em;justify-content:center}.user-name{display:flex;justify-content:space-between}.user-name>div:last-child{margin-right:10rem;font-weight:400;font-style:italic;color:#757575}@media (min-width:801px){.user{display:grid;grid-template-columns:1fr 1fr 1fr}.user>div:first-child{font-weight:700}.hide-mobile{display:initial}}\n", ".material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\"}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix]" }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i10.MatListAvatarCssMatStyler, selector: "[mat-list-avatar], [matListAvatar]" }, { kind: "component", type: i10.MatSelectionList, selector: "mat-selection-list", inputs: ["disableRipple", "color", "compareWith", "disabled", "multiple"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i10.MatListOption, selector: "mat-list-option", inputs: ["disableRipple", "checkboxPosition", "color", "value", "disabled", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "component", type: i11.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i12.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: i13.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
361
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: UserChooserComponent, decorators: [{
359
+ UserChooserComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: UserChooserComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.MatLegacyDialogRef }, { token: i2.ActiveDirectoryService }, { token: i3.SharePointService }], target: i0.ɵɵFactoryTarget.Component });
360
+ UserChooserComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: UserChooserComponent, selector: "ng-component", viewQueries: [{ propertyName: "selectionList", first: true, predicate: MatSelectionList, descendants: true }, { propertyName: "filterInput", first: true, predicate: ["filterInput"], descendants: true }], ngImport: i0, template: "<div id=\"dialog-title\">\n <h2 mat-dialog-title>{{ data.title }}</h2>\n\n <div>\n {{ selectedOptions.length }} selected\n </div>\n</div>\n\n<mat-dialog-content>\n <div *ngIf=\"!(dataSource && photos)\">\n <mat-spinner [diameter]=\"50\"></mat-spinner>\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\n </div>\n\n <ng-container *ngIf=\"dataSource && photos\">\n <form [formGroup]=\"filterForm\">\n <mat-form-field *ngIf=\"dataSource\">\n <input matInput placeholder=\"Search\" formControlName=\"filter\" #filterInput>\n\n <button *ngIf=\"filterForm.value.filter\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterForm.get('filter')?.setValue('')\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n </button>\n </mat-form-field>\n </form>\n\n <mat-selection-list [multiple]=\"isMultiMode\"\n (selectionChange)=\"listSelectionChanged($event.options)\">\n\n <mat-list-option *ngFor=\"let user of dataSource?.filteredData\" [value]=\"user\" [selected]=\"user.selected\"\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\n\n <img *ngIf=\"getPhoto(user)\" matListAvatar alt=\"\" [src]=\"getPhoto(user)\">\n\n <mat-icon *ngIf=\"!getPhoto(user)\" matListAvatar class=\"no-photo\"\n fontIcon=\"account_circle\">\n </mat-icon>\n \n <div class=\"user\">\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\n {{ user.displayName }}\n <div *ngIf=\"data.showPhone && user.telephoneNumber\">{{ user.telephoneNumber }}</div>\n </div>\n \n <div>{{ user.department }}</div>\n \n <div class=\"title\">{{ user.title }}</div>\n </div>\n </mat-list-option>\n </mat-selection-list>\n </ng-container>\n</mat-dialog-content>\n\n<mat-dialog-actions>\n <ng-container *ngIf=\"dataSource && photos\">\n <mat-slide-toggle *ngIf=\"selectedOptions.length\" (change)=\"hideUnselectedChanged($event.checked)\">\n Hide Unselected\n </mat-slide-toggle>\n\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\n *ngIf=\"isMultiMode\">\n <mat-icon fontIcon=\"select_all\"></mat-icon>\n <span class=\"hide-mobile\">Select All</span>\n </button>\n \n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\n *ngIf=\"isMultiMode && selectedOptions.length\">\n <mat-icon fontIcon=\"clear_all\"></mat-icon>\n <span class=\"hide-mobile\">Clear All</span>\n </button>\n\n <button *ngIf=\"isMultiMode || !data.closeWhenSelectionMade\" mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\n [disabled]=\"!selectedOptions.length\">\n <mat-icon fontIcon=\"check\"></mat-icon>\n <span class=\"hide-mobile\">Ok</span>\n </button>\n </ng-container>\n\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n <span class=\"hide-mobile\">Cancel</span>\n </button>\n</mat-dialog-actions>", styles: ["::ng-deep .mat-tooltip{font-size:1em!important;white-space:pre-line}mat-dialog-content{min-width:50vw}#dialog-title{display:flex;justify-content:space-between}.mat-spinner{margin:0 auto}#spinner-message{text-align:center;padding:.5em}mat-form-field{width:100%}.title{font-style:italic;color:#757575}img,.no-photo{width:2rem;height:2rem;font-size:2.3rem!important;border-radius:100%}.hide-mobile{display:none}mat-dialog-actions{display:grid;grid-auto-flow:column;grid-gap:1em;justify-content:center}.user-name{display:flex;justify-content:space-between}.user-name>div:last-child{margin-right:10rem;font-weight:400;font-style:italic;color:#757575}@media (min-width:801px){.user{display:grid;grid-template-columns:1fr 1fr 1fr}.user>div:first-child{font-weight:700}.hide-mobile{display:initial}}\n", ".material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\"}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i1.MatLegacyDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatLegacyDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatLegacyDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatLegacyDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i7.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLegacySuffix, selector: "[matSuffix]" }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "directive", type: i10.MatLegacyListAvatarCssMatStyler, selector: "[mat-list-avatar], [matListAvatar]" }, { kind: "component", type: i10.MatLegacySelectionList, selector: "mat-selection-list", inputs: ["disableRipple", "color", "compareWith", "disabled", "multiple"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i10.MatLegacyListOption, selector: "mat-list-option", inputs: ["disableRipple", "checkboxPosition", "color", "value", "disabled", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "component", type: i11.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i12.MatLegacySlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: i13.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
361
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: UserChooserComponent, decorators: [{
362
362
  type: Component,
363
363
  args: [{ template: "<div id=\"dialog-title\">\n <h2 mat-dialog-title>{{ data.title }}</h2>\n\n <div>\n {{ selectedOptions.length }} selected\n </div>\n</div>\n\n<mat-dialog-content>\n <div *ngIf=\"!(dataSource && photos)\">\n <mat-spinner [diameter]=\"50\"></mat-spinner>\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\n </div>\n\n <ng-container *ngIf=\"dataSource && photos\">\n <form [formGroup]=\"filterForm\">\n <mat-form-field *ngIf=\"dataSource\">\n <input matInput placeholder=\"Search\" formControlName=\"filter\" #filterInput>\n\n <button *ngIf=\"filterForm.value.filter\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterForm.get('filter')?.setValue('')\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n </button>\n </mat-form-field>\n </form>\n\n <mat-selection-list [multiple]=\"isMultiMode\"\n (selectionChange)=\"listSelectionChanged($event.options)\">\n\n <mat-list-option *ngFor=\"let user of dataSource?.filteredData\" [value]=\"user\" [selected]=\"user.selected\"\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\n\n <img *ngIf=\"getPhoto(user)\" matListAvatar alt=\"\" [src]=\"getPhoto(user)\">\n\n <mat-icon *ngIf=\"!getPhoto(user)\" matListAvatar class=\"no-photo\"\n fontIcon=\"account_circle\">\n </mat-icon>\n \n <div class=\"user\">\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\n {{ user.displayName }}\n <div *ngIf=\"data.showPhone && user.telephoneNumber\">{{ user.telephoneNumber }}</div>\n </div>\n \n <div>{{ user.department }}</div>\n \n <div class=\"title\">{{ user.title }}</div>\n </div>\n </mat-list-option>\n </mat-selection-list>\n </ng-container>\n</mat-dialog-content>\n\n<mat-dialog-actions>\n <ng-container *ngIf=\"dataSource && photos\">\n <mat-slide-toggle *ngIf=\"selectedOptions.length\" (change)=\"hideUnselectedChanged($event.checked)\">\n Hide Unselected\n </mat-slide-toggle>\n\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\n *ngIf=\"isMultiMode\">\n <mat-icon fontIcon=\"select_all\"></mat-icon>\n <span class=\"hide-mobile\">Select All</span>\n </button>\n \n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\n *ngIf=\"isMultiMode && selectedOptions.length\">\n <mat-icon fontIcon=\"clear_all\"></mat-icon>\n <span class=\"hide-mobile\">Clear All</span>\n </button>\n\n <button *ngIf=\"isMultiMode || !data.closeWhenSelectionMade\" mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\n [disabled]=\"!selectedOptions.length\">\n <mat-icon fontIcon=\"check\"></mat-icon>\n <span class=\"hide-mobile\">Ok</span>\n </button>\n </ng-container>\n\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n <span class=\"hide-mobile\">Cancel</span>\n </button>\n</mat-dialog-actions>", styles: ["::ng-deep .mat-tooltip{font-size:1em!important;white-space:pre-line}mat-dialog-content{min-width:50vw}#dialog-title{display:flex;justify-content:space-between}.mat-spinner{margin:0 auto}#spinner-message{text-align:center;padding:.5em}mat-form-field{width:100%}.title{font-style:italic;color:#757575}img,.no-photo{width:2rem;height:2rem;font-size:2.3rem!important;border-radius:100%}.hide-mobile{display:none}mat-dialog-actions{display:grid;grid-auto-flow:column;grid-gap:1em;justify-content:center}.user-name{display:flex;justify-content:space-between}.user-name>div:last-child{margin-right:10rem;font-weight:400;font-style:italic;color:#757575}@media (min-width:801px){.user{display:grid;grid-template-columns:1fr 1fr 1fr}.user>div:first-child{font-weight:700}.hide-mobile{display:initial}}\n", ".material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\"}\n"] }]
364
364
  }], ctorParameters: function () { return [{ type: i14.UserChooserData, decorators: [{
365
365
  type: Inject,
366
366
  args: [MAT_DIALOG_DATA]
367
- }] }, { type: i1.MatDialogRef }, { type: i2.ActiveDirectoryService }, { type: i3.SharePointService }]; }, propDecorators: { selectionList: [{
367
+ }] }, { type: i1.MatLegacyDialogRef }, { type: i2.ActiveDirectoryService }, { type: i3.SharePointService }]; }, propDecorators: { selectionList: [{
368
368
  type: ViewChild,
369
369
  args: [MatSelectionList]
370
370
  }], filterInput: [{
371
371
  type: ViewChild,
372
372
  args: ['filterInput']
373
373
  }] } });
374
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jaG9vc2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2FjdGl2ZS1kaXJlY3RvcnkvZ3VpL3NyYy9jb21wb25lbnRzL3VzZXItY2hvb3Nlci91c2VyLWNob29zZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xlYXZlbGFuZHByaWNlL25neC1saWIvYWN0aXZlLWRpcmVjdG9yeS9ndWkvc3JjL2NvbXBvbmVudHMvdXNlci1jaG9vc2VyL3VzZXItY2hvb3Nlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQWdDLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFnQixlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RSxPQUFPLEVBQWlCLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTTlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTbkQsTUFBTSxPQUFPLG9CQUFvQjtJQXdDL0IsWUFBWTtJQUVaLG1CQUFtQjtJQUNuQixZQUE0QyxJQUFxQixFQUM3QyxTQUE2QyxFQUM3QyxzQkFBOEMsRUFDOUMsaUJBQW9DO1FBSFosU0FBSSxHQUFKLElB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LEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNuRyxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQW9CO1FBQzFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxRQUFRO2lCQUNWLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUNiLElBQUksQ0FBQyxNQUFNO2dCQUNULEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ2IsS0FBSyxDQUFDLGlCQUFpQixLQUFLLE9BQU8sQ0FDcEMsRUFBRSxJQUFJLENBQ1I7aUJBQ0EsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBRSxHQUFHLENBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDakIsRUFBRSxDQUFDO0lBQ1AsQ0FBQzs7a0hBeGFVLG9CQUFvQixrQkEyQ1gsZUFBZTtzR0EzQ3hCLG9CQUFvQixtR0FFcEIsZ0JBQWdCLDZJQ3ZCN0IsODRHQWlGcUI7NEZENURSLG9CQUFvQjtrQkFQaEMsU0FBUzs7OzBCQWtESyxNQUFNOzJCQUFDLGVBQWU7NElBekNOLGFBQWE7c0JBQXpDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNELFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBPbkluaXQsIFZpZXdDaGlsZCwgQWZ0ZXJWaWV3Q2hlY2tlZCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiwgTUFUX0RJQUxPR19EQVRBIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdExpc3RPcHRpb24sIE1hdFNlbGVjdGlvbkxpc3QgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9saXN0JztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEFjdGl2ZURpcmVjdG9yeVNlcnZpY2UsIEdyb3VwIH0gZnJvbSAnQGNsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2FjdGl2ZS1kaXJlY3RvcnknO1xuaW1wb3J0IHsgU2hhcmVQb2ludFNlcnZpY2UsIFBob3RvSXRlbSB9IGZyb20gJ0BjbGVhdmVsYW5kcHJpY2Uvbmd4LWxpYi9zaGFyZXBvaW50JztcblxuaW1wb3J0IHsgU2VsZWN0YWJsZVVzZXIgfSBmcm9tICcuLi8uLi9tb2RlbC9zZWxlY3RhYmxlLXVzZXInO1xuaW1wb3J0IHsgVXNlckNob29zZXJEYXRhIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlci1jaG9vc2VyLWRhdGEnO1xuaW1wb3J0IHsgVXNlckNob29zZXJNb2RlIH0gZnJvbSAnLi4vLi4vcHVibGljX2FwaSc7XG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1jaG9vc2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXG4gICAgJy4vdXNlci1jaG9vc2VyLmNvbXBvbmVudC5jc3MnLFxuICAgICcuLi8uLi8uLi8uLi8uLi9zdHlsZXMvbWF0LWljb24uY3NzJ1xuICBdXG59KVxuZXhwb3J0IGNsYXNzIFVzZXJDaG9vc2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdDaGVja2VkIHtcbiAgLy8jcmVnaW9uIEZpZWxkc1xuICBAVmlld0NoaWxkKE1hdFNlbGVjdGlvbkxpc3QpIHNlbGVjdGlvbkxpc3Q6IE1hdFNlbGVjdGlvbkxpc3QgfCB1bmRlZmluZWQ7XG4gIEBWaWV3Q2hpbGQoJ2ZpbHRlcklucHV0JykgZmlsdGVySW5wdXQ6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQ7XG4gIGZpbHRlcklucHV0Rm9jdXNlZCA9IGZhbHNlO1xuXG4gIGZpbHRlckZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICBmaWx0ZXI6IG5ldyBGb3JtQ29udHJvbCgpXG4gIH0pO1xuXG4gIGRhdGFTb3VyY2U6IE1hdFRhYmxlRGF0YVNvdXJjZTxTZWxlY3RhYmxlVXNlcj4gfCB1bmRlZmluZWQ7XG4gIHBob3RvczogUGhvdG9JdGVtW10gfCB1bmRlZmluZWQ7XG4gIGdyb3VwczogR3JvdXBbXSB8IHVuZGVmaW5lZDsgLy8gTWF5IG9yIG1heSBub3QgZ2V0IHBvcHVsYXRlZCwgZGVwZW5kaW5nIG9uIGNvbmZpZyBkYXRhIHNlbnQgaW5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFByb3BlcnRpZXNcbiAgZ2V0IGlzTXVsdGlNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGEubW9kZSA9PT0gVXNlckNob29zZXJNb2RlLk11bHRpcGxlO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGVkT3B0aW9ucygpOiBNYXRMaXN0T3B0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbkxpc3Q/Lm9wdGlvbnMuZmlsdGVyKG8gPT4gby5zZWxlY3RlZCkgPz8gW107XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRVc2VycygpOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlPy5kYXRhPy5maWx0ZXIoZCA9PiBkLnNlbGVjdGVkKSA/PyBbXTtcbiAgfVxuXG4gIGdldCBmaWx0ZXJWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZpbHRlckZvcm0udmFsdWUuZmlsdGVyO1xuICB9XG5cbiAgZ2V0IGFkR3JvdXBzTmVlZGVkKCk6IGJvb2xlYW4ge1xuICAgIC8vIElmIGFueSBhcmUgdGhlc2UgYXJlIHRydWUsIHRoZW4gd2UgbmVlZCB0byBwdWxsIEFEIGdyb3VwcyBmb3IgdXNlIGxhdGVyXG4gICAgcmV0dXJuIHRoaXMuZGF0YS5zaG93R3JvdXBNZW1iZXJzaGlwVG9vbHRpcHMgfHxcbiAgICAgIHRoaXMuZGF0YS5leGNsdXNpb25zLmdyb3Vwcy5sZW5ndGggPiAwIHx8XG4gICAgICB0aGlzLmRhdGEuaW5jbHVzaW9ucy5ncm91cHMubGVuZ3RoID4gMCB8fFxuICAgICAgdGhpcy5kYXRhLnByZVNlbGVjdGlvbnMuZ3JvdXBzLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRoaXMuZGF0YS5maWx0ZXJPcHRpb25zLmdyb3VwTWVtYmVyc2hpcDtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gTGlmZWN5Y2xlXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogVXNlckNob29zZXJEYXRhLFxuICAgICAgICAgICAgICBwcml2YXRlIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPFVzZXJDaG9vc2VyQ29tcG9uZW50PixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBhY3RpdmVEaXJlY3RvcnlTZXJ2aWNlOiBBY3RpdmVEaXJlY3RvcnlTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIHNoYXJlUG9pbnRTZXJ2aWNlOiBTaGFyZVBvaW50U2VydmljZSkge1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhID0ge1xuICAgICAgICAgICAgICAgICAgLi4ubmV3IFVzZXJDaG9vc2VyRGF0YSgpLFxuICAgICAgICAgICAgICAgICAgLi4uZGF0YVxuICAgICAgICAgICAgICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0RGF0YSgpO1xuICAgIHRoaXMubGlzdGVuRm9yRmlsdGVyQ2hhbmdlcygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZpbHRlcklucHV0Rm9jdXNlZCB8fCAhdGhpcy5maWx0ZXJJbnB1dCkge1xuICAgICAgLy8gQ29udHJvbCBub3QgcmVhZHkgeWV0LCBvciBpdCBoYXMgYWxyZWFkeSBiZWVuIGdpdmVuIGZvY3VzXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJJbnB1dEZvY3VzZWQgPSB0cnVlO1xuICAgIHRoaXMuZmlsdGVySW5wdXQ/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gRXZlbnRzXG4gICBsaXN0U2VsZWN0aW9uQ2hhbmdlZChvcHRpb25zOiBNYXRMaXN0T3B0aW9uW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhLm1vZGUgPT09IFVzZXJDaG9vc2VyTW9kZS5TaW5nbGUgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCAmJlxuICAgICAgdGhpcy5kYXRhLmNsb3NlV2hlblNlbGVjdGlvbk1hZGVcbiAgICAgICkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIG9wdGlvblNlbGVjdGlvbkNoYW5nZWQob3B0aW9uOiBNYXRMaXN0T3B0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuZGF0YVNvdXJjZT8uZGF0YVxuICAgICAgLmZpbmQodSA9PiB1LnNBTUFjY291bnROYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IChvcHRpb24udmFsdWUgYXMgU2VsZWN0YWJsZVVzZXIpLnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgaWYgKHVzZXIpIHtcbiAgICAgIHVzZXIuc2VsZWN0ZWQgPSBvcHRpb24uc2VsZWN0ZWQ7XG4gICAgfVxuICB9XG5cbiAgaGlkZVVuc2VsZWN0ZWRDaGFuZ2VkKHNlbGVjdGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJGb3JtLmdldCgnZmlsdGVyJyk/LnNldFZhbHVlKHNlbGVjdGVkID8gJ3tzZWxlY3RlZDp0cnVlfScgOiBudWxsKTtcbiAgfVxuXG4gIHNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbkxpc3Q/LnNlbGVjdEFsbCgpO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTGlzdD8ub3B0aW9ucykge1xuICAgICAgdGhpcy5saXN0U2VsZWN0aW9uQ2hhbmdlZCh0aGlzLnNlbGVjdGlvbkxpc3Q/Lm9wdGlvbnMudG9BcnJheSgpKTtcbiAgICB9XG4gIH1cblxuICBkZXNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbkxpc3Q/LmRlc2VsZWN0QWxsKCk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFV0aWxpdGllc1xuICBwcml2YXRlIGdldERhdGEoKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YU9ic2VydmFibGVzOiBPYnNlcnZhYmxlPGFueT5bXSA9IFtcbiAgICAgIHRoaXMuZGF0YS51c2VycyA/XG4gICAgICAgIC8vIFVzZXJzIHdlcmUgcGFzc2VkIGluXG4gICAgICAgIG9mKHRoaXMuZGF0YS51c2VycykgOlxuICAgICAgICAvLyBVc2VycyBuZWVkIHRvIGJlIHJldHJpZXZlZFxuICAgICAgICB0aGlzLmFjdGl2ZURpcmVjdG9yeVNlcnZpY2UuZ2V0VXNlcnMoZmFsc2UsIHRoaXMuZGF0YS5pbmNsdWRlRGlzYWJsZWRVc2VycywgdGhpcy5kYXRhLnBhcmVudE91KSxcblxuICAgICAgdGhpcy5kYXRhLnBob3RvcyA/XG4gICAgICAgIC8vIFBob3RvcyB3ZXJlIHBhc3NlZCBpblxuICAgICAgICBvZih0aGlzLmRhdGEucGhvdG9zKSA6XG4gICAgICAgIC8vIFBob3RvcyBuZWVkIHRvIGJlIHJldHJpZXZlZFxuICAgICAgICB0aGlzLnNoYXJlUG9pbnRTZXJ2aWNlLmdldFBob3RvcygpXG4gICAgXTtcblxuICAgIC8vIERvIHdlIG5lZWQgQUQgZ3JvdXBzP1xuICAgIGlmICh0aGlzLmFkR3JvdXBzTmVlZGVkKSB7XG4gICAgICB0aGlzLmRhdGEuZ3JvdXBzID9cbiAgICAgICAgLy8gR3JvdXBzIHdlcmUgcGFzc2VkIGluXG4gICAgICAgIG9mKHRoaXMuZGF0YS5ncm91cHMpIDpcbiAgICAgICAgLy8gR3JvdXBzIG5lZWQgdG8gYmUgcmV0cmlldmVkXG4gICAgICAgIGRhdGFPYnNlcnZhYmxlcy5wdXNoKHRoaXMuYWN0aXZlRGlyZWN0b3J5U2VydmljZS5nZXRHcm91cHMoKSk7XG4gICAgfVxuXG5cbiAgICBmb3JrSm9pbihkYXRhT2JzZXJ2YWJsZXMpXG4gICAgICAvLy5zdWJzY3JpYmUoKFt1c2VycywgcGhvdG9zXSkgPT4ge1xuICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgLy8gTmVlZCBncm91cHMgaW4gcGxhY2UgYmVmb3JlIHdlIGhhbmRsZSBleGNsdXNpb25zL2luY2x1c2lvbnMvcHJlLXNlbGVjdGlvbnNcbiAgICAgICAgdGhpcy5ncm91cHMgPSB0aGlzLmFkR3JvdXBzTmVlZGVkID8gZGF0YVsyXSA6IG51bGw7XG5cbiAgICAgICAgbGV0IHVzZXJzID0gZGF0YVswXSBhcyBTZWxlY3RhYmxlVXNlcltdO1xuICAgICAgICB1c2Vycy5mb3JFYWNoKHUgPT4gdS5zZWxlY3RlZCA9IGZhbHNlKTsgLy8gSW4gY2FzZSBleGlzdGluZyBkYXRhIHdhcyByZS11c2VkXG4gICAgICAgIHVzZXJzID0gdGhpcy5pbmNsdWRlVXNlcnNCeUFjY291bnROYW1lKHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLmluY2x1ZGVVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLmluY2x1ZGVVc2Vyc0J5RGVwYXJ0bWVudCh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy5pbmNsdWRlVXNlcnNCeVRpdGxlKHVzZXJzKTtcblxuICAgICAgICB1c2VycyA9IHRoaXMuZXhjbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy5leGNsdWRlVXNlcnNCeUdyb3VwTmFtZSh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy5leGNsdWRlVXNlcnNCeURlcGFydG1lbnQodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuZXhjbHVkZVVzZXJzQnlUaXRsZSh1c2Vycyk7XG5cbiAgICAgICAgdXNlcnMgPSB0aGlzLnByZVNlbGVjdFVzZXJzQnlBY2NvdW50TmFtZSh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy5wcmVTZWxlY3RVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLnByZVNlbGVjdFVzZXJzQnlEZXBhcnRtZW50KHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLnByZVNlbGVjdFVzZXJzQnlUaXRsZSh1c2Vycyk7XG5cbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh1c2Vycyk7XG4gICAgICBcbiAgICAgICAgdGhpcy5waG90b3MgPSBkYXRhWzFdO1xuXG4gICAgICAgIHRoaXMuc2V0RmlsdGVyUHJlZGljYXRlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZFVzZXJzKSB7XG4gICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2VsZWN0ZWRVc2Vyc1xuICAgICAgLm1hcCh1ID0+IHRoaXMuZGF0YS5yZXR1cm5Vc2VyT2JqZWN0cyA/IHUgOiB1LnNBTUFjY291bnROYW1lKTtcblxuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRoaXMuZGF0YS5tb2RlID09PSBVc2VyQ2hvb3Nlck1vZGUuTXVsdGlwbGUgP1xuICAgICAgdmFsdWUgOlxuICAgICAgdmFsdWVbMF1cbiAgICApO1xuICB9XG5cbiAgZ2V0UGhvdG8odXNlcjogU2VsZWN0YWJsZVVzZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBob3Rvcz8uZmluZChwID0+XG4gICAgICAocC5lbXBsb3llZU51bWJlciAmJiBwLmVtcGxveWVlTnVtYmVyLnRvU3RyaW5nKCkgPT09IHVzZXIuZW1wbG95ZWVOdW1iZXIpIHx8XG4gICAgICBwLmFjY291bnROYW1lPy50b0xvd2VyQ2FzZSgpID09PSB1c2VyLnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgIHAuZGlzcGxheU5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuZGlzcGxheU5hbWUudG9Mb3dlckNhc2UoKSB8fFxuICAgICAgcC50aXRsZT8udG9Mb3dlckNhc2UoKSA9PT0gdXNlci5kaXNwbGF5TmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgKT8uZW5jb2RlZEFic1VybDtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBFeGNsdXNpb25zIC0gd29uJ3QgYmUgaW5jbHVkZWQgaW4gdGhlIGRhdGFTb3VyY2UgYXQgYWxsXG4gIHByaXZhdGUgZXhjbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuZGF0YS5leGNsdXNpb25zLmFjY291bnROYW1lc1xuICAgICAgLmZvckVhY2goYWNjb3VudE5hbWUgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHVzZXJzLmZpbmRJbmRleCh1ID0+IHUuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgdXNlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBleGNsdWRlVXNlcnNCeUdyb3VwTmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuZGF0YS5leGNsdXNpb25zLmdyb3Vwc1xuICAgICAgLmZvckVhY2goZ3JvdXBOYW1lID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdyb3Vwcz8uZmluZChnID0+IGcubmFtZS50b0xvd2VyQ2FzZSgpID09PSBncm91cE5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGlmICghZ3JvdXApIHsgcmV0dXJuOyB9XG4gICAgICAgIFxuICAgICAgICBncm91cC5tZW1iZXIuZm9yRWFjaChncm91cE1lbWJlckRuID0+IHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHVzZXJzLmZpbmRJbmRleCh1ID0+IHUuZGlzdGluZ3Vpc2hlZE5hbWUgPT09IGdyb3VwTWVtYmVyRG4pO1xuICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICB1c2Vycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBleGNsdWRlVXNlcnNCeURlcGFydG1lbnQodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICB0aGlzLmRhdGEuZXhjbHVzaW9ucy5kZXBhcnRtZW50c1xuICAgICAgLmZvckVhY2goZGVwYXJ0bWVudCA9PiB7XG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVkVXNlcnMgPSB1c2Vycy5maWx0ZXIodSA9PiB1LmRlcGFydG1lbnQ/LnRvTG93ZXJDYXNlKCkgPT09IGRlcGFydG1lbnQudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgICAgZXhjbHVkZWRVc2Vycy5mb3JFYWNoKHVzZXIgPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdXNlcnMuaW5kZXhPZih1c2VyKTtcbiAgICAgICAgICB1c2Vycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBleGNsdWRlVXNlcnNCeVRpdGxlKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5kYXRhLmV4Y2x1c2lvbnMudGl0bGVzXG4gICAgICAuZm9yRWFjaCh0aXRsZSA9PiB7XG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVkVXNlcnMgPSB1c2Vycy5maWx0ZXIodSA9PiB1LnRpdGxlPy50b0xvd2VyQ2FzZSgpID09PSB0aXRsZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgXG4gICAgICAgIGV4Y2x1ZGVkVXNlcnMuZm9yRWFjaCh1c2VyID0+IHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHVzZXJzLmluZGV4T2YodXNlcik7XG4gICAgICAgICAgdXNlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gSW5jbHVzaW9ucyAtIG9ubHkgdGhlc2Ugd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZGF0YVNvdXJjZVxuICBwcml2YXRlIGluY2x1ZGVVc2Vyc0J5QWNjb3VudE5hbWUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICByZXR1cm4gdXNlcnMuZmlsdGVyKHVzZXIgPT5cbiAgICAgIHRoaXMuZGF0YS5pbmNsdXNpb25zLmFjY291bnROYW1lcy5sZW5ndGggPT09IDAgfHwgLy8gTm8gYWNjb3VudCBpbmNsdXNpb25zIHNwZWNpZmllZFxuXG4gICAgICB0aGlzLmRhdGEuaW5jbHVzaW9ucy5hY2NvdW50TmFtZXMuZmluZChhY2NvdW50TmFtZSA9PlxuICAgICAgICBhY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpID09PSB1c2VyLnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmNsdWRlVXNlcnNCeURlcGFydG1lbnQodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICByZXR1cm4gdXNlcnMuZmlsdGVyKHVzZXIgPT5cbiAgICAgIHRoaXMuZGF0YS5pbmNsdXNpb25zLmRlcGFydG1lbnRzLmxlbmd0aCA9PT0gMCB8fCAvLyBObyBkZXBhcnRtZW50IGluY2x1c2lvbnMgc3BlY2lmaWVkXG5cbiAgICAgIHRoaXMuZGF0YS5pbmNsdXNpb25zLmRlcGFydG1lbnRzLmZpbmQoZGVwYXJ0bWVudCA9PlxuICAgICAgICBkZXBhcnRtZW50LnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuZGVwYXJ0bWVudD8udG9Mb3dlckNhc2UoKVxuICAgICAgKSk7XG4gIH1cblxuICBwcml2YXRlIGluY2x1ZGVVc2Vyc0J5VGl0bGUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICByZXR1cm4gdXNlcnMuZmlsdGVyKHVzZXIgPT5cbiAgICAgIHRoaXMuZGF0YS5pbmNsdXNpb25zLnRpdGxlcy5sZW5ndGggPT09IDAgfHwgLy8gTm8gdGl0bGUgaW5jbHVzaW9ucyBzcGVjaWZpZWRcblxuICAgICAgdGhpcy5kYXRhLmluY2x1c2lvbnMudGl0bGVzLmZpbmQodGl0bGUgPT5cbiAgICAgICAgdGl0bGUudG9Mb3dlckNhc2UoKSA9PT0gdXNlci50aXRsZT8udG9Mb3dlckNhc2UoKVxuICAgICAgKSk7XG4gIH1cblxuICBwcml2YXRlIGluY2x1ZGVVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgaWYgKCF0aGlzLmRhdGEuaW5jbHVzaW9ucy5ncm91cHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdXNlcnM7IC8vIE5vIGdyb3VwIGluY2x1c2lvbnMgc3BlY2lmaWVkXG4gICAgfVxuXG4gICAgLy8gQ2hlYXRpbmcgYSBiaXQgYW5kIGxldmVyYWdpbmcgdGhlICdzZWxlY3RlZCcgcHJvcGVydHkgdG8ga2VlcCB0cmFjayBvZiB3aG8gc2hvdWxkIGJlIGluY2x1ZGVkXG4gICAgLy8gU2luY2UgaW5jbHVzaW9ucyBoYXBwZW4gYmVmb3IgcHJlLXNlbGVjdGlvbnMsIHdlIGNhbiBkbyB0aGF0LCBhcyBsb25nIGFzIHdlIHNldCAnc2VsZWN0ZWQnIGJhY2sgdG8gZmFsc2Ugd2hlbiB3ZSdyZSBkb25lXG4gICAgdGhpcy5kYXRhLmluY2x1c2lvbnMuZ3JvdXBzXG4gICAgICAuZm9yRWFjaChncm91cE5hbWUgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGcgPT4gZy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKCFncm91cCkgeyByZXR1cm47IH1cblxuICAgICAgICB1c2Vyc1xuICAgICAgICAgIC5maWx0ZXIodXNlciA9PlxuICAgICAgICAgICAgICBncm91cC5tZW1iZXIuZmluZChncm91cE1lbWJlckRuID0+IGdyb3VwTWVtYmVyRG4gPT09IHVzZXIuZGlzdGluZ3Vpc2hlZE5hbWUpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5mb3JFYWNoKHVzZXIgPT4gdXNlci5zZWxlY3RlZCA9IHRydWUpO1xuICAgICAgfSk7XG4gICAgICBcbiAgICAvLyBBdCB0aGlzIHBvaW50LCBhbGwgb2YgdGhlIGFwcHJvcHJpYXRlIHVzZXJzIHNob3VsZCBoYXZlICdzZWxlY3RlZCcgc2V0IHRvIHRydWVcbiAgICBjb25zdCBzZWxlY3RlZFVzZXJzID0gdXNlcnMuZmlsdGVyKHVzZXIgPT4gdXNlci5zZWxlY3RlZCk7IC8vIFN1YnNldCBvZiB0aGUgb3JpZ2luYWwgbGlzdFxuICAgIC8vIFJlc2V0ICdzZWxlY3RlZCcgdG8gZmFsc2UsIGFuZCByZXR1cm5cbiAgICBzZWxlY3RlZFVzZXJzLmZvckVhY2godXNlciA9PiB1c2VyLnNlbGVjdGVkID0gZmFsc2UpO1xuICAgIHJldHVybiBzZWxlY3RlZFVzZXJzO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiAgUHJlLVNlbGVjdGlvbnNcbiAgcHJpdmF0ZSBwcmVTZWxlY3RVc2Vyc0J5QWNjb3VudE5hbWUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICB0aGlzLmRhdGEucHJlU2VsZWN0aW9ucy5hY2NvdW50TmFtZXNcbiAgICAgIC5mb3JFYWNoKGFjY291bnROYW1lID0+IHtcbiAgICAgICAgY29uc3QgdXNlciA9IHVzZXJzLmZpbmQodSA9PiB1LnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkgPT09IGFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBpZiAoIXVzZXIpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgdXNlci5zZWxlY3RlZCA9IHRydWU7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuXG4gIHByaXZhdGUgcHJlU2VsZWN0VXNlcnNCeURlcGFydG1lbnQodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICB0aGlzLmRhdGEucHJlU2VsZWN0aW9ucy5kZXBhcnRtZW50c1xuICAgICAgLmZvckVhY2goZGVwYXJ0bWVudCA9PlxuICAgICAgICB1c2Vyc1xuICAgICAgICAgIC5maWx0ZXIodSA9PiB1LmRlcGFydG1lbnQ/LnRvTG93ZXJDYXNlKCkgPT09IGRlcGFydG1lbnQudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAuZm9yRWFjaCh1c2VyID0+IHVzZXIuc2VsZWN0ZWQgPSB0cnVlKVxuICAgICAgKTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuXG4gIHByaXZhdGUgcHJlU2VsZWN0VXNlcnNCeVRpdGxlKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5kYXRhLnByZVNlbGVjdGlvbnMudGl0bGVzXG4gICAgICAuZm9yRWFjaCh0aXRsZSA9PlxuICAgICAgICB1c2Vyc1xuICAgICAgICAgIC5maWx0ZXIodSA9PiB1LnRpdGxlPy50b0xvd2VyQ2FzZSgpID09PSB0aXRsZS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgIC5mb3JFYWNoKHVzZXIgPT4gdXNlci5zZWxlY3RlZCA9IHRydWUpXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVTZWxlY3RVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5kYXRhLnByZVNlbGVjdGlvbnMuZ3JvdXBzXG4gICAgICAuZm9yRWFjaChncm91cE5hbWUgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGcgPT4gZy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKCFncm91cCkgeyByZXR1cm47IH1cblxuICAgICAgICBncm91cC5tZW1iZXIuZm9yRWFjaChncm91cE1lbWJlckRuID0+IHtcbiAgICAgICAgICBjb25zdCB1c2VyID0gdXNlcnMuZmluZCh1ID0+IHUuZGlzdGluZ3Vpc2hlZE5hbWUgPT09IGdyb3VwTWVtYmVyRG4pO1xuICAgICAgICAgIGlmICghdXNlcikgeyByZXR1cm47IH1cblxuICAgICAgICAgIHVzZXIuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuICBcbiAgcHJpdmF0ZSBzZXRGaWx0ZXJQcmVkaWNhdGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRhdGFTb3VyY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyUHJlZGljYXRlID0gKHVzZXI6IFNlbGVjdGFibGVVc2VyLCBmaWx0ZXI6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGZpbHRlciA9PT0gJ3tzZWxlY3RlZDp0cnVlfScpIHtcbiAgICAgICAgcmV0dXJuIHVzZXIuc2VsZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoZmlsdGVyLCAnaScpOyAvLyBDYXNlLWluc2Vuc2l0aXZlXG4gICAgICAgIGxldCBtYXRjaCA9IGZhbHNlOyAvLyBUaGUgZW5kIHJlc3VsdCAtIHdoZXRoZXIgb3Igbm90IGEgZW1wbG95ZWUgbWF0Y2hlcyB0aGUgZmlsdGVyXG5cbiAgICAgICAgY29uc3QgZmlsdGVyUHJvcGVydGllcyA9IFsgJ2Rpc3BsYXlOYW1lJyBdO1xuICAgICAgICBpZiAodGhpcy5kYXRhLmZpbHRlck9wdGlvbnMuYWNjb3VudE5hbWUpIHtcbiAgICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzLnB1c2goJ3NBTUFjY291bnROYW1lJylcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhLmZpbHRlck9wdGlvbnMudGl0bGUpIHtcbiAgICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzLnB1c2goJ3RpdGxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGF0YS5maWx0ZXJPcHRpb25zLmRlcGFydG1lbnQpIHtcbiAgICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzLnB1c2goJ2RlcGFydG1lbnQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhLmZpbHRlck9wdGlvbnMucGhvbmVOdW1iZXIpIHtcbiAgICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzLnB1c2goJ3RlbGVwaG9uZU51bWJlcicpO1xuICAgICAgICB9XG4gIFxuICAgICAgICAvLyBNYXRjaCBvbiB0aGUgcHJvcGVydGllcyBjb25maWd1cmVkIGFib3ZlXG4gICAgICAgIGZpbHRlclByb3BlcnRpZXNcbiAgICAgICAgICAuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAodXNlcltmaWVsZF0gJiYgdXNlcltmaWVsZF0ubWF0Y2gocmVnZXgpKSB7XG4gICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgXG4gICAgICAgIC8vIE1hdGNoIG9uIGdyb3VwIG1lbWJlcnNoaXAgKGdyb3VwIG5hbWUpXG4gICAgICAgIGlmICh0aGlzLmRhdGEuZmlsdGVyT3B0aW9ucy5ncm91cE1lbWJlcnNoaXApIHtcbiAgICAgICAgICB1c2VyLm1lbWJlck9mLmZvckVhY2goZ3JvdXBEbiA9PiB7XG4gICAgICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGdyb3VwID0+IGdyb3VwLmRpc3Rpbmd1aXNoZWROYW1lID09PSBncm91cERuICYmIGdyb3VwLm5hbWUubWF0Y2gocmVnZXgpKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGdyb3VwKSB7XG4gICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5Gb3JGaWx0ZXJDaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyRm9ybS5nZXQoJ2ZpbHRlcicpPy52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoMjUwKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmRhdGFTb3VyY2UhLmZpbHRlciA9IHRoaXMuZmlsdGVyRm9ybS52YWx1ZS5maWx0ZXI/LnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuXG4gIHRvb2x0aXAodXNlcjogU2VsZWN0YWJsZVVzZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGEuc2hvd0dyb3VwTWVtYmVyc2hpcFRvb2x0aXBzID9cbiAgICAgIHVzZXIubWVtYmVyT2ZcbiAgICAgICAgLm1hcChncm91cERuID0+XG4gICAgICAgICAgdGhpcy5ncm91cHNcbiAgICAgICAgICAgID8uZmluZChncm91cCA9PlxuICAgICAgICAgICAgICBncm91cC5kaXN0aW5ndWlzaGVkTmFtZSA9PT0gZ3JvdXBEblxuICAgICAgICAgICAgKT8ubmFtZVxuICAgICAgICAgIClcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYSEgPiBiISA/IDEgOiAtMSlcbiAgICAgICAgICAuam9pbignXFxuJykgOlxuICAgICAgJyc7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG59XG4iLCI8ZGl2IGlkPVwiZGlhbG9nLXRpdGxlXCI+XG4gICAgPGgyIG1hdC1kaWFsb2ctdGl0bGU+e3sgZGF0YS50aXRsZSB9fTwvaDI+XG5cbiAgICA8ZGl2PlxuICAgICAgICB7eyBzZWxlY3RlZE9wdGlvbnMubGVuZ3RoIH19IHNlbGVjdGVkXG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICA8ZGl2ICpuZ0lmPVwiIShkYXRhU291cmNlICYmIHBob3RvcylcIj5cbiAgICAgICAgPG1hdC1zcGlubmVyIFtkaWFtZXRlcl09XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgIDxoMiBpZD1cInNwaW5uZXItbWVzc2FnZVwiPkdldHRpbmcgdXNlcnMgYW5kIHBob3Rvcy4uLjwvaDI+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YVNvdXJjZSAmJiBwaG90b3NcIj5cbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCI+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJkYXRhU291cmNlXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiU2VhcmNoXCIgZm9ybUNvbnRyb2xOYW1lPVwiZmlsdGVyXCIgI2ZpbHRlcklucHV0PlxuXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImZpbHRlckZvcm0udmFsdWUuZmlsdGVyXCIgbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvbiBhcmlhLWxhYmVsPVwiQ2xlYXJcIiAoY2xpY2spPVwiZmlsdGVyRm9ybS5nZXQoJ2ZpbHRlcicpPy5zZXRWYWx1ZSgnJylcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiY2xvc2VcIj48L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9mb3JtPlxuXG4gICAgICAgIDxtYXQtc2VsZWN0aW9uLWxpc3QgW211bHRpcGxlXT1cImlzTXVsdGlNb2RlXCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwibGlzdFNlbGVjdGlvbkNoYW5nZWQoJGV2ZW50Lm9wdGlvbnMpXCI+XG5cbiAgICAgICAgICAgIDxtYXQtbGlzdC1vcHRpb24gKm5nRm9yPVwibGV0IHVzZXIgb2YgZGF0YVNvdXJjZT8uZmlsdGVyZWREYXRhXCIgW3ZhbHVlXT1cInVzZXJcIiBbc2VsZWN0ZWRdPVwidXNlci5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cIm9wdGlvblNlbGVjdGlvbkNoYW5nZWQob3B0aW9uKVwiICNvcHRpb24+XG5cbiAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiZ2V0UGhvdG8odXNlcilcIiBtYXRMaXN0QXZhdGFyIGFsdD1cIlwiIFtzcmNdPVwiZ2V0UGhvdG8odXNlcilcIj5cblxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIiFnZXRQaG90byh1c2VyKVwiIG1hdExpc3RBdmF0YXIgY2xhc3M9XCJuby1waG90b1wiXG4gICAgICAgICAgICAgICAgICAgIGZvbnRJY29uPVwiYWNjb3VudF9jaXJjbGVcIj5cbiAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVzZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbbWF0VG9vbHRpcF09XCJ0b29sdGlwKHVzZXIpXCIgY2xhc3M9XCJ1c2VyLW5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHVzZXIuZGlzcGxheU5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJkYXRhLnNob3dQaG9uZSAmJiB1c2VyLnRlbGVwaG9uZU51bWJlclwiPnt7IHVzZXIudGVsZXBob25lTnVtYmVyIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPGRpdj57eyB1c2VyLmRlcGFydG1lbnQgfX08L2Rpdj5cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPnt7IHVzZXIudGl0bGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbWF0LWxpc3Qtb3B0aW9uPlxuICAgICAgICA8L21hdC1zZWxlY3Rpb24tbGlzdD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbWF0LWRpYWxvZy1jb250ZW50PlxuXG48bWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhU291cmNlICYmIHBob3Rvc1wiPlxuICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZSAqbmdJZj1cInNlbGVjdGVkT3B0aW9ucy5sZW5ndGhcIiAoY2hhbmdlKT1cImhpZGVVbnNlbGVjdGVkQ2hhbmdlZCgkZXZlbnQuY2hlY2tlZClcIj5cbiAgICAgICAgICAgIEhpZGUgVW5zZWxlY3RlZFxuICAgICAgICA8L21hdC1zbGlkZS10b2dnbGU+XG5cbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwic2VsZWN0QWxsKClcIlxuICAgICAgICAgICAgKm5nSWY9XCJpc011bHRpTW9kZVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwic2VsZWN0X2FsbFwiPjwvbWF0LWljb24+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhpZGUtbW9iaWxlXCI+U2VsZWN0IEFsbDwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgXG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImRlc2VsZWN0QWxsKClcIlxuICAgICAgICAgICAgKm5nSWY9XCJpc011bHRpTW9kZSAmJiBzZWxlY3RlZE9wdGlvbnMubGVuZ3RoXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJjbGVhcl9hbGxcIj48L21hdC1pY29uPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoaWRlLW1vYmlsZVwiPkNsZWFyIEFsbDwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzTXVsdGlNb2RlIHx8ICFkYXRhLmNsb3NlV2hlblNlbGVjdGlvbk1hZGVcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiY2xvc2UoKVwiIG1hdFRvb2x0aXA9XCJBY2NlcHQgeW91ciBzZWxlY3Rpb25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZE9wdGlvbnMubGVuZ3RoXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJjaGVja1wiPjwvbWF0LWljb24+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhpZGUtbW9iaWxlXCI+T2s8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cIndhcm5cIiBtYXQtZGlhbG9nLWNsb3NlIG1hdFRvb2x0aXA9XCJDbG9zZSB0aGlzIHdpbmRvd1wiPlxuICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJjbG9zZVwiPjwvbWF0LWljb24+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaGlkZS1tb2JpbGVcIj5DYW5jZWw8L3NwYW4+XG4gICAgPC9idXR0b24+XG48L21hdC1kaWFsb2ctYWN0aW9ucz4iXX0=
374
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jaG9vc2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2FjdGl2ZS1kaXJlY3RvcnkvZ3VpL3NyYy9jb21wb25lbnRzL3VzZXItY2hvb3Nlci91c2VyLWNob29zZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xlYXZlbGFuZHByaWNlL25neC1saWIvYWN0aXZlLWRpcmVjdG9yeS9ndWkvc3JjL2NvbXBvbmVudHMvdXNlci1jaG9vc2VyL3VzZXItY2hvb3Nlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQWdDLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFzQyxzQkFBc0IsSUFBSSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoSSxPQUFPLEVBQXdDLHNCQUFzQixJQUFJLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakksT0FBTyxFQUFFLHdCQUF3QixJQUFJLGtCQUFrQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEcsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTTlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTbkQsTUFBTSxPQUFPLG9CQUFvQjtJQXdDL0IsWUFBWTtJQUVaLG1CQUFtQjtJQUNuQixZQUE0QyxJQUFxQixFQUM3QyxTQUE2QyxFQUM3Qyxz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VyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNuRyxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQW9CO1FBQzFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxRQUFRO2lCQUNWLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUNiLElBQUksQ0FBQyxNQUFNO2dCQUNULEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ2IsS0FBSyxDQUFDLGlCQUFpQixLQUFLLE9BQU8sQ0FDcEMsRUFBRSxJQUFJLENBQ1I7aUJBQ0EsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBRSxHQUFHLENBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDakIsRUFBRSxDQUFDO0lBQ1AsQ0FBQzs7aUhBeGFVLG9CQUFvQixrQkEyQ1gsZUFBZTtxR0EzQ3hCLG9CQUFvQixtR0FFcEIsZ0JBQWdCLDZJQ3ZCN0IsODRHQWlGcUI7MkZENURSLG9CQUFvQjtrQkFQaEMsU0FBUzs7OzBCQWtESyxNQUFNOzJCQUFDLGVBQWU7a0pBekNOLGFBQWE7c0JBQXpDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNELFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBPbkluaXQsIFZpZXdDaGlsZCwgQWZ0ZXJWaWV3Q2hlY2tlZCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdExlZ2FjeURpYWxvZ1JlZiBhcyBNYXREaWFsb2dSZWYsIE1BVF9MRUdBQ1lfRElBTE9HX0RBVEEgYXMgTUFUX0RJQUxPR19EQVRBIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWRpYWxvZyc7XG5pbXBvcnQgeyBNYXRMZWdhY3lMaXN0T3B0aW9uIGFzIE1hdExpc3RPcHRpb24sIE1hdExlZ2FjeVNlbGVjdGlvbkxpc3QgYXMgTWF0U2VsZWN0aW9uTGlzdCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1saXN0JztcbmltcG9ydCB7IE1hdExlZ2FjeVRhYmxlRGF0YVNvdXJjZSBhcyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktdGFibGUnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQWN0aXZlRGlyZWN0b3J5U2VydmljZSwgR3JvdXAgfSBmcm9tICdAY2xlYXZlbGFuZHByaWNlL25neC1saWIvYWN0aXZlLWRpcmVjdG9yeSc7XG5pbXBvcnQgeyBTaGFyZVBvaW50U2VydmljZSwgUGhvdG9JdGVtIH0gZnJvbSAnQGNsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL3NoYXJlcG9pbnQnO1xuXG5pbXBvcnQgeyBTZWxlY3RhYmxlVXNlciB9IGZyb20gJy4uLy4uL21vZGVsL3NlbGVjdGFibGUtdXNlcic7XG5pbXBvcnQgeyBVc2VyQ2hvb3NlckRhdGEgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyLWNob29zZXItZGF0YSc7XG5pbXBvcnQgeyBVc2VyQ2hvb3Nlck1vZGUgfSBmcm9tICcuLi8uLi9wdWJsaWNfYXBpJztcblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLWNob29zZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtcbiAgICAnLi91c2VyLWNob29zZXIuY29tcG9uZW50LmNzcycsXG4gICAgJy4uLy4uLy4uLy4uLy4uL3N0eWxlcy9tYXQtaWNvbi5jc3MnXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgVXNlckNob29zZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0NoZWNrZWQge1xuICAvLyNyZWdpb24gRmllbGRzXG4gIEBWaWV3Q2hpbGQoTWF0U2VsZWN0aW9uTGlzdCkgc2VsZWN0aW9uTGlzdDogTWF0U2VsZWN0aW9uTGlzdCB8IHVuZGVmaW5lZDtcbiAgQFZpZXdDaGlsZCgnZmlsdGVySW5wdXQnKSBmaWx0ZXJJbnB1dDogRWxlbWVudFJlZiB8IHVuZGVmaW5lZDtcbiAgZmlsdGVySW5wdXRGb2N1c2VkID0gZmFsc2U7XG5cbiAgZmlsdGVyRm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIGZpbHRlcjogbmV3IEZvcm1Db250cm9sKClcbiAgfSk7XG5cbiAgZGF0YVNvdXJjZTogTWF0VGFibGVEYXRhU291cmNlPFNlbGVjdGFibGVVc2VyPiB8IHVuZGVmaW5lZDtcbiAgcGhvdG9zOiBQaG90b0l0ZW1bXSB8IHVuZGVmaW5lZDtcbiAgZ3JvdXBzOiBHcm91cFtdIHwgdW5kZWZpbmVkOyAvLyBNYXkgb3IgbWF5IG5vdCBnZXQgcG9wdWxhdGVkLCBkZXBlbmRpbmcgb24gY29uZmlnIGRhdGEgc2VudCBpblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gUHJvcGVydGllc1xuICBnZXQgaXNNdWx0aU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5tb2RlID09PSBVc2VyQ2hvb3Nlck1vZGUuTXVsdGlwbGU7XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRPcHRpb25zKCk6IE1hdExpc3RPcHRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uTGlzdD8ub3B0aW9ucy5maWx0ZXIobyA9PiBvLnNlbGVjdGVkKSA/PyBbXTtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZFVzZXJzKCk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2U/LmRhdGE/LmZpbHRlcihkID0+IGQuc2VsZWN0ZWQpID8/IFtdO1xuICB9XG5cbiAgZ2V0IGZpbHRlclZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyRm9ybS52YWx1ZS5maWx0ZXI7XG4gIH1cblxuICBnZXQgYWRHcm91cHNOZWVkZWQoKTogYm9vbGVhbiB7XG4gICAgLy8gSWYgYW55IGFyZSB0aGVzZSBhcmUgdHJ1ZSwgdGhlbiB3ZSBuZWVkIHRvIHB1bGwgQUQgZ3JvdXBzIGZvciB1c2UgbGF0ZXJcbiAgICByZXR1cm4gdGhpcy5kYXRhLnNob3dHcm91cE1lbWJlcnNoaXBUb29sdGlwcyB8fFxuICAgICAgdGhpcy5kYXRhLmV4Y2x1c2lvbnMuZ3JvdXBzLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRoaXMuZGF0YS5pbmNsdXNpb25zLmdyb3Vwcy5sZW5ndGggPiAwIHx8XG4gICAgICB0aGlzLmRhdGEucHJlU2VsZWN0aW9ucy5ncm91cHMubGVuZ3RoID4gMCB8fFxuICAgICAgdGhpcy5kYXRhLmZpbHRlck9wdGlvbnMuZ3JvdXBNZW1iZXJzaGlwO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBMaWZlY3ljbGVcbiAgY29uc3RydWN0b3IoQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBVc2VyQ2hvb3NlckRhdGEsXG4gICAgICAgICAgICAgIHByaXZhdGUgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8VXNlckNob29zZXJDb21wb25lbnQ+LFxuICAgICAgICAgICAgICBwcml2YXRlIGFjdGl2ZURpcmVjdG9yeVNlcnZpY2U6IEFjdGl2ZURpcmVjdG9yeVNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgc2hhcmVQb2ludFNlcnZpY2U6IFNoYXJlUG9pbnRTZXJ2aWNlKSB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAuLi5uZXcgVXNlckNob29zZXJEYXRhKCksXG4gICAgICAgICAgICAgICAgICAuLi5kYXRhXG4gICAgICAgICAgICAgICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZXREYXRhKCk7XG4gICAgdGhpcy5saXN0ZW5Gb3JGaWx0ZXJDaGFuZ2VzKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmlsdGVySW5wdXRGb2N1c2VkIHx8ICF0aGlzLmZpbHRlcklucHV0KSB7XG4gICAgICAvLyBDb250cm9sIG5vdCByZWFkeSB5ZXQsIG9yIGl0IGhhcyBhbHJlYWR5IGJlZW4gZ2l2ZW4gZm9jdXNcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZpbHRlcklucHV0Rm9jdXNlZCA9IHRydWU7XG4gICAgdGhpcy5maWx0ZXJJbnB1dD8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBFdmVudHNcbiAgIGxpc3RTZWxlY3Rpb25DaGFuZ2VkKG9wdGlvbnM6IE1hdExpc3RPcHRpb25bXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGEubW9kZSA9PT0gVXNlckNob29zZXJNb2RlLlNpbmdsZSAmJlxuICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbnMubGVuZ3RoICYmXG4gICAgICB0aGlzLmRhdGEuY2xvc2VXaGVuU2VsZWN0aW9uTWFkZVxuICAgICAgKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgb3B0aW9uU2VsZWN0aW9uQ2hhbmdlZChvcHRpb246IE1hdExpc3RPcHRpb24pOiB2b2lkIHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy5kYXRhU291cmNlPy5kYXRhXG4gICAgICAuZmluZCh1ID0+IHUuc0FNQWNjb3VudE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gKG9wdGlvbi52YWx1ZSBhcyBTZWxlY3RhYmxlVXNlcikuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSk7XG5cbiAgICBpZiAodXNlcikge1xuICAgICAgdXNlci5zZWxlY3RlZCA9IG9wdGlvbi5zZWxlY3RlZDtcbiAgICB9XG4gIH1cblxuICBoaWRlVW5zZWxlY3RlZENoYW5nZWQoc2VsZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlckZvcm0uZ2V0KCdmaWx0ZXInKT8uc2V0VmFsdWUoc2VsZWN0ZWQgPyAne3NlbGVjdGVkOnRydWV9JyA6IG51bGwpO1xuICB9XG5cbiAgc2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uTGlzdD8uc2VsZWN0QWxsKCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25MaXN0Py5vcHRpb25zKSB7XG4gICAgICB0aGlzLmxpc3RTZWxlY3Rpb25DaGFuZ2VkKHRoaXMuc2VsZWN0aW9uTGlzdD8ub3B0aW9ucy50b0FycmF5KCkpO1xuICAgIH1cbiAgfVxuXG4gIGRlc2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uTGlzdD8uZGVzZWxlY3RBbGwoKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gVXRpbGl0aWVzXG4gIHByaXZhdGUgZ2V0RGF0YSgpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhT2JzZXJ2YWJsZXM6IE9ic2VydmFibGU8YW55PltdID0gW1xuICAgICAgdGhpcy5kYXRhLnVzZXJzID9cbiAgICAgICAgLy8gVXNlcnMgd2VyZSBwYXNzZWQgaW5cbiAgICAgICAgb2YodGhpcy5kYXRhLnVzZXJzKSA6XG4gICAgICAgIC8vIFVzZXJzIG5lZWQgdG8gYmUgcmV0cmlldmVkXG4gICAgICAgIHRoaXMuYWN0aXZlRGlyZWN0b3J5U2VydmljZS5nZXRVc2VycyhmYWxzZSwgdGhpcy5kYXRhLmluY2x1ZGVEaXNhYmxlZFVzZXJzLCB0aGlzLmRhdGEucGFyZW50T3UpLFxuXG4gICAgICB0aGlzLmRhdGEucGhvdG9zID9cbiAgICAgICAgLy8gUGhvdG9zIHdlcmUgcGFzc2VkIGluXG4gICAgICAgIG9mKHRoaXMuZGF0YS5waG90b3MpIDpcbiAgICAgICAgLy8gUGhvdG9zIG5lZWQgdG8gYmUgcmV0cmlldmVkXG4gICAgICAgIHRoaXMuc2hhcmVQb2ludFNlcnZpY2UuZ2V0UGhvdG9zKClcbiAgICBdO1xuXG4gICAgLy8gRG8gd2UgbmVlZCBBRCBncm91cHM/XG4gICAgaWYgKHRoaXMuYWRHcm91cHNOZWVkZWQpIHtcbiAgICAgIHRoaXMuZGF0YS5ncm91cHMgP1xuICAgICAgICAvLyBHcm91cHMgd2VyZSBwYXNzZWQgaW5cbiAgICAgICAgb2YodGhpcy5kYXRhLmdyb3VwcykgOlxuICAgICAgICAvLyBHcm91cHMgbmVlZCB0byBiZSByZXRyaWV2ZWRcbiAgICAgICAgZGF0YU9ic2VydmFibGVzLnB1c2godGhpcy5hY3RpdmVEaXJlY3RvcnlTZXJ2aWNlLmdldEdyb3VwcygpKTtcbiAgICB9XG5cblxuICAgIGZvcmtKb2luKGRhdGFPYnNlcnZhYmxlcylcbiAgICAgIC8vLnN1YnNjcmliZSgoW3VzZXJzLCBwaG90b3NdKSA9PiB7XG4gICAgICAuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAvLyBOZWVkIGdyb3VwcyBpbiBwbGFjZSBiZWZvcmUgd2UgaGFuZGxlIGV4Y2x1c2lvbnMvaW5jbHVzaW9ucy9wcmUtc2VsZWN0aW9uc1xuICAgICAgICB0aGlzLmdyb3VwcyA9IHRoaXMuYWRHcm91cHNOZWVkZWQgPyBkYXRhWzJdIDogbnVsbDtcblxuICAgICAgICBsZXQgdXNlcnMgPSBkYXRhWzBdIGFzIFNlbGVjdGFibGVVc2VyW107XG4gICAgICAgIHVzZXJzLmZvckVhY2godSA9PiB1LnNlbGVjdGVkID0gZmFsc2UpOyAvLyBJbiBjYXNlIGV4aXN0aW5nIGRhdGEgd2FzIHJlLXVzZWRcbiAgICAgICAgdXNlcnMgPSB0aGlzLmluY2x1ZGVVc2Vyc0J5QWNjb3VudE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuaW5jbHVkZVVzZXJzQnlHcm91cE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuaW5jbHVkZVVzZXJzQnlEZXBhcnRtZW50KHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLmluY2x1ZGVVc2Vyc0J5VGl0bGUodXNlcnMpO1xuXG4gICAgICAgIHVzZXJzID0gdGhpcy5leGNsdWRlVXNlcnNCeUFjY291bnROYW1lKHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLmV4Y2x1ZGVVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLmV4Y2x1ZGVVc2Vyc0J5RGVwYXJ0bWVudCh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy5leGNsdWRlVXNlcnNCeVRpdGxlKHVzZXJzKTtcblxuICAgICAgICB1c2VycyA9IHRoaXMucHJlU2VsZWN0VXNlcnNCeUFjY291bnROYW1lKHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLnByZVNlbGVjdFVzZXJzQnlHcm91cE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMucHJlU2VsZWN0VXNlcnNCeURlcGFydG1lbnQodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMucHJlU2VsZWN0VXNlcnNCeVRpdGxlKHVzZXJzKTtcblxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHVzZXJzKTtcbiAgICAgIFxuICAgICAgICB0aGlzLnBob3RvcyA9IGRhdGFbMV07XG5cbiAgICAgICAgdGhpcy5zZXRGaWx0ZXJQcmVkaWNhdGUoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkVXNlcnMpIHtcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zZWxlY3RlZFVzZXJzXG4gICAgICAubWFwKHUgPT4gdGhpcy5kYXRhLnJldHVyblVzZXJPYmplY3RzID8gdSA6IHUuc0FNQWNjb3VudE5hbWUpO1xuXG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodGhpcy5kYXRhLm1vZGUgPT09IFVzZXJDaG9vc2VyTW9kZS5NdWx0aXBsZSA/XG4gICAgICB2YWx1ZSA6XG4gICAgICB2YWx1ZVswXVxuICAgICk7XG4gIH1cblxuICBnZXRQaG90byh1c2VyOiBTZWxlY3RhYmxlVXNlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGhvdG9zPy5maW5kKHAgPT5cbiAgICAgIChwLmVtcGxveWVlTnVtYmVyICYmIHAuZW1wbG95ZWVOdW1iZXIudG9TdHJpbmcoKSA9PT0gdXNlci5lbXBsb3llZU51bWJlcikgfHxcbiAgICAgIHAuYWNjb3VudE5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSB8fFxuICAgICAgcC5kaXNwbGF5TmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gdXNlci5kaXNwbGF5TmFtZS50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICBwLnRpdGxlPy50b0xvd2VyQ2FzZSgpID09PSB1c2VyLmRpc3BsYXlOYW1lLnRvTG93ZXJDYXNlKClcbiAgICApPy5lbmNvZGVkQWJzVXJsO1xuICB9XG5cbiAgLy8jcmVnaW9uIEV4Y2x1c2lvbnMgLSB3b24ndCBiZSBpbmNsdWRlZCBpbiB0aGUgZGF0YVNvdXJjZSBhdCBhbGxcbiAgcHJpdmF0ZSBleGNsdWRlVXNlcnNCeUFjY291bnROYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5kYXRhLmV4Y2x1c2lvbnMuYWNjb3VudE5hbWVzXG4gICAgICAuZm9yRWFjaChhY2NvdW50TmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdXNlcnMuZmluZEluZGV4KHUgPT4gdS5zQU1BY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpID09PSBhY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkgeyByZXR1cm47IH1cblxuICAgICAgICB1c2Vycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdXNlcnM7XG4gIH1cblxuICBwcml2YXRlIGV4Y2x1ZGVVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5kYXRhLmV4Y2x1c2lvbnMuZ3JvdXBzXG4gICAgICAuZm9yRWFjaChncm91cE5hbWUgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGcgPT4gZy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKCFncm91cCkgeyByZXR1cm47IH1cbiAgICAgICAgXG4gICAgICAgIGdyb3VwLm1lbWJlci5mb3JFYWNoKGdyb3VwTWVtYmVyRG4gPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdXNlcnMuZmluZEluZGV4KHUgPT4gdS5kaXN0aW5ndWlzaGVkTmFtZSA9PT0gZ3JvdXBNZW1iZXJEbik7XG4gICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkgeyByZXR1cm47IH1cblxuICAgICAgICAgIHVzZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdXNlcnM7XG4gIH1cblxuICBwcml2YXRlIGV4Y2x1ZGVVc2Vyc0J5RGVwYXJ0bWVudCh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuZGF0YS5leGNsdXNpb25zLmRlcGFydG1lbnRzXG4gICAgICAuZm9yRWFjaChkZXBhcnRtZW50ID0+IHtcbiAgICAgICAgY29uc3QgZXhjbHVkZWRVc2VycyA9IHVzZXJzLmZpbHRlcih1ID0+IHUuZGVwYXJ0bWVudD8udG9Mb3dlckNhc2UoKSA9PT0gZGVwYXJ0bWVudC50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgICBleGNsdWRlZFVzZXJzLmZvckVhY2godXNlciA9PiB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSB1c2Vycy5pbmRleE9mKHVzZXIpO1xuICAgICAgICAgIHVzZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdXNlcnM7XG4gIH1cblxuICBwcml2YXRlIGV4Y2x1ZGVVc2Vyc0J5VGl0bGUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICB0aGlzLmRhdGEuZXhjbHVzaW9ucy50aXRsZXNcbiAgICAgIC5mb3JFYWNoKHRpdGxlID0+IHtcbiAgICAgICAgY29uc3QgZXhjbHVkZWRVc2VycyA9IHVzZXJzLmZpbHRlcih1ID0+IHUudGl0bGU/LnRvTG93ZXJDYXNlKCkgPT09IHRpdGxlLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBcbiAgICAgICAgZXhjbHVkZWRVc2Vycy5mb3JFYWNoKHVzZXIgPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdXNlcnMuaW5kZXhPZih1c2VyKTtcbiAgICAgICAgICB1c2Vycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBJbmNsdXNpb25zIC0gb25seSB0aGVzZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkYXRhU291cmNlXG4gIHByaXZhdGUgaW5jbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHJldHVybiB1c2Vycy5maWx0ZXIodXNlciA9PlxuICAgICAgdGhpcy5kYXRhLmluY2x1c2lvbnMuYWNjb3VudE5hbWVzLmxlbmd0aCA9PT0gMCB8fCAvLyBObyBhY2NvdW50IGluY2x1c2lvbnMgc3BlY2lmaWVkXG5cbiAgICAgIHRoaXMuZGF0YS5pbmNsdXNpb25zLmFjY291bnROYW1lcy5maW5kKGFjY291bnROYW1lID0+XG4gICAgICAgIGFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgKSk7XG4gIH1cblxuICBwcml2YXRlIGluY2x1ZGVVc2Vyc0J5RGVwYXJ0bWVudCh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHJldHVybiB1c2Vycy5maWx0ZXIodXNlciA9PlxuICAgICAgdGhpcy5kYXRhLmluY2x1c2lvbnMuZGVwYXJ0bWVudHMubGVuZ3RoID09PSAwIHx8IC8vIE5vIGRlcGFydG1lbnQgaW5jbHVzaW9ucyBzcGVjaWZpZWRcblxuICAgICAgdGhpcy5kYXRhLmluY2x1c2lvbnMuZGVwYXJ0bWVudHMuZmluZChkZXBhcnRtZW50ID0+XG4gICAgICAgIGRlcGFydG1lbnQudG9Mb3dlckNhc2UoKSA9PT0gdXNlci5kZXBhcnRtZW50Py50b0xvd2VyQ2FzZSgpXG4gICAgICApKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5jbHVkZVVzZXJzQnlUaXRsZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHJldHVybiB1c2Vycy5maWx0ZXIodXNlciA9PlxuICAgICAgdGhpcy5kYXRhLmluY2x1c2lvbnMudGl0bGVzLmxlbmd0aCA9PT0gMCB8fCAvLyBObyB0aXRsZSBpbmNsdXNpb25zIHNwZWNpZmllZFxuXG4gICAgICB0aGlzLmRhdGEuaW5jbHVzaW9ucy50aXRsZXMuZmluZCh0aXRsZSA9PlxuICAgICAgICB0aXRsZS50b0xvd2VyQ2FzZSgpID09PSB1c2VyLnRpdGxlPy50b0xvd2VyQ2FzZSgpXG4gICAgICApKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5jbHVkZVVzZXJzQnlHcm91cE5hbWUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICBpZiAoIXRoaXMuZGF0YS5pbmNsdXNpb25zLmdyb3Vwcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB1c2VyczsgLy8gTm8gZ3JvdXAgaW5jbHVzaW9ucyBzcGVjaWZpZWRcbiAgICB9XG5cbiAgICAvLyBDaGVhdGluZyBhIGJpdCBhbmQgbGV2ZXJhZ2luZyB0aGUgJ3NlbGVjdGVkJyBwcm9wZXJ0eSB0byBrZWVwIHRyYWNrIG9mIHdobyBzaG91bGQgYmUgaW5jbHVkZWRcbiAgICAvLyBTaW5jZSBpbmNsdXNpb25zIGhhcHBlbiBiZWZvciBwcmUtc2VsZWN0aW9ucywgd2UgY2FuIGRvIHRoYXQsIGFzIGxvbmcgYXMgd2Ugc2V0ICdzZWxlY3RlZCcgYmFjayB0byBmYWxzZSB3aGVuIHdlJ3JlIGRvbmVcbiAgICB0aGlzLmRhdGEuaW5jbHVzaW9ucy5ncm91cHNcbiAgICAgIC5mb3JFYWNoKGdyb3VwTmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHM/LmZpbmQoZyA9PiBnLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gZ3JvdXBOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBpZiAoIWdyb3VwKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHVzZXJzXG4gICAgICAgICAgLmZpbHRlcih1c2VyID0+XG4gICAgICAgICAgICAgIGdyb3VwLm1lbWJlci5maW5kKGdyb3VwTWVtYmVyRG4gPT4gZ3JvdXBNZW1iZXJEbiA9PT0gdXNlci5kaXN0aW5ndWlzaGVkTmFtZSlcbiAgICAgICAgICApXG4gICAgICAgICAgLmZvckVhY2godXNlciA9PiB1c2VyLnNlbGVjdGVkID0gdHJ1ZSk7XG4gICAgICB9KTtcbiAgICAgIFxuICAgIC8vIEF0IHRoaXMgcG9pbnQsIGFsbCBvZiB0aGUgYXBwcm9wcmlhdGUgdXNlcnMgc2hvdWxkIGhhdmUgJ3NlbGVjdGVkJyBzZXQgdG8gdHJ1ZVxuICAgIGNvbnN0IHNlbGVjdGVkVXNlcnMgPSB1c2Vycy5maWx0ZXIodXNlciA9PiB1c2VyLnNlbGVjdGVkKTsgLy8gU3Vic2V0IG9mIHRoZSBvcmlnaW5hbCBsaXN0XG4gICAgLy8gUmVzZXQgJ3NlbGVjdGVkJyB0byBmYWxzZSwgYW5kIHJldHVyblxuICAgIHNlbGVjdGVkVXNlcnMuZm9yRWFjaCh1c2VyID0+IHVzZXIuc2VsZWN0ZWQgPSBmYWxzZSk7XG4gICAgcmV0dXJuIHNlbGVjdGVkVXNlcnM7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uICBQcmUtU2VsZWN0aW9uc1xuICBwcml2YXRlIHByZVNlbGVjdFVzZXJzQnlBY2NvdW50TmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuZGF0YS5wcmVTZWxlY3Rpb25zLmFjY291bnROYW1lc1xuICAgICAgLmZvckVhY2goYWNjb3VudE5hbWUgPT4ge1xuICAgICAgICBjb25zdCB1c2VyID0gdXNlcnMuZmluZCh1ID0+IHUuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGlmICghdXNlcikgeyByZXR1cm47IH1cblxuICAgICAgICB1c2VyLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVTZWxlY3RVc2Vyc0J5RGVwYXJ0bWVudCh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuZGF0YS5wcmVTZWxlY3Rpb25zLmRlcGFydG1lbnRzXG4gICAgICAuZm9yRWFjaChkZXBhcnRtZW50ID0+XG4gICAgICAgIHVzZXJzXG4gICAgICAgICAgLmZpbHRlcih1ID0+IHUuZGVwYXJ0bWVudD8udG9Mb3dlckNhc2UoKSA9PT0gZGVwYXJ0bWVudC50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgIC5mb3JFYWNoKHVzZXIgPT4gdXNlci5zZWxlY3RlZCA9IHRydWUpXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVTZWxlY3RVc2Vyc0J5VGl0bGUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICB0aGlzLmRhdGEucHJlU2VsZWN0aW9ucy50aXRsZXNcbiAgICAgIC5mb3JFYWNoKHRpdGxlID0+XG4gICAgICAgIHVzZXJzXG4gICAgICAgICAgLmZpbHRlcih1ID0+IHUudGl0bGU/LnRvTG93ZXJDYXNlKCkgPT09IHRpdGxlLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgLmZvckVhY2godXNlciA9PiB1c2VyLnNlbGVjdGVkID0gdHJ1ZSlcbiAgICAgICk7XG5cbiAgICByZXR1cm4gdXNlcnM7XG4gIH1cblxuICBwcml2YXRlIHByZVNlbGVjdFVzZXJzQnlHcm91cE5hbWUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICB0aGlzLmRhdGEucHJlU2VsZWN0aW9ucy5ncm91cHNcbiAgICAgIC5mb3JFYWNoKGdyb3VwTmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHM/LmZpbmQoZyA9PiBnLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gZ3JvdXBOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBpZiAoIWdyb3VwKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGdyb3VwLm1lbWJlci5mb3JFYWNoKGdyb3VwTWVtYmVyRG4gPT4ge1xuICAgICAgICAgIGNvbnN0IHVzZXIgPSB1c2Vycy5maW5kKHUgPT4gdS5kaXN0aW5ndWlzaGVkTmFtZSA9PT0gZ3JvdXBNZW1iZXJEbik7XG4gICAgICAgICAgaWYgKCF1c2VyKSB7IHJldHVybjsgfVxuXG4gICAgICAgICAgdXNlci5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdXNlcnM7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG4gIFxuICBwcml2YXRlIHNldEZpbHRlclByZWRpY2F0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXJQcmVkaWNhdGUgPSAodXNlcjogU2VsZWN0YWJsZVVzZXIsIGZpbHRlcjogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoZmlsdGVyID09PSAne3NlbGVjdGVkOnRydWV9Jykge1xuICAgICAgICByZXR1cm4gdXNlci5zZWxlY3RlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChmaWx0ZXIsICdpJyk7IC8vIENhc2UtaW5zZW5zaXRpdmVcbiAgICAgICAgbGV0IG1hdGNoID0gZmFsc2U7IC8vIFRoZSBlbmQgcmVzdWx0IC0gd2hldGhlciBvciBub3QgYSBlbXBsb3llZSBtYXRjaGVzIHRoZSBmaWx0ZXJcblxuICAgICAgICBjb25zdCBmaWx0ZXJQcm9wZXJ0aWVzID0gWyAnZGlzcGxheU5hbWUnIF07XG4gICAgICAgIGlmICh0aGlzLmRhdGEuZmlsdGVyT3B0aW9ucy5hY2NvdW50TmFtZSkge1xuICAgICAgICAgIGZpbHRlclByb3BlcnRpZXMucHVzaCgnc0FNQWNjb3VudE5hbWUnKVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRhdGEuZmlsdGVyT3B0aW9ucy50aXRsZSkge1xuICAgICAgICAgIGZpbHRlclByb3BlcnRpZXMucHVzaCgndGl0bGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhLmZpbHRlck9wdGlvbnMuZGVwYXJ0bWVudCkge1xuICAgICAgICAgIGZpbHRlclByb3BlcnRpZXMucHVzaCgnZGVwYXJ0bWVudCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRhdGEuZmlsdGVyT3B0aW9ucy5waG9uZU51bWJlcikge1xuICAgICAgICAgIGZpbHRlclByb3BlcnRpZXMucHVzaCgndGVsZXBob25lTnVtYmVyJyk7XG4gICAgICAgIH1cbiAgXG4gICAgICAgIC8vIE1hdGNoIG9uIHRoZSBwcm9wZXJ0aWVzIGNvbmZpZ3VyZWQgYWJvdmVcbiAgICAgICAgZmlsdGVyUHJvcGVydGllc1xuICAgICAgICAgIC5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh1c2VyW2ZpZWxkXSAmJiB1c2VyW2ZpZWxkXS5tYXRjaChyZWdleCkpIHtcbiAgICAgICAgICAgICAgbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICBcbiAgICAgICAgLy8gTWF0Y2ggb24gZ3JvdXAgbWVtYmVyc2hpcCAoZ3JvdXAgbmFtZSlcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5maWx0ZXJPcHRpb25zLmdyb3VwTWVtYmVyc2hpcCkge1xuICAgICAgICAgIHVzZXIubWVtYmVyT2YuZm9yRWFjaChncm91cERuID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHM/LmZpbmQoZ3JvdXAgPT4gZ3JvdXAuZGlzdGluZ3Vpc2hlZE5hbWUgPT09IGdyb3VwRG4gJiYgZ3JvdXAubmFtZS5tYXRjaChyZWdleCkpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoZ3JvdXApIHtcbiAgICAgICAgICAgICAgbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGxpc3RlbkZvckZpbHRlckNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJGb3JtLmdldCgnZmlsdGVyJyk/LnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgyNTApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuZGF0YVNvdXJjZSEuZmlsdGVyID0gdGhpcy5maWx0ZXJGb3JtLnZhbHVlLmZpbHRlcj8udHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuICB9XG5cbiAgdG9vbHRpcCh1c2VyOiBTZWxlY3RhYmxlVXNlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5zaG93R3JvdXBNZW1iZXJzaGlwVG9vbHRpcHMgP1xuICAgICAgdXNlci5tZW1iZXJPZlxuICAgICAgICAubWFwKGdyb3VwRG4gPT5cbiAgICAgICAgICB0aGlzLmdyb3Vwc1xuICAgICAgICAgICAgPy5maW5kKGdyb3VwID0+XG4gICAgICAgICAgICAgIGdyb3VwLmRpc3Rpbmd1aXNoZWROYW1lID09PSBncm91cERuXG4gICAgICAgICAgICApPy5uYW1lXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhISA+IGIhID8gMSA6IC0xKVxuICAgICAgICAgIC5qb2luKCdcXG4nKSA6XG4gICAgICAnJztcbiAgfVxuICAvLyNlbmRyZWdpb25cbn1cbiIsIjxkaXYgaWQ9XCJkaWFsb2ctdGl0bGVcIj5cbiAgICA8aDIgbWF0LWRpYWxvZy10aXRsZT57eyBkYXRhLnRpdGxlIH19PC9oMj5cblxuICAgIDxkaXY+XG4gICAgICAgIHt7IHNlbGVjdGVkT3B0aW9ucy5sZW5ndGggfX0gc2VsZWN0ZWRcbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48bWF0LWRpYWxvZy1jb250ZW50PlxuICAgIDxkaXYgKm5nSWY9XCIhKGRhdGFTb3VyY2UgJiYgcGhvdG9zKVwiPlxuICAgICAgICA8bWF0LXNwaW5uZXIgW2RpYW1ldGVyXT1cIjUwXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgPGgyIGlkPVwic3Bpbm5lci1tZXNzYWdlXCI+R2V0dGluZyB1c2VycyBhbmQgcGhvdG9zLi4uPC9oMj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhU291cmNlICYmIHBob3Rvc1wiPlxuICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1cIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImRhdGFTb3VyY2VcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIiBmb3JtQ29udHJvbE5hbWU9XCJmaWx0ZXJcIiAjZmlsdGVySW5wdXQ+XG5cbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZmlsdGVyRm9ybS52YWx1ZS5maWx0ZXJcIiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIGFyaWEtbGFiZWw9XCJDbGVhclwiIChjbGljayk9XCJmaWx0ZXJGb3JtLmdldCgnZmlsdGVyJyk/LnNldFZhbHVlKCcnKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJjbG9zZVwiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Zvcm0+XG5cbiAgICAgICAgPG1hdC1zZWxlY3Rpb24tbGlzdCBbbXVsdGlwbGVdPVwiaXNNdWx0aU1vZGVcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJsaXN0U2VsZWN0aW9uQ2hhbmdlZCgkZXZlbnQub3B0aW9ucylcIj5cblxuICAgICAgICAgICAgPG1hdC1saXN0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdXNlciBvZiBkYXRhU291cmNlPy5maWx0ZXJlZERhdGFcIiBbdmFsdWVdPVwidXNlclwiIFtzZWxlY3RlZF09XCJ1c2VyLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwib3B0aW9uU2VsZWN0aW9uQ2hhbmdlZChvcHRpb24pXCIgI29wdGlvbj5cblxuICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJnZXRQaG90byh1c2VyKVwiIG1hdExpc3RBdmF0YXIgYWx0PVwiXCIgW3NyY109XCJnZXRQaG90byh1c2VyKVwiPlxuXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiIWdldFBob3RvKHVzZXIpXCIgbWF0TGlzdEF2YXRhciBjbGFzcz1cIm5vLXBob3RvXCJcbiAgICAgICAgICAgICAgICAgICAgZm9udEljb249XCJhY2NvdW50X2NpcmNsZVwiPlxuICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFttYXRUb29sdGlwXT1cInRvb2x0aXAodXNlcilcIiBjbGFzcz1cInVzZXItbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdXNlci5kaXNwbGF5TmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRhdGEuc2hvd1Bob25lICYmIHVzZXIudGVsZXBob25lTnVtYmVyXCI+e3sgdXNlci50ZWxlcGhvbmVOdW1iZXIgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7IHVzZXIuZGVwYXJ0bWVudCB9fTwvZGl2PlxuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3sgdXNlci50aXRsZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9tYXQtbGlzdC1vcHRpb24+XG4gICAgICAgIDwvbWF0LXNlbGVjdGlvbi1saXN0PlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG5cbjxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGFTb3VyY2UgJiYgcGhvdG9zXCI+XG4gICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlICpuZ0lmPVwic2VsZWN0ZWRPcHRpb25zLmxlbmd0aFwiIChjaGFuZ2UpPVwiaGlkZVVuc2VsZWN0ZWRDaGFuZ2VkKCRldmVudC5jaGVja2VkKVwiPlxuICAgICAgICAgICAgSGlkZSBVbnNlbGVjdGVkXG4gICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cblxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJzZWxlY3RBbGwoKVwiXG4gICAgICAgICAgICAqbmdJZj1cImlzTXVsdGlNb2RlXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJzZWxlY3RfYWxsXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGlkZS1tb2JpbGVcIj5TZWxlY3QgQWxsPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICBcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZGVzZWxlY3RBbGwoKVwiXG4gICAgICAgICAgICAqbmdJZj1cImlzTXVsdGlNb2RlICYmIHNlbGVjdGVkT3B0aW9ucy5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImNsZWFyX2FsbFwiPjwvbWF0LWljb24+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhpZGUtbW9iaWxlXCI+Q2xlYXIgQWxsPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNNdWx0aU1vZGUgfHwgIWRhdGEuY2xvc2VXaGVuU2VsZWN0aW9uTWFkZVwiIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJjbG9zZSgpXCIgbWF0VG9vbHRpcD1cIkFjY2VwdCB5b3VyIHNlbGVjdGlvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkT3B0aW9ucy5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImNoZWNrXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGlkZS1tb2JpbGVcIj5Pazwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwid2FyblwiIG1hdC1kaWFsb2ctY2xvc2UgbWF0VG9vbHRpcD1cIkNsb3NlIHRoaXMgd2luZG93XCI+XG4gICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImNsb3NlXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoaWRlLW1vYmlsZVwiPkNhbmNlbDwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbjwvbWF0LWRpYWxvZy1hY3Rpb25zPiJdfQ==