@alfresco/adf-process-services-cloud 8.1.0-16117584844 → 8.1.0-16120632321
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/fesm2022/adf-process-services-cloud.mjs +350 -355
- package/fesm2022/adf-process-services-cloud.mjs.map +1 -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 -415
- 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 -463
- 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 -103
- 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 -480
- 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 -91
- package/esm2022/lib/rich-text-editor/editorjs-config.mjs +0 -101
- package/esm2022/lib/rich-text-editor/index.mjs +0 -18
- package/esm2022/lib/rich-text-editor/public-api.mjs +0 -19
- package/esm2022/lib/rich-text-editor/rich-text-editor.component.mjs +0 -80
- package/esm2022/lib/rich-text-editor/rich-text-editor.module.mjs +0 -33
- 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 -214
- 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 -283
- 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 -78
- 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 -57
- package/esm2022/lib/types.mjs +0 -18
- package/esm2022/public-api.mjs +0 -40
|
@@ -1,467 +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 { DestroyRef, Directive, EventEmitter, inject, Input, Output } from '@angular/core';
|
|
18
|
-
import { AssignmentType, TaskStatusFilter } from '../../models/filter-cloud.model';
|
|
19
|
-
import { TaskCloudService } from './../../../services/task-cloud.service';
|
|
20
|
-
import { AppsProcessCloudService } from './../../../../app/services/apps-process-cloud.service';
|
|
21
|
-
import { DateCloudFilterType } from '../../../../models/date-cloud-filter.model';
|
|
22
|
-
import { UntypedFormBuilder } from '@angular/forms';
|
|
23
|
-
import { debounceTime, filter, finalize, switchMap } from 'rxjs/operators';
|
|
24
|
-
import { DateAdapter } from '@angular/material/core';
|
|
25
|
-
import { DateFnsUtils, TranslationService, UserPreferencesService, UserPreferenceValues } from '@alfresco/adf-core';
|
|
26
|
-
import { TaskFilterDialogCloudComponent } from '../task-filter-dialog/task-filter-dialog-cloud.component';
|
|
27
|
-
import { MatDialog } from '@angular/material/dialog';
|
|
28
|
-
import { isValid } from 'date-fns';
|
|
29
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
30
|
-
import * as i0 from "@angular/core";
|
|
31
|
-
const ACTION_SAVE = 'save';
|
|
32
|
-
const ACTION_SAVE_AS = 'saveAs';
|
|
33
|
-
const ACTION_DELETE = 'delete';
|
|
34
|
-
const APP_DEPLOYED_STATUS = 'DEPLOYED';
|
|
35
|
-
const APPLICATION_NAME = 'appName';
|
|
36
|
-
const PROCESS_DEFINITION_NAME = 'processDefinitionName';
|
|
37
|
-
const LAST_MODIFIED_PROPERTY = 'lastModified';
|
|
38
|
-
const DATE_FORMAT = 'DD/MM/YYYY';
|
|
39
|
-
const DEFAULT_ACTIONS = [ACTION_SAVE, ACTION_SAVE_AS, ACTION_DELETE];
|
|
40
|
-
const SORT_PROPERTY = 'sort';
|
|
41
|
-
const ORDER_PROPERTY = 'order';
|
|
42
|
-
// eslint-disable-next-line @angular-eslint/directive-class-suffix
|
|
43
|
-
export class BaseEditTaskFilterCloudComponent {
|
|
44
|
-
constructor() {
|
|
45
|
-
/** (required) Name of the app. */
|
|
46
|
-
this.appName = '';
|
|
47
|
-
/** List of environments. */
|
|
48
|
-
this.environmentList = [];
|
|
49
|
-
/** Toggles the title. */
|
|
50
|
-
this.showTitle = true;
|
|
51
|
-
/** Toggles display of task filter name */
|
|
52
|
-
this.showTaskFilterName = true;
|
|
53
|
-
/** List of task filter properties to display. */
|
|
54
|
-
this.filterProperties = [];
|
|
55
|
-
/** user role. */
|
|
56
|
-
this.role = '';
|
|
57
|
-
/** Toggles the filter actions. */
|
|
58
|
-
this.showFilterActions = true;
|
|
59
|
-
/** List of task filter actions. */
|
|
60
|
-
this.actions = [...DEFAULT_ACTIONS];
|
|
61
|
-
/** List of sort properties to display. */
|
|
62
|
-
this.sortProperties = [];
|
|
63
|
-
/** Emitted when a filter action occurs (i.e Save, Save As, Delete). */
|
|
64
|
-
this.action = new EventEmitter();
|
|
65
|
-
this.applicationNames = [];
|
|
66
|
-
this.processDefinitionNames = [];
|
|
67
|
-
this.formHasBeenChanged = false;
|
|
68
|
-
this.taskFilterProperties = [];
|
|
69
|
-
this.taskFilterActions = [];
|
|
70
|
-
this.toggleFilterActions = false;
|
|
71
|
-
this.sortDirections = [
|
|
72
|
-
{ value: 'ASC', label: 'ADF_CLOUD_TASK_FILTERS.DIRECTION.ASCENDING' },
|
|
73
|
-
{ value: 'DESC', label: 'ADF_CLOUD_TASK_FILTERS.DIRECTION.DESCENDING' }
|
|
74
|
-
];
|
|
75
|
-
this.allProcessDefinitionNamesOption = {
|
|
76
|
-
value: '',
|
|
77
|
-
label: 'ADF_CLOUD_TASK_FILTERS.STATUS.ALL'
|
|
78
|
-
};
|
|
79
|
-
/** Emitted when a task filter property changes. */
|
|
80
|
-
this.filterChange = new EventEmitter();
|
|
81
|
-
this.isLoading = false;
|
|
82
|
-
this.destroyRef = inject(DestroyRef);
|
|
83
|
-
this.translateService = inject(TranslationService);
|
|
84
|
-
this.taskCloudService = inject(TaskCloudService);
|
|
85
|
-
this.userPreferencesService = inject(UserPreferencesService);
|
|
86
|
-
this.appsProcessCloudService = inject(AppsProcessCloudService);
|
|
87
|
-
this.dialog = inject(MatDialog);
|
|
88
|
-
this.formBuilder = inject(UntypedFormBuilder);
|
|
89
|
-
this.dateAdapter = inject(DateAdapter);
|
|
90
|
-
}
|
|
91
|
-
static { this.ACTIONS_DISABLED_BY_DEFAULT = [ACTION_SAVE, ACTION_DELETE]; }
|
|
92
|
-
ngOnInit() {
|
|
93
|
-
this.userPreferencesService
|
|
94
|
-
.select(UserPreferenceValues.Locale)
|
|
95
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
96
|
-
.subscribe((locale) => this.dateAdapter.setLocale(locale));
|
|
97
|
-
}
|
|
98
|
-
ngOnChanges(changes) {
|
|
99
|
-
const { id } = changes;
|
|
100
|
-
if (id && id.currentValue !== id.previousValue) {
|
|
101
|
-
if (this.taskFilter && this.taskFilter['id'] === id.currentValue) {
|
|
102
|
-
this.taskFilterProperties = this.createAndFilterProperties();
|
|
103
|
-
this.taskFilterActions = this.createAndFilterActions();
|
|
104
|
-
this.buildForm(this.taskFilterProperties);
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
this.retrieveTaskFilterAndBuildForm();
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
createFilterActions() {
|
|
112
|
-
return [
|
|
113
|
-
{
|
|
114
|
-
actionType: ACTION_SAVE,
|
|
115
|
-
icon: 'adf:save',
|
|
116
|
-
tooltip: 'ADF_CLOUD_EDIT_TASK_FILTER.TOOL_TIP.SAVE'
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
actionType: ACTION_SAVE_AS,
|
|
120
|
-
icon: 'adf:save-as',
|
|
121
|
-
tooltip: 'ADF_CLOUD_EDIT_TASK_FILTER.TOOL_TIP.SAVE_AS'
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
actionType: ACTION_DELETE,
|
|
125
|
-
icon: 'delete',
|
|
126
|
-
tooltip: 'ADF_CLOUD_EDIT_TASK_FILTER.TOOL_TIP.DELETE'
|
|
127
|
-
}
|
|
128
|
-
];
|
|
129
|
-
}
|
|
130
|
-
hasFormChanged(action) {
|
|
131
|
-
if (action.actionType === ACTION_SAVE) {
|
|
132
|
-
return !this.formHasBeenChanged;
|
|
133
|
-
}
|
|
134
|
-
if (action.actionType === ACTION_SAVE_AS) {
|
|
135
|
-
return !this.formHasBeenChanged;
|
|
136
|
-
}
|
|
137
|
-
if (action.actionType === ACTION_DELETE) {
|
|
138
|
-
return false;
|
|
139
|
-
}
|
|
140
|
-
return false;
|
|
141
|
-
}
|
|
142
|
-
onExpand() {
|
|
143
|
-
this.toggleFilterActions = true;
|
|
144
|
-
}
|
|
145
|
-
onClose() {
|
|
146
|
-
this.toggleFilterActions = false;
|
|
147
|
-
}
|
|
148
|
-
isDisabledAction(action) {
|
|
149
|
-
return this.isDisabledForDefaultFilters(action) ? true : this.hasFormChanged(action);
|
|
150
|
-
}
|
|
151
|
-
deepCompare(left, right) {
|
|
152
|
-
return JSON.stringify(left).toLowerCase() === JSON.stringify(right).toLowerCase();
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Get the sanitized filter name
|
|
156
|
-
*
|
|
157
|
-
* @param filterName filter name
|
|
158
|
-
* @returns sanitized filter name
|
|
159
|
-
*/
|
|
160
|
-
getSanitizeFilterName(filterName) {
|
|
161
|
-
const nameWithHyphen = this.replaceSpaceWithHyphen(filterName.trim());
|
|
162
|
-
return nameWithHyphen.toLowerCase();
|
|
163
|
-
}
|
|
164
|
-
replaceSpaceWithHyphen(name) {
|
|
165
|
-
const regExt = new RegExp(' ', 'g');
|
|
166
|
-
return name.replace(regExt, '-');
|
|
167
|
-
}
|
|
168
|
-
executeFilterActions(action) {
|
|
169
|
-
if (action.actionType === ACTION_SAVE) {
|
|
170
|
-
this.save(action);
|
|
171
|
-
}
|
|
172
|
-
else if (action.actionType === ACTION_SAVE_AS) {
|
|
173
|
-
this.saveAs(action);
|
|
174
|
-
}
|
|
175
|
-
else if (action.actionType === ACTION_DELETE) {
|
|
176
|
-
this.delete(action);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
getDeployedApplications() {
|
|
180
|
-
this.appsProcessCloudService.getDeployedApplicationsByStatus(APP_DEPLOYED_STATUS, this.role).subscribe((applications) => {
|
|
181
|
-
if (applications && applications.length > 0) {
|
|
182
|
-
applications.map((application) => {
|
|
183
|
-
this.applicationNames.push({
|
|
184
|
-
label: this.appsProcessCloudService.getApplicationLabel(application, this.environmentList),
|
|
185
|
-
value: application.name
|
|
186
|
-
});
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
getProcessDefinitions() {
|
|
192
|
-
this.taskCloudService.getProcessDefinitions(this.appName).subscribe((processDefinitions) => {
|
|
193
|
-
if (processDefinitions && processDefinitions.length > 0) {
|
|
194
|
-
this.processDefinitionNames.push(this.allProcessDefinitionNamesOption);
|
|
195
|
-
processDefinitions.map((processDefinition) => {
|
|
196
|
-
this.processDefinitionNames.push({ label: processDefinition.name, value: processDefinition.name });
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
checkMandatoryActions() {
|
|
202
|
-
if (this.actions === undefined || this.actions.length === 0) {
|
|
203
|
-
this.actions = [...DEFAULT_ACTIONS];
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
isValidAction(actions, action) {
|
|
207
|
-
return actions ? actions.indexOf(action.actionType) >= 0 : true;
|
|
208
|
-
}
|
|
209
|
-
isFormValid() {
|
|
210
|
-
return this.editTaskFilterForm.valid;
|
|
211
|
-
}
|
|
212
|
-
getPropertyController(property) {
|
|
213
|
-
return this.editTaskFilterForm.get(property.key);
|
|
214
|
-
}
|
|
215
|
-
onDateChanged(newDateValue, dateProperty) {
|
|
216
|
-
if (newDateValue) {
|
|
217
|
-
let date;
|
|
218
|
-
if (typeof newDateValue === 'string') {
|
|
219
|
-
date = DateFnsUtils.parseDate(newDateValue, DATE_FORMAT);
|
|
220
|
-
}
|
|
221
|
-
else {
|
|
222
|
-
date = newDateValue;
|
|
223
|
-
}
|
|
224
|
-
const controller = this.getPropertyController(dateProperty);
|
|
225
|
-
if (isValid(date)) {
|
|
226
|
-
controller.setValue(date.toISOString());
|
|
227
|
-
controller.setErrors(null);
|
|
228
|
-
}
|
|
229
|
-
else {
|
|
230
|
-
controller.setErrors({ invalid: true });
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
onDateRangeFilterChanged(dateRange, property) {
|
|
235
|
-
this.editTaskFilterForm.get(property.attributes?.from).setValue(dateRange.startDate ? dateRange.startDate : null);
|
|
236
|
-
this.editTaskFilterForm.get(property.attributes?.to).setValue(dateRange.endDate ? dateRange.endDate : null);
|
|
237
|
-
this.editTaskFilterForm.get(property.attributes.dateType).setValue(DateCloudFilterType.RANGE);
|
|
238
|
-
}
|
|
239
|
-
onChangedUser(users, userProperty) {
|
|
240
|
-
let selectedUsers;
|
|
241
|
-
if (userProperty.selectionMode === 'single') {
|
|
242
|
-
selectedUsers = users[0];
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
selectedUsers = users;
|
|
246
|
-
}
|
|
247
|
-
this.getPropertyController(userProperty).setValue(selectedUsers);
|
|
248
|
-
}
|
|
249
|
-
onAssignedUsersChange(assignedUsers) {
|
|
250
|
-
this.editTaskFilterForm.get('candidateGroups').setValue(undefined);
|
|
251
|
-
this.editTaskFilterForm.get('assignedUsers').setValue(assignedUsers);
|
|
252
|
-
}
|
|
253
|
-
onAssignedGroupsChange(groups) {
|
|
254
|
-
this.editTaskFilterForm.get('assignedUsers').setValue(undefined);
|
|
255
|
-
this.editTaskFilterForm.get('candidateGroups').setValue(groups);
|
|
256
|
-
}
|
|
257
|
-
onAssignmentTypeChange(assignmentType) {
|
|
258
|
-
switch (assignmentType) {
|
|
259
|
-
case AssignmentType.UNASSIGNED:
|
|
260
|
-
this.editTaskFilterForm.get('status').setValue(TaskStatusFilter.CREATED);
|
|
261
|
-
this.resetAssignmentTypeValues();
|
|
262
|
-
break;
|
|
263
|
-
case AssignmentType.NONE:
|
|
264
|
-
this.editTaskFilterForm.get('status').setValue(TaskStatusFilter.ALL);
|
|
265
|
-
this.resetAssignmentTypeValues();
|
|
266
|
-
break;
|
|
267
|
-
case AssignmentType.ASSIGNED_TO:
|
|
268
|
-
case AssignmentType.CANDIDATE_GROUPS:
|
|
269
|
-
this.editTaskFilterForm.get('status').setValue(TaskStatusFilter.ASSIGNED);
|
|
270
|
-
this.resetAssignmentTypeValues();
|
|
271
|
-
break;
|
|
272
|
-
default:
|
|
273
|
-
this.editTaskFilterForm.get('status').setValue(TaskStatusFilter.ASSIGNED);
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
onStatusChange(status) {
|
|
277
|
-
if (status.value === TaskStatusFilter.CREATED) {
|
|
278
|
-
this.resetAssignmentTypeValues();
|
|
279
|
-
}
|
|
280
|
-
this.selectedStatus = status.value;
|
|
281
|
-
}
|
|
282
|
-
resetAssignmentTypeValues() {
|
|
283
|
-
this.editTaskFilterForm.get('assignedUsers').setValue(undefined);
|
|
284
|
-
this.editTaskFilterForm.get('candidateGroups').setValue(undefined);
|
|
285
|
-
}
|
|
286
|
-
hasError(property) {
|
|
287
|
-
const controller = this.getPropertyController(property);
|
|
288
|
-
return !!controller.errors?.invalid;
|
|
289
|
-
}
|
|
290
|
-
hasLastModifiedProperty() {
|
|
291
|
-
return this.filterProperties.indexOf(LAST_MODIFIED_PROPERTY) >= 0;
|
|
292
|
-
}
|
|
293
|
-
get createSortProperties() {
|
|
294
|
-
this.checkMandatorySortProperties();
|
|
295
|
-
return this.sortProperties.map((property) => ({ label: property, value: property }));
|
|
296
|
-
}
|
|
297
|
-
createAndFilterActions() {
|
|
298
|
-
this.checkMandatoryActions();
|
|
299
|
-
return this.createFilterActions().filter((action) => this.isValidAction(this.actions, action));
|
|
300
|
-
}
|
|
301
|
-
isValidProperty(filterProperties, key) {
|
|
302
|
-
return filterProperties ? filterProperties.indexOf(key) >= 0 : true;
|
|
303
|
-
}
|
|
304
|
-
checkForProperty(property) {
|
|
305
|
-
return this.filterProperties ? this.filterProperties.indexOf(property) >= 0 : false;
|
|
306
|
-
}
|
|
307
|
-
hasSortProperty() {
|
|
308
|
-
return this.filterProperties.indexOf(SORT_PROPERTY) >= 0;
|
|
309
|
-
}
|
|
310
|
-
removeOrderProperty(filteredProperties) {
|
|
311
|
-
if (filteredProperties?.length > 0) {
|
|
312
|
-
return filteredProperties.filter((property) => property.key !== ORDER_PROPERTY);
|
|
313
|
-
}
|
|
314
|
-
return [];
|
|
315
|
-
}
|
|
316
|
-
createAndFilterProperties() {
|
|
317
|
-
this.checkMandatoryFilterProperties();
|
|
318
|
-
if (this.checkForProperty(APPLICATION_NAME)) {
|
|
319
|
-
this.applicationNames = [];
|
|
320
|
-
this.getDeployedApplications();
|
|
321
|
-
}
|
|
322
|
-
if (this.checkForProperty(PROCESS_DEFINITION_NAME)) {
|
|
323
|
-
this.processDefinitionNames = [];
|
|
324
|
-
this.getProcessDefinitions();
|
|
325
|
-
}
|
|
326
|
-
const defaultProperties = this.createTaskFilterProperties();
|
|
327
|
-
let filteredProperties = defaultProperties.filter((filterProperty) => this.isValidProperty(this.filterProperties, filterProperty.key));
|
|
328
|
-
if (!this.hasSortProperty()) {
|
|
329
|
-
filteredProperties = this.removeOrderProperty(filteredProperties);
|
|
330
|
-
}
|
|
331
|
-
return filteredProperties;
|
|
332
|
-
}
|
|
333
|
-
/**
|
|
334
|
-
* Check for edit task filter form changes
|
|
335
|
-
*/
|
|
336
|
-
onFilterChange() {
|
|
337
|
-
this.editTaskFilterForm.valueChanges
|
|
338
|
-
.pipe(debounceTime(500), filter(() => this.isFormValid()), takeUntilDestroyed(this.destroyRef))
|
|
339
|
-
.subscribe((formValues) => {
|
|
340
|
-
this.assignNewFilter(formValues);
|
|
341
|
-
});
|
|
342
|
-
}
|
|
343
|
-
getFormControlsConfig(taskFilterProperties) {
|
|
344
|
-
const properties = taskFilterProperties.map((property) => {
|
|
345
|
-
if (property.attributes) {
|
|
346
|
-
return this.getAttributesControlConfig(property);
|
|
347
|
-
}
|
|
348
|
-
else {
|
|
349
|
-
return { [property.key]: property.value };
|
|
350
|
-
}
|
|
351
|
-
});
|
|
352
|
-
return properties.reduce((result, current) => Object.assign(result, current), {});
|
|
353
|
-
}
|
|
354
|
-
getAttributesControlConfig(property) {
|
|
355
|
-
return Object.values(property.attributes).reduce((result, key) => {
|
|
356
|
-
result[key] = property.value[key];
|
|
357
|
-
return result;
|
|
358
|
-
}, {});
|
|
359
|
-
}
|
|
360
|
-
buildForm(taskFilterProperties) {
|
|
361
|
-
this.formHasBeenChanged = false;
|
|
362
|
-
this.editTaskFilterForm = this.formBuilder.group(this.getFormControlsConfig(taskFilterProperties));
|
|
363
|
-
this.onFilterChange();
|
|
364
|
-
}
|
|
365
|
-
onDateTypeChange(dateType, property) {
|
|
366
|
-
this.editTaskFilterForm.get(property.attributes.dateType).setValue(dateType);
|
|
367
|
-
}
|
|
368
|
-
retrieveTaskFilterAndBuildForm() {
|
|
369
|
-
this.isLoading = true;
|
|
370
|
-
this.getTaskFilterById(this.appName, this.id)
|
|
371
|
-
.pipe(finalize(() => (this.isLoading = false)), takeUntilDestroyed(this.destroyRef))
|
|
372
|
-
.subscribe((response) => {
|
|
373
|
-
this.taskFilter = response;
|
|
374
|
-
this.taskFilterProperties = this.createAndFilterProperties();
|
|
375
|
-
this.taskFilterActions = this.createAndFilterActions();
|
|
376
|
-
this.buildForm(this.taskFilterProperties);
|
|
377
|
-
});
|
|
378
|
-
}
|
|
379
|
-
delete(deleteAction) {
|
|
380
|
-
this.deleteFilter(this.taskFilter)
|
|
381
|
-
.pipe(filter((filters) => {
|
|
382
|
-
deleteAction.filter = this.taskFilter;
|
|
383
|
-
this.action.emit(deleteAction);
|
|
384
|
-
return filters.length === 0;
|
|
385
|
-
}), switchMap(() => this.restoreDefaultTaskFilters()), takeUntilDestroyed(this.destroyRef))
|
|
386
|
-
.subscribe(() => { });
|
|
387
|
-
}
|
|
388
|
-
save(saveAction) {
|
|
389
|
-
this.updateFilter(this.changedTaskFilter)
|
|
390
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
391
|
-
.subscribe(() => {
|
|
392
|
-
saveAction.filter = this.changedTaskFilter;
|
|
393
|
-
this.action.emit(saveAction);
|
|
394
|
-
this.formHasBeenChanged = this.deepCompare(this.changedTaskFilter, this.taskFilter);
|
|
395
|
-
});
|
|
396
|
-
}
|
|
397
|
-
saveAs(saveAsAction) {
|
|
398
|
-
const dialogRef = this.dialog.open(TaskFilterDialogCloudComponent, {
|
|
399
|
-
data: {
|
|
400
|
-
name: this.translateService.instant(this.taskFilter?.name)
|
|
401
|
-
},
|
|
402
|
-
height: 'auto',
|
|
403
|
-
minWidth: '30%'
|
|
404
|
-
});
|
|
405
|
-
dialogRef.afterClosed().subscribe((result) => {
|
|
406
|
-
if (result && result.action === TaskFilterDialogCloudComponent.ACTION_SAVE) {
|
|
407
|
-
const filterId = Math.random().toString(36).substr(2, 9);
|
|
408
|
-
const filterKey = this.getSanitizeFilterName(result.name);
|
|
409
|
-
const newFilter = {
|
|
410
|
-
name: result.name,
|
|
411
|
-
icon: result.icon,
|
|
412
|
-
id: filterId,
|
|
413
|
-
key: 'custom-' + filterKey
|
|
414
|
-
};
|
|
415
|
-
const resultFilter = Object.assign({}, this.changedTaskFilter, newFilter);
|
|
416
|
-
this.addFilter(resultFilter).subscribe(() => {
|
|
417
|
-
saveAsAction.filter = resultFilter;
|
|
418
|
-
this.action.emit(saveAsAction);
|
|
419
|
-
});
|
|
420
|
-
}
|
|
421
|
-
});
|
|
422
|
-
}
|
|
423
|
-
checkMandatoryFilterProperties() {
|
|
424
|
-
if (this.filterProperties === undefined || this.filterProperties.length === 0) {
|
|
425
|
-
this.filterProperties = this.getDefaultFilterProperties();
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
checkMandatorySortProperties() {
|
|
429
|
-
if (this.sortProperties === undefined || this.sortProperties.length === 0) {
|
|
430
|
-
this.sortProperties = this.getDefaultSortProperties();
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BaseEditTaskFilterCloudComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
434
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: BaseEditTaskFilterCloudComponent, inputs: { appName: "appName", id: "id", environmentList: "environmentList", processInstanceId: "processInstanceId", showTitle: "showTitle", showTaskFilterName: "showTaskFilterName", filterProperties: "filterProperties", role: "role", showFilterActions: "showFilterActions", actions: "actions", sortProperties: "sortProperties", taskFilter: "taskFilter" }, outputs: { action: "action", filterChange: "filterChange" }, usesOnChanges: true, ngImport: i0 }); }
|
|
435
|
-
}
|
|
436
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BaseEditTaskFilterCloudComponent, decorators: [{
|
|
437
|
-
type: Directive
|
|
438
|
-
}], propDecorators: { appName: [{
|
|
439
|
-
type: Input
|
|
440
|
-
}], id: [{
|
|
441
|
-
type: Input
|
|
442
|
-
}], environmentList: [{
|
|
443
|
-
type: Input
|
|
444
|
-
}], processInstanceId: [{
|
|
445
|
-
type: Input
|
|
446
|
-
}], showTitle: [{
|
|
447
|
-
type: Input
|
|
448
|
-
}], showTaskFilterName: [{
|
|
449
|
-
type: Input
|
|
450
|
-
}], filterProperties: [{
|
|
451
|
-
type: Input
|
|
452
|
-
}], role: [{
|
|
453
|
-
type: Input
|
|
454
|
-
}], showFilterActions: [{
|
|
455
|
-
type: Input
|
|
456
|
-
}], actions: [{
|
|
457
|
-
type: Input
|
|
458
|
-
}], sortProperties: [{
|
|
459
|
-
type: Input
|
|
460
|
-
}], action: [{
|
|
461
|
-
type: Output
|
|
462
|
-
}], taskFilter: [{
|
|
463
|
-
type: Input
|
|
464
|
-
}], filterChange: [{
|
|
465
|
-
type: Output
|
|
466
|
-
}] } });
|
|
467
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1lZGl0LXRhc2stZmlsdGVyLWNsb3VkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9wcm9jZXNzLXNlcnZpY2VzLWNsb3VkL3NyYy9saWIvdGFzay90YXNrLWZpbHRlcnMvY29tcG9uZW50cy9lZGl0LXRhc2stZmlsdGVycy9iYXNlLWVkaXQtdGFzay1maWx0ZXItY2xvdWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQzdILE9BQU8sRUFBRSxjQUFjLEVBQXlELGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDMUksT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDMUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDaEcsT0FBTyxFQUFFLG1CQUFtQixFQUFtQixNQUFNLDRDQUE0QyxDQUFDO0FBQ2xHLE9BQU8sRUFBbUIsa0JBQWtCLEVBQW9CLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLHNCQUFzQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEgsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDMUcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixD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QkFEYixLQUFLO2dCQUtOLE1BQU07c0JBREwsTUFBTTtnQkF1QlAsVUFBVTtzQkFEVCxLQUFLO2dCQU9OLFlBQVk7c0JBRFgsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCDCqSAyMDA1LTIwMjUgSHlsYW5kIFNvZnR3YXJlLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRGVzdHJveVJlZiwgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFzc2lnbm1lbnRUeXBlLCBGaWx0ZXJPcHRpb25zLCBUYXNrRmlsdGVyQWN0aW9uLCBUYXNrRmlsdGVyUHJvcGVydGllcywgVGFza1N0YXR1c0ZpbHRlciB9IGZyb20gJy4uLy4uL21vZGVscy9maWx0ZXItY2xvdWQubW9kZWwnO1xuaW1wb3J0IHsgVGFza0Nsb3VkU2VydmljZSB9IGZyb20gJy4vLi4vLi4vLi4vc2VydmljZXMvdGFzay1jbG91ZC5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcHNQcm9jZXNzQ2xvdWRTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi8uLi8uLi9hcHAvc2VydmljZXMvYXBwcy1wcm9jZXNzLWNsb3VkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0ZUNsb3VkRmlsdGVyVHlwZSwgRGF0ZVJhbmdlRmlsdGVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2RhdGUtY2xvdWQtZmlsdGVyLm1vZGVsJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIGZpbmFsaXplLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEYXRlQWRhcHRlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgRGF0ZUZuc1V0aWxzLCBUcmFuc2xhdGlvblNlcnZpY2UsIFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UsIFVzZXJQcmVmZXJlbmNlVmFsdWVzIH0gZnJvbSAnQGFsZnJlc2NvL2FkZi1jb3JlJztcbmltcG9ydCB7IFRhc2tGaWx0ZXJEaWFsb2dDbG91ZENvbXBvbmVudCB9IGZyb20gJy4uL3Rhc2stZmlsdGVyLWRpYWxvZy90YXNrLWZpbHRlci1kaWFsb2ctY2xvdWQuY29tcG9uZW50JztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBJZGVudGl0eVVzZXJNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3Blb3BsZS9tb2RlbHMvaWRlbnRpdHktdXNlci5tb2RlbCc7XG5pbXBvcnQgeyBJZGVudGl0eUdyb3VwTW9kZWwgfSBmcm9tICcuLi8uLi8uLi8uLi9ncm91cC9tb2RlbHMvaWRlbnRpdHktZ3JvdXAubW9kZWwnO1xuaW1wb3J0IHsgTWF0U2VsZWN0Q2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7IEVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tbW9uL2ludGVyZmFjZS9lbnZpcm9ubWVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgaXNWYWxpZCB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJvcGRvd25PcHRpb24ge1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgbGFiZWw6IHN0cmluZztcbn1cblxuY29uc3QgQUNUSU9OX1NBVkUgPSAnc2F2ZSc7XG5jb25zdCBBQ1RJT05fU0FWRV9BUyA9ICdzYXZlQXMnO1xuY29uc3QgQUNUSU9OX0RFTEVURSA9ICdkZWxldGUnO1xuY29uc3QgQVBQX0RFUExPWUVEX1NUQVRVUyA9ICdERVBMT1lFRCc7XG5jb25zdCBBUFBMSUNBVElPTl9OQU1FID0gJ2FwcE5hbWUnO1xuY29uc3QgUFJPQ0VTU19ERUZJTklUSU9OX05BTUUgPSAncHJvY2Vzc0RlZmluaXRpb25OYW1lJztcbmNvbnN0IExBU1RfTU9ESUZJRURfUFJPUEVSVFkgPSAnbGFzdE1vZGlmaWVkJztcbmNvbnN0IERBVEVfRk9STUFUID0gJ0REL01NL1lZWVknO1xuY29uc3QgREVGQVVMVF9BQ1RJT05TID0gW0FDVElPTl9TQVZFLCBBQ1RJT05fU0FWRV9BUywgQUNUSU9OX0RFTEVURV07XG5jb25zdCBTT1JUX1BST1BFUlRZID0gJ3NvcnQnO1xuY29uc3QgT1JERVJfUFJPUEVSVFkgPSAnb3JkZXInO1xuXG5ARGlyZWN0aXZlKClcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VFZGl0VGFza0ZpbHRlckNsb3VkQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAgIHB1YmxpYyBzdGF0aWMgQUNUSU9OU19ESVNBQkxFRF9CWV9ERUZBVUxUID0gW0FDVElPTl9TQVZFLCBBQ1RJT05fREVMRVRFXTtcblxuICAgIC8qKiAocmVxdWlyZWQpIE5hbWUgb2YgdGhlIGFwcC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGFwcE5hbWU6IHN0cmluZyA9ICcnO1xuXG4gICAgLyoqIChyZXF1aXJlZCkgSUQgb2YgdGhlIHRhc2sgZmlsdGVyLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgaWQ6IHN0cmluZztcblxuICAgIC8qKiBMaXN0IG9mIGVudmlyb25tZW50cy4gKi9cbiAgICBASW5wdXQoKVxuICAgIGVudmlyb25tZW50TGlzdDogRW52aXJvbm1lbnRbXSA9IFtdO1xuXG4gICAgLyoqIHByb2Nlc3NJbnN0YW5jZUlkIG9mIHRoZSB0YXNrIGZpbHRlci4gKi9cbiAgICBASW5wdXQoKVxuICAgIHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmc7XG5cbiAgICAvKiogVG9nZ2xlcyB0aGUgdGl0bGUuICovXG4gICAgQElucHV0KClcbiAgICBzaG93VGl0bGUgPSB0cnVlO1xuXG4gICAgLyoqIFRvZ2dsZXMgZGlzcGxheSBvZiB0YXNrIGZpbHRlciBuYW1lICovXG4gICAgQElucHV0KClcbiAgICBzaG93VGFza0ZpbHRlck5hbWUgPSB0cnVlO1xuXG4gICAgLyoqIExpc3Qgb2YgdGFzayBmaWx0ZXIgcHJvcGVydGllcyB0byBkaXNwbGF5LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZmlsdGVyUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8qKiB1c2VyIHJvbGUuICovXG4gICAgQElucHV0KClcbiAgICByb2xlOiBzdHJpbmcgPSAnJztcblxuICAgIC8qKiBUb2dnbGVzIHRoZSBmaWx0ZXIgYWN0aW9ucy4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNob3dGaWx0ZXJBY3Rpb25zID0gdHJ1ZTtcblxuICAgIC8qKiBMaXN0IG9mIHRhc2sgZmlsdGVyIGFjdGlvbnMuICovXG4gICAgQElucHV0KClcbiAgICBhY3Rpb25zOiBzdHJpbmdbXSA9IFsuLi5ERUZBVUxUX0FDVElPTlNdO1xuXG4gICAgLyoqIExpc3Qgb2Ygc29ydCBwcm9wZXJ0aWVzIHRvIGRpc3BsYXkuICovXG4gICAgQElucHV0KClcbiAgICBzb3J0UHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gYSBmaWx0ZXIgYWN0aW9uIG9jY3VycyAoaS5lIFNhdmUsIFNhdmUgQXMsIERlbGV0ZSkuICovXG4gICAgQE91dHB1dCgpXG4gICAgYWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxUYXNrRmlsdGVyQWN0aW9uPigpO1xuXG4gICAgcHJvdGVjdGVkIGFwcGxpY2F0aW9uTmFtZXM6IERyb3Bkb3duT3B0aW9uW10gPSBbXTtcbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0RlZmluaXRpb25OYW1lczogRHJvcGRvd25PcHRpb25bXSA9IFtdO1xuICAgIHByb3RlY3RlZCBmb3JtSGFzQmVlbkNoYW5nZWQgPSBmYWxzZTtcblxuICAgIGVkaXRUYXNrRmlsdGVyRm9ybTogVW50eXBlZEZvcm1Hcm91cDtcbiAgICB0YXNrRmlsdGVyUHJvcGVydGllczogVGFza0ZpbHRlclByb3BlcnRpZXNbXSA9IFtdO1xuICAgIHRhc2tGaWx0ZXJBY3Rpb25zOiBUYXNrRmlsdGVyQWN0aW9uW10gPSBbXTtcbiAgICB0b2dnbGVGaWx0ZXJBY3Rpb25zOiBib29sZWFuID0gZmFsc2U7XG4gICAgc2VsZWN0ZWRTdGF0dXM6IFRhc2tTdGF0dXNGaWx0ZXI7XG4gICAgc29ydERpcmVjdGlvbnM6IERyb3Bkb3duT3B0aW9uW10gPSBbXG4gICAgICAgIHsgdmFsdWU6ICdBU0MnLCBsYWJlbDogJ0FERl9DTE9VRF9UQVNLX0ZJTFRFUlMuRElSRUNUSU9OLkFTQ0VORElORycgfSxcbiAgICAgICAgeyB2YWx1ZTogJ0RFU0MnLCBsYWJlbDogJ0FERl9DTE9VRF9UQVNLX0ZJTFRFUlMuRElSRUNUSU9OLkRFU0NFTkRJTkcnIH1cbiAgICBdO1xuICAgIGFsbFByb2Nlc3NEZWZpbml0aW9uTmFtZXNPcHRpb246IERyb3Bkb3duT3B0aW9uID0ge1xuICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX1RBU0tfRklMVEVSUy5TVEFUVVMuQUxMJ1xuICAgIH07XG5cbiAgICAvKiogVGFzayBGaWx0ZXIgdG8gdXNlLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgdGFza0ZpbHRlcjogVDtcblxuICAgIGNoYW5nZWRUYXNrRmlsdGVyOiBUO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiBhIHRhc2sgZmlsdGVyIHByb3BlcnR5IGNoYW5nZXMuICovXG4gICAgQE91dHB1dCgpXG4gICAgZmlsdGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuXG4gICAgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwcm90ZWN0ZWQgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGlvblNlcnZpY2UpO1xuICAgIHByb3RlY3RlZCB0YXNrQ2xvdWRTZXJ2aWNlID0gaW5qZWN0KFRhc2tDbG91ZFNlcnZpY2UpO1xuICAgIHByb3RlY3RlZCB1c2VyUHJlZmVyZW5jZXNTZXJ2aWNlID0gaW5qZWN0KFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UpO1xuICAgIHByb3RlY3RlZCBhcHBzUHJvY2Vzc0Nsb3VkU2VydmljZSA9IGluamVjdChBcHBzUHJvY2Vzc0Nsb3VkU2VydmljZSk7XG4gICAgcHJvdGVjdGVkIGRpYWxvZyA9IGluamVjdChNYXREaWFsb2cpO1xuICAgIHByb3RlY3RlZCBmb3JtQnVpbGRlciA9IGluamVjdChVbnR5cGVkRm9ybUJ1aWxkZXIpO1xuICAgIHByb3RlY3RlZCBkYXRlQWRhcHRlciA9IGluamVjdDxEYXRlQWRhcHRlcjxEYXRlPj4oRGF0ZUFkYXB0ZXIpO1xuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMudXNlclByZWZlcmVuY2VzU2VydmljZVxuICAgICAgICAgICAgLnNlbGVjdChVc2VyUHJlZmVyZW5jZVZhbHVlcy5Mb2NhbGUpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGxvY2FsZSkgPT4gdGhpcy5kYXRlQWRhcHRlci5zZXRMb2NhbGUobG9jYWxlKSk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBjb25zdCB7IGlkIH0gPSBjaGFuZ2VzO1xuICAgICAgICBpZiAoaWQgJiYgaWQuY3VycmVudFZhbHVlICE9PSBpZC5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50YXNrRmlsdGVyICYmIHRoaXMudGFza0ZpbHRlclsnaWQnXSA9PT0gaWQuY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YXNrRmlsdGVyUHJvcGVydGllcyA9IHRoaXMuY3JlYXRlQW5kRmlsdGVyUHJvcGVydGllcygpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFza0ZpbHRlckFjdGlvbnMgPSB0aGlzLmNyZWF0ZUFuZEZpbHRlckFjdGlvbnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkRm9ybSh0aGlzLnRhc2tGaWx0ZXJQcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXRyaWV2ZVRhc2tGaWx0ZXJBbmRCdWlsZEZvcm0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZUZpbHRlckFjdGlvbnMoKTogVGFza0ZpbHRlckFjdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25UeXBlOiBBQ1RJT05fU0FWRSxcbiAgICAgICAgICAgICAgICBpY29uOiAnYWRmOnNhdmUnLFxuICAgICAgICAgICAgICAgIHRvb2x0aXA6ICdBREZfQ0xPVURfRURJVF9UQVNLX0ZJTFRFUi5UT09MX1RJUC5TQVZFJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25UeXBlOiBBQ1RJT05fU0FWRV9BUyxcbiAgICAgICAgICAgICAgICBpY29uOiAnYWRmOnNhdmUtYXMnLFxuICAgICAgICAgICAgICAgIHRvb2x0aXA6ICdBREZfQ0xPVURfRURJVF9UQVNLX0ZJTFRFUi5UT09MX1RJUC5TQVZFX0FTJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25UeXBlOiBBQ1RJT05fREVMRVRFLFxuICAgICAgICAgICAgICAgIGljb246ICdkZWxldGUnLFxuICAgICAgICAgICAgICAgIHRvb2x0aXA6ICdBREZfQ0xPVURfRURJVF9UQVNLX0ZJTFRFUi5UT09MX1RJUC5ERUxFVEUnXG4gICAgICAgICAgICB9XG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgaGFzRm9ybUNoYW5nZWQoYWN0aW9uOiBUYXNrRmlsdGVyQWN0aW9uKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChhY3Rpb24uYWN0aW9uVHlwZSA9PT0gQUNUSU9OX1NBVkUpIHtcbiAgICAgICAgICAgIHJldHVybiAhdGhpcy5mb3JtSGFzQmVlbkNoYW5nZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGlvbi5hY3Rpb25UeXBlID09PSBBQ1RJT05fU0FWRV9BUykge1xuICAgICAgICAgICAgcmV0dXJuICF0aGlzLmZvcm1IYXNCZWVuQ2hhbmdlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aW9uLmFjdGlvblR5cGUgPT09IEFDVElPTl9ERUxFVEUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBvbkV4cGFuZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b2dnbGVGaWx0ZXJBY3Rpb25zID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBvbkNsb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRvZ2dsZUZpbHRlckFjdGlvbnMgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpc0Rpc2FibGVkQWN0aW9uKGFjdGlvbjogVGFza0ZpbHRlckFjdGlvbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0Rpc2FibGVkRm9yRGVmYXVsdEZpbHRlcnMoYWN0aW9uKSA/IHRydWUgOiB0aGlzLmhhc0Zvcm1DaGFuZ2VkKGFjdGlvbik7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGRlZXBDb21wYXJlKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobGVmdCkudG9Mb3dlckNhc2UoKSA9PT0gSlNPTi5zdHJpbmdpZnkocmlnaHQpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzYW5pdGl6ZWQgZmlsdGVyIG5hbWVcbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWx0ZXJOYW1lIGZpbHRlciBuYW1lXG4gICAgICogQHJldHVybnMgc2FuaXRpemVkIGZpbHRlciBuYW1lXG4gICAgICovXG4gICAgZ2V0U2FuaXRpemVGaWx0ZXJOYW1lKGZpbHRlck5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG5hbWVXaXRoSHlwaGVuID0gdGhpcy5yZXBsYWNlU3BhY2VXaXRoSHlwaGVuKGZpbHRlck5hbWUudHJpbSgpKTtcbiAgICAgICAgcmV0dXJuIG5hbWVXaXRoSHlwaGVuLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXBsYWNlU3BhY2VXaXRoSHlwaGVuKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHJlZ0V4dCA9IG5ldyBSZWdFeHAoJyAnLCAnZycpO1xuICAgICAgICByZXR1cm4gbmFtZS5yZXBsYWNlKHJlZ0V4dCwgJy0nKTtcbiAgICB9XG5cbiAgICBleGVjdXRlRmlsdGVyQWN0aW9ucyhhY3Rpb246IFRhc2tGaWx0ZXJBY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKGFjdGlvbi5hY3Rpb25UeXBlID09PSBBQ1RJT05fU0FWRSkge1xuICAgICAgICAgICAgdGhpcy5zYXZlKGFjdGlvbik7XG4gICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmFjdGlvblR5cGUgPT09IEFDVElPTl9TQVZFX0FTKSB7XG4gICAgICAgICAgICB0aGlzLnNhdmVBcyhhY3Rpb24pO1xuICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5hY3Rpb25UeXBlID09PSBBQ1RJT05fREVMRVRFKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZShhY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0RGVwbG95ZWRBcHBsaWNhdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuYXBwc1Byb2Nlc3NDbG91ZFNlcnZpY2UuZ2V0RGVwbG95ZWRBcHBsaWNhdGlvbnNCeVN0YXR1cyhBUFBfREVQTE9ZRURfU1RBVFVTLCB0aGlzLnJvbGUpLnN1YnNjcmliZSgoYXBwbGljYXRpb25zKSA9PiB7XG4gICAgICAgICAgICBpZiAoYXBwbGljYXRpb25zICYmIGFwcGxpY2F0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYXBwbGljYXRpb25zLm1hcCgoYXBwbGljYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbk5hbWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuYXBwc1Byb2Nlc3NDbG91ZFNlcnZpY2UuZ2V0QXBwbGljYXRpb25MYWJlbChhcHBsaWNhdGlvbiwgdGhpcy5lbnZpcm9ubWVudExpc3QpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGFwcGxpY2F0aW9uLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFByb2Nlc3NEZWZpbml0aW9ucygpIHtcbiAgICAgICAgdGhpcy50YXNrQ2xvdWRTZXJ2aWNlLmdldFByb2Nlc3NEZWZpbml0aW9ucyh0aGlzLmFwcE5hbWUpLnN1YnNjcmliZSgocHJvY2Vzc0RlZmluaXRpb25zKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvY2Vzc0RlZmluaXRpb25zICYmIHByb2Nlc3NEZWZpbml0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbk5hbWVzLnB1c2godGhpcy5hbGxQcm9jZXNzRGVmaW5pdGlvbk5hbWVzT3B0aW9uKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzRGVmaW5pdGlvbnMubWFwKChwcm9jZXNzRGVmaW5pdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uTmFtZXMucHVzaCh7IGxhYmVsOiBwcm9jZXNzRGVmaW5pdGlvbi5uYW1lLCB2YWx1ZTogcHJvY2Vzc0RlZmluaXRpb24ubmFtZSB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2hlY2tNYW5kYXRvcnlBY3Rpb25zKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hY3Rpb25zID09PSB1bmRlZmluZWQgfHwgdGhpcy5hY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25zID0gWy4uLkRFRkFVTFRfQUNUSU9OU107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGlzVmFsaWRBY3Rpb24oYWN0aW9uczogc3RyaW5nW10sIGFjdGlvbjogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBhY3Rpb25zID8gYWN0aW9ucy5pbmRleE9mKGFjdGlvbi5hY3Rpb25UeXBlKSA+PSAwIDogdHJ1ZTtcbiAgICB9XG5cbiAgICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdFRhc2tGaWx0ZXJGb3JtLnZhbGlkO1xuICAgIH1cblxuICAgIGdldFByb3BlcnR5Q29udHJvbGxlcihwcm9wZXJ0eTogVGFza0ZpbHRlclByb3BlcnRpZXMpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0VGFza0ZpbHRlckZvcm0uZ2V0KHByb3BlcnR5LmtleSk7XG4gICAgfVxuXG4gICAgb25EYXRlQ2hhbmdlZChuZXdEYXRlVmFsdWU6IHN0cmluZyB8IERhdGUsIGRhdGVQcm9wZXJ0eTogVGFza0ZpbHRlclByb3BlcnRpZXMpIHtcbiAgICAgICAgaWYgKG5ld0RhdGVWYWx1ZSkge1xuICAgICAgICAgICAgbGV0IGRhdGU6IERhdGU7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmV3RGF0ZVZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGRhdGUgPSBEYXRlRm5zVXRpbHMucGFyc2VEYXRlKG5ld0RhdGVWYWx1ZSwgREFURV9GT1JNQVQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRlID0gbmV3RGF0ZVZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb250cm9sbGVyID0gdGhpcy5nZXRQcm9wZXJ0eUNvbnRyb2xsZXIoZGF0ZVByb3BlcnR5KTtcblxuICAgICAgICAgICAgaWYgKGlzVmFsaWQoZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnNldFZhbHVlKGRhdGUudG9JU09TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5zZXRFcnJvcnMobnVsbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuc2V0RXJyb3JzKHsgaW52YWxpZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRGF0ZVJhbmdlRmlsdGVyQ2hhbmdlZChkYXRlUmFuZ2U6IERhdGVSYW5nZUZpbHRlciwgcHJvcGVydHk6IFRhc2tGaWx0ZXJQcm9wZXJ0aWVzKSB7XG4gICAgICAgIHRoaXMuZWRpdFRhc2tGaWx0ZXJGb3JtLmdldChwcm9wZXJ0eS5hdHRyaWJ1dGVzPy5mcm9tKS5zZXRWYWx1ZShkYXRlUmFuZ2Uuc3RhcnREYXRlID8gZGF0ZVJhbmdlLnN0YXJ0RGF0ZSA6IG51bGwpO1xuICAgICAgICB0aGlzLmVkaXRUYXNrRmlsdGVyRm9ybS5nZXQocHJvcGVydHkuYXR0cmlidXRlcz8udG8pLnNldFZhbHVlKGRhdGVSYW5nZS5lbmREYXRlID8gZGF0ZVJhbmdlLmVuZERhdGUgOiBudWxsKTtcbiAgICAgICAgdGhpcy5lZGl0VGFza0ZpbHRlckZvcm0uZ2V0KHByb3BlcnR5LmF0dHJpYnV0ZXMuZGF0ZVR5cGUpLnNldFZhbHVlKERhdGVDbG91ZEZpbHRlclR5cGUuUkFOR0UpO1xuICAgIH1cblxuICAgIG9uQ2hhbmdlZFVzZXIodXNlcnM6IElkZW50aXR5VXNlck1vZGVsW10sIHVzZXJQcm9wZXJ0eTogVGFza0ZpbHRlclByb3BlcnRpZXMpIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkVXNlcnM7XG4gICAgICAgIGlmICh1c2VyUHJvcGVydHkuc2VsZWN0aW9uTW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkVXNlcnMgPSB1c2Vyc1swXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGVjdGVkVXNlcnMgPSB1c2VycztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdldFByb3BlcnR5Q29udHJvbGxlcih1c2VyUHJvcGVydHkpLnNldFZhbHVlKHNlbGVjdGVkVXNlcnMpO1xuICAgIH1cblxuICAgIG9uQXNzaWduZWRVc2Vyc0NoYW5nZShhc3NpZ25lZFVzZXJzOiBJZGVudGl0eVVzZXJNb2RlbFtdKSB7XG4gICAgICAgIHRoaXMuZWRpdFRhc2tGaWx0ZXJGb3JtLmdldCgnY2FuZGlkYXRlR3JvdXBzJykuc2V0VmFsdWUodW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5lZGl0VGFza0ZpbHRlckZvcm0uZ2V0KCdhc3NpZ25lZFVzZXJzJykuc2V0VmFsdWUoYXNzaWduZWRVc2Vycyk7XG4gICAgfVxuXG4gICAgb25Bc3NpZ25lZEdyb3Vwc0NoYW5nZShncm91cHM6IElkZW50aXR5R3JvdXBNb2RlbFtdKSB7XG4gICAgICAgIHRoaXMuZWRpdFRhc2tGaWx0ZXJGb3JtLmdldCgnYXNzaWduZWRVc2VycycpLnNldFZhbHVlKHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuZWRpdFRhc2tGaWx0ZXJGb3JtLmdldCgnY2FuZGlkYXRlR3JvdXBzJykuc2V0VmFsdWUoZ3JvdXBzKTtcbiAgICB9XG5cbiAgICBvbkFzc2lnbm1lbnRUeXBlQ2hhbmdlKGFzc2lnbm1lbnRUeXBlOiBBc3NpZ25tZW50VHlwZSkge1xuICAgICAgICBzd2l0Y2ggKGFzc2lnbm1lbnRUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIEFzc2lnbm1lbnRUeXBlLlVOQVNTSUdORUQ6XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0VGFza0ZpbHRlckZvcm0uZ2V0KCdzdGF0dXMnKS5zZXRWYWx1ZShUYXNrU3RhdHVzRmlsdGVyLkNSRUFURUQpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRBc3NpZ25tZW50VHlwZVZhbHVlcygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBBc3NpZ25tZW50VHlwZS5OT05FOlxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdFRhc2tGaWx0ZXJGb3JtLmdldCgnc3RhdHVzJykuc2V0VmFsdWUoVGFza1N0YXR1c0ZpbHRlci5BTEwpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRBc3NpZ25tZW50VHlwZVZhbHVlcygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBBc3NpZ25tZW50VHlwZS5BU1NJR05FRF9UTzpcbiAgICAgICAgICAgIGNhc2UgQXNzaWdubWVudFR5cGUuQ0FORElEQVRFX0dST1VQUzpcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRUYXNrRmlsdGVyRm9ybS5nZXQoJ3N0YXR1cycpLnNldFZhbHVlKFRhc2tTdGF0dXNGaWx0ZXIuQVNTSUdORUQpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRBc3NpZ25tZW50VHlwZVZhbHVlcygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRUYXNrRmlsdGVyRm9ybS5nZXQoJ3N0YXR1cycpLnNldFZhbHVlKFRhc2tTdGF0dXNGaWx0ZXIuQVNTSUdORUQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25TdGF0dXNDaGFuZ2Uoc3RhdHVzOiBNYXRTZWxlY3RDaGFuZ2UpIHtcbiAgICAgICAgaWYgKHN0YXR1cy52YWx1ZSA9PT0gVGFza1N0YXR1c0ZpbHRlci5DUkVBVEVEKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0QXNzaWdubWVudFR5cGVWYWx1ZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTdGF0dXMgPSBzdGF0dXMudmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldEFzc2lnbm1lbnRUeXBlVmFsdWVzKCkge1xuICAgICAgICB0aGlzLmVkaXRUYXNrRmlsdGVyRm9ybS5nZXQoJ2Fzc2lnbmVkVXNlcnMnKS5zZXRWYWx1ZSh1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLmVkaXRUYXNrRmlsdGVyRm9ybS5nZXQoJ2NhbmRpZGF0ZUdyb3VwcycpLnNldFZhbHVlKHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgaGFzRXJyb3IocHJvcGVydHk6IFRhc2tGaWx0ZXJQcm9wZXJ0aWVzKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzLmdldFByb3BlcnR5Q29udHJvbGxlcihwcm9wZXJ0eSk7XG4gICAgICAgIHJldHVybiAhIWNvbnRyb2xsZXIuZXJyb3JzPy5pbnZhbGlkO1xuICAgIH1cblxuICAgIGhhc0xhc3RNb2RpZmllZFByb3BlcnR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJQcm9wZXJ0aWVzLmluZGV4T2YoTEFTVF9NT0RJRklFRF9QUk9QRVJUWSkgPj0gMDtcbiAgICB9XG5cbiAgICBnZXQgY3JlYXRlU29ydFByb3BlcnRpZXMoKTogRmlsdGVyT3B0aW9uc1tdIHtcbiAgICAgICAgdGhpcy5jaGVja01hbmRhdG9yeVNvcnRQcm9wZXJ0aWVzKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydFByb3BlcnRpZXMubWFwKChwcm9wZXJ0eTogc3RyaW5nKSA9PiAoeyBsYWJlbDogcHJvcGVydHksIHZhbHVlOiBwcm9wZXJ0eSB9KSk7XG4gICAgfVxuXG4gICAgY3JlYXRlQW5kRmlsdGVyQWN0aW9ucygpOiBUYXNrRmlsdGVyQWN0aW9uW10ge1xuICAgICAgICB0aGlzLmNoZWNrTWFuZGF0b3J5QWN0aW9ucygpO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVGaWx0ZXJBY3Rpb25zKCkuZmlsdGVyKChhY3Rpb24pID0+IHRoaXMuaXNWYWxpZEFjdGlvbih0aGlzLmFjdGlvbnMsIGFjdGlvbikpO1xuICAgIH1cblxuICAgIGlzVmFsaWRQcm9wZXJ0eShmaWx0ZXJQcm9wZXJ0aWVzOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlclByb3BlcnRpZXMgPyBmaWx0ZXJQcm9wZXJ0aWVzLmluZGV4T2Yoa2V5KSA+PSAwIDogdHJ1ZTtcbiAgICB9XG5cbiAgICBjaGVja0ZvclByb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyUHJvcGVydGllcyA/IHRoaXMuZmlsdGVyUHJvcGVydGllcy5pbmRleE9mKHByb3BlcnR5KSA+PSAwIDogZmFsc2U7XG4gICAgfVxuXG4gICAgaGFzU29ydFByb3BlcnR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJQcm9wZXJ0aWVzLmluZGV4T2YoU09SVF9QUk9QRVJUWSkgPj0gMDtcbiAgICB9XG5cbiAgICByZW1vdmVPcmRlclByb3BlcnR5KGZpbHRlcmVkUHJvcGVydGllczogVGFza0ZpbHRlclByb3BlcnRpZXNbXSk6IFRhc2tGaWx0ZXJQcm9wZXJ0aWVzW10ge1xuICAgICAgICBpZiAoZmlsdGVyZWRQcm9wZXJ0aWVzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyZWRQcm9wZXJ0aWVzLmZpbHRlcigocHJvcGVydHkpID0+IHByb3BlcnR5LmtleSAhPT0gT1JERVJfUFJPUEVSVFkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjcmVhdGVBbmRGaWx0ZXJQcm9wZXJ0aWVzKCkge1xuICAgICAgICB0aGlzLmNoZWNrTWFuZGF0b3J5RmlsdGVyUHJvcGVydGllcygpO1xuXG4gICAgICAgIGlmICh0aGlzLmNoZWNrRm9yUHJvcGVydHkoQVBQTElDQVRJT05fTkFNRSkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbGljYXRpb25OYW1lcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5nZXREZXBsb3llZEFwcGxpY2F0aW9ucygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNoZWNrRm9yUHJvcGVydHkoUFJPQ0VTU19ERUZJTklUSU9OX05BTUUpKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uTmFtZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuZ2V0UHJvY2Vzc0RlZmluaXRpb25zKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWZhdWx0UHJvcGVydGllcyA9IHRoaXMuY3JlYXRlVGFza0ZpbHRlclByb3BlcnRpZXMoKTtcbiAgICAgICAgbGV0IGZpbHRlcmVkUHJvcGVydGllcyA9IGRlZmF1bHRQcm9wZXJ0aWVzLmZpbHRlcigoZmlsdGVyUHJvcGVydHkpID0+IHRoaXMuaXNWYWxpZFByb3BlcnR5KHRoaXMuZmlsdGVyUHJvcGVydGllcywgZmlsdGVyUHJvcGVydHkua2V5KSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhhc1NvcnRQcm9wZXJ0eSgpKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZFByb3BlcnRpZXMgPSB0aGlzLnJlbW92ZU9yZGVyUHJvcGVydHkoZmlsdGVyZWRQcm9wZXJ0aWVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWx0ZXJlZFByb3BlcnRpZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgZm9yIGVkaXQgdGFzayBmaWx0ZXIgZm9ybSBjaGFuZ2VzXG4gICAgICovXG4gICAgb25GaWx0ZXJDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuZWRpdFRhc2tGaWx0ZXJGb3JtLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDUwMCksXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuaXNGb3JtVmFsaWQoKSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGZvcm1WYWx1ZXMpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2lnbk5ld0ZpbHRlcihmb3JtVmFsdWVzKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldEZvcm1Db250cm9sc0NvbmZpZyh0YXNrRmlsdGVyUHJvcGVydGllczogVGFza0ZpbHRlclByb3BlcnRpZXNbXSk6IGFueSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0YXNrRmlsdGVyUHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvcGVydHkuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXNDb250cm9sQ29uZmlnKHByb3BlcnR5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW3Byb3BlcnR5LmtleV06IHByb3BlcnR5LnZhbHVlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcHJvcGVydGllcy5yZWR1Y2UoKHJlc3VsdCwgY3VycmVudCkgPT4gT2JqZWN0LmFzc2lnbihyZXN1bHQsIGN1cnJlbnQpLCB7fSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRBdHRyaWJ1dGVzQ29udHJvbENvbmZpZyhwcm9wZXJ0eTogVGFza0ZpbHRlclByb3BlcnRpZXMpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMocHJvcGVydHkuYXR0cmlidXRlcykucmVkdWNlKChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBwcm9wZXJ0eS52YWx1ZVtrZXldO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSwge30pO1xuICAgIH1cblxuICAgIGJ1aWxkRm9ybSh0YXNrRmlsdGVyUHJvcGVydGllczogVGFza0ZpbHRlclByb3BlcnRpZXNbXSkge1xuICAgICAgICB0aGlzLmZvcm1IYXNCZWVuQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVkaXRUYXNrRmlsdGVyRm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAodGhpcy5nZXRGb3JtQ29udHJvbHNDb25maWcodGFza0ZpbHRlclByb3BlcnRpZXMpKTtcbiAgICAgICAgdGhpcy5vbkZpbHRlckNoYW5nZSgpO1xuICAgIH1cblxuICAgIG9uRGF0ZVR5cGVDaGFuZ2UoZGF0ZVR5cGU6IERhdGVDbG91ZEZpbHRlclR5cGUsIHByb3BlcnR5OiBUYXNrRmlsdGVyUHJvcGVydGllcykge1xuICAgICAgICB0aGlzLmVkaXRUYXNrRmlsdGVyRm9ybS5nZXQocHJvcGVydHkuYXR0cmlidXRlcy5kYXRlVHlwZSkuc2V0VmFsdWUoZGF0ZVR5cGUpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZXRyaWV2ZVRhc2tGaWx0ZXJBbmRCdWlsZEZvcm0oKSB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmdldFRhc2tGaWx0ZXJCeUlkKHRoaXMuYXBwTmFtZSwgdGhpcy5pZClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbmFsaXplKCgpID0+ICh0aGlzLmlzTG9hZGluZyA9IGZhbHNlKSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50YXNrRmlsdGVyID0gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgdGhpcy50YXNrRmlsdGVyUHJvcGVydGllcyA9IHRoaXMuY3JlYXRlQW5kRmlsdGVyUHJvcGVydGllcygpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFza0ZpbHRlckFjdGlvbnMgPSB0aGlzLmNyZWF0ZUFuZEZpbHRlckFjdGlvbnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkRm9ybSh0aGlzLnRhc2tGaWx0ZXJQcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGRlbGV0ZShkZWxldGVBY3Rpb246IFRhc2tGaWx0ZXJBY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZWxldGVGaWx0ZXIodGhpcy50YXNrRmlsdGVyKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKChmaWx0ZXJzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZUFjdGlvbi5maWx0ZXIgPSB0aGlzLnRhc2tGaWx0ZXI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uLmVtaXQoZGVsZXRlQWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlcnMubGVuZ3RoID09PSAwO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnJlc3RvcmVEZWZhdWx0VGFza0ZpbHRlcnMoKSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge30pO1xuICAgIH1cblxuICAgIHNhdmUoc2F2ZUFjdGlvbjogVGFza0ZpbHRlckFjdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcih0aGlzLmNoYW5nZWRUYXNrRmlsdGVyKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzYXZlQWN0aW9uLmZpbHRlciA9IHRoaXMuY2hhbmdlZFRhc2tGaWx0ZXI7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb24uZW1pdChzYXZlQWN0aW9uKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1IYXNCZWVuQ2hhbmdlZCA9IHRoaXMuZGVlcENvbXBhcmUodGhpcy5jaGFuZ2VkVGFza0ZpbHRlciwgdGhpcy50YXNrRmlsdGVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNhdmVBcyhzYXZlQXNBY3Rpb246IFRhc2tGaWx0ZXJBY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihUYXNrRmlsdGVyRGlhbG9nQ2xvdWRDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgodGhpcy50YXNrRmlsdGVyIGFzIGFueSk/Lm5hbWUpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGVpZ2h0OiAnYXV0bycsXG4gICAgICAgICAgICBtaW5XaWR0aDogJzMwJSdcbiAgICAgICAgfSk7XG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5hY3Rpb24gPT09IFRhc2tGaWx0ZXJEaWFsb2dDbG91ZENvbXBvbmVudC5BQ1RJT05fU0FWRSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcklkID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcktleSA9IHRoaXMuZ2V0U2FuaXRpemVGaWx0ZXJOYW1lKHJlc3VsdC5uYW1lKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdGaWx0ZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHJlc3VsdC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBpY29uOiByZXN1bHQuaWNvbixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGZpbHRlcklkLFxuICAgICAgICAgICAgICAgICAgICBrZXk6ICdjdXN0b20tJyArIGZpbHRlcktleVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0RmlsdGVyOiBUID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jaGFuZ2VkVGFza0ZpbHRlciwgbmV3RmlsdGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZpbHRlcihyZXN1bHRGaWx0ZXIpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNhdmVBc0FjdGlvbi5maWx0ZXIgPSByZXN1bHRGaWx0ZXI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uLmVtaXQoc2F2ZUFzQWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2hlY2tNYW5kYXRvcnlGaWx0ZXJQcm9wZXJ0aWVzKCkge1xuICAgICAgICBpZiAodGhpcy5maWx0ZXJQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgfHwgdGhpcy5maWx0ZXJQcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJQcm9wZXJ0aWVzID0gdGhpcy5nZXREZWZhdWx0RmlsdGVyUHJvcGVydGllcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2hlY2tNYW5kYXRvcnlTb3J0UHJvcGVydGllcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc29ydFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCB8fCB0aGlzLnNvcnRQcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zb3J0UHJvcGVydGllcyA9IHRoaXMuZ2V0RGVmYXVsdFNvcnRQcm9wZXJ0aWVzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhYnN0cmFjdCBnZXREZWZhdWx0RmlsdGVyUHJvcGVydGllcygpOiBzdHJpbmdbXTtcbiAgICBhYnN0cmFjdCBnZXREZWZhdWx0U29ydFByb3BlcnRpZXMoKTogc3RyaW5nW107XG4gICAgYWJzdHJhY3QgaXNEaXNhYmxlZEZvckRlZmF1bHRGaWx0ZXJzKGFjdGlvbjogVGFza0ZpbHRlckFjdGlvbik6IGJvb2xlYW47XG4gICAgYWJzdHJhY3QgY3JlYXRlVGFza0ZpbHRlclByb3BlcnRpZXMoKTogVGFza0ZpbHRlclByb3BlcnRpZXNbXTtcbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0VGFza0ZpbHRlckJ5SWQoYXBwTmFtZTogc3RyaW5nLCBpZDogc3RyaW5nKTtcbiAgICBhYnN0cmFjdCBhc3NpZ25OZXdGaWx0ZXIoZm9ybVZhbHVlcyk6IHZvaWQ7XG5cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVzdG9yZURlZmF1bHRUYXNrRmlsdGVycygpOiBPYnNlcnZhYmxlPFRbXT47XG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IGFkZEZpbHRlcihmaWx0ZXJUb0FkZDogVCk6IE9ic2VydmFibGU8YW55PjtcbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgZGVsZXRlRmlsdGVyKGZpbHRlclRvRGVsZXRlOiBUKTogT2JzZXJ2YWJsZTxUW10+O1xuICAgIHByb3RlY3RlZCBhYnN0cmFjdCB1cGRhdGVGaWx0ZXIoZmlsdGVyVG9VcGRhdGU6IFQpOiBPYnNlcnZhYmxlPGFueT47XG59XG4iXX0=
|