@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.
Files changed (186) hide show
  1. package/bundles/assets/adf-process-services-cloud/i18n/de.json +0 -3
  2. package/bundles/assets/adf-process-services-cloud/i18n/es.json +0 -3
  3. package/bundles/assets/adf-process-services-cloud/i18n/fr.json +0 -3
  4. package/bundles/assets/adf-process-services-cloud/i18n/it.json +0 -3
  5. package/bundles/assets/adf-process-services-cloud/i18n/pl.json +0 -3
  6. package/bundles/assets/adf-process-services-cloud/i18n/pt.json +0 -3
  7. package/fesm2022/adf-process-services-cloud.mjs +490 -410
  8. package/fesm2022/adf-process-services-cloud.mjs.map +1 -1
  9. package/lib/app/services/apps-process-cloud.service.d.ts +2 -2
  10. package/lib/form/components/widgets/display-rich-text/display-rich-text.widget.scss +0 -1
  11. package/lib/process/start-process/components/start-process-cloud.component.d.ts +0 -1
  12. package/lib/process/start-process/components/start-process-cloud.component.scss +4 -0
  13. package/lib/process/start-process/services/start-process-cloud.service.d.ts +1 -0
  14. package/lib/process-services-cloud.module.d.ts +2 -1
  15. package/lib/screen/components/screen-cloud/screen-cloud.component.d.ts +1 -1
  16. package/lib/screen/public-api.d.ts +3 -1
  17. package/lib/screen/services/provide-screen.d.ts +37 -0
  18. package/lib/{services → screen/services}/screen-rendering.service.d.ts +29 -0
  19. package/lib/services/public-api.d.ts +0 -1
  20. package/lib/task/task-filters/components/base-task-filters-cloud.component.d.ts +1 -1
  21. package/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.d.ts +1 -1
  22. package/lib/task/task-list/components/base-task-list-cloud.component.d.ts +1 -1
  23. package/package.json +4 -6
  24. package/esm2022/adf-process-services-cloud.mjs +0 -5
  25. package/esm2022/lib/app/app-list-cloud.module.mjs +0 -20
  26. package/esm2022/lib/app/components/app-details-cloud/app-details-cloud.component.mjs +0 -67
  27. package/esm2022/lib/app/components/app-list-cloud/app-list-cloud.component.mjs +0 -125
  28. package/esm2022/lib/app/models/application-instance.model.mjs +0 -24
  29. package/esm2022/lib/app/public-api.mjs +0 -22
  30. package/esm2022/lib/app/services/apps-process-cloud.service.mjs +0 -97
  31. package/esm2022/lib/common/date-range-filter/date-range-filter.component.mjs +0 -163
  32. package/esm2022/lib/common/date-range-filter/date-range-filter.service.mjs +0 -97
  33. package/esm2022/lib/common/index.mjs +0 -18
  34. package/esm2022/lib/common/interface/environment.interface.mjs +0 -18
  35. package/esm2022/lib/common/interface/index.mjs +0 -18
  36. package/esm2022/lib/common/interface/public-api.mjs +0 -18
  37. package/esm2022/lib/common/public-api.mjs +0 -19
  38. package/esm2022/lib/form/components/cloud-form-rendering.service.mjs +0 -57
  39. package/esm2022/lib/form/components/form-cloud-custom-outcomes.component.mjs +0 -31
  40. package/esm2022/lib/form/components/form-cloud.component.mjs +0 -420
  41. package/esm2022/lib/form/components/form-definition-selector-cloud.component.mjs +0 -53
  42. package/esm2022/lib/form/components/spinner/form-spinner.component.mjs +0 -35
  43. package/esm2022/lib/form/components/widgets/attach-file/attach-file-cloud-widget.component.mjs +0 -249
  44. package/esm2022/lib/form/components/widgets/attach-file/file-properties-table/file-properties-table-cloud.component.mjs +0 -136
  45. package/esm2022/lib/form/components/widgets/data-table/data-table-adapter.widget.mjs +0 -107
  46. package/esm2022/lib/form/components/widgets/data-table/data-table.widget.mjs +0 -120
  47. package/esm2022/lib/form/components/widgets/data-table/helpers/data-table-path-parser.helper.mjs +0 -122
  48. package/esm2022/lib/form/components/widgets/date/date-cloud.widget.mjs +0 -189
  49. package/esm2022/lib/form/components/widgets/display-external-property/display-external-property.widget.mjs +0 -85
  50. package/esm2022/lib/form/components/widgets/display-rich-text/display-rich-text.widget.mjs +0 -80
  51. package/esm2022/lib/form/components/widgets/dropdown/dropdown-cloud.widget.mjs +0 -464
  52. package/esm2022/lib/form/components/widgets/dropdown/validators.mjs +0 -29
  53. package/esm2022/lib/form/components/widgets/file-viewer/file-viewer.widget.mjs +0 -46
  54. package/esm2022/lib/form/components/widgets/group/group-cloud.widget.mjs +0 -82
  55. package/esm2022/lib/form/components/widgets/people/people-cloud.widget.mjs +0 -91
  56. package/esm2022/lib/form/components/widgets/properties-viewer/properties-viewer-wrapper/properties-viewer-wrapper.component.mjs +0 -81
  57. package/esm2022/lib/form/components/widgets/properties-viewer/properties-viewer.widget.mjs +0 -53
  58. package/esm2022/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.schema.mjs +0 -86
  59. package/esm2022/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.widget.mjs +0 -116
  60. package/esm2022/lib/form/components/widgets/upload/upload-cloud.widget.mjs +0 -187
  61. package/esm2022/lib/form/form-cloud.module.mjs +0 -99
  62. package/esm2022/lib/form/models/form-cloud-representation.model.mjs +0 -48
  63. package/esm2022/lib/form/models/task-variable-cloud.model.mjs +0 -28
  64. package/esm2022/lib/form/public-api.mjs +0 -44
  65. package/esm2022/lib/form/services/content-cloud-node-selector.service.mjs +0 -120
  66. package/esm2022/lib/form/services/display-mode.service.mjs +0 -146
  67. package/esm2022/lib/form/services/form-cloud.service.interface.mjs +0 -18
  68. package/esm2022/lib/form/services/form-cloud.service.mjs +0 -201
  69. package/esm2022/lib/form/services/form-definition-selector-cloud.service.interface.mjs +0 -18
  70. package/esm2022/lib/form/services/form-definition-selector-cloud.service.mjs +0 -51
  71. package/esm2022/lib/form/services/form-utils.service.mjs +0 -37
  72. package/esm2022/lib/form/services/process-cloud-content.service.mjs +0 -71
  73. package/esm2022/lib/form/services/spinner/form-cloud-spinner.service.mjs +0 -52
  74. package/esm2022/lib/group/components/group-cloud.component.mjs +0 -423
  75. package/esm2022/lib/group/group-cloud.module.mjs +0 -33
  76. package/esm2022/lib/group/models/identity-group.model.mjs +0 -18
  77. package/esm2022/lib/group/public-api.mjs +0 -21
  78. package/esm2022/lib/group/services/identity-group.service.mjs +0 -89
  79. package/esm2022/lib/models/application-version.model.mjs +0 -21
  80. package/esm2022/lib/models/constant-values.type.mjs +0 -18
  81. package/esm2022/lib/models/data-column-custom-data.mjs +0 -18
  82. package/esm2022/lib/models/date-cloud-filter.model.mjs +0 -31
  83. package/esm2022/lib/models/date-format-cloud.model.mjs +0 -18
  84. package/esm2022/lib/models/engine-event-cloud.model.mjs +0 -18
  85. package/esm2022/lib/models/filter-cloud-model.mjs +0 -128
  86. package/esm2022/lib/models/process-definition-cloud.model.mjs +0 -32
  87. package/esm2022/lib/models/process-instance-variable.model.mjs +0 -18
  88. package/esm2022/lib/models/process-variable-filter.model.mjs +0 -18
  89. package/esm2022/lib/models/task-cloud.model.mjs +0 -23
  90. package/esm2022/lib/models/task-list-sorting.model.mjs +0 -40
  91. package/esm2022/lib/models/variable-definition.mjs +0 -18
  92. package/esm2022/lib/people/components/people-cloud.component.mjs +0 -498
  93. package/esm2022/lib/people/models/identity-user.model.mjs +0 -18
  94. package/esm2022/lib/people/people-cloud.module.mjs +0 -33
  95. package/esm2022/lib/people/public-api.mjs +0 -21
  96. package/esm2022/lib/people/services/identity-user.service.mjs +0 -119
  97. package/esm2022/lib/process/process-cloud.module.mjs +0 -40
  98. package/esm2022/lib/process/process-filters/components/edit-process-filter/edit-process-filter-cloud.component.mjs +0 -801
  99. package/esm2022/lib/process/process-filters/components/process-filter-dialog/process-filter-dialog-cloud.component.mjs +0 -58
  100. package/esm2022/lib/process/process-filters/components/process-filters/process-filters-cloud.component.mjs +0 -292
  101. package/esm2022/lib/process/process-filters/models/process-filter-cloud.model.mjs +0 -170
  102. package/esm2022/lib/process/process-filters/process-filters-cloud.module.mjs +0 -44
  103. package/esm2022/lib/process/process-filters/public-api.mjs +0 -23
  104. package/esm2022/lib/process/process-filters/services/process-filter-cloud.service.mjs +0 -408
  105. package/esm2022/lib/process/process-header/components/process-header-cloud.component.mjs +0 -137
  106. package/esm2022/lib/process/process-header/process-header-cloud.module.mjs +0 -33
  107. package/esm2022/lib/process/process-header/public-api.mjs +0 -19
  108. package/esm2022/lib/process/process-list/components/process-list-cloud.component.mjs +0 -593
  109. package/esm2022/lib/process/process-list/datatable/process-list-datatable-adapter.mjs +0 -31
  110. package/esm2022/lib/process/process-list/models/perocess-instance-cloud-view.model.mjs +0 -18
  111. package/esm2022/lib/process/process-list/models/process-cloud-preferences.mjs +0 -24
  112. package/esm2022/lib/process/process-list/models/process-cloud-preset.model.mjs +0 -37
  113. package/esm2022/lib/process/process-list/models/process-cloud-query-request.model.mjs +0 -107
  114. package/esm2022/lib/process/process-list/models/process-list-sorting.model.mjs +0 -40
  115. package/esm2022/lib/process/process-list/process-list-cloud.module.mjs +0 -45
  116. package/esm2022/lib/process/process-list/public-api.mjs +0 -25
  117. package/esm2022/lib/process/process-list/services/process-list-cloud.service.mjs +0 -253
  118. package/esm2022/lib/process/process-list/services/process-task-list-cloud.service.mjs +0 -109
  119. package/esm2022/lib/process/public-api.mjs +0 -23
  120. package/esm2022/lib/process/services/process-cloud.service.mjs +0 -105
  121. package/esm2022/lib/process/start-process/components/start-process-cloud.component.mjs +0 -465
  122. package/esm2022/lib/process/start-process/models/process-instance-cloud.model.mjs +0 -18
  123. package/esm2022/lib/process/start-process/models/process-payload-cloud.model.mjs +0 -26
  124. package/esm2022/lib/process/start-process/models/process-with-form-payload-cloud.model.mjs +0 -26
  125. package/esm2022/lib/process/start-process/public-api.mjs +0 -21
  126. package/esm2022/lib/process/start-process/services/start-process-cloud.service.mjs +0 -125
  127. package/esm2022/lib/process-services-cloud.module.mjs +0 -98
  128. package/esm2022/lib/providers.mjs +0 -45
  129. package/esm2022/lib/screen/components/screen-cloud/screen-cloud.component.mjs +0 -186
  130. package/esm2022/lib/screen/models/screen-cloud.model.mjs +0 -18
  131. package/esm2022/lib/screen/public-api.mjs +0 -18
  132. package/esm2022/lib/services/base-cloud.service.mjs +0 -83
  133. package/esm2022/lib/services/cloud-token.service.mjs +0 -23
  134. package/esm2022/lib/services/form-fields.interfaces.mjs +0 -55
  135. package/esm2022/lib/services/local-preference-cloud.service.mjs +0 -122
  136. package/esm2022/lib/services/notification-cloud.service.mjs +0 -45
  137. package/esm2022/lib/services/preference-cloud.interface.mjs +0 -18
  138. package/esm2022/lib/services/public-api.mjs +0 -28
  139. package/esm2022/lib/services/screen-rendering.service.mjs +0 -30
  140. package/esm2022/lib/services/task-list-cloud.service.interface.mjs +0 -18
  141. package/esm2022/lib/services/user-preference-cloud.service.mjs +0 -105
  142. package/esm2022/lib/services/variable-mapper.sevice.mjs +0 -77
  143. package/esm2022/lib/services/web-socket.service.mjs +0 -146
  144. package/esm2022/lib/task/models/start-task-cloud-request.model.mjs +0 -32
  145. package/esm2022/lib/task/models/task-details-cloud.model.mjs +0 -26
  146. package/esm2022/lib/task/models/task.model.mjs +0 -23
  147. package/esm2022/lib/task/public-api.mjs +0 -26
  148. package/esm2022/lib/task/services/task-cloud.service.mjs +0 -272
  149. package/esm2022/lib/task/task-cloud.module.mjs +0 -45
  150. package/esm2022/lib/task/task-filters/components/base-task-filters-cloud.component.mjs +0 -59
  151. package/esm2022/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.mjs +0 -467
  152. package/esm2022/lib/task/task-filters/components/edit-task-filters/edit-service-task-filter/edit-service-task-filter-cloud.component.mjs +0 -205
  153. package/esm2022/lib/task/task-filters/components/edit-task-filters/edit-task-filter/edit-task-filter-cloud.component.mjs +0 -317
  154. package/esm2022/lib/task/task-filters/components/service-task-filters/service-task-filters-cloud.component.mjs +0 -146
  155. package/esm2022/lib/task/task-filters/components/task-assignment-filter/task-assignment-filter.component.mjs +0 -142
  156. package/esm2022/lib/task/task-filters/components/task-filter-dialog/task-filter-dialog-cloud.component.mjs +0 -72
  157. package/esm2022/lib/task/task-filters/components/task-filters/task-filters-cloud.component.mjs +0 -255
  158. package/esm2022/lib/task/task-filters/models/filter-cloud.model.mjs +0 -207
  159. package/esm2022/lib/task/task-filters/public-api.mjs +0 -27
  160. package/esm2022/lib/task/task-filters/services/service-task-filter-cloud.service.mjs +0 -283
  161. package/esm2022/lib/task/task-filters/services/task-filter-cloud.service.mjs +0 -392
  162. package/esm2022/lib/task/task-filters/task-filters-cloud.module.mjs +0 -56
  163. package/esm2022/lib/task/task-form/components/task-form-cloud/task-form-cloud.component.mjs +0 -231
  164. package/esm2022/lib/task/task-form/components/user-task-cloud/complete-task/complete-task.directive.mjs +0 -89
  165. package/esm2022/lib/task/task-form/components/user-task-cloud/user-task-cloud.component.mjs +0 -309
  166. package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/claim-task/claim-task-cloud.directive.mjs +0 -101
  167. package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/unclaim-task/unclaim-task-cloud.directive.mjs +0 -87
  168. package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/user-task-cloud-buttons.component.mjs +0 -85
  169. package/esm2022/lib/task/task-form/public-api.mjs +0 -21
  170. package/esm2022/lib/task/task-form/task-form.module.mjs +0 -36
  171. package/esm2022/lib/task/task-header/components/task-header-cloud.component.mjs +0 -280
  172. package/esm2022/lib/task/task-header/public-api.mjs +0 -19
  173. package/esm2022/lib/task/task-header/task-header-cloud.module.mjs +0 -33
  174. package/esm2022/lib/task/task-list/components/base-task-list-cloud.component.mjs +0 -331
  175. package/esm2022/lib/task/task-list/components/service-task-list/service-task-list-cloud.component.mjs +0 -115
  176. package/esm2022/lib/task/task-list/components/task-list/datatable/task-list-datatable-adapter.mjs +0 -31
  177. package/esm2022/lib/task/task-list/components/task-list/task-list-cloud.component.mjs +0 -389
  178. package/esm2022/lib/task/task-list/models/service-task-cloud.model.mjs +0 -18
  179. package/esm2022/lib/task/task-list/models/task-cloud-view.model.mjs +0 -18
  180. package/esm2022/lib/task/task-list/public-api.mjs +0 -23
  181. package/esm2022/lib/task/task-list/services/service-task-list-cloud.service.mjs +0 -115
  182. package/esm2022/lib/task/task-list/services/task-list-cloud.service.mjs +0 -178
  183. package/esm2022/lib/task/task-list/task-list-cloud.module.mjs +0 -35
  184. package/esm2022/lib/types.mjs +0 -18
  185. package/esm2022/public-api.mjs +0 -40
  186. /package/lib/screen/{models → components/screen-cloud}/screen-cloud.model.d.ts +0 -0
