@pega/angular-sdk-components 0.24.1 → 0.24.3

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 (172) hide show
  1. package/esm2022/lib/_bridge/angular-pconnect.mjs +5 -5
  2. package/esm2022/lib/_bridge/component-mapper/component-mapper.component.mjs +4 -4
  3. package/esm2022/lib/_bridge/helpers/sdk_component_map.mjs +1 -1
  4. package/esm2022/lib/_components/designSystemExtension/alert/alert.component.mjs +4 -4
  5. package/esm2022/lib/_components/designSystemExtension/alert-banner/alert-banner.component.mjs +4 -4
  6. package/esm2022/lib/_components/designSystemExtension/banner/banner.component.mjs +4 -4
  7. package/esm2022/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.mjs +5 -5
  8. package/esm2022/lib/_components/designSystemExtension/field-group/field-group.component.mjs +3 -3
  9. package/esm2022/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.mjs +5 -5
  10. package/esm2022/lib/_components/designSystemExtension/material-details/material-details.component.mjs +5 -5
  11. package/esm2022/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.mjs +5 -5
  12. package/esm2022/lib/_components/designSystemExtension/material-summary-item/material-summary-item.component.mjs +5 -5
  13. package/esm2022/lib/_components/designSystemExtension/material-summary-list/material-summary-list.component.mjs +4 -4
  14. package/esm2022/lib/_components/designSystemExtension/material-utility/material-utility.component.mjs +5 -5
  15. package/esm2022/lib/_components/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.mjs +5 -5
  16. package/esm2022/lib/_components/designSystemExtension/operator/operator.component.mjs +5 -5
  17. package/esm2022/lib/_components/designSystemExtension/pulse/pulse.component.mjs +4 -4
  18. package/esm2022/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.mjs +4 -4
  19. package/esm2022/lib/_components/designSystemExtension/wss-quick-create/wss-quick-create.component.mjs +3 -3
  20. package/esm2022/lib/_components/field/auto-complete/auto-complete.component.mjs +5 -5
  21. package/esm2022/lib/_components/field/cancel-alert/cancel-alert.component.mjs +5 -7
  22. package/esm2022/lib/_components/field/check-box/check-box.component.mjs +5 -5
  23. package/esm2022/lib/_components/field/currency/currency.component.mjs +32 -17
  24. package/esm2022/lib/_components/field/date/date.component.mjs +6 -6
  25. package/esm2022/lib/_components/field/date-time/date-time.component.mjs +14 -43
  26. package/esm2022/lib/_components/field/decimal/decimal.component.mjs +37 -10
  27. package/esm2022/lib/_components/field/dropdown/dropdown.component.mjs +7 -12
  28. package/esm2022/lib/_components/field/email/email.component.mjs +5 -5
  29. package/esm2022/lib/_components/field/group/group.component.mjs +5 -5
  30. package/esm2022/lib/_components/field/integer/integer.component.mjs +5 -5
  31. package/esm2022/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.mjs +3 -3
  32. package/esm2022/lib/_components/field/multiselect/multiselect.component.mjs +5 -5
  33. package/esm2022/lib/_components/field/multiselect/utils.mjs +2 -2
  34. package/esm2022/lib/_components/field/percentage/percentage.component.mjs +25 -8
  35. package/esm2022/lib/_components/field/phone/phone.component.mjs +5 -5
  36. package/esm2022/lib/_components/field/radio-buttons/radio-buttons.component.mjs +7 -12
  37. package/esm2022/lib/_components/field/rich-text/rich-text.component.mjs +5 -5
  38. package/esm2022/lib/_components/field/scalar-list/scalar-list.component.mjs +7 -6
  39. package/esm2022/lib/_components/field/semantic-link/semantic-link.component.mjs +5 -5
  40. package/esm2022/lib/_components/field/text/text.component.mjs +5 -5
  41. package/esm2022/lib/_components/field/text-area/text-area.component.mjs +5 -7
  42. package/esm2022/lib/_components/field/text-content/text-content.component.mjs +5 -5
  43. package/esm2022/lib/_components/field/text-input/text-input.component.mjs +5 -5
  44. package/esm2022/lib/_components/field/time/time.component.mjs +5 -5
  45. package/esm2022/lib/_components/field/url/url.component.mjs +5 -5
  46. package/esm2022/lib/_components/field/user-reference/user-reference.component.mjs +38 -26
  47. package/esm2022/lib/_components/infra/Containers/flow-container/flow-container.component.mjs +19 -24
  48. package/esm2022/lib/_components/infra/Containers/flow-container/helpers.mjs +1 -1
  49. package/esm2022/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.mjs +3 -3
  50. package/esm2022/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.mjs +5 -6
  51. package/esm2022/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.mjs +3 -3
  52. package/esm2022/lib/_components/infra/Containers/view-container/view-container.component.mjs +9 -10
  53. package/esm2022/lib/_components/infra/action-buttons/action-buttons.component.mjs +3 -3
  54. package/esm2022/lib/_components/infra/assignment/assignment.component.mjs +29 -14
  55. package/esm2022/lib/_components/infra/assignment-card/assignment-card.component.mjs +4 -4
  56. package/esm2022/lib/_components/infra/dashboard-filter/dashboard-filter.component.mjs +5 -6
  57. package/esm2022/lib/_components/infra/defer-load/defer-load.component.mjs +10 -13
  58. package/esm2022/lib/_components/infra/error-boundary/error-boundary.component.mjs +3 -3
  59. package/esm2022/lib/_components/infra/multi-step/multi-step.component.mjs +6 -6
  60. package/esm2022/lib/_components/infra/navbar/navbar.component.mjs +9 -8
  61. package/esm2022/lib/_components/infra/reference/reference.component.mjs +5 -5
  62. package/esm2022/lib/_components/infra/region/region.component.mjs +4 -4
  63. package/esm2022/lib/_components/infra/root-container/root-container.component.mjs +5 -5
  64. package/esm2022/lib/_components/infra/stages/stages.component.mjs +5 -5
  65. package/esm2022/lib/_components/infra/view/view.component.mjs +5 -5
  66. package/esm2022/lib/_components/template/app-shell/app-shell.component.mjs +5 -5
  67. package/esm2022/lib/_components/template/banner-page/banner-page.component.mjs +5 -5
  68. package/esm2022/lib/_components/template/case-summary/case-summary.component.mjs +6 -6
  69. package/esm2022/lib/_components/template/case-view/case-view.component.mjs +6 -12
  70. package/esm2022/lib/_components/template/confirmation/confirmation.component.mjs +5 -5
  71. package/esm2022/lib/_components/template/data-reference/data-reference.component.mjs +6 -8
  72. package/esm2022/lib/_components/template/default-form/default-form.component.mjs +5 -5
  73. package/esm2022/lib/_components/template/details/details.component.mjs +5 -5
  74. package/esm2022/lib/_components/template/details-narrow-wide/details-narrow-wide.component.mjs +5 -5
  75. package/esm2022/lib/_components/template/details-one-column/details-one-column.component.mjs +5 -5
  76. package/esm2022/lib/_components/template/details-sub-tabs/details-sub-tabs.component.mjs +5 -5
  77. package/esm2022/lib/_components/template/details-three-column/details-three-column.component.mjs +5 -5
  78. package/esm2022/lib/_components/template/details-two-column/details-two-column.component.mjs +5 -5
  79. package/esm2022/lib/_components/template/details-wide-narrow/details-wide-narrow.component.mjs +5 -5
  80. package/esm2022/lib/_components/template/dynamic-tabs/dynamic-tabs.component.mjs +5 -6
  81. package/esm2022/lib/_components/template/field-group-list/field-group-list.component.mjs +4 -4
  82. package/esm2022/lib/_components/template/field-group-template/field-group-template.component.mjs +9 -19
  83. package/esm2022/lib/_components/template/field-value-list/field-value-list.component.mjs +3 -3
  84. package/esm2022/lib/_components/template/inline-dashboard/inline-dashboard.component.mjs +4 -4
  85. package/esm2022/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.mjs +5 -5
  86. package/esm2022/lib/_components/template/list-page/list-page.component.mjs +4 -4
  87. package/esm2022/lib/_components/template/list-view/DefaultViewMeta.mjs +1 -1
  88. package/esm2022/lib/_components/template/list-view/list-view.component.mjs +16 -10
  89. package/esm2022/lib/_components/template/list-view/listViewHelpers.mjs +1 -2
  90. package/esm2022/lib/_components/template/list-view/utils.mjs +1 -1
  91. package/esm2022/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.mjs +5 -5
  92. package/esm2022/lib/_components/template/narrow-wide-form/narrow-wide-form.component.mjs +4 -4
  93. package/esm2022/lib/_components/template/one-column/one-column.component.mjs +4 -4
  94. package/esm2022/lib/_components/template/one-column-page/one-column-page.component.mjs +4 -4
  95. package/esm2022/lib/_components/template/one-column-tab/one-column-tab.component.mjs +4 -4
  96. package/esm2022/lib/_components/template/page/page.component.mjs +5 -5
  97. package/esm2022/lib/_components/template/promoted-filters/promoted-filters.component.mjs +5 -5
  98. package/esm2022/lib/_components/template/repeating-structures/repeating-structures.component.mjs +5 -6
  99. package/esm2022/lib/_components/template/simple-table/simple-table.component.mjs +5 -7
  100. package/esm2022/lib/_components/template/simple-table-manual/helpers.mjs +1 -1
  101. package/esm2022/lib/_components/template/simple-table-manual/simple-table-manual.component.mjs +11 -17
  102. package/esm2022/lib/_components/template/simple-table-select/simple-table-select.component.mjs +7 -9
  103. package/esm2022/lib/_components/template/single-reference-readonly/single-reference-readonly.component.mjs +4 -4
  104. package/esm2022/lib/_components/template/sub-tabs/sub-tabs.component.mjs +5 -5
  105. package/esm2022/lib/_components/template/three-column/three-column.component.mjs +4 -4
  106. package/esm2022/lib/_components/template/three-column-page/three-column-page.component.mjs +4 -4
  107. package/esm2022/lib/_components/template/two-column/two-column.component.mjs +4 -4
  108. package/esm2022/lib/_components/template/two-column-page/two-column-page.component.mjs +5 -5
  109. package/esm2022/lib/_components/template/two-column-tab/two-column-tab.component.mjs +4 -4
  110. package/esm2022/lib/_components/template/utils.mjs +1 -1
  111. package/esm2022/lib/_components/template/wide-narrow-form/wide-narrow-form.component.mjs +4 -4
  112. package/esm2022/lib/_components/template/wide-narrow-page/wide-narrow-page.component.mjs +5 -5
  113. package/esm2022/lib/_components/template/wss-nav-bar/wss-nav-bar.component.mjs +5 -5
  114. package/esm2022/lib/_components/widget/app-announcement/app-announcement.component.mjs +4 -4
  115. package/esm2022/lib/_components/widget/attachment/attachment.component.mjs +227 -424
  116. package/esm2022/lib/_components/widget/case-history/case-history.component.mjs +6 -7
  117. package/esm2022/lib/_components/widget/feed-container/feed-container.component.mjs +5 -9
  118. package/esm2022/lib/_components/widget/file-utility/file-utility.component.mjs +18 -22
  119. package/esm2022/lib/_components/widget/list-utility/list-utility.component.mjs +6 -6
  120. package/esm2022/lib/_components/widget/quick-create/quick-create.component.mjs +5 -5
  121. package/esm2022/lib/_components/widget/todo/todo.component.mjs +6 -6
  122. package/esm2022/lib/_components/widget/utility/utility.component.mjs +5 -5
  123. package/esm2022/lib/_directives/thousand-seperator.directive.mjs +5 -5
  124. package/esm2022/lib/_helpers/case-utils.mjs +1 -1
  125. package/esm2022/lib/_helpers/currency-utils.mjs +1 -1
  126. package/esm2022/lib/_helpers/event-util.mjs +1 -1
  127. package/esm2022/lib/_helpers/field-group-utils.mjs +1 -1
  128. package/esm2022/lib/_helpers/filter-utils.mjs +1 -1
  129. package/esm2022/lib/_helpers/formatters/boolean.mjs +1 -1
  130. package/esm2022/lib/_helpers/formatters/currency.mjs +1 -1
  131. package/esm2022/lib/_helpers/formatters/date.mjs +1 -1
  132. package/esm2022/lib/_helpers/formatters/format-utils.mjs +1 -1
  133. package/esm2022/lib/_helpers/formatters/index.mjs +1 -1
  134. package/esm2022/lib/_helpers/tab-utils.mjs +1 -1
  135. package/esm2022/lib/_helpers/template-utils.mjs +4 -4
  136. package/esm2022/lib/_helpers/utils.mjs +5 -5
  137. package/esm2022/lib/_messages/error-messages.service.mjs +3 -3
  138. package/esm2022/lib/_messages/get-login-status.service.mjs +3 -3
  139. package/esm2022/lib/_messages/oauth-response.service.mjs +3 -3
  140. package/esm2022/lib/_messages/progress-spinner.service.mjs +3 -3
  141. package/esm2022/lib/_messages/reset-pconnect.service.mjs +3 -3
  142. package/esm2022/lib/_messages/update-worklist.service.mjs +3 -3
  143. package/esm2022/lib/_services/case.service.mjs +4 -4
  144. package/esm2022/lib/_services/datapage.service.mjs +5 -5
  145. package/esm2022/lib/_services/server-config.service.mjs +3 -3
  146. package/esm2022/public-api.mjs +2 -1
  147. package/fesm2022/pega-angular-sdk-components.mjs +924 -1130
  148. package/fesm2022/pega-angular-sdk-components.mjs.map +1 -1
  149. package/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.d.ts +1 -1
  150. package/lib/_components/field/currency/currency.component.d.ts +4 -5
  151. package/lib/_components/field/date-time/date-time.component.d.ts +0 -1
  152. package/lib/_components/field/decimal/decimal.component.d.ts +9 -1
  153. package/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.d.ts +1 -1
  154. package/lib/_components/field/percentage/percentage.component.d.ts +4 -0
  155. package/lib/_components/field/user-reference/user-reference.component.d.ts +9 -4
  156. package/lib/_components/infra/Containers/flow-container/flow-container.component.d.ts +1 -1
  157. package/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.d.ts +1 -1
  158. package/lib/_components/infra/action-buttons/action-buttons.component.d.ts +1 -1
  159. package/lib/_components/infra/assignment/assignment.component.d.ts +2 -0
  160. package/lib/_components/infra/error-boundary/error-boundary.component.d.ts +1 -1
  161. package/lib/_components/template/list-view/list-view.component.d.ts +8 -2
  162. package/lib/_components/template/simple-table-manual/helpers.d.ts +1 -1
  163. package/lib/_components/template/wss-nav-bar/wss-nav-bar.component.d.ts +1 -1
  164. package/lib/_components/widget/attachment/attachment.component.d.ts +29 -57
  165. package/lib/_components/widget/file-utility/file-utility.component.d.ts +3 -3
  166. package/lib/_components/widget/todo/todo.component.d.ts +3 -3
  167. package/lib/_helpers/common.d.ts +1 -1
  168. package/lib/_helpers/field-group-utils.d.ts +1 -1
  169. package/lib/_helpers/filter-utils.d.ts +1 -1
  170. package/lib/_helpers/formatters/common.d.ts +2 -2
  171. package/package.json +3 -3
  172. package/public-api.d.ts +1 -0
@@ -1,6 +1,8 @@
1
- import { Component, Input, forwardRef } from '@angular/core';
1
+ import { Component, Input, forwardRef, ViewChild } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { MatButtonModule } from '@angular/material/button';
4
+ import { MatMenuModule } from '@angular/material/menu';
5
+ import { MatIconModule } from '@angular/material/icon';
4
6
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
5
7
  import download from 'downloadjs';
6
8
  import { ComponentMapperComponent } from '../../../_bridge/component-mapper/component-mapper.component';
@@ -9,7 +11,9 @@ import * as i1 from "../../../_bridge/angular-pconnect";
9
11
  import * as i2 from "../../../_helpers/utils";
10
12
  import * as i3 from "@angular/common";
11
13
  import * as i4 from "@angular/material/progress-spinner";
