@alfresco/adf-process-services-cloud 8.1.0-16500060130 → 8.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/assets/adf-process-services-cloud/i18n/de.json +0 -3
- package/bundles/assets/adf-process-services-cloud/i18n/es.json +0 -3
- package/bundles/assets/adf-process-services-cloud/i18n/fr.json +0 -3
- package/bundles/assets/adf-process-services-cloud/i18n/it.json +0 -3
- package/bundles/assets/adf-process-services-cloud/i18n/pl.json +0 -3
- package/bundles/assets/adf-process-services-cloud/i18n/pt.json +0 -3
- package/fesm2022/adf-process-services-cloud.mjs +490 -410
- package/fesm2022/adf-process-services-cloud.mjs.map +1 -1
- package/lib/app/services/apps-process-cloud.service.d.ts +2 -2
- package/lib/form/components/widgets/display-rich-text/display-rich-text.widget.scss +0 -1
- package/lib/process/start-process/components/start-process-cloud.component.d.ts +0 -1
- package/lib/process/start-process/components/start-process-cloud.component.scss +4 -0
- package/lib/process/start-process/services/start-process-cloud.service.d.ts +1 -0
- package/lib/process-services-cloud.module.d.ts +2 -1
- package/lib/screen/components/screen-cloud/screen-cloud.component.d.ts +1 -1
- package/lib/screen/public-api.d.ts +3 -1
- package/lib/screen/services/provide-screen.d.ts +37 -0
- package/lib/{services → screen/services}/screen-rendering.service.d.ts +29 -0
- package/lib/services/public-api.d.ts +0 -1
- package/lib/task/task-filters/components/base-task-filters-cloud.component.d.ts +1 -1
- package/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.d.ts +1 -1
- package/lib/task/task-list/components/base-task-list-cloud.component.d.ts +1 -1
- package/package.json +4 -6
- package/esm2022/adf-process-services-cloud.mjs +0 -5
- package/esm2022/lib/app/app-list-cloud.module.mjs +0 -20
- package/esm2022/lib/app/components/app-details-cloud/app-details-cloud.component.mjs +0 -67
- package/esm2022/lib/app/components/app-list-cloud/app-list-cloud.component.mjs +0 -125
- package/esm2022/lib/app/models/application-instance.model.mjs +0 -24
- package/esm2022/lib/app/public-api.mjs +0 -22
- package/esm2022/lib/app/services/apps-process-cloud.service.mjs +0 -97
- package/esm2022/lib/common/date-range-filter/date-range-filter.component.mjs +0 -163
- package/esm2022/lib/common/date-range-filter/date-range-filter.service.mjs +0 -97
- package/esm2022/lib/common/index.mjs +0 -18
- package/esm2022/lib/common/interface/environment.interface.mjs +0 -18
- package/esm2022/lib/common/interface/index.mjs +0 -18
- package/esm2022/lib/common/interface/public-api.mjs +0 -18
- package/esm2022/lib/common/public-api.mjs +0 -19
- package/esm2022/lib/form/components/cloud-form-rendering.service.mjs +0 -57
- package/esm2022/lib/form/components/form-cloud-custom-outcomes.component.mjs +0 -31
- package/esm2022/lib/form/components/form-cloud.component.mjs +0 -420
- package/esm2022/lib/form/components/form-definition-selector-cloud.component.mjs +0 -53
- package/esm2022/lib/form/components/spinner/form-spinner.component.mjs +0 -35
- package/esm2022/lib/form/components/widgets/attach-file/attach-file-cloud-widget.component.mjs +0 -249
- package/esm2022/lib/form/components/widgets/attach-file/file-properties-table/file-properties-table-cloud.component.mjs +0 -136
- package/esm2022/lib/form/components/widgets/data-table/data-table-adapter.widget.mjs +0 -107
- package/esm2022/lib/form/components/widgets/data-table/data-table.widget.mjs +0 -120
- package/esm2022/lib/form/components/widgets/data-table/helpers/data-table-path-parser.helper.mjs +0 -122
- package/esm2022/lib/form/components/widgets/date/date-cloud.widget.mjs +0 -189
- package/esm2022/lib/form/components/widgets/display-external-property/display-external-property.widget.mjs +0 -85
- package/esm2022/lib/form/components/widgets/display-rich-text/display-rich-text.widget.mjs +0 -80
- package/esm2022/lib/form/components/widgets/dropdown/dropdown-cloud.widget.mjs +0 -464
- package/esm2022/lib/form/components/widgets/dropdown/validators.mjs +0 -29
- package/esm2022/lib/form/components/widgets/file-viewer/file-viewer.widget.mjs +0 -46
- package/esm2022/lib/form/components/widgets/group/group-cloud.widget.mjs +0 -82
- package/esm2022/lib/form/components/widgets/people/people-cloud.widget.mjs +0 -91
- package/esm2022/lib/form/components/widgets/properties-viewer/properties-viewer-wrapper/properties-viewer-wrapper.component.mjs +0 -81
- package/esm2022/lib/form/components/widgets/properties-viewer/properties-viewer.widget.mjs +0 -53
- package/esm2022/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.schema.mjs +0 -86
- package/esm2022/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.widget.mjs +0 -116
- package/esm2022/lib/form/components/widgets/upload/upload-cloud.widget.mjs +0 -187
- package/esm2022/lib/form/form-cloud.module.mjs +0 -99
- package/esm2022/lib/form/models/form-cloud-representation.model.mjs +0 -48
- package/esm2022/lib/form/models/task-variable-cloud.model.mjs +0 -28
- package/esm2022/lib/form/public-api.mjs +0 -44
- package/esm2022/lib/form/services/content-cloud-node-selector.service.mjs +0 -120
- package/esm2022/lib/form/services/display-mode.service.mjs +0 -146
- package/esm2022/lib/form/services/form-cloud.service.interface.mjs +0 -18
- package/esm2022/lib/form/services/form-cloud.service.mjs +0 -201
- package/esm2022/lib/form/services/form-definition-selector-cloud.service.interface.mjs +0 -18
- package/esm2022/lib/form/services/form-definition-selector-cloud.service.mjs +0 -51
- package/esm2022/lib/form/services/form-utils.service.mjs +0 -37
- package/esm2022/lib/form/services/process-cloud-content.service.mjs +0 -71
- package/esm2022/lib/form/services/spinner/form-cloud-spinner.service.mjs +0 -52
- package/esm2022/lib/group/components/group-cloud.component.mjs +0 -423
- package/esm2022/lib/group/group-cloud.module.mjs +0 -33
- package/esm2022/lib/group/models/identity-group.model.mjs +0 -18
- package/esm2022/lib/group/public-api.mjs +0 -21
- package/esm2022/lib/group/services/identity-group.service.mjs +0 -89
- package/esm2022/lib/models/application-version.model.mjs +0 -21
- package/esm2022/lib/models/constant-values.type.mjs +0 -18
- package/esm2022/lib/models/data-column-custom-data.mjs +0 -18
- package/esm2022/lib/models/date-cloud-filter.model.mjs +0 -31
- package/esm2022/lib/models/date-format-cloud.model.mjs +0 -18
- package/esm2022/lib/models/engine-event-cloud.model.mjs +0 -18
- package/esm2022/lib/models/filter-cloud-model.mjs +0 -128
- package/esm2022/lib/models/process-definition-cloud.model.mjs +0 -32
- package/esm2022/lib/models/process-instance-variable.model.mjs +0 -18
- package/esm2022/lib/models/process-variable-filter.model.mjs +0 -18
- package/esm2022/lib/models/task-cloud.model.mjs +0 -23
- package/esm2022/lib/models/task-list-sorting.model.mjs +0 -40
- package/esm2022/lib/models/variable-definition.mjs +0 -18
- package/esm2022/lib/people/components/people-cloud.component.mjs +0 -498
- package/esm2022/lib/people/models/identity-user.model.mjs +0 -18
- package/esm2022/lib/people/people-cloud.module.mjs +0 -33
- package/esm2022/lib/people/public-api.mjs +0 -21
- package/esm2022/lib/people/services/identity-user.service.mjs +0 -119
- package/esm2022/lib/process/process-cloud.module.mjs +0 -40
- package/esm2022/lib/process/process-filters/components/edit-process-filter/edit-process-filter-cloud.component.mjs +0 -801
- package/esm2022/lib/process/process-filters/components/process-filter-dialog/process-filter-dialog-cloud.component.mjs +0 -58
- package/esm2022/lib/process/process-filters/components/process-filters/process-filters-cloud.component.mjs +0 -292
- package/esm2022/lib/process/process-filters/models/process-filter-cloud.model.mjs +0 -170
- package/esm2022/lib/process/process-filters/process-filters-cloud.module.mjs +0 -44
- package/esm2022/lib/process/process-filters/public-api.mjs +0 -23
- package/esm2022/lib/process/process-filters/services/process-filter-cloud.service.mjs +0 -408
- package/esm2022/lib/process/process-header/components/process-header-cloud.component.mjs +0 -137
- package/esm2022/lib/process/process-header/process-header-cloud.module.mjs +0 -33
- package/esm2022/lib/process/process-header/public-api.mjs +0 -19
- package/esm2022/lib/process/process-list/components/process-list-cloud.component.mjs +0 -593
- package/esm2022/lib/process/process-list/datatable/process-list-datatable-adapter.mjs +0 -31
- package/esm2022/lib/process/process-list/models/perocess-instance-cloud-view.model.mjs +0 -18
- package/esm2022/lib/process/process-list/models/process-cloud-preferences.mjs +0 -24
- package/esm2022/lib/process/process-list/models/process-cloud-preset.model.mjs +0 -37
- package/esm2022/lib/process/process-list/models/process-cloud-query-request.model.mjs +0 -107
- package/esm2022/lib/process/process-list/models/process-list-sorting.model.mjs +0 -40
- package/esm2022/lib/process/process-list/process-list-cloud.module.mjs +0 -45
- package/esm2022/lib/process/process-list/public-api.mjs +0 -25
- package/esm2022/lib/process/process-list/services/process-list-cloud.service.mjs +0 -253
- package/esm2022/lib/process/process-list/services/process-task-list-cloud.service.mjs +0 -109
- package/esm2022/lib/process/public-api.mjs +0 -23
- package/esm2022/lib/process/services/process-cloud.service.mjs +0 -105
- package/esm2022/lib/process/start-process/components/start-process-cloud.component.mjs +0 -465
- package/esm2022/lib/process/start-process/models/process-instance-cloud.model.mjs +0 -18
- package/esm2022/lib/process/start-process/models/process-payload-cloud.model.mjs +0 -26
- package/esm2022/lib/process/start-process/models/process-with-form-payload-cloud.model.mjs +0 -26
- package/esm2022/lib/process/start-process/public-api.mjs +0 -21
- package/esm2022/lib/process/start-process/services/start-process-cloud.service.mjs +0 -125
- package/esm2022/lib/process-services-cloud.module.mjs +0 -98
- package/esm2022/lib/providers.mjs +0 -45
- package/esm2022/lib/screen/components/screen-cloud/screen-cloud.component.mjs +0 -186
- package/esm2022/lib/screen/models/screen-cloud.model.mjs +0 -18
- package/esm2022/lib/screen/public-api.mjs +0 -18
- package/esm2022/lib/services/base-cloud.service.mjs +0 -83
- package/esm2022/lib/services/cloud-token.service.mjs +0 -23
- package/esm2022/lib/services/form-fields.interfaces.mjs +0 -55
- package/esm2022/lib/services/local-preference-cloud.service.mjs +0 -122
- package/esm2022/lib/services/notification-cloud.service.mjs +0 -45
- package/esm2022/lib/services/preference-cloud.interface.mjs +0 -18
- package/esm2022/lib/services/public-api.mjs +0 -28
- package/esm2022/lib/services/screen-rendering.service.mjs +0 -30
- package/esm2022/lib/services/task-list-cloud.service.interface.mjs +0 -18
- package/esm2022/lib/services/user-preference-cloud.service.mjs +0 -105
- package/esm2022/lib/services/variable-mapper.sevice.mjs +0 -77
- package/esm2022/lib/services/web-socket.service.mjs +0 -146
- package/esm2022/lib/task/models/start-task-cloud-request.model.mjs +0 -32
- package/esm2022/lib/task/models/task-details-cloud.model.mjs +0 -26
- package/esm2022/lib/task/models/task.model.mjs +0 -23
- package/esm2022/lib/task/public-api.mjs +0 -26
- package/esm2022/lib/task/services/task-cloud.service.mjs +0 -272
- package/esm2022/lib/task/task-cloud.module.mjs +0 -45
- package/esm2022/lib/task/task-filters/components/base-task-filters-cloud.component.mjs +0 -59
- package/esm2022/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.mjs +0 -467
- package/esm2022/lib/task/task-filters/components/edit-task-filters/edit-service-task-filter/edit-service-task-filter-cloud.component.mjs +0 -205
- package/esm2022/lib/task/task-filters/components/edit-task-filters/edit-task-filter/edit-task-filter-cloud.component.mjs +0 -317
- package/esm2022/lib/task/task-filters/components/service-task-filters/service-task-filters-cloud.component.mjs +0 -146
- package/esm2022/lib/task/task-filters/components/task-assignment-filter/task-assignment-filter.component.mjs +0 -142
- package/esm2022/lib/task/task-filters/components/task-filter-dialog/task-filter-dialog-cloud.component.mjs +0 -72
- package/esm2022/lib/task/task-filters/components/task-filters/task-filters-cloud.component.mjs +0 -255
- package/esm2022/lib/task/task-filters/models/filter-cloud.model.mjs +0 -207
- package/esm2022/lib/task/task-filters/public-api.mjs +0 -27
- package/esm2022/lib/task/task-filters/services/service-task-filter-cloud.service.mjs +0 -283
- package/esm2022/lib/task/task-filters/services/task-filter-cloud.service.mjs +0 -392
- package/esm2022/lib/task/task-filters/task-filters-cloud.module.mjs +0 -56
- package/esm2022/lib/task/task-form/components/task-form-cloud/task-form-cloud.component.mjs +0 -231
- package/esm2022/lib/task/task-form/components/user-task-cloud/complete-task/complete-task.directive.mjs +0 -89
- package/esm2022/lib/task/task-form/components/user-task-cloud/user-task-cloud.component.mjs +0 -309
- package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/claim-task/claim-task-cloud.directive.mjs +0 -101
- package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/unclaim-task/unclaim-task-cloud.directive.mjs +0 -87
- package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/user-task-cloud-buttons.component.mjs +0 -85
- package/esm2022/lib/task/task-form/public-api.mjs +0 -21
- package/esm2022/lib/task/task-form/task-form.module.mjs +0 -36
- package/esm2022/lib/task/task-header/components/task-header-cloud.component.mjs +0 -280
- package/esm2022/lib/task/task-header/public-api.mjs +0 -19
- package/esm2022/lib/task/task-header/task-header-cloud.module.mjs +0 -33
- package/esm2022/lib/task/task-list/components/base-task-list-cloud.component.mjs +0 -331
- package/esm2022/lib/task/task-list/components/service-task-list/service-task-list-cloud.component.mjs +0 -115
- package/esm2022/lib/task/task-list/components/task-list/datatable/task-list-datatable-adapter.mjs +0 -31
- package/esm2022/lib/task/task-list/components/task-list/task-list-cloud.component.mjs +0 -389
- package/esm2022/lib/task/task-list/models/service-task-cloud.model.mjs +0 -18
- package/esm2022/lib/task/task-list/models/task-cloud-view.model.mjs +0 -18
- package/esm2022/lib/task/task-list/public-api.mjs +0 -23
- package/esm2022/lib/task/task-list/services/service-task-list-cloud.service.mjs +0 -115
- package/esm2022/lib/task/task-list/services/task-list-cloud.service.mjs +0 -178
- package/esm2022/lib/task/task-list/task-list-cloud.module.mjs +0 -35
- package/esm2022/lib/types.mjs +0 -18
- package/esm2022/public-api.mjs +0 -40
- /package/lib/screen/{models → components/screen-cloud}/screen-cloud.model.d.ts +0 -0
|
@@ -1,498 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
|
|
4
|
-
*
|
|
5
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
-
* you may not use this file except in compliance with the License.
|
|
7
|
-
* You may obtain a copy of the License at
|
|
8
|
-
*
|
|
9
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
-
*
|
|
11
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
-
* See the License for the specific language governing permissions and
|
|
15
|
-
* limitations under the License.
|
|
16
|
-
*/
|
|
17
|
-
import { ReactiveFormsModule, UntypedFormControl } from '@angular/forms';
|
|
18
|
-
import { Component, DestroyRef, ElementRef, EventEmitter, inject, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
|
|
19
|
-
import { BehaviorSubject } from 'rxjs';
|
|
20
|
-
import { debounceTime, distinctUntilChanged, filter, mergeMap, switchMap, tap } from 'rxjs/operators';
|
|
21
|
-
import { FullNamePipe, InitialUsernamePipe } from '@alfresco/adf-core';
|
|
22
|
-
import { animate, state, style, transition, trigger } from '@angular/animations';
|
|
23
|
-
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
24
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
25
|
-
import { CommonModule } from '@angular/common';
|
|
26
|
-
import { TranslatePipe } from '@ngx-translate/core';
|
|
27
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
28
|
-
import { MatProgressBarModule } from '@angular/material/progress-bar';
|
|
29
|
-
import { MatSelectModule } from '@angular/material/select';
|
|
30
|
-
import { MatAutocompleteModule } from '@angular/material/autocomplete';
|
|
31
|
-
import { MatChipsModule } from '@angular/material/chips';
|
|
32
|
-
import { MatInputModule } from '@angular/material/input';
|
|
33
|
-
import { IdentityUserService } from '../services/identity-user.service';
|
|
34
|
-
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
35
|
-
import * as i0 from "@angular/core";
|
|
36
|
-
import * as i1 from "../services/identity-user.service";
|
|
37
|
-
import * as i2 from "@angular/common";
|
|
38
|
-
import * as i3 from "@angular/material/icon";
|
|
39
|
-
import * as i4 from "@angular/material/form-field";
|
|
40
|
-
import * as i5 from "@angular/material/progress-bar";
|
|
41
|
-
import * as i6 from "@angular/material/core";
|
|
42
|
-
import * as i7 from "@angular/material/autocomplete";
|
|
43
|
-
import * as i8 from "@angular/forms";
|
|
44
|
-
import * as i9 from "@angular/material/chips";
|
|
45
|
-
import * as i10 from "@angular/material/input";
|
|
46
|
-
import * as i11 from "@angular/material/tooltip";
|
|
47
|
-
export class PeopleCloudComponent {
|
|
48
|
-
constructor(identityUserService) {
|
|
49
|
-
this.identityUserService = identityUserService;
|
|
50
|
-
/** User selection mode (single/multiple). */
|
|
51
|
-
this.mode = 'single';
|
|
52
|
-
/**
|
|
53
|
-
* This flag enables the validation on the preSelectUsers passed as input.
|
|
54
|
-
* In case the flag is true the components call the identity service to verify the validity of the information passed as input.
|
|
55
|
-
* Otherwise, no check will be done.
|
|
56
|
-
*/
|
|
57
|
-
this.validate = false;
|
|
58
|
-
/**
|
|
59
|
-
* Show the info in readonly mode
|
|
60
|
-
*/
|
|
61
|
-
this.readOnly = false;
|
|
62
|
-
/**
|
|
63
|
-
* Mark this field as required
|
|
64
|
-
*/
|
|
65
|
-
this.required = false;
|
|
66
|
-
/**
|
|
67
|
-
* Array of users to be pre-selected. All users in the
|
|
68
|
-
* array are pre-selected in multi selection mode, but only the first user
|
|
69
|
-
* is pre-selected in single selection mode.
|
|
70
|
-
* Mandatory properties are: id, email, username
|
|
71
|
-
*/
|
|
72
|
-
this.preSelectUsers = [];
|
|
73
|
-
/**
|
|
74
|
-
* Array of users to be excluded.
|
|
75
|
-
* Mandatory properties are: id, email, username
|
|
76
|
-
*/
|
|
77
|
-
this.excludedUsers = [];
|
|
78
|
-
/**
|
|
79
|
-
* Array of groups to restrict user searches.
|
|
80
|
-
* Mandatory property is group name
|
|
81
|
-
*/
|
|
82
|
-
this.groupsRestriction = [];
|
|
83
|
-
/** FormControl to list of users */
|
|
84
|
-
this.userChipsCtrl = new UntypedFormControl({ value: '', disabled: false });
|
|
85
|
-
/** FormControl to search the user */
|
|
86
|
-
this.searchUserCtrl = new UntypedFormControl({ value: '', disabled: false });
|
|
87
|
-
/**
|
|
88
|
-
* Hide the matInput associated with the chip grid when a single user is selected in single selection mode.
|
|
89
|
-
* The input will be shown again when the user is removed using the icon on the chip.
|
|
90
|
-
*/
|
|
91
|
-
this.hideInputOnSingleSelection = false;
|
|
92
|
-
/**
|
|
93
|
-
* Material form field appearance (fill / outline)
|
|
94
|
-
*/
|
|
95
|
-
this.formFieldAppearance = 'fill';
|
|
96
|
-
/**
|
|
97
|
-
* Material form field subscript sizing (fixed / dynamic)
|
|
98
|
-
*/
|
|
99
|
-
this.formFieldSubscriptSizing = 'fixed';
|
|
100
|
-
/**
|
|
101
|
-
* Show errors under the form field
|
|
102
|
-
*/
|
|
103
|
-
this.showErrors = true;
|
|
104
|
-
/**
|
|
105
|
-
* Show the full name of the user on hover in the chips
|
|
106
|
-
*/
|
|
107
|
-
this.showFullNameOnHover = false;
|
|
108
|
-
/** Emitted when a user is selected. */
|
|
109
|
-
this.selectUser = new EventEmitter();
|
|
110
|
-
/** Emitted when a selected user is removed in multi selection mode. */
|
|
111
|
-
this.removeUser = new EventEmitter();
|
|
112
|
-
/** Emitted when a user selection change. */
|
|
113
|
-
this.changedUsers = new EventEmitter();
|
|
114
|
-
/** Emitted when an warning occurs. */
|
|
115
|
-
this.warning = new EventEmitter();
|
|
116
|
-
this.searchUsers = [];
|
|
117
|
-
this.selectedUsers = [];
|
|
118
|
-
this.invalidUsers = [];
|
|
119
|
-
this.searchUsers$ = new BehaviorSubject(this.searchUsers);
|
|
120
|
-
this.subscriptAnimationState = 'enter';
|
|
121
|
-
this.touched = false;
|
|
122
|
-
this.searchedValue = '';
|
|
123
|
-
this.validationLoading = false;
|
|
124
|
-
this.searchLoading = false;
|
|
125
|
-
this.destroyRef = inject(DestroyRef);
|
|
126
|
-
}
|
|
127
|
-
ngOnInit() {
|
|
128
|
-
this.initSearch();
|
|
129
|
-
}
|
|
130
|
-
ngOnChanges(changes) {
|
|
131
|
-
if (this.hasPreselectedUsersChanged(changes) || this.hasModeChanged(changes) || this.isValidationChanged(changes)) {
|
|
132
|
-
if (this.hasPreSelectUsers()) {
|
|
133
|
-
this.loadPreSelectUsers();
|
|
134
|
-
}
|
|
135
|
-
else if (this.hasPreselectedUsersCleared(changes)) {
|
|
136
|
-
this.selectedUsers = [];
|
|
137
|
-
this.invalidUsers = [];
|
|
138
|
-
}
|
|
139
|
-
if (!this.isValidationEnabled()) {
|
|
140
|
-
this.invalidUsers = [];
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
if (this.isReadonly() && this.searchUserCtrl.enabled) {
|
|
144
|
-
this.searchUserCtrl.disable();
|
|
145
|
-
}
|
|
146
|
-
else if (!this.isReadonly() && this.searchUserCtrl.disabled) {
|
|
147
|
-
this.searchUserCtrl.enable();
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
ngAfterViewInit() {
|
|
151
|
-
if (this.hideInputOnSingleSelection) {
|
|
152
|
-
if (this.selectedUsers.length === 1 && this.isSingleMode() && this.userInput) {
|
|
153
|
-
this.userInput.nativeElement.style.display = 'none';
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
initSearch() {
|
|
158
|
-
this.initializeStream();
|
|
159
|
-
this.typingUniqueValueNotEmpty$
|
|
160
|
-
.pipe(filter((name) => name.length >= 1), switchMap((name) => this.identityUserService.search(name, { roles: this.roles, withinApplication: this.appName, groups: this.groupsRestriction })), mergeMap((users) => {
|
|
161
|
-
this.resetSearchUsers();
|
|
162
|
-
this.searchLoading = false;
|
|
163
|
-
return users;
|
|
164
|
-
}), filter((user) => !this.isUserAlreadySelected(user) && !this.isExcludedUser(user)), takeUntilDestroyed(this.destroyRef))
|
|
165
|
-
.subscribe((user) => {
|
|
166
|
-
this.searchUsers.push(user);
|
|
167
|
-
this.searchUsers$.next(this.searchUsers);
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
initializeStream() {
|
|
171
|
-
const typingValueFromControl$ = this.searchUserCtrl.valueChanges;
|
|
172
|
-
const typingValueTypeSting$ = typingValueFromControl$.pipe(filter((value) => {
|
|
173
|
-
this.searchLoading = true;
|
|
174
|
-
return typeof value === 'string';
|
|
175
|
-
}));
|
|
176
|
-
const typingValueHandleErrorMessage$ = typingValueTypeSting$.pipe(tap((value) => {
|
|
177
|
-
if (value) {
|
|
178
|
-
this.setTypingError();
|
|
179
|
-
}
|
|
180
|
-
}));
|
|
181
|
-
const typingValueDebouncedUnique$ = typingValueHandleErrorMessage$.pipe(debounceTime(500), distinctUntilChanged());
|
|
182
|
-
this.typingUniqueValueNotEmpty$ = typingValueDebouncedUnique$.pipe(tap((value) => {
|
|
183
|
-
if (value.trim()) {
|
|
184
|
-
this.searchedValue = value;
|
|
185
|
-
}
|
|
186
|
-
else {
|
|
187
|
-
this.searchUserCtrl.markAsPristine();
|
|
188
|
-
this.searchUserCtrl.markAsUntouched();
|
|
189
|
-
}
|
|
190
|
-
}), tap(() => this.resetSearchUsers()));
|
|
191
|
-
}
|
|
192
|
-
isValidationEnabled() {
|
|
193
|
-
return this.validate === true;
|
|
194
|
-
}
|
|
195
|
-
isUserAlreadySelected(searchUser) {
|
|
196
|
-
if (this.selectedUsers && this.selectedUsers.length > 0) {
|
|
197
|
-
const result = this.selectedUsers.find((selectedUser) => this.equalsUsers(selectedUser, searchUser));
|
|
198
|
-
return !!result;
|
|
199
|
-
}
|
|
200
|
-
return false;
|
|
201
|
-
}
|
|
202
|
-
isExcludedUser(searchUser) {
|
|
203
|
-
if (this.excludedUsers?.length > 0) {
|
|
204
|
-
return !!this.excludedUsers.find((excludedUser) => this.equalsUsers(excludedUser, searchUser));
|
|
205
|
-
}
|
|
206
|
-
return false;
|
|
207
|
-
}
|
|
208
|
-
async loadPreSelectUsers() {
|
|
209
|
-
this.selectedUsers = [];
|
|
210
|
-
if (this.isSingleMode()) {
|
|
211
|
-
this.selectedUsers = [this.preSelectUsers[0]];
|
|
212
|
-
}
|
|
213
|
-
else {
|
|
214
|
-
this.selectedUsers = this.removeDuplicatedUsers(this.preSelectUsers);
|
|
215
|
-
}
|
|
216
|
-
this.userChipsCtrl.setValue(this.selectedUsers[0].username);
|
|
217
|
-
if (this.isValidationEnabled()) {
|
|
218
|
-
this.validationLoading = true;
|
|
219
|
-
await this.validatePreselectUsers();
|
|
220
|
-
this.validationLoading = false;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
getPreselectedUsers() {
|
|
224
|
-
if (this.isSingleMode()) {
|
|
225
|
-
return [this.preSelectUsers[0]];
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
return this.removeDuplicatedUsers(this.preSelectUsers);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
async validatePreselectUsers() {
|
|
232
|
-
this.invalidUsers = [];
|
|
233
|
-
for (const user of this.getPreselectedUsers()) {
|
|
234
|
-
try {
|
|
235
|
-
const validationResult = (await this.identityUserService
|
|
236
|
-
.search(user.username, { roles: this.roles, withinApplication: this.appName, groups: this.groupsRestriction })
|
|
237
|
-
.toPromise())[0];
|
|
238
|
-
if (!this.equalsUsers(user, validationResult)) {
|
|
239
|
-
this.invalidUsers.push(user);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
catch (error) {
|
|
243
|
-
this.invalidUsers.push(user);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
this.checkPreselectValidationErrors();
|
|
247
|
-
}
|
|
248
|
-
equalsUsers(preselectedUser, identityUser) {
|
|
249
|
-
if (preselectedUser && identityUser) {
|
|
250
|
-
const uniquePropertyIdentifiers = ['id', 'username', 'email'];
|
|
251
|
-
for (const property of Object.keys(preselectedUser)) {
|
|
252
|
-
if (preselectedUser[property] !== undefined && uniquePropertyIdentifiers.includes(property)) {
|
|
253
|
-
return preselectedUser[property] === identityUser[property];
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
return false;
|
|
258
|
-
}
|
|
259
|
-
removeDuplicatedUsers(users) {
|
|
260
|
-
return users.filter((user, index, self) => index === self.findIndex((auxUser) => user.id === auxUser.id && user.username === auxUser.username && user.email === auxUser.email));
|
|
261
|
-
}
|
|
262
|
-
onSelect(user) {
|
|
263
|
-
if (user) {
|
|
264
|
-
this.selectUser.emit(user);
|
|
265
|
-
if (this.isMultipleMode()) {
|
|
266
|
-
if (!this.isUserAlreadySelected(user)) {
|
|
267
|
-
this.selectedUsers.push(user);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
else {
|
|
271
|
-
this.invalidUsers = [];
|
|
272
|
-
this.selectedUsers = [user];
|
|
273
|
-
if (this.hideInputOnSingleSelection) {
|
|
274
|
-
this.userInput.nativeElement.style.display = 'none';
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
this.userInput.nativeElement.value = '';
|
|
278
|
-
this.searchUserCtrl.setValue('');
|
|
279
|
-
this.userChipsControlValue(this.selectedUsers[0].username);
|
|
280
|
-
this.changedUsers.emit(this.selectedUsers);
|
|
281
|
-
this.resetSearchUsers();
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
onRemove(userToRemove) {
|
|
285
|
-
this.removeUser.emit(userToRemove);
|
|
286
|
-
this.removeUserFromSelected(userToRemove);
|
|
287
|
-
this.changedUsers.emit(this.selectedUsers);
|
|
288
|
-
if (this.selectedUsers.length === 0) {
|
|
289
|
-
this.userChipsControlValue('');
|
|
290
|
-
if (this.hideInputOnSingleSelection) {
|
|
291
|
-
this.userInput.nativeElement.style.display = 'block';
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
else {
|
|
295
|
-
this.userChipsControlValue(this.selectedUsers[0].username);
|
|
296
|
-
}
|
|
297
|
-
this.searchUserCtrl.markAsDirty();
|
|
298
|
-
this.searchUserCtrl.markAsTouched();
|
|
299
|
-
if (this.isValidationEnabled()) {
|
|
300
|
-
this.removeUserFromValidation(userToRemove);
|
|
301
|
-
this.checkPreselectValidationErrors();
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
checkPreselectValidationErrors() {
|
|
305
|
-
this.invalidUsers = this.removeDuplicatedUsers(this.invalidUsers);
|
|
306
|
-
if (this.invalidUsers.length > 0) {
|
|
307
|
-
this.generateInvalidUsersMessage();
|
|
308
|
-
}
|
|
309
|
-
this.warning.emit({
|
|
310
|
-
message: 'INVALID_PRESELECTED_USERS',
|
|
311
|
-
users: this.invalidUsers
|
|
312
|
-
});
|
|
313
|
-
}
|
|
314
|
-
removeUserFromSelected({ id, username, email }) {
|
|
315
|
-
const indexToRemove = this.selectedUsers.findIndex((user) => user.id === id && user.username === username && user.email === email);
|
|
316
|
-
if (indexToRemove !== -1) {
|
|
317
|
-
this.selectedUsers.splice(indexToRemove, 1);
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
removeUserFromValidation({ id, username, email }) {
|
|
321
|
-
const indexToRemove = this.invalidUsers.findIndex((user) => user.id === id && user.username === username && user.email === email);
|
|
322
|
-
if (indexToRemove !== -1) {
|
|
323
|
-
this.invalidUsers.splice(indexToRemove, 1);
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
generateInvalidUsersMessage() {
|
|
327
|
-
this.validateUsersMessage = '';
|
|
328
|
-
this.invalidUsers.forEach((invalidUser, index) => {
|
|
329
|
-
if (index === this.invalidUsers.length - 1) {
|
|
330
|
-
this.validateUsersMessage += `${invalidUser.username} `;
|
|
331
|
-
}
|
|
332
|
-
else {
|
|
333
|
-
this.validateUsersMessage += `${invalidUser.username}, `;
|
|
334
|
-
}
|
|
335
|
-
});
|
|
336
|
-
}
|
|
337
|
-
hasPreselectError() {
|
|
338
|
-
return this.invalidUsers && this.invalidUsers.length > 0;
|
|
339
|
-
}
|
|
340
|
-
getDisplayName(user) {
|
|
341
|
-
return FullNamePipe.prototype.transform(user);
|
|
342
|
-
}
|
|
343
|
-
isMultipleMode() {
|
|
344
|
-
return this.mode === 'multiple';
|
|
345
|
-
}
|
|
346
|
-
isSingleMode() {
|
|
347
|
-
return this.mode === 'single';
|
|
348
|
-
}
|
|
349
|
-
isSingleSelectionReadonly() {
|
|
350
|
-
return this.isSingleMode() && this.selectedUsers.length === 1 && this.selectedUsers[0].readonly === true;
|
|
351
|
-
}
|
|
352
|
-
hasPreSelectUsers() {
|
|
353
|
-
return this.preSelectUsers && this.preSelectUsers.length > 0;
|
|
354
|
-
}
|
|
355
|
-
hasModeChanged(changes) {
|
|
356
|
-
return changes?.mode && changes.mode.currentValue !== changes.mode.previousValue;
|
|
357
|
-
}
|
|
358
|
-
isValidationChanged(changes) {
|
|
359
|
-
return changes?.validate && changes.validate.currentValue !== changes.validate.previousValue;
|
|
360
|
-
}
|
|
361
|
-
hasPreselectedUsersChanged(changes) {
|
|
362
|
-
return changes?.preSelectUsers && changes.preSelectUsers.currentValue !== changes.preSelectUsers.previousValue;
|
|
363
|
-
}
|
|
364
|
-
hasPreselectedUsersCleared(changes) {
|
|
365
|
-
return changes?.preSelectUsers?.currentValue?.length === 0;
|
|
366
|
-
}
|
|
367
|
-
resetSearchUsers() {
|
|
368
|
-
this.searchUsers = [];
|
|
369
|
-
this.searchUsers$.next(this.searchUsers);
|
|
370
|
-
}
|
|
371
|
-
setTypingError() {
|
|
372
|
-
this.searchUserCtrl.setErrors({
|
|
373
|
-
searchTypingError: true,
|
|
374
|
-
...this.searchUserCtrl.errors
|
|
375
|
-
});
|
|
376
|
-
}
|
|
377
|
-
userChipsControlValue(value) {
|
|
378
|
-
this.userChipsCtrl.setValue(value);
|
|
379
|
-
this.userChipsCtrl.markAsDirty();
|
|
380
|
-
this.userChipsCtrl.markAsTouched();
|
|
381
|
-
}
|
|
382
|
-
getSelectedUsers() {
|
|
383
|
-
return this.selectedUsers;
|
|
384
|
-
}
|
|
385
|
-
isReadonly() {
|
|
386
|
-
return this.readOnly || this.isSingleSelectionReadonly();
|
|
387
|
-
}
|
|
388
|
-
isValidationLoading() {
|
|
389
|
-
return this.isValidationEnabled() && this.validationLoading;
|
|
390
|
-
}
|
|
391
|
-
markAsTouched() {
|
|
392
|
-
this.touched = true;
|
|
393
|
-
}
|
|
394
|
-
isTouched() {
|
|
395
|
-
return this.touched;
|
|
396
|
-
}
|
|
397
|
-
isSelected() {
|
|
398
|
-
return this.selectedUsers && !!this.selectedUsers.length;
|
|
399
|
-
}
|
|
400
|
-
isDirty() {
|
|
401
|
-
return this.isTouched() && !this.isSelected();
|
|
402
|
-
}
|
|
403
|
-
setFocus(isFocused) {
|
|
404
|
-
this.isFocused = isFocused;
|
|
405
|
-
}
|
|
406
|
-
hasError() {
|
|
407
|
-
return !!this.searchUserCtrl.errors;
|
|
408
|
-
}
|
|
409
|
-
getValidationPattern() {
|
|
410
|
-
return this.searchUserCtrl.errors.pattern.requiredPattern;
|
|
411
|
-
}
|
|
412
|
-
getValidationMaxLength() {
|
|
413
|
-
return this.searchUserCtrl.errors.maxlength.requiredLength;
|
|
414
|
-
}
|
|
415
|
-
getValidationMinLength() {
|
|
416
|
-
return this.searchUserCtrl.errors.minlength.requiredLength;
|
|
417
|
-
}
|
|
418
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PeopleCloudComponent, deps: [{ token: i1.IdentityUserService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
419
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PeopleCloudComponent, isStandalone: true, selector: "adf-cloud-people", inputs: { label: "label", appName: "appName", mode: "mode", roles: "roles", validate: "validate", readOnly: "readOnly", required: "required", preSelectUsers: "preSelectUsers", excludedUsers: "excludedUsers", groupsRestriction: "groupsRestriction", userChipsCtrl: "userChipsCtrl", searchUserCtrl: "searchUserCtrl", title: "title", placeholder: "placeholder", hideInputOnSingleSelection: "hideInputOnSingleSelection", formFieldAppearance: "formFieldAppearance", formFieldSubscriptSizing: "formFieldSubscriptSizing", showErrors: "showErrors", showFullNameOnHover: "showFullNameOnHover" }, outputs: { selectUser: "selectUser", removeUser: "removeUser", changedUsers: "changedUsers", warning: "warning" }, providers: [FullNamePipe], viewQueries: [{ propertyName: "userInput", first: true, predicate: ["userInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<form>\n <mat-form-field\n [subscriptSizing]=\"formFieldSubscriptSizing\"\n class=\"adf-people-cloud adf-form-field-input\"\n [class.adf-invalid]=\"hasError() && isDirty()\"\n >\n <mat-label *ngIf=\"!title\">\n <span>{{label}}</span>\n </mat-label>\n <mat-label *ngIf=\"title\">{{ title | translate }}</mat-label>\n\n <mat-chip-grid [required]=\"required\" #userMultipleChipList data-automation-id=\"adf-cloud-people-chip-list\">\n <mat-chip-row\n *ngFor=\"let user of selectedUsers\"\n [removable]=\"!user.readonly\"\n [attr.data-automation-id]=\"'adf-people-cloud-chip-' + user.username\"\n (removed)=\"onRemove(user)\"\n [disabled]=\"isReadonly() || isValidationLoading()\"\n title=\"{{ (user.readonly ? 'ADF_CLOUD_GROUPS.MANDATORY' : '') | translate }}\"\n [matTooltip]=\"showFullNameOnHover ? (user | fullName : true) : user.email\"\n >\n {{ user | fullName }}\n <mat-icon\n matChipRemove\n *ngIf=\"!(user.readonly || readOnly)\"\n [attr.data-automation-id]=\"'adf-people-cloud-chip-remove-icon-' + user.username\"\n >\n cancel\n </mat-icon>\n </mat-chip-row>\n <input\n matInput\n [disabled]=\"isReadonly()\"\n [formControl]=\"searchUserCtrl\"\n [matAutocomplete]=\"auto\"\n [matChipInputFor]=\"userMultipleChipList\"\n [required]=\"required\"\n [placeholder]=\"placeholder\"\n [disabled]=\"isReadonly() || isValidationLoading()\"\n (focus)=\"setFocus(true)\"\n (blur)=\"setFocus(false); markAsTouched()\"\n class=\"adf-cloud-input\"\n data-automation-id=\"adf-people-cloud-search-input\"\n #userInput\n />\n </mat-chip-grid>\n\n <mat-autocomplete\n autoActiveFirstOption\n class=\"adf-people-cloud-list\"\n #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option.value)\"\n [displayWith]=\"getDisplayName\"\n >\n <ng-container *ngIf=\"(searchUsers$ | async)?.length; else noResults\">\n <mat-option *ngFor=\"let user of searchUsers$ | async; let i = index\" [value]=\"user\" class=\"adf-people-cloud-option-active\">\n <div class=\"adf-people-cloud-row\" id=\"adf-people-cloud-user-{{ user.username }}\" data-automation-id=\"adf-people-cloud-row\">\n <div [outerHTML]=\"user | usernameInitials : 'adf-people-cloud-pic'\"></div>\n <span class=\"adf-people-label-name\"> {{ user | fullName : true }}</span>\n </div>\n </mat-option>\n </ng-container>\n <ng-template #noResults>\n <mat-option\n *ngIf=\"searchUserCtrl.hasError('searchTypingError') && !searchLoading\"\n disabled\n class=\"adf-people-cloud-option-not-active\"\n data-automation-id=\"adf-people-cloud-no-results\"\n >\n <span> {{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate : { userName: searchedValue } }}</span>\n </mat-option>\n </ng-template>\n </mat-autocomplete>\n </mat-form-field>\n\n <mat-progress-bar *ngIf=\"validationLoading\" mode=\"indeterminate\" />\n\n <div class=\"adf-error-container adf-error-messages-container\" *ngIf=\"showErrors\">\n <mat-error *ngIf=\"hasPreselectError() && !isValidationLoading()\" [@transitionMessages]=\"subscriptAnimationState\" class=\"adf-error\">\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">{{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate : { userName: validateUsersMessage } }}</div>\n </mat-error>\n <mat-error *ngIf=\"searchUserCtrl.hasError('pattern')\" [@transitionMessages]=\"subscriptAnimationState\" class=\"adf-error\">\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_PATTERN' | translate : { pattern: getValidationPattern() } }}</div>\n </mat-error>\n <mat-error *ngIf=\"searchUserCtrl.hasError('maxlength')\" [@transitionMessages]=\"subscriptAnimationState\" class=\"adf-error\">\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">\n {{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_MAX_LENGTH' | translate : { requiredLength: getValidationMaxLength() } }}\n </div>\n </mat-error>\n <mat-error *ngIf=\"searchUserCtrl.hasError('minlength')\" [@transitionMessages]=\"subscriptAnimationState\" class=\"adf-error\">\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">\n {{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_MIN_LENGTH' | translate : { requiredLength: getValidationMinLength() } }}\n </div>\n </mat-error>\n <mat-error\n *ngIf=\"(searchUserCtrl.hasError('required') || userChipsCtrl.hasError('required')) && isDirty()\"\n [@transitionMessages]=\"subscriptAnimationState\"\n class=\"adf-error\"\n >\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.REQUIRED' | translate }}</div>\n </mat-error>\n <mat-error\n *ngIf=\"searchUserCtrl.hasError('searchTypingError') && !this.isFocused\"\n [@transitionMessages]=\"subscriptAnimationState\"\n data-automation-id=\"invalid-users-typing-error\"\n class=\"adf-error\"\n >\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">{{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate : { userName: searchedValue } }}</div>\n </mat-error>\n </div>\n</form>\n", styles: [".adf-people-cloud{width:100%}.adf-people-cloud-option-not-active:not(.adf-people-cloud:active){background:inherit;color:var(--adf-theme-foreground-secondary-text-color)}.adf-people-cloud-title{color:var(--adf-theme-foreground-secondary-text-color)}.adf-people-cloud-title--focus{color:var(--theme-primary-color)}.adf-people-cloud-list{margin:5px 0;padding:10px 0}.adf-people-cloud-option-active:not(.adf:disabled){color:var(--adf-theme-foreground-text-color)}.adf-people-cloud-option-not-active:not(.adf:active){color:var(--adf-theme-foreground-secondary-text-color)}.adf-people-cloud-row{display:flex;align-items:center;column-gap:10px}.adf-people-cloud-pic{background:var(--theme-primary-color);display:flex;justify-content:center;align-items:center;width:40px;height:40px;border-radius:100px;text-transform:uppercase}.adf-start-task-cloud-error{margin-top:-10px;position:absolute;height:20px}.adf-start-task-cloud-error-message{padding-right:8px;height:16px;line-height:1.33;width:auto}.adf-error,.adf-error-text,.adf-error-icon{color:var(--theme-warn-color)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i5.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "pipe", type: InitialUsernamePipe, name: "usernameInitials" }, { kind: "pipe", type: FullNamePipe, name: "fullName" }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i7.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i7.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i8.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i8.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: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i8.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i8.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i9.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i9.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i9.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i9.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i10.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: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i11.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], animations: [
|
|
420
|
-
trigger('transitionMessages', [
|
|
421
|
-
state('enter', style({ opacity: 1, transform: 'translateY(0%)' })),
|
|
422
|
-
transition('void => enter', [style({ opacity: 0, transform: 'translateY(-100%)' }), animate('300ms cubic-bezier(0.55, 0, 0.55, 0.2)')])
|
|
423
|
-
])
|
|
424
|
-
], encapsulation: i0.ViewEncapsulation.None }); }
|
|
425
|
-
}
|
|
426
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PeopleCloudComponent, decorators: [{
|
|
427
|
-
type: Component,
|
|
428
|
-
args: [{ selector: 'adf-cloud-people', standalone: true, imports: [
|
|
429
|
-
CommonModule,
|
|
430
|
-
TranslatePipe,
|
|
431
|
-
MatIconModule,
|
|
432
|
-
MatFormFieldModule,
|
|
433
|
-
MatProgressBarModule,
|
|
434
|
-
MatSelectModule,
|
|
435
|
-
InitialUsernamePipe,
|
|
436
|
-
FullNamePipe,
|
|
437
|
-
MatAutocompleteModule,
|
|
438
|
-
ReactiveFormsModule,
|
|
439
|
-
MatChipsModule,
|
|
440
|
-
MatInputModule,
|
|
441
|
-
MatTooltipModule
|
|
442
|
-
], providers: [FullNamePipe], animations: [
|
|
443
|
-
trigger('transitionMessages', [
|
|
444
|
-
state('enter', style({ opacity: 1, transform: 'translateY(0%)' })),
|
|
445
|
-
transition('void => enter', [style({ opacity: 0, transform: 'translateY(-100%)' }), animate('300ms cubic-bezier(0.55, 0, 0.55, 0.2)')])
|
|
446
|
-
])
|
|
447
|
-
], encapsulation: ViewEncapsulation.None, template: "<form>\n <mat-form-field\n [subscriptSizing]=\"formFieldSubscriptSizing\"\n class=\"adf-people-cloud adf-form-field-input\"\n [class.adf-invalid]=\"hasError() && isDirty()\"\n >\n <mat-label *ngIf=\"!title\">\n <span>{{label}}</span>\n </mat-label>\n <mat-label *ngIf=\"title\">{{ title | translate }}</mat-label>\n\n <mat-chip-grid [required]=\"required\" #userMultipleChipList data-automation-id=\"adf-cloud-people-chip-list\">\n <mat-chip-row\n *ngFor=\"let user of selectedUsers\"\n [removable]=\"!user.readonly\"\n [attr.data-automation-id]=\"'adf-people-cloud-chip-' + user.username\"\n (removed)=\"onRemove(user)\"\n [disabled]=\"isReadonly() || isValidationLoading()\"\n title=\"{{ (user.readonly ? 'ADF_CLOUD_GROUPS.MANDATORY' : '') | translate }}\"\n [matTooltip]=\"showFullNameOnHover ? (user | fullName : true) : user.email\"\n >\n {{ user | fullName }}\n <mat-icon\n matChipRemove\n *ngIf=\"!(user.readonly || readOnly)\"\n [attr.data-automation-id]=\"'adf-people-cloud-chip-remove-icon-' + user.username\"\n >\n cancel\n </mat-icon>\n </mat-chip-row>\n <input\n matInput\n [disabled]=\"isReadonly()\"\n [formControl]=\"searchUserCtrl\"\n [matAutocomplete]=\"auto\"\n [matChipInputFor]=\"userMultipleChipList\"\n [required]=\"required\"\n [placeholder]=\"placeholder\"\n [disabled]=\"isReadonly() || isValidationLoading()\"\n (focus)=\"setFocus(true)\"\n (blur)=\"setFocus(false); markAsTouched()\"\n class=\"adf-cloud-input\"\n data-automation-id=\"adf-people-cloud-search-input\"\n #userInput\n />\n </mat-chip-grid>\n\n <mat-autocomplete\n autoActiveFirstOption\n class=\"adf-people-cloud-list\"\n #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option.value)\"\n [displayWith]=\"getDisplayName\"\n >\n <ng-container *ngIf=\"(searchUsers$ | async)?.length; else noResults\">\n <mat-option *ngFor=\"let user of searchUsers$ | async; let i = index\" [value]=\"user\" class=\"adf-people-cloud-option-active\">\n <div class=\"adf-people-cloud-row\" id=\"adf-people-cloud-user-{{ user.username }}\" data-automation-id=\"adf-people-cloud-row\">\n <div [outerHTML]=\"user | usernameInitials : 'adf-people-cloud-pic'\"></div>\n <span class=\"adf-people-label-name\"> {{ user | fullName : true }}</span>\n </div>\n </mat-option>\n </ng-container>\n <ng-template #noResults>\n <mat-option\n *ngIf=\"searchUserCtrl.hasError('searchTypingError') && !searchLoading\"\n disabled\n class=\"adf-people-cloud-option-not-active\"\n data-automation-id=\"adf-people-cloud-no-results\"\n >\n <span> {{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate : { userName: searchedValue } }}</span>\n </mat-option>\n </ng-template>\n </mat-autocomplete>\n </mat-form-field>\n\n <mat-progress-bar *ngIf=\"validationLoading\" mode=\"indeterminate\" />\n\n <div class=\"adf-error-container adf-error-messages-container\" *ngIf=\"showErrors\">\n <mat-error *ngIf=\"hasPreselectError() && !isValidationLoading()\" [@transitionMessages]=\"subscriptAnimationState\" class=\"adf-error\">\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">{{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate : { userName: validateUsersMessage } }}</div>\n </mat-error>\n <mat-error *ngIf=\"searchUserCtrl.hasError('pattern')\" [@transitionMessages]=\"subscriptAnimationState\" class=\"adf-error\">\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_PATTERN' | translate : { pattern: getValidationPattern() } }}</div>\n </mat-error>\n <mat-error *ngIf=\"searchUserCtrl.hasError('maxlength')\" [@transitionMessages]=\"subscriptAnimationState\" class=\"adf-error\">\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">\n {{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_MAX_LENGTH' | translate : { requiredLength: getValidationMaxLength() } }}\n </div>\n </mat-error>\n <mat-error *ngIf=\"searchUserCtrl.hasError('minlength')\" [@transitionMessages]=\"subscriptAnimationState\" class=\"adf-error\">\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">\n {{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_MIN_LENGTH' | translate : { requiredLength: getValidationMinLength() } }}\n </div>\n </mat-error>\n <mat-error\n *ngIf=\"(searchUserCtrl.hasError('required') || userChipsCtrl.hasError('required')) && isDirty()\"\n [@transitionMessages]=\"subscriptAnimationState\"\n class=\"adf-error\"\n >\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.REQUIRED' | translate }}</div>\n </mat-error>\n <mat-error\n *ngIf=\"searchUserCtrl.hasError('searchTypingError') && !this.isFocused\"\n [@transitionMessages]=\"subscriptAnimationState\"\n data-automation-id=\"invalid-users-typing-error\"\n class=\"adf-error\"\n >\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">{{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate : { userName: searchedValue } }}</div>\n </mat-error>\n </div>\n</form>\n", styles: [".adf-people-cloud{width:100%}.adf-people-cloud-option-not-active:not(.adf-people-cloud:active){background:inherit;color:var(--adf-theme-foreground-secondary-text-color)}.adf-people-cloud-title{color:var(--adf-theme-foreground-secondary-text-color)}.adf-people-cloud-title--focus{color:var(--theme-primary-color)}.adf-people-cloud-list{margin:5px 0;padding:10px 0}.adf-people-cloud-option-active:not(.adf:disabled){color:var(--adf-theme-foreground-text-color)}.adf-people-cloud-option-not-active:not(.adf:active){color:var(--adf-theme-foreground-secondary-text-color)}.adf-people-cloud-row{display:flex;align-items:center;column-gap:10px}.adf-people-cloud-pic{background:var(--theme-primary-color);display:flex;justify-content:center;align-items:center;width:40px;height:40px;border-radius:100px;text-transform:uppercase}.adf-start-task-cloud-error{margin-top:-10px;position:absolute;height:20px}.adf-start-task-cloud-error-message{padding-right:8px;height:16px;line-height:1.33;width:auto}.adf-error,.adf-error-text,.adf-error-icon{color:var(--theme-warn-color)}\n"] }]
|
|
448
|
-
}], ctorParameters: () => [{ type: i1.IdentityUserService }], propDecorators: { label: [{
|
|
449
|
-
type: Input
|
|
450
|
-
}], appName: [{
|
|
451
|
-
type: Input
|
|
452
|
-
}], mode: [{
|
|
453
|
-
type: Input
|
|
454
|
-
}], roles: [{
|
|
455
|
-
type: Input
|
|
456
|
-
}], validate: [{
|
|
457
|
-
type: Input
|
|
458
|
-
}], readOnly: [{
|
|
459
|
-
type: Input
|
|
460
|
-
}], required: [{
|
|
461
|
-
type: Input
|
|
462
|
-
}], preSelectUsers: [{
|
|
463
|
-
type: Input
|
|
464
|
-
}], excludedUsers: [{
|
|
465
|
-
type: Input
|
|
466
|
-
}], groupsRestriction: [{
|
|
467
|
-
type: Input
|
|
468
|
-
}], userChipsCtrl: [{
|
|
469
|
-
type: Input
|
|
470
|
-
}], searchUserCtrl: [{
|
|
471
|
-
type: Input
|
|
472
|
-
}], title: [{
|
|
473
|
-
type: Input
|
|
474
|
-
}], placeholder: [{
|
|
475
|
-
type: Input
|
|
476
|
-
}], hideInputOnSingleSelection: [{
|
|
477
|
-
type: Input
|
|
478
|
-
}], formFieldAppearance: [{
|
|
479
|
-
type: Input
|
|
480
|
-
}], formFieldSubscriptSizing: [{
|
|
481
|
-
type: Input
|
|
482
|
-
}], showErrors: [{
|
|
483
|
-
type: Input
|
|
484
|
-
}], showFullNameOnHover: [{
|
|
485
|
-
type: Input
|
|
486
|
-
}], selectUser: [{
|
|
487
|
-
type: Output
|
|
488
|
-
}], removeUser: [{
|
|
489
|
-
type: Output
|
|
490
|
-
}], changedUsers: [{
|
|
491
|
-
type: Output
|
|
492
|
-
}], warning: [{
|
|
493
|
-
type: Output
|
|
494
|
-
}], userInput: [{
|
|
495
|
-
type: ViewChild,
|
|
496
|
-
args: ['userInput']
|
|
497
|
-
}] } });
|
|
498
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVvcGxlLWNsb3VkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9wcm9jZXNzLXNlcnZpY2VzLWNsb3VkL3NyYy9saWIvcGVvcGxlL2NvbXBvbmVudHMvcGVvcGxlLWNsb3VkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9wcm9jZXNzLXNlcnZpY2VzLWNsb3VkL3NyYy9saWIvcGVvcGxlL2NvbXBvbmVudHMvcGVvcGxlLWNsb3VkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFFSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNULGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEcsT0FBTyxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHakYsT0FBTyxFQUEwQixrQkFBa0IsRUFBbUIsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsWUFBWSxFQUFF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O3NCQURQLEtBQUs7Z0JBT04sUUFBUTtzQkFEUCxLQUFLO2dCQVVOLGNBQWM7c0JBRGIsS0FBSztnQkFRTixhQUFhO3NCQURaLEtBQUs7Z0JBUU4saUJBQWlCO3NCQURoQixLQUFLO2dCQUtOLGFBQWE7c0JBRFosS0FBSztnQkFLTixjQUFjO3NCQURiLEtBQUs7Z0JBT04sS0FBSztzQkFESixLQUFLO2dCQU9OLFdBQVc7c0JBRFYsS0FBSztnQkFRTiwwQkFBMEI7c0JBRHpCLEtBQUs7Z0JBT04sbUJBQW1CO3NCQURsQixLQUFLO2dCQU9OLHdCQUF3QjtzQkFEdkIsS0FBSztnQkFPTixVQUFVO3NCQURULEtBQUs7Z0JBT04sbUJBQW1CO3NCQURsQixLQUFLO2dCQUtOLFVBQVU7c0JBRFQsTUFBTTtnQkFLUCxVQUFVO3NCQURULE1BQU07Z0JBS1AsWUFBWTtzQkFEWCxNQUFNO2dCQUtQLE9BQU87c0JBRE4sTUFBTTtnQkFJQyxTQUFTO3NCQURoQixTQUFTO3VCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI1IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUsIFVudHlwZWRGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDb21wb25lbnQsXG4gICAgRGVzdHJveVJlZixcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBpbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWVyZ2VNYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRnVsbE5hbWVQaXBlLCBJbml0aWFsVXNlcm5hbWVQaXBlIH0gZnJvbSAnQGFsZnJlc2NvL2FkZi1jb3JlJztcbmltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgQ29tcG9uZW50U2VsZWN0aW9uTW9kZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IElkZW50aXR5VXNlck1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL2lkZW50aXR5LXVzZXIubW9kZWwnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSwgTWF0Rm9ybUZpZWxkTW9kdWxlLCBTdWJzY3JpcHRTaXppbmcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBUcmFuc2xhdGVQaXBlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc0Jhck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLWJhcic7XG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7IE1hdENoaXBzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHMnO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBJZGVudGl0eVVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvaWRlbnRpdHktdXNlci5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhZGYtY2xvdWQtcGVvcGxlJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBUcmFuc2xhdGVQaXBlLFxuICAgICAgICBNYXRJY29uTW9kdWxlLFxuICAgICAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgICAgIE1hdFByb2dyZXNzQmFyTW9kdWxlLFxuICAgICAgICBNYXRTZWxlY3RNb2R1bGUsXG4gICAgICAgIEluaXRpYWxVc2VybmFtZVBpcGUsXG4gICAgICAgIEZ1bGxOYW1lUGlwZSxcbiAgICAgICAgTWF0QXV0b2NvbXBsZXRlTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBNYXRDaGlwc01vZHVsZSxcbiAgICAgICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgICAgIE1hdFRvb2x0aXBNb2R1bGVcbiAgICBdLFxuICAgIHByb3ZpZGVyczogW0Z1bGxOYW1lUGlwZV0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL3Blb3BsZS1jbG91ZC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vcGVvcGxlLWNsb3VkLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgYW5pbWF0aW9uczogW1xuICAgICAgICB0cmlnZ2VyKCd0cmFuc2l0aW9uTWVzc2FnZXMnLCBbXG4gICAgICAgICAgICBzdGF0ZSgnZW50ZXInLCBzdHlsZSh7IG9wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMCUpJyB9KSksXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCd2b2lkID0+IGVudGVyJywgW3N0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtMTAwJSknIH0pLCBhbmltYXRlKCczMDBtcyBjdWJpYy1iZXppZXIoMC41NSwgMCwgMC41NSwgMC4yKScpXSlcbiAgICAgICAgXSlcbiAgICBdLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgUGVvcGxlQ2xvdWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgLyoqIExhYmVsIGZvciB0aGUgdXNlciBzZWxlY3Rpb24gY29tcG9uZW50LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbGFiZWw6IHN0cmluZztcblxuICAgIC8qKiBOYW1lIG9mIHRoZSBhcHBsaWNhdGlvbi4gSWYgc3BlY2lmaWVkLCB0aGlzIHNob3dzIHRoZSB1c2VycyB3aG8gaGF2ZSBhY2Nlc3MgdG8gdGhlIGFwcC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGFwcE5hbWU6IHN0cmluZztcblxuICAgIC8qKiBVc2VyIHNlbGVjdGlvbiBtb2RlIChzaW5nbGUvbXVsdGlwbGUpLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbW9kZTogQ29tcG9uZW50U2VsZWN0aW9uTW9kZSA9ICdzaW5nbGUnO1xuXG4gICAgLyoqIFJvbGUgbmFtZXMgb2YgdGhlIHVzZXJzIHRvIGJlIGxpc3RlZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHJvbGVzOiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgZmxhZyBlbmFibGVzIHRoZSB2YWxpZGF0aW9uIG9uIHRoZSBwcmVTZWxlY3RVc2VycyBwYXNzZWQgYXMgaW5wdXQuXG4gICAgICogSW4gY2FzZSB0aGUgZmxhZyBpcyB0cnVlIHRoZSBjb21wb25lbnRzIGNhbGwgdGhlIGlkZW50aXR5IHNlcnZpY2UgdG8gdmVyaWZ5IHRoZSB2YWxpZGl0eSBvZiB0aGUgaW5mb3JtYXRpb24gcGFzc2VkIGFzIGlucHV0LlxuICAgICAqIE90aGVyd2lzZSwgbm8gY2hlY2sgd2lsbCBiZSBkb25lLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgdmFsaWRhdGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFNob3cgdGhlIGluZm8gaW4gcmVhZG9ubHkgbW9kZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIE1hcmsgdGhpcyBmaWVsZCBhcyByZXF1aXJlZFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcmVxdWlyZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHVzZXJzIHRvIGJlIHByZS1zZWxlY3RlZC4gQWxsIHVzZXJzIGluIHRoZVxuICAgICAqIGFycmF5IGFyZSBwcmUtc2VsZWN0ZWQgaW4gbXVsdGkgc2VsZWN0aW9uIG1vZGUsIGJ1dCBvbmx5IHRoZSBmaXJzdCB1c2VyXG4gICAgICogaXMgcHJlLXNlbGVjdGVkIGluIHNpbmdsZSBzZWxlY3Rpb24gbW9kZS5cbiAgICAgKiBNYW5kYXRvcnkgcHJvcGVydGllcyBhcmU6IGlkLCBlbWFpbCwgdXNlcm5hbWVcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHByZVNlbGVjdFVzZXJzOiBJZGVudGl0eVVzZXJNb2RlbFtdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiB1c2VycyB0byBiZSBleGNsdWRlZC5cbiAgICAgKiBNYW5kYXRvcnkgcHJvcGVydGllcyBhcmU6IGlkLCBlbWFpbCwgdXNlcm5hbWVcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGV4Y2x1ZGVkVXNlcnM6IElkZW50aXR5VXNlck1vZGVsW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGdyb3VwcyB0byByZXN0cmljdCB1c2VyIHNlYXJjaGVzLlxuICAgICAqIE1hbmRhdG9yeSBwcm9wZXJ0eSBpcyBncm91cCBuYW1lXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBncm91cHNSZXN0cmljdGlvbjogc3RyaW5nW10gPSBbXTtcblxuICAgIC8qKiBGb3JtQ29udHJvbCB0byBsaXN0IG9mIHVzZXJzICovXG4gICAgQElucHV0KClcbiAgICB1c2VyQ2hpcHNDdHJsOiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKHsgdmFsdWU6ICcnLCBkaXNhYmxlZDogZmFsc2UgfSk7XG5cbiAgICAvKiogRm9ybUNvbnRyb2wgdG8gc2VhcmNoIHRoZSB1c2VyICovXG4gICAgQElucHV0KClcbiAgICBzZWFyY2hVc2VyQ3RybCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogJycsIGRpc2FibGVkOiBmYWxzZSB9KTtcblxuICAgIC8qKlxuICAgICAqIExhYmVsIHRyYW5zbGF0aW9uIGtleVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgdGl0bGU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFBsYWNlaG9sZGVyIGZvciB0aGUgaW5wdXQgZmllbGRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBIaWRlIHRoZSBtYXRJbnB1dCBhc3NvY2lhdGVkIHdpdGggdGhlIGNoaXAgZ3JpZCB3aGVuIGEgc2luZ2xlIHVzZXIgaXMgc2VsZWN0ZWQgaW4gc2luZ2xlIHNlbGVjdGlvbiBtb2RlLlxuICAgICAqIFRoZSBpbnB1dCB3aWxsIGJlIHNob3duIGFnYWluIHdoZW4gdGhlIHVzZXIgaXMgcmVtb3ZlZCB1c2luZyB0aGUgaWNvbiBvbiB0aGUgY2hpcC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGhpZGVJbnB1dE9uU2luZ2xlU2VsZWN0aW9uID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBNYXRlcmlhbCBmb3JtIGZpZWxkIGFwcGVhcmFuY2UgKGZpbGwgLyBvdXRsaW5lKVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZm9ybUZpZWxkQXBwZWFyYW5jZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSA9ICdmaWxsJztcblxuICAgIC8qKlxuICAgICAqIE1hdGVyaWFsIGZvcm0gZmllbGQgc3Vic2NyaXB0IHNpemluZyAoZml4ZWQgLyBkeW5hbWljKVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZm9ybUZpZWxkU3Vic2NyaXB0U2l6aW5nOiBTdWJzY3JpcHRTaXppbmcgPSAnZml4ZWQnO1xuXG4gICAgLyoqXG4gICAgICogU2hvdyBlcnJvcnMgdW5kZXIgdGhlIGZvcm0gZmllbGRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNob3dFcnJvcnM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogU2hvdyB0aGUgZnVsbCBuYW1lIG9mIHRoZSB1c2VyIG9uIGhvdmVyIGluIHRoZSBjaGlwc1xuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd0Z1bGxOYW1lT25Ib3ZlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiBhIHVzZXIgaXMgc2VsZWN0ZWQuICovXG4gICAgQE91dHB1dCgpXG4gICAgc2VsZWN0VXNlciA9IG5ldyBFdmVudEVtaXR0ZXI8SWRlbnRpdHlVc2VyTW9kZWw+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGEgc2VsZWN0ZWQgdXNlciBpcyByZW1vdmVkIGluIG11bHRpIHNlbGVjdGlvbiBtb2RlLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlbW92ZVVzZXIgPSBuZXcgRXZlbnRFbWl0dGVyPElkZW50aXR5VXNlck1vZGVsPigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiBhIHVzZXIgc2VsZWN0aW9uIGNoYW5nZS4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBjaGFuZ2VkVXNlcnMgPSBuZXcgRXZlbnRFbWl0dGVyPElkZW50aXR5VXNlck1vZGVsW10+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGFuIHdhcm5pbmcgb2NjdXJzLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHdhcm5pbmcgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIEBWaWV3Q2hpbGQoJ3VzZXJJbnB1dCcpXG4gICAgcHJpdmF0ZSB1c2VySW5wdXQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG5cbiAgICBwcml2YXRlIHNlYXJjaFVzZXJzOiBJZGVudGl0eVVzZXJNb2RlbFtdID0gW107XG5cbiAgICBzZWxlY3RlZFVzZXJzOiBJZGVudGl0eVVzZXJNb2RlbFtdID0gW107XG4gICAgaW52YWxpZFVzZXJzOiBJZGVudGl0eVVzZXJNb2RlbFtdID0gW107XG5cbiAgICBzZWFyY2hVc2VycyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElkZW50aXR5VXNlck1vZGVsW10+KHRoaXMuc2VhcmNoVXNlcnMpO1xuICAgIHN1YnNjcmlwdEFuaW1hdGlvblN0YXRlOiBzdHJpbmcgPSAnZW50ZXInO1xuICAgIGlzRm9jdXNlZDogYm9vbGVhbjtcbiAgICB0b3VjaGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICB2YWxpZGF0ZVVzZXJzTWVzc2FnZTogc3RyaW5nO1xuICAgIHNlYXJjaGVkVmFsdWUgPSAnJztcblxuICAgIHZhbGlkYXRpb25Mb2FkaW5nID0gZmFsc2U7XG4gICAgc2VhcmNoTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgdHlwaW5nVW5pcXVlVmFsdWVOb3RFbXB0eSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgaWRlbnRpdHlVc2VyU2VydmljZTogSWRlbnRpdHlVc2VyU2VydmljZSkge31cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmluaXRTZWFyY2goKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmhhc1ByZXNlbGVjdGVkVXNlcnNDaGFuZ2VkKGNoYW5nZXMpIHx8IHRoaXMuaGFzTW9kZUNoYW5nZWQoY2hhbmdlcykgfHwgdGhpcy5pc1ZhbGlkYXRpb25DaGFuZ2VkKGNoYW5nZXMpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNQcmVTZWxlY3RVc2VycygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUHJlU2VsZWN0VXNlcnMoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5oYXNQcmVzZWxlY3RlZFVzZXJzQ2xlYXJlZChjaGFuZ2VzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VycyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZFVzZXJzID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pc1ZhbGlkYXRpb25FbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmludmFsaWRVc2VycyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNSZWFkb25seSgpICYmIHRoaXMuc2VhcmNoVXNlckN0cmwuZW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hVc2VyQ3RybC5kaXNhYmxlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNSZWFkb25seSgpICYmIHRoaXMuc2VhcmNoVXNlckN0cmwuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVXNlckN0cmwuZW5hYmxlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmhpZGVJbnB1dE9uU2luZ2xlU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFVzZXJzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmlzU2luZ2xlTW9kZSgpICYmIHRoaXMudXNlcklucHV0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy51c2VySW5wdXQubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0U2VhcmNoKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVTdHJlYW0oKTtcbiAgICAgICAgdGhpcy50eXBpbmdVbmlxdWVWYWx1ZU5vdEVtcHR5JFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKChuYW1lOiBzdHJpbmcpID0+IG5hbWUubGVuZ3RoID49IDEpLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgobmFtZTogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXR5VXNlclNlcnZpY2Uuc2VhcmNoKG5hbWUsIHsgcm9sZXM6IHRoaXMucm9sZXMsIHdpdGhpbkFwcGxpY2F0aW9uOiB0aGlzLmFwcE5hbWUsIGdyb3VwczogdGhpcy5ncm91cHNSZXN0cmljdGlvbiB9KVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoKHVzZXJzOiBJZGVudGl0eVVzZXJNb2RlbFtdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXRTZWFyY2hVc2VycygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaExvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZXJzO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGZpbHRlcigodXNlcikgPT4gIXRoaXMuaXNVc2VyQWxyZWFkeVNlbGVjdGVkKHVzZXIpICYmICF0aGlzLmlzRXhjbHVkZWRVc2VyKHVzZXIpKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodXNlcjogSWRlbnRpdHlVc2VyTW9kZWwpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hVc2VycyQubmV4dCh0aGlzLnNlYXJjaFVzZXJzKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZVN0cmVhbSgpIHtcbiAgICAgICAgY29uc3QgdHlwaW5nVmFsdWVGcm9tQ29udHJvbCQgPSB0aGlzLnNlYXJjaFVzZXJDdHJsLnZhbHVlQ2hhbmdlcztcblxuICAgICAgICBjb25zdCB0eXBpbmdWYWx1ZVR5cGVTdGluZyQgPSB0eXBpbmdWYWx1ZUZyb21Db250cm9sJC5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoTG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHR5cGluZ1ZhbHVlSGFuZGxlRXJyb3JNZXNzYWdlJCA9IHR5cGluZ1ZhbHVlVHlwZVN0aW5nJC5waXBlKFxuICAgICAgICAgICAgdGFwKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VHlwaW5nRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHR5cGluZ1ZhbHVlRGVib3VuY2VkVW5pcXVlJCA9IHR5cGluZ1ZhbHVlSGFuZGxlRXJyb3JNZXNzYWdlJC5waXBlKGRlYm91bmNlVGltZSg1MDApLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcblxuICAgICAgICB0aGlzLnR5cGluZ1VuaXF1ZVZhbHVlTm90RW1wdHkkID0gdHlwaW5nVmFsdWVEZWJvdW5jZWRVbmlxdWUkLnBpcGUoXG4gICAgICAgICAgICB0YXAoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoZWRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoVXNlckN0cmwubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hVc2VyQ3RybC5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLnJlc2V0U2VhcmNoVXNlcnMoKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzVmFsaWRhdGlvbkVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlID09PSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNVc2VyQWxyZWFkeVNlbGVjdGVkKHNlYXJjaFVzZXI6IElkZW50aXR5VXNlck1vZGVsKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVXNlcnMgJiYgdGhpcy5zZWxlY3RlZFVzZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VsZWN0ZWRVc2Vycy5maW5kKChzZWxlY3RlZFVzZXIpID0+IHRoaXMuZXF1YWxzVXNlcnMoc2VsZWN0ZWRVc2VyLCBzZWFyY2hVc2VyKSk7XG5cbiAgICAgICAgICAgIHJldHVybiAhIXJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0V4Y2x1ZGVkVXNlcihzZWFyY2hVc2VyOiBJZGVudGl0eVVzZXJNb2RlbCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5leGNsdWRlZFVzZXJzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gISF0aGlzLmV4Y2x1ZGVkVXNlcnMuZmluZCgoZXhjbHVkZWRVc2VyKSA9PiB0aGlzLmVxdWFsc1VzZXJzKGV4Y2x1ZGVkVXNlciwgc2VhcmNoVXNlcikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRQcmVTZWxlY3RVc2VycygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJzID0gW107XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTaW5nbGVNb2RlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VycyA9IFt0aGlzLnByZVNlbGVjdFVzZXJzWzBdXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VycyA9IHRoaXMucmVtb3ZlRHVwbGljYXRlZFVzZXJzKHRoaXMucHJlU2VsZWN0VXNlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckNoaXBzQ3RybC5zZXRWYWx1ZSh0aGlzLnNlbGVjdGVkVXNlcnNbMF0udXNlcm5hbWUpO1xuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkYXRpb25FbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZVByZXNlbGVjdFVzZXJzKCk7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25Mb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFByZXNlbGVjdGVkVXNlcnMoKTogSWRlbnRpdHlVc2VyTW9kZWxbXSB7XG4gICAgICAgIGlmICh0aGlzLmlzU2luZ2xlTW9kZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gW3RoaXMucHJlU2VsZWN0VXNlcnNbMF1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlRHVwbGljYXRlZFVzZXJzKHRoaXMucHJlU2VsZWN0VXNlcnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZVByZXNlbGVjdFVzZXJzKCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHRoaXMuaW52YWxpZFVzZXJzID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCB1c2VyIG9mIHRoaXMuZ2V0UHJlc2VsZWN0ZWRVc2VycygpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSAoXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaWRlbnRpdHlVc2VyU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNlYXJjaCh1c2VyLnVzZXJuYW1lLCB7IHJvbGVzOiB0aGlzLnJvbGVzLCB3aXRoaW5BcHBsaWNhdGlvbjogdGhpcy5hcHBOYW1lLCBncm91cHM6IHRoaXMuZ3JvdXBzUmVzdHJpY3Rpb24gfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50b1Byb21pc2UoKVxuICAgICAgICAgICAgICAgIClbMF07XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZXF1YWxzVXNlcnModXNlciwgdmFsaWRhdGlvblJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkVXNlcnMucHVzaCh1c2VyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoZWNrUHJlc2VsZWN0VmFsaWRhdGlvbkVycm9ycygpO1xuICAgIH1cblxuICAgIGVxdWFsc1VzZXJzKHByZXNlbGVjdGVkVXNlcjogSWRlbnRpdHlVc2VyTW9kZWwsIGlkZW50aXR5VXNlcjogSWRlbnRpdHlVc2VyTW9kZWwpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHByZXNlbGVjdGVkVXNlciAmJiBpZGVudGl0eVVzZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZVByb3BlcnR5SWRlbnRpZmllcnMgPSBbJ2lkJywgJ3VzZXJuYW1lJywgJ2VtYWlsJ107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIE9iamVjdC5rZXlzKHByZXNlbGVjdGVkVXNlcikpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJlc2VsZWN0ZWRVc2VyW3Byb3BlcnR5XSAhPT0gdW5kZWZpbmVkICYmIHVuaXF1ZVByb3BlcnR5SWRlbnRpZmllcnMuaW5jbHVkZXMocHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmVzZWxlY3RlZFVzZXJbcHJvcGVydHldID09PSBpZGVudGl0eVVzZXJbcHJvcGVydHldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmVtb3ZlRHVwbGljYXRlZFVzZXJzKHVzZXJzOiBJZGVudGl0eVVzZXJNb2RlbFtdKTogSWRlbnRpdHlVc2VyTW9kZWxbXSB7XG4gICAgICAgIHJldHVybiB1c2Vycy5maWx0ZXIoXG4gICAgICAgICAgICAodXNlciwgaW5kZXgsIHNlbGYpID0+XG4gICAgICAgICAgICAgICAgaW5kZXggPT09IHNlbGYuZmluZEluZGV4KChhdXhVc2VyKSA9PiB1c2VyLmlkID09PSBhdXhVc2VyLmlkICYmIHVzZXIudXNlcm5hbWUgPT09IGF1eFVzZXIudXNlcm5hbWUgJiYgdXNlci5lbWFpbCA9PT0gYXV4VXNlci5lbWFpbClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBvblNlbGVjdCh1c2VyOiBJZGVudGl0eVVzZXJNb2RlbCk6IHZvaWQge1xuICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RVc2VyLmVtaXQodXNlcik7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVNb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNVc2VyQWxyZWFkeVNlbGVjdGVkKHVzZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2Vycy5wdXNoKHVzZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkVXNlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVXNlcnMgPSBbdXNlcl07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGlkZUlucHV0T25TaW5nbGVTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51c2VySW5wdXQubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51c2VySW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hVc2VyQ3RybC5zZXRWYWx1ZSgnJyk7XG4gICAgICAgICAgICB0aGlzLnVzZXJDaGlwc0NvbnRyb2xWYWx1ZSh0aGlzLnNlbGVjdGVkVXNlcnNbMF0udXNlcm5hbWUpO1xuXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWRVc2Vycy5lbWl0KHRoaXMuc2VsZWN0ZWRVc2Vycyk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0U2VhcmNoVXNlcnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uUmVtb3ZlKHVzZXJUb1JlbW92ZTogSWRlbnRpdHlVc2VyTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW1vdmVVc2VyLmVtaXQodXNlclRvUmVtb3ZlKTtcbiAgICAgICAgdGhpcy5yZW1vdmVVc2VyRnJvbVNlbGVjdGVkKHVzZXJUb1JlbW92ZSk7XG4gICAgICAgIHRoaXMuY2hhbmdlZFVzZXJzLmVtaXQodGhpcy5zZWxlY3RlZFVzZXJzKTtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRVc2Vycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMudXNlckNoaXBzQ29udHJvbFZhbHVlKCcnKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmhpZGVJbnB1dE9uU2luZ2xlU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51c2VySW5wdXQubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXNlckNoaXBzQ29udHJvbFZhbHVlKHRoaXMuc2VsZWN0ZWRVc2Vyc1swXS51c2VybmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWFyY2hVc2VyQ3RybC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLnNlYXJjaFVzZXJDdHJsLm1hcmtBc1RvdWNoZWQoKTtcblxuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkYXRpb25FbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlVXNlckZyb21WYWxpZGF0aW9uKHVzZXJUb1JlbW92ZSk7XG4gICAgICAgICAgICB0aGlzLmNoZWNrUHJlc2VsZWN0VmFsaWRhdGlvbkVycm9ycygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja1ByZXNlbGVjdFZhbGlkYXRpb25FcnJvcnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW52YWxpZFVzZXJzID0gdGhpcy5yZW1vdmVEdXBsaWNhdGVkVXNlcnModGhpcy5pbnZhbGlkVXNlcnMpO1xuXG4gICAgICAgIGlmICh0aGlzLmludmFsaWRVc2Vycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlSW52YWxpZFVzZXJzTWVzc2FnZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53YXJuaW5nLmVtaXQoe1xuICAgICAgICAgICAgbWVzc2FnZTogJ0lOVkFMSURfUFJFU0VMRUNURURfVVNFUlMnLFxuICAgICAgICAgICAgdXNlcnM6IHRoaXMuaW52YWxpZFVzZXJzXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlVXNlckZyb21TZWxlY3RlZCh7IGlkLCB1c2VybmFtZSwgZW1haWwgfTogSWRlbnRpdHlVc2VyTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5kZXhUb1JlbW92ZSA9IHRoaXMuc2VsZWN0ZWRVc2Vycy5maW5kSW5kZXgoKHVzZXIpID0+IHVzZXIuaWQgPT09IGlkICYmIHVzZXIudXNlcm5hbWUgPT09IHVzZXJuYW1lICYmIHVzZXIuZW1haWwgPT09IGVtYWlsKTtcblxuICAgICAgICBpZiAoaW5kZXhUb1JlbW92ZSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2Vycy5zcGxpY2UoaW5kZXhUb1JlbW92ZSwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZVVzZXJGcm9tVmFsaWRhdGlvbih7IGlkLCB1c2VybmFtZSwgZW1haWwgfTogSWRlbnRpdHlVc2VyTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5kZXhUb1JlbW92ZSA9IHRoaXMuaW52YWxpZFVzZXJzLmZpbmRJbmRleCgodXNlcikgPT4gdXNlci5pZCA9PT0gaWQgJiYgdXNlci51c2VybmFtZSA9PT0gdXNlcm5hbWUgJiYgdXNlci5lbWFpbCA9PT0gZW1haWwpO1xuXG4gICAgICAgIGlmIChpbmRleFRvUmVtb3ZlICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkVXNlcnMuc3BsaWNlKGluZGV4VG9SZW1vdmUsIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUludmFsaWRVc2Vyc01lc3NhZ2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVVc2Vyc01lc3NhZ2UgPSAnJztcblxuICAgICAgICB0aGlzLmludmFsaWRVc2Vycy5mb3JFYWNoKChpbnZhbGlkVXNlciwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gdGhpcy5pbnZhbGlkVXNlcnMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVVc2Vyc01lc3NhZ2UgKz0gYCR7aW52YWxpZFVzZXIudXNlcm5hbWV9IGA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVVc2Vyc01lc3NhZ2UgKz0gYCR7aW52YWxpZFVzZXIudXNlcm5hbWV9LCBgO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoYXNQcmVzZWxlY3RFcnJvcigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZFVzZXJzICYmIHRoaXMuaW52YWxpZFVzZXJzLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgZ2V0RGlzcGxheU5hbWUodXNlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBGdWxsTmFtZVBpcGUucHJvdG90eXBlLnRyYW5zZm9ybSh1c2VyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTXVsdGlwbGVNb2RlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnbXVsdGlwbGUnO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNTaW5nbGVNb2RlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnc2luZ2xlJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzU2luZ2xlU2VsZWN0aW9uUmVhZG9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2luZ2xlTW9kZSgpICYmIHRoaXMuc2VsZWN0ZWRVc2Vycy5sZW5ndGggPT09IDEgJiYgdGhpcy5zZWxlY3RlZFVzZXJzWzBdLnJlYWRvbmx5ID09PSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFzUHJlU2VsZWN0VXNlcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZVNlbGVjdFVzZXJzICYmIHRoaXMucHJlU2VsZWN0VXNlcnMubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc01vZGVDaGFuZ2VkKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNoYW5nZXM/Lm1vZGUgJiYgY2hhbmdlcy5tb2RlLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlcy5tb2RlLnByZXZpb3VzVmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1ZhbGlkYXRpb25DaGFuZ2VkKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNoYW5nZXM/LnZhbGlkYXRlICYmIGNoYW5nZXMudmFsaWRhdGUuY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzLnZhbGlkYXRlLnByZXZpb3VzVmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYXNQcmVzZWxlY3RlZFVzZXJzQ2hhbmdlZChjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjaGFuZ2VzPy5wcmVTZWxlY3RVc2VycyAmJiBjaGFuZ2VzLnByZVNlbGVjdFVzZXJzLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlcy5wcmVTZWxlY3RVc2Vycy5wcmV2aW91c1ZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFzUHJlc2VsZWN0ZWRVc2Vyc0NsZWFyZWQoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY2hhbmdlcz8ucHJlU2VsZWN0VXNlcnM/LmN1cnJlbnRWYWx1ZT8ubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZXRTZWFyY2hVc2VycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWFyY2hVc2VycyA9IFtdO1xuICAgICAgICB0aGlzLnNlYXJjaFVzZXJzJC5uZXh0KHRoaXMuc2VhcmNoVXNlcnMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0VHlwaW5nRXJyb3IoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VhcmNoVXNlckN0cmwuc2V0RXJyb3JzKHtcbiAgICAgICAgICAgIHNlYXJjaFR5cGluZ0Vycm9yOiB0cnVlLFxuICAgICAgICAgICAgLi4udGhpcy5zZWFyY2hVc2VyQ3RybC5lcnJvcnNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1c2VyQ2hpcHNDb250cm9sVmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLnVzZXJDaGlwc0N0cmwuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICB0aGlzLnVzZXJDaGlwc0N0cmwubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy51c2VyQ2hpcHNDdHJsLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB9XG5cbiAgICBnZXRTZWxlY3RlZFVzZXJzKCk6IElkZW50aXR5VXNlck1vZGVsW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFVzZXJzO1xuICAgIH1cblxuICAgIGlzUmVhZG9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRPbmx5IHx8IHRoaXMuaXNTaW5nbGVTZWxlY3Rpb25SZWFkb25seSgpO1xuICAgIH1cblxuICAgIGlzVmFsaWRhdGlvbkxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWRhdGlvbkVuYWJsZWQoKSAmJiB0aGlzLnZhbGlkYXRpb25Mb2FkaW5nO1xuICAgIH1cblxuICAgIG1hcmtBc1RvdWNoZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG91Y2hlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaXNUb3VjaGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b3VjaGVkO1xuICAgIH1cblxuICAgIGlzU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVXNlcnMgJiYgISF0aGlzLnNlbGVjdGVkVXNlcnMubGVuZ3RoO1xuICAgIH1cblxuICAgIGlzRGlydHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVG91Y2hlZCgpICYmICF0aGlzLmlzU2VsZWN0ZWQoKTtcbiAgICB9XG5cbiAgICBzZXRGb2N1cyhpc0ZvY3VzZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5pc0ZvY3VzZWQgPSBpc0ZvY3VzZWQ7XG4gICAgfVxuXG4gICAgaGFzRXJyb3IoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuc2VhcmNoVXNlckN0cmwuZXJyb3JzO1xuICAgIH1cblxuICAgIGdldFZhbGlkYXRpb25QYXR0ZXJuKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlYXJjaFVzZXJDdHJsLmVycm9ycy5wYXR0ZXJuLnJlcXVpcmVkUGF0dGVybjtcbiAgICB9XG5cbiAgICBnZXRWYWxpZGF0aW9uTWF4TGVuZ3RoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlYXJjaFVzZXJDdHJsLmVycm9ycy5tYXhsZW5ndGgucmVxdWlyZWRMZW5ndGg7XG4gICAgfVxuXG4gICAgZ2V0VmFsaWRhdGlvbk1pbkxlbmd0aCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2hVc2VyQ3RybC5lcnJvcnMubWlubGVuZ3RoLnJlcXVpcmVkTGVuZ3RoO1xuICAgIH1cbn1cbiIsIjxmb3JtPlxuICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICBbc3Vic2NyaXB0U2l6aW5nXT1cImZvcm1GaWVsZFN1YnNjcmlwdFNpemluZ1wiXG4gICAgICAgIGNsYXNzPVwiYWRmLXBlb3BsZS1jbG91ZCBhZGYtZm9ybS1maWVsZC1pbnB1dFwiXG4gICAgICAgIFtjbGFzcy5hZGYtaW52YWxpZF09XCJoYXNFcnJvcigpICYmIGlzRGlydHkoKVwiXG4gICAgPlxuICAgICAgICA8bWF0LWxhYmVsICpuZ0lmPVwiIXRpdGxlXCI+XG4gICAgICAgICAgICA8c3Bhbj57e2xhYmVsfX08L3NwYW4+XG4gICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICA8bWF0LWxhYmVsICpuZ0lmPVwidGl0bGVcIj57eyB0aXRsZSB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuXG4gICAgICAgIDxtYXQtY2hpcC1ncmlkIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiICN1c2VyTXVsdGlwbGVDaGlwTGlzdCBkYXRhLWF1dG9tYXRpb24taWQ9XCJhZGYtY2xvdWQtcGVvcGxlLWNoaXAtbGlzdFwiPlxuICAgICAgICAgICAgPG1hdC1jaGlwLXJvd1xuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB1c2VyIG9mIHNlbGVjdGVkVXNlcnNcIlxuICAgICAgICAgICAgICAgIFtyZW1vdmFibGVdPVwiIXVzZXIucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtYXV0b21hdGlvbi1pZF09XCInYWRmLXBlb3BsZS1jbG91ZC1jaGlwLScgKyB1c2VyLnVzZXJuYW1lXCJcbiAgICAgICAgICAgICAgICAocmVtb3ZlZCk9XCJvblJlbW92ZSh1c2VyKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHkoKSB8fCBpc1ZhbGlkYXRpb25Mb2FkaW5nKClcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgKHVzZXIucmVhZG9ubHkgPyAnQURGX0NMT1VEX0dST1VQUy5NQU5EQVRPUlknIDogJycpIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93RnVsbE5hbWVPbkhvdmVyID8gKHVzZXIgfCBmdWxsTmFtZSA6IHRydWUpIDogdXNlci5lbWFpbFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgdXNlciB8IGZ1bGxOYW1lIH19XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgICAgICAgIG1hdENoaXBSZW1vdmVcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhKHVzZXIucmVhZG9ubHkgfHwgcmVhZE9ubHkpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1hdXRvbWF0aW9uLWlkXT1cIidhZGYtcGVvcGxlLWNsb3VkLWNoaXAtcmVtb3ZlLWljb24tJyArIHVzZXIudXNlcm5hbWVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsXG4gICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvbWF0LWNoaXAtcm93PlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seSgpXCJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwic2VhcmNoVXNlckN0cmxcIlxuICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgW21hdENoaXBJbnB1dEZvcl09XCJ1c2VyTXVsdGlwbGVDaGlwTGlzdFwiXG4gICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5KCkgfHwgaXNWYWxpZGF0aW9uTG9hZGluZygpXCJcbiAgICAgICAgICAgICAgICAoZm9jdXMpPVwic2V0Rm9jdXModHJ1ZSlcIlxuICAgICAgICAgICAgICAgIChibHVyKT1cInNldEZvY3VzKGZhbHNlKTsgbWFya0FzVG91Y2hlZCgpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFkZi1jbG91ZC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgZGF0YS1hdXRvbWF0aW9uLWlkPVwiYWRmLXBlb3BsZS1jbG91ZC1zZWFyY2gtaW5wdXRcIlxuICAgICAgICAgICAgICAgICN1c2VySW5wdXRcbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvbWF0LWNoaXAtZ3JpZD5cblxuICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgYXV0b0FjdGl2ZUZpcnN0T3B0aW9uXG4gICAgICAgICAgICBjbGFzcz1cImFkZi1wZW9wbGUtY2xvdWQtbGlzdFwiXG4gICAgICAgICAgICAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib25TZWxlY3QoJGV2ZW50Lm9wdGlvbi52YWx1ZSlcIlxuICAgICAgICAgICAgW2Rpc3BsYXlXaXRoXT1cImdldERpc3BsYXlOYW1lXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihzZWFyY2hVc2VycyQgfCBhc3luYyk/Lmxlbmd0aDsgZWxzZSBub1Jlc3VsdHNcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdXNlciBvZiBzZWFyY2hVc2VycyQgfCBhc3luYzsgbGV0IGkgPSBpbmRleFwiIFt2YWx1ZV09XCJ1c2VyXCIgY2xhc3M9XCJhZGYtcGVvcGxlLWNsb3VkLW9wdGlvbi1hY3RpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZi1wZW9wbGUtY2xvdWQtcm93XCIgaWQ9XCJhZGYtcGVvcGxlLWNsb3VkLXVzZXIte3sgdXNlci51c2VybmFtZSB9fVwiIGRhdGEtYXV0b21hdGlvbi1pZD1cImFkZi1wZW9wbGUtY2xvdWQtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtvdXRlckhUTUxdPVwidXNlciB8IHVzZXJuYW1lSW5pdGlhbHMgOiAnYWRmLXBlb3BsZS1jbG91ZC1waWMnXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkZi1wZW9wbGUtbGFiZWwtbmFtZVwiPiB7eyB1c2VyIHwgZnVsbE5hbWUgOiB0cnVlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9SZXN1bHRzPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VhcmNoVXNlckN0cmwuaGFzRXJyb3IoJ3NlYXJjaFR5cGluZ0Vycm9yJykgJiYgIXNlYXJjaExvYWRpbmdcIlxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFkZi1wZW9wbGUtY2xvdWQtb3B0aW9uLW5vdC1hY3RpdmVcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLWF1dG9tYXRpb24taWQ9XCJhZGYtcGVvcGxlLWNsb3VkLW5vLXJlc3VsdHNcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+IHt7ICdBREZfQ0xPVURfVVNFUlMuRVJST1IuTk9UX0ZPVU5EJyB8IHRyYW5zbGF0ZSA6IHsgdXNlck5hbWU6IHNlYXJjaGVkVmFsdWUgfSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgIDxtYXQtcHJvZ3Jlc3MtYmFyICpuZ0lmPVwidmFsaWRhdGlvbkxvYWRpbmdcIiBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiIC8+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWRmLWVycm9yLWNvbnRhaW5lciBhZGYtZXJyb3ItbWVzc2FnZXMtY29udGFpbmVyXCIgKm5nSWY9XCJzaG93RXJyb3JzXCI+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJoYXNQcmVzZWxlY3RFcnJvcigpICYmICFpc1ZhbGlkYXRpb25Mb2FkaW5nKClcIiBbQHRyYW5zaXRpb25NZXNzYWdlc109XCJzdWJzY3JpcHRBbmltYXRpb25TdGF0ZVwiIGNsYXNzPVwiYWRmLWVycm9yXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJhZGYtZXJyb3ItaWNvblwiPmVycm9yX291dGxpbmU8L21hdC1pY29uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZi1lcnJvci10ZXh0XCI+e3sgJ0FERl9DTE9VRF9VU0VSUy5FUlJPUi5OT1RfRk9VTkQnIHwgdHJhbnNsYXRlIDogeyB1c2VyTmFtZTogdmFsaWRhdGVVc2Vyc01lc3NhZ2UgfSB9fTwvZGl2PlxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInNlYXJjaFVzZXJDdHJsLmhhc0Vycm9yKCdwYXR0ZXJuJylcIiBbQHRyYW5zaXRpb25NZXNzYWdlc109XCJzdWJzY3JpcHRBbmltYXRpb25TdGF0ZVwiIGNsYXNzPVwiYWRmLWVycm9yXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJhZGYtZXJyb3ItaWNvblwiPmVycm9yX291dGxpbmU8L21hdC1pY29uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZi1lcnJvci10ZXh0XCI+e3sgJ0FERl9DTE9VRF9QRU9QTEVfR1JPVVBTLkVSUk9SLklOVkFMSURfUEFUVEVSTicgfCB0cmFuc2xhdGUgOiB7IHBhdHRlcm46IGdldFZhbGlkYXRpb25QYXR0ZXJuKCkgfSB9fTwvZGl2PlxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInNlYXJjaFVzZXJDdHJsLmhhc0Vycm9yKCdtYXhsZW5ndGgnKVwiIFtAdHJhbnNpdGlvbk1lc3NhZ2VzXT1cInN1YnNjcmlwdEFuaW1hdGlvblN0YXRlXCIgY2xhc3M9XCJhZGYtZXJyb3JcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFkZi1lcnJvci1pY29uXCI+ZXJyb3Jfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRmLWVycm9yLXRleHRcIj5cbiAgICAgICAgICAgICAgICB7eyAnQURGX0NMT1VEX1BFT1BMRV9HUk9VUFMuRVJST1IuSU5WQUxJRF9NQVhfTEVOR1RIJyB8IHRyYW5zbGF0ZSA6IHsgcmVxdWlyZWRMZW5ndGg6IGdldFZhbGlkYXRpb25NYXhMZW5ndGgoKSB9IH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJzZWFyY2hVc2VyQ3RybC5oYXNFcnJvcignbWlubGVuZ3RoJylcIiBbQHRyYW5zaXRpb25NZXNzYWdlc109XCJzdWJzY3JpcHRBbmltYXRpb25TdGF0ZVwiIGNsYXNzPVwiYWRmLWVycm9yXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJhZGYtZXJyb3ItaWNvblwiPmVycm9yX291dGxpbmU8L21hdC1pY29uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZi1lcnJvci10ZXh0XCI+XG4gICAgICAgICAgICAgICAge3sgJ0FERl9DTE9VRF9QRU9QTEVfR1JPVVBTLkVSUk9SLklOVkFMSURfTUlOX0xFTkdUSCcgfCB0cmFuc2xhdGUgOiB7IHJlcXVpcmVkTGVuZ3RoOiBnZXRWYWxpZGF0aW9uTWluTGVuZ3RoKCkgfSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAqbmdJZj1cIihzZWFyY2hVc2VyQ3RybC5oYXNFcnJvcigncmVxdWlyZWQnKSB8fCB1c2VyQ2hpcHNDdHJsLmhhc0Vycm9yKCdyZXF1aXJlZCcpKSAmJiBpc0RpcnR5KClcIlxuICAgICAgICAgICAgW0B0cmFuc2l0aW9uTWVzc2FnZXNdPVwic3Vic2NyaXB0QW5pbWF0aW9uU3RhdGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJhZGYtZXJyb3JcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJhZGYtZXJyb3ItaWNvblwiPmVycm9yX291dGxpbmU8L21hdC1pY29uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZi1lcnJvci10ZXh0XCI+e3sgJ0FERl9DTE9VRF9QRU9QTEVfR1JPVVBTLkVSUk9SLlJFUVVJUkVEJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvclxuICAgICAgICAgICAgKm5nSWY9XCJzZWFyY2hVc2VyQ3RybC5oYXNFcnJvcignc2VhcmNoVHlwaW5nRXJyb3InKSAmJiAhdGhpcy5pc0ZvY3VzZWRcIlxuICAgICAgICAgICAgW0B0cmFuc2l0aW9uTWVzc2FnZXNdPVwic3Vic2NyaXB0QW5pbWF0aW9uU3RhdGVcIlxuICAgICAgICAgICAgZGF0YS1hdXRvbWF0aW9uLWlkPVwiaW52YWxpZC11c2Vycy10eXBpbmctZXJyb3JcIlxuICAgICAgICAgICAgY2xhc3M9XCJhZGYtZXJyb3JcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJhZGYtZXJyb3ItaWNvblwiPmVycm9yX291dGxpbmU8L21hdC1pY29uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZi1lcnJvci10ZXh0XCI+e3sgJ0FERl9DTE9VRF9VU0VSUy5FUlJPUi5OT1RfRk9VTkQnIHwgdHJhbnNsYXRlIDogeyB1c2VyTmFtZTogc2VhcmNoZWRWYWx1ZSB9IH19PC9kaXY+XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgIDwvZGl2PlxuPC9mb3JtPlxuIl19
|