@@ -1,465 +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 { Component, DestroyRef, EventEmitter, HostListener, inject, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
18
- import { ConfirmDialogComponent, InplaceFormInputComponent, LocalizedDatePipe, TranslationService, isOutcomeButtonVisible } from '@alfresco/adf-core';
19
- import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
20
- import { MatAutocompleteModule, MatAutocompleteTrigger } from '@angular/material/autocomplete';
21
- import { catchError, debounceTime, map } from 'rxjs/operators';
22
- import { ProcessPayloadCloud } from '../models/process-payload-cloud.model';
23
- import { ProcessWithFormPayloadCloud } from '../models/process-with-form-payload-cloud.model';
24
- import { StartProcessCloudService } from '../services/start-process-cloud.service';
25
- import { BehaviorSubject, forkJoin, of, combineLatest } from 'rxjs';
26
- import { ProcessDefinitionCloud } from '../../../models/process-definition-cloud.model';
27
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
28
- import { getTime } from 'date-fns';
29
- import { CommonModule } from '@angular/common';
30
- import { TranslatePipe } from '@ngx-translate/core';
31
- import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
32
- import { MatCardModule } from '@angular/material/card';
33
- import { MatButtonModule } from '@angular/material/button';
34
- import { MatIconModule } from '@angular/material/icon';
35
- import { MatInputModule } from '@angular/material/input';
36
- import { MatOptionModule } from '@angular/material/core';
37
- import { FormCloudComponent } from '../../../form/components/form-cloud.component';
38
- import { FormCustomOutcomesComponent } from '../../../form/components/form-cloud-custom-outcomes.component';
39
- import { MatDialog } from '@angular/material/dialog';
40
- import * as i0 from "@angular/core";
41
- import * as i1 from "@alfresco/adf-core";
42
- import * as i2 from "@angular/common";
43
- import * as i3 from "@angular/material/progress-spinner";
44
- import * as i4 from "@angular/material/card";
45
- import * as i5 from "@angular/material/button";
46
- import * as i6 from "@angular/material/icon";
47
- import * as i7 from "@angular/material/input";
48
- import * as i8 from "@angular/material/form-field";
49
- import * as i9 from "@angular/material/core";
50
- import * as i10 from "@angular/material/autocomplete";
51
- import * as i11 from "@angular/forms";
52
- const MAX_NAME_LENGTH = 255;
53
- const PROCESS_DEFINITION_DEBOUNCE = 300;
54
- const DATE_TIME_IDENTIFIER_REG_EXP = new RegExp('%{datetime}', 'i');
55
- const PROCESS_DEFINITION_IDENTIFIER_REG_EXP = new RegExp('%{processdefinition}', 'i');
56
- export class StartProcessCloudComponent {
57
- get isProcessFormValid() {
58
- if (this.hasForm && this.isFormCloudLoaded) {
59
- return (this.formCloud ? !Object.keys(this.formCloud.values).length : false) || this.formCloud?.isValid || this.isProcessStarting;
60
- }
61
- else {
62
- return this.processForm.valid || this.isProcessStarting;
63
- }
64
- }
65
- get disableStartButton() {
66
- return !this.appName || !this.processDefinition.valid || this.isProcessStarting || this.isFormCloudLoading;
67
- }
68
- get isProcessDefinitionsEmpty() {
69
- return !this.processDefinitionList.length;
70
- }
71
- get processInstanceName() {
72
- return this.processForm.controls.processInstanceName;
73
- }
74
- get processDefinition() {
75
- return this.processForm.controls.processDefinition;
76
- }
77
- get hasForm() {
78
- return !!this.processDefinitionCurrent?.formKey;
79
- }
80
- get defaultStartProcessButtonLabel() {
81
- return this.translateService.instant('ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.ACTION.START').toUpperCase();
82
- }
83
- get defaultCancelProcessButtonLabel() {
84
- return this.translateService.instant('ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.ACTION.CANCEL').toUpperCase();
85
- }
86
- constructor(translateService) {
87
- this.translateService = translateService;
88
- /** (required) Name of the app. */
89
- this.appName = '';
90
- /** Maximum length of the process name. */
91
- this.maxNameLength = MAX_NAME_LENGTH;
92
- /** Name of the process. */
93
- this.name = '';
94
- /** Show/hide the process dropdown list. */
95
- this.showSelectProcessDropdown = true;
96
- /** Show/hide title. */
97
- this.showTitle = true;
98
- /** Show/hide cancel button. */
99
- this.showCancelButton = true;
100
- /** Emitted when the process is successfully started. */
101
- this.success = new EventEmitter();
102
- /** Emitted when the starting process is cancelled */
103
- this.cancel = new EventEmitter();
104
- /** Emitted when an error occurs. */
105
- this.error = new EventEmitter();
106
- /** Emitted when form content is clicked. */
107
- this.formContentClicked = new EventEmitter();
108
- /** Emitted when process definition selection changes. */
109
- this.processDefinitionSelection = new EventEmitter();
110
- this.processDefinitionList = [];
111
- this.errorMessageId = '';
112
- this.processPayloadCloud = new ProcessPayloadCloud();
113
- this.filteredProcesses = [];
114
- this.staticMappings = [];
115
- this.isProcessStarting = false;
116
- this.isFormCloudLoaded = false;
117
- this.isFormCloudLoading = false;
118
- this.processDefinitionLoaded = false;
119
- this.processForm = new FormGroup({
120
- processInstanceName: new FormControl('', [
121
- Validators.required,
122
- Validators.maxLength(this.getMaxNameLength()),
123
- Validators.pattern('^[^\\s]+(\\s+[^\\s]+)*$')
124
- ]),
125
- processDefinition: new FormControl('', [Validators.required, this.processDefinitionNameValidator()])
126
- });
127
- this.destroyRef = inject(DestroyRef);
128
- this.startProcessCloudService = inject(StartProcessCloudService);
129
- this.localizedDatePipe = inject(LocalizedDatePipe);
130
- this.displayStartSubject = new BehaviorSubject(null);
131
- this.hasVisibleOutcomesSubject = new BehaviorSubject(false);
132
- this.dialog = inject(MatDialog);
133
- this.showSaveButton = false;
134
- this.showCompleteButton = false;
135
- this.startProcessButtonLabel = this.defaultStartProcessButtonLabel;
136
- this.cancelButtonLabel = this.defaultCancelProcessButtonLabel;
137
- }
138
- ngOnInit() {
139
- this.processDefinition.setValue(this.processDefinitionName);
140
- this.processDefinition.valueChanges
141
- .pipe(debounceTime(PROCESS_DEFINITION_DEBOUNCE))
142
- .pipe(takeUntilDestroyed(this.destroyRef))
143
- .subscribe((processDefinitionName) => {
144
- this.selectProcessDefinitionByProcessDefinitionName(processDefinitionName);
145
- });
146
- this.showStartProcessButton$ = combineLatest([this.displayStartSubject, this.hasVisibleOutcomesSubject]).pipe(map(([displayStart, hasVisibleOutcomes]) => (displayStart !== null ? displayStart === 'true' : !hasVisibleOutcomes)));
147
- }
148
- ngOnChanges(changes) {
149
- if (changes['appName'] && changes['appName'].currentValue !== changes['appName'].previousValue) {
150
- this.appName = changes['appName'].currentValue;
151
- if (this.appName || this.appName === '') {
152
- this.loadProcessDefinitions();
153
- }
154
- }
155
- if (changes['values'] && changes['values'].currentValue !== changes['values'].previousValue) {
156
- this.resolvedValues = this.staticMappings.concat(this.values || []);
157
- }
158
- }
159
- onKeyDown(event) {
160
- event.stopPropagation();
161
- }
162
- onFormLoaded(form) {
163
- this.isFormCloudLoaded = true;
164
- this.formCloud = form;
165
- const anyOutcomeVisible = form?.outcomes?.some((outcome) => isOutcomeButtonVisible(outcome, {
166
- isFormReadOnly: form.readOnly,
167
- showCompleteButton: this.showCompleteButton,
168
- showSaveButton: this.showSaveButton
169
- }));
170
- this.hasVisibleOutcomesSubject.next(anyOutcomeVisible);
171
- }
172
- getMaxNameLength() {
173
- return this.maxNameLength > MAX_NAME_LENGTH ? MAX_NAME_LENGTH : this.maxNameLength;
174
- }
175
- selectProcessDefinitionByProcessDefinitionName(processDefinitionName) {
176
- this.filteredProcesses = this.getProcessDefinitionListByNameOrKey(processDefinitionName);
177
- if (this.isProcessFormValid && this.filteredProcesses && this.filteredProcesses.length === 1) {
178
- this.setProcessDefinitionOnForm(this.filteredProcesses[0].name);
179
- }
180
- }
181
- setProcessDefinitionOnForm(selectedProcessDefinitionName) {
182
- this.isFormCloudLoading = true;
183
- const processDefinitionCurrent = this.filteredProcesses.find((process) => process.name === selectedProcessDefinitionName || process.key === selectedProcessDefinitionName);
184
- forkJoin([
185
- this.startProcessCloudService
186
- .getStartEventFormStaticValuesMapping(this.appName, processDefinitionCurrent.id)
187
- .pipe(catchError(() => of([]))),
188
- this.startProcessCloudService
189
- .getStartEventConstants(this.appName, processDefinitionCurrent.id)
190
- .pipe(catchError(() => of([])))
191
- ]).subscribe(([staticMappings, constants]) => {
192
- this.staticMappings = staticMappings;
193
- this.resolvedValues = this.staticMappings.concat(this.values || []);
194
- this.processDefinitionCurrent = processDefinitionCurrent;
195
- this.isFormCloudLoading = false;
196
- const displayStart = constants?.find((constant) => constant.name === 'startEnabled');
197
- const startLabel = constants?.find((constant) => constant.name === 'startLabel');
198
- const displayCancel = constants?.find((constant) => constant.name === 'cancelEnabled');
199
- const cancelLabel = constants?.find((constant) => constant.name === 'cancelLabel');
200
- if (displayStart) {
201
- this.displayStartSubject.next(displayStart?.value);
202
- }
203
- if (startLabel) {
204
- this.startProcessButtonLabel = startLabel?.value?.trim()?.length > 0 ? startLabel.value.trim() : this.defaultStartProcessButtonLabel;
205
- }
206
- if (displayCancel) {
207
- this.showCancelButton = displayCancel?.value === 'true' && this.showCancelButton;
208
- }
209
- if (cancelLabel) {
210
- this.cancelButtonLabel = cancelLabel?.value?.trim()?.length > 0 ? cancelLabel.value.trim() : this.defaultCancelProcessButtonLabel;
211
- }
212
- });
213
- this.isFormCloudLoaded = false;
214
- this.processPayloadCloud.processDefinitionKey = processDefinitionCurrent.key;
215
- }
216
- getProcessDefinitionListByNameOrKey(processDefinitionName) {
217
- return this.processDefinitionList.filter((processDefinitionCloud) => !processDefinitionName || this.getProcessDefinition(processDefinitionCloud, processDefinitionName));
218
- }
219
- getProcessIfExists(processDefinition) {
220
- let matchedProcess = this.processDefinitionList.find((option) => this.getProcessDefinition(option, processDefinition));
221
- if (!matchedProcess) {
222
- matchedProcess = new ProcessDefinitionCloud();
223
- }
224
- return matchedProcess;
225
- }
226
- getProcessDefinitionByName(processDefinitionName) {
227
- const matchedProcess = processDefinitionName ? this.getProcessIfExists(processDefinitionName) : this.processDefinitionList[0];
228
- return matchedProcess;
229
- }
230
- selectDefaultProcessDefinition() {
231
- const selectedProcess = this.getProcessDefinitionByName(this.processDefinitionName);
232
- if (selectedProcess) {
233
- this.processDefinition.setValue(selectedProcess.name);
234
- this.processDefinitionSelectionChanged(selectedProcess);
235
- }
236
- }
237
- loadProcessDefinitions() {
238
- this.resetErrorMessage();
239
- this.startProcessCloudService
240
- .getProcessDefinitions(this.appName)
241
- .pipe(takeUntilDestroyed(this.destroyRef))
242
- .subscribe((processDefinitionRepresentations) => {
243
- this.processDefinitionList = processDefinitionRepresentations;
244
- if (processDefinitionRepresentations.length === 1) {
245
- this.selectDefaultProcessDefinition();
246
- }
247
- else if (this.processDefinitionName) {
248
- this.processDefinition.setValue(this.processDefinitionName);
249
- const processDefinition = this.processDefinitionList.find((process) => process.name === this.processDefinitionName);
250
- if (processDefinition) {
251
- this.filteredProcesses = this.getProcessDefinitionListByNameOrKey(processDefinition.name);
252
- this.setProcessDefinitionOnForm(processDefinition.name);
253
- this.processDefinitionSelectionChanged(processDefinition);
254
- }
255
- }
256
- this.processDefinitionLoaded = true;
257
- }, () => {
258
- this.errorMessageId = 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.LOAD_PROCESS_DEFS';
259
- });
260
- }
261
- isValidName(name) {
262
- return !!name;
263
- }
264
- getProcessDefinition(processDefinitionCloud, processDefinitionName) {
265
- return ((this.isValidName(processDefinitionCloud.name) &&
266
- processDefinitionCloud.name.toLowerCase().includes(processDefinitionName.toLowerCase())) ||
267
- processDefinitionCloud.key?.toLowerCase().includes(processDefinitionName.toLowerCase()));
268
- }
269
- buildProcessCloudPayload() {
270
- this.processPayloadCloud.name = this.processInstanceName.value;
271
- if (this.variables) {
272
- this.processPayloadCloud.variables = this.variables;
273
- }
274
- if (this.hasForm) {
275
- this.processPayloadCloud.variables = Object.assign(this.processPayloadCloud.variables, this.formCloud.values);
276
- }
277
- }
278
- onCustomOutcomeClicked(outcome) {
279
- this.customOutcome = outcome;
280
- this.startProcess();
281
- }
282
- startProcessWithoutConfirmation() {
283
- this.isProcessStarting = true;
284
- const action = this.hasForm
285
- ? this.startProcessCloudService.startProcessWithForm(this.appName, this.processDefinitionCurrent.formKey, this.processDefinitionCurrent.version, new ProcessWithFormPayloadCloud({
286
- processName: this.processInstanceName.value,
287
- processDefinitionKey: this.processPayloadCloud.processDefinitionKey,
288
- variables: this.variables ?? {},
289
- values: this.formCloud.values,
290
- outcome: this.customOutcome
291
- }))
292
- : this.startProcessCloudService.startProcess(this.appName, new ProcessPayloadCloud({
293
- name: this.processInstanceName.value,
294
- processDefinitionKey: this.processPayloadCloud.processDefinitionKey,
295
- variables: this.variables ?? {}
296
- }));
297
- action.subscribe({
298
- next: (res) => {
299
- this.success.emit(res);
300
- this.isProcessStarting = false;
301
- },
302
- error: (err) => {
303
- this.errorMessageId = 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.START';
304
- this.unifyErrorResponse(err);
305
- this.error.emit(err);
306
- this.isProcessStarting = false;
307
- }
308
- });
309
- }
310
- startProcess() {
311
- if (!this.formCloud?.confirmMessage?.show) {
312
- this.startProcessWithoutConfirmation();
313
- }
314
- else {
315
- const dialogRef = this.dialog.open(ConfirmDialogComponent, {
316
- data: {
317
- message: this.formCloud.confirmMessage.message
318
- },
319
- minWidth: '450px'
320
- });
321
- dialogRef.afterClosed().subscribe((result) => {
322
- if (result) {
323
- this.startProcessWithoutConfirmation();
324
- }
325
- });
326
- }
327
- }
328
- unifyErrorResponse(err) {
329
- if (!err?.response?.body?.entry && err?.response?.body?.message) {
330
- err.response.body = {
331
- entry: JSON.parse(err.response.body.message)
332
- };
333
- }
334
- }
335
- cancelStartProcess() {
336
- this.cancel.emit();
337
- }
338
- resetErrorMessage() {
339
- this.errorMessageId = '';
340
- }
341
- resetProcessDefinitionList() {
342
- this.processDefinition.setValue('');
343
- this.filteredProcesses = this.processDefinitionList;
344
- }
345
- displayProcessNameOnDropdown(process) {
346
- if (process) {
347
- let processName = process;
348
- if (typeof process !== 'string') {
349
- processName = process.name;
350
- }
351
- return processName;
352
- }
353
- }
354
- displayDropdown(event) {
355
- event.stopPropagation();
356
- if (!this.inputAutocomplete.panelOpen) {
357
- this.resetProcessDefinitionList();
358
- this.inputAutocomplete.openPanel();
359
- }
360
- else {
361
- this.inputAutocomplete.closePanel();
362
- }
363
- }
364
- processDefinitionNameValidator() {
365
- return (control) => {
366
- const processDefinitionFieldValue = control.value;
367
- let processDefinitionNameError = false;
368
- if (processDefinitionFieldValue) {
369
- const processDefinition = this.getProcessIfExists(processDefinitionFieldValue);
370
- if (!processDefinition.key) {
371
- processDefinitionNameError = true;
372
- }
373
- }
374
- return processDefinitionNameError ? { 'invalid name': true } : null;
375
- };
376
- }
377
- getProcessDefinitionValue(process) {
378
- return process.name ? process.name : process.key;
379
- }
380
- onFormContentClicked(content) {
381
- this.formContentClicked.emit(content);
382
- }
383
- processDefinitionSelectionChanged(processDefinition) {
384
- if (processDefinition) {
385
- this.setDefaultProcessName(processDefinition.name);
386
- this.processDefinitionSelection.emit(processDefinition);
387
- }
388
- }
389
- setDefaultProcessName(processDefinitionName) {
390
- const processInstanceDetails = { processDefinitionName };
391
- const defaultProcessName = this.getDefaultProcessName(this.name, processInstanceDetails);
392
- this.processInstanceName.setValue(defaultProcessName);
393
- this.processInstanceName.markAsDirty();
394
- this.processInstanceName.markAsTouched();
395
- }
396
- getDefaultProcessName(processNameFormat, processInstance) {
397
- let processName = processNameFormat;
398
- if (processName.match(DATE_TIME_IDENTIFIER_REG_EXP)) {
399
- const presentDateTime = getTime(new Date());
400
- processName = processName.replace(DATE_TIME_IDENTIFIER_REG_EXP, this.localizedDatePipe.transform(presentDateTime, 'medium'));
401
- }
402
- if (processName.match(PROCESS_DEFINITION_IDENTIFIER_REG_EXP)) {
403
- const selectedProcessDefinitionName = processInstance ? processInstance.processDefinitionName : '';
404
- processName = processName.replace(PROCESS_DEFINITION_IDENTIFIER_REG_EXP, selectedProcessDefinitionName);
405
- }
406
- return processName;
407
- }
408
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StartProcessCloudComponent, deps: [{ token: i1.TranslationService }], target: i0.ɵɵFactoryTarget.Component }); }
409
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StartProcessCloudComponent, isStandalone: true, selector: "adf-cloud-start-process", inputs: { appName: "appName", maxNameLength: "maxNameLength", name: "name", processDefinitionName: "processDefinitionName", variables: "variables", values: "values", showSelectProcessDropdown: "showSelectProcessDropdown", showTitle: "showTitle", showCancelButton: "showCancelButton", displayModeConfigurations: "displayModeConfigurations" }, outputs: { success: "success", cancel: "cancel", error: "error", formContentClicked: "formContentClicked", processDefinitionSelection: "processDefinitionSelection" }, host: { listeners: { "keydown": "onKeyDown($event)" } }, providers: [LocalizedDatePipe], viewQueries: [{ propertyName: "inputAutocomplete", first: true, predicate: MatAutocompleteTrigger, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<mat-card appearance=\"outlined\" class=\"adf-start-process\" *ngIf=\"processDefinitionLoaded; else spinner\">\n\n <mat-card-content>\n <mat-card-title\n *ngIf=\"showTitle\"\n class=\"adf-title\">\n {{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.TITLE' | translate}}\n </mat-card-title>\n\n <mat-card-subtitle id=\"error-message\" *ngIf=\"errorMessageId\">\n {{ errorMessageId | translate }}\n </mat-card-subtitle>\n\n <div *ngIf=\"!isProcessDefinitionsEmpty; else emptyProcessDefinitionsList\">\n <form [formGroup]=\"processForm\" class=\"adf-select-process-form\">\n <mat-form-field\n class=\"adf-process-input-container\"\n floatLabel=\"always\"\n *ngIf=\"showSelectProcessDropdown\"\n data-automation-id=\"adf-select-cloud-process-dropdown\"\n >\n <mat-label class=\"adf-start-process-input-label\">{{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.LABEL.TYPE' | translate }}</mat-label>\n <input\n matInput\n formControlName=\"processDefinition\"\n [matAutocomplete]=\"auto\"\n id=\"processDefinitionName\"\n >\n\n <div class=\"adf-process-input-autocomplete\">\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n id=\"processDefinitionOptions\"\n [displayWith]=\"displayProcessNameOnDropdown\"\n (optionSelected)=\"setProcessDefinitionOnForm($event.option.value)\" >\n <mat-option\n *ngFor=\"let processDef of filteredProcesses\"\n [value]=\"getProcessDefinitionValue(processDef)\"\n (click)=\"processDefinitionSelectionChanged(processDef)\">\n {{ getProcessDefinitionValue(processDef) }}\n </mat-option>\n </mat-autocomplete>\n\n <button\n id=\"adf-select-process-dropdown\"\n title=\"{{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.SELECT_PROCESS_DROPDOWN' | translate}}\"\n mat-icon-button\n (click)=\"displayDropdown($event)\">\n <mat-icon>arrow_drop_down</mat-icon>\n </button>\n\n </div>\n <mat-error\n *ngIf=\"processDefinition.hasError('required')\"\n class=\"adf-error-pb\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.PROCESS_DEFINITION_REQUIRED' | translate }}\n </mat-error>\n </mat-form-field>\n\n <adf-inplace-form-input [control]=\"processInstanceName\">\n <ng-container label>\n {{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.LABEL.NAME' | translate}}\n </ng-container>\n\n <ng-container error>\n <span *ngIf=\"processInstanceName.hasError('required')\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.PROCESS_NAME_REQUIRED' | translate }}\n </span>\n <span *ngIf=\"processInstanceName.hasError('maxlength')\" id=\"adf-start-process-maxlength-error\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.MAXIMUM_LENGTH' | translate : { characters : maxNameLength } }}\n </span>\n <span *ngIf=\"processInstanceName.hasError('pattern')\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.SPACE_VALIDATOR' | translate }}\n </span>\n </ng-container>\n </adf-inplace-form-input>\n </form>\n\n <ng-container *ngIf=\"hasForm else taskFormCloudButtons\">\n <adf-cloud-form\n #startForm\n [appName]=\"appName\"\n [appVersion]=\"processDefinitionCurrent.appVersion\"\n [data]=\"resolvedValues\"\n [formId]=\"processDefinitionCurrent.formKey\"\n [displayModeConfigurations]=\"displayModeConfigurations\"\n [showSaveButton]=\"showSaveButton\"\n [showCompleteButton]=\"showCompleteButton\"\n [showRefreshButton]=\"false\"\n [showValidationIcon]=\"false\"\n [showTitle]=\"false\"\n (formContentClicked)=\"onFormContentClicked($event)\"\n (formLoaded)=\"onFormLoaded($event)\"\n (executeOutcome)=\"onCustomOutcomeClicked($event.outcome.name)\"\n >\n <adf-cloud-form-custom-outcomes>\n <ng-template [ngTemplateOutlet]=\"taskFormCloudButtons\" />\n </adf-cloud-form-custom-outcomes>\n </adf-cloud-form>\n </ng-container>\n </div>\n\n </mat-card-content>\n\n</mat-card>\n\n<ng-template #taskFormCloudButtons>\n <div class=\"adf-start-process-cloud-actions\">\n <button\n *ngIf=\"showCancelButton\"\n mat-button\n (click)=\"cancelStartProcess()\"\n id=\"cancel_process\"\n >\n {{ cancelButtonLabel }}\n </button>\n <button\n *ngIf=\"showStartProcessButton$ | async\"\n color=\"primary\"\n mat-raised-button\n [disabled]=\"disableStartButton || !isProcessFormValid\"\n (click)=\"startProcess()\"\n data-automation-id=\"btn-start\"\n id=\"button-start\"\n class=\"adf-btn-start\"\n >\n {{ startProcessButtonLabel }}\n </button>\n </div>\n</ng-template>\n\n<ng-template #emptyProcessDefinitionsList>\n <mat-card-content *ngIf=\"processDefinitionLoaded\">\n <mat-card-subtitle class=\"error-message\" id=\"no-process-message\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.NO_PROCESS_DEFINITIONS' | translate | uppercase}}\n </mat-card-subtitle>\n </mat-card-content>\n</ng-template>\n\n<ng-template #spinner>\n <div class=\"adf-loading-container\">\n <mat-progress-spinner\n class=\"adf-loading\"\n color=\"primary\"\n mode=\"indeterminate\" />\n </div>\n</ng-template>\n", styles: [".adf-start-process .adf-start-process-input-label{color:var(--adf-theme-mat-grey-color-a200-dark)}.adf-start-process-cloud-actions{display:flex;justify-content:flex-end}.adf-select-process-form{display:flex;flex-direction:column}.adf-title{padding-bottom:1.25em}.adf-process-input-container{margin:0 7px}.adf-process-input-autocomplete{display:flex}.adf-process-input-autocomplete button{position:absolute;right:-14px;top:0}.adf-form-container .adf-form-container-card:has(.adf-form-container-card-content){box-shadow:none;padding:0}.adf-start-form-actions{text-align:right}.adf-loading{margin:auto}.adf-loading-container{min-height:300px;display:flex;height:100%}\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: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i4.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i4.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i4.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "directive", type: i4.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: InplaceFormInputComponent, selector: "adf-inplace-form-input", inputs: ["control"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7.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: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "component", type: i9.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i10.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: i10.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i11.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i11.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: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i11.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i11.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: FormCloudComponent, selector: "adf-cloud-form", inputs: ["appName", "appVersion", "formId", "processInstanceId", "taskId", "data", "displayModeConfigurations", "showCompleteButton", "customSaveButtonText", "customCompleteButtonText"], outputs: ["formSaved", "formCompleted", "formLoaded", "formDataRefreshed", "formContentClicked", "displayModeOn", "displayModeOff"] }, { kind: "component", type: FormCustomOutcomesComponent, selector: "adf-cloud-form-custom-outcomes" }], encapsulation: i0.ViewEncapsulation.None }); }
410
- }
411
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StartProcessCloudComponent, decorators: [{
412
- type: Component,
413
- args: [{ selector: 'adf-cloud-start-process', standalone: true, imports: [
414
- CommonModule,
415
- TranslatePipe,
416
- MatProgressSpinnerModule,
417
- MatCardModule,
418
- MatButtonModule,
419
- InplaceFormInputComponent,
420
- MatIconModule,
421
- MatInputModule,
422
- MatOptionModule,
423
- MatAutocompleteModule,
424
- ReactiveFormsModule,
425
- FormCloudComponent,
426
- FormCustomOutcomesComponent
427
- ], providers: [LocalizedDatePipe], encapsulation: ViewEncapsulation.None, template: "<mat-card appearance=\"outlined\" class=\"adf-start-process\" *ngIf=\"processDefinitionLoaded; else spinner\">\n\n <mat-card-content>\n <mat-card-title\n *ngIf=\"showTitle\"\n class=\"adf-title\">\n {{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.TITLE' | translate}}\n </mat-card-title>\n\n <mat-card-subtitle id=\"error-message\" *ngIf=\"errorMessageId\">\n {{ errorMessageId | translate }}\n </mat-card-subtitle>\n\n <div *ngIf=\"!isProcessDefinitionsEmpty; else emptyProcessDefinitionsList\">\n <form [formGroup]=\"processForm\" class=\"adf-select-process-form\">\n <mat-form-field\n class=\"adf-process-input-container\"\n floatLabel=\"always\"\n *ngIf=\"showSelectProcessDropdown\"\n data-automation-id=\"adf-select-cloud-process-dropdown\"\n >\n <mat-label class=\"adf-start-process-input-label\">{{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.LABEL.TYPE' | translate }}</mat-label>\n <input\n matInput\n formControlName=\"processDefinition\"\n [matAutocomplete]=\"auto\"\n id=\"processDefinitionName\"\n >\n\n <div class=\"adf-process-input-autocomplete\">\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n id=\"processDefinitionOptions\"\n [displayWith]=\"displayProcessNameOnDropdown\"\n (optionSelected)=\"setProcessDefinitionOnForm($event.option.value)\" >\n <mat-option\n *ngFor=\"let processDef of filteredProcesses\"\n [value]=\"getProcessDefinitionValue(processDef)\"\n (click)=\"processDefinitionSelectionChanged(processDef)\">\n {{ getProcessDefinitionValue(processDef) }}\n </mat-option>\n </mat-autocomplete>\n\n <button\n id=\"adf-select-process-dropdown\"\n title=\"{{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.SELECT_PROCESS_DROPDOWN' | translate}}\"\n mat-icon-button\n (click)=\"displayDropdown($event)\">\n <mat-icon>arrow_drop_down</mat-icon>\n </button>\n\n </div>\n <mat-error\n *ngIf=\"processDefinition.hasError('required')\"\n class=\"adf-error-pb\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.PROCESS_DEFINITION_REQUIRED' | translate }}\n </mat-error>\n </mat-form-field>\n\n <adf-inplace-form-input [control]=\"processInstanceName\">\n <ng-container label>\n {{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.LABEL.NAME' | translate}}\n </ng-container>\n\n <ng-container error>\n <span *ngIf=\"processInstanceName.hasError('required')\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.PROCESS_NAME_REQUIRED' | translate }}\n </span>\n <span *ngIf=\"processInstanceName.hasError('maxlength')\" id=\"adf-start-process-maxlength-error\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.MAXIMUM_LENGTH' | translate : { characters : maxNameLength } }}\n </span>\n <span *ngIf=\"processInstanceName.hasError('pattern')\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.ERROR.SPACE_VALIDATOR' | translate }}\n </span>\n </ng-container>\n </adf-inplace-form-input>\n </form>\n\n <ng-container *ngIf=\"hasForm else taskFormCloudButtons\">\n <adf-cloud-form\n #startForm\n [appName]=\"appName\"\n [appVersion]=\"processDefinitionCurrent.appVersion\"\n [data]=\"resolvedValues\"\n [formId]=\"processDefinitionCurrent.formKey\"\n [displayModeConfigurations]=\"displayModeConfigurations\"\n [showSaveButton]=\"showSaveButton\"\n [showCompleteButton]=\"showCompleteButton\"\n [showRefreshButton]=\"false\"\n [showValidationIcon]=\"false\"\n [showTitle]=\"false\"\n (formContentClicked)=\"onFormContentClicked($event)\"\n (formLoaded)=\"onFormLoaded($event)\"\n (executeOutcome)=\"onCustomOutcomeClicked($event.outcome.name)\"\n >\n <adf-cloud-form-custom-outcomes>\n <ng-template [ngTemplateOutlet]=\"taskFormCloudButtons\" />\n </adf-cloud-form-custom-outcomes>\n </adf-cloud-form>\n </ng-container>\n </div>\n\n </mat-card-content>\n\n</mat-card>\n\n<ng-template #taskFormCloudButtons>\n <div class=\"adf-start-process-cloud-actions\">\n <button\n *ngIf=\"showCancelButton\"\n mat-button\n (click)=\"cancelStartProcess()\"\n id=\"cancel_process\"\n >\n {{ cancelButtonLabel }}\n </button>\n <button\n *ngIf=\"showStartProcessButton$ | async\"\n color=\"primary\"\n mat-raised-button\n [disabled]=\"disableStartButton || !isProcessFormValid\"\n (click)=\"startProcess()\"\n data-automation-id=\"btn-start\"\n id=\"button-start\"\n class=\"adf-btn-start\"\n >\n {{ startProcessButtonLabel }}\n </button>\n </div>\n</ng-template>\n\n<ng-template #emptyProcessDefinitionsList>\n <mat-card-content *ngIf=\"processDefinitionLoaded\">\n <mat-card-subtitle class=\"error-message\" id=\"no-process-message\">\n {{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.NO_PROCESS_DEFINITIONS' | translate | uppercase}}\n </mat-card-subtitle>\n </mat-card-content>\n</ng-template>\n\n<ng-template #spinner>\n <div class=\"adf-loading-container\">\n <mat-progress-spinner\n class=\"adf-loading\"\n color=\"primary\"\n mode=\"indeterminate\" />\n </div>\n</ng-template>\n", styles: [".adf-start-process .adf-start-process-input-label{color:var(--adf-theme-mat-grey-color-a200-dark)}.adf-start-process-cloud-actions{display:flex;justify-content:flex-end}.adf-select-process-form{display:flex;flex-direction:column}.adf-title{padding-bottom:1.25em}.adf-process-input-container{margin:0 7px}.adf-process-input-autocomplete{display:flex}.adf-process-input-autocomplete button{position:absolute;right:-14px;top:0}.adf-form-container .adf-form-container-card:has(.adf-form-container-card-content){box-shadow:none;padding:0}.adf-start-form-actions{text-align:right}.adf-loading{margin:auto}.adf-loading-container{min-height:300px;display:flex;height:100%}\n"] }]
428
- }], ctorParameters: () => [{ type: i1.TranslationService }], propDecorators: { inputAutocomplete: [{
429
- type: ViewChild,
430
- args: [MatAutocompleteTrigger]
431
- }], appName: [{
432
- type: Input
433
- }], maxNameLength: [{
434
- type: Input
435
- }], name: [{
436
- type: Input
437
- }], processDefinitionName: [{
438
- type: Input
439
- }], variables: [{
440
- type: Input
441
- }], values: [{
442
- type: Input
443
- }], showSelectProcessDropdown: [{
444
- type: Input
445
- }], showTitle: [{
446
- type: Input
447
- }], showCancelButton: [{
448
- type: Input
449
- }], displayModeConfigurations: [{
450
- type: Input
451
- }], success: [{
452
- type: Output
453
- }], cancel: [{
454
- type: Output
455
- }], error: [{
456
- type: Output
457
- }], formContentClicked: [{
458
- type: Output
459
- }], processDefinitionSelection: [{
460
- type: Output
461
- }], onKeyDown: [{
462
- type: HostListener,
463
- args: ['keydown', ['$event']]
464
- }] } });
465
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQtcHJvY2Vzcy1jbG91ZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvcHJvY2Vzcy1zZXJ2aWNlcy1jbG91ZC9zcmMvbGliL3Byb2Nlc3Mvc3RhcnQtcHJvY2Vzcy9jb21wb25lbnRzL3N0YXJ0LXByb2Nlc3MtY2xvdWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL3Byb2Nlc3Mtc2VydmljZXMtY2xvdWQvc3JjL2xpYi9wcm9jZXNzL3N0YXJ0LXByb2Nlc3MvY29tcG9uZW50cy9zdGFydC1wcm9jZXNzLWNsb3VkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNULGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0gsc0JBQXNCLEVBR3RCLHlCQUF5QixFQUN6QixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN6QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBbUIsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBZSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2SCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRixPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUM5RixP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aHQgwqkgMjAwNS0yMDI1IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIERlc3Ryb3lSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBpbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENvbmZpcm1EaWFsb2dDb21wb25lbnQsXG4gICAgQ29udGVudExpbmtNb2RlbCxcbiAgICBGb3JtTW9kZWwsXG4gICAgSW5wbGFjZUZvcm1JbnB1dENvbXBvbmVudCxcbiAgICBMb2NhbGl6ZWREYXRlUGlwZSxcbiAgICBUcmFuc2xhdGlvblNlcnZpY2UsXG4gICAgaXNPdXRjb21lQnV0dG9uVmlzaWJsZVxufSBmcm9tICdAYWxmcmVzY28vYWRmLWNvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZU1vZHVsZSwgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkZWJvdW5jZVRpbWUsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFByb2Nlc3NJbnN0YW5jZUNsb3VkIH0gZnJvbSAnLi4vbW9kZWxzL3Byb2Nlc3MtaW5zdGFuY2UtY2xvdWQubW9kZWwnO1xuaW1wb3J0IHsgUHJvY2Vzc1BheWxvYWRDbG91ZCB9IGZyb20gJy4uL21vZGVscy9wcm9jZXNzLXBheWxvYWQtY2xvdWQubW9kZWwnO1xuaW1wb3J0IHsgUHJvY2Vzc1dpdGhGb3JtUGF5bG9hZENsb3VkIH0gZnJvbSAnLi4vbW9kZWxzL3Byb2Nlc3Mtd2l0aC1mb3JtLXBheWxvYWQtY2xvdWQubW9kZWwnO1xuaW1wb3J0IHsgU3RhcnRQcm9jZXNzQ2xvdWRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvc3RhcnQtcHJvY2Vzcy1jbG91ZC5zZXJ2aWNlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQcm9jZXNzRGVmaW5pdGlvbkNsb3VkIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3Byb2Nlc3MtZGVmaW5pdGlvbi1jbG91ZC5tb2RlbCc7XG5pbXBvcnQgeyBUYXNrVmFyaWFibGVDbG91ZCB9IGZyb20gJy4uLy4uLy4uL2Zvcm0vbW9kZWxzL3Rhc2stdmFyaWFibGUtY2xvdWQubW9kZWwnO1xuaW1wb3J0IHsgRm9ybUNsb3VkRGlzcGxheU1vZGVDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZm9ybS1maWVsZHMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBnZXRUaW1lIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFRyYW5zbGF0ZVBpcGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXInO1xuaW1wb3J0IHsgTWF0Q2FyZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NhcmQnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0T3B0aW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ2xvdWRDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9mb3JtL2NvbXBvbmVudHMvZm9ybS1jbG91ZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRm9ybUN1c3RvbU91dGNvbWVzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZm9ybS9jb21wb25lbnRzL2Zvcm0tY2xvdWQtY3VzdG9tLW91dGNvbWVzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuXG5jb25zdCBNQVhfTkFNRV9MRU5HVEg6IG51bWJlciA9IDI1NTtcbmNvbnN0IFBST0NFU1NfREVGSU5JVElPTl9ERUJPVU5DRTogbnVtYmVyID0gMzAwO1xuY29uc3QgREFURV9USU1FX0lERU5USUZJRVJfUkVHX0VYUCA9IG5ldyBSZWdFeHAoJyV7ZGF0ZXRpbWV9JywgJ2knKTtcbmNvbnN0IFBST0NFU1NfREVGSU5JVElPTl9JREVOVElGSUVSX1JFR19FWFAgPSBuZXcgUmVnRXhwKCcle3Byb2Nlc3NkZWZpbml0aW9ufScsICdpJyk7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYWRmLWNsb3VkLXN0YXJ0LXByb2Nlc3MnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIFRyYW5zbGF0ZVBpcGUsXG4gICAgICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcbiAgICAgICAgTWF0Q2FyZE1vZHVsZSxcbiAgICAgICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgICAgICBJbnBsYWNlRm9ybUlucHV0Q29tcG9uZW50LFxuICAgICAgICBNYXRJY29uTW9kdWxlLFxuICAgICAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICAgICAgTWF0T3B0aW9uTW9kdWxlLFxuICAgICAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIEZvcm1DbG91ZENvbXBvbmVudCxcbiAgICAgICAgRm9ybUN1c3RvbU91dGNvbWVzQ29tcG9uZW50XG4gICAgXSxcbiAgICBwcm92aWRlcnM6IFtMb2NhbGl6ZWREYXRlUGlwZV0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL3N0YXJ0LXByb2Nlc3MtY2xvdWQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3N0YXJ0LXByb2Nlc3MtY2xvdWQuY29tcG9uZW50LnNjc3MnXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFN0YXJ0UHJvY2Vzc0Nsb3VkQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQge1xuICAgIEBWaWV3Q2hpbGQoTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcilcbiAgICBpbnB1dEF1dG9jb21wbGV0ZTogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcjtcblxuICAgIC8qKiAocmVxdWlyZWQpIE5hbWUgb2YgdGhlIGFwcC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGFwcE5hbWU6IHN0cmluZyA9ICcnO1xuXG4gICAgLyoqIE1heGltdW0gbGVuZ3RoIG9mIHRoZSBwcm9jZXNzIG5hbWUuICovXG4gICAgQElucHV0KClcbiAgICBtYXhOYW1lTGVuZ3RoOiBudW1iZXIgPSBNQVhfTkFNRV9MRU5HVEg7XG5cbiAgICAvKiogTmFtZSBvZiB0aGUgcHJvY2Vzcy4gKi9cbiAgICBASW5wdXQoKVxuICAgIG5hbWU6IHN0cmluZyA9ICcnO1xuXG4gICAgLyoqIE5hbWUgb2YgdGhlIHByb2Nlc3MgZGVmaW5pdGlvbi4gKi9cbiAgICBASW5wdXQoKVxuICAgIHByb2Nlc3NEZWZpbml0aW9uTmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIFZhcmlhYmxlcyB0byBhdHRhY2ggdG8gdGhlIHBheWxvYWQuICovXG4gICAgQElucHV0KClcbiAgICB2YXJpYWJsZXM6IGFueTtcblxuICAgIC8qKiBQYXJhbWV0ZXIgdG8gcGFzcyBmb3JtIGZpZWxkIHZhbHVlcyBpbiB0aGUgc3RhcnQgZm9ybSBpZiBvbmUgaXMgYXNzb2NpYXRlZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHZhbHVlczogVGFza1ZhcmlhYmxlQ2xvdWRbXTtcblxuICAgIC8qKiBTaG93L2hpZGUgdGhlIHByb2Nlc3MgZHJvcGRvd24gbGlzdC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNob3dTZWxlY3RQcm9jZXNzRHJvcGRvd246IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqIFNob3cvaGlkZSB0aXRsZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNob3dUaXRsZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKiogU2hvdy9oaWRlIGNhbmNlbCBidXR0b24uICovXG4gICAgQElucHV0KClcbiAgICBzaG93Q2FuY2VsQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhdmFpbGFibGUgZGlzcGxheSBjb25maWd1cmF0aW9ucyBmb3IgdGhlIGZvcm0uXG4gICAgICogKHN0YXJ0IHByb2Nlc3MgZXZlbnQgY2FuIGhhdmUgYXNzaWduZWQgZm9ybSlcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc3BsYXlNb2RlQ29uZmlndXJhdGlvbnM6IEZvcm1DbG91ZERpc3BsYXlNb2RlQ29uZmlndXJhdGlvbltdO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgcHJvY2VzcyBpcyBzdWNjZXNzZnVsbHkgc3RhcnRlZC4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBzdWNjZXNzID0gbmV3IEV2ZW50RW1pdHRlcjxQcm9jZXNzSW5zdGFuY2VDbG91ZD4oKTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHN0YXJ0aW5nIHByb2Nlc3MgaXMgY2FuY2VsbGVkICovXG4gICAgQE91dHB1dCgpXG4gICAgY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjxQcm9jZXNzSW5zdGFuY2VDbG91ZD4oKTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGVycm9yID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGZvcm0gY29udGVudCBpcyBjbGlja2VkLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGZvcm1Db250ZW50Q2xpY2tlZDogRXZlbnRFbWl0dGVyPENvbnRlbnRMaW5rTW9kZWw+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiBwcm9jZXNzIGRlZmluaXRpb24gc2VsZWN0aW9uIGNoYW5nZXMuICovXG4gICAgQE91dHB1dCgpXG4gICAgcHJvY2Vzc0RlZmluaXRpb25TZWxlY3Rpb246IEV2ZW50RW1pdHRlcjxQcm9jZXNzRGVmaW5pdGlvbkNsb3VkPiA9IG5ldyBFdmVudEVtaXR0ZXI8UHJvY2Vzc0RlZmluaXRpb25DbG91ZD4oKTtcblxuICAgIHByb2Nlc3NEZWZpbml0aW9uTGlzdDogUHJvY2Vzc0RlZmluaXRpb25DbG91ZFtdID0gW107XG4gICAgcHJvY2Vzc0RlZmluaXRpb25DdXJyZW50PzogUHJvY2Vzc0RlZmluaXRpb25DbG91ZDtcbiAgICBlcnJvck1lc3NhZ2VJZDogc3RyaW5nID0gJyc7XG4gICAgcHJvY2Vzc1BheWxvYWRDbG91ZCA9IG5ldyBQcm9jZXNzUGF5bG9hZENsb3VkKCk7XG4gICAgZmlsdGVyZWRQcm9jZXNzZXM6IFByb2Nlc3NEZWZpbml0aW9uQ2xvdWRbXSA9IFtdO1xuICAgIHN0YXRpY01hcHBpbmdzOiBUYXNrVmFyaWFibGVDbG91ZFtdID0gW107XG4gICAgcmVzb2x2ZWRWYWx1ZXM/OiBUYXNrVmFyaWFibGVDbG91ZFtdO1xuICAgIGN1c3RvbU91dGNvbWU6IHN0cmluZztcblxuICAgIGlzUHJvY2Vzc1N0YXJ0aW5nID0gZmFsc2U7XG4gICAgaXNGb3JtQ2xvdWRMb2FkZWQgPSBmYWxzZTtcbiAgICBpc0Zvcm1DbG91ZExvYWRpbmcgPSBmYWxzZTtcbiAgICBwcm9jZXNzRGVmaW5pdGlvbkxvYWRlZCA9IGZhbHNlO1xuXG4gICAgc2hvd1N0YXJ0UHJvY2Vzc0J1dHRvbiQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgc3RhcnRQcm9jZXNzQnV0dG9uTGFiZWw6IHN0cmluZztcbiAgICBjYW5jZWxCdXR0b25MYWJlbDogc3RyaW5nO1xuXG4gICAgZm9ybUNsb3VkPzogRm9ybU1vZGVsO1xuICAgIHByb2Nlc3NGb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgIHByb2Nlc3NJbnN0YW5jZU5hbWU6IG5ldyBGb3JtQ29udHJvbCgnJywgW1xuICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICAgICAgIFZhbGlkYXRvcnMubWF4TGVuZ3RoKHRoaXMuZ2V0TWF4TmFtZUxlbmd0aCgpKSxcbiAgICAgICAgICAgIFZhbGlkYXRvcnMucGF0dGVybignXlteXFxcXHNdKyhcXFxccytbXlxcXFxzXSspKiQnKVxuICAgICAgICBdKSxcbiAgICAgICAgcHJvY2Vzc0RlZmluaXRpb246IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMucHJvY2Vzc0RlZmluaXRpb25OYW1lVmFsaWRhdG9yKCldKVxuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhcnRQcm9jZXNzQ2xvdWRTZXJ2aWNlID0gaW5qZWN0KFN0YXJ0UHJvY2Vzc0Nsb3VkU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2NhbGl6ZWREYXRlUGlwZSA9IGluamVjdChMb2NhbGl6ZWREYXRlUGlwZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkaXNwbGF5U3RhcnRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KG51bGwpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaGFzVmlzaWJsZU91dGNvbWVzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nID0gaW5qZWN0KE1hdERpYWxvZyk7XG5cbiAgICBzaG93U2F2ZUJ1dHRvbiA9IGZhbHNlO1xuICAgIHNob3dDb21wbGV0ZUJ1dHRvbiA9IGZhbHNlO1xuXG4gICAgZ2V0IGlzUHJvY2Vzc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRm9ybSAmJiB0aGlzLmlzRm9ybUNsb3VkTG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuZm9ybUNsb3VkID8gIU9iamVjdC5rZXlzKHRoaXMuZm9ybUNsb3VkLnZhbHVlcykubGVuZ3RoIDogZmFsc2UpIHx8IHRoaXMuZm9ybUNsb3VkPy5pc1ZhbGlkIHx8IHRoaXMuaXNQcm9jZXNzU3RhcnRpbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzRm9ybS52YWxpZCB8fCB0aGlzLmlzUHJvY2Vzc1N0YXJ0aW5nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGRpc2FibGVTdGFydEJ1dHRvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmFwcE5hbWUgfHwgIXRoaXMucHJvY2Vzc0RlZmluaXRpb24udmFsaWQgfHwgdGhpcy5pc1Byb2Nlc3NTdGFydGluZyB8fCB0aGlzLmlzRm9ybUNsb3VkTG9hZGluZztcbiAgICB9XG5cbiAgICBnZXQgaXNQcm9jZXNzRGVmaW5pdGlvbnNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnByb2Nlc3NEZWZpbml0aW9uTGlzdC5sZW5ndGg7XG4gICAgfVxuXG4gICAgZ2V0IHByb2Nlc3NJbnN0YW5jZU5hbWUoKTogRm9ybUNvbnRyb2w8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NGb3JtLmNvbnRyb2xzLnByb2Nlc3NJbnN0YW5jZU5hbWU7XG4gICAgfVxuXG4gICAgZ2V0IHByb2Nlc3NEZWZpbml0aW9uKCk6IEZvcm1Db250cm9sPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzRm9ybS5jb250cm9scy5wcm9jZXNzRGVmaW5pdGlvbjtcbiAgICB9XG5cbiAgICBnZXQgaGFzRm9ybSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5wcm9jZXNzRGVmaW5pdGlvbkN1cnJlbnQ/LmZvcm1LZXk7XG4gICAgfVxuXG4gICAgZ2V0IGRlZmF1bHRTdGFydFByb2Nlc3NCdXR0b25MYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0FERl9DTE9VRF9QUk9DRVNTX0xJU1QuQURGX0NMT1VEX1NUQVJUX1BST0NFU1MuRk9STS5BQ1RJT04uU1RBUlQnKS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIGdldCBkZWZhdWx0Q2FuY2VsUHJvY2Vzc0J1dHRvbkxhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQURGX0NMT1VEX1BST0NFU1NfTElTVC5BREZfQ0xPVURfU1RBUlRfUFJPQ0VTUy5GT1JNLkFDVElPTi5DQU5DRUwnKS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuc3RhcnRQcm9jZXNzQnV0dG9uTGFiZWwgPSB0aGlzLmRlZmF1bHRTdGFydFByb2Nlc3NCdXR0b25MYWJlbDtcbiAgICAgICAgdGhpcy5jYW5jZWxCdXR0b25MYWJlbCA9IHRoaXMuZGVmYXVsdENhbmNlbFByb2Nlc3NCdXR0b25MYWJlbDtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbi5zZXRWYWx1ZSh0aGlzLnByb2Nlc3NEZWZpbml0aW9uTmFtZSk7XG4gICAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb24udmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoUFJPQ0VTU19ERUZJTklUSU9OX0RFQk9VTkNFKSlcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgocHJvY2Vzc0RlZmluaXRpb25OYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RQcm9jZXNzRGVmaW5pdGlvbkJ5UHJvY2Vzc0RlZmluaXRpb25OYW1lKHByb2Nlc3NEZWZpbml0aW9uTmFtZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnNob3dTdGFydFByb2Nlc3NCdXR0b24kID0gY29tYmluZUxhdGVzdChbdGhpcy5kaXNwbGF5U3RhcnRTdWJqZWN0LCB0aGlzLmhhc1Zpc2libGVPdXRjb21lc1N1YmplY3RdKS5waXBlKFxuICAgICAgICAgICAgbWFwKChbZGlzcGxheVN0YXJ0LCBoYXNWaXNpYmxlT3V0Y29tZXNdKSA9PiAoZGlzcGxheVN0YXJ0ICE9PSBudWxsID8gZGlzcGxheVN0YXJ0ID09PSAndHJ1ZScgOiAhaGFzVmlzaWJsZU91dGNvbWVzKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydhcHBOYW1lJ10gJiYgY2hhbmdlc1snYXBwTmFtZSddLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlc1snYXBwTmFtZSddLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwTmFtZSA9IGNoYW5nZXNbJ2FwcE5hbWUnXS5jdXJyZW50VmFsdWU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmFwcE5hbWUgfHwgdGhpcy5hcHBOYW1lID09PSAnJykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZFByb2Nlc3NEZWZpbml0aW9ucygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXNbJ3ZhbHVlcyddICYmIGNoYW5nZXNbJ3ZhbHVlcyddLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlc1sndmFsdWVzJ10ucHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlZFZhbHVlcyA9IHRoaXMuc3RhdGljTWFwcGluZ3MuY29uY2F0KHRoaXMudmFsdWVzIHx8IFtdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICAgIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICBvbkZvcm1Mb2FkZWQoZm9ybTogRm9ybU1vZGVsKSB7XG4gICAgICAgIHRoaXMuaXNGb3JtQ2xvdWRMb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmZvcm1DbG91ZCA9IGZvcm07XG5cbiAgICAgICAgY29uc3QgYW55T3V0Y29tZVZpc2libGUgPSBmb3JtPy5vdXRjb21lcz8uc29tZSgob3V0Y29tZSkgPT5cbiAgICAgICAgICAgIGlzT3V0Y29tZUJ1dHRvblZpc2libGUob3V0Y29tZSwge1xuICAgICAgICAgICAgICAgIGlzRm9ybVJlYWRPbmx5OiBmb3JtLnJlYWRPbmx5LFxuICAgICAgICAgICAgICAgIHNob3dDb21wbGV0ZUJ1dHRvbjogdGhpcy5zaG93Q29tcGxldGVCdXR0b24sXG4gICAgICAgICAgICAgICAgc2hvd1NhdmVCdXR0b246IHRoaXMuc2hvd1NhdmVCdXR0b25cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaGFzVmlzaWJsZU91dGNvbWVzU3ViamVjdC5uZXh0KGFueU91dGNvbWVWaXNpYmxlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE1heE5hbWVMZW5ndGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF4TmFtZUxlbmd0aCA+IE1BWF9OQU1FX0xFTkdUSCA/IE1BWF9OQU1FX0xFTkdUSCA6IHRoaXMubWF4TmFtZUxlbmd0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdFByb2Nlc3NEZWZpbml0aW9uQnlQcm9jZXNzRGVmaW5pdGlvbk5hbWUocHJvY2Vzc0RlZmluaXRpb25OYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWx0ZXJlZFByb2Nlc3NlcyA9IHRoaXMuZ2V0UHJvY2Vzc0RlZmluaXRpb25MaXN0QnlOYW1lT3JLZXkocHJvY2Vzc0RlZmluaXRpb25OYW1lKTtcblxuICAgICAgICBpZiAodGhpcy5pc1Byb2Nlc3NGb3JtVmFsaWQgJiYgdGhpcy5maWx0ZXJlZFByb2Nlc3NlcyAmJiB0aGlzLmZpbHRlcmVkUHJvY2Vzc2VzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5zZXRQcm9jZXNzRGVmaW5pdGlvbk9uRm9ybSh0aGlzLmZpbHRlcmVkUHJvY2Vzc2VzWzBdLm5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0UHJvY2Vzc0RlZmluaXRpb25PbkZvcm0oc2VsZWN0ZWRQcm9jZXNzRGVmaW5pdGlvbk5hbWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLmlzRm9ybUNsb3VkTG9hZGluZyA9IHRydWU7XG4gICAgICAgIGNvbnN0IHByb2Nlc3NEZWZpbml0aW9uQ3VycmVudCA9IHRoaXMuZmlsdGVyZWRQcm9jZXNzZXMuZmluZChcbiAgICAgICAgICAgIChwcm9jZXNzOiBQcm9jZXNzRGVmaW5pdGlvbkNsb3VkKSA9PiBwcm9jZXNzLm5hbWUgPT09IHNlbGVjdGVkUHJvY2Vzc0RlZmluaXRpb25OYW1lIHx8IHByb2Nlc3Mua2V5ID09PSBzZWxlY3RlZFByb2Nlc3NEZWZpbml0aW9uTmFtZVxuICAgICAgICApO1xuXG4gICAgICAgIGZvcmtKb2luKFtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRQcm9jZXNzQ2xvdWRTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLmdldFN0YXJ0RXZlbnRGb3JtU3RhdGljVmFsdWVzTWFwcGluZyh0aGlzLmFwcE5hbWUsIHByb2Nlc3NEZWZpbml0aW9uQ3VycmVudC5pZClcbiAgICAgICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKFtdIGFzIFRhc2tWYXJpYWJsZUNsb3VkW10pKSksXG4gICAgICAgICAgICB0aGlzLnN0YXJ0UHJvY2Vzc0Nsb3VkU2VydmljZVxuICAgICAgICAgICAgICAgIC5nZXRTdGFydEV2ZW50Q29uc3RhbnRzKHRoaXMuYXBwTmFtZSwgcHJvY2Vzc0RlZmluaXRpb25DdXJyZW50LmlkKVxuICAgICAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YoW10gYXMgVGFza1ZhcmlhYmxlQ2xvdWRbXSkpKVxuICAgICAgICBdKS5zdWJzY3JpYmUoKFtzdGF0aWNNYXBwaW5ncywgY29uc3RhbnRzXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdGF0aWNNYXBwaW5ncyA9IHN0YXRpY01hcHBpbmdzO1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlZFZhbHVlcyA9IHRoaXMuc3RhdGljTWFwcGluZ3MuY29uY2F0KHRoaXMudmFsdWVzIHx8IFtdKTtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb25DdXJyZW50ID0gcHJvY2Vzc0RlZmluaXRpb25DdXJyZW50O1xuICAgICAgICAgICAgdGhpcy5pc0Zvcm1DbG91ZExvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgZGlzcGxheVN0YXJ0ID0gY29uc3RhbnRzPy5maW5kKChjb25zdGFudCkgPT4gY29uc3RhbnQubmFtZSA9PT0gJ3N0YXJ0RW5hYmxlZCcpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRMYWJlbCA9IGNvbnN0YW50cz8uZmluZCgoY29uc3RhbnQpID0+IGNvbnN0YW50Lm5hbWUgPT09ICdzdGFydExhYmVsJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlDYW5jZWwgPSBjb25zdGFudHM/LmZpbmQoKGNvbnN0YW50KSA9PiBjb25zdGFudC5uYW1lID09PSAnY2FuY2VsRW5hYmxlZCcpO1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsTGFiZWwgPSBjb25zdGFudHM/LmZpbmQoKGNvbnN0YW50KSA9PiBjb25zdGFudC5uYW1lID09PSAnY2FuY2VsTGFiZWwnKTtcblxuICAgICAgICAgICAgaWYgKGRpc3BsYXlTdGFydCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheVN0YXJ0U3ViamVjdC5uZXh0KGRpc3BsYXlTdGFydD8udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXJ0TGFiZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0UHJvY2Vzc0J1dHRvbkxhYmVsID0gc3RhcnRMYWJlbD8udmFsdWU/LnRyaW0oKT8ubGVuZ3RoID4gMCA/IHN0YXJ0TGFiZWwudmFsdWUudHJpbSgpIDogdGhpcy5kZWZhdWx0U3RhcnRQcm9jZXNzQnV0dG9uTGFiZWw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkaXNwbGF5Q2FuY2VsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2FuY2VsQnV0dG9uID0gZGlzcGxheUNhbmNlbD8udmFsdWUgPT09ICd0cnVlJyAmJiB0aGlzLnNob3dDYW5jZWxCdXR0b247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2FuY2VsTGFiZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbEJ1dHRvbkxhYmVsID0gY2FuY2VsTGFiZWw/LnZhbHVlPy50cmltKCk/Lmxlbmd0aCA+IDAgPyBjYW5jZWxMYWJlbC52YWx1ZS50cmltKCkgOiB0aGlzLmRlZmF1bHRDYW5jZWxQcm9jZXNzQnV0dG9uTGFiZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaXNGb3JtQ2xvdWRMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wcm9jZXNzUGF5bG9hZENsb3VkLnByb2Nlc3NEZWZpbml0aW9uS2V5ID0gcHJvY2Vzc0RlZmluaXRpb25DdXJyZW50LmtleTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFByb2Nlc3NEZWZpbml0aW9uTGlzdEJ5TmFtZU9yS2V5KHByb2Nlc3NEZWZpbml0aW9uTmFtZTogc3RyaW5nKTogUHJvY2Vzc0RlZmluaXRpb25DbG91ZFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0RlZmluaXRpb25MaXN0LmZpbHRlcihcbiAgICAgICAgICAgIChwcm9jZXNzRGVmaW5pdGlvbkNsb3VkKSA9PiAhcHJvY2Vzc0RlZmluaXRpb25OYW1lIHx8IHRoaXMuZ2V0UHJvY2Vzc0RlZmluaXRpb24ocHJvY2Vzc0RlZmluaXRpb25DbG91ZCwgcHJvY2Vzc0RlZmluaXRpb25OYW1lKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJvY2Vzc0lmRXhpc3RzKHByb2Nlc3NEZWZpbml0aW9uOiBzdHJpbmcpOiBQcm9jZXNzRGVmaW5pdGlvbkNsb3VkIHtcbiAgICAgICAgbGV0IG1hdGNoZWRQcm9jZXNzID0gdGhpcy5wcm9jZXNzRGVmaW5pdGlvbkxpc3QuZmluZCgob3B0aW9uKSA9PiB0aGlzLmdldFByb2Nlc3NEZWZpbml0aW9uKG9wdGlvbiwgcHJvY2Vzc0RlZmluaXRpb24pKTtcbiAgICAgICAgaWYgKCFtYXRjaGVkUHJvY2Vzcykge1xuICAgICAgICAgICAgbWF0Y2hlZFByb2Nlc3MgPSBuZXcgUHJvY2Vzc0RlZmluaXRpb25DbG91ZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hdGNoZWRQcm9jZXNzO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJvY2Vzc0RlZmluaXRpb25CeU5hbWUocHJvY2Vzc0RlZmluaXRpb25OYW1lOiBzdHJpbmcpOiBQcm9jZXNzRGVmaW5pdGlvbkNsb3VkIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlZFByb2Nlc3MgPSBwcm9jZXNzRGVmaW5pdGlvbk5hbWUgPyB0aGlzLmdldFByb2Nlc3NJZkV4aXN0cyhwcm9jZXNzRGVmaW5pdGlvbk5hbWUpIDogdGhpcy5wcm9jZXNzRGVmaW5pdGlvbkxpc3RbMF07XG4gICAgICAgIHJldHVybiBtYXRjaGVkUHJvY2VzcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdERlZmF1bHRQcm9jZXNzRGVmaW5pdGlvbigpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRQcm9jZXNzID0gdGhpcy5nZXRQcm9jZXNzRGVmaW5pdGlvbkJ5TmFtZSh0aGlzLnByb2Nlc3NEZWZpbml0aW9uTmFtZSk7XG4gICAgICAgIGlmIChzZWxlY3RlZFByb2Nlc3MpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb24uc2V0VmFsdWUoc2VsZWN0ZWRQcm9jZXNzLm5hbWUpO1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvblNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0ZWRQcm9jZXNzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkUHJvY2Vzc0RlZmluaXRpb25zKCkge1xuICAgICAgICB0aGlzLnJlc2V0RXJyb3JNZXNzYWdlKCk7XG5cbiAgICAgICAgdGhpcy5zdGFydFByb2Nlc3NDbG91ZFNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRQcm9jZXNzRGVmaW5pdGlvbnModGhpcy5hcHBOYW1lKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgIChwcm9jZXNzRGVmaW5pdGlvblJlcHJlc2VudGF0aW9uczogUHJvY2Vzc0RlZmluaXRpb25DbG91ZFtdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb25MaXN0ID0gcHJvY2Vzc0RlZmluaXRpb25SZXByZXNlbnRhdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzRGVmaW5pdGlvblJlcHJlc2VudGF0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0RGVmYXVsdFByb2Nlc3NEZWZpbml0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcm9jZXNzRGVmaW5pdGlvbk5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb24uc2V0VmFsdWUodGhpcy5wcm9jZXNzRGVmaW5pdGlvbk5hbWUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzRGVmaW5pdGlvbiA9IHRoaXMucHJvY2Vzc0RlZmluaXRpb25MaXN0LmZpbmQoKHByb2Nlc3MpID0+IHByb2Nlc3MubmFtZSA9PT0gdGhpcy5wcm9jZXNzRGVmaW5pdGlvbk5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NEZWZpbml0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFByb2Nlc3NlcyA9IHRoaXMuZ2V0UHJvY2Vzc0RlZmluaXRpb25MaXN0QnlOYW1lT3JLZXkocHJvY2Vzc0RlZmluaXRpb24ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRQcm9jZXNzRGVmaW5pdGlvbk9uRm9ybShwcm9jZXNzRGVmaW5pdGlvbi5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uU2VsZWN0aW9uQ2hhbmdlZChwcm9jZXNzRGVmaW5pdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VJZCA9ICdBREZfQ0xPVURfUFJPQ0VTU19MSVNULkFERl9DTE9VRF9TVEFSVF9QUk9DRVNTLkVSUk9SLkxPQURfUFJPQ0VTU19ERUZTJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNWYWxpZE5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIW5hbWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQcm9jZXNzRGVmaW5pdGlvbihwcm9jZXNzRGVmaW5pdGlvbkNsb3VkOiBQcm9jZXNzRGVmaW5pdGlvbkNsb3VkLCBwcm9jZXNzRGVmaW5pdGlvbk5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHRoaXMuaXNWYWxpZE5hbWUocHJvY2Vzc0RlZmluaXRpb25DbG91ZC5uYW1lKSAmJlxuICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZpbml0aW9uQ2xvdWQubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHByb2Nlc3NEZWZpbml0aW9uTmFtZS50b0xvd2VyQ2FzZSgpKSkgfHxcbiAgICAgICAgICAgIHByb2Nlc3NEZWZpbml0aW9uQ2xvdWQua2V5Py50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHByb2Nlc3NEZWZpbml0aW9uTmFtZS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGJ1aWxkUHJvY2Vzc0Nsb3VkUGF5bG9hZCgpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzUGF5bG9hZENsb3VkLm5hbWUgPSB0aGlzLnByb2Nlc3NJbnN0YW5jZU5hbWUudmFsdWU7XG4gICAgICAgIGlmICh0aGlzLnZhcmlhYmxlcykge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUGF5bG9hZENsb3VkLnZhcmlhYmxlcyA9IHRoaXMudmFyaWFibGVzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRm9ybSkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUGF5bG9hZENsb3VkLnZhcmlhYmxlcyA9IE9iamVjdC5hc3NpZ24odGhpcy5wcm9jZXNzUGF5bG9hZENsb3VkLnZhcmlhYmxlcywgdGhpcy5mb3JtQ2xvdWQudmFsdWVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQ3VzdG9tT3V0Y29tZUNsaWNrZWQob3V0Y29tZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tT3V0Y29tZSA9IG91dGNvbWU7XG4gICAgICAgIHRoaXMuc3RhcnRQcm9jZXNzKCk7XG4gICAgfVxuXG4gICAgc3RhcnRQcm9jZXNzV2l0aG91dENvbmZpcm1hdGlvbigpIHtcbiAgICAgICAgdGhpcy5pc1Byb2Nlc3NTdGFydGluZyA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5oYXNGb3JtXG4gICAgICAgICAgICA/IHRoaXMuc3RhcnRQcm9jZXNzQ2xvdWRTZXJ2aWNlLnN0YXJ0UHJvY2Vzc1dpdGhGb3JtKFxuICAgICAgICAgICAgICAgICAgdGhpcy5hcHBOYW1lLFxuICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbkN1cnJlbnQuZm9ybUtleSxcbiAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb25DdXJyZW50LnZlcnNpb24sXG4gICAgICAgICAgICAgICAgICBuZXcgUHJvY2Vzc1dpdGhGb3JtUGF5bG9hZENsb3VkKHtcbiAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTmFtZTogdGhpcy5wcm9jZXNzSW5zdGFuY2VOYW1lLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZpbml0aW9uS2V5OiB0aGlzLnByb2Nlc3NQYXlsb2FkQ2xvdWQucHJvY2Vzc0RlZmluaXRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzOiB0aGlzLnZhcmlhYmxlcyA/PyB7fSxcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IHRoaXMuZm9ybUNsb3VkLnZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgICBvdXRjb21lOiB0aGlzLmN1c3RvbU91dGNvbWVcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogdGhpcy5zdGFydFByb2Nlc3NDbG91ZFNlcnZpY2Uuc3RhcnRQcm9jZXNzKFxuICAgICAgICAgICAgICAgICAgdGhpcy5hcHBOYW1lLFxuICAgICAgICAgICAgICAgICAgbmV3IFByb2Nlc3NQYXlsb2FkQ2xvdWQoe1xuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMucHJvY2Vzc0luc3RhbmNlTmFtZS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRGVmaW5pdGlvbktleTogdGhpcy5wcm9jZXNzUGF5bG9hZENsb3VkLnByb2Nlc3NEZWZpbml0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlczogdGhpcy52YXJpYWJsZXMgPz8ge31cbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgYWN0aW9uLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWNjZXNzLmVtaXQocmVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzUHJvY2Vzc1N0YXJ0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZUlkID0gJ0FERl9DTE9VRF9QUk9DRVNTX0xJU1QuQURGX0NMT1VEX1NUQVJUX1BST0NFU1MuRVJST1IuU1RBUlQnO1xuICAgICAgICAgICAgICAgIHRoaXMudW5pZnlFcnJvclJlc3BvbnNlKGVycik7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvci5lbWl0KGVycik7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1Byb2Nlc3NTdGFydGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGFydFByb2Nlc3MoKSB7XG4gICAgICAgIGlmICghdGhpcy5mb3JtQ2xvdWQ/LmNvbmZpcm1NZXNzYWdlPy5zaG93KSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0UHJvY2Vzc1dpdGhvdXRDb25maXJtYXRpb24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5mb3JtQ2xvdWQuY29uZmlybU1lc3NhZ2UubWVzc2FnZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbWluV2lkdGg6ICc0NTBweCdcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFByb2Nlc3NXaXRob3V0Q29uZmlybWF0aW9uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVuaWZ5RXJyb3JSZXNwb25zZShlcnI6IGFueSkge1xuICAgICAgICBpZiAoIWVycj8ucmVzcG9uc2U/LmJvZHk/LmVudHJ5ICYmIGVycj8ucmVzcG9uc2U/LmJvZHk/Lm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGVyci5yZXNwb25zZS5ib2R5ID0ge1xuICAgICAgICAgICAgICAgIGVudHJ5OiBKU09OLnBhcnNlKGVyci5yZXNwb25zZS5ib2R5Lm1lc3NhZ2UpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2FuY2VsU3RhcnRQcm9jZXNzKCkge1xuICAgICAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldEVycm9yTWVzc2FnZSgpIHtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VJZCA9ICcnO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZXRQcm9jZXNzRGVmaW5pdGlvbkxpc3QoKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb24uc2V0VmFsdWUoJycpO1xuICAgICAgICB0aGlzLmZpbHRlcmVkUHJvY2Vzc2VzID0gdGhpcy5wcm9jZXNzRGVmaW5pdGlvbkxpc3Q7XG4gICAgfVxuXG4gICAgZGlzcGxheVByb2Nlc3NOYW1lT25Ecm9wZG93bihwcm9jZXNzOiBhbnkpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MpIHtcbiAgICAgICAgICAgIGxldCBwcm9jZXNzTmFtZSA9IHByb2Nlc3M7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc05hbWUgPSBwcm9jZXNzLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc05hbWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNwbGF5RHJvcGRvd24oZXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmICghdGhpcy5pbnB1dEF1dG9jb21wbGV0ZS5wYW5lbE9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRQcm9jZXNzRGVmaW5pdGlvbkxpc3QoKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRBdXRvY29tcGxldGUub3BlblBhbmVsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0QXV0b2NvbXBsZXRlLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb2Nlc3NEZWZpbml0aW9uTmFtZVZhbGlkYXRvcigpOiBWYWxpZGF0b3JGbiB7XG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJvY2Vzc0RlZmluaXRpb25GaWVsZFZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCBwcm9jZXNzRGVmaW5pdGlvbk5hbWVFcnJvciA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAocHJvY2Vzc0RlZmluaXRpb25GaWVsZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc0RlZmluaXRpb24gPSB0aGlzLmdldFByb2Nlc3NJZkV4aXN0cyhwcm9jZXNzRGVmaW5pdGlvbkZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc0RlZmluaXRpb24ua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZpbml0aW9uTmFtZUVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBwcm9jZXNzRGVmaW5pdGlvbk5hbWVFcnJvciA/IHsgJ2ludmFsaWQgbmFtZSc6IHRydWUgfSA6IG51bGw7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0UHJvY2Vzc0RlZmluaXRpb25WYWx1ZShwcm9jZXNzOiBQcm9jZXNzRGVmaW5pdGlvbkNsb3VkKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MubmFtZSA/IHByb2Nlc3MubmFtZSA6IHByb2Nlc3Mua2V5O1xuICAgIH1cblxuICAgIG9uRm9ybUNvbnRlbnRDbGlja2VkKGNvbnRlbnQ6IENvbnRlbnRMaW5rTW9kZWwpIHtcbiAgICAgICAgdGhpcy5mb3JtQ29udGVudENsaWNrZWQuZW1pdChjb250ZW50KTtcbiAgICB9XG5cbiAgICBwcm9jZXNzRGVmaW5pdGlvblNlbGVjdGlvbkNoYW5nZWQocHJvY2Vzc0RlZmluaXRpb246IFByb2Nlc3NEZWZpbml0aW9uQ2xvdWQpIHtcbiAgICAgICAgaWYgKHByb2Nlc3NEZWZpbml0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNldERlZmF1bHRQcm9jZXNzTmFtZShwcm9jZXNzRGVmaW5pdGlvbi5uYW1lKTtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb25TZWxlY3Rpb24uZW1pdChwcm9jZXNzRGVmaW5pdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXREZWZhdWx0UHJvY2Vzc05hbWUocHJvY2Vzc0RlZmluaXRpb25OYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcHJvY2Vzc0luc3RhbmNlRGV0YWlsczogUHJvY2Vzc0luc3RhbmNlQ2xvdWQgPSB7IHByb2Nlc3NEZWZpbml0aW9uTmFtZSB9O1xuICAgICAgICBjb25zdCBkZWZhdWx0UHJvY2Vzc05hbWUgPSB0aGlzLmdldERlZmF1bHRQcm9jZXNzTmFtZSh0aGlzLm5hbWUsIHByb2Nlc3NJbnN0YW5jZURldGFpbHMpO1xuICAgICAgICB0aGlzLnByb2Nlc3NJbnN0YW5jZU5hbWUuc2V0VmFsdWUoZGVmYXVsdFByb2Nlc3NOYW1lKTtcbiAgICAgICAgdGhpcy5wcm9jZXNzSW5zdGFuY2VOYW1lLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMucHJvY2Vzc0luc3RhbmNlTmFtZS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgfVxuXG4gICAgZ2V0RGVmYXVsdFByb2Nlc3NOYW1lKHByb2Nlc3NOYW1lRm9ybWF0OiBzdHJpbmcsIHByb2Nlc3NJbnN0YW5jZT86IFByb2Nlc3NJbnN0YW5jZUNsb3VkKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHByb2Nlc3NOYW1lID0gcHJvY2Vzc05hbWVGb3JtYXQ7XG4gICAgICAgIGlmIChwcm9jZXNzTmFtZS5tYXRjaChEQVRFX1RJTUVfSURFTlRJRklFUl9SRUdfRVhQKSkge1xuICAgICAgICAgICAgY29uc3QgcHJlc2VudERhdGVUaW1lID0gZ2V0VGltZShuZXcgRGF0ZSgpKTtcbiAgICAgICAgICAgIHByb2Nlc3NOYW1lID0gcHJvY2Vzc05hbWUucmVwbGFjZShEQVRFX1RJTUVfSURFTlRJRklFUl9SRUdfRVhQLCB0aGlzLmxvY2FsaXplZERhdGVQaXBlLnRyYW5zZm9ybShwcmVzZW50RGF0ZVRpbWUsICdtZWRpdW0nKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvY2Vzc05hbWUubWF0Y2goUFJPQ0VTU19ERUZJTklUSU9OX0lERU5USUZJRVJfUkVHX0VYUCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkUHJvY2Vzc0RlZmluaXRpb25OYW1lID0gcHJvY2Vzc0luc3RhbmNlID8gcHJvY2Vzc0luc3RhbmNlLnByb2Nlc3NEZWZpbml0aW9uTmFtZSA6ICcnO1xuICAgICAgICAgICAgcHJvY2Vzc05hbWUgPSBwcm9jZXNzTmFtZS5yZXBsYWNlKFBST0NFU1NfREVGSU5JVElPTl9JREVOVElGSUVSX1JFR19FWFAsIHNlbGVjdGVkUHJvY2Vzc0RlZmluaXRpb25OYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvY2Vzc05hbWU7XG4gICAgfVxufVxuIiwiPG1hdC1jYXJkIGFwcGVhcmFuY2U9XCJvdXRsaW5lZFwiIGNsYXNzPVwiYWRmLXN0YXJ0LXByb2Nlc3NcIiAqbmdJZj1cInByb2Nlc3NEZWZpbml0aW9uTG9hZGVkOyBlbHNlIHNwaW5uZXJcIj5cblxuICAgIDxtYXQtY2FyZC1jb250ZW50PlxuICAgICAgICA8bWF0LWNhcmQtdGl0bGVcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd1RpdGxlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYWRmLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAge3snQURGX0NMT1VEX1BST0NFU1NfTElTVC5BREZfQ0xPVURfU1RBUlRfUFJPQ0VTUy5GT1JNLlRJVExFJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgIDwvbWF0LWNhcmQtdGl0bGU+XG5cbiAgICAgICAgPG1hdC1jYXJkLXN1YnRpdGxlIGlkPVwiZXJyb3ItbWVzc2FnZVwiICpuZ0lmPVwiZXJyb3JNZXNzYWdlSWRcIj5cbiAgICAgICAgICAgIHt7IGVycm9yTWVzc2FnZUlkIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvbWF0LWNhcmQtc3VidGl0bGU+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFpc1Byb2Nlc3NEZWZpbml0aW9uc0VtcHR5OyBlbHNlIGVtcHR5UHJvY2Vzc0RlZmluaXRpb25zTGlzdFwiPlxuICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJwcm9jZXNzRm9ybVwiIGNsYXNzPVwiYWRmLXNlbGVjdC1wcm9jZXNzLWZvcm1cIj5cbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhZGYtcHJvY2Vzcy1pbnB1dC1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICBmbG9hdExhYmVsPVwiYWx3YXlzXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93U2VsZWN0UHJvY2Vzc0Ryb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1hdXRvbWF0aW9uLWlkPVwiYWRmLXNlbGVjdC1jbG91ZC1wcm9jZXNzLWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiYWRmLXN0YXJ0LXByb2Nlc3MtaW5wdXQtbGFiZWxcIj57eyAnQURGX0NMT1VEX1BST0NFU1NfTElTVC5BREZfQ0xPVURfU1RBUlRfUFJPQ0VTUy5GT1JNLkxBQkVMLlRZUEUnIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInByb2Nlc3NEZWZpbml0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwicHJvY2Vzc0RlZmluaXRpb25OYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZi1wcm9jZXNzLWlucHV0LWF1dG9jb21wbGV0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJwcm9jZXNzRGVmaW5pdGlvbk9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheVdpdGhdPVwiZGlzcGxheVByb2Nlc3NOYW1lT25Ecm9wZG93blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJzZXRQcm9jZXNzRGVmaW5pdGlvbk9uRm9ybSgkZXZlbnQub3B0aW9uLnZhbHVlKVwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHByb2Nlc3NEZWYgb2YgZmlsdGVyZWRQcm9jZXNzZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRQcm9jZXNzRGVmaW5pdGlvblZhbHVlKHByb2Nlc3NEZWYpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicHJvY2Vzc0RlZmluaXRpb25TZWxlY3Rpb25DaGFuZ2VkKHByb2Nlc3NEZWYpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldFByb2Nlc3NEZWZpbml0aW9uVmFsdWUocHJvY2Vzc0RlZikgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiYWRmLXNlbGVjdC1wcm9jZXNzLWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eydBREZfQ0xPVURfUFJPQ0VTU19MSVNULkFERl9DTE9VRF9TVEFSVF9QUk9DRVNTLkZPUk0uU0VMRUNUX1BST0NFU1NfRFJPUERPV04nIHwgdHJhbnNsYXRlfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRpc3BsYXlEcm9wZG93bigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+YXJyb3dfZHJvcF9kb3duPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwcm9jZXNzRGVmaW5pdGlvbi5oYXNFcnJvcigncmVxdWlyZWQnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhZGYtZXJyb3ItcGJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0FERl9DTE9VRF9QUk9DRVNTX0xJU1QuQURGX0NMT1VEX1NUQVJUX1BST0NFU1MuRVJST1IuUFJPQ0VTU19ERUZJTklUSU9OX1JFUVVJUkVEJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICAgIDxhZGYtaW5wbGFjZS1mb3JtLWlucHV0IFtjb250cm9sXT1cInByb2Nlc3NJbnN0YW5jZU5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBsYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J0FERl9DTE9VRF9QUk9DRVNTX0xJU1QuQURGX0NMT1VEX1NUQVJUX1BST0NFU1MuRk9STS5MQUJFTC5OQU1FJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInByb2Nlc3NJbnN0YW5jZU5hbWUuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnQURGX0NMT1VEX1BST0NFU1NfTElTVC5BREZfQ0xPVURfU1RBUlRfUFJPQ0VTUy5FUlJPUi5QUk9DRVNTX05BTUVfUkVRVUlSRUQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInByb2Nlc3NJbnN0YW5jZU5hbWUuaGFzRXJyb3IoJ21heGxlbmd0aCcpXCIgaWQ9XCJhZGYtc3RhcnQtcHJvY2Vzcy1tYXhsZW5ndGgtZXJyb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnQURGX0NMT1VEX1BST0NFU1NfTElTVC5BREZfQ0xPVURfU1RBUlRfUFJPQ0VTUy5FUlJPUi5NQVhJTVVNX0xFTkdUSCcgfCB0cmFuc2xhdGUgOiB7IGNoYXJhY3RlcnMgOiBtYXhOYW1lTGVuZ3RoIH0gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvY2Vzc0luc3RhbmNlTmFtZS5oYXNFcnJvcigncGF0dGVybicpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0FERl9DTE9VRF9QUk9DRVNTX0xJU1QuQURGX0NMT1VEX1NUQVJUX1BST0NFU1MuRVJST1IuU1BBQ0VfVkFMSURBVE9SJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2FkZi1pbnBsYWNlLWZvcm0taW5wdXQ+XG4gICAgICAgICAgICA8L2Zvcm0+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNGb3JtIGVsc2UgdGFza0Zvcm1DbG91ZEJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICA8YWRmLWNsb3VkLWZvcm1cbiAgICAgICAgICAgICAgICAgICAgI3N0YXJ0Rm9ybVxuICAgICAgICAgICAgICAgICAgICBbYXBwTmFtZV09XCJhcHBOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW2FwcFZlcnNpb25dPVwicHJvY2Vzc0RlZmluaXRpb25DdXJyZW50LmFwcFZlcnNpb25cIlxuICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJyZXNvbHZlZFZhbHVlc1wiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtSWRdPVwicHJvY2Vzc0RlZmluaXRpb25DdXJyZW50LmZvcm1LZXlcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzcGxheU1vZGVDb25maWd1cmF0aW9uc109XCJkaXNwbGF5TW9kZUNvbmZpZ3VyYXRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dTYXZlQnV0dG9uXT1cInNob3dTYXZlQnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dDb21wbGV0ZUJ1dHRvbl09XCJzaG93Q29tcGxldGVCdXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd1JlZnJlc2hCdXR0b25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd1ZhbGlkYXRpb25JY29uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dUaXRsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIChmb3JtQ29udGVudENsaWNrZWQpPVwib25Gb3JtQ29udGVudENsaWNrZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChmb3JtTG9hZGVkKT1cIm9uRm9ybUxvYWRlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGV4ZWN1dGVPdXRjb21lKT1cIm9uQ3VzdG9tT3V0Y29tZUNsaWNrZWQoJGV2ZW50Lm91dGNvbWUubmFtZSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhZGYtY2xvdWQtZm9ybS1jdXN0b20tb3V0Y29tZXM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRhc2tGb3JtQ2xvdWRCdXR0b25zXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYWRmLWNsb3VkLWZvcm0tY3VzdG9tLW91dGNvbWVzPlxuICAgICAgICAgICAgICAgIDwvYWRmLWNsb3VkLWZvcm0+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG5cbjwvbWF0LWNhcmQ+XG5cbjxuZy10ZW1wbGF0ZSAjdGFza0Zvcm1DbG91ZEJ1dHRvbnM+XG4gICAgPGRpdiBjbGFzcz1cImFkZi1zdGFydC1wcm9jZXNzLWNsb3VkLWFjdGlvbnNcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJzaG93Q2FuY2VsQnV0dG9uXCJcbiAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWxTdGFydFByb2Nlc3MoKVwiXG4gICAgICAgICAgICBpZD1cImNhbmNlbF9wcm9jZXNzXCJcbiAgICAgICAgPlxuICAgICAgICAgICAge3sgY2FuY2VsQnV0dG9uTGFiZWwgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwic2hvd1N0YXJ0UHJvY2Vzc0J1dHRvbiQgfCBhc3luY1wiXG4gICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlU3RhcnRCdXR0b24gfHwgIWlzUHJvY2Vzc0Zvcm1WYWxpZFwiXG4gICAgICAgICAgICAoY2xpY2spPVwic3RhcnRQcm9jZXNzKClcIlxuICAgICAgICAgICAgZGF0YS1hdXRvbWF0aW9uLWlkPVwiYnRuLXN0YXJ0XCJcbiAgICAgICAgICAgIGlkPVwiYnV0dG9uLXN0YXJ0XCJcbiAgICAgICAgICAgIGNsYXNzPVwiYWRmLWJ0bi1zdGFydFwiXG4gICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBzdGFydFByb2Nlc3NCdXR0b25MYWJlbCB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZW1wdHlQcm9jZXNzRGVmaW5pdGlvbnNMaXN0PlxuICAgIDxtYXQtY2FyZC1jb250ZW50ICpuZ0lmPVwicHJvY2Vzc0RlZmluaXRpb25Mb2FkZWRcIj5cbiAgICAgICAgPG1hdC1jYXJkLXN1YnRpdGxlIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiIGlkPVwibm8tcHJvY2Vzcy1tZXNzYWdlXCI+XG4gICAgICAgICAgICB7eyAnQURGX0NMT1VEX1BST0NFU1NfTElTVC5BREZfQ0xPVURfU1RBUlRfUFJPQ0VTUy5OT19QUk9DRVNTX0RFRklOSVRJT05TJyB8IHRyYW5zbGF0ZSB8IHVwcGVyY2FzZX19XG4gICAgICAgIDwvbWF0LWNhcmQtc3VidGl0bGU+XG4gICAgPC9tYXQtY2FyZC1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzcGlubmVyPlxuICAgIDxkaXYgY2xhc3M9XCJhZGYtbG9hZGluZy1jb250YWluZXJcIj5cbiAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyXG4gICAgICAgICAgICBjbGFzcz1cImFkZi1sb2FkaW5nXCJcbiAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiIC8+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19