12
- import * as i5 from "@angular/material/button";
14
+ import * as i5 from "@angular/material/menu";
15
+ import * as i6 from "@angular/material/icon";
16
+ import * as i7 from "@angular/material/button";
13
17
  export class AttachmentComponent {
14
18
  constructor(angularPConnect, utils, ngZone) {
15
19
  this.angularPConnect = angularPConnect;
@@ -23,11 +27,7 @@ export class AttachmentComponent {
23
27
  this.bDisabled$ = false;
24
28
  this.bVisible$ = true;
25
29
  this.bLoading$ = false;
26
- this.arFiles$ = [];
27
- this.arFileList$ = [];
28
- this.arMenuList$ = [];
29
30
  this.bShowSelector$ = true;
30
- this.bShowJustDelete$ = false;
31
31
  this.fileTemp = {};
32
32
  this.allowMultiple$ = false;
33
33
  this.extensions$ = '';
@@ -37,85 +37,13 @@ export class AttachmentComponent {
37
37
  this.localeCategory = 'CosmosFields';
38
38
  this.uploadMultipleFilesLabel = this.localizedVal('file_upload_text_multiple', this.localeCategory);
39
39
  this.uploadSingleFileLabel = this.localizedVal('file_upload_text_one', this.localeCategory);
40
+ this.filesWithError = [];
41
+ this.files = [];
40
42
  this.fileDownload = (data, fileName, ext) => {
41
43
  const file = ext ? `${fileName}.${ext}` : fileName;
42
44
  download(atob(data), file);
43
45
  };
44
46
  this.getAttachmentKey = (name = '') => (name ? `attachmentsList.${name}` : 'attachmentsList');
45
- this.getNewListUtilityItemProps = ({ att, cancelFile, downloadFile, deleteFile, removeFile }) => {
46
- let actions;
47
- let isDownloadable = false;
48
- if (att.progress && att.progress !== 100) {
49
- actions = [
50
- {
51
- id: `Cancel-${att.ID}`,
52
- text: this.pConn$.getLocalizedValue('Cancel', '', ''),
53
- icon: 'times',
54
- onClick: cancelFile
55
- }
56
- ];
57
- }
58
- else if (att.links) {
59
- const isFile = att.type === 'FILE';
60
- const ID = att.ID.replace(/\s/gi, '');
61
- const actionsMap = new Map([
62
- [
63
- 'download',
64
- {
65
- id: `download-${ID}`,
66
- text: isFile ? this.pConn$.getLocalizedValue('Download', '', '') : this.pConn$.getLocalizedValue('Open', '', ''),
67
- icon: isFile ? 'download' : 'open',
68
- onClick: downloadFile
69
- }
70
- ],
71
- [
72
- 'delete',
73
- {
74
- id: `Delete-${ID}`,
75
- text: this.pConn$.getLocalizedValue('Delete', '', ''),
76
- icon: 'trash',
77
- onClick: deleteFile
78
- }
79
- ]
80
- ]);
81
- actions = [];
82
- actionsMap.forEach((action, actionKey) => {
83
- if (att.links[actionKey]) {
84
- actions.push(action);
85
- }
86
- });
87
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
88
- isDownloadable = att.links.download;
89
- }
90
- else if (att.error) {
91
- actions = [
92
- {
93
- id: `Remove-${att.ID}`,
94
- text: this.pConn$.getLocalizedValue('Remove', '', ''),
95
- icon: 'trash',
96
- onClick: removeFile
97
- }
98
- ];
99
- }
100
- return {
101
- id: att.ID,
102
- visual: {
103
- icon: this.utils.getIconForAttachment(att),
104
- progress: att.progress == 100 ? undefined : att.progress
105
- },
106
- primary: {
107
- type: att.type,
108
- name: att.error ? att.fileName : att.name,
109
- icon: 'trash',
110
- click: removeFile
111
- },
112
- secondary: {
113
- text: att.meta,
114
- error: att.error
115
- },
116
- actions
117
- };
118
- };
119
47
  this.validateFileExtension = (fileObj, allowedExtensions) => {
120
48
  if (!allowedExtensions) {
121
49
  return true;
@@ -131,10 +59,31 @@ export class AttachmentComponent {
131
59
  ngOnInit() {
132
60
  // // First thing in initialization is registering and subscribing to the AngularPConnect service
133
61
  this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
134
- this.removeFileFromList$ = { onClick: this._removeFileFromList.bind(this) };
135
62
  this.caseID = PCore.getStoreValue('.pyID', 'caseInfo.content', this.pConn$.getContextName());
136
- // let configProps: any = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps());
63
+ this.srcImg = this.utils.getImageSrc('document-doc', this.utils.getSDKStaticContentUrl());
64
+ this.deleteIcon = this.utils.getImageSrc('trash', this.utils.getSDKStaticContentUrl());
137
65
  this.checkAndUpdate();
66
+ this.getAttachments();
67
+ }
68
+ getAttachments() {
69
+ let tempUploadedFiles = this.getCurrentAttachmentsList(this.getAttachmentKey(this.valueRef), this.pConn$.getContextName());
70
+ tempUploadedFiles = tempUploadedFiles.filter(f => f.label === this.valueRef && f.delete !== true);
71
+ this.files?.map(f => {
72
+ return f.responseProps?.pzInsKey && !f.responseProps.pzInsKey.includes('temp')
73
+ ? {
74
+ ...f,
75
+ props: {
76
+ ...f.props,
77
+ onDelete: () => this.deleteFile(f)
78
+ }
79
+ }
80
+ : { ...f };
81
+ });
82
+ this.files = [...this.files, ...tempUploadedFiles];
83
+ PCore.getPubSubUtils().subscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.resetAttachmentStoredState.bind(this), this.caseID);
84
+ return () => {
85
+ PCore.getPubSubUtils().unsubscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.caseID);
86
+ };
138
87
  }
139
88
  checkAndUpdate() {
140
89
  // Should always check the bridge to see if the component should
@@ -145,64 +94,14 @@ export class AttachmentComponent {
145
94
  this.updateSelf();
146
95
  }
147
96
  }
148
- ngOnDestroy() {
149
- if (this.angularPConnectData.unsubscribeFn) {
150
- this.angularPConnectData.unsubscribeFn();
151
- }
152
- PCore.getPubSubUtils().unsubscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.caseID);
153
- }
154
97
  // Callback passed when subscribing to store change
155
98
  onStateChange() {
156
99
  this.checkAndUpdate();
157
100
  }
158
- updateAttachmentsInfo() {
159
- // @ts-ignore - Property 'attachmentsInfo' does not exist on type 'C11nEnv'
160
- if (!this.pConn$.attachmentsInfo) {
161
- // @ts-ignore - Property 'attachmentsInfo' does not exist on type 'C11nEnv'
162
- this.pConn$.attachmentsInfo = {
163
- type: 'File',
164
- attachmentFieldName: this.att_valueRef,
165
- category: this.att_categoryName
166
- };
167
- }
168
- }
169
- processFile(file, i) {
170
- file.props.type = file.responseProps.pyMimeFileExtension;
171
- file.props.mimeType = file.responseProps.pyMimeFileExtension;
172
- file.props.ID = file.responseProps.pzInsKey;
173
- const arMenuList = [
174
- {
175
- icon: 'download',
176
- text: this.pConn$.getLocalizedValue('Download', '', ''),
177
- onClick: () => this._downloadFileFromList(this.value$.pxResults[i])
178
- },
179
- {
180
- icon: 'trash',
181
- text: this.pConn$.getLocalizedValue('Delete', '', ''),
182
- onClick: () => this._removeFileFromList(this.arFileList$[i])
183
- }
184
- ];
185
- const arFilesAttachmentIDs = [];
186
- this.arFileList$.forEach(arFile => {
187
- arFilesAttachmentIDs.push(arFile.id);
188
- });
189
- if (!arFilesAttachmentIDs.includes(file.props.ID)) {
190
- this.arFileList$.push(this.getNewListUtilityItemProps({
191
- att: file.props,
192
- downloadFile: null,
193
- cancelFile: null,
194
- deleteFile: null,
195
- removeFile: null
196
- }));
197
- }
198
- this.arFileList$[i].actions = arMenuList;
199
- this.arFileList$[i].noDeleteIcon = true;
200
- this.bShowSelector$ = false;
201
- }
202
101
  updateSelf() {
203
102
  const configProps = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps());
204
103
  const stateProps = this.pConn$.getStateProps();
205
- const { value, label, extensions } = configProps;
104
+ const { value, label, extensions, displayMode } = configProps;
206
105
  if (configProps.required != null) {
207
106
  this.bRequired$ = this.utils.getBooleanValue(configProps.required);
208
107
  }
@@ -219,7 +118,6 @@ export class AttachmentComponent {
219
118
  if (configProps.allowMultiple != null) {
220
119
  this.allowMultiple$ = this.utils.getBooleanValue(configProps.allowMultiple);
221
120
  }
222
- this.bShowJustDelete$ = true;
223
121
  this.label$ = label;
224
122
  this.value$ = value;
225
123
  this.status = stateProps.status;
@@ -227,83 +125,47 @@ export class AttachmentComponent {
227
125
  this.extensions$ = extensions;
228
126
  this.valueRef = this.pConn$.getStateProps().value;
229
127
  this.valueRef = this.valueRef.startsWith('.') ? this.valueRef.substring(1) : this.valueRef;
128
+ this.displayMode = displayMode;
230
129
  /* this is a temporary fix because required is supposed to be passed as a boolean and NOT as a string */
231
130
  let { required, disabled } = configProps;
232
131
  [required, disabled] = [required, disabled].map(prop => prop === true || (typeof prop === 'string' && prop === 'true'));
233
- this.att_categoryName = '';
132
+ this.categoryName = '';
234
133
  if (value && value.pyCategoryName) {
235
- this.att_categoryName = value.pyCategoryName;
134
+ this.categoryName = value.pyCategoryName;
135
+ }
136
+ if (value?.pxResults && +value.pyCount > 0) {
137
+ this.files = value.pxResults.map(f => this.buildFilePropsFromResponse(f));
236
138
  }
237
- this.att_valueRef = this.pConn$.getStateProps().value;
238
- this.att_valueRef = this.att_valueRef.indexOf('.') === 0 ? this.att_valueRef.substring(1) : this.att_valueRef;
239
139
  this.updateAttachments();
240
140
  }
241
- updateAttachments() {
242
- const attachmentsFromServer = this.value$ && this.value$.pxResults && +this.value$.pyCount > 0;
243
- if (attachmentsFromServer) {
244
- this.updateAttachmentsFromServer();
245
- }
246
- else {
247
- // Get the attachments from the Redux
248
- this.myFiles = this.getCurrentAttachmentsList(this.getAttachmentKey(this.att_valueRef), this.pConn$.getContextName());
249
- if (this.myFiles?.length && this.arFiles$.length === 0) {
250
- this.arFileList$ = this.myFiles.map(att => {
251
- return this.getNewListUtilityItemProps({
252
- att,
253
- downloadFile: null,
254
- cancelFile: null,
255
- deleteFile: null,
256
- removeFile: null
257
- });
258
- });
141
+ buildFilePropsFromResponse(respObj) {
142
+ return {
143
+ props: {
144
+ meta: `${respObj.pyCategoryName}, ${respObj.pxCreateOperator}`,
145
+ name: respObj.pyAttachName,
146
+ icon: this.utils.getIconFromFileType(respObj.pyMimeFileExtension)
147
+ },
148
+ responseProps: {
149
+ ...respObj
259
150
  }
260
- const myFilesAttachmentIDs = [];
261
- this.myFiles.forEach(myFile => {
262
- myFilesAttachmentIDs.push(myFile.ID);
263
- });
264
- this.arFiles$.forEach(arFile => {
265
- if (!myFilesAttachmentIDs.includes(arFile.ID)) {
266
- this.myFiles = [...this.myFiles, arFile];
267
- }
268
- });
269
- }
270
- this.bShowJustDelete$ = true;
271
- this.bShowSelector$ = !(this.arFileList$?.length > 0) || this.allowMultiple$;
272
- if (this.arFileList$.length > 0) {
273
- this.CheckForInvalidAttachment();
274
- }
275
- PCore.getPubSubUtils().subscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.resetAttachmentStoredState.bind(this), this.caseID);
151
+ };
276
152
  }
277
- updateAttachmentsFromServer() {
278
- this.value$.pxResults.forEach((attachment, i) => {
279
- const file = this.buildFilePropsFromResponse(attachment);
280
- if (file.responseProps) {
281
- this.updateAttachmentsInfo();
282
- if (file.responseProps.pzInsKey && !file.responseProps.pzInsKey.includes('temp')) {
283
- this.processFile(file, i);
284
- }
285
- if (file) {
286
- const currentAttachmentList = this.getCurrentAttachmentsList(this.getAttachmentKey(this.att_valueRef), this.pConn$.getContextName());
287
- const index = currentAttachmentList.findIndex(element => element.props.ID === file.props.ID);
288
- let tempFiles = [];
289
- if (index < 0) {
290
- tempFiles = [file];
291
- }
292
- PCore.getStateUtils().updateState(this.pConn$.getContextName(), this.getAttachmentKey(this.att_valueRef), [...currentAttachmentList, ...tempFiles], {
293
- pageReference: 'context_data',
294
- isArrayDeepMerge: false
295
- });
296
- }
297
- }
298
- });
153
+ updateAttachments() {
154
+ if (this.files.length > 0 && this.displayMode !== 'DISPLAY_ONLY') {
155
+ const currentAttachmentList = this.getCurrentAttachmentsList(this.getAttachmentKey(this.valueRef), this.pConn$.getContextName());
156
+ // block duplicate files to redux store when added 1 after another to prevent multiple duplicates being added to the case on submit
157
+ const tempFiles = this.files.filter(f => currentAttachmentList.findIndex(fr => fr.ID === f.ID) === -1 && !f.inProgress && f.responseProps);
158
+ const updatedAttList = [...currentAttachmentList, ...tempFiles];
159
+ this.updateAttachmentState(this.pConn$, this.getAttachmentKey(this.valueRef), updatedAttList);
160
+ }
299
161
  }
300
162
  resetAttachmentStoredState() {
301
- PCore.getStateUtils().updateState(this.pConn$.getContextName(), this.getAttachmentKey(this.att_valueRef), undefined, {
163
+ PCore.getStateUtils().updateState(this.pConn$?.getContextName(), this.getAttachmentKey(this.valueRef), undefined, {
302
164
  pageReference: 'context_data',
303
165
  isArrayDeepMerge: false
304
166
  });
305
167
  }
306
- _downloadFileFromList(fileObj) {
168
+ downloadFile(fileObj) {
307
169
  PCore.getAttachmentUtils()
308
170
  // @ts-ignore - 3rd parameter "responseEncoding" should be optional
309
171
  .downloadAttachment(fileObj.pzInsKey, this.pConn$.getContextName())
@@ -315,278 +177,219 @@ export class AttachmentComponent {
315
177
  console.log(e);
316
178
  });
317
179
  }
318
- CheckForInvalidAttachment() {
319
- let isValid = true;
320
- this.arFileList$.forEach(file => {
321
- if (file.secondary.error) {
322
- isValid = false;
323
- }
180
+ getCurrentAttachmentsList(key, context) {
181
+ return PCore.getStoreValue(`.${key}`, 'context_data', context) || [];
182
+ }
183
+ validateMaxSize(fileObj, maxSizeInMB) {
184
+ const fileSize = (fileObj.size / 1048576).toFixed(2);
185
+ return parseFloat(fileSize) < parseFloat(maxSizeInMB);
186
+ }
187
+ updateAttachmentState(pConn, key, attachments) {
188
+ PCore.getStateUtils().updateState(this.pConn$.getContextName(), key, attachments, {
189
+ pageReference: 'context_data',
190
+ isArrayDeepMerge: false
324
191
  });
325
- if (isValid) {
326
- // @ts-ignore
327
- PCore.getMessageManager().clearMessages({
328
- type: PCore.getConstants().MESSAGES.MESSAGES_TYPE_ERROR,
329
- property: this.pConn$.getStateProps().value,
330
- pageReference: this.pConn$.getPageReference(),
331
- context: this.pConn$.getContextName()
332
- });
333
- }
334
192
  }
335
- _removeFileFromList(item) {
336
- const fileListIndex = this.arFileList$.findIndex(element => element?.id === item?.id);
337
- const fileIndex = this.arFiles$.findIndex(element => element?.ID === item?.id);
193
+ deleteFile(file) {
338
194
  const attachmentsList = [];
339
- let currentAttachmentList = this.getCurrentAttachmentsList(this.getAttachmentKey(this.att_valueRef), this.pConn$.getContextName());
340
- if (this.value$ && this.value$.pxResults && +this.value$.pyCount > 0 && item.actions) {
341
- const updatedAttachments = currentAttachmentList.map(attachment => {
342
- if (attachment?.ID === this.arFileList$[fileListIndex].id || attachment?.props?.ID === this.arFileList$[fileListIndex].id) {
343
- return { ...attachment, delete: true, label: this.valueRef };
195
+ let currentAttachmentList = this.getCurrentAttachmentsList(this.getAttachmentKey(this.valueRef), this.pConn$.getContextName());
196
+ // If file to be deleted is the one added in previous stage i.e. for which a file instance is created in server
197
+ // no need to filter currentAttachmentList as we will get another entry of file in redux with delete & label
198
+ // eslint-disable-next-line no-unsafe-optional-chaining
199
+ if (this.value$ && this.value$?.pxResults && +this.value$?.pyCount > 0 && file.responseProps && file?.responseProps?.pzInsKey !== 'temp') {
200
+ const updatedAttachments = this.files.map(f => {
201
+ if (f.responseProps && f.responseProps.pzInsKey === file.responseProps.pzInsKey) {
202
+ return { ...f, delete: true, label: this.valueRef };
344
203
  }
345
- return attachment;
204
+ return f;
346
205
  });
347
206
  // updating the redux store to help form-handler in passing the data to delete the file from server
348
- PCore.getStateUtils().updateState(this.pConn$.getContextName(), this.getAttachmentKey(this.att_valueRef), updatedAttachments, {
349
- pageReference: 'context_data',
350
- isArrayDeepMerge: false
351
- });
352
- }
207
+ this.updateAttachmentState(this.pConn$, this.getAttachmentKey(this.valueRef), [...updatedAttachments]);
208
+ const newlyAddedFiles = this.files.filter(f => !!f.ID);
209
+ const filesPostDelete = this.files.filter(f => f.responseProps?.pzInsKey !== 'temp' && f.responseProps?.pzInsKey !== file.responseProps?.pzInsKey);
210
+ this.files = [...filesPostDelete, ...newlyAddedFiles];
211
+ } // if the file being deleted is the added in this stage i.e. whose data is not yet created in server
353
212
  else {
354
- currentAttachmentList = currentAttachmentList.filter(f => f.ID !== item.id);
355
- PCore.getStateUtils().updateState(this.pConn$.getContextName(), this.getAttachmentKey(this.att_valueRef), [...currentAttachmentList, ...attachmentsList], {
356
- pageReference: 'context_data',
357
- isArrayDeepMerge: false
358
- });
213
+ // filter newly added files in this stage, later the updated current stage files will be added to redux once files state is updated
214
+ currentAttachmentList = currentAttachmentList.filter(f => f.ID !== file.ID);
215
+ this.files = this.files.filter(f => f.ID !== file.ID);
216
+ this.updateAttachmentState(this.pConn$, this.getAttachmentKey(this.valueRef), [...currentAttachmentList, ...attachmentsList]);
217
+ if (file.inProgress) {
218
+ // @ts-ignore - 3rd parameter "responseEncoding" should be optional
219
+ PCore.getAttachmentUtils().cancelRequest(file.ID, pConn.getContextName());
220
+ }
221
+ }
222
+ this.filesWithError = this.filesWithError?.filter(f => f.ID !== file.ID);
223
+ if (this.filesWithError.length === 0) {
224
+ this.clearFieldErrorMessages();
225
+ }
226
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
227
+ this.fileInput && this.fileInput.nativeElement.value ? null : '';
228
+ }
229
+ onFileAdded(event) {
230
+ let addedFiles = Array.from(event.target.files);
231
+ addedFiles = this.allowMultiple$ ? addedFiles : [addedFiles[0]];
232
+ const maxAttachmentSize = PCore.getEnvironmentInfo().getMaxAttachmentSize() || '5';
233
+ this.tempFilesToBeUploaded = [
234
+ ...addedFiles.map((f, index) => {
235
+ f.ID = `${new Date().getTime()}I${index}`;
236
+ f.inProgress = true;
237
+ f.props = {
238
+ type: f.type,
239
+ name: f.name,
240
+ icon: this.utils.getIconFromFileType(f.type),
241
+ onDelete: () => this.deleteFile(f)
242
+ };
243
+ if (!this.validateMaxSize(f, maxAttachmentSize)) {
244
+ f.props.error = true;
245
+ f.inProgress = false;
246
+ f.props.meta = this.pConn$.getLocalizedValue(`File is too big. Max allowed size is ${maxAttachmentSize}MB.`, '', '');
247
+ }
248
+ else if (!this.validateFileExtension(f, this.extensions$)) {
249
+ f.props.error = true;
250
+ f.inProgress = false;
251
+ f.props.meta = `${this.pConn$.getLocalizedValue('File has invalid extension. Allowed extensions are:', '', '')} ${this.extensions$.replaceAll('.', '')}`;
252
+ }
253
+ if (f.props.error) {
254
+ const fieldName = this.pConn$.getStateProps().value;
255
+ const context = this.pConn$.getContextName();
256
+ PCore.getMessageManager().addMessages({
257
+ messages: [
258
+ {
259
+ type: 'error',
260
+ // @ts-ignore - Type '{ type: string; message: string; }' is not assignable to type 'MessagesConfigObject'.
261
+ message: pConn.getLocalizedValue('Error with one or more files', '', '')
262
+ }
263
+ ],
264
+ property: fieldName,
265
+ pageReference: this.pConn$.getPageReference(),
266
+ context
267
+ });
268
+ }
269
+ return f;
270
+ })
271
+ ];
272
+ const tempFilesWithError = this.tempFilesToBeUploaded.filter(f => f.props.error);
273
+ if (tempFilesWithError.length > 0) {
274
+ this.filesWithError = tempFilesWithError;
359
275
  }
360
- if (fileListIndex > -1) {
361
- this.arFileList$.splice(fileListIndex, 1);
276
+ if (!this.allowMultiple$) {
277
+ this.files = [...this.tempFilesToBeUploaded];
362
278
  }
363
- if (fileIndex > -1) {
364
- this.arFiles$.splice(fileIndex, 1);
279
+ else {
280
+ this.files = [...this.files, ...this.tempFilesToBeUploaded];
365
281
  }
366
- this.CheckForInvalidAttachment();
367
- this.bShowSelector$ = !(this.arFileList$?.length > 0) || this.allowMultiple$;
282
+ this.uploadFiles();
368
283
  }
369
- getCurrentAttachmentsList(key, context) {
370
- return PCore.getStoreValue(`.${key}`, 'context_data', context) || [];
284
+ clearFieldErrorMessages() {
285
+ const fieldName = this.pConn$.getStateProps().value;
286
+ const context = this.pConn$.getContextName();
287
+ PCore.getMessageManager().clearMessages({
288
+ type: PCore.getConstants().MESSAGES.MESSAGES_TYPE_ERROR,
289
+ property: fieldName,
290
+ pageReference: this.pConn$.getPageReference(),
291
+ context
292
+ });
371
293
  }
372
- errorHandler(isFetchCanceled, file) {
294
+ onUploadProgress() { }
295
+ errorHandler(isFetchCanceled, attachedFile) {
373
296
  return error => {
374
297
  if (!isFetchCanceled(error)) {
375
298
  let uploadFailMsg = this.pConn$.getLocalizedValue('Something went wrong', '', '');
376
299
  if (error.response && error.response.data && error.response.data.errorDetails) {
377
300
  uploadFailMsg = this.pConn$.getLocalizedValue(error.response.data.errorDetails[0].localizedValue, '', '');
378
301
  }
379
- for (const myFile of this.myFiles) {
380
- if (myFile.ID === file.ID) {
381
- myFile.meta = uploadFailMsg;
382
- myFile.error = true;
383
- myFile.fileName = this.pConn$.getLocalizedValue('Unable to upload file', '', '');
384
- }
385
- }
386
- this.bShowSelector$ = false;
387
- this.arFileList$ = this.myFiles.map(att => {
388
- if (att.id) {
389
- return att;
302
+ this.files.map(f => {
303
+ if (f.ID === attachedFile.ID) {
304
+ f.props.meta = uploadFailMsg;
305
+ f.props.error = true;
306
+ f.props.onDelete = () => this.deleteFile(f);
307
+ f.props.icon = this.utils.getIconFromFileType(f.type);
308
+ f.props.name = this.pConn$.getLocalizedValue('Unable to upload file', '', '');
309
+ f.inProgress = false;
310
+ const fieldName = this.pConn$.getStateProps().value;
311
+ const context = this.pConn$.getContextName();
312
+ // set errors to property to block submit even on errors in file upload
313
+ PCore.getMessageManager().addMessages({
314
+ messages: [
315
+ {
316
+ type: 'error',
317
+ // @ts-ignore - Type '{ type: string; message: string; }' is not assignable to type 'MessagesConfigObject'.
318
+ message: this.pConn$.getLocalizedValue('Error with one or more files', '', '')
319
+ }
320
+ ],
321
+ property: fieldName,
322
+ pageReference: this.pConn$.getPageReference(),
323
+ context
324
+ });
325
+ delete f.props.progress;
390
326
  }
391
- return this.getNewListUtilityItemProps({
392
- att,
393
- downloadFile: null,
394
- cancelFile: null,
395
- deleteFile: null,
396
- removeFile: null
397
- });
327
+ return f;
398
328
  });
399
- PCore.getMessageManager().addMessages({
400
- // @ts-ignore
401
- messages: [
402
- {
403
- type: 'error',
404
- message: this.pConn$.getLocalizedValue('Error with one or more files', '', '')
405
- }
406
- ],
407
- property: this.pConn$.getStateProps().value,
408
- pageReference: this.pConn$.getPageReference(),
409
- context: this.pConn$.getContextName()
410
- });
411
- this.bShowJustDelete$ = true;
412
- this.bLoading$ = false;
413
329
  }
414
330
  throw error;
415
331
  };
416
332
  }
417
- uploadMyFiles(event) {
418
- let arrAttachmentFiles = [];
419
- if (this.arFiles$.length) {
420
- arrAttachmentFiles = this.arFiles$;
421
- }
422
- else {
423
- arrAttachmentFiles = this.arFileList$;
424
- }
425
- this.arFiles$ = [...arrAttachmentFiles, ...this.getFiles(event.target.files)];
426
- // convert FileList to an array
427
- this.myFiles = Array.from(this.arFiles$);
428
- this.bLoading$ = true;
429
- const filesToBeUploaded = this.myFiles
333
+ uploadFiles() {
334
+ const filesToBeUploaded = this.files
430
335
  .filter(e => {
431
- if (e.id) {
432
- return false;
433
- }
434
- const isFileUploaded = e && e.progress === 100;
435
- const fileHasError = e && e.error;
336
+ const isFileUploaded = e.props && e.props.progress === 100;
337
+ const fileHasError = e.props && e.props.error;
436
338
  const isFileUploadedinLastStep = e.responseProps && e.responseProps.pzInsKey;
437
339
  return !isFileUploaded && !fileHasError && !isFileUploadedinLastStep;
438
340
  })
439
- .map(f => PCore.getAttachmentUtils().uploadAttachment(f, () => {
341
+ .map(f => window.PCore.getAttachmentUtils().uploadAttachment(f, () => {
440
342
  this.onUploadProgress();
441
343
  }, isFetchCanceled => {
442
344
  return this.errorHandler(isFetchCanceled, f);
443
345
  }, this.pConn$.getContextName()));
444
346
  Promise.allSettled(filesToBeUploaded)
445
347
  .then((fileResponses) => {
446
- this.handleFileUploadSuccess(fileResponses);
447
- })
448
- .catch(error => {
449
- console.log(error);
450
- this.handleFileUploadFailure();
451
- });
452
- }
453
- handleFileUploadSuccess(fileResponses) {
454
- const successFileResponses = fileResponses.filter(fr => fr.status !== 'rejected'); // in case of deleting an in progress file, promise gets cancelled but still enters then block
455
- let reqObj;
456
- if (successFileResponses.length > 0) {
457
- const tempFilesUploaded = [...this.arFiles$.filter(file => !file.id)];
458
- let newAttachments = [];
459
- tempFilesUploaded.forEach(fileRes => {
460
- const index = successFileResponses.findIndex((fr) => fr.value.clientFileID === fileRes.ID);
461
- if (index >= 0) {
462
- reqObj = {
463
- type: 'File',
464
- label: this.att_valueRef,
465
- category: this.att_categoryName,
466
- handle: successFileResponses[index].value.ID,
467
- ID: fileRes.ID,
468
- name: fileRes.name
469
- };
470
- newAttachments = [...newAttachments, reqObj];
471
- }
472
- });
473
- const currentAttachmentList = this.getCurrentAttachmentsList(this.getAttachmentKey(this.att_valueRef), this.pConn$.getContextName()).filter(f => f.label !== this.att_valueRef);
474
- PCore.getStateUtils().updateState(this.pConn$.getContextName(), this.getAttachmentKey(this.att_valueRef), [...currentAttachmentList, ...newAttachments], {
475
- pageReference: 'context_data',
476
- isArrayDeepMerge: false
477
- });
478
- this.arFiles$ = tempFilesUploaded;
479
- this.ngZone.run(() => {
480
- this.bShowSelector$ = this.allowMultiple$;
481
- this.arFiles$.forEach(file => {
482
- if (!file.error) {
483
- file.meta = this.pConn$.getLocalizedValue('File uploaded successfully', '', '');
348
+ fileResponses = fileResponses.filter(fr => fr.status !== 'rejected'); // in case of deleting an in progress file, promise gets cancelled but still enters then block
349
+ if (fileResponses.length > 0) {
350
+ this.files.forEach(f => {
351
+ const index = fileResponses.findIndex((fr) => fr.value.clientFileID === f.ID);
352
+ if (index >= 0) {
353
+ f.props.meta = this.pConn$.getLocalizedValue('Uploaded successfully', '', '');
354
+ f.props.progress = 100;
355
+ f.inProgress = false;
356
+ f.handle = fileResponses[index].value.ID;
357
+ f.label = this.valueRef;
358
+ f.category = this.categoryName;
359
+ f.responseProps = {
360
+ pzInsKey: 'temp',
361
+ pyAttachName: f.props.name
362
+ };
484
363
  }
485
364
  });
486
- this.arFileList$ = this.myFiles.map(att => {
487
- if (att.id) {
488
- return att;
489
- }
490
- return this.getNewListUtilityItemProps({
491
- att,
492
- downloadFile: null,
493
- cancelFile: null,
494
- deleteFile: null,
495
- removeFile: null
496
- });
497
- });
498
- this.CheckForInvalidAttachment();
499
- this.bShowJustDelete$ = true;
500
- this.bLoading$ = false;
501
- });
502
- }
503
- }
504
- handleFileUploadFailure() {
505
- this.bShowJustDelete$ = true;
506
- this.bLoading$ = false;
507
- this.bShowSelector$ = this.allowMultiple$;
508
- this.myFiles.forEach(file => {
509
- if (file?.secondary?.error) {
510
- file.meta = 'File uploaded failed';
365
+ this.updateAttachments();
366
+ if (this.filesWithError?.length === 0) {
367
+ this.clearFieldErrorMessages();
368
+ }
511
369
  }
370
+ })
371
+ .catch(error => {
372
+ console.log(error);
512
373
  });
513
- this.arFileList$ = this.myFiles.map(att => {
514
- return this.getNewListUtilityItemProps({
515
- att,
516
- downloadFile: null,
517
- cancelFile: null,
518
- deleteFile: null,
519
- removeFile: null
520
- });
521
- });
522
- this.bShowJustDelete$ = true;
523
- this.bLoading$ = false;
524
374
  }
525
- onUploadProgress() { }
526
- getFiles(arFiles) {
527
- const files = this.allowMultiple$ ? arFiles : [arFiles[0]];
528
- return this.setNewFiles(files);
529
- }
530
- setNewFiles(arFiles) {
531
- let index = 0;
532
- const maxAttachmentSize = PCore.getEnvironmentInfo().getMaxAttachmentSize() || 5;
533
- for (const file of arFiles) {
534
- file.mimeType = file.type;
535
- file.icon = this.utils.getIconFromFileType(file.type);
536
- file.ID = `${new Date().getTime()}I${index}`;
537
- if (!this.validateMaxSize(file, maxAttachmentSize)) {
538
- file.error = true;
539
- file.meta = this.pConn$.getLocalizedValue('File is too big. Max allowed size is 5MB.', '', '');
540
- }
541
- else if (!this.validateFileExtension(file, this.extensions$)) {
542
- file.error = true;
543
- file.meta = `${this.pConn$.getLocalizedValue('File has invalid extension. Allowed extensions are:', '', '')} ${this.extensions$.replaceAll('.', '')}`;
544
- }
545
- if (file.error) {
546
- const fieldName = this.pConn$.getStateProps().value;
547
- const context = this.pConn$.getContextName();
548
- PCore.getMessageManager().addMessages({
549
- // @ts-ignore
550
- messages: [
551
- {
552
- type: 'error',
553
- message: this.pConn$.getLocalizedValue('Error with one or more files', '', '')
554
- }
555
- ],
556
- property: fieldName,
557
- pageReference: this.pConn$.getPageReference(),
558
- context
559
- });
560
- }
561
- index++;
375
+ ngOnDestroy() {
376
+ if (this.angularPConnectData.unsubscribeFn) {
377
+ this.angularPConnectData.unsubscribeFn();
562
378
  }
563
- return [...arFiles];
564
- }
565
- validateMaxSize(fileObj, maxSizeInMB) {
566
- const fileSize = (fileObj.size / 1048576).toFixed(2);
567
- return parseFloat(fileSize) < parseFloat(maxSizeInMB);
568
- }
569
- buildFilePropsFromResponse(respObj) {
570
- return {
571
- props: {
572
- meta: `${respObj.pyCategoryName}, ${respObj.pxCreateOperator}`,
573
- name: respObj.pyAttachName,
574
- icon: this.utils.getIconFromFileType(respObj.pyMimeFileExtension)
575
- },
576
- responseProps: {
577
- ...respObj
578
- }
579
- };
379
+ PCore.getPubSubUtils().unsubscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.caseID);
580
380
  }
581
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AttachmentComponent, deps: [{ token: i1.AngularPConnectService }, { token: i2.Utils }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
582
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AttachmentComponent, isStandalone: true, selector: "app-attachment", inputs: { pConn$: "pConn$", formGroup$: "formGroup$" }, ngImport: i0, template: "<div class=\"psdk-label-infix-readonly\" *ngIf=\"bVisible$\">\n <span class=\"psdk-label-wrapper-readonly\">\n <label [ngClass]=\"{ 'psdk-label-readonly': true, 'label-required': bRequired$ === true }\" [htmlFor]=\"att_valueRef\">{{ label$ }}</label>\n </span>\n <div\n [ngClass]=\"{ 'psdk-modal-file-selector': status !== 'error', 'psdk-modal-file-selector-error': status === 'error' }\"\n id=\"attachment-container\"\n *ngIf=\"bShowSelector$\"\n >\n <mat-spinner *ngIf=\"bLoading$\" class=\"progress-spinner\" diameter=\"40\"></mat-spinner>\n <input hidden type=\"file\" [required]=\"bRequired$\" #uploader [id]=\"att_valueRef\" [multiple]=\"allowMultiple$\" (change)=\"uploadMyFiles($event)\" />\n\n <button mat-stroked-button color=\"primary\" [disabled]=\"bDisabled$\" (click)=\"uploader.click()\">\n {{\n allowMultiple$\n ? uploadMultipleFilesLabel === 'file_upload_text_multiple'\n ? 'Choose files'\n : uploadMultipleFilesLabel\n : uploadSingleFileLabel === 'file_upload_text_one'\n ? 'Choose a file'\n : uploadSingleFileLabel\n }}\n </button>\n </div>\n <span *ngIf=\"validateMessage\" class=\"file-error\">{{ validateMessage }}</span>\n\n <div class=\"psdk-attachment-list\" *ngIf=\"arFileList$ != null && arFileList$.length > 0\">\n <div *ngFor=\"let attachment of arFileList$\">\n <component-mapper\n *ngIf=\"attachment.noDeleteIcon !== true; else showfull\"\n name=\"SummaryItem\"\n [props]=\"{ item$: attachment, menuIconOverride$: 'trash', menuIconOverrideAction$: removeFileFromList$ }\"\n ></component-mapper>\n <ng-template #showfull>\n <component-mapper name=\"SummaryItem\" [props]=\"{ item$: attachment, menuIconOverrideAction$: removeFileFromList$ }\"></component-mapper>\n </ng-template>\n </div>\n </div>\n</div>\n", styles: [".progress-spinner{text-align:center;position:absolute;left:45%}.psdk-modal-file-selector{border:1px dashed var(--app-neutral-dark-color);width:100%;padding:.3rem;text-align:center;position:relative}.label-required:after{display:inline;content:\" *\";vertical-align:top;color:var(--app-neutral-dark-color)}.file-error{color:var(--app-error-light-color)}.psdk-modal-file-selector-error{border:1px dashed var(--app-error-light-color);width:100%;padding:.3rem;text-align:center;position:relative}.psdk-full-width{width:100%}.psdk-label-readonly{opacity:54%;font-size:.8rem;font-weight:400}.psdk-data-readonly{padding-top:.625rem;width:100%}.psdk-attachment-list{border:1px solid var(--app-neutral-color)}::ng-deep .mat-mdc-form-field-infix{width:auto}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(function () { return CommonModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i3.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatProgressSpinnerModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i4.MatProgressSpinner; }), selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatButtonModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i5.MatButton; }), selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(function () { return ComponentMapperComponent; }), selector: "component-mapper", inputs: ["name", "props", "errorMsg", "outputEvents", "parent"] }] }); }
381
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AttachmentComponent, deps: [{ token: i1.AngularPConnectService }, { token: i2.Utils }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
382
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AttachmentComponent, isStandalone: true, selector: "app-attachment", inputs: { pConn$: "pConn$", formGroup$: "formGroup$" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["uploader"], descendants: true }], ngImport: i0, template: "<div class=\"file-upload-container\" *ngIf=\"bVisible$\">\n <span class=\"attachment-label\" [ngClass]=\"{ 'file-label': bRequired$ }\">{{ label$ }}</span>\n <div *ngIf=\"(files.length === 0 && !allowMultiple$) || allowMultiple$\">\n <div\n style=\"margin-bottom: 10px\"\n id=\"attachment-container\"\n [ngClass]=\"validateMessage ? 'psdk-modal-file-selector-error' : 'psdk-modal-file-selector'\"\n >\n <div [hidden]=\"true\" id=\"attachment-ID\">\n {{ valueRef }}\n </div>\n <input hidden type=\"file\" [required]=\"bRequired$\" #uploader [id]=\"valueRef\" [multiple]=\"allowMultiple$\" (change)=\"onFileAdded($event)\" />\n <button mat-stroked-button color=\"primary\" [disabled]=\"bDisabled$\" (click)=\"uploader.click()\">\n {{\n allowMultiple$\n ? uploadMultipleFilesLabel === 'file_upload_text_multiple'\n ? 'Choose files'\n : uploadMultipleFilesLabel\n : uploadSingleFileLabel === 'file_upload_text_one'\n ? 'Choose a file'\n : uploadSingleFileLabel\n }}\n </button>\n </div>\n </div>\n <span *ngIf=\"validateMessage\" class=\"file-error\">{{ validateMessage }}</span>\n <div *ngIf=\"files && files.length > 0\">\n <div *ngFor=\"let file of files\">\n <div class=\"psdk-attachment-card\">\n <div className=\"psdk-utility-card-icon\">\n <img *ngIf=\"!file.inProgress\" class=\"psdk-attachment-card-svg-icon\" src=\"{{ srcImg }}\" />\n <mat-spinner *ngIf=\"file.inProgress\" class=\"progress-spinner\" diameter=\"40\"></mat-spinner>\n </div>\n <div class=\"psdk-attachment-card-main\">\n <div class=\"psdk-attachment-card-main-primary-label\">{{ file.props.name }}</div>\n <div *ngIf=\"file.props.meta\" [ngStyle]=\"{ color: file.props.error ? 'red' : null }\">{{ file.props.meta }}</div>\n </div>\n <div class=\"psdk-attachment-action\">\n <button id=\"delete-attachment\" *ngIf=\"file.ID\" class=\"psdk-utility-button\" (click)=\"deleteFile(file)\">\n <img class=\"psdk-utility-card-action-svg-icon\" src=\"{{ deleteIcon }}\" />\n </button>\n <div *ngIf=\"!file.ID\">\n <button id=\"setting-button\" mat-icon-button [matMenuTriggerFor]=\"actionMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #actionMenu=\"matMenu\">\n <button mat-menu-item (click)=\"downloadFile(file.responseProps ? file.responseProps : {})\">Download</button>\n <button mat-menu-item (click)=\"deleteFile(file)\">Delete</button>\n </mat-menu>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".progress-spinner{text-align:center;position:absolute;left:45%}.psdk-modal-file-selector{border:1px dashed var(--app-neutral-dark-color);width:100%;padding:.3rem;text-align:center;position:relative}.psdk-modal-file-selector-error{border:1px dashed var(--app-error-light-color);width:100%;padding:.3rem;text-align:center;position:relative}.psdk-modal-file-selector{border:1px dashed var(--app-neutral-dark-color);padding:.5rem;text-align:center;position:relative}.label-required:after{display:inline;content:\" *\";vertical-align:top;color:var(--app-neutral-dark-color)}.file-error{color:var(--app-error-light-color)}.psdk-modal-file-selector-error{border:1px dashed var(--app-error-light-color);padding:.5rem;text-align:center;position:relative}.psdk-full-width{width:100%}.psdk-label-readonly{opacity:54%;font-size:.8rem;font-weight:400}.psdk-data-readonly{padding-top:.625rem;width:100%}.psdk-attachment-list{border:1px solid var(--app-neutral-color)}::ng-deep .mat-mdc-form-field-infix{width:auto}.psdk-attachment-card{display:flex;align-items:center;border:.0625rem solid rgb(207,207,207);border-radius:.25rem;padding:.25rem 0rem .25rem .25rem;min-height:3rem;margin-bottom:.5rem}.psdk-attachment-card-main-primary-label{font-weight:500;text-overflow:ellipsis;overflow:hidden;white-space:normal}.psdk-attachment-card-main{flex-grow:2;margin-left:5px}.psdk-attachment-action{flex-grow:1;text-align:right}.psdk-attachment-card-svg-icon{width:2.5rem}.psdk-utility-button{background:none;border:none;margin-right:.5rem;cursor:pointer}.psdk-utility-card-action-svg-icon{width:1.4rem;display:inline-block}.file-div{border:1px dashed var(--app-neutral-dark-color);width:100%;padding:.5rem;text-align:center;position:relative}.file-div-error{border:1px dashed var(--app-error-light-color);width:100%;padding:.5rem;text-align:center;position:relative}.attachment-label{display:block;margin-bottom:10px}.file-label:after{display:inline;content:\" *\";vertical-align:top;color:var(--app-neutral-dark-color)}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(() => CommonModule) }, { kind: "directive", type: i0.forwardRef(() => i3.NgClass), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(() => i3.NgForOf), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(() => i3.NgIf), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i0.forwardRef(() => i3.NgStyle), selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatProgressSpinnerModule) }, { kind: "component", type: i0.forwardRef(() => i4.MatProgressSpinner), selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatMenuModule) }, { kind: "component", type: i0.forwardRef(() => i5.MatMenu), selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i0.forwardRef(() => i5.MatMenuItem), selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i0.forwardRef(() => i5.MatMenuTrigger), selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatIconModule) }, { kind: "component", type: i0.forwardRef(() => i6.MatIcon), selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatButtonModule) }, { kind: "component", type: i0.forwardRef(() => i7.MatButton), selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(() => i7.MatIconButton), selector: "button[mat-icon-button]", exportAs: ["matButton"] }] }); }
583
383
  }
584
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AttachmentComponent, decorators: [{
384
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AttachmentComponent, decorators: [{
585
385
  type: Component,
586
- args: [{ selector: 'app-attachment', standalone: true, imports: [CommonModule, MatProgressSpinnerModule, MatButtonModule, forwardRef(() => ComponentMapperComponent)], template: "<div class=\"psdk-label-infix-readonly\" *ngIf=\"bVisible$\">\n <span class=\"psdk-label-wrapper-readonly\">\n <label [ngClass]=\"{ 'psdk-label-readonly': true, 'label-required': bRequired$ === true }\" [htmlFor]=\"att_valueRef\">{{ label$ }}</label>\n </span>\n <div\n [ngClass]=\"{ 'psdk-modal-file-selector': status !== 'error', 'psdk-modal-file-selector-error': status === 'error' }\"\n id=\"attachment-container\"\n *ngIf=\"bShowSelector$\"\n >\n <mat-spinner *ngIf=\"bLoading$\" class=\"progress-spinner\" diameter=\"40\"></mat-spinner>\n <input hidden type=\"file\" [required]=\"bRequired$\" #uploader [id]=\"att_valueRef\" [multiple]=\"allowMultiple$\" (change)=\"uploadMyFiles($event)\" />\n\n <button mat-stroked-button color=\"primary\" [disabled]=\"bDisabled$\" (click)=\"uploader.click()\">\n {{\n allowMultiple$\n ? uploadMultipleFilesLabel === 'file_upload_text_multiple'\n ? 'Choose files'\n : uploadMultipleFilesLabel\n : uploadSingleFileLabel === 'file_upload_text_one'\n ? 'Choose a file'\n : uploadSingleFileLabel\n }}\n </button>\n </div>\n <span *ngIf=\"validateMessage\" class=\"file-error\">{{ validateMessage }}</span>\n\n <div class=\"psdk-attachment-list\" *ngIf=\"arFileList$ != null && arFileList$.length > 0\">\n <div *ngFor=\"let attachment of arFileList$\">\n <component-mapper\n *ngIf=\"attachment.noDeleteIcon !== true; else showfull\"\n name=\"SummaryItem\"\n [props]=\"{ item$: attachment, menuIconOverride$: 'trash', menuIconOverrideAction$: removeFileFromList$ }\"\n ></component-mapper>\n <ng-template #showfull>\n <component-mapper name=\"SummaryItem\" [props]=\"{ item$: attachment, menuIconOverrideAction$: removeFileFromList$ }\"></component-mapper>\n </ng-template>\n </div>\n </div>\n</div>\n", styles: [".progress-spinner{text-align:center;position:absolute;left:45%}.psdk-modal-file-selector{border:1px dashed var(--app-neutral-dark-color);width:100%;padding:.3rem;text-align:center;position:relative}.label-required:after{display:inline;content:\" *\";vertical-align:top;color:var(--app-neutral-dark-color)}.file-error{color:var(--app-error-light-color)}.psdk-modal-file-selector-error{border:1px dashed var(--app-error-light-color);width:100%;padding:.3rem;text-align:center;position:relative}.psdk-full-width{width:100%}.psdk-label-readonly{opacity:54%;font-size:.8rem;font-weight:400}.psdk-data-readonly{padding-top:.625rem;width:100%}.psdk-attachment-list{border:1px solid var(--app-neutral-color)}::ng-deep .mat-mdc-form-field-infix{width:auto}\n"] }]
587
- }], ctorParameters: function () { return [{ type: i1.AngularPConnectService }, { type: i2.Utils }, { type: i0.NgZone }]; }, propDecorators: { pConn$: [{
386
+ args: [{ selector: 'app-attachment', standalone: true, imports: [CommonModule, MatProgressSpinnerModule, MatMenuModule, MatIconModule, MatButtonModule, forwardRef(() => ComponentMapperComponent)], template: "<div class=\"file-upload-container\" *ngIf=\"bVisible$\">\n <span class=\"attachment-label\" [ngClass]=\"{ 'file-label': bRequired$ }\">{{ label$ }}</span>\n <div *ngIf=\"(files.length === 0 && !allowMultiple$) || allowMultiple$\">\n <div\n style=\"margin-bottom: 10px\"\n id=\"attachment-container\"\n [ngClass]=\"validateMessage ? 'psdk-modal-file-selector-error' : 'psdk-modal-file-selector'\"\n >\n <div [hidden]=\"true\" id=\"attachment-ID\">\n {{ valueRef }}\n </div>\n <input hidden type=\"file\" [required]=\"bRequired$\" #uploader [id]=\"valueRef\" [multiple]=\"allowMultiple$\" (change)=\"onFileAdded($event)\" />\n <button mat-stroked-button color=\"primary\" [disabled]=\"bDisabled$\" (click)=\"uploader.click()\">\n {{\n allowMultiple$\n ? uploadMultipleFilesLabel === 'file_upload_text_multiple'\n ? 'Choose files'\n : uploadMultipleFilesLabel\n : uploadSingleFileLabel === 'file_upload_text_one'\n ? 'Choose a file'\n : uploadSingleFileLabel\n }}\n </button>\n </div>\n </div>\n <span *ngIf=\"validateMessage\" class=\"file-error\">{{ validateMessage }}</span>\n <div *ngIf=\"files && files.length > 0\">\n <div *ngFor=\"let file of files\">\n <div class=\"psdk-attachment-card\">\n <div className=\"psdk-utility-card-icon\">\n <img *ngIf=\"!file.inProgress\" class=\"psdk-attachment-card-svg-icon\" src=\"{{ srcImg }}\" />\n <mat-spinner *ngIf=\"file.inProgress\" class=\"progress-spinner\" diameter=\"40\"></mat-spinner>\n </div>\n <div class=\"psdk-attachment-card-main\">\n <div class=\"psdk-attachment-card-main-primary-label\">{{ file.props.name }}</div>\n <div *ngIf=\"file.props.meta\" [ngStyle]=\"{ color: file.props.error ? 'red' : null }\">{{ file.props.meta }}</div>\n </div>\n <div class=\"psdk-attachment-action\">\n <button id=\"delete-attachment\" *ngIf=\"file.ID\" class=\"psdk-utility-button\" (click)=\"deleteFile(file)\">\n <img class=\"psdk-utility-card-action-svg-icon\" src=\"{{ deleteIcon }}\" />\n </button>\n <div *ngIf=\"!file.ID\">\n <button id=\"setting-button\" mat-icon-button [matMenuTriggerFor]=\"actionMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #actionMenu=\"matMenu\">\n <button mat-menu-item (click)=\"downloadFile(file.responseProps ? file.responseProps : {})\">Download</button>\n <button mat-menu-item (click)=\"deleteFile(file)\">Delete</button>\n </mat-menu>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".progress-spinner{text-align:center;position:absolute;left:45%}.psdk-modal-file-selector{border:1px dashed var(--app-neutral-dark-color);width:100%;padding:.3rem;text-align:center;position:relative}.psdk-modal-file-selector-error{border:1px dashed var(--app-error-light-color);width:100%;padding:.3rem;text-align:center;position:relative}.psdk-modal-file-selector{border:1px dashed var(--app-neutral-dark-color);padding:.5rem;text-align:center;position:relative}.label-required:after{display:inline;content:\" *\";vertical-align:top;color:var(--app-neutral-dark-color)}.file-error{color:var(--app-error-light-color)}.psdk-modal-file-selector-error{border:1px dashed var(--app-error-light-color);padding:.5rem;text-align:center;position:relative}.psdk-full-width{width:100%}.psdk-label-readonly{opacity:54%;font-size:.8rem;font-weight:400}.psdk-data-readonly{padding-top:.625rem;width:100%}.psdk-attachment-list{border:1px solid var(--app-neutral-color)}::ng-deep .mat-mdc-form-field-infix{width:auto}.psdk-attachment-card{display:flex;align-items:center;border:.0625rem solid rgb(207,207,207);border-radius:.25rem;padding:.25rem 0rem .25rem .25rem;min-height:3rem;margin-bottom:.5rem}.psdk-attachment-card-main-primary-label{font-weight:500;text-overflow:ellipsis;overflow:hidden;white-space:normal}.psdk-attachment-card-main{flex-grow:2;margin-left:5px}.psdk-attachment-action{flex-grow:1;text-align:right}.psdk-attachment-card-svg-icon{width:2.5rem}.psdk-utility-button{background:none;border:none;margin-right:.5rem;cursor:pointer}.psdk-utility-card-action-svg-icon{width:1.4rem;display:inline-block}.file-div{border:1px dashed var(--app-neutral-dark-color);width:100%;padding:.5rem;text-align:center;position:relative}.file-div-error{border:1px dashed var(--app-error-light-color);width:100%;padding:.5rem;text-align:center;position:relative}.attachment-label{display:block;margin-bottom:10px}.file-label:after{display:inline;content:\" *\";vertical-align:top;color:var(--app-neutral-dark-color)}\n"] }]
387
+ }], ctorParameters: () => [{ type: i1.AngularPConnectService }, { type: i2.Utils }, { type: i0.NgZone }], propDecorators: { pConn$: [{
588
388
  type: Input
589
389
  }], formGroup$: [{
590
390
  type: Input
391
+ }], fileInput: [{
392
+ type: ViewChild,
393
+ args: ['uploader', { static: false }]
591
394
  }] } });
592
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvd2lkZ2V0L2F0dGFjaG1lbnQvYXR0YWNobWVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvd2lkZ2V0L2F0dGFjaG1lbnQvYXR0YWNobWVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBVSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFFeEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM5RSxPQUFPLFFBQVEsTUFBTSxZQUFZLENBQUM7QUFHbEMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOERBQThELENBQUM7Ozs7Ozs7QUFpQnhHLE1BQU0sT0FBTyxtQkFBbUI7SUFvQzlCLFlBQ1UsZUFBdUMsRUFDdkMsS0FBWSxFQUNaLE1BQWM7UUFGZCxvQkFBZSxHQUFmLGVBQWUsQ0FBd0I7UUFDdkMsVUFBSyxHQUFMLEtBQUssQ0FBTztRQUNaLFdBQU0sR0FBTixNQUFNLENBQVE7UUFuQ3hCLHVDQUF1QztRQUN2Qyx3QkFBbUIsR0FBd0IsRUFBRSxDQUFDO1FBRTlDLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFFWixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixj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QU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQWNELDBCQUEwQixDQUFDLE9BQU87UUFDaEMsT0FBTztZQUNMLEtBQUssRUFBRTtnQkFDTCxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsY0FBYyxLQUFLLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDOUQsSUFBSSxFQUFFLE9BQU8sQ0FBQyxZQUFZO2dCQUMxQixJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUM7YUFDbEU7WUFDRCxhQUFhLEVBQUU7Z0JBQ2IsR0FBRyxPQUFPO2FBQ1g7U0FDRixDQUFDO0lBQ0osQ0FBQzsrR0F6cUJVLG1CQUFtQjttR0FBbkIsbUJBQW1CLGtJQ3pCaEMsZzNEQXVDQSx5MEJEaEJZLFlBQVkseWZBQUUsd0JBQXdCLGdUQUFFLGVBQWUsMFZBQW1CLHdCQUF3Qjs7NEZBRWpHLG1CQUFtQjtrQkFQL0IsU0FBUzsrQkFDRSxnQkFBZ0IsY0FHZCxJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsd0JBQXdCLEVBQUUsZUFBZSxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO3NKQUdyRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgTmdab25lLCBmb3J3YXJkUmVmLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XG5pbXBvcnQgZG93bmxvYWQgZnJvbSAnZG93bmxvYWRqcyc7XG5pbXBvcnQgeyBBbmd1bGFyUENvbm5lY3REYXRhLCBBbmd1bGFyUENvbm5lY3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vX2JyaWRnZS9hbmd1bGFyLXBjb25uZWN0JztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vX2hlbHBlcnMvdXRpbHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50TWFwcGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vX2JyaWRnZS9jb21wb25lbnQtbWFwcGVyL2NvbXBvbmVudC1tYXBwZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFBDb25uRmllbGRQcm9wcyB9IGZyb20gJy4uLy4uLy4uL190eXBlcy9QQ29ublByb3BzLmludGVyZmFjZSc7XG5cbmludGVyZmFjZSBBdHRhY2htZW50UHJvcHMgZXh0ZW5kcyBPbWl0PFBDb25uRmllbGRQcm9wcywgJ3ZhbHVlJz4ge1xuICAvLyBJZiBhbnksIGVudGVyIGFkZGl0aW9uYWwgcHJvcHMgdGhhdCBvbmx5IGV4aXN0IG9uIHRoaXMgY29tcG9uZW50XG4gIHZhbHVlOiBhbnk7XG4gIGV4dGVuc2lvbnM6IGFueTtcbiAgYWxsb3dNdWx0aXBsZTogYm9vbGVhbjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWF0dGFjaG1lbnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vYXR0YWNobWVudC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2F0dGFjaG1lbnQuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIGZvcndhcmRSZWYoKCkgPT4gQ29tcG9uZW50TWFwcGVyQ29tcG9uZW50KV1cbn0pXG5leHBvcnQgY2xhc3MgQXR0YWNobWVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgcENvbm4kOiB0eXBlb2YgUENvbm5lY3Q7XG4gIEBJbnB1dCgpIGZvcm1Hcm91cCQ6IEZvcm1Hcm91cDtcblxuICAvLyBGb3IgaW50ZXJhY3Rpb24gd2l0aCBBbmd1bGFyUENvbm5lY3RcbiAgYW5ndWxhclBDb25uZWN0RGF0YTogQW5ndWxhclBDb25uZWN0RGF0YSA9IHt9O1xuXG4gIGxhYmVsJCA9ICcnO1xuICB2YWx1ZSQ6IGFueTtcbiAgYlJlcXVpcmVkJCA9IGZhbHNlO1xuICBiUmVhZG9ubHkkID0gZmFsc2U7XG4gIGJEaXNhYmxlZCQgPSBmYWxzZTtcbiAgYlZpc2libGUkID0gdHJ1ZTtcbiAgYkxvYWRpbmckID0gZmFsc2U7XG4gIGFyRmlsZXMkOiBhbnlbXSA9IFtdO1xuICBhckZpbGVMaXN0JDogYW55W10gPSBbXTtcbiAgcmVtb3ZlRmlsZUZyb21MaXN0JDogYW55O1xuICBhck1lbnVMaXN0JDogYW55W10gPSBbXTtcbiAgYlNob3dTZWxlY3RvciQgPSB0cnVlO1xuICBiU2hvd0p1c3REZWxldGUkID0gZmFsc2U7XG4gIGF0dF92YWx1ZVJlZjogYW55O1xuICBhdHRfY2F0ZWdvcnlOYW1lOiBzdHJpbmc7XG4gIGF0dF9pZDogc3RyaW5nO1xuICBteUZpbGVzOiBhbnk7XG4gIGZpbGVUZW1wOiBhbnkgPSB7fTtcbiAgY2FzZUlEOiBhbnk7XG4gIGFsbG93TXVsdGlwbGUkID0gZmFsc2U7XG4gIGV4dGVuc2lvbnMkID0gJyc7XG4gIHN0YXR1cyA9ICcnO1xuICB2YWxpZGF0ZU1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCA9ICcnO1xuICB2YWx1ZVJlZjogc3RyaW5nO1xuICBpbWFnZVBhdGgkOiBzdHJpbmc7XG4gIGxvY2FsaXplZFZhbCA9IFBDb3JlLmdldExvY2FsZVV0aWxzKCkuZ2V0TG9jYWxlVmFsdWU7XG4gIGxvY2FsZUNhdGVnb3J5ID0gJ0Nvc21vc0ZpZWxkcyc7XG4gIHVwbG9hZE11bHRpcGxlRmlsZXNMYWJlbCA9IHRoaXMubG9jYWxpemVkVmFsKCdmaWxlX3VwbG9hZF90ZXh0X211bHRpcGxlJywgdGhpcy5sb2NhbGVDYXRlZ29yeSk7XG4gIHVwbG9hZFNpbmdsZUZpbGVMYWJlbCA9IHRoaXMubG9jYWxpemVkVmFsKCdmaWxlX3VwbG9hZF90ZXh0X29uZScsIHRoaXMubG9jYWxlQ2F0ZWdvcnkpO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFuZ3VsYXJQQ29ubmVjdDogQW5ndWxhclBDb25uZWN0U2VydmljZSxcbiAgICBwcml2YXRlIHV0aWxzOiBVdGlscyxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyAvLyBGaXJzdCB0aGluZyBpbiBpbml0aWFsaXphdGlvbiBpcyByZWdpc3RlcmluZyBhbmQgc3Vic2NyaWJpbmcgdG8gdGhlIEFuZ3VsYXJQQ29ubmVjdCBzZXJ2aWNlXG4gICAgdGhpcy5hbmd1bGFyUENvbm5lY3REYXRhID0gdGhpcy5hbmd1bGFyUENvbm5lY3QucmVnaXN0ZXJBbmRTdWJzY3JpYmVDb21wb25lbnQodGhpcywgdGhpcy5vblN0YXRlQ2hhbmdlKTtcblxuICAgIHRoaXMucmVtb3ZlRmlsZUZyb21MaXN0JCA9IHsgb25DbGljazogdGhpcy5fcmVtb3ZlRmlsZUZyb21MaXN0LmJpbmQodGhpcykgfTtcblxuICAgIHRoaXMuY2FzZUlEID0gUENvcmUuZ2V0U3RvcmVWYWx1ZSgnLnB5SUQnLCAnY2FzZUluZm8uY29udGVudCcsIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCkpO1xuXG4gICAgLy8gbGV0IGNvbmZpZ1Byb3BzOiBhbnkgPSB0aGlzLnBDb25uJC5yZXNvbHZlQ29uZmlnUHJvcHModGhpcy5wQ29ubiQuZ2V0Q29uZmlnUHJvcHMoKSk7XG4gICAgdGhpcy5jaGVja0FuZFVwZGF0ZSgpO1xuICB9XG5cbiAgY2hlY2tBbmRVcGRhdGUoKSB7XG4gICAgLy8gU2hvdWxkIGFsd2F5cyBjaGVjayB0aGUgYnJpZGdlIHRvIHNlZSBpZiB0aGUgY29tcG9uZW50IHNob3VsZFxuICAgIC8vIHVwZGF0ZSBpdHNlbGYgKHJlLXJlbmRlcilcbiAgICBjb25zdCBiVXBkYXRlU2VsZiA9IHRoaXMuYW5ndWxhclBDb25uZWN0LnNob3VsZENvbXBvbmVudFVwZGF0ZSh0aGlzKTtcblxuICAgIC8vIE9OTFkgY2FsbCB1cGRhdGVTZWxmIHdoZW4gdGhlIGNvbXBvbmVudCBzaG91bGQgdXBkYXRlXG4gICAgaWYgKGJVcGRhdGVTZWxmKSB7XG4gICAgICB0aGlzLnVwZGF0ZVNlbGYoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hbmd1bGFyUENvbm5lY3REYXRhLnVuc3Vic2NyaWJlRm4pIHtcbiAgICAgIHRoaXMuYW5ndWxhclBDb25uZWN0RGF0YS51bnN1YnNjcmliZUZuKCk7XG4gICAgfVxuXG4gICAgUENvcmUuZ2V0UHViU3ViVXRpbHMoKS51bnN1YnNjcmliZShQQ29yZS5nZXRDb25zdGFudHMoKS5QVUJfU1VCX0VWRU5UUy5DQVNFX0VWRU5UUy5BU1NJR05NRU5UX1NVQk1JU1NJT04sIHRoaXMuY2FzZUlEKTtcbiAgfVxuXG4gIC8vIENhbGxiYWNrIHBhc3NlZCB3aGVuIHN1YnNjcmliaW5nIHRvIHN0b3JlIGNoYW5nZVxuICBvblN0YXRlQ2hhbmdlKCkge1xuICAgIHRoaXMuY2hlY2tBbmRVcGRhdGUoKTtcbiAgfVxuXG4gIHVwZGF0ZUF0dGFjaG1lbnRzSW5mbygpIHtcbiAgICAvLyBAdHMtaWdub3JlIC0gUHJvcGVydHkgJ2F0dGFjaG1lbnRzSW5mbycgZG9lcyBub3QgZXhpc3Qgb24gdHlwZSAnQzExbkVudidcbiAgICBpZiAoIXRoaXMucENvbm4kLmF0dGFjaG1lbnRzSW5mbykge1xuICAgICAgLy8gQHRzLWlnbm9yZSAtIFByb3BlcnR5ICdhdHRhY2htZW50c0luZm8nIGRvZXMgbm90IGV4aXN0IG9uIHR5cGUgJ0MxMW5FbnYnXG4gICAgICB0aGlzLnBDb25uJC5hdHRhY2htZW50c0luZm8gPSB7XG4gICAgICAgIHR5cGU6ICdGaWxlJyxcbiAgICAgICAgYXR0YWNobWVudEZpZWxkTmFtZTogdGhpcy5hdHRfdmFsdWVSZWYsXG4gICAgICAgIGNhdGVnb3J5OiB0aGlzLmF0dF9jYXRlZ29yeU5hbWVcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJvY2Vzc0ZpbGUoZmlsZSwgaSkge1xuICAgIGZpbGUucHJvcHMudHlwZSA9IGZpbGUucmVzcG9uc2VQcm9wcy5weU1pbWVGaWxlRXh0ZW5zaW9uO1xuICAgIGZpbGUucHJvcHMubWltZVR5cGUgPSBmaWxlLnJlc3BvbnNlUHJvcHMucHlNaW1lRmlsZUV4dGVuc2lvbjtcbiAgICBmaWxlLnByb3BzLklEID0gZmlsZS5yZXNwb25zZVByb3BzLnB6SW5zS2V5O1xuXG4gICAgY29uc3QgYXJNZW51TGlzdCA9IFtcbiAgICAgIHtcbiAgICAgICAgaWNvbjogJ2Rvd25sb2FkJyxcbiAgICAgICAgdGV4dDogdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ0Rvd25sb2FkJywgJycsICcnKSxcbiAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5fZG93bmxvYWRGaWxlRnJvbUxpc3QodGhpcy52YWx1ZSQucHhSZXN1bHRzW2ldKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWNvbjogJ3RyYXNoJyxcbiAgICAgICAgdGV4dDogdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ0RlbGV0ZScsICcnLCAnJyksXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHRoaXMuX3JlbW92ZUZpbGVGcm9tTGlzdCh0aGlzLmFyRmlsZUxpc3QkW2ldKVxuICAgICAgfVxuICAgIF07XG5cbiAgICBjb25zdCBhckZpbGVzQXR0YWNobWVudElEczogYW55ID0gW107XG4gICAgdGhpcy5hckZpbGVMaXN0JC5mb3JFYWNoKGFyRmlsZSA9PiB7XG4gICAgICBhckZpbGVzQXR0YWNobWVudElEcy5wdXNoKGFyRmlsZS5pZCk7XG4gICAgfSk7XG5cbiAgICBpZiAoIWFyRmlsZXNBdHRhY2htZW50SURzLmluY2x1ZGVzKGZpbGUucHJvcHMuSUQpKSB7XG4gICAgICB0aGlzLmFyRmlsZUxpc3QkLnB1c2goXG4gICAgICAgIHRoaXMuZ2V0TmV3TGlzdFV0aWxpdHlJdGVtUHJvcHMoe1xuICAgICAgICAgIGF0dDogZmlsZS5wcm9wcyxcbiAgICAgICAgICBkb3dubG9hZEZpbGU6IG51bGwsXG4gICAgICAgICAgY2FuY2VsRmlsZTogbnVsbCxcbiAgICAgICAgICBkZWxldGVGaWxlOiBudWxsLFxuICAgICAgICAgIHJlbW92ZUZpbGU6IG51bGxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5hckZpbGVMaXN0JFtpXS5hY3Rpb25zID0gYXJNZW51TGlzdDtcbiAgICB0aGlzLmFyRmlsZUxpc3QkW2ldLm5vRGVsZXRlSWNvbiA9IHRydWU7XG5cbiAgICB0aGlzLmJTaG93U2VsZWN0b3IkID0gZmFsc2U7XG4gIH1cblxuICB1cGRhdGVTZWxmKCkge1xuICAgIGNvbnN0IGNvbmZpZ1Byb3BzOiBBdHRhY2htZW50UHJvcHMgPSB0aGlzLnBDb25uJC5yZXNvbHZlQ29uZmlnUHJvcHModGhpcy5wQ29ubiQuZ2V0Q29uZmlnUHJvcHMoKSkgYXMgQXR0YWNobWVudFByb3BzO1xuICAgIGNvbnN0IHN0YXRlUHJvcHM6IGFueSA9IHRoaXMucENvbm4kLmdldFN0YXRlUHJvcHMoKTtcblxuICAgIGNvbnN0IHsgdmFsdWUsIGxhYmVsLCBleHRlbnNpb25zIH0gPSBjb25maWdQcm9wcztcblxuICAgIGlmIChjb25maWdQcm9wcy5yZXF1aXJlZCAhPSBudWxsKSB7XG4gICAgICB0aGlzLmJSZXF1aXJlZCQgPSB0aGlzLnV0aWxzLmdldEJvb2xlYW5WYWx1ZShjb25maWdQcm9wcy5yZXF1aXJlZCk7XG4gICAgfVxuICAgIGlmIChjb25maWdQcm9wcy52aXNpYmlsaXR5ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYlZpc2libGUkID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUoY29uZmlnUHJvcHMudmlzaWJpbGl0eSk7XG4gICAgfVxuXG4gICAgLy8gZGlzYWJsZWRcbiAgICBpZiAoY29uZmlnUHJvcHMuZGlzYWJsZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmJEaXNhYmxlZCQgPSB0aGlzLnV0aWxzLmdldEJvb2xlYW5WYWx1ZShjb25maWdQcm9wcy5kaXNhYmxlZCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZ1Byb3BzLnJlYWRPbmx5ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYlJlYWRvbmx5JCA9IHRoaXMudXRpbHMuZ2V0Qm9vbGVhblZhbHVlKGNvbmZpZ1Byb3BzLnJlYWRPbmx5KTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnUHJvcHMuYWxsb3dNdWx0aXBsZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmFsbG93TXVsdGlwbGUkID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUoY29uZmlnUHJvcHMuYWxsb3dNdWx0aXBsZSk7XG4gICAgfVxuXG4gICAgdGhpcy5iU2hvd0p1c3REZWxldGUkID0gdHJ1ZTtcbiAgICB0aGlzLmxhYmVsJCA9IGxhYmVsO1xuICAgIHRoaXMudmFsdWUkID0gdmFsdWU7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0ZVByb3BzLnN0YXR1cztcbiAgICB0aGlzLnZhbGlkYXRlTWVzc2FnZSA9IHRoaXMuYW5ndWxhclBDb25uZWN0RGF0YS52YWxpZGF0ZU1lc3NhZ2U7XG4gICAgdGhpcy5leHRlbnNpb25zJCA9IGV4dGVuc2lvbnM7XG4gICAgdGhpcy52YWx1ZVJlZiA9ICh0aGlzLnBDb25uJC5nZXRTdGF0ZVByb3BzKCkgYXMgYW55KS52YWx1ZTtcbiAgICB0aGlzLnZhbHVlUmVmID0gdGhpcy52YWx1ZVJlZi5zdGFydHNXaXRoKCcuJykgPyB0aGlzLnZhbHVlUmVmLnN1YnN0cmluZygxKSA6IHRoaXMudmFsdWVSZWY7XG5cbiAgICAvKiB0aGlzIGlzIGEgdGVtcG9yYXJ5IGZpeCBiZWNhdXNlIHJlcXVpcmVkIGlzIHN1cHBvc2VkIHRvIGJlIHBhc3NlZCBhcyBhIGJvb2xlYW4gYW5kIE5PVCBhcyBhIHN0cmluZyAqL1xuICAgIGxldCB7IHJlcXVpcmVkLCBkaXNhYmxlZCB9ID0gY29uZmlnUHJvcHM7XG4gICAgW3JlcXVpcmVkLCBkaXNhYmxlZF0gPSBbcmVxdWlyZWQsIGRpc2FibGVkXS5tYXAocHJvcCA9PiBwcm9wID09PSB0cnVlIHx8ICh0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycgJiYgcHJvcCA9PT0gJ3RydWUnKSk7XG5cbiAgICB0aGlzLmF0dF9jYXRlZ29yeU5hbWUgPSAnJztcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUucHlDYXRlZ29yeU5hbWUpIHtcbiAgICAgIHRoaXMuYXR0X2NhdGVnb3J5TmFtZSA9IHZhbHVlLnB5Q2F0ZWdvcnlOYW1lO1xuICAgIH1cblxuICAgIHRoaXMuYXR0X3ZhbHVlUmVmID0gKHRoaXMucENvbm4kLmdldFN0YXRlUHJvcHMoKSBhcyBhbnkpLnZhbHVlO1xuICAgIHRoaXMuYXR0X3ZhbHVlUmVmID0gdGhpcy5hdHRfdmFsdWVSZWYuaW5kZXhPZignLicpID09PSAwID8gdGhpcy5hdHRfdmFsdWVSZWYuc3Vic3RyaW5nKDEpIDogdGhpcy5hdHRfdmFsdWVSZWY7XG5cbiAgICB0aGlzLnVwZGF0ZUF0dGFjaG1lbnRzKCk7XG4gIH1cblxuICB1cGRhdGVBdHRhY2htZW50cygpIHtcbiAgICBjb25zdCBhdHRhY2htZW50c0Zyb21TZXJ2ZXIgPSB0aGlzLnZhbHVlJCAmJiB0aGlzLnZhbHVlJC5weFJlc3VsdHMgJiYgK3RoaXMudmFsdWUkLnB5Q291bnQgPiAwO1xuXG4gICAgaWYgKGF0dGFjaG1lbnRzRnJvbVNlcnZlcikge1xuICAgICAgdGhpcy51cGRhdGVBdHRhY2htZW50c0Zyb21TZXJ2ZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gR2V0IHRoZSBhdHRhY2htZW50cyBmcm9tIHRoZSBSZWR1eFxuICAgICAgdGhpcy5teUZpbGVzID0gdGhpcy5nZXRDdXJyZW50QXR0YWNobWVudHNMaXN0KHRoaXMuZ2V0QXR0YWNobWVudEtleSh0aGlzLmF0dF92YWx1ZVJlZiksIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCkpO1xuXG4gICAgICBpZiAodGhpcy5teUZpbGVzPy5sZW5ndGggJiYgdGhpcy5hckZpbGVzJC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5hckZpbGVMaXN0JCA9IHRoaXMubXlGaWxlcy5tYXAoYXR0ID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXROZXdMaXN0VXRpbGl0eUl0ZW1Qcm9wcyh7XG4gICAgICAgICAgICBhdHQsXG4gICAgICAgICAgICBkb3dubG9hZEZpbGU6IG51bGwsXG4gICAgICAgICAgICBjYW5jZWxGaWxlOiBudWxsLFxuICAgICAgICAgICAgZGVsZXRlRmlsZTogbnVsbCxcbiAgICAgICAgICAgIHJlbW92ZUZpbGU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG15RmlsZXNBdHRhY2htZW50SURzOiBhbnkgPSBbXTtcbiAgICAgIHRoaXMubXlGaWxlcy5mb3JFYWNoKG15RmlsZSA9PiB7XG4gICAgICAgIG15RmlsZXNBdHRhY2htZW50SURzLnB1c2gobXlGaWxlLklEKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmFyRmlsZXMkLmZvckVhY2goYXJGaWxlID0+IHtcbiAgICAgICAgaWYgKCFteUZpbGVzQXR0YWNobWVudElEcy5pbmNsdWRlcyhhckZpbGUuSUQpKSB7XG4gICAgICAgICAgdGhpcy5teUZpbGVzID0gWy4uLnRoaXMubXlGaWxlcywgYXJGaWxlXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5iU2hvd0p1c3REZWxldGUkID0gdHJ1ZTtcbiAgICB0aGlzLmJTaG93U2VsZWN0b3IkID0gISh0aGlzLmFyRmlsZUxpc3QkPy5sZW5ndGggPiAwKSB8fCB0aGlzLmFsbG93TXVsdGlwbGUkO1xuXG4gICAgaWYgKHRoaXMuYXJGaWxlTGlzdCQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5DaGVja0ZvckludmFsaWRBdHRhY2htZW50KCk7XG4gICAgfVxuICAgIFBDb3JlLmdldFB1YlN1YlV0aWxzKCkuc3Vic2NyaWJlKFxuICAgICAgUENvcmUuZ2V0Q29uc3RhbnRzKCkuUFVCX1NVQl9FVkVOVFMuQ0FTRV9FVkVOVFMuQVNTSUdOTUVOVF9TVUJNSVNTSU9OLFxuICAgICAgdGhpcy5yZXNldEF0dGFjaG1lbnRTdG9yZWRTdGF0ZS5iaW5kKHRoaXMpLFxuICAgICAgdGhpcy5jYXNlSURcbiAgICApO1xuICB9XG5cbiAgdXBkYXRlQXR0YWNobWVudHNGcm9tU2VydmVyKCkge1xuICAgIHRoaXMudmFsdWUkLnB4UmVzdWx0cy5mb3JFYWNoKChhdHRhY2htZW50LCBpKSA9PiB7XG4gICAgICBjb25zdCBmaWxlOiBhbnkgPSB0aGlzLmJ1aWxkRmlsZVByb3BzRnJvbVJlc3BvbnNlKGF0dGFjaG1lbnQpO1xuICAgICAgaWYgKGZpbGUucmVzcG9uc2VQcm9wcykge1xuICAgICAgICB0aGlzLnVwZGF0ZUF0dGFjaG1lbnRzSW5mbygpO1xuICAgICAgICBpZiAoZmlsZS5yZXNwb25zZVByb3BzLnB6SW5zS2V5ICYmICFmaWxlLnJlc3BvbnNlUHJvcHMucHpJbnNLZXkuaW5jbHVkZXMoJ3RlbXAnKSkge1xuICAgICAgICAgIHRoaXMucHJvY2Vzc0ZpbGUoZmlsZSwgaSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50QXR0YWNobWVudExpc3QgPSB0aGlzLmdldEN1cnJlbnRBdHRhY2htZW50c0xpc3QodGhpcy5nZXRBdHRhY2htZW50S2V5KHRoaXMuYXR0X3ZhbHVlUmVmKSwgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSk7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBjdXJyZW50QXR0YWNobWVudExpc3QuZmluZEluZGV4KGVsZW1lbnQgPT4gZWxlbWVudC5wcm9wcy5JRCA9PT0gZmlsZS5wcm9wcy5JRCk7XG4gICAgICAgICAgbGV0IHRlbXBGaWxlczogYW55ID0gW107XG4gICAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgICAgdGVtcEZpbGVzID0gW2ZpbGVdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIFBDb3JlLmdldFN0YXRlVXRpbHMoKS51cGRhdGVTdGF0ZShcbiAgICAgICAgICAgIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCksXG4gICAgICAgICAgICB0aGlzLmdldEF0dGFjaG1lbnRLZXkodGhpcy5hdHRfdmFsdWVSZWYpLFxuICAgICAgICAgICAgWy4uLmN1cnJlbnRBdHRhY2htZW50TGlzdCwgLi4udGVtcEZpbGVzXSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcGFnZVJlZmVyZW5jZTogJ2NvbnRleHRfZGF0YScsXG4gICAgICAgICAgICAgIGlzQXJyYXlEZWVwTWVyZ2U6IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVzZXRBdHRhY2htZW50U3RvcmVkU3RhdGUoKSB7XG4gICAgUENvcmUuZ2V0U3RhdGVVdGlscygpLnVwZGF0ZVN0YXRlKHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCksIHRoaXMuZ2V0QXR0YWNobWVudEtleSh0aGlzLmF0dF92YWx1ZVJlZiksIHVuZGVmaW5lZCwge1xuICAgICAgcGFnZVJlZmVyZW5jZTogJ2NvbnRleHRfZGF0YScsXG4gICAgICBpc0FycmF5RGVlcE1lcmdlOiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgX2Rvd25sb2FkRmlsZUZyb21MaXN0KGZpbGVPYmo6IGFueSkge1xuICAgIFBDb3JlLmdldEF0dGFjaG1lbnRVdGlscygpXG4gICAgICAvLyBAdHMtaWdub3JlIC0gM3JkIHBhcmFtZXRlciBcInJlc3BvbnNlRW5jb2RpbmdcIiBzaG91bGQgYmUgb3B0aW9uYWxcbiAgICAgIC5kb3dubG9hZEF0dGFjaG1lbnQoZmlsZU9iai5wekluc0tleSwgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSlcbiAgICAgIC50aGVuKChjb250ZW50OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZmlsZU9iai5weUF0dGFjaE5hbWUuc3BsaXQoJy4nKS5wb3AoKTtcbiAgICAgICAgdGhpcy5maWxlRG93bmxvYWQoY29udGVudC5kYXRhLCBmaWxlT2JqLnB5RmlsZU5hbWUsIGV4dGVuc2lvbik7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGUgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZmlsZURvd25sb2FkID0gKGRhdGEsIGZpbGVOYW1lLCBleHQpID0+IHtcbiAgICBjb25zdCBmaWxlID0gZXh0ID8gYCR7ZmlsZU5hbWV9LiR7ZXh0fWAgOiBmaWxlTmFtZTtcbiAgICBkb3dubG9hZChhdG9iKGRhdGEpLCBmaWxlKTtcbiAgfTtcblxuICBnZXRBdHRhY2htZW50S2V5ID0gKG5hbWUgPSAnJykgPT4gKG5hbWUgPyBgYXR0YWNobWVudHNMaXN0LiR7bmFtZX1gIDogJ2F0dGFjaG1lbnRzTGlzdCcpO1xuXG4gIENoZWNrRm9ySW52YWxpZEF0dGFjaG1lbnQoKSB7XG4gICAgbGV0IGlzVmFsaWQgPSB0cnVlO1xuICAgIHRoaXMuYXJGaWxlTGlzdCQuZm9yRWFjaChmaWxlID0+IHtcbiAgICAgIGlmIChmaWxlLnNlY29uZGFyeS5lcnJvcikge1xuICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIFBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCkuY2xlYXJNZXNzYWdlcyh7XG4gICAgICAgIHR5cGU6IFBDb3JlLmdldENvbnN0YW50cygpLk1FU1NBR0VTLk1FU1NBR0VTX1RZUEVfRVJST1IsXG4gICAgICAgIHByb3BlcnR5OiAodGhpcy5wQ29ubiQuZ2V0U3RhdGVQcm9wcygpIGFzIGFueSkudmFsdWUsXG4gICAgICAgIHBhZ2VSZWZlcmVuY2U6IHRoaXMucENvbm4kLmdldFBhZ2VSZWZlcmVuY2UoKSxcbiAgICAgICAgY29udGV4dDogdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgX3JlbW92ZUZpbGVGcm9tTGlzdChpdGVtOiBhbnkpIHtcbiAgICBjb25zdCBmaWxlTGlzdEluZGV4ID0gdGhpcy5hckZpbGVMaXN0JC5maW5kSW5kZXgoZWxlbWVudCA9PiBlbGVtZW50Py5pZCA9PT0gaXRlbT8uaWQpO1xuICAgIGNvbnN0IGZpbGVJbmRleCA9IHRoaXMuYXJGaWxlcyQuZmluZEluZGV4KGVsZW1lbnQgPT4gZWxlbWVudD8uSUQgPT09IGl0ZW0/LmlkKTtcblxuICAgIGNvbnN0IGF0dGFjaG1lbnRzTGlzdCA9IFtdO1xuICAgIGxldCBjdXJyZW50QXR0YWNobWVudExpc3QgPSB0aGlzLmdldEN1cnJlbnRBdHRhY2htZW50c0xpc3QodGhpcy5nZXRBdHRhY2htZW50S2V5KHRoaXMuYXR0X3ZhbHVlUmVmKSwgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSk7XG4gICAgaWYgKHRoaXMudmFsdWUkICYmIHRoaXMudmFsdWUkLnB4UmVzdWx0cyAmJiArdGhpcy52YWx1ZSQucHlDb3VudCA+IDAgJiYgaXRlbS5hY3Rpb25zKSB7XG4gICAgICBjb25zdCB1cGRhdGVkQXR0YWNobWVudHMgPSBjdXJyZW50QXR0YWNobWVudExpc3QubWFwKGF0dGFjaG1lbnQgPT4ge1xuICAgICAgICBpZiAoYXR0YWNobWVudD8uSUQgPT09IHRoaXMuYXJGaWxlTGlzdCRbZmlsZUxpc3RJbmRleF0uaWQgfHwgYXR0YWNobWVudD8ucHJvcHM/LklEID09PSB0aGlzLmFyRmlsZUxpc3QkW2ZpbGVMaXN0SW5kZXhdLmlkKSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uYXR0YWNobWVudCwgZGVsZXRlOiB0cnVlLCBsYWJlbDogdGhpcy52YWx1ZVJlZiB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhdHRhY2htZW50O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIHVwZGF0aW5nIHRoZSByZWR1eCBzdG9yZSB0byBoZWxwIGZvcm0taGFuZGxlciBpbiBwYXNzaW5nIHRoZSBkYXRhIHRvIGRlbGV0ZSB0aGUgZmlsZSBmcm9tIHNlcnZlclxuICAgICAgUENvcmUuZ2V0U3RhdGVVdGlscygpLnVwZGF0ZVN0YXRlKHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCksIHRoaXMuZ2V0QXR0YWNobWVudEtleSh0aGlzLmF0dF92YWx1ZVJlZiksIHVwZGF0ZWRBdHRhY2htZW50cywge1xuICAgICAgICBwYWdlUmVmZXJlbmNlOiAnY29udGV4dF9kYXRhJyxcbiAgICAgICAgaXNBcnJheURlZXBNZXJnZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50QXR0YWNobWVudExpc3QgPSBjdXJyZW50QXR0YWNobWVudExpc3QuZmlsdGVyKGYgPT4gZi5JRCAhPT0gaXRlbS5pZCk7XG4gICAgICBQQ29yZS5nZXRTdGF0ZVV0aWxzKCkudXBkYXRlU3RhdGUoXG4gICAgICAgIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCksXG4gICAgICAgIHRoaXMuZ2V0QXR0YWNobWVudEtleSh0aGlzLmF0dF92YWx1ZVJlZiksXG4gICAgICAgIFsuLi5jdXJyZW50QXR0YWNobWVudExpc3QsIC4uLmF0dGFjaG1lbnRzTGlzdF0sXG4gICAgICAgIHtcbiAgICAgICAgICBwYWdlUmVmZXJlbmNlOiAnY29udGV4dF9kYXRhJyxcbiAgICAgICAgICBpc0FycmF5RGVlcE1lcmdlOiBmYWxzZVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChmaWxlTGlzdEluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuYXJGaWxlTGlzdCQuc3BsaWNlKGZpbGVMaXN0SW5kZXgsIDEpO1xuICAgIH1cbiAgICBpZiAoZmlsZUluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuYXJGaWxlcyQuc3BsaWNlKGZpbGVJbmRleCwgMSk7XG4gICAgfVxuXG4gICAgdGhpcy5DaGVja0ZvckludmFsaWRBdHRhY2htZW50KCk7XG5cbiAgICB0aGlzLmJTaG93U2VsZWN0b3IkID0gISh0aGlzLmFyRmlsZUxpc3QkPy5sZW5ndGggPiAwKSB8fCB0aGlzLmFsbG93TXVsdGlwbGUkO1xuICB9XG5cbiAgZ2V0Q3VycmVudEF0dGFjaG1lbnRzTGlzdChrZXksIGNvbnRleHQpIHtcbiAgICByZXR1cm4gUENvcmUuZ2V0U3RvcmVWYWx1ZShgLiR7a2V5fWAsICdjb250ZXh0X2RhdGEnLCBjb250ZXh0KSB8fCBbXTtcbiAgfVxuXG4gIGVycm9ySGFuZGxlcihpc0ZldGNoQ2FuY2VsZWQsIGZpbGUpIHtcbiAgICByZXR1cm4gZXJyb3IgPT4ge1xuICAgICAgaWYgKCFpc0ZldGNoQ2FuY2VsZWQoZXJyb3IpKSB7XG4gICAgICAgIGxldCB1cGxvYWRGYWlsTXNnID0gdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ1NvbWV0aGluZyB3ZW50IHdyb25nJywgJycsICcnKTtcbiAgICAgICAgaWYgKGVycm9yLnJlc3BvbnNlICYmIGVycm9yLnJlc3BvbnNlLmRhdGEgJiYgZXJyb3IucmVzcG9uc2UuZGF0YS5lcnJvckRldGFpbHMpIHtcbiAgICAgICAgICB1cGxvYWRGYWlsTXNnID0gdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoZXJyb3IucmVzcG9uc2UuZGF0YS5lcnJvckRldGFpbHNbMF0ubG9jYWxpemVkVmFsdWUsICcnLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBteUZpbGUgb2YgdGhpcy5teUZpbGVzKSB7XG4gICAgICAgICAgaWYgKG15RmlsZS5JRCA9PT0gZmlsZS5JRCkge1xuICAgICAgICAgICAgbXlGaWxlLm1ldGEgPSB1cGxvYWRGYWlsTXNnO1xuICAgICAgICAgICAgbXlGaWxlLmVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIG15RmlsZS5maWxlTmFtZSA9IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdVbmFibGUgdG8gdXBsb2FkIGZpbGUnLCAnJywgJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJTaG93U2VsZWN0b3IkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYXJGaWxlTGlzdCQgPSB0aGlzLm15RmlsZXMubWFwKGF0dCA9PiB7XG4gICAgICAgICAgaWYgKGF0dC5pZCkge1xuICAgICAgICAgICAgcmV0dXJuIGF0dDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmV3TGlzdFV0aWxpdHlJdGVtUHJvcHMoe1xuICAgICAgICAgICAgYXR0LFxuICAgICAgICAgICAgZG93bmxvYWRGaWxlOiBudWxsLFxuICAgICAgICAgICAgY2FuY2VsRmlsZTogbnVsbCxcbiAgICAgICAgICAgIGRlbGV0ZUZpbGU6IG51bGwsXG4gICAgICAgICAgICByZW1vdmVGaWxlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCkuYWRkTWVzc2FnZXMoe1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBtZXNzYWdlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnRXJyb3Igd2l0aCBvbmUgb3IgbW9yZSBmaWxlcycsICcnLCAnJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIHByb3BlcnR5OiAodGhpcy5wQ29ubiQuZ2V0U3RhdGVQcm9wcygpIGFzIGFueSkudmFsdWUsXG4gICAgICAgICAgcGFnZVJlZmVyZW5jZTogdGhpcy5wQ29ubiQuZ2V0UGFnZVJlZmVyZW5jZSgpLFxuICAgICAgICAgIGNvbnRleHQ6IHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKClcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5iU2hvd0p1c3REZWxldGUkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iTG9hZGluZyQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH07XG4gIH1cblxuICB1cGxvYWRNeUZpbGVzKGV2ZW50OiBhbnkpIHtcbiAgICBsZXQgYXJyQXR0YWNobWVudEZpbGVzOiBhbnkgPSBbXTtcbiAgICBpZiAodGhpcy5hckZpbGVzJC5sZW5ndGgpIHtcbiAgICAgIGFyckF0dGFjaG1lbnRGaWxlcyA9IHRoaXMuYXJGaWxlcyQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyckF0dGFjaG1lbnRGaWxlcyA9IHRoaXMuYXJGaWxlTGlzdCQ7XG4gICAgfVxuICAgIHRoaXMuYXJGaWxlcyQgPSBbLi4uYXJyQXR0YWNobWVudEZpbGVzLCAuLi50aGlzLmdldEZpbGVzKGV2ZW50LnRhcmdldC5maWxlcyldO1xuXG4gICAgLy8gY29udmVydCBGaWxlTGlzdCB0byBhbiBhcnJheVxuICAgIHRoaXMubXlGaWxlcyA9IEFycmF5LmZyb20odGhpcy5hckZpbGVzJCk7XG5cbiAgICB0aGlzLmJMb2FkaW5nJCA9IHRydWU7XG5cbiAgICBjb25zdCBmaWxlc1RvQmVVcGxvYWRlZCA9IHRoaXMubXlGaWxlc1xuICAgICAgLmZpbHRlcihlID0+IHtcbiAgICAgICAgaWYgKGUuaWQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNGaWxlVXBsb2FkZWQgPSBlICYmIGUucHJvZ3Jlc3MgPT09IDEwMDtcbiAgICAgICAgY29uc3QgZmlsZUhhc0Vycm9yID0gZSAmJiBlLmVycm9yO1xuICAgICAgICBjb25zdCBpc0ZpbGVVcGxvYWRlZGluTGFzdFN0ZXAgPSBlLnJlc3BvbnNlUHJvcHMgJiYgZS5yZXNwb25zZVByb3BzLnB6SW5zS2V5O1xuICAgICAgICByZXR1cm4gIWlzRmlsZVVwbG9hZGVkICYmICFmaWxlSGFzRXJyb3IgJiYgIWlzRmlsZVVwbG9hZGVkaW5MYXN0U3RlcDtcbiAgICAgIH0pXG4gICAgICAubWFwKGYgPT5cbiAgICAgICAgUENvcmUuZ2V0QXR0YWNobWVudFV0aWxzKCkudXBsb2FkQXR0YWNobWVudChcbiAgICAgICAgICBmLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25VcGxvYWRQcm9ncmVzcygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgaXNGZXRjaENhbmNlbGVkID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9ySGFuZGxlcihpc0ZldGNoQ2FuY2VsZWQsIGYpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKVxuICAgICAgICApXG4gICAgICApO1xuXG4gICAgUHJvbWlzZS5hbGxTZXR0bGVkKGZpbGVzVG9CZVVwbG9hZGVkKVxuICAgICAgLnRoZW4oKGZpbGVSZXNwb25zZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUZpbGVVcGxvYWRTdWNjZXNzKGZpbGVSZXNwb25zZXMpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgdGhpcy5oYW5kbGVGaWxlVXBsb2FkRmFpbHVyZSgpO1xuICAgICAgfSk7XG4gIH1cblxuICBoYW5kbGVGaWxlVXBsb2FkU3VjY2VzcyhmaWxlUmVzcG9uc2VzKSB7XG4gICAgY29uc3Qgc3VjY2Vzc0ZpbGVSZXNwb25zZXMgPSBmaWxlUmVzcG9uc2VzLmZpbHRlcihmciA9PiBmci5zdGF0dXMgIT09ICdyZWplY3RlZCcpOyAvLyBpbiBjYXNlIG9mIGRlbGV0aW5nIGFuIGluIHByb2dyZXNzIGZpbGUsIHByb21pc2UgZ2V0cyBjYW5jZWxsZWQgYnV0IHN0aWxsIGVudGVycyB0aGVuIGJsb2NrXG4gICAgbGV0IHJlcU9iajtcbiAgICBpZiAoc3VjY2Vzc0ZpbGVSZXNwb25zZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgdGVtcEZpbGVzVXBsb2FkZWQgPSBbLi4udGhpcy5hckZpbGVzJC5maWx0ZXIoZmlsZSA9PiAhZmlsZS5pZCldO1xuICAgICAgbGV0IG5ld0F0dGFjaG1lbnRzOiBhbnkgPSBbXTtcbiAgICAgIHRlbXBGaWxlc1VwbG9hZGVkLmZvckVhY2goZmlsZVJlcyA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gc3VjY2Vzc0ZpbGVSZXNwb25zZXMuZmluZEluZGV4KChmcjogYW55KSA9PiBmci52YWx1ZS5jbGllbnRGaWxlSUQgPT09IGZpbGVSZXMuSUQpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgIHJlcU9iaiA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdGaWxlJyxcbiAgICAgICAgICAgIGxhYmVsOiB0aGlzLmF0dF92YWx1ZVJlZixcbiAgICAgICAgICAgIGNhdGVnb3J5OiB0aGlzLmF0dF9jYXRlZ29yeU5hbWUsXG4gICAgICAgICAgICBoYW5kbGU6IHN1Y2Nlc3NGaWxlUmVzcG9uc2VzW2luZGV4XS52YWx1ZS5JRCxcbiAgICAgICAgICAgIElEOiBmaWxlUmVzLklELFxuICAgICAgICAgICAgbmFtZTogZmlsZVJlcy5uYW1lXG4gICAgICAgICAgfTtcbiAgICAgICAgICBuZXdBdHRhY2htZW50cyA9IFsuLi5uZXdBdHRhY2htZW50cywgcmVxT2JqXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBjdXJyZW50QXR0YWNobWVudExpc3QgPSB0aGlzLmdldEN1cnJlbnRBdHRhY2htZW50c0xpc3QodGhpcy5nZXRBdHRhY2htZW50S2V5KHRoaXMuYXR0X3ZhbHVlUmVmKSwgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSkuZmlsdGVyKFxuICAgICAgICBmID0+IGYubGFiZWwgIT09IHRoaXMuYXR0X3ZhbHVlUmVmXG4gICAgICApO1xuICAgICAgUENvcmUuZ2V0U3RhdGVVdGlscygpLnVwZGF0ZVN0YXRlKFxuICAgICAgICB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpLFxuICAgICAgICB0aGlzLmdldEF0dGFjaG1lbnRLZXkodGhpcy5hdHRfdmFsdWVSZWYpLFxuICAgICAgICBbLi4uY3VycmVudEF0dGFjaG1lbnRMaXN0LCAuLi5uZXdBdHRhY2htZW50c10sXG4gICAgICAgIHtcbiAgICAgICAgICBwYWdlUmVmZXJlbmNlOiAnY29udGV4dF9kYXRhJyxcbiAgICAgICAgICBpc0FycmF5RGVlcE1lcmdlOiBmYWxzZVxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgdGhpcy5hckZpbGVzJCA9IHRlbXBGaWxlc1VwbG9hZGVkO1xuXG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmJTaG93U2VsZWN0b3IkID0gdGhpcy5hbGxvd011bHRpcGxlJDtcbiAgICAgICAgdGhpcy5hckZpbGVzJC5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgICAgIGlmICghZmlsZS5lcnJvcikge1xuICAgICAgICAgICAgZmlsZS5tZXRhID0gdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ0ZpbGUgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5JywgJycsICcnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFyRmlsZUxpc3QkID0gdGhpcy5teUZpbGVzLm1hcChhdHQgPT4ge1xuICAgICAgICAgIGlmIChhdHQuaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhdHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmdldE5ld0xpc3RVdGlsaXR5SXRlbVByb3BzKHtcbiAgICAgICAgICAgIGF0dCxcbiAgICAgICAgICAgIGRvd25sb2FkRmlsZTogbnVsbCxcbiAgICAgICAgICAgIGNhbmNlbEZpbGU6IG51bGwsXG4gICAgICAgICAgICBkZWxldGVGaWxlOiBudWxsLFxuICAgICAgICAgICAgcmVtb3ZlRmlsZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLkNoZWNrRm9ySW52YWxpZEF0dGFjaG1lbnQoKTtcblxuICAgICAgICB0aGlzLmJTaG93SnVzdERlbGV0ZSQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJMb2FkaW5nJCA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlRmlsZVVwbG9hZEZhaWx1cmUoKSB7XG4gICAgdGhpcy5iU2hvd0p1c3REZWxldGUkID0gdHJ1ZTtcbiAgICB0aGlzLmJMb2FkaW5nJCA9IGZhbHNlO1xuICAgIHRoaXMuYlNob3dTZWxlY3RvciQgPSB0aGlzLmFsbG93TXVsdGlwbGUkO1xuICAgIHRoaXMubXlGaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgaWYgKGZpbGU/LnNlY29uZGFyeT8uZXJyb3IpIHtcbiAgICAgICAgZmlsZS5tZXRhID0gJ0ZpbGUgdXBsb2FkZWQgZmFpbGVkJztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuYXJGaWxlTGlzdCQgPSB0aGlzLm15RmlsZXMubWFwKGF0dCA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5nZXROZXdMaXN0VXRpbGl0eUl0ZW1Qcm9wcyh7XG4gICAgICAgIGF0dCxcbiAgICAgICAgZG93bmxvYWRGaWxlOiBudWxsLFxuICAgICAgICBjYW5jZWxGaWxlOiBudWxsLFxuICAgICAgICBkZWxldGVGaWxlOiBudWxsLFxuICAgICAgICByZW1vdmVGaWxlOiBudWxsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuYlNob3dKdXN0RGVsZXRlJCA9IHRydWU7XG4gICAgdGhpcy5iTG9hZGluZyQgPSBmYWxzZTtcbiAgfVxuXG4gIGdldE5ld0xpc3RVdGlsaXR5SXRlbVByb3BzID0gKHsgYXR0LCBjYW5jZWxGaWxlLCBkb3dubG9hZEZpbGUsIGRlbGV0ZUZpbGUsIHJlbW92ZUZpbGUgfSkgPT4ge1xuICAgIGxldCBhY3Rpb25zO1xuICAgIGxldCBpc0Rvd25sb2FkYWJsZSA9IGZhbHNlO1xuXG4gICAgaWYgKGF0dC5wcm9ncmVzcyAmJiBhdHQucHJvZ3Jlc3MgIT09IDEwMCkge1xuICAgICAgYWN0aW9ucyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBgQ2FuY2VsLSR7YXR0LklEfWAsXG4gICAgICAgICAgdGV4dDogdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ0NhbmNlbCcsICcnLCAnJyksXG4gICAgICAgICAgaWNvbjogJ3RpbWVzJyxcbiAgICAgICAgICBvbkNsaWNrOiBjYW5jZWxGaWxlXG4gICAgICAgIH1cbiAgICAgIF07XG4gICAgfSBlbHNlIGlmIChhdHQubGlua3MpIHtcbiAgICAgIGNvbnN0IGlzRmlsZSA9IGF0dC50eXBlID09PSAnRklMRSc7XG4gICAgICBjb25zdCBJRCA9IGF0dC5JRC5yZXBsYWNlKC9cXHMvZ2ksICcnKTtcbiAgICAgIGNvbnN0IGFjdGlvbnNNYXAgPSBuZXcgTWFwKFtcbiAgICAgICAgW1xuICAgICAgICAgICdkb3dubG9hZCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6IGBkb3dubG9hZC0ke0lEfWAsXG4gICAgICAgICAgICB0ZXh0OiBpc0ZpbGUgPyB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnRG93bmxvYWQnLCAnJywgJycpIDogdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ09wZW4nLCAnJywgJycpLFxuICAgICAgICAgICAgaWNvbjogaXNGaWxlID8gJ2Rvd25sb2FkJyA6ICdvcGVuJyxcbiAgICAgICAgICAgIG9uQ2xpY2s6IGRvd25sb2FkRmlsZVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICdkZWxldGUnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBgRGVsZXRlLSR7SUR9YCxcbiAgICAgICAgICAgIHRleHQ6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdEZWxldGUnLCAnJywgJycpLFxuICAgICAgICAgICAgaWNvbjogJ3RyYXNoJyxcbiAgICAgICAgICAgIG9uQ2xpY2s6IGRlbGV0ZUZpbGVcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIF0pO1xuICAgICAgYWN0aW9ucyA9IFtdO1xuICAgICAgYWN0aW9uc01hcC5mb3JFYWNoKChhY3Rpb24sIGFjdGlvbktleSkgPT4ge1xuICAgICAgICBpZiAoYXR0LmxpbmtzW2FjdGlvbktleV0pIHtcbiAgICAgICAgICBhY3Rpb25zLnB1c2goYWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBpc0Rvd25sb2FkYWJsZSA9IGF0dC5saW5rcy5kb3dubG9hZDtcbiAgICB9IGVsc2UgaWYgKGF0dC5lcnJvcikge1xuICAgICAgYWN0aW9ucyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBgUmVtb3ZlLSR7YXR0LklEfWAsXG4gICAgICAgICAgdGV4dDogdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ1JlbW92ZScsICcnLCAnJyksXG4gICAgICAgICAgaWNvbjogJ3RyYXNoJyxcbiAgICAgICAgICBvbkNsaWNrOiByZW1vdmVGaWxlXG4gICAgICAgIH1cbiAgICAgIF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBhdHQuSUQsXG4gICAgICB2aXN1YWw6IHtcbiAgICAgICAgaWNvbjogdGhpcy51dGlscy5nZXRJY29uRm9yQXR0YWNobWVudChhdHQpLFxuICAgICAgICBwcm9ncmVzczogYXR0LnByb2dyZXNzID09IDEwMCA/IHVuZGVmaW5lZCA6IGF0dC5wcm9ncmVzc1xuICAgICAgfSxcbiAgICAgIHByaW1hcnk6IHtcbiAgICAgICAgdHlwZTogYXR0LnR5cGUsXG4gICAgICAgIG5hbWU6IGF0dC5lcnJvciA/IGF0dC5maWxlTmFtZSA6IGF0dC5uYW1lLFxuICAgICAgICBpY29uOiAndHJhc2gnLFxuICAgICAgICBjbGljazogcmVtb3ZlRmlsZVxuICAgICAgfSxcbiAgICAgIHNlY29uZGFyeToge1xuICAgICAgICB0ZXh0OiBhdHQubWV0YSxcbiAgICAgICAgZXJyb3I6IGF0dC5lcnJvclxuICAgICAgfSxcbiAgICAgIGFjdGlvbnNcbiAgICB9O1xuICB9O1xuXG4gIG9uVXBsb2FkUHJvZ3Jlc3MoKSB7fVxuXG4gIGdldEZpbGVzKGFyRmlsZXM6IGFueVtdKTogYW55W10ge1xuICAgIGNvbnN0IGZpbGVzID0gdGhpcy5hbGxvd011bHRpcGxlJCA/IGFyRmlsZXMgOiBbYXJGaWxlc1swXV07XG4gICAgcmV0dXJuIHRoaXMuc2V0TmV3RmlsZXMoZmlsZXMpO1xuICB9XG5cbiAgc2V0TmV3RmlsZXMoYXJGaWxlcykge1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgY29uc3QgbWF4QXR0YWNobWVudFNpemUgPSBQQ29yZS5nZXRFbnZpcm9ubWVudEluZm8oKS5nZXRNYXhBdHRhY2htZW50U2l6ZSgpIHx8IDU7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGFyRmlsZXMpIHtcbiAgICAgIGZpbGUubWltZVR5cGUgPSBmaWxlLnR5cGU7XG4gICAgICBmaWxlLmljb24gPSB0aGlzLnV0aWxzLmdldEljb25Gcm9tRmlsZVR5cGUoZmlsZS50eXBlKTtcbiAgICAgIGZpbGUuSUQgPSBgJHtuZXcgRGF0ZSgpLmdldFRpbWUoKX1JJHtpbmRleH1gO1xuXG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVNYXhTaXplKGZpbGUsIG1heEF0dGFjaG1lbnRTaXplKSkge1xuICAgICAgICBmaWxlLmVycm9yID0gdHJ1ZTtcbiAgICAgICAgZmlsZS5tZXRhID0gdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ0ZpbGUgaXMgdG9vIGJpZy4gTWF4IGFsbG93ZWQgc2l6ZSBpcyA1TUIuJywgJycsICcnKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMudmFsaWRhdGVGaWxlRXh0ZW5zaW9uKGZpbGUsIHRoaXMuZXh0ZW5zaW9ucyQpKSB7XG4gICAgICAgIGZpbGUuZXJyb3IgPSB0cnVlO1xuICAgICAgICBmaWxlLm1ldGEgPSBgJHt0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnRmlsZSBoYXMgaW52YWxpZCBleHRlbnNpb24uIEFsbG93ZWQgZXh0ZW5zaW9ucyBhcmU6JywgJycsICcnKX0gJHt0aGlzLmV4dGVuc2lvbnMkLnJlcGxhY2VBbGwoXG4gICAgICAgICAgJy4nLFxuICAgICAgICAgICcnXG4gICAgICAgICl9YDtcbiAgICAgIH1cbiAgICAgIGlmIChmaWxlLmVycm9yKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9ICh0aGlzLnBDb25uJC5nZXRTdGF0ZVByb3BzKCkgYXMgYW55KS52YWx1ZTtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCk7XG4gICAgICAgIFBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCkuYWRkTWVzc2FnZXMoe1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBtZXNzYWdlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnRXJyb3Igd2l0aCBvbmUgb3IgbW9yZSBmaWxlcycsICcnLCAnJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIHByb3BlcnR5OiBmaWVsZE5hbWUsXG4gICAgICAgICAgcGFnZVJlZmVyZW5jZTogdGhpcy5wQ29ubiQuZ2V0UGFnZVJlZmVyZW5jZSgpLFxuICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIHJldHVybiBbLi4uYXJGaWxlc107XG4gIH1cblxuICB2YWxpZGF0ZU1heFNpemUoZmlsZU9iaiwgbWF4U2l6ZUluTUIpOiBib29sZWFuIHtcbiAgICBjb25zdCBmaWxlU2l6ZSA9IChmaWxlT2JqLnNpemUgLyAxMDQ4NTc2KS50b0ZpeGVkKDIpO1xuICAgIHJldHVybiBwYXJzZUZsb2F0KGZpbGVTaXplKSA8IHBhcnNlRmxvYXQobWF4U2l6ZUluTUIpO1xuICB9XG5cbiAgdmFsaWRhdGVGaWxlRXh0ZW5zaW9uID0gKGZpbGVPYmosIGFsbG93ZWRFeHRlbnNpb25zKSA9PiB7XG4gICAgaWYgKCFhbGxvd2VkRXh0ZW5zaW9ucykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGFsbG93ZWRFeHRlbnNpb25MaXN0ID0gYWxsb3dlZEV4dGVuc2lvbnNcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAuc3BsaXQoJywnKVxuICAgICAgLm1hcChpdGVtID0+IGl0ZW0ucmVwbGFjZUFsbCgnLicsICcnKS50cmltKCkpO1xuICAgIGNvbnN0IGV4dGVuc2lvbiA9IGZpbGVPYmoubmFtZS5zcGxpdCgnLicpLnBvcCgpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIGFsbG93ZWRFeHRlbnNpb25MaXN0LmluY2x1ZGVzKGV4dGVuc2lvbik7XG4gIH07XG5cbiAgYnVpbGRGaWxlUHJvcHNGcm9tUmVzcG9uc2UocmVzcE9iaikge1xuICAgIHJldHVybiB7XG4gICAgICBwcm9wczoge1xuICAgICAgICBtZXRhOiBgJHtyZXNwT2JqLnB5Q2F0ZWdvcnlOYW1lfSwgJHtyZXNwT2JqLnB4Q3JlYXRlT3BlcmF0b3J9YCxcbiAgICAgICAgbmFtZTogcmVzcE9iai5weUF0dGFjaE5hbWUsXG4gICAgICAgIGljb246IHRoaXMudXRpbHMuZ2V0SWNvbkZyb21GaWxlVHlwZShyZXNwT2JqLnB5TWltZUZpbGVFeHRlbnNpb24pXG4gICAgICB9LFxuICAgICAgcmVzcG9uc2VQcm9wczoge1xuICAgICAgICAuLi5yZXNwT2JqXG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInBzZGstbGFiZWwtaW5maXgtcmVhZG9ubHlcIiAqbmdJZj1cImJWaXNpYmxlJFwiPlxuICA8c3BhbiBjbGFzcz1cInBzZGstbGFiZWwtd3JhcHBlci1yZWFkb25seVwiPlxuICAgIDxsYWJlbCBbbmdDbGFzc109XCJ7ICdwc2RrLWxhYmVsLXJlYWRvbmx5JzogdHJ1ZSwgJ2xhYmVsLXJlcXVpcmVkJzogYlJlcXVpcmVkJCA9PT0gdHJ1ZSB9XCIgW2h0bWxGb3JdPVwiYXR0X3ZhbHVlUmVmXCI+e3sgbGFiZWwkIH19PC9sYWJlbD5cbiAgPC9zcGFuPlxuICA8ZGl2XG4gICAgW25nQ2xhc3NdPVwieyAncHNkay1tb2RhbC1maWxlLXNlbGVjdG9yJzogc3RhdHVzICE9PSAnZXJyb3InLCAncHNkay1tb2RhbC1maWxlLXNlbGVjdG9yLWVycm9yJzogc3RhdHVzID09PSAnZXJyb3InIH1cIlxuICAgIGlkPVwiYXR0YWNobWVudC1jb250YWluZXJcIlxuICAgICpuZ0lmPVwiYlNob3dTZWxlY3RvciRcIlxuICA+XG4gICAgPG1hdC1zcGlubmVyICpuZ0lmPVwiYkxvYWRpbmckXCIgY2xhc3M9XCJwcm9ncmVzcy1zcGlubmVyXCIgZGlhbWV0ZXI9XCI0MFwiPjwvbWF0LXNwaW5uZXI+XG4gICAgPGlucHV0IGhpZGRlbiB0eXBlPVwiZmlsZVwiIFtyZXF1aXJlZF09XCJiUmVxdWlyZWQkXCIgI3VwbG9hZGVyIFtpZF09XCJhdHRfdmFsdWVSZWZcIiBbbXVsdGlwbGVdPVwiYWxsb3dNdWx0aXBsZSRcIiAoY2hhbmdlKT1cInVwbG9hZE15RmlsZXMoJGV2ZW50KVwiIC8+XG5cbiAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBbZGlzYWJsZWRdPVwiYkRpc2FibGVkJFwiIChjbGljayk9XCJ1cGxvYWRlci5jbGljaygpXCI+XG4gICAgICB7e1xuICAgICAgICBhbGxvd011bHRpcGxlJFxuICAgICAgICAgID8gdXBsb2FkTXVsdGlwbGVGaWxlc0xhYmVsID09PSAnZmlsZV91cGxvYWRfdGV4dF9tdWx0aXBsZSdcbiAgICAgICAgICAgID8gJ0Nob29zZSBmaWxlcydcbiAgICAgICAgICAgIDogdXBsb2FkTXVsdGlwbGVGaWxlc0xhYmVsXG4gICAgICAgICAgOiB1cGxvYWRTaW5nbGVGaWxlTGFiZWwgPT09ICdmaWxlX3VwbG9hZF90ZXh0X29uZSdcbiAgICAgICAgICAgID8gJ0Nob29zZSBhIGZpbGUnXG4gICAgICAgICAgICA6IHVwbG9hZFNpbmdsZUZpbGVMYWJlbFxuICAgICAgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxzcGFuICpuZ0lmPVwidmFsaWRhdGVNZXNzYWdlXCIgY2xhc3M9XCJmaWxlLWVycm9yXCI+e3sgdmFsaWRhdGVNZXNzYWdlIH19PC9zcGFuPlxuXG4gIDxkaXYgY2xhc3M9XCJwc2RrLWF0dGFjaG1lbnQtbGlzdFwiICpuZ0lmPVwiYXJGaWxlTGlzdCQgIT0gbnVsbCAmJiBhckZpbGVMaXN0JC5sZW5ndGggPiAwXCI+XG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgYXR0YWNobWVudCBvZiBhckZpbGVMaXN0JFwiPlxuICAgICAgPGNvbXBvbmVudC1tYXBwZXJcbiAgICAgICAgKm5nSWY9XCJhdHRhY2htZW50Lm5vRGVsZXRlSWNvbiAhPT0gdHJ1ZTsgZWxzZSBzaG93ZnVsbFwiXG4gICAgICAgIG5hbWU9XCJTdW1tYXJ5SXRlbVwiXG4gICAgICAgIFtwcm9wc109XCJ7IGl0ZW0kOiBhdHRhY2htZW50LCBtZW51SWNvbk92ZXJyaWRlJDogJ3RyYXNoJywgbWVudUljb25PdmVycmlkZUFjdGlvbiQ6IHJlbW92ZUZpbGVGcm9tTGlzdCQgfVwiXG4gICAgICA+PC9jb21wb25lbnQtbWFwcGVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNzaG93ZnVsbD5cbiAgICAgICAgPGNvbXBvbmVudC1tYXBwZXIgbmFtZT1cIlN1bW1hcnlJdGVtXCIgW3Byb3BzXT1cInsgaXRlbSQ6IGF0dGFjaG1lbnQsIG1lbnVJY29uT3ZlcnJpZGVBY3Rpb24kOiByZW1vdmVGaWxlRnJvbUxpc3QkIH1cIj48L2NvbXBvbmVudC1tYXBwZXI+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
395
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvd2lkZ2V0L2F0dGFjaG1lbnQvYXR0YWNobWVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvd2lkZ2V0L2F0dGFjaG1lbnQvYXR0YWNobWVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBVSxVQUFVLEVBQWEsU0FBUyxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRS9HLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM5RSxPQUFPLFFBQVEsTUFBTSxZQUFZLENBQUM7QUFHbEMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOERBQThELENBQUM7Ozs7Ozs7OztBQWlCeEcsTUFBTSxPQUFPLG1CQUFtQjtJQW9DOUIsWUFDVSxlQUF1QyxFQUN2QyxLQUFZLEVBQ1osTUFBYztRQUZkLG9CQUFlLEdBQWYsZUFBZSxDQUF3QjtRQUN2QyxVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQ1osV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQW5DeEIsdUNBQXVDO1FBQ3ZDLHdCQUFtQixHQUF3QixFQUFFLENBQUM7UUFHOUMsV0FBTSxH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dCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgTmdab25lLCBmb3J3YXJkUmVmLCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcbmltcG9ydCBkb3dubG9hZCBmcm9tICdkb3dubG9hZGpzJztcbmltcG9ydCB7IEFuZ3VsYXJQQ29ubmVjdERhdGEsIEFuZ3VsYXJQQ29ubmVjdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9fYnJpZGdlL2FuZ3VsYXItcGNvbm5lY3QnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9faGVscGVycy91dGlscyc7XG5pbXBvcnQgeyBDb21wb25lbnRNYXBwZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9fYnJpZGdlL2NvbXBvbmVudC1tYXBwZXIvY29tcG9uZW50LW1hcHBlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUENvbm5GaWVsZFByb3BzIH0gZnJvbSAnLi4vLi4vLi4vX3R5cGVzL1BDb25uUHJvcHMuaW50ZXJmYWNlJztcblxuaW50ZXJmYWNlIEF0dGFjaG1lbnRQcm9wcyBleHRlbmRzIE9taXQ8UENvbm5GaWVsZFByb3BzLCAndmFsdWUnPiB7XG4gIC8vIElmIGFueSwgZW50ZXIgYWRkaXRpb25hbCBwcm9wcyB0aGF0IG9ubHkgZXhpc3Qgb24gdGhpcyBjb21wb25lbnRcbiAgdmFsdWU6IGFueTtcbiAgZXh0ZW5zaW9uczogYW55O1xuICBhbGxvd011bHRpcGxlOiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtYXR0YWNobWVudCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hdHRhY2htZW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYXR0YWNobWVudC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsIE1hdE1lbnVNb2R1bGUsIE1hdEljb25Nb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgZm9yd2FyZFJlZigoKSA9PiBDb21wb25lbnRNYXBwZXJDb21wb25lbnQpXVxufSlcbmV4cG9ydCBjbGFzcyBBdHRhY2htZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBwQ29ubiQ6IHR5cGVvZiBQQ29ubmVjdDtcbiAgQElucHV0KCkgZm9ybUdyb3VwJDogRm9ybUdyb3VwO1xuXG4gIC8vIEZvciBpbnRlcmFjdGlvbiB3aXRoIEFuZ3VsYXJQQ29ubmVjdFxuICBhbmd1bGFyUENvbm5lY3REYXRhOiBBbmd1bGFyUENvbm5lY3REYXRhID0ge307XG4gIEBWaWV3Q2hpbGQoJ3VwbG9hZGVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIGZpbGVJbnB1dDogRWxlbWVudFJlZjtcblxuICBsYWJlbCQgPSAnJztcbiAgdmFsdWUkOiBhbnk7XG4gIGJSZXF1aXJlZCQgPSBmYWxzZTtcbiAgYlJlYWRvbmx5JCA9IGZhbHNlO1xuICBiRGlzYWJsZWQkID0gZmFsc2U7XG4gIGJWaXNpYmxlJCA9IHRydWU7XG4gIGJMb2FkaW5nJCA9IGZhbHNlO1xuICBiU2hvd1NlbGVjdG9yJCA9IHRydWU7XG4gIGF0dF9jYXRlZ29yeU5hbWU6IHN0cmluZztcbiAgZmlsZVRlbXA6IGFueSA9IHt9O1xuICBjYXNlSUQ6IGFueTtcbiAgYWxsb3dNdWx0aXBsZSQgPSBmYWxzZTtcbiAgZXh0ZW5zaW9ucyQgPSAnJztcbiAgc3RhdHVzID0gJyc7XG4gIHZhbGlkYXRlTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gJyc7XG4gIHZhbHVlUmVmOiBzdHJpbmc7XG4gIGltYWdlUGF0aCQ6IHN0cmluZztcbiAgbG9jYWxpemVkVmFsID0gUENvcmUuZ2V0TG9jYWxlVXRpbHMoKS5nZXRMb2NhbGVWYWx1ZTtcbiAgbG9jYWxlQ2F0ZWdvcnkgPSAnQ29zbW9zRmllbGRzJztcbiAgdXBsb2FkTXVsdGlwbGVGaWxlc0xhYmVsID0gdGhpcy5sb2NhbGl6ZWRWYWwoJ2ZpbGVfdXBsb2FkX3RleHRfbXVsdGlwbGUnLCB0aGlzLmxvY2FsZUNhdGVnb3J5KTtcbiAgdXBsb2FkU2luZ2xlRmlsZUxhYmVsID0gdGhpcy5sb2NhbGl6ZWRWYWwoJ2ZpbGVfdXBsb2FkX3RleHRfb25lJywgdGhpcy5sb2NhbGVDYXRlZ29yeSk7XG4gIGZpbGVzV2l0aEVycm9yOiBhbnkgPSBbXTtcbiAgZmlsZXM6IGFueSA9IFtdO1xuICBjYXRlZ29yeU5hbWU6IHN0cmluZztcbiAgZGlzcGxheU1vZGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgc3JjSW1nOiBhbnk7XG4gIGRlbGV0ZUljb246IHN0cmluZztcbiAgdGVtcEZpbGVzVG9CZVVwbG9hZGVkOiBhbnlbXTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhbmd1bGFyUENvbm5lY3Q6IEFuZ3VsYXJQQ29ubmVjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1dGlsczogVXRpbHMsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gLy8gRmlyc3QgdGhpbmcgaW4gaW5pdGlhbGl6YXRpb24gaXMgcmVnaXN0ZXJpbmcgYW5kIHN1YnNjcmliaW5nIHRvIHRoZSBBbmd1bGFyUENvbm5lY3Qgc2VydmljZVxuICAgIHRoaXMuYW5ndWxhclBDb25uZWN0RGF0YSA9IHRoaXMuYW5ndWxhclBDb25uZWN0LnJlZ2lzdGVyQW5kU3Vic2NyaWJlQ29tcG9uZW50KHRoaXMsIHRoaXMub25TdGF0ZUNoYW5nZSk7XG4gICAgdGhpcy5jYXNlSUQgPSBQQ29yZS5nZXRTdG9yZVZhbHVlKCcucHlJRCcsICdjYXNlSW5mby5jb250ZW50JywgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSk7XG4gICAgdGhpcy5zcmNJbWcgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCdkb2N1bWVudC1kb2MnLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5kZWxldGVJY29uID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygndHJhc2gnLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5jaGVja0FuZFVwZGF0ZSgpO1xuICAgIHRoaXMuZ2V0QXR0YWNobWVudHMoKTtcbiAgfVxuXG4gIGdldEF0dGFjaG1lbnRzKCkge1xuICAgIGxldCB0ZW1wVXBsb2FkZWRGaWxlcyA9IHRoaXMuZ2V0Q3VycmVudEF0dGFjaG1lbnRzTGlzdCh0aGlzLmdldEF0dGFjaG1lbnRLZXkodGhpcy52YWx1ZVJlZiksIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCkpO1xuICAgIHRlbXBVcGxvYWRlZEZpbGVzID0gdGVtcFVwbG9hZGVkRmlsZXMuZmlsdGVyKGYgPT4gZi5sYWJlbCA9PT0gdGhpcy52YWx1ZVJlZiAmJiBmLmRlbGV0ZSAhPT0gdHJ1ZSk7XG4gICAgdGhpcy5maWxlcz8ubWFwKGYgPT4ge1xuICAgICAgcmV0dXJuIGYucmVzcG9uc2VQcm9wcz8ucHpJbnNLZXkgJiYgIWYucmVzcG9uc2VQcm9wcy5wekluc0tleS5pbmNsdWRlcygndGVtcCcpXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uZixcbiAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgIC4uLmYucHJvcHMsXG4gICAgICAgICAgICAgIG9uRGVsZXRlOiAoKSA9PiB0aGlzLmRlbGV0ZUZpbGUoZilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDogeyAuLi5mIH07XG4gICAgfSk7XG4gICAgdGhpcy5maWxlcyA9IFsuLi50aGlzLmZpbGVzLCAuLi50ZW1wVXBsb2FkZWRGaWxlc107XG4gICAgUENvcmUuZ2V0UHViU3ViVXRpbHMoKS5zdWJzY3JpYmUoXG4gICAgICBQQ29yZS5nZXRDb25zdGFudHMoKS5QVUJfU1VCX0VWRU5UUy5DQVNFX0VWRU5UUy5BU1NJR05NRU5UX1NVQk1JU1NJT04sXG4gICAgICB0aGlzLnJlc2V0QXR0YWNobWVudFN0b3JlZFN0YXRlLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmNhc2VJRFxuICAgICk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIFBDb3JlLmdldFB1YlN1YlV0aWxzKCkudW5zdWJzY3JpYmUoUENvcmUuZ2V0Q29uc3RhbnRzKCkuUFVCX1NVQl9FVkVOVFMuQ0FTRV9FVkVOVFMuQVNTSUdOTUVOVF9TVUJNSVNTSU9OLCB0aGlzLmNhc2VJRCk7XG4gICAgfTtcbiAgfVxuXG4gIGNoZWNrQW5kVXBkYXRlKCkge1xuICAgIC8vIFNob3VsZCBhbHdheXMgY2hlY2sgdGhlIGJyaWRnZSB0byBzZWUgaWYgdGhlIGNvbXBvbmVudCBzaG91bGRcbiAgICAvLyB1cGRhdGUgaXRzZWxmIChyZS1yZW5kZXIpXG4gICAgY29uc3QgYlVwZGF0ZVNlbGYgPSB0aGlzLmFuZ3VsYXJQQ29ubmVjdC5zaG91bGRDb21wb25lbnRVcGRhdGUodGhpcyk7XG5cbiAgICAvLyBPTkxZIGNhbGwgdXBkYXRlU2VsZiB3aGVuIHRoZSBjb21wb25lbnQgc2hvdWxkIHVwZGF0ZVxuICAgIGlmIChiVXBkYXRlU2VsZikge1xuICAgICAgdGhpcy51cGRhdGVTZWxmKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2FsbGJhY2sgcGFzc2VkIHdoZW4gc3Vic2NyaWJpbmcgdG8gc3RvcmUgY2hhbmdlXG4gIG9uU3RhdGVDaGFuZ2UoKSB7XG4gICAgdGhpcy5jaGVja0FuZFVwZGF0ZSgpO1xuICB9XG5cbiAgdXBkYXRlU2VsZigpIHtcbiAgICBjb25zdCBjb25maWdQcm9wczogQXR0YWNobWVudFByb3BzID0gdGhpcy5wQ29ubiQucmVzb2x2ZUNvbmZpZ1Byb3BzKHRoaXMucENvbm4kLmdldENvbmZpZ1Byb3BzKCkpIGFzIEF0dGFjaG1lbnRQcm9wcztcbiAgICBjb25zdCBzdGF0ZVByb3BzOiBhbnkgPSB0aGlzLnBDb25uJC5nZXRTdGF0ZVByb3BzKCk7XG4gICAgY29uc3QgeyB2YWx1ZSwgbGFiZWwsIGV4dGVuc2lvbnMsIGRpc3BsYXlNb2RlIH0gPSBjb25maWdQcm9wcztcblxuICAgIGlmIChjb25maWdQcm9wcy5yZXF1aXJlZCAhPSBudWxsKSB7XG4gICAgICB0aGlzLmJSZXF1aXJlZCQgPSB0aGlzLnV0aWxzLmdldEJvb2xlYW5WYWx1ZShjb25maWdQcm9wcy5yZXF1aXJlZCk7XG4gICAgfVxuICAgIGlmIChjb25maWdQcm9wcy52aXNpYmlsaXR5ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYlZpc2libGUkID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUoY29uZmlnUHJvcHMudmlzaWJpbGl0eSk7XG4gICAgfVxuXG4gICAgLy8gZGlzYWJsZWRcbiAgICBpZiAoY29uZmlnUHJvcHMuZGlzYWJsZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmJEaXNhYmxlZCQgPSB0aGlzLnV0aWxzLmdldEJvb2xlYW5WYWx1ZShjb25maWdQcm9wcy5kaXNhYmxlZCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZ1Byb3BzLnJlYWRPbmx5ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYlJlYWRvbmx5JCA9IHRoaXMudXRpbHMuZ2V0Qm9vbGVhblZhbHVlKGNvbmZpZ1Byb3BzLnJlYWRPbmx5KTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnUHJvcHMuYWxsb3dNdWx0aXBsZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmFsbG93TXVsdGlwbGUkID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUoY29uZmlnUHJvcHMuYWxsb3dNdWx0aXBsZSk7XG4gICAgfVxuXG4gICAgdGhpcy5sYWJlbCQgPSBsYWJlbDtcbiAgICB0aGlzLnZhbHVlJCA9IHZhbHVlO1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdGVQcm9wcy5zdGF0dXM7XG5cbiAgICB0aGlzLnZhbGlkYXRlTWVzc2FnZSA9IHRoaXMuYW5ndWxhclBDb25uZWN0RGF0YS52YWxpZGF0ZU1lc3NhZ2U7XG4gICAgdGhpcy5leHRlbnNpb25zJCA9IGV4dGVuc2lvbnM7XG4gICAgdGhpcy52YWx1ZVJlZiA9ICh0aGlzLnBDb25uJC5nZXRTdGF0ZVByb3BzKCkgYXMgYW55KS52YWx1ZTtcbiAgICB0aGlzLnZhbHVlUmVmID0gdGhpcy52YWx1ZVJlZi5zdGFydHNXaXRoKCcuJykgPyB0aGlzLnZhbHVlUmVmLnN1YnN0cmluZygxKSA6IHRoaXMudmFsdWVSZWY7XG4gICAgdGhpcy5kaXNwbGF5TW9kZSA9IGRpc3BsYXlNb2RlO1xuICAgIC8qIHRoaXMgaXMgYSB0ZW1wb3JhcnkgZml4IGJlY2F1c2UgcmVxdWlyZWQgaXMgc3VwcG9zZWQgdG8gYmUgcGFzc2VkIGFzIGEgYm9vbGVhbiBhbmQgTk9UIGFzIGEgc3RyaW5nICovXG4gICAgbGV0IHsgcmVxdWlyZWQsIGRpc2FibGVkIH0gPSBjb25maWdQcm9wcztcbiAgICBbcmVxdWlyZWQsIGRpc2FibGVkXSA9IFtyZXF1aXJlZCwgZGlzYWJsZWRdLm1hcChwcm9wID0+IHByb3AgPT09IHRydWUgfHwgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJyAmJiBwcm9wID09PSAndHJ1ZScpKTtcblxuICAgIHRoaXMuY2F0ZWdvcnlOYW1lID0gJyc7XG4gICAgaWYgKHZhbHVlICYmIHZhbHVlLnB5Q2F0ZWdvcnlOYW1lKSB7XG4gICAgICB0aGlzLmNhdGVnb3J5TmFtZSA9IHZhbHVlLnB5Q2F0ZWdvcnlOYW1lO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZT8ucHhSZXN1bHRzICYmICt2YWx1ZS5weUNvdW50ID4gMCkge1xuICAgICAgdGhpcy5maWxlcyA9IHZhbHVlLnB4UmVzdWx0cy5tYXAoZiA9PiB0aGlzLmJ1aWxkRmlsZVByb3BzRnJvbVJlc3BvbnNlKGYpKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUF0dGFjaG1lbnRzKCk7XG4gIH1cblxuICBidWlsZEZpbGVQcm9wc0Zyb21SZXNwb25zZShyZXNwT2JqKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIG1ldGE6IGAke3Jlc3BPYmoucHlDYXRlZ29yeU5hbWV9LCAke3Jlc3BPYmoucHhDcmVhdGVPcGVyYXRvcn1gLFxuICAgICAgICBuYW1lOiByZXNwT2JqLnB5QXR0YWNoTmFtZSxcbiAgICAgICAgaWNvbjogdGhpcy51dGlscy5nZXRJY29uRnJvbUZpbGVUeXBlKHJlc3BPYmoucHlNaW1lRmlsZUV4dGVuc2lvbilcbiAgICAgIH0sXG4gICAgICByZXNwb25zZVByb3BzOiB7XG4gICAgICAgIC4uLnJlc3BPYmpcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlQXR0YWNobWVudHMoKSB7XG4gICAgaWYgKHRoaXMuZmlsZXMubGVuZ3RoID4gMCAmJiB0aGlzLmRpc3BsYXlNb2RlICE9PSAnRElTUExBWV9PTkxZJykge1xuICAgICAgY29uc3QgY3VycmVudEF0dGFjaG1lbnRMaXN0ID0gdGhpcy5nZXRDdXJyZW50QXR0YWNobWVudHNMaXN0KHRoaXMuZ2V0QXR0YWNobWVudEtleSh0aGlzLnZhbHVlUmVmKSwgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSk7XG4gICAgICAvLyBibG9jayBkdXBsaWNhdGUgZmlsZXMgdG8gcmVkdXggc3RvcmUgd2hlbiBhZGRlZCAxIGFmdGVyIGFub3RoZXIgdG8gcHJldmVudCBtdWx0aXBsZSBkdXBsaWNhdGVzIGJlaW5nIGFkZGVkIHRvIHRoZSBjYXNlIG9uIHN1Ym1pdFxuICAgICAgY29uc3QgdGVtcEZpbGVzID0gdGhpcy5maWxlcy5maWx0ZXIoZiA9PiBjdXJyZW50QXR0YWNobWVudExpc3QuZmluZEluZGV4KGZyID0+IGZyLklEID09PSBmLklEKSA9PT0gLTEgJiYgIWYuaW5Qcm9ncmVzcyAmJiBmLnJlc3BvbnNlUHJvcHMpO1xuICAgICAgY29uc3QgdXBkYXRlZEF0dExpc3QgPSBbLi4uY3VycmVudEF0dGFjaG1lbnRMaXN0LCAuLi50ZW1wRmlsZXNdO1xuICAgICAgdGhpcy51cGRhdGVBdHRhY2htZW50U3RhdGUodGhpcy5wQ29ubiQsIHRoaXMuZ2V0QXR0YWNobWVudEtleSh0aGlzLnZhbHVlUmVmKSwgdXBkYXRlZEF0dExpc3QpO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0QXR0YWNobWVudFN0b3JlZFN0YXRlKCkge1xuICAgIFBDb3JlLmdldFN0YXRlVXRpbHMoKS51cGRhdGVTdGF0ZSh0aGlzLnBDb25uJD8uZ2V0Q29udGV4dE5hbWUoKSwgdGhpcy5nZXRBdHRhY2htZW50S2V5KHRoaXMudmFsdWVSZWYpLCB1bmRlZmluZWQsIHtcbiAgICAgIHBhZ2VSZWZlcmVuY2U6ICdjb250ZXh0X2RhdGEnLFxuICAgICAgaXNBcnJheURlZXBNZXJnZTogZmFsc2VcbiAgICB9KTtcbiAgfVxuXG4gIGRvd25sb2FkRmlsZShmaWxlT2JqOiBhbnkpIHtcbiAgICBQQ29yZS5nZXRBdHRhY2htZW50VXRpbHMoKVxuICAgICAgLy8gQHRzLWlnbm9yZSAtIDNyZCBwYXJhbWV0ZXIgXCJyZXNwb25zZUVuY29kaW5nXCIgc2hvdWxkIGJlIG9wdGlvbmFsXG4gICAgICAuZG93bmxvYWRBdHRhY2htZW50KGZpbGVPYmoucHpJbnNLZXksIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCkpXG4gICAgICAudGhlbigoY29udGVudDogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGZpbGVPYmoucHlBdHRhY2hOYW1lLnNwbGl0KCcuJykucG9wKCk7XG4gICAgICAgIHRoaXMuZmlsZURvd25sb2FkKGNvbnRlbnQuZGF0YSwgZmlsZU9iai5weUZpbGVOYW1lLCBleHRlbnNpb24pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGZpbGVEb3dubG9hZCA9IChkYXRhLCBmaWxlTmFtZSwgZXh0KSA9PiB7XG4gICAgY29uc3QgZmlsZSA9IGV4dCA/IGAke2ZpbGVOYW1lfS4ke2V4dH1gIDogZmlsZU5hbWU7XG4gICAgZG93bmxvYWQoYXRvYihkYXRhKSwgZmlsZSk7XG4gIH07XG5cbiAgZ2V0QXR0YWNobWVudEtleSA9IChuYW1lID0gJycpID0+IChuYW1lID8gYGF0dGFjaG1lbnRzTGlzdC4ke25hbWV9YCA6ICdhdHRhY2htZW50c0xpc3QnKTtcblxuICBnZXRDdXJyZW50QXR0YWNobWVudHNMaXN0KGtleSwgY29udGV4dCkge1xuICAgIHJldHVybiBQQ29yZS5nZXRTdG9yZVZhbHVlKGAuJHtrZXl9YCwgJ2NvbnRleHRfZGF0YScsIGNvbnRleHQpIHx8IFtdO1xuICB9XG5cbiAgdmFsaWRhdGVNYXhTaXplKGZpbGVPYmosIG1heFNpemVJbk1CKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZmlsZVNpemUgPSAoZmlsZU9iai5zaXplIC8gMTA0ODU3NikudG9GaXhlZCgyKTtcbiAgICByZXR1cm4gcGFyc2VGbG9hdChmaWxlU2l6ZSkgPCBwYXJzZUZsb2F0KG1heFNpemVJbk1CKTtcbiAgfVxuXG4gIHZhbGlkYXRlRmlsZUV4dGVuc2lvbiA9IChmaWxlT2JqLCBhbGxvd2VkRXh0ZW5zaW9ucykgPT4ge1xuICAgIGlmICghYWxsb3dlZEV4dGVuc2lvbnMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBhbGxvd2VkRXh0ZW5zaW9uTGlzdCA9IGFsbG93ZWRFeHRlbnNpb25zXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnNwbGl0KCcsJylcbiAgICAgIC5tYXAoaXRlbSA9PiBpdGVtLnJlcGxhY2VBbGwoJy4nLCAnJykudHJpbSgpKTtcbiAgICBjb25zdCBleHRlbnNpb24gPSBmaWxlT2JqLm5hbWUuc3BsaXQoJy4nKS5wb3AoKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBhbGxvd2VkRXh0ZW5zaW9uTGlzdC5pbmNsdWRlcyhleHRlbnNpb24pO1xuICB9O1xuXG4gIHVwZGF0ZUF0dGFjaG1lbnRTdGF0ZShwQ29ubiwga2V5LCBhdHRhY2htZW50cykge1xuICAgIFBDb3JlLmdldFN0YXRlVXRpbHMoKS51cGRhdGVTdGF0ZSh0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpLCBrZXksIGF0dGFjaG1lbnRzLCB7XG4gICAgICBwYWdlUmVmZXJlbmNlOiAnY29udGV4dF9kYXRhJyxcbiAgICAgIGlzQXJyYXlEZWVwTWVyZ2U6IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICBkZWxldGVGaWxlKGZpbGUpIHtcbiAgICBjb25zdCBhdHRhY2htZW50c0xpc3Q6IGFueVtdID0gW107XG4gICAgbGV0IGN1cnJlbnRBdHRhY2htZW50TGlzdCA9IHRoaXMuZ2V0Q3VycmVudEF0dGFjaG1lbnRzTGlzdCh0aGlzLmdldEF0dGFjaG1lbnRLZXkodGhpcy52YWx1ZVJlZiksIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCkpO1xuXG4gICAgLy8gSWYgZmlsZSB0byBiZSBkZWxldGVkIGlzIHRoZSBvbmUgYWRkZWQgaW4gcHJldmlvdXMgc3RhZ2UgaS5lLiBmb3Igd2hpY2ggYSBmaWxlIGluc3RhbmNlIGlzIGNyZWF0ZWQgaW4gc2VydmVyXG4gICAgLy8gbm8gbmVlZCB0byBmaWx0ZXIgY3VycmVudEF0dGFjaG1lbnRMaXN0IGFzIHdlIHdpbGwgZ2V0IGFub3RoZXIgZW50cnkgb2YgZmlsZSBpbiByZWR1eCB3aXRoIGRlbGV0ZSAmIGxhYmVsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuc2FmZS1vcHRpb25hbC1jaGFpbmluZ1xuICAgIGlmICh0aGlzLnZhbHVlJCAmJiB0aGlzLnZhbHVlJD8ucHhSZXN1bHRzICYmICt0aGlzLnZhbHVlJD8ucHlDb3VudCA+IDAgJiYgZmlsZS5yZXNwb25zZVByb3BzICYmIGZpbGU/LnJlc3BvbnNlUHJvcHM/LnB6SW5zS2V5ICE9PSAndGVtcCcpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRBdHRhY2htZW50cyA9IHRoaXMuZmlsZXMubWFwKGYgPT4ge1xuICAgICAgICBpZiAoZi5yZXNwb25zZVByb3BzICYmIGYucmVzcG9uc2VQcm9wcy5wekluc0tleSA9PT0gZmlsZS5yZXNwb25zZVByb3BzLnB6SW5zS2V5KSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uZiwgZGVsZXRlOiB0cnVlLCBsYWJlbDogdGhpcy52YWx1ZVJlZiB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIHVwZGF0aW5nIHRoZSByZWR1eCBzdG9yZSB0byBoZWxwIGZvcm0taGFuZGxlciBpbiBwYXNzaW5nIHRoZSBkYXRhIHRvIGRlbGV0ZSB0aGUgZmlsZSBmcm9tIHNlcnZlclxuICAgICAgdGhpcy51cGRhdGVBdHRhY2htZW50U3RhdGUodGhpcy5wQ29ubiQsIHRoaXMuZ2V0QXR0YWNobWVudEtleSh0aGlzLnZhbHVlUmVmKSwgWy4uLnVwZGF0ZWRBdHRhY2htZW50c10pO1xuICAgICAgY29uc3QgbmV3bHlBZGRlZEZpbGVzID0gdGhpcy5maWxlcy5maWx0ZXIoZiA9PiAhIWYuSUQpO1xuICAgICAgY29uc3QgZmlsZXNQb3N0RGVsZXRlID0gdGhpcy5maWxlcy5maWx0ZXIoXG4gICAgICAgIGYgPT4gZi5yZXNwb25zZVByb3BzPy5wekluc0tleSAhPT0gJ3RlbXAnICYmIGYucmVzcG9uc2VQcm9wcz8ucHpJbnNLZXkgIT09IGZpbGUucmVzcG9uc2VQcm9wcz8ucHpJbnNLZXlcbiAgICAgICk7XG4gICAgICB0aGlzLmZpbGVzID0gWy4uLmZpbGVzUG9zdERlbGV0ZSwgLi4ubmV3bHlBZGRlZEZpbGVzXTtcbiAgICB9IC8vICBpZiB0aGUgZmlsZSBiZWluZyBkZWxldGVkIGlzIHRoZSBhZGRlZCBpbiB0aGlzIHN0YWdlICBpLmUuIHdob3NlIGRhdGEgaXMgbm90IHlldCBjcmVhdGVkIGluIHNlcnZlclxuICAgIGVsc2Uge1xuICAgICAgLy8gZmlsdGVyIG5ld2x5IGFkZGVkIGZpbGVzIGluIHRoaXMgc3RhZ2UsIGxhdGVyIHRoZSB1cGRhdGVkIGN1cnJlbnQgc3RhZ2UgZmlsZXMgd2lsbCBiZSBhZGRlZCB0byByZWR1eCBvbmNlIGZpbGVzIHN0YXRlIGlzIHVwZGF0ZWRcbiAgICAgIGN1cnJlbnRBdHRhY2htZW50TGlzdCA9IGN1cnJlbnRBdHRhY2htZW50TGlzdC5maWx0ZXIoZiA9PiBmLklEICE9PSBmaWxlLklEKTtcbiAgICAgIHRoaXMuZmlsZXMgPSB0aGlzLmZpbGVzLmZpbHRlcihmID0+IGYuSUQgIT09IGZpbGUuSUQpO1xuXG4gICAgICB0aGlzLnVwZGF0ZUF0dGFjaG1lbnRTdGF0ZSh0aGlzLnBDb25uJCwgdGhpcy5nZXRBdHRhY2htZW50S2V5KHRoaXMudmFsdWVSZWYpLCBbLi4uY3VycmVudEF0dGFjaG1lbnRMaXN0LCAuLi5hdHRhY2htZW50c0xpc3RdKTtcbiAgICAgIGlmIChmaWxlLmluUHJvZ3Jlc3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSAtIDNyZCBwYXJhbWV0ZXIgXCJyZXNwb25zZUVuY29kaW5nXCIgc2hvdWxkIGJlIG9wdGlvbmFsXG4gICAgICAgIFBDb3JlLmdldEF0dGFjaG1lbnRVdGlscygpLmNhbmNlbFJlcXVlc3QoZmlsZS5JRCwgcENvbm4uZ2V0Q29udGV4dE5hbWUoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5maWxlc1dpdGhFcnJvciA9IHRoaXMuZmlsZXNXaXRoRXJyb3I/LmZpbHRlcihmID0+IGYuSUQgIT09IGZpbGUuSUQpO1xuICAgIGlmICh0aGlzLmZpbGVzV2l0aEVycm9yLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5jbGVhckZpZWxkRXJyb3JNZXNzYWdlcygpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC1leHByZXNzaW9uc1xuICAgIHRoaXMuZmlsZUlucHV0ICYmIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPyBudWxsIDogJyc7XG4gIH1cblxuICBvbkZpbGVBZGRlZChldmVudCkge1xuICAgIGxldCBhZGRlZEZpbGVzID0gQXJyYXkuZnJvbShldmVudC50YXJnZXQuZmlsZXMpO1xuICAgIGFkZGVkRmlsZXMgPSB0aGlzLmFsbG93TXVsdGlwbGUkID8gYWRkZWRGaWxlcyA6IFthZGRlZEZpbGVzWzBdXTtcbiAgICBjb25zdCBtYXhBdHRhY2htZW50U2l6ZSA9IFBDb3JlLmdldEVudmlyb25tZW50SW5mbygpLmdldE1heEF0dGFjaG1lbnRTaXplKCkgfHwgJzUnO1xuICAgIHRoaXMudGVtcEZpbGVzVG9CZVVwbG9hZGVkID0gW1xuICAgICAgLi4uYWRkZWRGaWxlcy5tYXAoKGY6IGFueSwgaW5kZXgpID0+IHtcbiAgICAgICAgZi5JRCA9IGAke25ldyBEYXRlKCkuZ2V0VGltZSgpfUkke2luZGV4fWA7XG4gICAgICAgIGYuaW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIGYucHJvcHMgPSB7XG4gICAgICAgICAgdHlwZTogZi50eXBlLFxuICAgICAgICAgIG5hbWU6IGYubmFtZSxcbiAgICAgICAgICBpY29uOiB0aGlzLnV0aWxzLmdldEljb25Gcm9tRmlsZVR5cGUoZi50eXBlKSxcbiAgICAgICAgICBvbkRlbGV0ZTogKCkgPT4gdGhpcy5kZWxldGVGaWxlKGYpXG4gICAgICAgIH07XG4gICAgICAgIGlmICghdGhpcy52YWxpZGF0ZU1heFNpemUoZiwgbWF4QXR0YWNobWVudFNpemUpKSB7XG4gICAgICAgICAgZi5wcm9wcy5lcnJvciA9IHRydWU7XG4gICAgICAgICAgZi5pblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgZi5wcm9wcy5tZXRhID0gdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoYEZpbGUgaXMgdG9vIGJpZy4gTWF4IGFsbG93ZWQgc2l6ZSBpcyAke21heEF0dGFjaG1lbnRTaXplfU1CLmAsICcnLCAnJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMudmFsaWRhdGVGaWxlRXh0ZW5zaW9uKGYsIHRoaXMuZXh0ZW5zaW9ucyQpKSB7XG4gICAgICAgICAgZi5wcm9wcy5lcnJvciA9IHRydWU7XG4gICAgICAgICAgZi5pblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgZi5wcm9wcy5tZXRhID0gYCR7dGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoXG4gICAgICAgICAgICAnRmlsZSBoYXMgaW52YWxpZCBleHRlbnNpb24uIEFsbG93ZWQgZXh0ZW5zaW9ucyBhcmU6JyxcbiAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgJydcbiAgICAgICAgICApfSAke3RoaXMuZXh0ZW5zaW9ucyQucmVwbGFjZUFsbCgnLicsICcnKX1gO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmLnByb3BzLmVycm9yKSB7XG4gICAgICAgICAgY29uc3QgZmllbGROYW1lID0gKHRoaXMucENvbm4kLmdldFN0YXRlUHJvcHMoKSBhcyBhbnkpLnZhbHVlO1xuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpO1xuICAgICAgICAgIFBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCkuYWRkTWVzc2FnZXMoe1xuICAgICAgICAgICAgbWVzc2FnZXM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSAtIFR5cGUgJ3sgdHlwZTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmc7IH0nIGlzIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ01lc3NhZ2VzQ29uZmlnT2JqZWN0Jy5cbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBwQ29ubi5nZXRMb2NhbGl6ZWRWYWx1ZSgnRXJyb3Igd2l0aCBvbmUgb3IgbW9yZSBmaWxlcycsICcnLCAnJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHByb3BlcnR5OiBmaWVsZE5hbWUsXG4gICAgICAgICAgICBwYWdlUmVmZXJlbmNlOiB0aGlzLnBDb25uJC5nZXRQYWdlUmVmZXJlbmNlKCksXG4gICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGY7XG4gICAgICB9KVxuICAgIF07XG4gICAgY29uc3QgdGVtcEZpbGVzV2l0aEVycm9yID0gdGhpcy50ZW1wRmlsZXNUb0JlVXBsb2FkZWQuZmlsdGVyKGYgPT4gZi5wcm9wcy5lcnJvcik7XG4gICAgaWYgKHRlbXBGaWxlc1dpdGhFcnJvci5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmZpbGVzV2l0aEVycm9yID0gdGVtcEZpbGVzV2l0aEVycm9yO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYWxsb3dNdWx0aXBsZSQpIHtcbiAgICAgIHRoaXMuZmlsZXMgPSBbLi4udGhpcy50ZW1wRmlsZXNUb0JlVXBsb2FkZWRdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbGVzID0gWy4uLnRoaXMuZmlsZXMsIC4uLnRoaXMudGVtcEZpbGVzVG9CZVVwbG9hZGVkXTtcbiAgICB9XG4gICAgdGhpcy51cGxvYWRGaWxlcygpO1xuICB9XG5cbiAgY2xlYXJGaWVsZEVycm9yTWVzc2FnZXMoKSB7XG4gICAgY29uc3QgZmllbGROYW1lID0gKHRoaXMucENvbm4kLmdldFN0YXRlUHJvcHMoKSBhcyBhbnkpLnZhbHVlO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpO1xuICAgIFBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCkuY2xlYXJNZXNzYWdlcyh7XG4gICAgICB0eXBlOiBQQ29yZS5nZXRDb25zdGFudHMoKS5NRVNTQUdFUy5NRVNTQUdFU19UWVBFX0VSUk9SLFxuICAgICAgcHJvcGVydHk6IGZpZWxkTmFtZSxcbiAgICAgIHBhZ2VSZWZlcmVuY2U6IHRoaXMucENvbm4kLmdldFBhZ2VSZWZlcmVuY2UoKSxcbiAgICAgIGNvbnRleHRcbiAgICB9KTtcbiAgfVxuXG4gIG9uVXBsb2FkUHJvZ3Jlc3MoKSB7fVxuXG4gIGVycm9ySGFuZGxlcihpc0ZldGNoQ2FuY2VsZWQsIGF0dGFjaGVkRmlsZSkge1xuICAgIHJldHVybiBlcnJvciA9PiB7XG4gICAgICBpZiAoIWlzRmV0Y2hDYW5jZWxlZChlcnJvcikpIHtcbiAgICAgICAgbGV0IHVwbG9hZEZhaWxNc2cgPSB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnU29tZXRoaW5nIHdlbnQgd3JvbmcnLCAnJywgJycpO1xuICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2UgJiYgZXJyb3IucmVzcG9uc2UuZGF0YSAmJiBlcnJvci5yZXNwb25zZS5kYXRhLmVycm9yRGV0YWlscykge1xuICAgICAgICAgIHVwbG9hZEZhaWxNc2cgPSB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZShlcnJvci5yZXNwb25zZS5kYXRhLmVycm9yRGV0YWlsc1swXS5sb2NhbGl6ZWRWYWx1ZSwgJycsICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsZXMubWFwKGYgPT4ge1xuICAgICAgICAgIGlmIChmLklEID09PSBhdHRhY2hlZEZpbGUuSUQpIHtcbiAgICAgICAgICAgIGYucHJvcHMubWV0YSA9IHVwbG9hZEZhaWxNc2c7XG4gICAgICAgICAgICBmLnByb3BzLmVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIGYucHJvcHMub25EZWxldGUgPSAoKSA9PiB0aGlzLmRlbGV0ZUZpbGUoZik7XG4gICAgICAgICAgICBmLnByb3BzLmljb24gPSB0aGlzLnV0aWxzLmdldEljb25Gcm9tRmlsZVR5cGUoZi50eXBlKTtcbiAgICAgICAgICAgIGYucHJvcHMubmFtZSA9IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdVbmFibGUgdG8gdXBsb2FkIGZpbGUnLCAnJywgJycpO1xuICAgICAgICAgICAgZi5pblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSAodGhpcy5wQ29ubiQuZ2V0U3RhdGVQcm9wcygpIGFzIGFueSkudmFsdWU7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKTtcbiAgICAgICAgICAgIC8vIHNldCBlcnJvcnMgdG8gcHJvcGVydHkgdG8gYmxvY2sgc3VibWl0IGV2ZW4gb24gZXJyb3JzIGluIGZpbGUgdXBsb2FkXG4gICAgICAgICAgICBQQ29yZS5nZXRNZXNzYWdlTWFuYWdlcigpLmFkZE1lc3NhZ2VzKHtcbiAgICAgICAgICAgICAgbWVzc2FnZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSAtIFR5cGUgJ3sgdHlwZTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmc7IH0nIGlzIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ01lc3NhZ2VzQ29uZmlnT2JqZWN0Jy5cbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdFcnJvciB3aXRoIG9uZSBvciBtb3JlIGZpbGVzJywgJycsICcnKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcHJvcGVydHk6IGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgcGFnZVJlZmVyZW5jZTogdGhpcy5wQ29ubiQuZ2V0UGFnZVJlZmVyZW5jZSgpLFxuICAgICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlbGV0ZSBmLnByb3BzLnByb2dyZXNzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZjtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9O1xuICB9XG5cbiAgdXBsb2FkRmlsZXMoKSB7XG4gICAgY29uc3QgZmlsZXNUb0JlVXBsb2FkZWQgPSB0aGlzLmZpbGVzXG4gICAgICAuZmlsdGVyKGUgPT4ge1xuICAgICAgICBjb25zdCBpc0ZpbGVVcGxvYWRlZCA9IGUucHJvcHMgJiYgZS5wcm9wcy5wcm9ncmVzcyA9PT0gMTAwO1xuICAgICAgICBjb25zdCBmaWxlSGFzRXJyb3IgPSBlLnByb3BzICYmIGUucHJvcHMuZXJyb3I7XG4gICAgICAgIGNvbnN0IGlzRmlsZVVwbG9hZGVkaW5MYXN0U3RlcCA9IGUucmVzcG9uc2VQcm9wcyAmJiBlLnJlc3BvbnNlUHJvcHMucHpJbnNLZXk7XG4gICAgICAgIHJldHVybiAhaXNGaWxlVXBsb2FkZWQgJiYgIWZpbGVIYXNFcnJvciAmJiAhaXNGaWxlVXBsb2FkZWRpbkxhc3RTdGVwO1xuICAgICAgfSlcbiAgICAgIC5tYXAoZiA9PlxuICAgICAgICB3aW5kb3cuUENvcmUuZ2V0QXR0YWNobWVudFV0aWxzKCkudXBsb2FkQXR0YWNobWVudChcbiAgICAgICAgICBmLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25VcGxvYWRQcm9ncmVzcygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgaXNGZXRjaENhbmNlbGVkID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9ySGFuZGxlcihpc0ZldGNoQ2FuY2VsZWQsIGYpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKVxuICAgICAgICApXG4gICAgICApO1xuICAgIFByb21pc2UuYWxsU2V0dGxlZChmaWxlc1RvQmVVcGxvYWRlZClcbiAgICAgIC50aGVuKChmaWxlUmVzcG9uc2VzOiBhbnkpID0+IHtcbiAgICAgICAgZmlsZVJlc3BvbnNlcyA9IGZpbGVSZXNwb25zZXMuZmlsdGVyKGZyID0+IGZyLnN0YXR1cyAhPT0gJ3JlamVjdGVkJyk7IC8vIGluIGNhc2Ugb2YgZGVsZXRpbmcgYW4gaW4gcHJvZ3Jlc3MgZmlsZSwgcHJvbWlzZSBnZXRzIGNhbmNlbGxlZCBidXQgc3RpbGwgZW50ZXJzIHRoZW4gYmxvY2tcbiAgICAgICAgaWYgKGZpbGVSZXNwb25zZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuZmlsZXMuZm9yRWFjaChmID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZmlsZVJlc3BvbnNlcy5maW5kSW5kZXgoKGZyOiBhbnkpID0+IGZyLnZhbHVlLmNsaWVudEZpbGVJRCA9PT0gZi5JRCk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICBmLnByb3BzLm1ldGEgPSB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnVXBsb2FkZWQgc3VjY2Vzc2Z1bGx5JywgJycsICcnKTtcbiAgICAgICAgICAgICAgZi5wcm9wcy5wcm9ncmVzcyA9IDEwMDtcbiAgICAgICAgICAgICAgZi5pblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgIGYuaGFuZGxlID0gZmlsZVJlc3BvbnNlc1tpbmRleF0udmFsdWUuSUQ7XG4gICAgICAgICAgICAgIGYubGFiZWwgPSB0aGlzLnZhbHVlUmVmO1xuICAgICAgICAgICAgICBmLmNhdGVnb3J5ID0gdGhpcy5jYXRlZ29yeU5hbWU7XG4gICAgICAgICAgICAgIGYucmVzcG9uc2VQcm9wcyA9IHtcbiAgICAgICAgICAgICAgICBwekluc0tleTogJ3RlbXAnLFxuICAgICAgICAgICAgICAgIHB5QXR0YWNoTmFtZTogZi5wcm9wcy5uYW1lXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy51cGRhdGVBdHRhY2htZW50cygpO1xuICAgICAgICAgIGlmICh0aGlzLmZpbGVzV2l0aEVycm9yPy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJGaWVsZEVycm9yTWVzc2FnZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFuZ3VsYXJQQ29ubmVjdERhdGEudW5zdWJzY3JpYmVGbikge1xuICAgICAgdGhpcy5hbmd1bGFyUENvbm5lY3REYXRhLnVuc3Vic2NyaWJlRm4oKTtcbiAgICB9XG5cbiAgICBQQ29yZS5nZXRQdWJTdWJVdGlscygpLnVuc3Vic2NyaWJlKFBDb3JlLmdldENvbnN0YW50cygpLlBVQl9TVUJfRVZFTlRTLkNBU0VfRVZFTlRTLkFTU0lHTk1FTlRfU1VCTUlTU0lPTiwgdGhpcy5jYXNlSUQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZmlsZS11cGxvYWQtY29udGFpbmVyXCIgKm5nSWY9XCJiVmlzaWJsZSRcIj5cbiAgPHNwYW4gY2xhc3M9XCJhdHRhY2htZW50LWxhYmVsXCIgW25nQ2xhc3NdPVwieyAnZmlsZS1sYWJlbCc6IGJSZXF1aXJlZCQgfVwiPnt7IGxhYmVsJCB9fTwvc3Bhbj5cbiAgPGRpdiAqbmdJZj1cIihmaWxlcy5sZW5ndGggPT09IDAgJiYgIWFsbG93TXVsdGlwbGUkKSB8fCBhbGxvd011bHRpcGxlJFwiPlxuICAgIDxkaXZcbiAgICAgIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTBweFwiXG4gICAgICBpZD1cImF0dGFjaG1lbnQtY29udGFpbmVyXCJcbiAgICAgIFtuZ0NsYXNzXT1cInZhbGlkYXRlTWVzc2FnZSA/ICdwc2RrLW1vZGFsLWZpbGUtc2VsZWN0b3ItZXJyb3InIDogJ3BzZGstbW9kYWwtZmlsZS1zZWxlY3RvcidcIlxuICAgID5cbiAgICAgIDxkaXYgW2hpZGRlbl09XCJ0cnVlXCIgaWQ9XCJhdHRhY2htZW50LUlEXCI+XG4gICAgICAgIHt7IHZhbHVlUmVmIH19XG4gICAgICA8L2Rpdj5cbiAgICAgIDxpbnB1dCBoaWRkZW4gdHlwZT1cImZpbGVcIiBbcmVxdWlyZWRdPVwiYlJlcXVpcmVkJFwiICN1cGxvYWRlciBbaWRdPVwidmFsdWVSZWZcIiBbbXVsdGlwbGVdPVwiYWxsb3dNdWx0aXBsZSRcIiAoY2hhbmdlKT1cIm9uRmlsZUFkZGVkKCRldmVudClcIiAvPlxuICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgW2Rpc2FibGVkXT1cImJEaXNhYmxlZCRcIiAoY2xpY2spPVwidXBsb2FkZXIuY2xpY2soKVwiPlxuICAgICAgICB7e1xuICAgICAgICAgIGFsbG93TXVsdGlwbGUkXG4gICAgICAgICAgICA/IHVwbG9hZE11bHRpcGxlRmlsZXNMYWJlbCA9PT0gJ2ZpbGVfdXBsb2FkX3RleHRfbXVsdGlwbGUnXG4gICAgICAgICAgICAgID8gJ0Nob29zZSBmaWxlcydcbiAgICAgICAgICAgICAgOiB1cGxvYWRNdWx0aXBsZUZpbGVzTGFiZWxcbiAgICAgICAgICAgIDogdXBsb2FkU2luZ2xlRmlsZUxhYmVsID09PSAnZmlsZV91cGxvYWRfdGV4dF9vbmUnXG4gICAgICAgICAgICAgID8gJ0Nob29zZSBhIGZpbGUnXG4gICAgICAgICAgICAgIDogdXBsb2FkU2luZ2xlRmlsZUxhYmVsXG4gICAgICAgIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxzcGFuICpuZ0lmPVwidmFsaWRhdGVNZXNzYWdlXCIgY2xhc3M9XCJmaWxlLWVycm9yXCI+e3sgdmFsaWRhdGVNZXNzYWdlIH19PC9zcGFuPlxuICA8ZGl2ICpuZ0lmPVwiZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMFwiPlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpbGUgb2YgZmlsZXNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLWF0dGFjaG1lbnQtY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBzZGstdXRpbGl0eS1jYXJkLWljb25cIj5cbiAgICAgICAgICA8aW1nICpuZ0lmPVwiIWZpbGUuaW5Qcm9ncmVzc1wiIGNsYXNzPVwicHNkay1hdHRhY2htZW50LWNhcmQtc3ZnLWljb25cIiBzcmM9XCJ7eyBzcmNJbWcgfX1cIiAvPlxuICAgICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImZpbGUuaW5Qcm9ncmVzc1wiIGNsYXNzPVwicHJvZ3Jlc3Mtc3Bpbm5lclwiIGRpYW1ldGVyPVwiNDBcIj48L21hdC1zcGlubmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstYXR0YWNobWVudC1jYXJkLW1haW5cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1hdHRhY2htZW50LWNhcmQtbWFpbi1wcmltYXJ5LWxhYmVsXCI+e3sgZmlsZS5wcm9wcy5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImZpbGUucHJvcHMubWV0YVwiIFtuZ1N0eWxlXT1cInsgY29sb3I6IGZpbGUucHJvcHMuZXJyb3IgPyAncmVkJyA6IG51bGwgfVwiPnt7IGZpbGUucHJvcHMubWV0YSB9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstYXR0YWNobWVudC1hY3Rpb25cIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZGVsZXRlLWF0dGFjaG1lbnRcIiAqbmdJZj1cImZpbGUuSURcIiBjbGFzcz1cInBzZGstdXRpbGl0eS1idXR0b25cIiAoY2xpY2spPVwiZGVsZXRlRmlsZShmaWxlKVwiPlxuICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstdXRpbGl0eS1jYXJkLWFjdGlvbi1zdmctaWNvblwiIHNyYz1cInt7IGRlbGV0ZUljb24gfX1cIiAvPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIhZmlsZS5JRFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNldHRpbmctYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJhY3Rpb25NZW51XCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8bWF0LW1lbnUgI2FjdGlvbk1lbnU9XCJtYXRNZW51XCI+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZG93bmxvYWRGaWxlKGZpbGUucmVzcG9uc2VQcm9wcyA/IGZpbGUucmVzcG9uc2VQcm9wcyA6IHt9KVwiPkRvd25sb2FkPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZGVsZXRlRmlsZShmaWxlKVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==