vc-create-dashboard 3.1.2 → 3.1.6

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 (176) hide show
  1. package/fesm2022/vc-create-dashboard.mjs +8632 -6556
  2. package/fesm2022/vc-create-dashboard.mjs.map +1 -1
  3. package/package.json +7 -8
  4. package/types/vc-create-dashboard.d.ts +2284 -0
  5. package/esm2022/lib/configurations.mjs +0 -7
  6. package/esm2022/lib/create-dashboard-container/categories/categories-config.mjs +0 -2
  7. package/esm2022/lib/create-dashboard-container/categories/categories.component.mjs +0 -212
  8. package/esm2022/lib/create-dashboard-container/configure-widgets/configure-widgets/configure-widgets.component.mjs +0 -350
  9. package/esm2022/lib/create-dashboard-container/configure-widgets/configure-widgets/widget.interface.mjs +0 -2
  10. package/esm2022/lib/create-dashboard-container/configure-widgets/configure-widgets.module.mjs +0 -47
  11. package/esm2022/lib/create-dashboard-container/constants/assets.constant.mjs +0 -37
  12. package/esm2022/lib/create-dashboard-container/create-dashboard-config.mjs +0 -2
  13. package/esm2022/lib/create-dashboard-container/create-dashboard.component.mjs +0 -1601
  14. package/esm2022/lib/create-dashboard-container/create-dashboard.module.mjs +0 -127
  15. package/esm2022/lib/create-dashboard-container/directives/directives.module.mjs +0 -24
  16. package/esm2022/lib/create-dashboard-container/directives/scroll-in-view.directive.mjs +0 -36
  17. package/esm2022/lib/create-dashboard-container/form-group/form-group.component.mjs +0 -153
  18. package/esm2022/lib/create-dashboard-container/frequency/frequency.component.mjs +0 -309
  19. package/esm2022/lib/create-dashboard-container/interfaces/widget-data-model.mjs +0 -2
  20. package/esm2022/lib/create-dashboard-container/pipes/filter.pipe.mjs +0 -30
  21. package/esm2022/lib/create-dashboard-container/pipes/search-program.pipe.mjs +0 -37
  22. package/esm2022/lib/create-dashboard-container/pipes/search.pipe.mjs +0 -25
  23. package/esm2022/lib/create-dashboard-container/pipes/text-count.pipe.mjs +0 -18
  24. package/esm2022/lib/create-dashboard-container/program-list/constant.mjs +0 -31
  25. package/esm2022/lib/create-dashboard-container/program-list/information-block/information-block.component.mjs +0 -13
  26. package/esm2022/lib/create-dashboard-container/program-list/interfaces/list-item.interface.mjs +0 -2
  27. package/esm2022/lib/create-dashboard-container/program-list/list-container/list-container.component.mjs +0 -50
  28. package/esm2022/lib/create-dashboard-container/program-list/pipes/check-selected-items.pipes.mjs +0 -23
  29. package/esm2022/lib/create-dashboard-container/program-list/program-list/program-list.component.mjs +0 -294
  30. package/esm2022/lib/create-dashboard-container/program-list/program-list.module.mjs +0 -60
  31. package/esm2022/lib/create-dashboard-container/program-list/services/list-utils.service.mjs +0 -27
  32. package/esm2022/lib/create-dashboard-container/program-list/services/program-list-api.service.mjs +0 -28
  33. package/esm2022/lib/create-dashboard-container/responsibility-center/responsibility-center.component.mjs +0 -239
  34. package/esm2022/lib/create-dashboard-container/risk-categories/risk-categories-config.mjs +0 -2
  35. package/esm2022/lib/create-dashboard-container/risk-categories/risk-categories.component.mjs +0 -206
  36. package/esm2022/lib/create-dashboard-container/services/configure-widgets.service.mjs +0 -233
  37. package/esm2022/lib/create-dashboard-container/services/create-dashboard.service.mjs +0 -222
  38. package/esm2022/lib/create-dashboard-container/services/pagination.service.mjs +0 -28
  39. package/esm2022/lib/create-dashboard-container/user-list/user-list.component.mjs +0 -440
  40. package/esm2022/lib/create-dashboard-container/user-list/user-list.config.mjs +0 -2
  41. package/esm2022/lib/create-dashboard-container/utils/dashboard-edit.utils.mjs +0 -181
  42. package/esm2022/lib/create-dashboard.service.mjs +0 -14
  43. package/esm2022/lib/ui-kit/dashboard-footer/dashboard-footer/dashboard-footer.component.mjs +0 -52
  44. package/esm2022/lib/ui-kit/dashboard-footer/dashboard-footer-config.mjs +0 -2
  45. package/esm2022/lib/ui-kit/dashboard-footer/dashboard-footer.module.mjs +0 -32
  46. package/esm2022/lib/ui-kit/dialog/dialog-config.mjs +0 -7
  47. package/esm2022/lib/ui-kit/dialog/dialog-injector.mjs +0 -17
  48. package/esm2022/lib/ui-kit/dialog/dialog-ref.mjs +0 -11
  49. package/esm2022/lib/ui-kit/dialog/dialog.component.mjs +0 -96
  50. package/esm2022/lib/ui-kit/dialog/dialog.module.mjs +0 -20
  51. package/esm2022/lib/ui-kit/dialog/dialog.service.mjs +0 -56
  52. package/esm2022/lib/ui-kit/dialog/insertion.directive.mjs +0 -17
  53. package/esm2022/lib/ui-kit/floating-bar/floating-bar.component.mjs +0 -57
  54. package/esm2022/lib/ui-kit/floating-bar/floating-bar.module.mjs +0 -32
  55. package/esm2022/lib/ui-kit/formgroup/click-outside.directive.mjs +0 -30
  56. package/esm2022/lib/ui-kit/formgroup/cs-checkbox/cs-checkbox.component.mjs +0 -29
  57. package/esm2022/lib/ui-kit/formgroup/cs-radio/cs-radio.component.mjs +0 -34
  58. package/esm2022/lib/ui-kit/formgroup/cs-radio-group/cs-radio-group.component.mjs +0 -14
  59. package/esm2022/lib/ui-kit/formgroup/cs-select/cs-select.component.mjs +0 -119
  60. package/esm2022/lib/ui-kit/formgroup/cs-switch/cs-switch.component.mjs +0 -39
  61. package/esm2022/lib/ui-kit/formgroup/formgroup.module.mjs +0 -55
  62. package/esm2022/lib/ui-kit/formgroup/pipes/pascal.pipe.mjs +0 -19
  63. package/esm2022/lib/ui-kit/formgroup/pipes/searchMultiSelect.pipe.mjs +0 -24
  64. package/esm2022/lib/ui-kit/loaders/loaders.module.mjs +0 -24
  65. package/esm2022/lib/ui-kit/loaders/table-loader/table-loader.component.mjs +0 -18
  66. package/esm2022/lib/ui-kit/no-data/no-data.component.mjs +0 -47
  67. package/esm2022/lib/ui-kit/no-data/no-data.module.mjs +0 -18
  68. package/esm2022/lib/ui-kit/pagination/pagination.component.mjs +0 -130
  69. package/esm2022/lib/ui-kit/pagination/pagination.module.mjs +0 -18
  70. package/esm2022/lib/ui-kit/popover/popover.component.mjs +0 -129
  71. package/esm2022/lib/ui-kit/popover/popover.directive.mjs +0 -93
  72. package/esm2022/lib/ui-kit/popover/popover.module.mjs +0 -21
  73. package/esm2022/lib/ui-kit/popover/popover.service.mjs +0 -23
  74. package/esm2022/lib/ui-kit/select/cs-option/cs-option.component.mjs +0 -41
  75. package/esm2022/lib/ui-kit/select/cs-select/cs-select.component.mjs +0 -107
  76. package/esm2022/lib/ui-kit/select/safe-html.pipe.mjs +0 -21
  77. package/esm2022/lib/ui-kit/select/select.module.mjs +0 -21
  78. package/esm2022/lib/ui-kit/services/cs-select.service.mjs +0 -16
  79. package/esm2022/lib/ui-kit/smiley-dialog/smiley-dialog.component.mjs +0 -52
  80. package/esm2022/lib/ui-kit/smiley-dialog/smiley-dialog.module.mjs +0 -18
  81. package/esm2022/lib/ui-kit/snack-bar/snack-bar/snack-bar.component.mjs +0 -46
  82. package/esm2022/lib/ui-kit/snack-bar/snack-bar.module.mjs +0 -18
  83. package/esm2022/lib/ui-kit/snack-bar/snack-bar.service.mjs +0 -23
  84. package/esm2022/lib/ui-kit/tooltip/tooltip.directive.mjs +0 -168
  85. package/esm2022/lib/ui-kit/tooltip/tooltip.module.mjs +0 -18
  86. package/esm2022/lib/ui-kit/v-loader/loader/loader.component.mjs +0 -24
  87. package/esm2022/lib/ui-kit/v-loader/loader-inline/loader-inline.component.mjs +0 -24
  88. package/esm2022/lib/ui-kit/v-loader/v-loader.module.mjs +0 -19
  89. package/esm2022/public-api.mjs +0 -10
  90. package/esm2022/vc-create-dashboard.mjs +0 -5
  91. package/index.d.ts +0 -5
  92. package/lib/configurations.d.ts +0 -4
  93. package/lib/create-dashboard-container/categories/categories-config.d.ts +0 -18
  94. package/lib/create-dashboard-container/categories/categories.component.d.ts +0 -66
  95. package/lib/create-dashboard-container/configure-widgets/configure-widgets/configure-widgets.component.d.ts +0 -113
  96. package/lib/create-dashboard-container/configure-widgets/configure-widgets/widget.interface.d.ts +0 -9
  97. package/lib/create-dashboard-container/configure-widgets/configure-widgets.module.d.ts +0 -14
  98. package/lib/create-dashboard-container/constants/assets.constant.d.ts +0 -35
  99. package/lib/create-dashboard-container/create-dashboard-config.d.ts +0 -18
  100. package/lib/create-dashboard-container/create-dashboard.component.d.ts +0 -219
  101. package/lib/create-dashboard-container/create-dashboard.module.d.ts +0 -37
  102. package/lib/create-dashboard-container/directives/directives.module.d.ts +0 -8
  103. package/lib/create-dashboard-container/directives/scroll-in-view.directive.d.ts +0 -12
  104. package/lib/create-dashboard-container/form-group/form-group.component.d.ts +0 -48
  105. package/lib/create-dashboard-container/frequency/frequency.component.d.ts +0 -39
  106. package/lib/create-dashboard-container/interfaces/widget-data-model.d.ts +0 -8
  107. package/lib/create-dashboard-container/pipes/filter.pipe.d.ts +0 -7
  108. package/lib/create-dashboard-container/pipes/search-program.pipe.d.ts +0 -7
  109. package/lib/create-dashboard-container/pipes/search.pipe.d.ts +0 -7
  110. package/lib/create-dashboard-container/pipes/text-count.pipe.d.ts +0 -7
  111. package/lib/create-dashboard-container/program-list/constant.d.ts +0 -24
  112. package/lib/create-dashboard-container/program-list/information-block/information-block.component.d.ts +0 -6
  113. package/lib/create-dashboard-container/program-list/interfaces/list-item.interface.d.ts +0 -5
  114. package/lib/create-dashboard-container/program-list/list-container/list-container.component.d.ts +0 -9
  115. package/lib/create-dashboard-container/program-list/pipes/check-selected-items.pipes.d.ts +0 -7
  116. package/lib/create-dashboard-container/program-list/program-list/program-list.component.d.ts +0 -119
  117. package/lib/create-dashboard-container/program-list/program-list.module.d.ts +0 -17
  118. package/lib/create-dashboard-container/program-list/services/list-utils.service.d.ts +0 -7
  119. package/lib/create-dashboard-container/program-list/services/program-list-api.service.d.ts +0 -12
  120. package/lib/create-dashboard-container/responsibility-center/responsibility-center.component.d.ts +0 -72
  121. package/lib/create-dashboard-container/risk-categories/risk-categories-config.d.ts +0 -18
  122. package/lib/create-dashboard-container/risk-categories/risk-categories.component.d.ts +0 -66
  123. package/lib/create-dashboard-container/services/configure-widgets.service.d.ts +0 -21
  124. package/lib/create-dashboard-container/services/create-dashboard.service.d.ts +0 -80
  125. package/lib/create-dashboard-container/services/pagination.service.d.ts +0 -12
  126. package/lib/create-dashboard-container/user-list/user-list.component.d.ts +0 -123
  127. package/lib/create-dashboard-container/user-list/user-list.config.d.ts +0 -13
  128. package/lib/create-dashboard-container/utils/dashboard-edit.utils.d.ts +0 -16
  129. package/lib/create-dashboard.service.d.ts +0 -6
  130. package/lib/ui-kit/dashboard-footer/dashboard-footer/dashboard-footer.component.d.ts +0 -17
  131. package/lib/ui-kit/dashboard-footer/dashboard-footer-config.d.ts +0 -11
  132. package/lib/ui-kit/dashboard-footer/dashboard-footer.module.d.ts +0 -10
  133. package/lib/ui-kit/dialog/dialog-config.d.ts +0 -6
  134. package/lib/ui-kit/dialog/dialog-injector.d.ts +0 -7
  135. package/lib/ui-kit/dialog/dialog-ref.d.ts +0 -7
  136. package/lib/ui-kit/dialog/dialog.component.d.ts +0 -33
  137. package/lib/ui-kit/dialog/dialog.module.d.ts +0 -9
  138. package/lib/ui-kit/dialog/dialog.service.d.ts +0 -17
  139. package/lib/ui-kit/dialog/insertion.directive.d.ts +0 -8
  140. package/lib/ui-kit/floating-bar/floating-bar.component.d.ts +0 -20
  141. package/lib/ui-kit/floating-bar/floating-bar.module.d.ts +0 -10
  142. package/lib/ui-kit/formgroup/click-outside.directive.d.ts +0 -10
  143. package/lib/ui-kit/formgroup/cs-checkbox/cs-checkbox.component.d.ts +0 -13
  144. package/lib/ui-kit/formgroup/cs-radio/cs-radio.component.d.ts +0 -15
  145. package/lib/ui-kit/formgroup/cs-radio-group/cs-radio-group.component.d.ts +0 -8
  146. package/lib/ui-kit/formgroup/cs-select/cs-select.component.d.ts +0 -36
  147. package/lib/ui-kit/formgroup/cs-switch/cs-switch.component.d.ts +0 -15
  148. package/lib/ui-kit/formgroup/formgroup.module.d.ts +0 -17
  149. package/lib/ui-kit/formgroup/pipes/pascal.pipe.d.ts +0 -7
  150. package/lib/ui-kit/formgroup/pipes/searchMultiSelect.pipe.d.ts +0 -7
  151. package/lib/ui-kit/loaders/loaders.module.d.ts +0 -8
  152. package/lib/ui-kit/loaders/table-loader/table-loader.component.d.ts +0 -9
  153. package/lib/ui-kit/no-data/no-data.component.d.ts +0 -19
  154. package/lib/ui-kit/no-data/no-data.module.d.ts +0 -8
  155. package/lib/ui-kit/pagination/pagination.component.d.ts +0 -21
  156. package/lib/ui-kit/pagination/pagination.module.d.ts +0 -8
  157. package/lib/ui-kit/popover/popover.component.d.ts +0 -28
  158. package/lib/ui-kit/popover/popover.directive.d.ts +0 -17
  159. package/lib/ui-kit/popover/popover.module.d.ts +0 -9
  160. package/lib/ui-kit/popover/popover.service.d.ts +0 -13
  161. package/lib/ui-kit/select/cs-option/cs-option.component.d.ts +0 -16
  162. package/lib/ui-kit/select/cs-select/cs-select.component.d.ts +0 -32
  163. package/lib/ui-kit/select/safe-html.pipe.d.ts +0 -10
  164. package/lib/ui-kit/select/select.module.d.ts +0 -11
  165. package/lib/ui-kit/services/cs-select.service.d.ts +0 -7
  166. package/lib/ui-kit/smiley-dialog/smiley-dialog.component.d.ts +0 -17
  167. package/lib/ui-kit/smiley-dialog/smiley-dialog.module.d.ts +0 -8
  168. package/lib/ui-kit/snack-bar/snack-bar/snack-bar.component.d.ts +0 -17
  169. package/lib/ui-kit/snack-bar/snack-bar.module.d.ts +0 -8
  170. package/lib/ui-kit/snack-bar/snack-bar.service.d.ts +0 -9
  171. package/lib/ui-kit/tooltip/tooltip.directive.d.ts +0 -28
  172. package/lib/ui-kit/tooltip/tooltip.module.d.ts +0 -8
  173. package/lib/ui-kit/v-loader/loader/loader.component.d.ts +0 -11
  174. package/lib/ui-kit/v-loader/loader-inline/loader-inline.component.d.ts +0 -11
  175. package/lib/ui-kit/v-loader/v-loader.module.d.ts +0 -9
  176. package/public-api.d.ts +0 -3
@@ -1,1601 +0,0 @@
1
- import { Component, EventEmitter, HostListener, Input, Output, ViewChild, } from '@angular/core';
2
- import dayjs from 'dayjs';
3
- import { forkJoin } from 'rxjs';
4
- import { finalize, map } from 'rxjs/operators';
5
- import { TextCountPipe } from './pipes/text-count.pipe';
6
- import { ASSETS } from './constants/assets.constant';
7
- import { PROGRAM_LIST_API } from './program-list/constant';
8
- import { buildProgramSelectionMapFromCategories, extractCategoryIdsFromDashboard, extractProgramIdsFromDashboard, extractRcIdsFromDashboard, filterActiveWidgets, flattenProgramSelectionMap, getEditDashboardCdid, getSelectedProgramsMap, hasProgramSelectionInMap, normalizeIdArray, normalizeProgramCategories, normalizeProgramSelectionMap, parseSailsProgramList, } from './utils/dashboard-edit.utils';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "./services/create-dashboard.service";
11
- import * as i2 from "./services/pagination.service";
12
- import * as i3 from "../ui-kit/snack-bar/snack-bar.service";
13
- import * as i4 from "../ui-kit/popover/popover.service";
14
- import * as i5 from "./pipes/text-count.pipe";
15
- import * as i6 from "@angular/common";
16
- import * as i7 from "@vcomply/editor";
17
- import * as i8 from "@angular/forms";
18
- import * as i9 from "../ui-kit/tooltip/tooltip.directive";
19
- import * as i10 from "./configure-widgets/configure-widgets/configure-widgets.component";
20
- import * as i11 from "../ui-kit/popover/popover.component";
21
- import * as i12 from "../ui-kit/popover/popover.directive";
22
- import * as i13 from "../ui-kit/v-loader/loader-inline/loader-inline.component";
23
- import * as i14 from "../ui-kit/snack-bar/snack-bar/snack-bar.component";
24
- import * as i15 from "./directives/scroll-in-view.directive";
25
- import * as i16 from "../ui-kit/smiley-dialog/smiley-dialog.component";
26
- import * as i17 from "ng2-date-picker";
27
- import * as i18 from "./program-list/program-list/program-list.component";
28
- import * as i19 from "./program-list/list-container/list-container.component";
29
- import * as i20 from "./program-list/information-block/information-block.component";
30
- import * as i21 from "./user-list/user-list.component";
31
- import * as i22 from "./responsibility-center/responsibility-center.component";
32
- export class CreateDashboardComponent {
33
- createDashboardService;
34
- paginationService;
35
- cdr;
36
- snackBar;
37
- popoverService;
38
- textCount;
39
- feature;
40
- activeSelector = '';
41
- disabled = false;
42
- mode = 'CREATE';
43
- dashboardId = '';
44
- dashboardDetails = null; // for edit dashboard
45
- /** API dashboard object from createDashboard response (used when navigating after create). */
46
- createdDashboard = null;
47
- /** True after CREATE API succeeds; widget save should emit `created` for app redirect. */
48
- redirectAfterCreate = false;
49
- close = new EventEmitter();
50
- createdBy = 0;
51
- fromDatePicker;
52
- toDatePicker;
53
- animation = true;
54
- configureWidget = false;
55
- ASSETS = ASSETS;
56
- totalPages = 1;
57
- totalList = 1;
58
- usersList = [];
59
- vLoader = true;
60
- userListLoaded = false;
61
- groupListLoaded = false;
62
- rcListLoaded = false;
63
- hideToDate = false;
64
- listDetails = {
65
- selectedUsersList: [],
66
- selectedGroupList: [],
67
- nonRemovableUsersList: [],
68
- displayElementKey: 'member_name',
69
- displayGroupKey: 'group_name',
70
- groupIdkey: 'group_id',
71
- elementIdKey: 'member_id',
72
- tooltipKey: 'member_email',
73
- };
74
- dashboardDescription = {
75
- placeholder: 'Description (Max limit: 250 characters)',
76
- mode: 'prime',
77
- id: 'description',
78
- };
79
- responsibilityCategoriesTree = {
80
- regulations: {
81
- list: [],
82
- selectedList: [],
83
- },
84
- standards: {
85
- list: [],
86
- selectedList: [],
87
- },
88
- internalControls: {
89
- list: [],
90
- selectedList: [],
91
- },
92
- others: {
93
- list: [],
94
- selectedList: [],
95
- },
96
- };
97
- allComplianceCategories = [];
98
- allRiskCategories = [];
99
- showRiskCategory = false;
100
- showCriteria = true;
101
- dashboardForm = {
102
- dashboardName: '',
103
- dashboardDescriptionText: '',
104
- selectedViewers: [],
105
- selectedGroup: [],
106
- selectedFromDate: undefined,
107
- selectedToDate: undefined,
108
- selectedResponsibilityCenters: [],
109
- selectedResponsibilityCategories: [],
110
- selectedRiskCategories: [],
111
- displayCriteria: 'or',
112
- configureWidget: [],
113
- frequencyDetails: '',
114
- selectedFrequencyType: '',
115
- selectedFrequencies: [0],
116
- frequencyMessage: '',
117
- frequencyDate: 1,
118
- };
119
- openConfigureWidgets = false;
120
- selectedWidgets = [];
121
- displayedWidgets = [];
122
- responsibilityCentersList = [];
123
- datePickerOverlay = false;
124
- dayNames = [
125
- 'Monday',
126
- 'Tuesday',
127
- 'Wednesday',
128
- 'Thursday',
129
- 'Friday',
130
- 'Saturday',
131
- 'Sunday',
132
- ];
133
- monthNames = [
134
- 'January',
135
- 'February',
136
- 'March',
137
- 'April',
138
- 'May',
139
- 'June',
140
- 'July',
141
- 'August',
142
- 'September',
143
- 'October',
144
- 'November',
145
- 'December',
146
- ];
147
- quarters = [
148
- 'January, April, July, October',
149
- 'February, May, August, November',
150
- 'March, June, September, December',
151
- ];
152
- showRiskWidgets = false;
153
- showComplianceWidgets = false;
154
- isManageRisk = false;
155
- riskCategoryList = {
156
- strategic: {
157
- list: [],
158
- selectedList: [],
159
- },
160
- operational: {
161
- list: [],
162
- selectedList: [],
163
- },
164
- compliance: {
165
- list: [],
166
- selectedList: [],
167
- },
168
- others: {
169
- list: [],
170
- selectedList: [],
171
- },
172
- };
173
- programListUrl = PROGRAM_LIST_API;
174
- datePickerBaseConfig = {
175
- openOnClick: false,
176
- openOnFocus: false,
177
- hideInputContainer: true,
178
- hideOnOutsideClick: true,
179
- };
180
- fromDatePickerConfig = {
181
- ...this.datePickerBaseConfig,
182
- min: this.getCurrentDate(),
183
- };
184
- toDatePickerConfig = {
185
- ...this.datePickerBaseConfig,
186
- };
187
- isSmiley;
188
- smileyMessage = '';
189
- groupList;
190
- groupsEnabled = true;
191
- totalgroups;
192
- openedDatePicker = '';
193
- selectedPrograms = {};
194
- allProgamSelected = [];
195
- pendingEditRcIds = [];
196
- pendingEditRcEntries = [];
197
- editFormHydrated = false;
198
- /** Tracks in-flight EDIT hydration HTTP calls; loader stays on until zero. */
199
- editHydrationCount = 0;
200
- constructor(createDashboardService, paginationService, cdr, snackBar, popoverService, textCount) {
201
- this.createDashboardService = createDashboardService;
202
- this.paginationService = paginationService;
203
- this.cdr = cdr;
204
- this.snackBar = snackBar;
205
- this.popoverService = popoverService;
206
- this.textCount = textCount;
207
- }
208
- ngOnChanges(changes) {
209
- if (this.createdBy) {
210
- this.listDetails.nonRemovableUsersList.push(this.createdBy);
211
- }
212
- if (this.mode === 'EDIT' &&
213
- changes['dashboardDetails']?.currentValue &&
214
- this.rcListLoaded &&
215
- this.userListLoaded &&
216
- this.groupListLoaded) {
217
- this.hydrateEditForm();
218
- }
219
- }
220
- onKeydownHandler(event) {
221
- this.close.emit({ mode: 'discard' });
222
- this.isSmiley = false;
223
- }
224
- ngOnInit() {
225
- this.animateContainer();
226
- this.getRCList();
227
- this.checkWhetherAllListsLoaded();
228
- this.getUsersList('');
229
- this.getGroupList();
230
- this.getUserInfo();
231
- }
232
- animateContainer() {
233
- this.animation = true;
234
- setTimeout(() => {
235
- this.animation = false;
236
- }, 300);
237
- }
238
- getUserInfo() {
239
- this.createDashboardService.getUserInformation().subscribe((res) => {
240
- this.setPermission(res?.roleActions);
241
- const quickLink = res.quick_link;
242
- if (quickLink.risk) {
243
- this.showRiskCategory = true;
244
- }
245
- else {
246
- this.showRiskCategory = false;
247
- }
248
- }, (error) => {
249
- console.error(error);
250
- });
251
- }
252
- /**
253
- * Displays the listing pages the left side of policy form to set and edit the dropdown fields values
254
- * @param type holds name of particular list is to be displayed
255
- * @param event contains boolean value to display the list or not
256
- */
257
- activateSelector(type, event) {
258
- if (type == 'frequency' || this.activeSelector == 'frequency') {
259
- this.showCriteria = false;
260
- setTimeout(() => {
261
- this.showCriteria = true;
262
- }, 1);
263
- }
264
- if (type === 'responsibilityCategories' && event) {
265
- this.syncProgramSelectionMapFromForm();
266
- this.ensureProgramSelectionMapForList();
267
- }
268
- this.activeSelector = event ? type : '';
269
- }
270
- onProgramSelectionChange(items) {
271
- this.selectedPrograms = items;
272
- this.allProgamSelected = [].concat(...Object.values(items));
273
- }
274
- selectCategory() {
275
- this.dashboardForm.selectedResponsibilityCategories =
276
- normalizeProgramCategories(this.allProgamSelected);
277
- this.applyResponsibilityCategoryWidgetFilters();
278
- this.activateSelector('', false);
279
- }
280
- checkDefaultProgramOnRemove(event) {
281
- this.allProgamSelected = this.allProgamSelected.filter((program) => program?.id !== event?.id);
282
- this.removeProgram(event);
283
- }
284
- removeProgram(program) {
285
- const keys = Object.keys(this.selectedPrograms);
286
- keys.forEach((key) => {
287
- const index = this.selectedPrograms[key].findIndex((item) => item?.id === program?.id);
288
- if (index !== -1) {
289
- this.selectedPrograms[key].splice(index, 1);
290
- }
291
- });
292
- }
293
- syncProgramSelectionMapFromForm() {
294
- if (hasProgramSelectionInMap(this.selectedPrograms)) {
295
- return;
296
- }
297
- const flat = this.allProgamSelected?.length > 0
298
- ? this.allProgamSelected
299
- : this.dashboardForm.selectedResponsibilityCategories ?? [];
300
- const fromForm = buildProgramSelectionMapFromCategories(flat, this.allComplianceCategories);
301
- if (hasProgramSelectionInMap(fromForm)) {
302
- this.applyProgramSelectionMap(fromForm);
303
- }
304
- }
305
- hydrateProgramsFromDashboardData(data) {
306
- if (!data) {
307
- return false;
308
- }
309
- const programsRaw = data?.programs ?? data?.programId ?? data?.programIds;
310
- if (Array.isArray(programsRaw) &&
311
- programsRaw.length &&
312
- typeof programsRaw[0] === 'object') {
313
- const chips = programsRaw.map((p) => ({
314
- id: p?.id ?? p?.programId,
315
- category_id: p?.id ?? p?.programId,
316
- name: p?.name ?? p?.item_name,
317
- item_name: p?.name ?? p?.item_name,
318
- programId: p?.id ?? p?.programId,
319
- }));
320
- this.allProgamSelected = normalizeProgramCategories(chips);
321
- this.dashboardForm.selectedResponsibilityCategories = [
322
- ...this.allProgamSelected,
323
- ];
324
- const map = buildProgramSelectionMapFromCategories(chips, this.allComplianceCategories);
325
- if (Object.keys(map).length) {
326
- this.selectedPrograms = map;
327
- }
328
- return true;
329
- }
330
- const program = data?.program ?? {};
331
- const selectedMap = getSelectedProgramsMap(data);
332
- if (selectedMap && hasProgramSelectionInMap(selectedMap)) {
333
- this.applyProgramSelectionMap(selectedMap);
334
- return true;
335
- }
336
- const allPrograms = program?.all_programs;
337
- if (Array.isArray(allPrograms) && allPrograms.length) {
338
- if (typeof allPrograms[0] === 'object') {
339
- const map = buildProgramSelectionMapFromCategories(allPrograms, this.allComplianceCategories);
340
- if (hasProgramSelectionInMap(map)) {
341
- this.applyProgramSelectionMap(map);
342
- return true;
343
- }
344
- this.allProgamSelected = normalizeProgramCategories(allPrograms);
345
- this.dashboardForm.selectedResponsibilityCategories = [
346
- ...this.allProgamSelected,
347
- ];
348
- return this.allProgamSelected.length > 0;
349
- }
350
- }
351
- const categoryIds = extractCategoryIdsFromDashboard(data);
352
- if (categoryIds.length) {
353
- const stubs = categoryIds.map((id) => ({
354
- category_id: id,
355
- id,
356
- item_name: `Category ${id}`,
357
- }));
358
- this.allProgamSelected = normalizeProgramCategories(stubs);
359
- this.dashboardForm.selectedResponsibilityCategories = [
360
- ...this.allProgamSelected,
361
- ];
362
- return true;
363
- }
364
- return false;
365
- }
366
- applyFlatProgramCategories(categories) {
367
- if (!categories?.length) {
368
- return;
369
- }
370
- this.allProgamSelected = normalizeProgramCategories(categories);
371
- this.dashboardForm.selectedResponsibilityCategories = [
372
- ...this.allProgamSelected,
373
- ];
374
- const map = buildProgramSelectionMapFromCategories(categories, this.allComplianceCategories);
375
- if (hasProgramSelectionInMap(map)) {
376
- this.selectedPrograms = map;
377
- }
378
- this.cdr.detectChanges();
379
- }
380
- applyResponsibilityCategoryWidgetFilters() {
381
- if (this.dashboardForm.selectedResponsibilityCenters.length !== 0) {
382
- return;
383
- }
384
- if (this.dashboardForm.selectedResponsibilityCategories.length === 0) {
385
- this.selectedWidgets = this.selectedWidgets.filter((element) => element.module_name != 'COMPLIANCE');
386
- }
387
- else if (this.dashboardForm.selectedRiskCategories.length === 0) {
388
- this.selectedWidgets = this.selectedWidgets.filter((element) => element.module_name != 'RISK');
389
- }
390
- }
391
- openFromDatePicker(event) {
392
- event?.stopPropagation();
393
- this.toDatePicker?.api?.close();
394
- this.openedDatePicker = 'FROM_DATE';
395
- this.fromDatePicker?.api?.open();
396
- this.datePickerOverlay = true;
397
- }
398
- openToDatePicker(event) {
399
- event?.stopPropagation();
400
- this.fromDatePicker?.api?.close();
401
- this.openedDatePicker = 'TO_DATE';
402
- this.toDatePicker?.api?.open();
403
- this.datePickerOverlay = true;
404
- }
405
- closeFromDatePicker() {
406
- this.fromDatePicker?.api?.close();
407
- if (!this.dashboardForm.selectedFromDate) {
408
- this.dashboardForm.selectedToDate = undefined;
409
- this.hideToDate = true;
410
- setTimeout(() => {
411
- this.hideToDate = false;
412
- }, 20);
413
- this.fromDatePicker.api.close();
414
- this.datePickerOverlay = false;
415
- this.openedDatePicker = '';
416
- return;
417
- }
418
- let minToDate = this.setToDate(this.dashboardForm.selectedFromDate);
419
- this.toDatePickerConfig = { ...this.datePickerBaseConfig, min: minToDate };
420
- const fromDate = new Date(minToDate.split('-').reverse().join('-'));
421
- const toDate = new Date(this.dashboardForm.selectedToDate);
422
- const inValidDate = fromDate >= toDate ? true : false;
423
- if (inValidDate) {
424
- this.dashboardForm.selectedToDate = undefined;
425
- this.hideToDate = true;
426
- setTimeout(() => {
427
- this.hideToDate = false;
428
- }, 20);
429
- }
430
- this.datePickerOverlay = false;
431
- this.openedDatePicker = '';
432
- }
433
- closeToDatePicker() {
434
- this.toDatePicker?.api?.close();
435
- this.datePickerOverlay = false;
436
- this.openedDatePicker = '';
437
- }
438
- animateImage() {
439
- const circleImage = document.getElementsByClassName('image');
440
- }
441
- saveFrequency(eventValues) {
442
- this.dashboardForm.selectedFrequencyType = eventValues.frequencyType;
443
- this.dashboardForm.selectedFrequencies = eventValues.frequencies;
444
- this.dashboardForm.frequencyMessage = eventValues.frequencyString;
445
- this.dashboardForm.frequencyDate = eventValues.selectedDate;
446
- this.activateSelector('', false);
447
- }
448
- getCurrentDate() {
449
- let today = new Date();
450
- return dayjs(today).format('DD-MM-YYYY');
451
- }
452
- setToDate(data) {
453
- let today = new Date(data);
454
- return dayjs(today).format('DD-MM-YYYY');
455
- }
456
- getFromDate(data) {
457
- let today = new Date(data);
458
- return (today.getDate() + '-' + (today.getMonth() + 1) + '-' + today.getFullYear());
459
- }
460
- /**
461
- * @param data - the date you want to format
462
- * @returns Date string in YYYY-MM-DD format, e.g. 2026-05-19
463
- */
464
- getDateFormate(data) {
465
- return dayjs(data).format('YYYY-MM-DD');
466
- }
467
- configureDashboard() {
468
- let fieldsStatus = this.validateDashboard();
469
- if (!fieldsStatus) {
470
- return;
471
- }
472
- this.vLoader = true;
473
- this.onSubmitDashboard();
474
- }
475
- /**
476
- * Get users list by making api call and pre selects all admins by adding to viewers
477
- * @param url contains query params for organization users api
478
- */
479
- getUsersList(url) {
480
- this.createDashboardService.getAllUsers().subscribe((res) => {
481
- this.usersList = res;
482
- this.userListLoaded = true;
483
- if (this.mode === 'EDIT') {
484
- }
485
- else {
486
- this.dashboardForm.selectedViewers = this.setList(this.usersList, [this.createdBy], 'member_id');
487
- this.listDetails.selectedUsersList = this.dashboardForm.selectedViewers;
488
- this.vLoader = false;
489
- }
490
- });
491
- }
492
- getGroupList() {
493
- this.createDashboardService.getAllGroups().subscribe((res) => {
494
- this.totalgroups = res.total_items;
495
- this.groupList = res.data;
496
- this.groupListLoaded = true;
497
- if (this.mode === 'EDIT') {
498
- }
499
- else {
500
- this.dashboardForm.selectedGroup = this.setList(this.groupList, [this.createdBy], 'group_id');
501
- this.listDetails.selectedGroupList = this.dashboardForm.selectedGroup;
502
- this.vLoader = false;
503
- }
504
- });
505
- }
506
- /**
507
- * It is to ensure whether all required lists on Policy from is loaded from the api call or not
508
- */
509
- checkWhetherAllListsLoaded() {
510
- // Category trees are no longer eagerly loaded here; these flags were never flipped and blocked EDIT indefinitely.
511
- if (this.rcListLoaded && this.userListLoaded && this.groupListLoaded) {
512
- if (this.mode === 'EDIT') {
513
- this.hydrateEditForm();
514
- }
515
- else {
516
- this.vLoader = false;
517
- }
518
- }
519
- else {
520
- setTimeout(() => {
521
- this.checkWhetherAllListsLoaded();
522
- }, 300);
523
- }
524
- }
525
- setSelectedWidgets(data) {
526
- if (this.mode === 'CREATE') {
527
- const widgetsArray = [];
528
- data.forEach((element) => {
529
- let obj = {};
530
- obj.module_name = element.module;
531
- obj.widget_name = element.title;
532
- obj.widget_code = element.id;
533
- obj.sub_widgets = [];
534
- obj.state = 'ACTIVE';
535
- if (element.subWidgets.length > 0) {
536
- element.subWidgets.forEach((subWidget) => {
537
- let subWidgetObject = {};
538
- subWidgetObject.widget_name = subWidget.title;
539
- subWidgetObject.widget_code = subWidget.id;
540
- subWidgetObject.state = subWidget.value ? 'ACTIVE' : 'INACTIVE';
541
- obj.sub_widgets.push(Object.assign(subWidgetObject));
542
- });
543
- }
544
- widgetsArray.push(obj);
545
- });
546
- this.dashboardForm.configureWidget = widgetsArray;
547
- }
548
- else if (this.mode === 'EDIT') {
549
- const widgetsArray = [];
550
- data.forEach((element) => {
551
- if (!this.extractWidgetCodes(this.dashboardForm.configureWidget).includes(element.id)) {
552
- let obj = {};
553
- obj.module_name = element.module;
554
- obj._id = '';
555
- obj.widget_name = element.title;
556
- obj.widget_code = element.id;
557
- obj.sub_widgets = [];
558
- obj.state = 'ACTIVE';
559
- if (element.subWidgets.length > 0) {
560
- element.subWidgets.forEach((subWidget) => {
561
- let subWidgetObject = {};
562
- subWidgetObject._id = '';
563
- subWidgetObject.widget_name = subWidget.title;
564
- subWidgetObject.widget_code = subWidget.id;
565
- subWidgetObject.state = subWidget.value ? 'ACTIVE' : 'INACTIVE';
566
- obj.sub_widgets.push(subWidgetObject);
567
- });
568
- }
569
- this.dashboardForm.configureWidget.push(obj);
570
- }
571
- else {
572
- const index = this.selectedWidgets.findIndex((ele) => ele.widget_code == element.id);
573
- if (index != -1) {
574
- this.selectedWidgets[index].state = 'ACTIVE';
575
- if (this.selectedWidgets[index].sub_widgets.length > 0) {
576
- this.selectedWidgets[index].sub_widgets.forEach((subWidgetData) => {
577
- const elementIndex = element.subWidgets.findIndex((ele) => ele.id == subWidgetData.widget_code);
578
- if (elementIndex != -1) {
579
- subWidgetData.state = element.subWidgets[elementIndex].value
580
- ? 'ACTIVE'
581
- : 'INACTIVE';
582
- }
583
- });
584
- }
585
- }
586
- }
587
- });
588
- this.dashboardForm.configureWidget.forEach((savedWidget) => {
589
- const index = data.findIndex((dataElement) => dataElement.id == savedWidget.widget_code);
590
- if (index == -1) {
591
- savedWidget.state = 'INACTIVE';
592
- if (savedWidget.sub_widgets.length > 0) {
593
- savedWidget.sub_widgets.forEach((saveSubWidget) => {
594
- saveSubWidget.state = 'INACTIVE';
595
- });
596
- }
597
- }
598
- });
599
- }
600
- this.selectedWidgets = data;
601
- this.openConfigureWidgets = false;
602
- this.submitDashboard();
603
- }
604
- extractWidgetCodes(widgets) {
605
- const widgetCodes = [];
606
- widgets?.forEach((widget) => {
607
- if (widget?.widget_code) {
608
- widgetCodes.push(widget?.widget_code);
609
- }
610
- });
611
- return widgetCodes;
612
- }
613
- closeConfigureWidgets(event) {
614
- this.openConfigureWidgets = event;
615
- }
616
- /**
617
- * Filter list user's list based on pagination by making api call
618
- * @param event specifies a boolean value to call api
619
- */
620
- paginationFilter(event) {
621
- if (event) {
622
- this.getUsersList({
623
- p: this.paginationService.currentPage === 1
624
- ? ''
625
- : this.paginationService.currentPage,
626
- type: 'all_except_executive',
627
- q: !this.paginationService.searchValue
628
- ? ''
629
- : this.paginationService.searchValue,
630
- });
631
- }
632
- }
633
- getRCList() {
634
- this.createDashboardService.getResponsibilityCenterList().subscribe((res) => {
635
- this.responsibilityCentersList = this.normalizeRcList(res);
636
- this.rcListLoaded = true;
637
- this.applyPendingResponsibilityCenters();
638
- if (this.mode === 'EDIT') {
639
- const ids = this.responsibilityCentersList.filter((rc) => this.dashboardDetails?.responsibilityCenters.includes(rc.rcid)).map((rc) => rc.item_id);
640
- this.saveSelectedList('rc', ids);
641
- }
642
- }, (err) => {
643
- console.error(err);
644
- this.rcListLoaded = true;
645
- this.applyPendingResponsibilityCenters();
646
- });
647
- }
648
- /**
649
- * #### Description
650
- *
651
- * Returns the unique array of object based on unique key
652
- * @param array
653
- * @param key
654
- * @returns
655
- */
656
- uniqueByProp(array, key) {
657
- return Array.from(array
658
- .reduce((acc, item) => (item && item[key] && acc.set(item[key], item), acc), new Map())
659
- .values());
660
- }
661
- saveSelectedList(type, selectedItems) {
662
- switch (type) {
663
- case 'rc':
664
- this.dashboardForm.selectedResponsibilityCenters = this.setList(this.responsibilityCentersList, selectedItems, 'item_id');
665
- if (this.dashboardForm.selectedResponsibilityCenters.length == 0) {
666
- if (this.dashboardForm.selectedResponsibilityCategories.length == 0) {
667
- this.selectedWidgets = this.selectedWidgets.filter((element) => element.module_name != 'COMPLIANCE');
668
- }
669
- else if (this.dashboardForm.selectedRiskCategories.length == 0) {
670
- this.selectedWidgets = this.selectedWidgets.filter((element) => element.module_name != 'RISK');
671
- }
672
- }
673
- break;
674
- case 'whoCanView':
675
- this.dashboardForm.selectedViewers = this.uniqueByProp(selectedItems?.users, 'member_id');
676
- this.listDetails.selectedUsersList = this.dashboardForm.selectedViewers;
677
- this.dashboardForm.selectedGroup = this.uniqueByProp(selectedItems?.groups, 'group_id');
678
- this.listDetails.selectedGroupList = this.dashboardForm.selectedGroup;
679
- break;
680
- case 'responsibilityCategories':
681
- this.dashboardForm.selectedResponsibilityCategories =
682
- normalizeProgramCategories(Array.isArray(selectedItems)
683
- ? selectedItems
684
- : flattenProgramSelectionMap(selectedItems ?? {}));
685
- this.applyResponsibilityCategoryWidgetFilters();
686
- break;
687
- case 'riskCategory':
688
- this.dashboardForm.selectedRiskCategories = selectedItems;
689
- if (this.dashboardForm.selectedResponsibilityCenters.length == 0) {
690
- if (this.dashboardForm.selectedResponsibilityCategories.length == 0) {
691
- this.selectedWidgets = this.selectedWidgets.filter((element) => element.module_name != 'COMPLIANCE');
692
- }
693
- else if (this.dashboardForm.selectedRiskCategories.length == 0) {
694
- this.selectedWidgets = this.selectedWidgets.filter((element) => element.module_name != 'RISK');
695
- }
696
- }
697
- break;
698
- }
699
- this.activateSelector('', false);
700
- }
701
- remove(type, event, removeIndex) {
702
- switch (type) {
703
- case 'rc':
704
- const rcIndex = this.dashboardForm.selectedResponsibilityCenters.findIndex((rc) => rc.rc_id == event.rc_id ||
705
- rc.item_id == event.item_id ||
706
- rc.rcid == event.rcid);
707
- if (rcIndex !== -1) {
708
- const parentRc = this.dashboardForm.selectedResponsibilityCenters[rcIndex];
709
- this.dashboardForm.selectedResponsibilityCenters.splice(rcIndex, 1);
710
- if (parentRc?.item_child_ids?.length > 0) {
711
- parentRc.item_child_ids.forEach((childElement) => {
712
- const childRemoveIndex = this.dashboardForm.selectedResponsibilityCenters.findIndex((removeElement) => removeElement.rc_id == childElement ||
713
- removeElement.item_id == childElement ||
714
- removeElement.rcid == childElement);
715
- if (childRemoveIndex !== -1) {
716
- this.dashboardForm.selectedResponsibilityCenters.splice(childRemoveIndex, 1);
717
- }
718
- });
719
- }
720
- }
721
- if (this.dashboardForm.selectedResponsibilityCenters.length == 0) {
722
- if (this.dashboardForm.selectedResponsibilityCategories.length == 0) {
723
- this.selectedWidgets = this.selectedWidgets.filter((element) => element.module_name != 'COMPLIANCE');
724
- }
725
- else if (this.dashboardForm.selectedRiskCategories.length == 0) {
726
- this.selectedWidgets = this.selectedWidgets.filter((element) => element.module_name != 'RISK');
727
- }
728
- }
729
- break;
730
- case 'whoCanView':
731
- const reviewerIndex = this.dashboardForm.selectedViewers.findIndex((viewer) => viewer.member_id == event.member_id);
732
- this.dashboardForm.selectedViewers.splice(reviewerIndex, 1);
733
- break;
734
- case 'whoCanViewGroup':
735
- const groups = this.dashboardForm.selectedGroup.findIndex((ele) => ele?.group_id == event?.group_id);
736
- this.dashboardForm.selectedGroup.splice(groups, 1);
737
- break;
738
- case 'responsibilityCategories':
739
- this.checkDefaultProgramOnRemove(event);
740
- break;
741
- case 'riskCategory':
742
- const riskCategoryIndex = this.dashboardForm.selectedRiskCategories.findIndex((riskCategory) => riskCategory.category_id == event.category_id);
743
- if (riskCategoryIndex !== -1) {
744
- const parent = this.dashboardForm.selectedRiskCategories[riskCategoryIndex];
745
- this.dashboardForm.selectedRiskCategories.splice(riskCategoryIndex, 1);
746
- if (parent?.child_cat_ids?.length > 0) {
747
- parent.child_cat_ids.forEach((childElement) => {
748
- const removeIndex = this.dashboardForm.selectedRiskCategories.findIndex((removeElement) => removeElement.category_id == childElement);
749
- this.dashboardForm.selectedRiskCategories.splice(removeIndex, 1);
750
- });
751
- }
752
- }
753
- this.dashboardForm.selectedRiskCategories.splice(riskCategoryIndex, 1);
754
- if (this.dashboardForm.selectedResponsibilityCenters.length == 0) {
755
- if (this.dashboardForm.selectedResponsibilityCategories.length == 0) {
756
- this.selectedWidgets = this.selectedWidgets.filter((element) => element.module_name != 'COMPLIANCE');
757
- }
758
- else if (this.dashboardForm.selectedRiskCategories.length == 0) {
759
- this.selectedWidgets = this.selectedWidgets.filter((element) => element.module_name != 'RISK');
760
- }
761
- }
762
- break;
763
- }
764
- }
765
- setList(list, ids, key) {
766
- return this.setListByIds(list, ids, [key]);
767
- }
768
- setListByIds(list, ids, keys) {
769
- const data = [];
770
- if (!Array.isArray(list) || !Array.isArray(ids)) {
771
- return data;
772
- }
773
- ids.forEach((id) => {
774
- const targetId = id;
775
- for (const key of keys) {
776
- const index = list.findIndex((listElement) => listElement?.[key] === targetId);
777
- if (index !== -1) {
778
- data.push(list[index]);
779
- break;
780
- }
781
- }
782
- });
783
- return data;
784
- }
785
- flattenRcTree(nodes) {
786
- const flat = [];
787
- const walk = (arr) => {
788
- (arr ?? []).forEach((node) => {
789
- if (!node || typeof node !== 'object') {
790
- return;
791
- }
792
- flat.push(node);
793
- if (Array.isArray(node.children)) {
794
- walk(node.children);
795
- }
796
- if (Array.isArray(node.items)) {
797
- walk(node.items);
798
- }
799
- });
800
- };
801
- if (Array.isArray(nodes)) {
802
- walk(nodes);
803
- return flat.length ? flat : nodes;
804
- }
805
- if (Array.isArray(nodes?.data)) {
806
- walk(nodes.data);
807
- return flat;
808
- }
809
- return [];
810
- }
811
- getRcNodeId(rc) {
812
- return rc?.item_id ?? rc?.rc_id ?? rc?.rcid ?? rc?.id;
813
- }
814
- collectNestedChildIds(node) {
815
- const ids = [];
816
- const seen = new Set();
817
- const walk = (n) => {
818
- [...(n?.children ?? []), ...(n?.items ?? [])].forEach((child) => {
819
- if (!child || typeof child !== 'object') {
820
- return;
821
- }
822
- const id = this.getRcNodeId(child);
823
- const key = String(id);
824
- if (id != null && id !== '' && !seen.has(key)) {
825
- seen.add(key);
826
- ids.push(id);
827
- }
828
- walk(child);
829
- });
830
- };
831
- walk(node);
832
- return ids;
833
- }
834
- isNestedRc(parent, candidate) {
835
- const parentId = parent?.item_id;
836
- const candidateId = candidate?.item_id;
837
- if (parentId == null || candidateId == null || parentId == candidateId) {
838
- return false;
839
- }
840
- const ancestorIds = [
841
- ...(candidate?.parent_rc_ids ?? []),
842
- candidate?.parentId,
843
- ...(Array.isArray(candidate?.parent) || candidate?.parent == null
844
- ? []
845
- : [candidate.parent]),
846
- ];
847
- if (ancestorIds.some((id) => id == parentId)) {
848
- return true;
849
- }
850
- const parentPath = Array.isArray(parent?.rc_name) ? parent.rc_name : [];
851
- const candidatePath = Array.isArray(candidate?.rc_name)
852
- ? candidate.rc_name
853
- : [];
854
- return (parentPath.length > 0 &&
855
- candidatePath.length > parentPath.length &&
856
- parentPath.every((name, i) => candidatePath[i] === name));
857
- }
858
- resolveAllDescendantIds(parent, list) {
859
- const parentId = parent?.item_id;
860
- const rawIds = new Set();
861
- const add = (id) => {
862
- if (id != null && id !== '' && id != parentId) {
863
- rawIds.add(id);
864
- }
865
- };
866
- (parent?.item_child_ids ?? []).forEach(add);
867
- this.collectNestedChildIds(parent).forEach(add);
868
- (list ?? []).forEach((rc) => {
869
- if (this.isNestedRc(parent, rc)) {
870
- add(rc.item_id);
871
- }
872
- });
873
- const resolved = [];
874
- const seen = new Set();
875
- rawIds.forEach((id) => {
876
- const match = (list ?? []).find((rc) => rc?.item_id == id ||
877
- rc?.rc_id == id ||
878
- rc?.rcid == id ||
879
- rc?.id == id);
880
- const resolvedId = match?.item_id ?? id;
881
- const key = String(resolvedId);
882
- if (!seen.has(key) && resolvedId != parentId) {
883
- seen.add(key);
884
- resolved.push(resolvedId);
885
- }
886
- });
887
- return resolved;
888
- }
889
- normalizeRcList(list) {
890
- const items = this.flattenRcTree(list);
891
- const normalized = items.map((rc) => ({
892
- ...rc,
893
- rcid: rc?.rcid ?? rc?.rc_id ?? rc?.item_id ?? rc?.id,
894
- item_id: rc?.item_id ?? rc?.rc_id ?? rc?.rcid ?? rc?.id,
895
- item_name: rc?.item_name ??
896
- rc?.item_name_string ??
897
- (Array.isArray(rc?.rc_name) ? rc.rc_name.join(' < ') : rc?.rc_name) ??
898
- '',
899
- }));
900
- return normalized.map((rc) => ({
901
- ...rc,
902
- item_child_ids: this.resolveAllDescendantIds(rc, normalized),
903
- }));
904
- }
905
- resolveRcFromTree(tree, ids) {
906
- if (!ids.length || !tree.length) {
907
- return [];
908
- }
909
- const selected = [];
910
- const seen = new Set();
911
- ids.forEach((id) => {
912
- const targetId = Number(id);
913
- const match = tree.find((rc) => Number(rc?.item_id) === targetId ||
914
- Number(rc?.rc_id) === targetId ||
915
- Number(rc?.rcid) === targetId ||
916
- Number(rc?.id) === targetId ||
917
- rc?.item_child_ids?.some((childId) => Number(childId) === targetId) ||
918
- rc?.item_parent_ids?.some((parentId) => Number(parentId) === targetId));
919
- if (!match) {
920
- return;
921
- }
922
- const key = Number(match?.item_id ?? match?.rc_id ?? match?.rcid ?? id);
923
- if (!seen.has(key)) {
924
- seen.add(key);
925
- selected.push(match);
926
- }
927
- });
928
- return selected;
929
- }
930
- applyPreresolvedRcEntries() {
931
- if (!this.pendingEditRcEntries?.length) {
932
- return false;
933
- }
934
- const tree = this.responsibilityCentersList ?? [];
935
- const selected = this.pendingEditRcEntries.map((entry) => {
936
- const rcid = Number(entry?.rcid ?? entry?.rc_id ?? entry?.item_id);
937
- const fromTree = tree.find((rc) => Number(rc?.item_id) === rcid) ??
938
- tree.find((rc) => Number(rc?.rcid) === rcid) ??
939
- tree.find((rc) => Number(rc?.rc_id) === rcid);
940
- return fromTree ? { ...fromTree } : { ...entry };
941
- });
942
- this.dashboardForm.selectedResponsibilityCenters = selected;
943
- this.pendingEditRcIds = selected.map((rc) => Number(rc?.rcid ?? rc?.rc_id ?? rc?.item_id));
944
- return true;
945
- }
946
- applyPendingResponsibilityCenters() {
947
- if (this.applyPreresolvedRcEntries()) {
948
- this.cdr.detectChanges();
949
- return;
950
- }
951
- if (!this.rcListLoaded || !this.pendingEditRcIds.length) {
952
- return;
953
- }
954
- let selected = this.setListByIds(this.responsibilityCentersList, this.pendingEditRcIds, ['item_id', 'rcid', 'rc_id', 'id']);
955
- if (selected.length < this.pendingEditRcIds.length) {
956
- selected = this.resolveRcFromTree(this.responsibilityCentersList, this.pendingEditRcIds);
957
- }
958
- this.dashboardForm.selectedResponsibilityCenters = selected;
959
- this.cdr.detectChanges();
960
- }
961
- beginEditHydration() {
962
- if (this.mode !== 'EDIT') {
963
- return;
964
- }
965
- this.editHydrationCount++;
966
- this.vLoader = true;
967
- }
968
- finishEditHydration() {
969
- if (this.mode !== 'EDIT') {
970
- return;
971
- }
972
- this.editHydrationCount = Math.max(0, this.editHydrationCount - 1);
973
- if (this.editHydrationCount === 0) {
974
- this.vLoader = false;
975
- this.cdr.detectChanges();
976
- }
977
- }
978
- tryCompleteEditHydration() {
979
- if (this.mode === 'EDIT' && this.editHydrationCount === 0) {
980
- this.vLoader = false;
981
- this.cdr.detectChanges();
982
- }
983
- }
984
- wrapEditRequest(request$, onNext) {
985
- if (this.mode === 'EDIT') {
986
- this.beginEditHydration();
987
- }
988
- request$
989
- .pipe(finalize(() => this.finishEditHydration()))
990
- .subscribe({
991
- next: onNext,
992
- error: (err) => console.error(err),
993
- });
994
- }
995
- syncProgramsForEdit(data) {
996
- if (!data) {
997
- return;
998
- }
999
- this.hydrateProgramsFromDashboardData(data);
1000
- this.applyProgramsFromDashboardIds(extractProgramIdsFromDashboard(data), extractCategoryIdsFromDashboard(data), getSelectedProgramsMap(data), data?.program);
1001
- const categoryIds = extractCategoryIdsFromDashboard(data);
1002
- if (categoryIds.length) {
1003
- const fromCompliance = this.setList(this.allComplianceCategories, categoryIds, 'category_id');
1004
- if (fromCompliance.length && !this.allProgamSelected.length) {
1005
- this.applyFlatProgramCategories(fromCompliance);
1006
- }
1007
- }
1008
- if (!this.allProgamSelected.length &&
1009
- this.dashboardForm.selectedResponsibilityCategories.length) {
1010
- this.allProgamSelected = [
1011
- ...this.dashboardForm.selectedResponsibilityCategories,
1012
- ];
1013
- }
1014
- this.syncProgramSelectionMapFromForm();
1015
- }
1016
- applyProgramsFromDashboardIds(programIds, categoryIds, selectedProgramsMap, programPayload) {
1017
- if (categoryIds.length) {
1018
- this.loadProgramsForEdit(programIds, categoryIds, selectedProgramsMap, programPayload);
1019
- return;
1020
- }
1021
- if (programIds.length) {
1022
- this.resolveProgramIdsForEdit(programIds);
1023
- }
1024
- }
1025
- ensureProgramSelectionMapForList() {
1026
- if (hasProgramSelectionInMap(this.selectedPrograms)) {
1027
- return;
1028
- }
1029
- const categoryIds = normalizeIdArray(this.dashboardForm.selectedResponsibilityCategories?.map((c) => c?.category_id ?? c?.id) ?? []);
1030
- const programIds = [
1031
- ...new Set((this.dashboardForm.selectedResponsibilityCategories ?? []).map((c) => Number(c?.programId ?? c?.program_id ?? c?.parentId))),
1032
- ].filter((id) => !Number.isNaN(id));
1033
- if (programIds.length || categoryIds.length) {
1034
- this.loadProgramsForEdit(programIds, categoryIds);
1035
- }
1036
- }
1037
- applyProgramSelectionMap(map) {
1038
- const normalized = normalizeProgramSelectionMap(map);
1039
- if (!normalized) {
1040
- return;
1041
- }
1042
- this.selectedPrograms = normalized;
1043
- this.allProgamSelected = flattenProgramSelectionMap(this.selectedPrograms);
1044
- this.dashboardForm.selectedResponsibilityCategories =
1045
- normalizeProgramCategories(this.allProgamSelected);
1046
- this.cdr.detectChanges();
1047
- }
1048
- categoryMatchesId(cat, categoryIdSet) {
1049
- const id = Number(cat?.id);
1050
- const categoryId = Number(cat?.category_id);
1051
- return ((!Number.isNaN(id) && categoryIdSet.has(id)) ||
1052
- (!Number.isNaN(categoryId) && categoryIdSet.has(categoryId)));
1053
- }
1054
- loadProgramsForEdit(programIds, categoryIds = [], selectedProgramsMap, programPayload) {
1055
- if (selectedProgramsMap &&
1056
- typeof selectedProgramsMap === 'object' &&
1057
- !Array.isArray(selectedProgramsMap) &&
1058
- hasProgramSelectionInMap(selectedProgramsMap)) {
1059
- this.applyProgramSelectionMap(selectedProgramsMap);
1060
- return;
1061
- }
1062
- if (programPayload &&
1063
- this.hydrateProgramsFromDashboardData({ program: programPayload })) {
1064
- return;
1065
- }
1066
- if (!programIds.length && !categoryIds.length) {
1067
- return;
1068
- }
1069
- const completeProgramHydration = () => this.finishEditHydration();
1070
- if (this.mode === 'EDIT') {
1071
- this.beginEditHydration();
1072
- }
1073
- this.createDashboardService.getSailsProgramList().subscribe({
1074
- next: (res) => {
1075
- const programs = parseSailsProgramList(res);
1076
- const relevantPrograms = programIds.length > 0
1077
- ? programs.filter((p) => programIds.includes(Number(p?.id)))
1078
- : programs;
1079
- if (!categoryIds.length) {
1080
- if (programIds.length) {
1081
- this.resolveProgramIdsForEdit(programIds, programs);
1082
- }
1083
- completeProgramHydration();
1084
- return;
1085
- }
1086
- const categoryIdSet = new Set(categoryIds);
1087
- const programsToFetch = relevantPrograms.length > 0 ? relevantPrograms : programs;
1088
- if (!programsToFetch.length) {
1089
- completeProgramHydration();
1090
- return;
1091
- }
1092
- const categoryRequests = programsToFetch.map((program) => this.createDashboardService.getProgramCategories(program.id).pipe(map((catRes) => ({
1093
- program,
1094
- categories: catRes?.data?.categories ?? catRes?.categories ?? [],
1095
- }))));
1096
- forkJoin(categoryRequests)
1097
- .pipe(finalize(() => completeProgramHydration()))
1098
- .subscribe({
1099
- next: (rawResults) => {
1100
- const results = rawResults;
1101
- const map = {};
1102
- results.forEach(({ program, categories }) => {
1103
- const selected = (categories ?? []).filter((cat) => this.categoryMatchesId(cat, categoryIdSet));
1104
- if (selected.length) {
1105
- map[String(program.id)] = selected;
1106
- }
1107
- });
1108
- if (hasProgramSelectionInMap(map)) {
1109
- this.applyProgramSelectionMap(map);
1110
- }
1111
- else if (this.allProgamSelected.length) {
1112
- this.syncProgramSelectionMapFromForm();
1113
- }
1114
- },
1115
- error: (err) => console.error(err),
1116
- });
1117
- },
1118
- error: (err) => {
1119
- console.error(err);
1120
- completeProgramHydration();
1121
- },
1122
- });
1123
- }
1124
- /** Custom dashboards often store program ids only — resolve names for form chips. */
1125
- resolveProgramIdsForEdit(programIds, programsFromList) {
1126
- if (!programIds.length) {
1127
- return;
1128
- }
1129
- const apply = (programs) => {
1130
- const matched = programs.filter((p) => programIds.includes(Number(p?.id)));
1131
- if (!matched.length) {
1132
- return;
1133
- }
1134
- const chips = matched.map((p) => ({
1135
- id: p.id,
1136
- category_id: p.id,
1137
- name: p.name,
1138
- item_name: p.name,
1139
- programId: p.id,
1140
- }));
1141
- this.allProgamSelected = normalizeProgramCategories(chips);
1142
- this.dashboardForm.selectedResponsibilityCategories = [
1143
- ...this.allProgamSelected,
1144
- ];
1145
- const map = {};
1146
- matched.forEach((p) => {
1147
- map[String(p.id)] = [];
1148
- });
1149
- this.selectedPrograms = map;
1150
- this.cdr.detectChanges();
1151
- };
1152
- if (programsFromList?.length) {
1153
- apply(programsFromList);
1154
- return;
1155
- }
1156
- if (this.mode === 'EDIT') {
1157
- this.beginEditHydration();
1158
- }
1159
- this.createDashboardService
1160
- .getSailsProgramList()
1161
- .pipe(finalize(() => this.finishEditHydration()))
1162
- .subscribe({
1163
- next: (res) => {
1164
- apply(parseSailsProgramList(res));
1165
- },
1166
- error: (err) => console.error(err),
1167
- });
1168
- }
1169
- buildEditDashboardData() {
1170
- const row = this.dashboardDetails ?? {};
1171
- const core = row?.dashboard_details ?? row?.dashboard ?? row;
1172
- const programSource = core?.programs;
1173
- const rcSource = core?.responsibilityCenters;
1174
- return {
1175
- ...row,
1176
- ...core,
1177
- cdid: core?.cdid ?? row?.cdid,
1178
- dashboard_name: core?.name ?? row?.dashboard_name,
1179
- name: core?.name ?? row?.dashboard_name,
1180
- description: core?.description ?? row?.description,
1181
- viewers: core?.viewers ?? row?.viewers,
1182
- visible_to_users: core?.visible_to_users ?? row?.visible_to_users,
1183
- visible_to_groups: core?.visible_to_groups ?? row?.visible_to_groups,
1184
- programs: programSource,
1185
- programId: extractProgramIdsFromDashboard({
1186
- programs: programSource,
1187
- program: core?.program ?? row?.program,
1188
- }),
1189
- responsibility_category: core?.responsibility_category ??
1190
- row?.responsibility_category ??
1191
- core?.responsibilityCategory ??
1192
- [],
1193
- rcId: core.rcId,
1194
- selectedRcEntries: row?.selectedRcEntries ??
1195
- core?.selectedRcEntries ??
1196
- [],
1197
- responsibilityCenters: rcSource,
1198
- responsibility_center: rcSource,
1199
- responsibilityCenterId: core.rcId,
1200
- program: core?.program ?? row?.program,
1201
- timeframe: core?.timeframe ??
1202
- (row?.time_frame_from || row?.time_frame_to
1203
- ? { from: row?.time_frame_from, to: row?.time_frame_to }
1204
- : undefined),
1205
- time_frame_from: core?.timeframe?.from ??
1206
- core?.timeframe?.start_date ??
1207
- row?.time_frame_from,
1208
- time_frame_to: core?.timeframe?.to ?? core?.timeframe?.end_date ?? row?.time_frame_to,
1209
- created_by: core?.createdBy ?? core?.created_by ?? row?.created_by,
1210
- createdBy: core?.createdBy ?? core?.created_by ?? row?.createdBy,
1211
- };
1212
- }
1213
- submitted = false;
1214
- /**
1215
- * Returns id's from a particular list elements
1216
- * @param list actual selected list
1217
- * @param key contains key to extract id from the list
1218
- */
1219
- returnIds(list, key) {
1220
- return list?.map((ele) => {
1221
- if (ele[key]) {
1222
- return ele[key];
1223
- }
1224
- });
1225
- }
1226
- /**
1227
- * Validates the data submitted on create dashboard form
1228
- */
1229
- validateDashboard() {
1230
- setTimeout(() => {
1231
- this.submitted = true;
1232
- }, 100);
1233
- const event = this.dashboardForm.dashboardName;
1234
- const re = /&nbsp;|<br>/g;
1235
- this.dashboardForm.dashboardName = event.replace(re, '').trim();
1236
- const description = this.dashboardForm.dashboardDescriptionText;
1237
- this.dashboardForm.dashboardDescriptionText = description
1238
- .replace(re, '')
1239
- .trim();
1240
- if (!this.dashboardForm.dashboardName ||
1241
- this.dashboardForm.dashboardName.trim() == '' ||
1242
- this.dashboardForm.dashboardName.length > 30 ||
1243
- this.textCount.transform(this.dashboardForm?.dashboardDescriptionText) >
1244
- 250 ||
1245
- (this.dashboardForm?.selectedFromDate &&
1246
- !this.dashboardForm?.selectedToDate) ||
1247
- (this.dashboardForm.selectedResponsibilityCenters.length == 0)) {
1248
- return false;
1249
- }
1250
- return true;
1251
- }
1252
- /**
1253
- * Makes an api call to create a dashboad
1254
- * @param dashboard contains dashboardForm data
1255
- */
1256
- submitDashboard() {
1257
- this.submitted = false;
1258
- const valid = this.validateDashboard();
1259
- if (!valid) {
1260
- return false;
1261
- }
1262
- this.vLoader = true;
1263
- const dashboard = this.dashboardForm;
1264
- const payload = {
1265
- viewer: {
1266
- userId: this.returnIds(dashboard.selectedViewers, 'uid'),
1267
- userGroupId: this.returnIds(dashboard.selectedGroup, 'ugid'),
1268
- },
1269
- widget_details: dashboard.configureWidget,
1270
- dashboard_id: this.dashboardId,
1271
- };
1272
- this.createDashboardService.saveWidgetDetails(payload).subscribe({
1273
- next: (res) => {
1274
- // saveWidgetDetails can return freshest bridge id; merge it for redirect.
1275
- const widgetPayload = res?.data ?? res ?? {};
1276
- this.createdDashboard = {
1277
- ...(this.createdDashboard ?? {}),
1278
- ...(widgetPayload?.dashboard ?? {}),
1279
- cddid: this.createdDashboard?.cddid ??
1280
- widgetPayload?.cddid ??
1281
- widgetPayload?.cdid ??
1282
- widgetPayload?.dashboard_bridge_id,
1283
- cdid: this.createdDashboard?.cdid ??
1284
- widgetPayload?.cdid ??
1285
- widgetPayload?.cddid ??
1286
- widgetPayload?.dashboard_bridge_id,
1287
- dashboard_bridge_id: this.createdDashboard?.dashboard_bridge_id ??
1288
- widgetPayload?.dashboard_bridge_id ??
1289
- widgetPayload?.dashboardBridgeId,
1290
- dashboardBridgeId: this.createdDashboard?.dashboardBridgeId ??
1291
- widgetPayload?.dashboardBridgeId ??
1292
- widgetPayload?.dashboard_bridge_id,
1293
- };
1294
- this.dashboardId = this.getCreatedDashboardCdid();
1295
- this.vLoader = false;
1296
- this.isSmiley = true;
1297
- this.smileyMessage = this.mode === 'EDIT' ? 'The dashboard has been updated.' : 'The dashboard has been created.';
1298
- setTimeout(() => {
1299
- this.isSmiley = false;
1300
- const cdid = this.getCreatedDashboardCdid();
1301
- const closeMode = this.redirectAfterCreate
1302
- ? 'created'
1303
- : this.mode === 'EDIT'
1304
- ? 'updated'
1305
- : 'created';
1306
- this.redirectAfterCreate = false;
1307
- this.close.emit({
1308
- mode: closeMode,
1309
- id: cdid,
1310
- cdid,
1311
- dashboardBridgeId: this.createdDashboard?.dashboard_bridge_id ??
1312
- this.createdDashboard?.dashboardBridgeId,
1313
- dashboard: this.createdDashboard,
1314
- });
1315
- }, 3000);
1316
- },
1317
- error: (error) => {
1318
- console.error('saveWidgetDetails error =>', error);
1319
- this.snackBar.show(error.error.statusMessage, 'alert');
1320
- this.vLoader = false;
1321
- }
1322
- });
1323
- }
1324
- closeContainer(message) {
1325
- this.close.emit(message);
1326
- }
1327
- onSubmitDashboard() {
1328
- const dashboard = this.dashboardForm;
1329
- const payload = {
1330
- dashboard_name: dashboard.dashboardName,
1331
- description: [
1332
- {
1333
- content: dashboard.dashboardDescriptionText,
1334
- attachments: [],
1335
- },
1336
- ],
1337
- visible_to_users: this.returnIds(dashboard.selectedViewers, 'uid'),
1338
- visible_to_groups: this.returnIds(dashboard.selectedGroup, 'ugid'),
1339
- responsibility_center: this.returnIds(dashboard.selectedResponsibilityCenters, 'rcid'),
1340
- responsibility_category: this.returnIds(dashboard.selectedResponsibilityCategories, 'category_id'),
1341
- risk_category: this.returnIds(dashboard.selectedRiskCategories, 'category_id'),
1342
- display_criteria: dashboard.displayCriteria === 'and'
1343
- ? 'BOTH_RC_AND_CATEGORY'
1344
- : 'RC_OR_CATEGORY',
1345
- widget_details: dashboard.configureWidget,
1346
- program: {
1347
- all_programs: this.allProgamSelected,
1348
- selected_programs: this.selectedPrograms,
1349
- },
1350
- timeframe: {
1351
- start_date: dashboard.selectedFromDate
1352
- ? this.getDateFormate(dashboard?.selectedFromDate)
1353
- : '',
1354
- end_date: dashboard.selectedToDate
1355
- ? this.getDateFormate(dashboard?.selectedToDate)
1356
- : '',
1357
- },
1358
- };
1359
- const createDashboardPayload = this.createDashboardService.buildPayload(payload);
1360
- this.saveDashboard(createDashboardPayload);
1361
- }
1362
- saveDashboard(payload) {
1363
- let apiCall = this.createDashboardService.createDashboard(payload);
1364
- if (this.mode === 'EDIT') {
1365
- apiCall = this.createDashboardService.updateDashboard(payload, this.dashboardDetails?.recordId);
1366
- }
1367
- apiCall.subscribe({
1368
- next: (res) => {
1369
- const wasCreate = this.mode === 'CREATE';
1370
- this.createdDashboard = res?.data?.dashboard ?? null;
1371
- this.dashboardDetails = this.createdDashboard;
1372
- this.dashboardId = this.getCreatedDashboardCdid();
1373
- this.dashboardDetails['recordId'] = this.createdDashboard?.id;
1374
- this.vLoader = false;
1375
- this.openConfigureWidgets = true;
1376
- this.showComplianceWidgets = false;
1377
- if (wasCreate) {
1378
- this.redirectAfterCreate = true;
1379
- }
1380
- this.mode = 'EDIT';
1381
- },
1382
- error: (error) => {
1383
- this.vLoader = false;
1384
- if (error.status == 422) {
1385
- this.snackBar.show(error.error.statusMessage, 'alert');
1386
- }
1387
- }
1388
- });
1389
- }
1390
- getCreatedDashboardCdid() {
1391
- const dash = this.createdDashboard;
1392
- const cdid = dash?.cddid ??
1393
- dash?.cdid ??
1394
- dash?.cdId ??
1395
- dash?.dashboard_bridge_id ??
1396
- dash?.dashboardBridgeId ??
1397
- dash?.dashboard?.dashboard_bridge_id ??
1398
- this.dashboardId;
1399
- return cdid != null && cdid !== '' ? String(cdid) : '';
1400
- }
1401
- hydrateEditForm() {
1402
- if (this.editFormHydrated) {
1403
- return;
1404
- }
1405
- this.editFormHydrated = true;
1406
- this.editDashboard();
1407
- }
1408
- applyWidgetsFromGetWidgetsResponse(widgets) {
1409
- const savedWidgets = filterActiveWidgets(widgets?.widgetArr ?? []);
1410
- const catalogWidgets = widgets?.allWidgetsArray?.length
1411
- ? widgets.allWidgetsArray
1412
- : savedWidgets;
1413
- this.dashboardForm.configureWidget = savedWidgets;
1414
- this.selectedWidgets = [...savedWidgets];
1415
- this.displayedWidgets = [...catalogWidgets];
1416
- }
1417
- /** EDIT mode only: GET getWidgets?dashboardId={cdid} */
1418
- loadEditModeWidgets(cdid) {
1419
- if (this.mode !== 'EDIT' || !cdid) {
1420
- return;
1421
- }
1422
- this.wrapEditRequest(this.createDashboardService.fetchCustomDashboardWidgetDetails(cdid), (widgets) => {
1423
- this.applyWidgetsFromGetWidgetsResponse(widgets);
1424
- this.cdr.detectChanges();
1425
- });
1426
- }
1427
- editDashboard() {
1428
- this.vLoader = true;
1429
- if (this.mode === 'EDIT') {
1430
- this.editHydrationCount = 0;
1431
- }
1432
- const data = this.buildEditDashboardData();
1433
- this.pendingEditRcEntries =
1434
- data?.selectedRcEntries ??
1435
- this.dashboardDetails?.selectedRcEntries ??
1436
- [];
1437
- const editCdid = getEditDashboardCdid(data, this.dashboardDetails, this.dashboardId);
1438
- this.listDetails.nonRemovableUsersList = [
1439
- data?.createdBy ?? data?.created_by,
1440
- ].filter((x) => x != null);
1441
- this.populateDashboardForm(data);
1442
- if (this.mode === 'EDIT' && editCdid) {
1443
- this.loadEditModeWidgets(editCdid);
1444
- }
1445
- this.tryCompleteEditHydration();
1446
- }
1447
- populateDashboardForm(data) {
1448
- try {
1449
- const descriptionBlock = Array.isArray(data?.description)
1450
- ? data.description[0]
1451
- : null;
1452
- const descriptionText = descriptionBlock?.content ??
1453
- (typeof data?.description === 'string' ? data.description : '') ??
1454
- data?.dashboardDescriptionText ??
1455
- '';
1456
- const visibleUsers = data?.visible_to_users ?? data?.viewers?.userId ?? [];
1457
- const visibleUserIds = data?.viewers?.userId ?? [];
1458
- const visibleGroups = data?.viewers?.userGroupId ?? [];
1459
- const visibleGroupIds = data?.viewers?.userGroupId ?? [];
1460
- this.pendingEditRcEntries =
1461
- data?.selectedRcEntries ??
1462
- this.dashboardDetails?.selectedRcEntries ??
1463
- [];
1464
- this.pendingEditRcIds = extractRcIdsFromDashboard(data);
1465
- this.applyPreresolvedRcEntries();
1466
- const riskCategories = data?.risk_category ?? [];
1467
- const riskCategoryIds = (riskCategories ?? []).map((risk) => typeof risk === 'object' ? risk?.category_id ?? risk?.id : risk);
1468
- const startDate = data?.timeframe?.start_date ??
1469
- data?.timeframe?.from ??
1470
- data?.time_frame_from;
1471
- const endDate = data?.timeframe?.end_date ??
1472
- data?.timeframe?.to ??
1473
- data?.time_frame_to;
1474
- this.dashboardForm.dashboardName =
1475
- data?.dashboard_name ?? data?.name ?? '';
1476
- this.dashboardForm.dashboardDescriptionText = descriptionText;
1477
- this.dashboardForm.selectedViewers = this.setListByIds(this.usersList, visibleUserIds, ['member_id', 'uid', 'id']);
1478
- this.listDetails.selectedUsersList = this.dashboardForm.selectedViewers;
1479
- this.dashboardForm.selectedGroup = this.setListByIds(this.groupList, visibleGroupIds, ['group_id', 'ugid', 'id']);
1480
- this.listDetails.selectedGroupList = this.dashboardForm.selectedGroup;
1481
- this.applyPendingResponsibilityCenters();
1482
- this.syncProgramsForEdit(data);
1483
- this.dashboardForm.selectedRiskCategories =
1484
- this.setList(this.allRiskCategories, riskCategoryIds, 'category_id');
1485
- this.dashboardForm.displayCriteria =
1486
- data?.display_criteria === 'BOTH_RC_AND_CATEGORY' ? 'and' : 'or';
1487
- this.dashboardForm.selectedFromDate = startDate
1488
- ? new Date(startDate)
1489
- : undefined;
1490
- this.dashboardForm.selectedToDate = endDate
1491
- ? new Date(endDate)
1492
- : undefined;
1493
- if (this.mode !== 'EDIT') {
1494
- this.vLoader = false;
1495
- const widgetDetailsRaw = data?.widget_details ?? data?.widgets ?? [];
1496
- const widgetDetails = Array.isArray(widgetDetailsRaw)
1497
- ? widgetDetailsRaw
1498
- : [];
1499
- const allWidgetsRaw = data?.all_widgets ?? widgetDetails;
1500
- const allWidgets = Array.isArray(allWidgetsRaw) ? allWidgetsRaw : [];
1501
- this.dashboardForm.configureWidget = widgetDetails;
1502
- this.selectedWidgets =
1503
- widgetDetails.length > 0 ? [...new Set(widgetDetails)] : [];
1504
- this.displayedWidgets =
1505
- allWidgets.length > 0 ? [...new Set(allWidgets)] : [];
1506
- }
1507
- if (startDate) {
1508
- const minToDate = this.setToDate(startDate);
1509
- this.toDatePickerConfig = { ...this.datePickerBaseConfig, min: minToDate };
1510
- }
1511
- this.hideToDate = true;
1512
- setTimeout(() => {
1513
- this.hideToDate = false;
1514
- }, 20);
1515
- this.cdr.detectChanges();
1516
- }
1517
- catch (error) {
1518
- console.error('populate dashboard error =>', error);
1519
- this.vLoader = false;
1520
- }
1521
- }
1522
- ngAfterViewChecked() {
1523
- //your code to update the model
1524
- this.cdr.detectChanges();
1525
- }
1526
- setPermission(roleActions) {
1527
- let ifExistRisk = roleActions?.find((el) => el.moduleName == 'risk');
1528
- ifExistRisk?.subModule?.forEach((module) => {
1529
- module?.permissions?.forEach((permission) => {
1530
- switch (permission?.code) {
1531
- case 'RRMR': {
1532
- if (permission?.defaultPermission == 1 || permission?.enable == 1) {
1533
- this.isManageRisk = true;
1534
- }
1535
- break;
1536
- }
1537
- }
1538
- });
1539
- });
1540
- }
1541
- documentClick(event) {
1542
- const fromOpen = !!this.fromDatePicker?.areCalendarsShown;
1543
- const toOpen = !!this.toDatePicker?.areCalendarsShown;
1544
- if (!this.datePickerOverlay && !fromOpen && !toOpen) {
1545
- return;
1546
- }
1547
- const targetElement = event?.target;
1548
- if (!targetElement?.closest) {
1549
- return;
1550
- }
1551
- // Keep calendar open when interacting with the calendar UI itself
1552
- // (including month/year navigation). The full-screen transparent
1553
- // `.dp-popup` backdrop is intentionally treated as an outside click.
1554
- const clickedInsideCalendar = !!targetElement.closest('dp-day-calendar, dp-month-calendar, dp-day-time-calendar, dp-time-select');
1555
- const clickedOnDateInput = !!targetElement.closest('#from_date, #to_date');
1556
- if (clickedInsideCalendar || clickedOnDateInput) {
1557
- return;
1558
- }
1559
- if (fromOpen || this.openedDatePicker === 'FROM_DATE') {
1560
- this.closeFromDatePicker();
1561
- }
1562
- if (toOpen || this.openedDatePicker === 'TO_DATE') {
1563
- this.closeToDatePicker();
1564
- }
1565
- this.datePickerOverlay = false;
1566
- this.openedDatePicker = '';
1567
- }
1568
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CreateDashboardComponent, deps: [{ token: i1.CreateDashboardService }, { token: i2.PaginationService }, { token: i0.ChangeDetectorRef }, { token: i3.SnackBarService }, { token: i4.PopoverService }, { token: i5.TextCountPipe }], target: i0.ɵɵFactoryTarget.Component });
1569
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CreateDashboardComponent, selector: "app-create-dashboard", inputs: { feature: "feature", mode: "mode", dashboardId: "dashboardId", dashboardDetails: "dashboardDetails", createdBy: "createdBy", configureWidget: "configureWidget" }, outputs: { close: "close" }, host: { listeners: { "document:keydown.escape": "onKeydownHandler($event)", "document:click": "documentClick($event)" } }, providers: [TextCountPipe], viewQueries: [{ propertyName: "fromDatePicker", first: true, predicate: ["fromDatePicker"], descendants: true }, { propertyName: "toDatePicker", first: true, predicate: ["toDatePicker"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<app-snack-bar></app-snack-bar>\n<div class=\"create-dashboard\" *ngIf=\"!openConfigureWidgets\">\n <div class=\"create-dashboard-container vx-d-flex vx-justify-end\" [class.animate-slideInRight]=\"animation\">\n <div class=\"more-option\" *ngIf=\"activeSelector && activeSelector !== 'name'\">\n <app-user-list *ngIf=\"activeSelector === 'whoCanView'\"\n (saveSelectedUsers)=\"saveSelectedList('whoCanView', $event)\" (closeUserList)=\"activateSelector('', false)\"\n [totalPages]=\"totalPages\" [totalList]=\"totalList\" [listDetails]=\"listDetails\" [totalgroupscount]=\"totalgroups\"\n [feature]=\"feature\"></app-user-list>\n <app-responsibility-center *ngIf=\"activeSelector === 'rcList'\"\n [responsibilityCentersList]=\"responsibilityCentersList\" [radioSelection]=\"false\"\n [selectedResponsibilityCenters]=\"\n dashboardForm.selectedResponsibilityCenters\n \" [rcIdKey]=\"'item_id'\" (saveSelectedList)=\"saveSelectedList('rc', $event)\"\n (closeRcList)=\"activateSelector('', false)\">\n </app-responsibility-center>\n <!-- <app-categories *ngIf=\"activeSelector === 'responsibilityCategories'\"\n [categoryList]=\"responsibilityCategoriesTree\" [allCategories]=\"allComplianceCategories\"\n [categoryIdKey]=\"'category_id'\" [selectedCategories]=\"dashboardForm.selectedResponsibilityCategories\"\n (saveSelectedCategory)=\"\n saveSelectedList('responsibilityCategories', $event)\n \" (closeCategoriesList)=\"activateSelector('', false)\"></app-categories> -->\n <app-list-container list *ngIf=\"activeSelector === 'responsibilityCategories'\"\n (close)=\"activateSelector('', false)\">\n <app-program-list body (itemsSelectedChange)=\"onProgramSelectionChange($event)\"\n [selectedItems]=\"selectedPrograms\" [url]=\"programListUrl\"></app-program-list>\n <div class=\"vx-d-flex vx-align-center vx-justify-between vx-w-100\" footer>\n <div class=\"left-side vx-fs-12 vx-d-flex\">\n <ng-container *ngIf=\"allProgamSelected?.length > 0\">\n <button\n class=\"selected-count-box vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\">\n {{ allProgamSelected.length }}\n </button>\n <span class=\"selected-text\">\n Program\n {{ allProgamSelected.length > 1 ? \"Categories\" : \"Category\" }}\n Selected</span>\n </ng-container>\n </div>\n <div class=\"right-side vx-d-flex\">\n <button class=\"cancelBtn\" (click)=\"activateSelector('', false)\">Cancel</button>\n <button class=\"nextBtn\" (click)=\"activateSelector('', false);\">\n Next <i class=\"icons\">&#xe91e;</i>\n </button>\n </div>\n </div>\n </app-list-container>\n\n </div>\n <div class=\"vx-dialog-container side-dialog\" [class.tablet-width]=\"activeSelector && activeSelector !== 'name'\">\n <app-loader-inline *ngIf=\"vLoader\"></app-loader-inline>\n\n <div class=\"form-group\" [class.disabled]=\"disabled\">\n <div class=\"vx-dialog-body-container\" (scroll)=\"animateImage()\"\n [class.hidden-scroll]=\"popoverService.stopScroll\">\n <!-- Dashboard Name -->\n <div class=\"form-group-row\" [class.disabled]=\"activeSelector && activeSelector !== 'name'\">\n <div class=\"image\">\n <img [ngSrc]=\"ASSETS.dashBoardIcon\" *ngIf=\"\n !dashboardForm.dashboardName || activeSelector === 'name'\n \" alt=\"\" width=\"36\" height=\"36\" />\n <svg class=\"checkIcon\" *ngIf=\"dashboardForm.dashboardName && activeSelector !== 'name'\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\n <label\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">Dashboard\n Name\n <span class=\"require vx-txt-red vx-fs-16 vx-fw-400\">*</span></label>\n <div class=\"vx-input-group\">\n <input class=\"textField\" placeholder=\"Add dashboard name (Max limit: 30 characters).\"\n [(ngModel)]=\"dashboardForm.dashboardName\" (keydown)=\"activeSelector = 'name'\"\n (focusin)=\"activateSelector('name', true)\" (focusout)=\"activateSelector('name', false)\" />\n\n <span class=\"counter\" *ngIf=\"dashboardForm?.dashboardName?.length > 0\">{{ 30 -\n dashboardForm.dashboardName.length }}</span>\n </div>\n\n <p class=\"vx-txt-error\" [appScrollInView]=\"true\" *ngIf=\"\n submitted &&\n (dashboardForm?.dashboardName?.length > 30 ||\n !dashboardForm?.dashboardName)\n \">\n {{\n dashboardForm.dashboardName.length > 30\n ? \"You have exceeded the maximum character limit of 30 characters.\"\n : \"Please enter a name for this Dashboard.\"\n }}\n </p>\n\n <div class=\"vx-input-group vx-mt-2\">\n <vcomply-editor [editorConfig]=\"dashboardDescription\"\n [(ngModel)]=\"dashboardForm.dashboardDescriptionText\"></vcomply-editor>\n <span class=\"counter\" *ngIf=\"dashboardForm?.dashboardDescriptionText?.length > 0\">{{\n 250 -\n (dashboardForm?.dashboardDescriptionText | textCount)\n }}</span>\n </div>\n\n <p class=\"vx-txt-error\" [appScrollInView]=\"true\" *ngIf=\"\n submitted &&\n (dashboardForm?.dashboardDescriptionText | textCount) > 250\n \">\n You have exceeded the maximum character limit of 250\n characters.\n </p>\n </div>\n </div>\n </div>\n\n <!-- Dashboard Display Criteria -->\n <span class=\"head-label vx-fs-10 vx-fw-500 vx-txt-white vx-tt-uppercase vx-pl-1 vx-pr-1 vx-lh-4\">\n Dashboard Display Criteria\n </span>\n <app-information-block></app-information-block>\n\n <!-- Who -->\n <div class=\"form-group-row\" [class.active]=\"activeSelector === 'whoCanView'\" [class.disabled]=\"\n activeSelector &&\n activeSelector !== 'whoCanView' &&\n activeSelector !== 'name'\n \">\n <div class=\"image\">\n <img [ngSrc]=\"ASSETS.dashBoardUsersIcon\" *ngIf=\"\n dashboardForm?.selectedViewers?.length == 0 ||\n activeSelector === 'whoCanView'\n \" alt=\"\" width=\"36\" height=\"36\" />\n <svg class=\"checkIcon\" *ngIf=\"\n dashboardForm?.selectedViewers?.length > 0 &&\n activeSelector !== 'whoCanView'\n \" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\n <label class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">Who\n can view this dashboard?<span class=\"require vx-txt-red vx-fs-16 vx-fw-400\">*</span></label>\n <div *ngIf=\"dashboardForm?.selectedViewers?.length == 0\"\n class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('whoCanView', true)\">\n <div class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\">\n Who can view this dashboard?\n </div>\n </div>\n\n <div *ngIf=\"dashboardForm?.selectedViewers?.length > 0\"\n class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\">\n <ng-container *ngIf=\"!groupsEnabled\" id=\"onlyuserslist\">\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\" *ngFor=\"\n let user of dashboardForm?.selectedViewers?.slice(0, 1)\n \">\n <i class=\"icons cross vx-fs-12 vx-paragraph-txt vx-mr-1\" *ngIf=\"\n !listDetails.nonRemovableUsersList.includes(\n user.member_id\n )\n \" (click)=\"remove('whoCanView', user)\">&#xe9ae;</i>\n <span class=\"chipName vx-fs-11 vx-label-txt\" [arTooltip]=\"user.member_name\"\n placement=\"bottom-left\" delay=\"0\" type=\"black\" [tooltipMandatory]=\"false\">{{ user.member_name\n }}</span>\n <button *ngIf=\"\n dashboardForm?.selectedViewers?.length > 1 &&\n !groupsEnabled\n \"\n class=\"countBtn greenBg vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\n appPopover (click)=\"userList.popover()\" placement=\"left\">\n +{{ dashboardForm?.selectedViewers?.slice(1).length }}\n </button>\n </div>\n <app-popover #userList [dontCloseonClick]=\"true\">\n <div class=\"action-list\">\n <ul class=\"action-item\">\n <li *ngFor=\"\n let user of dashboardForm?.selectedViewers\n | slice : 1;\n let j = index\n \">\n <div class=\"avatar-card\">\n <span class=\"value\" [arTooltip]=\"user?.member_name\" placement=\"bottom-left\" delay=\"0\"\n type=\"black\" [tooltipMandatory]=\"false\">\n <i class=\"icons cross-icon\" *ngIf=\"\n !listDetails.nonRemovableUsersList.includes(\n user.member_id\n ) && !groupsEnabled\n \" (click)=\"remove('whoCanView', user)\">&#xe90d;</i>\n {{ user?.member_name }}\n </span>\n </div>\n </li>\n </ul>\n </div>\n </app-popover>\n </ng-container>\n\n <div *ngIf=\"groupsEnabled\" class=\"vx-d-flex vx-align-center\">\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\">\n <span class=\"chipName vx-fs-11 vx-label-txt\">USER(S)</span>\n <button\n class=\"countBtn greenBg vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\n appPopover (click)=\"userCount.popover()\" placement=\"left\">\n {{ dashboardForm?.selectedViewers?.length }}\n </button>\n </div>\n <span class=\"vx-fs-12 vx-paragraph-txt vx-ml-2 vx-mr-2\" *ngIf=\"\n dashboardForm?.selectedGroup?.length &&\n dashboardForm?.selectedViewers?.length\n \">&</span>\n <div *ngIf=\"dashboardForm?.selectedGroup?.length\" id=\"usersandgroups\"\n class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\">\n <span class=\"chipName vx-fs-11 vx-label-txt\">USER GROUP(S)</span>\n <button\n class=\"countBtn vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\n appPopover (click)=\"groupCount.popover()\" placement=\"right\">\n {{ dashboardForm?.selectedGroup?.length }}\n </button>\n </div>\n\n <app-popover #userCount [dontCloseonClick]=\"true\">\n <div class=\"action-list\">\n <ul class=\"action-item\">\n <li *ngFor=\"let data of dashboardForm?.selectedViewers\">\n <div class=\"avatar-card\">\n <span class=\"value\" [arTooltip]=\"data.member_name\" placement=\"bottom-left\" delay=\"0\"\n type=\"black\" [tooltipMandatory]=\"false\">\n <i class=\"icons cross-icon\" *ngIf=\"\n !listDetails.nonRemovableUsersList.includes(\n data.member_id\n )\n \" (click)=\"remove('whoCanView', data)\">&#xe90d;</i>\n {{ data.member_name }}\n </span>\n </div>\n </li>\n </ul>\n </div>\n </app-popover>\n\n <app-popover #groupCount [dontCloseonClick]=\"true\">\n <div class=\"action-list\">\n <ul class=\"action-item\">\n <li *ngFor=\"let data of dashboardForm?.selectedGroup\">\n <div class=\"avatar-card\">\n <span class=\"value\" [arTooltip]=\"data.group_name\" placement=\"bottom-left\" delay=\"0\"\n type=\"black\" [tooltipMandatory]=\"false\">\n <i class=\"icons cross-icon\" (click)=\"remove('whoCanViewGroup', data)\">&#xe90d;</i>\n {{ data.group_name }}\n </span>\n </div>\n </li>\n </ul>\n </div>\n </app-popover>\n </div>\n\n <button *ngIf=\"activeSelector !== 'whoCanView'\"\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('whoCanView', true)\">\n <i class=\"icons vx-mr-1\">&#xe90c;</i> EDIT\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Responsibility Center -->\n <div class=\"form-group-row\" [class.active]=\"activeSelector === 'rcList'\" [class.disabled]=\"\n activeSelector &&\n activeSelector !== 'rcList' &&\n activeSelector !== 'name'\n \">\n <div class=\"image\">\n <img *ngIf=\"\n dashboardForm?.selectedResponsibilityCenters?.length == 0 ||\n activeSelector === 'rcList'\n \" [ngSrc]=\"ASSETS.dashBoardRcIcon\" alt=\"\" width=\"36\" height=\"36\" />\n <svg *ngIf=\"\n dashboardForm?.selectedResponsibilityCenters?.length > 0 &&\n activeSelector !== 'rcList'\n \" class=\"checkIcon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\n <label\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">RESPONSIBILITY\n CENTER(S)</label>\n <div *ngIf=\"\n dashboardForm?.selectedResponsibilityCenters?.length == 0\n \" class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('rcList', true)\" [class.error]=\"\n submitted &&\n dashboardForm?.selectedResponsibilityCenters?.length == 0 &&\n allProgamSelected?.length ==\n 0 &&\n dashboardForm?.selectedRiskCategories?.length == 0\n \">\n <div class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\">\n Select the Responsibility Center(s) that you would like<br />displayed\n in the Dashboard, if any.\n </div>\n </div>\n\n <div *ngIf=\"\n dashboardForm?.selectedResponsibilityCenters?.length > 0\n \" class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\">\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\" *ngFor=\"\n let rc of dashboardForm?.selectedResponsibilityCenters?.slice(\n 0,\n 1\n )\n \">\n <i class=\"icons cross vx-fs-12 vx-paragraph-txt vx-mr-1\" (click)=\"remove('rc', rc)\">&#xe9ae;</i>\n <span class=\"chipName vx-fs-11 vx-label-txt\" [arTooltip]=\"rc.item_name\" placement=\"bottom-left\"\n delay=\"0\" type=\"black\" [tooltipMandatory]=\"false\">{{ rc.item_name }}</span>\n <button *ngIf=\"\n dashboardForm?.selectedResponsibilityCenters?.length > 1\n \"\n class=\"countBtn vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\n appPopover (click)=\"rcList.popover()\" placement=\"left\">\n +{{\n dashboardForm?.selectedResponsibilityCenters?.slice(1)\n .length\n }}\n </button>\n\n <app-popover #rcList [dontCloseonClick]=\"true\">\n <div class=\"action-list\">\n <ul class=\"action-item\">\n <li *ngFor=\"\n let rc of dashboardForm?.selectedResponsibilityCenters\n | slice : 1;\n let j = index\n \">\n <div class=\"avatar-card\">\n <span class=\"value\" [arTooltip]=\"rc?.item_name\" placement=\"bottom-left\" delay=\"0\"\n type=\"black\" [tooltipMandatory]=\"false\">\n <i class=\"icons cross-icon\" (click)=\"remove('rc', rc)\">&#xe90d;</i>\n {{ rc?.item_name }}\n </span>\n </div>\n </li>\n </ul>\n </div>\n </app-popover>\n </div>\n\n <button *ngIf=\"activeSelector !== 'rcList'\"\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('rcList', true)\">\n <i class=\"icons vx-mr-1\">&#xe90c;</i> EDIT\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Program -->\n <div class=\"form-group-row\" [class.active]=\"activeSelector === 'responsibilityCategories'\" [class.disabled]=\"\n activeSelector &&\n activeSelector !== 'responsibilityCategories' &&\n activeSelector !== 'name'\n \">\n <div class=\"image\">\n <img *ngIf=\"\n allProgamSelected?.length ==\n 0 || activeSelector === 'responsibilityCategories'\n \" [ngSrc]=\"ASSETS.dashBoardProgramIcon\" alt=\"\" width=\"36\" height=\"36\" />\n <svg *ngIf=\"\n allProgamSelected?.length > 0 &&\n activeSelector !== 'responsibilityCategories'\n \" class=\"checkIcon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\n <label\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">PROGRAM</label>\n <div *ngIf=\"\n allProgamSelected?.length == 0\n \" class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('responsibilityCategories', true)\" [class.error]=\"\n submitted &&\n dashboardForm?.selectedResponsibilityCenters?.length == 0 &&\n allProgamSelected?.length ==\n 0 &&\n dashboardForm?.selectedRiskCategories?.length == 0\n \">\n <div class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\">\n Select the Program(s) that you would like displayed in\n the<br />Dashboard, if any.\n </div>\n </div>\n\n <div *ngIf=\"\n allProgamSelected?.length > 0\n \" class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\">\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\" *ngFor=\"\n let rCategory of allProgamSelected?.slice(\n 0,\n 1\n )\n \">\n <i class=\"icons cross vx-fs-12 vx-paragraph-txt vx-mr-1\"\n (click)=\"remove('responsibilityCategories', rCategory)\">&#xe9ae;</i>\n <span class=\"chipName vx-fs-11 vx-label-txt\" [arTooltip]=\"rCategory.item_name\"\n placement=\"bottom-left\" delay=\"0\" type=\"black\" [tooltipMandatory]=\"false\">{{ rCategory.name\n }}</span>\n <button *ngIf=\"\n allProgamSelected\n ?.length > 1\n \"\n class=\"countBtn vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\n appPopover (click)=\"rCategoryList.popover()\" placement=\"left\">\n +{{\n allProgamSelected?.slice(\n 1\n ).length\n }}\n </button>\n\n <app-popover #rCategoryList [dontCloseonClick]=\"true\">\n <div class=\"action-list\">\n <ul class=\"action-item\">\n <li *ngFor=\"\n let rCategory of allProgamSelected\n | slice : 1;\n let j = index\n \">\n <div class=\"avatar-card\">\n <span class=\"value\" [arTooltip]=\"rCategory?.name\" placement=\"bottom-left\" delay=\"0\"\n type=\"black\" [tooltipMandatory]=\"false\">\n <i class=\"icons cross-icon\" (click)=\"\n remove(\n 'responsibilityCategories',\n rCategory\n )\n \">&#xe90d;</i>\n {{ rCategory?.name }}\n </span>\n </div>\n </li>\n </ul>\n </div>\n </app-popover>\n </div>\n\n <button *ngIf=\"activeSelector !== 'responsibilityCategories'\"\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('responsibilityCategories', true)\">\n <i class=\"icons vx-mr-1\">&#xe90c;</i> EDIT\n </button>\n </div>\n </div>\n </div>\n </div>\n\n\n <!-- Timeframe -->\n <div class=\"form-group-row\" [class.disabled]=\"activeSelector && activeSelector !== 'name'\">\n <div class=\"image\">\n <img *ngIf=\"\n !dashboardForm?.selectedFromDate ||\n !dashboardForm?.selectedToDate\n \" [ngSrc]=\"ASSETS.dashBoardTimeFrameIcon\" alt=\"\" width=\"36\" height=\"36\" />\n <svg *ngIf=\"\n dashboardForm?.selectedFromDate &&\n dashboardForm?.selectedToDate\n \" class=\"checkIcon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\n <label\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">TIMEFRAME</label>\n <label class=\"vx-control-panel-sub-label\">Select how long the selected information should be displayed.\n Once the selected timeframe expires, the dashboard will automatically be deactivated and no longer\n displayed to users. If no timeframe is selected, the information\n will be displayed permanently.</label>\n <div class=\"input-group vx-d-flex vx-justify-between\">\n <div class=\"date-select\">\n <i class=\"icons\">&#xe92d;</i>\n <input type=\"text\" id=\"from_date\" [value]=\"\n dashboardForm?.selectedFromDate | date : 'dd MMM yyyy'\n \" [placeholder]=\"'From'\" (click)=\"openFromDatePicker($event)\" readonly />\n <dp-date-picker #fromDatePicker [(ngModel)]=\"dashboardForm.selectedFromDate\"\n placeholder=\"Select Date\" (onSelect)=\"\n closeFromDatePicker(); datePickerOverlay = false\n \" [config]=\"fromDatePickerConfig\"></dp-date-picker>\n <div class=\"overlay\" (click)=\"closeFromDatePicker()\" *ngIf=\"datePickerOverlay\"></div>\n </div>\n <div class=\"date-select\" *ngIf=\"!hideToDate\" [class.disabled]=\"!dashboardForm?.selectedFromDate\">\n <i class=\"icons\">&#xe92d;</i>\n <input type=\"text\" id=\"to_date\" [value]=\"\n dashboardForm?.selectedToDate | date : 'dd MMM yyyy'\n \" [placeholder]=\"'To'\" (click)=\"openToDatePicker($event)\" readonly />\n <dp-date-picker #toDatePicker [(ngModel)]=\"dashboardForm.selectedToDate\" placeholder=\"Select Date\"\n (onSelect)=\"\n closeToDatePicker(); datePickerOverlay = false\n \" [config]=\"toDatePickerConfig\"></dp-date-picker>\n <div class=\"overlay\" (click)=\"closeToDatePicker()\" *ngIf=\"datePickerOverlay\"></div>\n </div>\n </div>\n <p class=\"vx-txt-error\" [appScrollInView]=\"true\" *ngIf=\"\n submitted &&\n dashboardForm.selectedFromDate &&\n !dashboardForm.selectedToDate\n \">\n Select a time-frame.\n </p>\n </div>\n </div>\n </div>\n\n <!-- Email Summary -->\n <!-- <div\n class=\"form-group-row\"\n [class.active]=\"activeSelector === 'frequency'\"\n [class.disabled]=\"\n activeSelector &&\n activeSelector !== 'frequency' &&\n activeSelector !== 'name'\n \"\n >\n <div class=\"image\">\n <img\n *ngIf=\"!dashboardForm.frequencyMessage\"\n [ngSrc]=\"ASSETS.dashBoardEmailSummariesIcon\"\n alt=\"\"\n width=\"36\"\n height=\"36\"\n />\n <svg\n *ngIf=\"dashboardForm.frequencyMessage\"\n class=\"checkIcon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 52 52\"\n >\n <circle\n class=\"checkIcon__circle\"\n cx=\"26\"\n cy=\"26\"\n r=\"25\"\n fill=\"none\"\n />\n <path\n class=\"checkIcon__check\"\n fill=\"none\"\n d=\"M14.1 27.2l7.1 7.2 16.7-16.8\"\n />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block\">\n <label\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\"\n >Email Summaries</label\n >\n <label class=\"vx-control-panel-sub-label\"\n >If you would like to send a summary of this Dashboard, please\n select a frequency(By default VComply sends a weekly\n Summary).</label\n >\n <div\n *ngIf=\"!dashboardForm.frequencyMessage\"\n class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('frequency', true)\"\n >\n <div\n class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\"\n >\n Email Summaries\n </div>\n </div>\n\n <div\n *ngIf=\"dashboardForm.frequencyMessage\"\n class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\"\n >\n <div\n class=\"selectBoxText vx-fs-13 vx-paragraph-txt\"\n [arTooltip]=\"dashboardForm.frequencyMessage\"\n placement=\"bottom-left\"\n type=\"black\"\n delay=\"0\"\n [tooltipMandatory]=\"false\"\n [innerHTML]=\"dashboardForm.frequencyMessage\"\n ></div>\n\n <button\n *ngIf=\"\n dashboardForm.frequencyMessage &&\n activeSelector !== 'frequency'\n \"\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('frequency', true)\"\n >\n <i class=\"icons vx-mr-1\">&#xe90c;</i> EDIT\n </button>\n </div>\n </div>\n </div>\n </div> -->\n </div>\n <div class=\"button-block\">\n <button class=\"vx-btn block primary\" [disabled]=\"activeSelector && activeSelector !== 'name'\"\n (click)=\"configureDashboard()\">\n Next: Configure Widgets\n </button>\n </div>\n </div>\n\n <button class=\"close-dialog\" type=\"button\" [disabled]=\"activeSelector && activeSelector !== 'name'\"\n (click)=\"close.emit({ mode: 'discard' })\" [arTooltip]=\"'[Esc] to close'\" placement=\"left\" type=\"black\" delay=\"0\"\n [tooltipMandatory]=\"true\" [class.hide]=\"activeSelector && activeSelector !== 'name'\">\n <i class=\"icons\">&#xe93f;</i>\n </button>\n <div class=\"global-confirmation-alert\" *ngIf=\"\n submitted &&\n dashboardForm?.selectedResponsibilityCenters?.length == 0 \n \">\n <div class=\"global-confirmation-alert-top\">\n <span class=\"icon-block\">\n <i class=\"icons\">&#xe930;</i>\n </span>\n <p class=\"text\" *ngIf=\"showRiskCategory\">\n Select a Responsibility Center or Risk Category.\n </p>\n <p class=\"text\" *ngIf=\"!showRiskCategory\">\n Select a Responsibility Center.\n </p>\n </div>\n <div class=\"global-confirmation-alert-bottom\">\n <p class=\"message\"></p>\n <div class=\"button-group\">\n <button class=\"fill\" type=\"button\" (click)=\"submitted = false\">\n OKAY\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<app-smiley-dialog *ngIf=\"isSmiley\" [message]=\"smileyMessage\"></app-smiley-dialog>\n\n<app-configure-widgets *ngIf=\"openConfigureWidgets\" [mode]=\"mode\" [displayedWidgets]=\"displayedWidgets\"\n [showRisk]=\"showRiskWidgets\" [showCompliance]=\"!showComplianceWidgets\" [selectedWidgetsData]=\"selectedWidgets\"\n (widgetsDataModified)=\"setSelectedWidgets($event)\"\n (closeConfigureWidgets)=\"closeConfigureWidgets($event)\"></app-configure-widgets>", styles: ["@import\"https://cdn.v-comply.com/design-system/css/mixin/mixin.css\";@import\"https://cdn.v-comply.com/design-system/css/color/color.css\";@import\"https://cdn.v-comply.com/design-system/css/icons/icons.css\";@import\"https://cdn.v-comply.com/design-system/css/display/display.css\";@import\"https://cdn.v-comply.com/design-system/css/dialog/dialog.css\";@import\"https://cdn.v-comply.com/design-system/css/button/button.css\";@import\"https://cdn.v-comply.com/design-system/css/text/text.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-top.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-right.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-left.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-top.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-right.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-left.css\";@import\"https://cdn.v-comply.com/design-system/css/alignment/alignment.css\";@import\"https://cdn.v-comply.com/design-system/css/width/width.css\";@import\"https://cdn.v-comply.com/design-system/css/animate/animation.css\";@import\"https://cdn.v-comply.com/design-system/css/animate/animate-slide-right.css\";::ng-deep .create-dashboard-container{width:100vw;background:#161b2fcc}::ng-deep .create-dashboard-container .vx-dialog-container{background-color:#fff;border:none;position:relative}@media screen and (max-width: 1280px){::ng-deep .create-dashboard-container .vx-dialog-container.tablet-width{width:28px!important}::ng-deep .create-dashboard-container .vx-dialog-container.tablet-width .form-group .vx-dialog-body-container{overflow:hidden}}::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog{display:flex;position:absolute;top:8px;right:8px;height:32px;width:32px;font-size:16px;color:#161b2f;cursor:pointer;background:transparent;border:none;border-radius:2px;z-index:2;align-items:center;justify-content:center}::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog:hover{background:#f1f1f1}::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog:disabled{pointer-events:none;filter:grayscale(1);opacity:.3}@media screen and (max-width: 1280px){::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog.hide{display:none}}::ng-deep .create-dashboard .more-option{width:calc(100% - 500px);border-right:1px solid #f1f1f1;float:left}@media screen and (max-width: 1280px){::ng-deep .create-dashboard .more-option{width:calc(100vw - 28px)}::ng-deep .create-dashboard .more-option app-user-list .user-list{right:28px}::ng-deep .create-dashboard .more-option app-responsibility-center .responsibility-center{right:28px}::ng-deep .create-dashboard .more-option app-categories .category-list{right:28px}::ng-deep .create-dashboard .more-option app-risk-categories .risk-category-list{right:28px}::ng-deep .create-dashboard .more-option app-frequency .create-frequency{right:28px}}::ng-deep .form-group{position:relative}::ng-deep .form-group .vx-dialog-body-container{padding:36px 28px 0 40px!important;height:calc(100vh - 50px);overflow:auto;margin-left:-22px;background-color:transparent;position:relative;border-radius:0 0 0 30px;background:transparent}@-moz-document url-prefix(){::ng-deep .form-group .vx-dialog-body-container.hidden-scroll{overflow:hidden}}::ng-deep .form-group .vx-dialog-body-container .form-group-row{display:flex}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image{width:36px;min-width:36px;height:36px;margin-left:-36px;margin-right:20px;margin-top:28px;display:flex;align-items:center;justify-content:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image img{width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image .checkIcon{width:32px;height:32px;background:#fff;border-radius:50%;stroke-width:4;stroke:#34aa44;stroke-miterlimit:10;box-shadow:inset 0 0 #34aa44;animation:fillCheck .4s ease-in-out .4s forwards,scale .3s ease-in-out .9s both;margin-top:0}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image .checkIcon__circle{stroke-dasharray:166;stroke-dashoffset:166;stroke-width:2;stroke-miterlimit:10;stroke:#34aa44;fill:none;animation:strokeCheck .6s cubic-bezier(.65,0,.45,1) forwards}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image .checkIcon__check{transform-origin:50% 50%;stroke-dasharray:48;stroke-dashoffset:48;animation:strokeCheck .3s cubic-bezier(.65,0,.45,1) .8s forwards}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form{width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group{position:relative}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input{height:40px;border-radius:4px;border:1px solid #dbdbdb;outline:none;transition:all .2s ease-in-out}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input::placeholder{color:#747576}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input+marx-editor,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input+vcomply-editor{margin-top:8px;display:block}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input:hover{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input:focus{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selectbox:after{border-left:none;border-bottom:1px solid #707070;border-right:1px solid #707070;border-top:none;content:\"\";display:inline-block;right:15px;position:absolute;top:calc(50% + 8px);width:5px;height:5px;transform:rotate(45deg)}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selectbox:hover .custom-input{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected{height:40px;border-radius:4px;border:1px solid #f1f1f1;background:#fbfbfb;outline:none;position:relative;transition:all .2s ease-in-out}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .edit{border:1px solid #f1f1f1;border-radius:2px;background:#fff;outline:none;cursor:pointer;height:24px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .left{width:auto;display:flex}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .left.frequency-left{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block;width:calc(100% - 70px)}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container{width:auto}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container .chip{border-radius:2px;box-shadow:0 0 3px #1e5dd31a;height:24px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:24px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container .chip i{cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container .chip .value{max-width:100px;display:block;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container span.chip+span.chip{margin-left:4px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .count{border-radius:2px;height:24px;padding:2px 8px;border:1px solid #1e5dd3;cursor:pointer;outline:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container{display:flex;width:calc(100% - 60px);align-items:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner{background:#fff;border-radius:2px;box-shadow:0 2px 4px #1e5dd31a;line-height:24px;padding:0 4px 0 8px;display:flex;align-items:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner .chip{background:transparent;border-radius:0;box-shadow:none;height:auto;line-height:unset;padding:0;color:#747576;max-width:300px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner button.count{background:#1e5dd3;border-radius:20px;color:#fff;height:16px;padding:0 6px;border:none;font-size:9px;line-height:16px;margin-left:4px;min-width:20px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner button.count.user{background:#34aa44}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group{display:flex;position:relative}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group input::placeholder{color:#747576}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group span.counter{background:transparent;color:#161b2f;font-size:9px;font-weight:500;position:absolute;top:0;right:0;border-radius:3px;height:16px;text-align:center;line-height:16px;padding:0 2px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group marx-editor,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group vcomply-editor{width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group marx-editor .editor-container .editable-block.bottom:before,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group vcomply-editor .editor-container .editable-block.bottom:before{opacity:1}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group.vx-input-group{margin-top:8px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor{display:block}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container{border-radius:4px;border-color:#dbdbdb}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:focus-within,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:focus-within,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:hover,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:hover{border-color:#1e5dd3}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:focus-within .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:focus-within .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:hover .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:hover .editor-tools{border-top-color:#1e5dd3!important;transition:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editable-block,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editable-block{min-height:60px;padding:11px 15px;line-height:20px;font-size:13px;color:#747576;font-weight:400;transition:all .2s ease-in-out;width:100%;max-height:90px}@media not all and (min-resolution: .001dpcm){@supports (-webkit-appearance: none){::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editable-block:before,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editable-block:before{opacity:.72}}}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools{border-color:#dbdbdb;border-radius:0 0 2px 2px;transition:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button{height:22px!important;width:22px!important;padding:0 5px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button svg,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button svg{height:22px;width:12px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button.submit,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button.submit{width:80px!important;line-height:22px;justify-content:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col .popover.small ul.option-list li button,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col .popover.small ul.option-list li button{width:100%!important;height:auto!important}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .custom-input{height:2.5rem;border-radius:.25rem;border:1px solid #dbdbdb;background:#fff;outline:none;padding:.1875rem .75rem;line-height:1.25rem;font-size:13px;color:#747576;font-weight:400;transition:all .2s ease-in-out;width:100%;cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .custom-input:empty:not(:focus):before{content:attr(aria-placeholder);line-height:16px;font-size:12px;width:94%;display:block;pointer-events:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .custom-input.error{border:1px solid #d93b41}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form label.vx-control-panel i{font-size:12px;color:#1e5dd3;margin-left:7px;cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-control-panel-sub-label{color:#747576;font-size:.6875rem;font-weight:400;line-height:1rem;margin-bottom:.5rem;display:block;text-transform:none;width:100%;margin-top:0}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-control-panel-sub-label span.required{color:#eb2424}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form label.vx-control-panel+.vx-control-panel-sub-label{margin-top:-.5rem}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio{margin-top:4px;display:block;width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item{width:100%;position:relative}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item span.radio{position:absolute;top:17px;left:12px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item span.value{font-size:11px;text-transform:uppercase;border:1px solid #dbdbdb;border-radius:4px;padding:8px 8px 8px 36px;width:100%;display:flex;justify-content:space-between;margin:0;max-width:100%;font-weight:500;color:#707070}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item span.value i{font-size:12px;color:#1e5dd3}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item svg{position:absolute;top:17px;left:12px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item input:checked~span.value{background:#eefcf0;border-color:#34aa44}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio+app-cs-radio{margin-top:.5rem}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select{position:relative;width:calc(50% - .25rem);overflow:hidden;height:40px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select input{position:relative;z-index:1;padding-left:36px!important;padding:8px 12px;line-height:20px;font-size:13px;color:#747576;font-weight:400;width:100%;cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select input::placeholder{color:#747576}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select dp-date-picker{position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;pointer-events:none;z-index:0}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select i{display:flex;justify-content:center;align-items:center;height:39px;width:14px;position:absolute;left:12px;top:0;color:#bcbcbc;font-size:14px;pointer-events:none;z-index:2}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select.disabled{pointer-events:none;filter:grayscale(1);opacity:1}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select.disabled input{background:#f1f1f1}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form label.vx-control-panel span.sub-label{color:#747576;font-size:.6875rem;font-weight:400;line-height:1rem;text-transform:none;width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row.disabled{pointer-events:none;filter:grayscale(1);opacity:.3}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active{pointer-events:none;filter:grayscale(0);opacity:1}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .image{filter:grayscale(0)}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .image:before{display:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .form{opacity:1;filter:grayscale(0)}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .form .custom-input,::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .form input[type=text]{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .selectBoxEnable{border-color:#1e5dd3;box-shadow:0 3px 6px #1e5dd31a;pointer-events:none}::ng-deep .form-group .vx-dialog-body-container:after{content:\"\";width:100%;display:block;height:30px;position:sticky;right:0;bottom:0;left:0;z-index:6;background:linear-gradient(to bottom,#fff0,#ffffffbf 22%,#fff);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\"#00ffffff\",endColorstr=\"#ffffff\",GradientType=0)}::ng-deep .form-group .button-block{position:relative;z-index:2}::ng-deep .form-group .button-block button{font-size:13px!important;letter-spacing:1.3px!important;height:50px;line-height:48px!important}::ng-deep .form-group .button-block button:disabled{background:#f1f1f1!important;border-color:#f1f1f1!important;color:#747576!important;opacity:1!important;filter:unset!important}::ng-deep .form-group.disabled{pointer-events:none;z-index:2}::ng-deep .form-group.disabled .image{position:relative;filter:grayscale(1)}::ng-deep .form-group.disabled .image:before{content:\"\";position:absolute;inset:0;background:#fff;opacity:.7}::ng-deep .form-group.disabled .form{opacity:.3;filter:grayscale(1)}@keyframes strokeCheck{to{stroke-dashoffset:0}}@keyframes fillCheck{to{box-shadow:inset 0 0 0 2px #34aa44}}.action-list{width:220px}.action-list ul{padding:0;margin:0;animation:scale-up-center .2s cubic-bezier(.39,.575,.565,1) both;background:#fff;box-shadow:0 3px 6px #1c5bd140;border-radius:4px;max-height:220px;overflow:auto}.action-list ul.action-item{display:block}.action-list ul.action-item li{list-style:none;border:none;border-bottom:1px solid #f1f1f1;display:block;width:100%;padding:0;background:transparent;border-radius:0;margin:0;height:auto;justify-content:flex-start;box-shadow:none}.action-list ul.action-item li button{color:#6e717e;text-align:left;text-decoration:none;cursor:pointer;background:transparent;font-size:12px;text-transform:capitalize;display:flex;width:100%;padding:7.5px 11px;border:none}.action-list ul.action-item li button i{font-size:17px;margin-right:10px;color:#1c5bd1}.action-list ul.action-item li button:hover{background:#f3f3f3}.action-list ul.action-item li .avatar-card{display:flex;align-items:center;width:100%;padding:7.5px}.action-list ul.action-item li .avatar-card.within-con{display:block}.action-list ul.action-item li .avatar-card .avatar{height:24px;width:24px!important;overflow:hidden;background:#4681ef;color:#fff;font-size:10px;display:inline-flex;margin-right:5px;border-radius:50%;align-items:center;justify-content:center;text-transform:uppercase}.action-list ul.action-item li .avatar-card .avatar img{width:100%}.action-list ul.action-item li .avatar-card .avatar+span.value{width:calc(100% - 29px)}.action-list ul.action-item li .avatar-card span.value{width:100%;color:#6e717e;text-decoration:none;background:transparent;font-size:12px;text-transform:capitalize;display:block;font-weight:400;text-align-last:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:20px}.action-list ul.action-item li .avatar-card span.value i{font-size:8px;color:#1c5bd1;cursor:pointer;margin-right:4px}.action-list ul.action-item li .avatar-card span.value i.cross-icon{color:#747576}.action-list ul.action-item li .avatar-card.no-image{display:block}.action-list ul.action-item li .avatar-card.no-image span.value{width:100%;display:block}.action-list ul.action-item li .chip-item{color:#1e5dd3;padding:10px;display:flex;align-items:center}.action-list ul.action-item li .chip-item i{margin-right:7px;font-size:10px;cursor:pointer;display:inline-flex}.action-list ul.action-item li .chip-item span{display:block;width:auto;max-width:calc(100% - 17px);font-size:12px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.action-list ul.action-item li .chip-item span.chip-block{display:block;width:100%}.action-list ul.action-item li .chip-item span.id{font-size:9px}.action-list ul.action-item li .within{display:flex;align-items:center;justify-content:flex-start}.action-list ul.action-item li .within .block{background:#f1f1f1;border-radius:2px;padding:0 2px;line-height:14px;font-size:9px;font-weight:500;color:#042e7d;margin-right:6px;display:block;text-transform:uppercase}.action-list ul.action-item li .within .data{width:100%;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#747576;font-size:11px;font-weight:400;line-height:17px}.action-list ul.action-item li:first-child{animation:action-list-open .25s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(2){animation:action-list-open .35s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(3){animation:action-list-open .45s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(4){animation:action-list-open .55s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(5){animation:action-list-open .65s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(6){animation:action-list-open .75s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(7){animation:action-list-open .85s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(8){animation:action-list-open .95s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(9){animation:action-list-open 1.05s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(10){animation:action-list-open 1.15s cubic-bezier(.25,.46,.45,.94) both}.global-confirmation-alert{display:block;position:absolute;z-index:9;right:0;bottom:0;left:0;background:#d93b41}.global-confirmation-alert-top{display:flex;align-items:center;justify-content:flex-start;padding:20px 20px 12px}.global-confirmation-alert span.icon-block{height:36px;width:36px;border-radius:50%;background:#fff;border:1px solid #dcdcdc;display:flex;justify-content:center;align-items:center;margin-right:16px}.global-confirmation-alert span.icon-block i{color:#d93b41;font-size:12px}.global-confirmation-alert p.text{color:#fff;font-size:14px;font-weight:300;margin:0;width:calc(100% - 52px)}.global-confirmation-alert-bottom{display:flex;align-items:center;padding:0 12px 12px 72px;background:#d93b41}.global-confirmation-alert-bottom .button-group{display:flex}.global-confirmation-alert-bottom p.message{font-size:14px;font-weight:500;margin:0;line-height:20px;color:#fff}.global-confirmation-alert button{height:24px;width:64px;border:1px solid #000;border-radius:2px;display:flex;align-items:center;justify-content:center;line-height:22px;cursor:pointer;font-size:11px;text-transform:uppercase;font-weight:500;padding:0}.global-confirmation-alert button+button{margin-left:4px}.global-confirmation-alert button.fill{background:#fff;color:#1e5dd3;border-color:#fff}.global-confirmation-alert button.outline{background:transparent;color:#fff;border-color:#fff}::ng-deep marx-modal .popup-modal-background,::ng-deep vcomply-modal .popup-modal-background{background-color:#161b2fcc!important}::ng-deep input.textField{background:#fff;border-radius:.25rem;border:1px solid #dbdbdb;font-size:13px;color:#747576;padding:8px 12px;position:relative;height:2.5rem;width:100%;transition:all .2s ease-in-out}::ng-deep input.textField::placeholder{font-size:13px;color:#747576}::ng-deep input.textField:hover,::ng-deep input.textField:focus{outline:none;border-color:#1e5dd3;box-shadow:0 3px 6px #1e5dd31a}::ng-deep .selectBoxEnable{background:#fff;border-radius:.25rem;border:1px solid #dbdbdb;cursor:pointer;height:2.5rem;position:relative;transition:all .2s ease-in-out}::ng-deep .selectBoxEnable:after{border-bottom-style:solid;border-bottom-width:1px;border-right-style:solid;border-right-width:1px;border-color:#747576;content:\"\";display:inline-block;right:12px;position:absolute;top:calc(50% - 4px);width:5px;height:5px;transform:rotate(45deg)}::ng-deep .selectBoxEnable:hover,::ng-deep .selectBoxEnable:focus{border-color:#1e5dd3;box-shadow:0 3px 6px #1e5dd31a}::ng-deep .selectBoxEnable.disabled{background:#f1f1f1;pointer-events:none;opacity:1}::ng-deep .selectBoxEnable.error{border-color:#eb2424}::ng-deep .selectBoxSuccess{background:#f8f8f8;border-radius:.25rem;border:1px solid #f1f1f1;min-height:2.5rem;position:relative}::ng-deep .selectBoxSuccess .selectBoxText{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;width:22rem}::ng-deep .selectBoxSuccess button{background:transparent;border-radius:0;border:none}::ng-deep .selectBoxSuccess button.deleteBtn{color:#d93b41}::ng-deep .selectBoxSuccess .level-left{border-right:1px solid #f1f1f1;height:2.375rem;width:5rem}::ng-deep .selectBoxSuccess .level-left .level-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;width:4.5rem}::ng-deep .chipContainer{background:#fff;border-radius:.125rem;box-shadow:0 0 2px #1e5dd340;height:1.5rem}::ng-deep .chipContainer .cross{cursor:pointer;min-width:16px;width:16px;height:16px;display:flex;align-items:center;justify-content:center;background:transparent;border-radius:2px;margin-left:-4px}::ng-deep .chipContainer .cross:hover{background:#f1f1f1}::ng-deep .chipContainer .chipName{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;max-width:6rem}::ng-deep .chipContainer .chipName.no-width{max-width:unset}::ng-deep .chipContainer button.countBtn{background:#1e5dd3;border-radius:1.25rem;border:none;min-width:1.5rem;height:1rem;margin:0 0 0 .5rem;padding:0 .25rem}::ng-deep .chipContainer button.countBtn.greenBg{background:#34aa44}::ng-deep .cdk-overlay-pane{inset:0!important;align-items:center;justify-content:center}::ng-deep .cdk-overlay-pane .dp-popup{z-index:999;display:flex!important;align-items:center;justify-content:center;width:100vw;height:100vh;background:transparent!important;border:none!important;box-shadow:unset!important}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar{width:412px!important;box-shadow:0 0 20px #161b2f26;background-color:#fff;border-radius:4px;animation:scale-up-center .2s cubic-bezier(.39,.575,.565,1) both}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar{width:100%;pointer-events:auto}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button{background:transparent;border:none;outline:none}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-left,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-left,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-right,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-right{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:50%;font-size:14px}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-left:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-left:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-right:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-right:hover{background-color:#f3f3f3}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn{display:none}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn:before,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn:before{content:\"\";height:10px;width:10px;border-radius:50%;background:#000;display:inline-flex}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week{display:flex;justify-content:space-around}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays .dp-calendar-weekday,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays .dp-calendar-weekday,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week .dp-calendar-weekday,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week .dp-calendar-weekday{width:52px;border-left:none;border-bottom-color:#fff;color:#747576;font-size:11px;font-weight:600;text-transform:uppercase}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button{width:40px;height:40px;border-radius:50%;display:inline-flex;justify-content:center;align-items:center}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button:hover{background-color:#f3f3f3}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button.dp-selected,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button.dp-selected,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button.dp-selected,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button.dp-selected{background:#1e5dd3}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button.dp-current-day,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button.dp-current-day,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button.dp-current-day,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button.dp-current-day{border:1px solid rgba(0,0,0,.38);color:#1e5dd3;background-color:#fff}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-day-calendar-container,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-day-calendar-container{padding:20px;border-radius:2px}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-nav-container,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-nav-container{display:flex;margin:0 0 20px;border:none}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-nav-container .dp-nav-header button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-nav-container .dp-nav-header button{color:#000;font-size:17px;font-weight:500;margin:0 0 0 12px;padding:0}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-nav-btns-container,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-nav-btns-container{width:80px;display:flex}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-nav-btns-container .dp-calendar-nav-container-left button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-nav-btns-container .dp-calendar-nav-container-left button,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-nav-btns-container .dp-calendar-nav-container-right button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-nav-btns-container .dp-calendar-nav-container-right button{margin:0!important}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-wrapper,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-wrapper{border:none}.left-side{color:#707070}.right-side button{border-radius:2px;height:24px;background:#1e5dd3!important;display:flex;justify-content:center;align-items:center;cursor:pointer;color:#fff!important;text-transform:uppercase;font-size:11px;font-weight:500;border:none!important;padding:0 8px;margin:0 0 0 8px}.right-side button i{margin-left:8px;font-size:11px}.right-side button:disabled{background:#f1f1f1!important;color:#747576!important;opacity:1}.right-side button.cancelBtn{background:transparent!important;color:#eb2424!important}.selected-count-box{background:#1e5dd3;border-radius:1.25rem;border:none;min-width:1.5rem;height:1rem;margin:0 0 0 .5rem;padding:0 .25rem;position:relative}.selected-text{color:#707070;font-size:11px;font-weight:500;position:fixed;padding-left:2.5rem}::ng-deep .vc-divider{border-top:.5px solid #dbdbdb;width:100%}::ng-deep .vc-cf-container{border-bottom:1px solid #E3E3E9}::ng-deep .vc-cf-container:first-of-type,::ng-deep .vc-cf-container:only-child{border-top:1px solid #E3E3E9}::ng-deep .vc-cf-container .cf-name{width:9.25rem}::ng-deep .vc-cf-container .cf-value{width:calc(100% - 9.75rem)}::ng-deep .vc-cf-container .cf-value input{height:24px!important;border:1px solid #CDCED6!important;padding:0 .5rem!important;color:#565a6f!important;font-size:11px!important}::ng-deep .vc-cf-container .cf-value input::placeholder{color:#a9aab6!important}::ng-deep .vc-cf-container .cf-value input:hover{border-color:#343952!important}::ng-deep .vc-cf-container .cf-value input:focus{outline:none;border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd31a}.head-label{background:#565a6f;border-radius:.125rem;height:1rem;position:relative}.head-label:before{background:#e3e3e9;content:\"\";position:absolute;top:7px;left:-40px;width:500px;height:1px;z-index:-1}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.MarxEditorComponent, selector: "vcomply-editor", inputs: ["editorConfig"], outputs: ["comment", "sendSavedFiles", "popup"] }, { kind: "directive", type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i9.ToolTipDirective, selector: "[arTooltip]", inputs: ["arTooltip", "placement", "type", "tooltipMandatory", "showTooltip", "animate"] }, { kind: "component", type: i10.ConfigureWidgetsComponent, selector: "app-configure-widgets", inputs: ["selectedWidgetsData", "displayedWidgets", "showRisk", "showCompliance", "mode"], outputs: ["widgetsDataModified", "closeConfigureWidgets"] }, { kind: "component", type: i11.PopoverComponent, selector: "app-popover", inputs: ["dontCloseonClick"], outputs: ["closedOnOverlay"] }, { kind: "directive", type: i12.PopoverDirective, selector: "[appPopover]", inputs: ["refrence", "placement"] }, { kind: "component", type: i13.LoaderInlineComponent, selector: "app-loader-inline" }, { kind: "component", type: i14.SnackBarComponent, selector: "app-snack-bar" }, { kind: "directive", type: i15.ScrollInViewDirective, selector: "[appScrollInView]", inputs: ["appScrollInView"] }, { kind: "component", type: i16.SmileyDialogComponent, selector: "app-smiley-dialog", inputs: ["message", "autoClose", "actionButtons"], outputs: ["action", "closeSmiley"] }, { kind: "component", type: i17.DatePickerComponent, selector: "dp-date-picker", inputs: ["config", "mode", "placeholder", "disabled", "displayDate", "theme", "minDate", "maxDate", "minTime", "maxTime"], outputs: ["open", "close", "onChange", "onGoToCurrent", "onLeftNav", "onRightNav", "onSelect"] }, { kind: "directive", type: i6.NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "src", "srcset"] }, { kind: "component", type: i18.ProgramListComponent, selector: "app-program-list", inputs: ["items", "selectedItems", "url"], outputs: ["itemSelected", "itemDeselected", "itemsSelectedChange"] }, { kind: "component", type: i19.ListContainerComponent, selector: "app-list-container", inputs: ["heading"], outputs: ["close"] }, { kind: "component", type: i20.InformationBlockComponent, selector: "app-information-block" }, { kind: "component", type: i21.UserListComponent, selector: "app-user-list", inputs: ["selectionType", "listDetails", "totalPages", "limit", "totalList", "feature", "totalgroupscount"], outputs: ["closeUserList", "saveSelectedUsers"] }, { kind: "component", type: i22.ResponsibilityCenterComponent, selector: "app-responsibility-center", inputs: ["responsibilityCentersList", "selectedResponsibilityCenters", "rcIdKey", "radioSelection"], outputs: ["saveSelectedList", "closeRcList"] }, { kind: "pipe", type: i6.SlicePipe, name: "slice" }, { kind: "pipe", type: i6.DatePipe, name: "date" }, { kind: "pipe", type: i5.TextCountPipe, name: "textCount" }] });
1570
- }
1571
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CreateDashboardComponent, decorators: [{
1572
- type: Component,
1573
- args: [{ selector: 'app-create-dashboard', providers: [TextCountPipe], template: "<app-snack-bar></app-snack-bar>\n<div class=\"create-dashboard\" *ngIf=\"!openConfigureWidgets\">\n <div class=\"create-dashboard-container vx-d-flex vx-justify-end\" [class.animate-slideInRight]=\"animation\">\n <div class=\"more-option\" *ngIf=\"activeSelector && activeSelector !== 'name'\">\n <app-user-list *ngIf=\"activeSelector === 'whoCanView'\"\n (saveSelectedUsers)=\"saveSelectedList('whoCanView', $event)\" (closeUserList)=\"activateSelector('', false)\"\n [totalPages]=\"totalPages\" [totalList]=\"totalList\" [listDetails]=\"listDetails\" [totalgroupscount]=\"totalgroups\"\n [feature]=\"feature\"></app-user-list>\n <app-responsibility-center *ngIf=\"activeSelector === 'rcList'\"\n [responsibilityCentersList]=\"responsibilityCentersList\" [radioSelection]=\"false\"\n [selectedResponsibilityCenters]=\"\n dashboardForm.selectedResponsibilityCenters\n \" [rcIdKey]=\"'item_id'\" (saveSelectedList)=\"saveSelectedList('rc', $event)\"\n (closeRcList)=\"activateSelector('', false)\">\n </app-responsibility-center>\n <!-- <app-categories *ngIf=\"activeSelector === 'responsibilityCategories'\"\n [categoryList]=\"responsibilityCategoriesTree\" [allCategories]=\"allComplianceCategories\"\n [categoryIdKey]=\"'category_id'\" [selectedCategories]=\"dashboardForm.selectedResponsibilityCategories\"\n (saveSelectedCategory)=\"\n saveSelectedList('responsibilityCategories', $event)\n \" (closeCategoriesList)=\"activateSelector('', false)\"></app-categories> -->\n <app-list-container list *ngIf=\"activeSelector === 'responsibilityCategories'\"\n (close)=\"activateSelector('', false)\">\n <app-program-list body (itemsSelectedChange)=\"onProgramSelectionChange($event)\"\n [selectedItems]=\"selectedPrograms\" [url]=\"programListUrl\"></app-program-list>\n <div class=\"vx-d-flex vx-align-center vx-justify-between vx-w-100\" footer>\n <div class=\"left-side vx-fs-12 vx-d-flex\">\n <ng-container *ngIf=\"allProgamSelected?.length > 0\">\n <button\n class=\"selected-count-box vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\">\n {{ allProgamSelected.length }}\n </button>\n <span class=\"selected-text\">\n Program\n {{ allProgamSelected.length > 1 ? \"Categories\" : \"Category\" }}\n Selected</span>\n </ng-container>\n </div>\n <div class=\"right-side vx-d-flex\">\n <button class=\"cancelBtn\" (click)=\"activateSelector('', false)\">Cancel</button>\n <button class=\"nextBtn\" (click)=\"activateSelector('', false);\">\n Next <i class=\"icons\">&#xe91e;</i>\n </button>\n </div>\n </div>\n </app-list-container>\n\n </div>\n <div class=\"vx-dialog-container side-dialog\" [class.tablet-width]=\"activeSelector && activeSelector !== 'name'\">\n <app-loader-inline *ngIf=\"vLoader\"></app-loader-inline>\n\n <div class=\"form-group\" [class.disabled]=\"disabled\">\n <div class=\"vx-dialog-body-container\" (scroll)=\"animateImage()\"\n [class.hidden-scroll]=\"popoverService.stopScroll\">\n <!-- Dashboard Name -->\n <div class=\"form-group-row\" [class.disabled]=\"activeSelector && activeSelector !== 'name'\">\n <div class=\"image\">\n <img [ngSrc]=\"ASSETS.dashBoardIcon\" *ngIf=\"\n !dashboardForm.dashboardName || activeSelector === 'name'\n \" alt=\"\" width=\"36\" height=\"36\" />\n <svg class=\"checkIcon\" *ngIf=\"dashboardForm.dashboardName && activeSelector !== 'name'\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\n <label\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">Dashboard\n Name\n <span class=\"require vx-txt-red vx-fs-16 vx-fw-400\">*</span></label>\n <div class=\"vx-input-group\">\n <input class=\"textField\" placeholder=\"Add dashboard name (Max limit: 30 characters).\"\n [(ngModel)]=\"dashboardForm.dashboardName\" (keydown)=\"activeSelector = 'name'\"\n (focusin)=\"activateSelector('name', true)\" (focusout)=\"activateSelector('name', false)\" />\n\n <span class=\"counter\" *ngIf=\"dashboardForm?.dashboardName?.length > 0\">{{ 30 -\n dashboardForm.dashboardName.length }}</span>\n </div>\n\n <p class=\"vx-txt-error\" [appScrollInView]=\"true\" *ngIf=\"\n submitted &&\n (dashboardForm?.dashboardName?.length > 30 ||\n !dashboardForm?.dashboardName)\n \">\n {{\n dashboardForm.dashboardName.length > 30\n ? \"You have exceeded the maximum character limit of 30 characters.\"\n : \"Please enter a name for this Dashboard.\"\n }}\n </p>\n\n <div class=\"vx-input-group vx-mt-2\">\n <vcomply-editor [editorConfig]=\"dashboardDescription\"\n [(ngModel)]=\"dashboardForm.dashboardDescriptionText\"></vcomply-editor>\n <span class=\"counter\" *ngIf=\"dashboardForm?.dashboardDescriptionText?.length > 0\">{{\n 250 -\n (dashboardForm?.dashboardDescriptionText | textCount)\n }}</span>\n </div>\n\n <p class=\"vx-txt-error\" [appScrollInView]=\"true\" *ngIf=\"\n submitted &&\n (dashboardForm?.dashboardDescriptionText | textCount) > 250\n \">\n You have exceeded the maximum character limit of 250\n characters.\n </p>\n </div>\n </div>\n </div>\n\n <!-- Dashboard Display Criteria -->\n <span class=\"head-label vx-fs-10 vx-fw-500 vx-txt-white vx-tt-uppercase vx-pl-1 vx-pr-1 vx-lh-4\">\n Dashboard Display Criteria\n </span>\n <app-information-block></app-information-block>\n\n <!-- Who -->\n <div class=\"form-group-row\" [class.active]=\"activeSelector === 'whoCanView'\" [class.disabled]=\"\n activeSelector &&\n activeSelector !== 'whoCanView' &&\n activeSelector !== 'name'\n \">\n <div class=\"image\">\n <img [ngSrc]=\"ASSETS.dashBoardUsersIcon\" *ngIf=\"\n dashboardForm?.selectedViewers?.length == 0 ||\n activeSelector === 'whoCanView'\n \" alt=\"\" width=\"36\" height=\"36\" />\n <svg class=\"checkIcon\" *ngIf=\"\n dashboardForm?.selectedViewers?.length > 0 &&\n activeSelector !== 'whoCanView'\n \" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\n <label class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">Who\n can view this dashboard?<span class=\"require vx-txt-red vx-fs-16 vx-fw-400\">*</span></label>\n <div *ngIf=\"dashboardForm?.selectedViewers?.length == 0\"\n class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('whoCanView', true)\">\n <div class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\">\n Who can view this dashboard?\n </div>\n </div>\n\n <div *ngIf=\"dashboardForm?.selectedViewers?.length > 0\"\n class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\">\n <ng-container *ngIf=\"!groupsEnabled\" id=\"onlyuserslist\">\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\" *ngFor=\"\n let user of dashboardForm?.selectedViewers?.slice(0, 1)\n \">\n <i class=\"icons cross vx-fs-12 vx-paragraph-txt vx-mr-1\" *ngIf=\"\n !listDetails.nonRemovableUsersList.includes(\n user.member_id\n )\n \" (click)=\"remove('whoCanView', user)\">&#xe9ae;</i>\n <span class=\"chipName vx-fs-11 vx-label-txt\" [arTooltip]=\"user.member_name\"\n placement=\"bottom-left\" delay=\"0\" type=\"black\" [tooltipMandatory]=\"false\">{{ user.member_name\n }}</span>\n <button *ngIf=\"\n dashboardForm?.selectedViewers?.length > 1 &&\n !groupsEnabled\n \"\n class=\"countBtn greenBg vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\n appPopover (click)=\"userList.popover()\" placement=\"left\">\n +{{ dashboardForm?.selectedViewers?.slice(1).length }}\n </button>\n </div>\n <app-popover #userList [dontCloseonClick]=\"true\">\n <div class=\"action-list\">\n <ul class=\"action-item\">\n <li *ngFor=\"\n let user of dashboardForm?.selectedViewers\n | slice : 1;\n let j = index\n \">\n <div class=\"avatar-card\">\n <span class=\"value\" [arTooltip]=\"user?.member_name\" placement=\"bottom-left\" delay=\"0\"\n type=\"black\" [tooltipMandatory]=\"false\">\n <i class=\"icons cross-icon\" *ngIf=\"\n !listDetails.nonRemovableUsersList.includes(\n user.member_id\n ) && !groupsEnabled\n \" (click)=\"remove('whoCanView', user)\">&#xe90d;</i>\n {{ user?.member_name }}\n </span>\n </div>\n </li>\n </ul>\n </div>\n </app-popover>\n </ng-container>\n\n <div *ngIf=\"groupsEnabled\" class=\"vx-d-flex vx-align-center\">\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\">\n <span class=\"chipName vx-fs-11 vx-label-txt\">USER(S)</span>\n <button\n class=\"countBtn greenBg vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\n appPopover (click)=\"userCount.popover()\" placement=\"left\">\n {{ dashboardForm?.selectedViewers?.length }}\n </button>\n </div>\n <span class=\"vx-fs-12 vx-paragraph-txt vx-ml-2 vx-mr-2\" *ngIf=\"\n dashboardForm?.selectedGroup?.length &&\n dashboardForm?.selectedViewers?.length\n \">&</span>\n <div *ngIf=\"dashboardForm?.selectedGroup?.length\" id=\"usersandgroups\"\n class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\">\n <span class=\"chipName vx-fs-11 vx-label-txt\">USER GROUP(S)</span>\n <button\n class=\"countBtn vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\n appPopover (click)=\"groupCount.popover()\" placement=\"right\">\n {{ dashboardForm?.selectedGroup?.length }}\n </button>\n </div>\n\n <app-popover #userCount [dontCloseonClick]=\"true\">\n <div class=\"action-list\">\n <ul class=\"action-item\">\n <li *ngFor=\"let data of dashboardForm?.selectedViewers\">\n <div class=\"avatar-card\">\n <span class=\"value\" [arTooltip]=\"data.member_name\" placement=\"bottom-left\" delay=\"0\"\n type=\"black\" [tooltipMandatory]=\"false\">\n <i class=\"icons cross-icon\" *ngIf=\"\n !listDetails.nonRemovableUsersList.includes(\n data.member_id\n )\n \" (click)=\"remove('whoCanView', data)\">&#xe90d;</i>\n {{ data.member_name }}\n </span>\n </div>\n </li>\n </ul>\n </div>\n </app-popover>\n\n <app-popover #groupCount [dontCloseonClick]=\"true\">\n <div class=\"action-list\">\n <ul class=\"action-item\">\n <li *ngFor=\"let data of dashboardForm?.selectedGroup\">\n <div class=\"avatar-card\">\n <span class=\"value\" [arTooltip]=\"data.group_name\" placement=\"bottom-left\" delay=\"0\"\n type=\"black\" [tooltipMandatory]=\"false\">\n <i class=\"icons cross-icon\" (click)=\"remove('whoCanViewGroup', data)\">&#xe90d;</i>\n {{ data.group_name }}\n </span>\n </div>\n </li>\n </ul>\n </div>\n </app-popover>\n </div>\n\n <button *ngIf=\"activeSelector !== 'whoCanView'\"\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('whoCanView', true)\">\n <i class=\"icons vx-mr-1\">&#xe90c;</i> EDIT\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Responsibility Center -->\n <div class=\"form-group-row\" [class.active]=\"activeSelector === 'rcList'\" [class.disabled]=\"\n activeSelector &&\n activeSelector !== 'rcList' &&\n activeSelector !== 'name'\n \">\n <div class=\"image\">\n <img *ngIf=\"\n dashboardForm?.selectedResponsibilityCenters?.length == 0 ||\n activeSelector === 'rcList'\n \" [ngSrc]=\"ASSETS.dashBoardRcIcon\" alt=\"\" width=\"36\" height=\"36\" />\n <svg *ngIf=\"\n dashboardForm?.selectedResponsibilityCenters?.length > 0 &&\n activeSelector !== 'rcList'\n \" class=\"checkIcon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\n <label\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">RESPONSIBILITY\n CENTER(S)</label>\n <div *ngIf=\"\n dashboardForm?.selectedResponsibilityCenters?.length == 0\n \" class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('rcList', true)\" [class.error]=\"\n submitted &&\n dashboardForm?.selectedResponsibilityCenters?.length == 0 &&\n allProgamSelected?.length ==\n 0 &&\n dashboardForm?.selectedRiskCategories?.length == 0\n \">\n <div class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\">\n Select the Responsibility Center(s) that you would like<br />displayed\n in the Dashboard, if any.\n </div>\n </div>\n\n <div *ngIf=\"\n dashboardForm?.selectedResponsibilityCenters?.length > 0\n \" class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\">\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\" *ngFor=\"\n let rc of dashboardForm?.selectedResponsibilityCenters?.slice(\n 0,\n 1\n )\n \">\n <i class=\"icons cross vx-fs-12 vx-paragraph-txt vx-mr-1\" (click)=\"remove('rc', rc)\">&#xe9ae;</i>\n <span class=\"chipName vx-fs-11 vx-label-txt\" [arTooltip]=\"rc.item_name\" placement=\"bottom-left\"\n delay=\"0\" type=\"black\" [tooltipMandatory]=\"false\">{{ rc.item_name }}</span>\n <button *ngIf=\"\n dashboardForm?.selectedResponsibilityCenters?.length > 1\n \"\n class=\"countBtn vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\n appPopover (click)=\"rcList.popover()\" placement=\"left\">\n +{{\n dashboardForm?.selectedResponsibilityCenters?.slice(1)\n .length\n }}\n </button>\n\n <app-popover #rcList [dontCloseonClick]=\"true\">\n <div class=\"action-list\">\n <ul class=\"action-item\">\n <li *ngFor=\"\n let rc of dashboardForm?.selectedResponsibilityCenters\n | slice : 1;\n let j = index\n \">\n <div class=\"avatar-card\">\n <span class=\"value\" [arTooltip]=\"rc?.item_name\" placement=\"bottom-left\" delay=\"0\"\n type=\"black\" [tooltipMandatory]=\"false\">\n <i class=\"icons cross-icon\" (click)=\"remove('rc', rc)\">&#xe90d;</i>\n {{ rc?.item_name }}\n </span>\n </div>\n </li>\n </ul>\n </div>\n </app-popover>\n </div>\n\n <button *ngIf=\"activeSelector !== 'rcList'\"\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('rcList', true)\">\n <i class=\"icons vx-mr-1\">&#xe90c;</i> EDIT\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Program -->\n <div class=\"form-group-row\" [class.active]=\"activeSelector === 'responsibilityCategories'\" [class.disabled]=\"\n activeSelector &&\n activeSelector !== 'responsibilityCategories' &&\n activeSelector !== 'name'\n \">\n <div class=\"image\">\n <img *ngIf=\"\n allProgamSelected?.length ==\n 0 || activeSelector === 'responsibilityCategories'\n \" [ngSrc]=\"ASSETS.dashBoardProgramIcon\" alt=\"\" width=\"36\" height=\"36\" />\n <svg *ngIf=\"\n allProgamSelected?.length > 0 &&\n activeSelector !== 'responsibilityCategories'\n \" class=\"checkIcon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\n <label\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">PROGRAM</label>\n <div *ngIf=\"\n allProgamSelected?.length == 0\n \" class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('responsibilityCategories', true)\" [class.error]=\"\n submitted &&\n dashboardForm?.selectedResponsibilityCenters?.length == 0 &&\n allProgamSelected?.length ==\n 0 &&\n dashboardForm?.selectedRiskCategories?.length == 0\n \">\n <div class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\">\n Select the Program(s) that you would like displayed in\n the<br />Dashboard, if any.\n </div>\n </div>\n\n <div *ngIf=\"\n allProgamSelected?.length > 0\n \" class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\">\n <div class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\" *ngFor=\"\n let rCategory of allProgamSelected?.slice(\n 0,\n 1\n )\n \">\n <i class=\"icons cross vx-fs-12 vx-paragraph-txt vx-mr-1\"\n (click)=\"remove('responsibilityCategories', rCategory)\">&#xe9ae;</i>\n <span class=\"chipName vx-fs-11 vx-label-txt\" [arTooltip]=\"rCategory.item_name\"\n placement=\"bottom-left\" delay=\"0\" type=\"black\" [tooltipMandatory]=\"false\">{{ rCategory.name\n }}</span>\n <button *ngIf=\"\n allProgamSelected\n ?.length > 1\n \"\n class=\"countBtn vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\n appPopover (click)=\"rCategoryList.popover()\" placement=\"left\">\n +{{\n allProgamSelected?.slice(\n 1\n ).length\n }}\n </button>\n\n <app-popover #rCategoryList [dontCloseonClick]=\"true\">\n <div class=\"action-list\">\n <ul class=\"action-item\">\n <li *ngFor=\"\n let rCategory of allProgamSelected\n | slice : 1;\n let j = index\n \">\n <div class=\"avatar-card\">\n <span class=\"value\" [arTooltip]=\"rCategory?.name\" placement=\"bottom-left\" delay=\"0\"\n type=\"black\" [tooltipMandatory]=\"false\">\n <i class=\"icons cross-icon\" (click)=\"\n remove(\n 'responsibilityCategories',\n rCategory\n )\n \">&#xe90d;</i>\n {{ rCategory?.name }}\n </span>\n </div>\n </li>\n </ul>\n </div>\n </app-popover>\n </div>\n\n <button *ngIf=\"activeSelector !== 'responsibilityCategories'\"\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('responsibilityCategories', true)\">\n <i class=\"icons vx-mr-1\">&#xe90c;</i> EDIT\n </button>\n </div>\n </div>\n </div>\n </div>\n\n\n <!-- Timeframe -->\n <div class=\"form-group-row\" [class.disabled]=\"activeSelector && activeSelector !== 'name'\">\n <div class=\"image\">\n <img *ngIf=\"\n !dashboardForm?.selectedFromDate ||\n !dashboardForm?.selectedToDate\n \" [ngSrc]=\"ASSETS.dashBoardTimeFrameIcon\" alt=\"\" width=\"36\" height=\"36\" />\n <svg *ngIf=\"\n dashboardForm?.selectedFromDate &&\n dashboardForm?.selectedToDate\n \" class=\"checkIcon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 52 52\">\n <circle class=\"checkIcon__circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\" />\n <path class=\"checkIcon__check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\" />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block vx-mb-4\">\n <label\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\">TIMEFRAME</label>\n <label class=\"vx-control-panel-sub-label\">Select how long the selected information should be displayed.\n Once the selected timeframe expires, the dashboard will automatically be deactivated and no longer\n displayed to users. If no timeframe is selected, the information\n will be displayed permanently.</label>\n <div class=\"input-group vx-d-flex vx-justify-between\">\n <div class=\"date-select\">\n <i class=\"icons\">&#xe92d;</i>\n <input type=\"text\" id=\"from_date\" [value]=\"\n dashboardForm?.selectedFromDate | date : 'dd MMM yyyy'\n \" [placeholder]=\"'From'\" (click)=\"openFromDatePicker($event)\" readonly />\n <dp-date-picker #fromDatePicker [(ngModel)]=\"dashboardForm.selectedFromDate\"\n placeholder=\"Select Date\" (onSelect)=\"\n closeFromDatePicker(); datePickerOverlay = false\n \" [config]=\"fromDatePickerConfig\"></dp-date-picker>\n <div class=\"overlay\" (click)=\"closeFromDatePicker()\" *ngIf=\"datePickerOverlay\"></div>\n </div>\n <div class=\"date-select\" *ngIf=\"!hideToDate\" [class.disabled]=\"!dashboardForm?.selectedFromDate\">\n <i class=\"icons\">&#xe92d;</i>\n <input type=\"text\" id=\"to_date\" [value]=\"\n dashboardForm?.selectedToDate | date : 'dd MMM yyyy'\n \" [placeholder]=\"'To'\" (click)=\"openToDatePicker($event)\" readonly />\n <dp-date-picker #toDatePicker [(ngModel)]=\"dashboardForm.selectedToDate\" placeholder=\"Select Date\"\n (onSelect)=\"\n closeToDatePicker(); datePickerOverlay = false\n \" [config]=\"toDatePickerConfig\"></dp-date-picker>\n <div class=\"overlay\" (click)=\"closeToDatePicker()\" *ngIf=\"datePickerOverlay\"></div>\n </div>\n </div>\n <p class=\"vx-txt-error\" [appScrollInView]=\"true\" *ngIf=\"\n submitted &&\n dashboardForm.selectedFromDate &&\n !dashboardForm.selectedToDate\n \">\n Select a time-frame.\n </p>\n </div>\n </div>\n </div>\n\n <!-- Email Summary -->\n <!-- <div\n class=\"form-group-row\"\n [class.active]=\"activeSelector === 'frequency'\"\n [class.disabled]=\"\n activeSelector &&\n activeSelector !== 'frequency' &&\n activeSelector !== 'name'\n \"\n >\n <div class=\"image\">\n <img\n *ngIf=\"!dashboardForm.frequencyMessage\"\n [ngSrc]=\"ASSETS.dashBoardEmailSummariesIcon\"\n alt=\"\"\n width=\"36\"\n height=\"36\"\n />\n <svg\n *ngIf=\"dashboardForm.frequencyMessage\"\n class=\"checkIcon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 52 52\"\n >\n <circle\n class=\"checkIcon__circle\"\n cx=\"26\"\n cy=\"26\"\n r=\"25\"\n fill=\"none\"\n />\n <path\n class=\"checkIcon__check\"\n fill=\"none\"\n d=\"M14.1 27.2l7.1 7.2 16.7-16.8\"\n />\n </svg>\n </div>\n <div class=\"form\">\n <div class=\"vx-form-group vx-d-block\">\n <label\n class=\"vx-fs-11 vx-fw-500 vx-label-txt vx-d-block vx-tt-uppercase vx-mb-2 vx-w-100 vx-lh-4\"\n >Email Summaries</label\n >\n <label class=\"vx-control-panel-sub-label\"\n >If you would like to send a summary of this Dashboard, please\n select a frequency(By default VComply sends a weekly\n Summary).</label\n >\n <div\n *ngIf=\"!dashboardForm.frequencyMessage\"\n class=\"selectBoxEnable vx-pl-3 vx-pr-3 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('frequency', true)\"\n >\n <div\n class=\"selectBoxPlacehoder vx-fs-13 vx-paragraph-txt vx-lh-4\"\n >\n Email Summaries\n </div>\n </div>\n\n <div\n *ngIf=\"dashboardForm.frequencyMessage\"\n class=\"selectBoxSuccess vx-pl-2 vx-pr-3 vx-d-flex vx-align-center vx-justify-between\"\n >\n <div\n class=\"selectBoxText vx-fs-13 vx-paragraph-txt\"\n [arTooltip]=\"dashboardForm.frequencyMessage\"\n placement=\"bottom-left\"\n type=\"black\"\n delay=\"0\"\n [tooltipMandatory]=\"false\"\n [innerHTML]=\"dashboardForm.frequencyMessage\"\n ></div>\n\n <button\n *ngIf=\"\n dashboardForm.frequencyMessage &&\n activeSelector !== 'frequency'\n \"\n class=\"editBtn vx-fs-11 vx-fw-600 vx-txt-blue vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\n (click)=\"activateSelector('frequency', true)\"\n >\n <i class=\"icons vx-mr-1\">&#xe90c;</i> EDIT\n </button>\n </div>\n </div>\n </div>\n </div> -->\n </div>\n <div class=\"button-block\">\n <button class=\"vx-btn block primary\" [disabled]=\"activeSelector && activeSelector !== 'name'\"\n (click)=\"configureDashboard()\">\n Next: Configure Widgets\n </button>\n </div>\n </div>\n\n <button class=\"close-dialog\" type=\"button\" [disabled]=\"activeSelector && activeSelector !== 'name'\"\n (click)=\"close.emit({ mode: 'discard' })\" [arTooltip]=\"'[Esc] to close'\" placement=\"left\" type=\"black\" delay=\"0\"\n [tooltipMandatory]=\"true\" [class.hide]=\"activeSelector && activeSelector !== 'name'\">\n <i class=\"icons\">&#xe93f;</i>\n </button>\n <div class=\"global-confirmation-alert\" *ngIf=\"\n submitted &&\n dashboardForm?.selectedResponsibilityCenters?.length == 0 \n \">\n <div class=\"global-confirmation-alert-top\">\n <span class=\"icon-block\">\n <i class=\"icons\">&#xe930;</i>\n </span>\n <p class=\"text\" *ngIf=\"showRiskCategory\">\n Select a Responsibility Center or Risk Category.\n </p>\n <p class=\"text\" *ngIf=\"!showRiskCategory\">\n Select a Responsibility Center.\n </p>\n </div>\n <div class=\"global-confirmation-alert-bottom\">\n <p class=\"message\"></p>\n <div class=\"button-group\">\n <button class=\"fill\" type=\"button\" (click)=\"submitted = false\">\n OKAY\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<app-smiley-dialog *ngIf=\"isSmiley\" [message]=\"smileyMessage\"></app-smiley-dialog>\n\n<app-configure-widgets *ngIf=\"openConfigureWidgets\" [mode]=\"mode\" [displayedWidgets]=\"displayedWidgets\"\n [showRisk]=\"showRiskWidgets\" [showCompliance]=\"!showComplianceWidgets\" [selectedWidgetsData]=\"selectedWidgets\"\n (widgetsDataModified)=\"setSelectedWidgets($event)\"\n (closeConfigureWidgets)=\"closeConfigureWidgets($event)\"></app-configure-widgets>", styles: ["@import\"https://cdn.v-comply.com/design-system/css/mixin/mixin.css\";@import\"https://cdn.v-comply.com/design-system/css/color/color.css\";@import\"https://cdn.v-comply.com/design-system/css/icons/icons.css\";@import\"https://cdn.v-comply.com/design-system/css/display/display.css\";@import\"https://cdn.v-comply.com/design-system/css/dialog/dialog.css\";@import\"https://cdn.v-comply.com/design-system/css/button/button.css\";@import\"https://cdn.v-comply.com/design-system/css/text/text.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-top.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-right.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-left.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-top.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-right.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-left.css\";@import\"https://cdn.v-comply.com/design-system/css/alignment/alignment.css\";@import\"https://cdn.v-comply.com/design-system/css/width/width.css\";@import\"https://cdn.v-comply.com/design-system/css/animate/animation.css\";@import\"https://cdn.v-comply.com/design-system/css/animate/animate-slide-right.css\";::ng-deep .create-dashboard-container{width:100vw;background:#161b2fcc}::ng-deep .create-dashboard-container .vx-dialog-container{background-color:#fff;border:none;position:relative}@media screen and (max-width: 1280px){::ng-deep .create-dashboard-container .vx-dialog-container.tablet-width{width:28px!important}::ng-deep .create-dashboard-container .vx-dialog-container.tablet-width .form-group .vx-dialog-body-container{overflow:hidden}}::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog{display:flex;position:absolute;top:8px;right:8px;height:32px;width:32px;font-size:16px;color:#161b2f;cursor:pointer;background:transparent;border:none;border-radius:2px;z-index:2;align-items:center;justify-content:center}::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog:hover{background:#f1f1f1}::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog:disabled{pointer-events:none;filter:grayscale(1);opacity:.3}@media screen and (max-width: 1280px){::ng-deep .create-dashboard-container .vx-dialog-container button.close-dialog.hide{display:none}}::ng-deep .create-dashboard .more-option{width:calc(100% - 500px);border-right:1px solid #f1f1f1;float:left}@media screen and (max-width: 1280px){::ng-deep .create-dashboard .more-option{width:calc(100vw - 28px)}::ng-deep .create-dashboard .more-option app-user-list .user-list{right:28px}::ng-deep .create-dashboard .more-option app-responsibility-center .responsibility-center{right:28px}::ng-deep .create-dashboard .more-option app-categories .category-list{right:28px}::ng-deep .create-dashboard .more-option app-risk-categories .risk-category-list{right:28px}::ng-deep .create-dashboard .more-option app-frequency .create-frequency{right:28px}}::ng-deep .form-group{position:relative}::ng-deep .form-group .vx-dialog-body-container{padding:36px 28px 0 40px!important;height:calc(100vh - 50px);overflow:auto;margin-left:-22px;background-color:transparent;position:relative;border-radius:0 0 0 30px;background:transparent}@-moz-document url-prefix(){::ng-deep .form-group .vx-dialog-body-container.hidden-scroll{overflow:hidden}}::ng-deep .form-group .vx-dialog-body-container .form-group-row{display:flex}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image{width:36px;min-width:36px;height:36px;margin-left:-36px;margin-right:20px;margin-top:28px;display:flex;align-items:center;justify-content:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image img{width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image .checkIcon{width:32px;height:32px;background:#fff;border-radius:50%;stroke-width:4;stroke:#34aa44;stroke-miterlimit:10;box-shadow:inset 0 0 #34aa44;animation:fillCheck .4s ease-in-out .4s forwards,scale .3s ease-in-out .9s both;margin-top:0}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image .checkIcon__circle{stroke-dasharray:166;stroke-dashoffset:166;stroke-width:2;stroke-miterlimit:10;stroke:#34aa44;fill:none;animation:strokeCheck .6s cubic-bezier(.65,0,.45,1) forwards}::ng-deep .form-group .vx-dialog-body-container .form-group-row .image .checkIcon__check{transform-origin:50% 50%;stroke-dasharray:48;stroke-dashoffset:48;animation:strokeCheck .3s cubic-bezier(.65,0,.45,1) .8s forwards}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form{width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group{position:relative}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input{height:40px;border-radius:4px;border:1px solid #dbdbdb;outline:none;transition:all .2s ease-in-out}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input::placeholder{color:#747576}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input+marx-editor,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input+vcomply-editor{margin-top:8px;display:block}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input:hover{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group input:focus{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selectbox:after{border-left:none;border-bottom:1px solid #707070;border-right:1px solid #707070;border-top:none;content:\"\";display:inline-block;right:15px;position:absolute;top:calc(50% + 8px);width:5px;height:5px;transform:rotate(45deg)}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selectbox:hover .custom-input{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected{height:40px;border-radius:4px;border:1px solid #f1f1f1;background:#fbfbfb;outline:none;position:relative;transition:all .2s ease-in-out}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .edit{border:1px solid #f1f1f1;border-radius:2px;background:#fff;outline:none;cursor:pointer;height:24px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .left{width:auto;display:flex}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .left.frequency-left{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block;width:calc(100% - 70px)}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container{width:auto}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container .chip{border-radius:2px;box-shadow:0 0 3px #1e5dd31a;height:24px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:24px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container .chip i{cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container .chip .value{max-width:100px;display:block;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .chip-container span.chip+span.chip{margin-left:4px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .count{border-radius:2px;height:24px;padding:2px 8px;border:1px solid #1e5dd3;cursor:pointer;outline:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container{display:flex;width:calc(100% - 60px);align-items:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner{background:#fff;border-radius:2px;box-shadow:0 2px 4px #1e5dd31a;line-height:24px;padding:0 4px 0 8px;display:flex;align-items:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner .chip{background:transparent;border-radius:0;box-shadow:none;height:auto;line-height:unset;padding:0;color:#747576;max-width:300px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner button.count{background:#1e5dd3;border-radius:20px;color:#fff;height:16px;padding:0 6px;border:none;font-size:9px;line-height:16px;margin-left:4px;min-width:20px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .selected .user-group-chip-container .chip-inner button.count.user{background:#34aa44}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group{display:flex;position:relative}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group input::placeholder{color:#747576}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group span.counter{background:transparent;color:#161b2f;font-size:9px;font-weight:500;position:absolute;top:0;right:0;border-radius:3px;height:16px;text-align:center;line-height:16px;padding:0 2px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group marx-editor,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group vcomply-editor{width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group marx-editor .editor-container .editable-block.bottom:before,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group vcomply-editor .editor-container .editable-block.bottom:before{opacity:1}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-form-group .vx-input-group.vx-input-group{margin-top:8px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor{display:block}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container{border-radius:4px;border-color:#dbdbdb}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:focus-within,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:focus-within,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:hover,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:hover{border-color:#1e5dd3}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:focus-within .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:focus-within .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container:hover .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container:hover .editor-tools{border-top-color:#1e5dd3!important;transition:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editable-block,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editable-block{min-height:60px;padding:11px 15px;line-height:20px;font-size:13px;color:#747576;font-weight:400;transition:all .2s ease-in-out;width:100%;max-height:90px}@media not all and (min-resolution: .001dpcm){@supports (-webkit-appearance: none){::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editable-block:before,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editable-block:before{opacity:.72}}}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools{border-color:#dbdbdb;border-radius:0 0 2px 2px;transition:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button{height:22px!important;width:22px!important;padding:0 5px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button svg,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button svg{height:22px;width:12px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button.submit,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col button.submit{width:80px!important;line-height:22px;justify-content:center}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form marx-editor .editor-container .editor-tools app-editor-menu .editor-menu .col .popover.small ul.option-list li button,::ng-deep .form-group .vx-dialog-body-container .form-group-row .form vcomply-editor .editor-container .editor-tools app-editor-menu .editor-menu .col .popover.small ul.option-list li button{width:100%!important;height:auto!important}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .custom-input{height:2.5rem;border-radius:.25rem;border:1px solid #dbdbdb;background:#fff;outline:none;padding:.1875rem .75rem;line-height:1.25rem;font-size:13px;color:#747576;font-weight:400;transition:all .2s ease-in-out;width:100%;cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .custom-input:empty:not(:focus):before{content:attr(aria-placeholder);line-height:16px;font-size:12px;width:94%;display:block;pointer-events:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .custom-input.error{border:1px solid #d93b41}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form label.vx-control-panel i{font-size:12px;color:#1e5dd3;margin-left:7px;cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-control-panel-sub-label{color:#747576;font-size:.6875rem;font-weight:400;line-height:1rem;margin-bottom:.5rem;display:block;text-transform:none;width:100%;margin-top:0}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .vx-control-panel-sub-label span.required{color:#eb2424}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form label.vx-control-panel+.vx-control-panel-sub-label{margin-top:-.5rem}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio{margin-top:4px;display:block;width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item{width:100%;position:relative}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item span.radio{position:absolute;top:17px;left:12px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item span.value{font-size:11px;text-transform:uppercase;border:1px solid #dbdbdb;border-radius:4px;padding:8px 8px 8px 36px;width:100%;display:flex;justify-content:space-between;margin:0;max-width:100%;font-weight:500;color:#707070}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item span.value i{font-size:12px;color:#1e5dd3}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item svg{position:absolute;top:17px;left:12px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio label.radio-item input:checked~span.value{background:#eefcf0;border-color:#34aa44}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .radio-group app-cs-radio+app-cs-radio{margin-top:.5rem}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select{position:relative;width:calc(50% - .25rem);overflow:hidden;height:40px}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select input{position:relative;z-index:1;padding-left:36px!important;padding:8px 12px;line-height:20px;font-size:13px;color:#747576;font-weight:400;width:100%;cursor:pointer}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select input::placeholder{color:#747576}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select dp-date-picker{position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;pointer-events:none;z-index:0}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select i{display:flex;justify-content:center;align-items:center;height:39px;width:14px;position:absolute;left:12px;top:0;color:#bcbcbc;font-size:14px;pointer-events:none;z-index:2}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select.disabled{pointer-events:none;filter:grayscale(1);opacity:1}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form .date-select.disabled input{background:#f1f1f1}::ng-deep .form-group .vx-dialog-body-container .form-group-row .form label.vx-control-panel span.sub-label{color:#747576;font-size:.6875rem;font-weight:400;line-height:1rem;text-transform:none;width:100%}::ng-deep .form-group .vx-dialog-body-container .form-group-row.disabled{pointer-events:none;filter:grayscale(1);opacity:.3}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active{pointer-events:none;filter:grayscale(0);opacity:1}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .image{filter:grayscale(0)}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .image:before{display:none}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .form{opacity:1;filter:grayscale(0)}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .form .custom-input,::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .form input[type=text]{border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd345}::ng-deep .form-group .vx-dialog-body-container .form-group-row.active .selectBoxEnable{border-color:#1e5dd3;box-shadow:0 3px 6px #1e5dd31a;pointer-events:none}::ng-deep .form-group .vx-dialog-body-container:after{content:\"\";width:100%;display:block;height:30px;position:sticky;right:0;bottom:0;left:0;z-index:6;background:linear-gradient(to bottom,#fff0,#ffffffbf 22%,#fff);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=\"#00ffffff\",endColorstr=\"#ffffff\",GradientType=0)}::ng-deep .form-group .button-block{position:relative;z-index:2}::ng-deep .form-group .button-block button{font-size:13px!important;letter-spacing:1.3px!important;height:50px;line-height:48px!important}::ng-deep .form-group .button-block button:disabled{background:#f1f1f1!important;border-color:#f1f1f1!important;color:#747576!important;opacity:1!important;filter:unset!important}::ng-deep .form-group.disabled{pointer-events:none;z-index:2}::ng-deep .form-group.disabled .image{position:relative;filter:grayscale(1)}::ng-deep .form-group.disabled .image:before{content:\"\";position:absolute;inset:0;background:#fff;opacity:.7}::ng-deep .form-group.disabled .form{opacity:.3;filter:grayscale(1)}@keyframes strokeCheck{to{stroke-dashoffset:0}}@keyframes fillCheck{to{box-shadow:inset 0 0 0 2px #34aa44}}.action-list{width:220px}.action-list ul{padding:0;margin:0;animation:scale-up-center .2s cubic-bezier(.39,.575,.565,1) both;background:#fff;box-shadow:0 3px 6px #1c5bd140;border-radius:4px;max-height:220px;overflow:auto}.action-list ul.action-item{display:block}.action-list ul.action-item li{list-style:none;border:none;border-bottom:1px solid #f1f1f1;display:block;width:100%;padding:0;background:transparent;border-radius:0;margin:0;height:auto;justify-content:flex-start;box-shadow:none}.action-list ul.action-item li button{color:#6e717e;text-align:left;text-decoration:none;cursor:pointer;background:transparent;font-size:12px;text-transform:capitalize;display:flex;width:100%;padding:7.5px 11px;border:none}.action-list ul.action-item li button i{font-size:17px;margin-right:10px;color:#1c5bd1}.action-list ul.action-item li button:hover{background:#f3f3f3}.action-list ul.action-item li .avatar-card{display:flex;align-items:center;width:100%;padding:7.5px}.action-list ul.action-item li .avatar-card.within-con{display:block}.action-list ul.action-item li .avatar-card .avatar{height:24px;width:24px!important;overflow:hidden;background:#4681ef;color:#fff;font-size:10px;display:inline-flex;margin-right:5px;border-radius:50%;align-items:center;justify-content:center;text-transform:uppercase}.action-list ul.action-item li .avatar-card .avatar img{width:100%}.action-list ul.action-item li .avatar-card .avatar+span.value{width:calc(100% - 29px)}.action-list ul.action-item li .avatar-card span.value{width:100%;color:#6e717e;text-decoration:none;background:transparent;font-size:12px;text-transform:capitalize;display:block;font-weight:400;text-align-last:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:20px}.action-list ul.action-item li .avatar-card span.value i{font-size:8px;color:#1c5bd1;cursor:pointer;margin-right:4px}.action-list ul.action-item li .avatar-card span.value i.cross-icon{color:#747576}.action-list ul.action-item li .avatar-card.no-image{display:block}.action-list ul.action-item li .avatar-card.no-image span.value{width:100%;display:block}.action-list ul.action-item li .chip-item{color:#1e5dd3;padding:10px;display:flex;align-items:center}.action-list ul.action-item li .chip-item i{margin-right:7px;font-size:10px;cursor:pointer;display:inline-flex}.action-list ul.action-item li .chip-item span{display:block;width:auto;max-width:calc(100% - 17px);font-size:12px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.action-list ul.action-item li .chip-item span.chip-block{display:block;width:100%}.action-list ul.action-item li .chip-item span.id{font-size:9px}.action-list ul.action-item li .within{display:flex;align-items:center;justify-content:flex-start}.action-list ul.action-item li .within .block{background:#f1f1f1;border-radius:2px;padding:0 2px;line-height:14px;font-size:9px;font-weight:500;color:#042e7d;margin-right:6px;display:block;text-transform:uppercase}.action-list ul.action-item li .within .data{width:100%;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#747576;font-size:11px;font-weight:400;line-height:17px}.action-list ul.action-item li:first-child{animation:action-list-open .25s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(2){animation:action-list-open .35s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(3){animation:action-list-open .45s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(4){animation:action-list-open .55s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(5){animation:action-list-open .65s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(6){animation:action-list-open .75s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(7){animation:action-list-open .85s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(8){animation:action-list-open .95s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(9){animation:action-list-open 1.05s cubic-bezier(.25,.46,.45,.94) both}.action-list ul.action-item li:nth-child(10){animation:action-list-open 1.15s cubic-bezier(.25,.46,.45,.94) both}.global-confirmation-alert{display:block;position:absolute;z-index:9;right:0;bottom:0;left:0;background:#d93b41}.global-confirmation-alert-top{display:flex;align-items:center;justify-content:flex-start;padding:20px 20px 12px}.global-confirmation-alert span.icon-block{height:36px;width:36px;border-radius:50%;background:#fff;border:1px solid #dcdcdc;display:flex;justify-content:center;align-items:center;margin-right:16px}.global-confirmation-alert span.icon-block i{color:#d93b41;font-size:12px}.global-confirmation-alert p.text{color:#fff;font-size:14px;font-weight:300;margin:0;width:calc(100% - 52px)}.global-confirmation-alert-bottom{display:flex;align-items:center;padding:0 12px 12px 72px;background:#d93b41}.global-confirmation-alert-bottom .button-group{display:flex}.global-confirmation-alert-bottom p.message{font-size:14px;font-weight:500;margin:0;line-height:20px;color:#fff}.global-confirmation-alert button{height:24px;width:64px;border:1px solid #000;border-radius:2px;display:flex;align-items:center;justify-content:center;line-height:22px;cursor:pointer;font-size:11px;text-transform:uppercase;font-weight:500;padding:0}.global-confirmation-alert button+button{margin-left:4px}.global-confirmation-alert button.fill{background:#fff;color:#1e5dd3;border-color:#fff}.global-confirmation-alert button.outline{background:transparent;color:#fff;border-color:#fff}::ng-deep marx-modal .popup-modal-background,::ng-deep vcomply-modal .popup-modal-background{background-color:#161b2fcc!important}::ng-deep input.textField{background:#fff;border-radius:.25rem;border:1px solid #dbdbdb;font-size:13px;color:#747576;padding:8px 12px;position:relative;height:2.5rem;width:100%;transition:all .2s ease-in-out}::ng-deep input.textField::placeholder{font-size:13px;color:#747576}::ng-deep input.textField:hover,::ng-deep input.textField:focus{outline:none;border-color:#1e5dd3;box-shadow:0 3px 6px #1e5dd31a}::ng-deep .selectBoxEnable{background:#fff;border-radius:.25rem;border:1px solid #dbdbdb;cursor:pointer;height:2.5rem;position:relative;transition:all .2s ease-in-out}::ng-deep .selectBoxEnable:after{border-bottom-style:solid;border-bottom-width:1px;border-right-style:solid;border-right-width:1px;border-color:#747576;content:\"\";display:inline-block;right:12px;position:absolute;top:calc(50% - 4px);width:5px;height:5px;transform:rotate(45deg)}::ng-deep .selectBoxEnable:hover,::ng-deep .selectBoxEnable:focus{border-color:#1e5dd3;box-shadow:0 3px 6px #1e5dd31a}::ng-deep .selectBoxEnable.disabled{background:#f1f1f1;pointer-events:none;opacity:1}::ng-deep .selectBoxEnable.error{border-color:#eb2424}::ng-deep .selectBoxSuccess{background:#f8f8f8;border-radius:.25rem;border:1px solid #f1f1f1;min-height:2.5rem;position:relative}::ng-deep .selectBoxSuccess .selectBoxText{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;width:22rem}::ng-deep .selectBoxSuccess button{background:transparent;border-radius:0;border:none}::ng-deep .selectBoxSuccess button.deleteBtn{color:#d93b41}::ng-deep .selectBoxSuccess .level-left{border-right:1px solid #f1f1f1;height:2.375rem;width:5rem}::ng-deep .selectBoxSuccess .level-left .level-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;width:4.5rem}::ng-deep .chipContainer{background:#fff;border-radius:.125rem;box-shadow:0 0 2px #1e5dd340;height:1.5rem}::ng-deep .chipContainer .cross{cursor:pointer;min-width:16px;width:16px;height:16px;display:flex;align-items:center;justify-content:center;background:transparent;border-radius:2px;margin-left:-4px}::ng-deep .chipContainer .cross:hover{background:#f1f1f1}::ng-deep .chipContainer .chipName{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;max-width:6rem}::ng-deep .chipContainer .chipName.no-width{max-width:unset}::ng-deep .chipContainer button.countBtn{background:#1e5dd3;border-radius:1.25rem;border:none;min-width:1.5rem;height:1rem;margin:0 0 0 .5rem;padding:0 .25rem}::ng-deep .chipContainer button.countBtn.greenBg{background:#34aa44}::ng-deep .cdk-overlay-pane{inset:0!important;align-items:center;justify-content:center}::ng-deep .cdk-overlay-pane .dp-popup{z-index:999;display:flex!important;align-items:center;justify-content:center;width:100vw;height:100vh;background:transparent!important;border:none!important;box-shadow:unset!important}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar{width:412px!important;box-shadow:0 0 20px #161b2f26;background-color:#fff;border-radius:4px;animation:scale-up-center .2s cubic-bezier(.39,.575,.565,1) both}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar{width:100%;pointer-events:auto}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button{background:transparent;border:none;outline:none}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-left,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-left,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-right,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-right{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:50%;font-size:14px}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-left:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-left:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-calendar-nav-right:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-calendar-nav-right:hover{background-color:#f3f3f3}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn{display:none}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar button.dp-current-location-btn:before,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar button.dp-current-location-btn:before{content:\"\";height:10px;width:10px;border-radius:50%;background:#000;display:inline-flex}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week{display:flex;justify-content:space-around}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays .dp-calendar-weekday,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays .dp-calendar-weekday,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week .dp-calendar-weekday,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week .dp-calendar-weekday{width:52px;border-left:none;border-bottom-color:#fff;color:#747576;font-size:11px;font-weight:600;text-transform:uppercase}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button{width:40px;height:40px;border-radius:50%;display:inline-flex;justify-content:center;align-items:center}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button:hover,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button:hover{background-color:#f3f3f3}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button.dp-selected,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button.dp-selected,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button.dp-selected,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button.dp-selected{background:#1e5dd3}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-weekdays button.dp-current-day,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-weekdays button.dp-current-day,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-week button.dp-current-day,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-week button.dp-current-day{border:1px solid rgba(0,0,0,.38);color:#1e5dd3;background-color:#fff}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-day-calendar-container,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-day-calendar-container{padding:20px;border-radius:2px}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-nav-container,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-nav-container{display:flex;margin:0 0 20px;border:none}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-nav-container .dp-nav-header button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-nav-container .dp-nav-header button{color:#000;font-size:17px;font-weight:500;margin:0 0 0 12px;padding:0}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-nav-btns-container,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-nav-btns-container{width:80px;display:flex}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-nav-btns-container .dp-calendar-nav-container-left button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-nav-btns-container .dp-calendar-nav-container-left button,::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-nav-btns-container .dp-calendar-nav-container-right button,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-nav-btns-container .dp-calendar-nav-container-right button{margin:0!important}::ng-deep .cdk-overlay-pane .dp-popup dp-day-calendar .dp-calendar-wrapper,::ng-deep .cdk-overlay-pane .dp-popup dp-month-calendar .dp-calendar-wrapper{border:none}.left-side{color:#707070}.right-side button{border-radius:2px;height:24px;background:#1e5dd3!important;display:flex;justify-content:center;align-items:center;cursor:pointer;color:#fff!important;text-transform:uppercase;font-size:11px;font-weight:500;border:none!important;padding:0 8px;margin:0 0 0 8px}.right-side button i{margin-left:8px;font-size:11px}.right-side button:disabled{background:#f1f1f1!important;color:#747576!important;opacity:1}.right-side button.cancelBtn{background:transparent!important;color:#eb2424!important}.selected-count-box{background:#1e5dd3;border-radius:1.25rem;border:none;min-width:1.5rem;height:1rem;margin:0 0 0 .5rem;padding:0 .25rem;position:relative}.selected-text{color:#707070;font-size:11px;font-weight:500;position:fixed;padding-left:2.5rem}::ng-deep .vc-divider{border-top:.5px solid #dbdbdb;width:100%}::ng-deep .vc-cf-container{border-bottom:1px solid #E3E3E9}::ng-deep .vc-cf-container:first-of-type,::ng-deep .vc-cf-container:only-child{border-top:1px solid #E3E3E9}::ng-deep .vc-cf-container .cf-name{width:9.25rem}::ng-deep .vc-cf-container .cf-value{width:calc(100% - 9.75rem)}::ng-deep .vc-cf-container .cf-value input{height:24px!important;border:1px solid #CDCED6!important;padding:0 .5rem!important;color:#565a6f!important;font-size:11px!important}::ng-deep .vc-cf-container .cf-value input::placeholder{color:#a9aab6!important}::ng-deep .vc-cf-container .cf-value input:hover{border-color:#343952!important}::ng-deep .vc-cf-container .cf-value input:focus{outline:none;border-color:#1e5dd3;box-shadow:0 0 5px #1e5dd31a}.head-label{background:#565a6f;border-radius:.125rem;height:1rem;position:relative}.head-label:before{background:#e3e3e9;content:\"\";position:absolute;top:7px;left:-40px;width:500px;height:1px;z-index:-1}\n"] }]
1574
- }], ctorParameters: function () { return [{ type: i1.CreateDashboardService }, { type: i2.PaginationService }, { type: i0.ChangeDetectorRef }, { type: i3.SnackBarService }, { type: i4.PopoverService }, { type: i5.TextCountPipe }]; }, propDecorators: { feature: [{
1575
- type: Input
1576
- }], mode: [{
1577
- type: Input
1578
- }], dashboardId: [{
1579
- type: Input
1580
- }], dashboardDetails: [{
1581
- type: Input
1582
- }], close: [{
1583
- type: Output
1584
- }], createdBy: [{
1585
- type: Input
1586
- }], fromDatePicker: [{
1587
- type: ViewChild,
1588
- args: ['fromDatePicker']
1589
- }], toDatePicker: [{
1590
- type: ViewChild,
1591
- args: ['toDatePicker']
1592
- }], configureWidget: [{
1593
- type: Input
1594
- }], onKeydownHandler: [{
1595
- type: HostListener,
1596
- args: ['document:keydown.escape', ['$event']]
1597
- }], documentClick: [{
1598
- type: HostListener,
1599
- args: ['document:click', ['$event']]
1600
- }] } });
1601
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWRhc2hib2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jcmVhdGUtZGFzaGJvYXJkL3NyYy9saWIvY3JlYXRlLWRhc2hib2FyZC1jb250YWluZXIvY3JlYXRlLWRhc2hib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jcmVhdGUtZGFzaGJvYXJkL3NyYy9saWIvY3JlYXRlLWRhc2hib2FyZC1jb250YWluZXIvY3JlYXRlLWRhc2hib2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFTdkIsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxRQUFRLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDNUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTNELE9BQU8sRUFDTCxzQ0FBc0MsRUFDdEMsK0JBQStCLEVBQy9CLDhCQUE4QixFQUM5Qix5QkFBeUIsRUFDekIsbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQixvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIsMEJBQTBCLEVBQzFCLDRCQUE0QixFQUM1QixxQkFBcUIsR0FDdEIsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUXRDLE1B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ckIsQ0FBQyxhQUFhLENBQUM7b1FBR2pCLE9BQU87c0JBQWYsS0FBSztnQkFHRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBS0ksS0FBSztzQkFBZCxNQUFNO2dCQUNFLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ3VCLGNBQWM7c0JBQTFDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNBLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFFaEIsZUFBZTtzQkFBdkIsS0FBSztnQkFxTCtDLGdCQUFnQjtzQkFBcEUsWUFBWTt1QkFBQyx5QkFBeUIsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFvcERuRCxhQUFhO3NCQURaLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFZGl0b3JDb25maWcgfSBmcm9tICdAdmNvbXBseS9lZGl0b3InO1xuaW1wb3J0IHsgRGF0ZVBpY2tlckNvbXBvbmVudCwgSURhdGVQaWNrZXJDb25maWcgfSBmcm9tICduZzItZGF0ZS1waWNrZXInO1xuaW1wb3J0IHsgQ3JlYXRlRGFzaGJvYXJkU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvY3JlYXRlLWRhc2hib2FyZC5zZXJ2aWNlJztcbmltcG9ydCB7IFBhZ2luYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9wYWdpbmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlckxpc3RDb25maWd1cmF0aW9uIH0gZnJvbSAnLi91c2VyLWxpc3QvdXNlci1saXN0LmNvbmZpZyc7XG5pbXBvcnQgeyBDcmVhdGVEYXNoYm9hcmRGb3JtIH0gZnJvbSAnLi9jcmVhdGUtZGFzaGJvYXJkLWNvbmZpZyc7XG5pbXBvcnQgeyBTbmFja0JhclNlcnZpY2UgfSBmcm9tICcuLi91aS1raXQvc25hY2stYmFyL3NuYWNrLWJhci5zZXJ2aWNlJztcblxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUG9wb3ZlclNlcnZpY2UgfSBmcm9tICcuLi91aS1raXQvcG9wb3Zlci9wb3BvdmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGV4dENvdW50UGlwZSB9IGZyb20gJy4vcGlwZXMvdGV4dC1jb3VudC5waXBlJztcbmltcG9ydCB7IEFTU0VUUyB9IGZyb20gJy4vY29uc3RhbnRzL2Fzc2V0cy5jb25zdGFudCc7XG5pbXBvcnQgeyBQUk9HUkFNX0xJU1RfQVBJIH0gZnJvbSAnLi9wcm9ncmFtLWxpc3QvY29uc3RhbnQnO1xuaW1wb3J0IHsgTGlzdEl0ZW0gfSBmcm9tICcuL3Byb2dyYW0tbGlzdC9pbnRlcmZhY2VzL2xpc3QtaXRlbS5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgYnVpbGRQcm9ncmFtU2VsZWN0aW9uTWFwRnJvbUNhdGVnb3JpZXMsXG4gIGV4dHJhY3RDYXRlZ29yeUlkc0Zyb21EYXNoYm9hcmQsXG4gIGV4dHJhY3RQcm9ncmFtSWRzRnJvbURhc2hib2FyZCxcbiAgZXh0cmFjdFJjSWRzRnJvbURhc2hib2FyZCxcbiAgZmlsdGVyQWN0aXZlV2lkZ2V0cyxcbiAgZmxhdHRlblByb2dyYW1TZWxlY3Rpb25NYXAsXG4gIGdldEVkaXREYXNoYm9hcmRDZGlkLFxuICBnZXRTZWxlY3RlZFByb2dyYW1zTWFwLFxuICBoYXNQcm9ncmFtU2VsZWN0aW9uSW5NYXAsXG4gIG5vcm1hbGl6ZUlkQXJyYXksXG4gIG5vcm1hbGl6ZVByb2dyYW1DYXRlZ29yaWVzLFxuICBub3JtYWxpemVQcm9ncmFtU2VsZWN0aW9uTWFwLFxuICBwYXJzZVNhaWxzUHJvZ3JhbUxpc3QsXG59IGZyb20gJy4vdXRpbHMvZGFzaGJvYXJkLWVkaXQudXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtY3JlYXRlLWRhc2hib2FyZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jcmVhdGUtZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY3JlYXRlLWRhc2hib2FyZC5jb21wb25lbnQubGVzcyddLFxuICBwcm92aWRlcnM6IFtUZXh0Q291bnRQaXBlXSxcbn0pXG5leHBvcnQgY2xhc3MgQ3JlYXRlRGFzaGJvYXJkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBmZWF0dXJlOiBhbnk7XG4gIGFjdGl2ZVNlbGVjdG9yID0gJyc7XG4gIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1vZGUgPSAnQ1JFQVRFJztcbiAgQElucHV0KCkgZGFzaGJvYXJkSWQgPSAnJztcbiAgQElucHV0KCkgZGFzaGJvYXJkRGV0YWlsczogYW55ID0gbnVsbDsgLy8gZm9yIGVkaXQgZGFzaGJvYXJkXG4gIC8qKiBBUEkgZGFzaGJvYXJkIG9iamVjdCBmcm9tIGNyZWF0ZURhc2hib2FyZCByZXNwb25zZSAodXNlZCB3aGVuIG5hdmlnYXRpbmcgYWZ0ZXIgY3JlYXRlKS4gKi9cbiAgcHJpdmF0ZSBjcmVhdGVkRGFzaGJvYXJkOiBhbnkgPSBudWxsO1xuICAvKiogVHJ1ZSBhZnRlciBDUkVBVEUgQVBJIHN1Y2NlZWRzOyB3aWRnZXQgc2F2ZSBzaG91bGQgZW1pdCBgY3JlYXRlZGAgZm9yIGFwcCByZWRpcmVjdC4gKi9cbiAgcHJpdmF0ZSByZWRpcmVjdEFmdGVyQ3JlYXRlID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQElucHV0KCkgY3JlYXRlZEJ5ID0gMDtcbiAgQFZpZXdDaGlsZCgnZnJvbURhdGVQaWNrZXInKSBmcm9tRGF0ZVBpY2tlciE6IERhdGVQaWNrZXJDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3RvRGF0ZVBpY2tlcicpIHRvRGF0ZVBpY2tlciE6IERhdGVQaWNrZXJDb21wb25lbnQ7XG4gIGFuaW1hdGlvbiA9IHRydWU7XG4gIEBJbnB1dCgpIGNvbmZpZ3VyZVdpZGdldCA9IGZhbHNlO1xuICBBU1NFVFM6IGFueSA9IEFTU0VUUztcblxuICB0b3RhbFBhZ2VzID0gMTtcbiAgdG90YWxMaXN0ID0gMTtcbiAgdXNlcnNMaXN0OiBhbnlbXSA9IFtdO1xuICB2TG9hZGVyID0gdHJ1ZTtcbiAgdXNlckxpc3RMb2FkZWQgPSBmYWxzZTtcbiAgZ3JvdXBMaXN0TG9hZGVkID0gZmFsc2U7XG4gIHJjTGlzdExvYWRlZCA9IGZhbHNlO1xuICBoaWRlVG9EYXRlID0gZmFsc2U7XG4gIGxpc3REZXRhaWxzOiBVc2VyTGlzdENvbmZpZ3VyYXRpb24gPSB7XG4gICAgc2VsZWN0ZWRVc2Vyc0xpc3Q6IFtdLFxuICAgIHNlbGVjdGVkR3JvdXBMaXN0OiBbXSxcbiAgICBub25SZW1vdmFibGVVc2Vyc0xpc3Q6IFtdLFxuICAgIGRpc3BsYXlFbGVtZW50S2V5OiAnbWVtYmVyX25hbWUnLFxuICAgIGRpc3BsYXlHcm91cEtleTogJ2dyb3VwX25hbWUnLFxuICAgIGdyb3VwSWRrZXk6ICdncm91cF9pZCcsXG4gICAgZWxlbWVudElkS2V5OiAnbWVtYmVyX2lkJyxcbiAgICB0b29sdGlwS2V5OiAnbWVtYmVyX2VtYWlsJyxcbiAgfTtcbiAgZGFzaGJvYXJkRGVzY3JpcHRpb246IEVkaXRvckNvbmZpZyA9IHtcbiAgICBwbGFjZWhvbGRlcjogJ0Rlc2NyaXB0aW9uIChNYXggbGltaXQ6IDI1MCBjaGFyYWN0ZXJzKScsXG4gICAgbW9kZTogJ3ByaW1lJyxcbiAgICBpZDogJ2Rlc2NyaXB0aW9uJyxcbiAgfTtcbiAgcmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzVHJlZTogYW55ID0ge1xuICAgIHJlZ3VsYXRpb25zOiB7XG4gICAgICBsaXN0OiBbXSxcbiAgICAgIHNlbGVjdGVkTGlzdDogW10sXG4gICAgfSxcbiAgICBzdGFuZGFyZHM6IHtcbiAgICAgIGxpc3Q6IFtdLFxuICAgICAgc2VsZWN0ZWRMaXN0OiBbXSxcbiAgICB9LFxuICAgIGludGVybmFsQ29udHJvbHM6IHtcbiAgICAgIGxpc3Q6IFtdLFxuICAgICAgc2VsZWN0ZWRMaXN0OiBbXSxcbiAgICB9LFxuICAgIG90aGVyczoge1xuICAgICAgbGlzdDogW10sXG4gICAgICBzZWxlY3RlZExpc3Q6IFtdLFxuICAgIH0sXG4gIH07XG4gIGFsbENvbXBsaWFuY2VDYXRlZ29yaWVzOiBhbnlbXSA9IFtdO1xuICBhbGxSaXNrQ2F0ZWdvcmllczogYW55W10gPSBbXTtcbiAgc2hvd1Jpc2tDYXRlZ29yeSA9IGZhbHNlO1xuICBzaG93Q3JpdGVyaWEgPSB0cnVlO1xuXG4gIGRhc2hib2FyZEZvcm06IENyZWF0ZURhc2hib2FyZEZvcm0gPSB7XG4gICAgZGFzaGJvYXJkTmFtZTogJycsXG4gICAgZGFzaGJvYXJkRGVzY3JpcHRpb25UZXh0OiAnJyxcbiAgICBzZWxlY3RlZFZpZXdlcnM6IFtdLFxuICAgIHNlbGVjdGVkR3JvdXA6IFtdLFxuICAgIHNlbGVjdGVkRnJvbURhdGU6IHVuZGVmaW5lZCxcbiAgICBzZWxlY3RlZFRvRGF0ZTogdW5kZWZpbmVkLFxuICAgIHNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzOiBbXSxcbiAgICBzZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllczogW10sXG4gICAgc2VsZWN0ZWRSaXNrQ2F0ZWdvcmllczogW10sXG4gICAgZGlzcGxheUNyaXRlcmlhOiAnb3InLFxuICAgIGNvbmZpZ3VyZVdpZGdldDogW10sXG4gICAgZnJlcXVlbmN5RGV0YWlsczogJycsXG4gICAgc2VsZWN0ZWRGcmVxdWVuY3lUeXBlOiAnJyxcbiAgICBzZWxlY3RlZEZyZXF1ZW5jaWVzOiBbMF0sXG4gICAgZnJlcXVlbmN5TWVzc2FnZTogJycsXG4gICAgZnJlcXVlbmN5RGF0ZTogMSxcbiAgfTtcblxuICBvcGVuQ29uZmlndXJlV2lkZ2V0cyA9IGZhbHNlO1xuICBzZWxlY3RlZFdpZGdldHM6IGFueSA9IFtdO1xuICBkaXNwbGF5ZWRXaWRnZXRzOiBhbnkgPSBbXTtcblxuICByZXNwb25zaWJpbGl0eUNlbnRlcnNMaXN0OiBhbnlbXSA9IFtdO1xuICBkYXRlUGlja2VyT3ZlcmxheSA9IGZhbHNlO1xuICBkYXlOYW1lcyA9IFtcbiAgICAnTW9uZGF5JyxcbiAgICAnVHVlc2RheScsXG4gICAgJ1dlZG5lc2RheScsXG4gICAgJ1RodXJzZGF5JyxcbiAgICAnRnJpZGF5JyxcbiAgICAnU2F0dXJkYXknLFxuICAgICdTdW5kYXknLFxuICBdO1xuICBtb250aE5hbWVzID0gW1xuICAgICdKYW51YXJ5JyxcbiAgICAnRmVicnVhcnknLFxuICAgICdNYXJjaCcsXG4gICAgJ0FwcmlsJyxcbiAgICAnTWF5JyxcbiAgICAnSnVuZScsXG4gICAgJ0p1bHknLFxuICAgICdBdWd1c3QnLFxuICAgICdTZXB0ZW1iZXInLFxuICAgICdPY3RvYmVyJyxcbiAgICAnTm92ZW1iZXInLFxuICAgICdEZWNlbWJlcicsXG4gIF07XG4gIHF1YXJ0ZXJzID0gW1xuICAgICdKYW51YXJ5LCBBcHJpbCwgSnVseSwgT2N0b2JlcicsXG4gICAgJ0ZlYnJ1YXJ5LCBNYXksIEF1Z3VzdCwgTm92ZW1iZXInLFxuICAgICdNYXJjaCwgSnVuZSwgU2VwdGVtYmVyLCBEZWNlbWJlcicsXG4gIF07XG5cbiAgc2hvd1Jpc2tXaWRnZXRzID0gZmFsc2U7XG4gIHNob3dDb21wbGlhbmNlV2lkZ2V0cyA9IGZhbHNlO1xuICBpc01hbmFnZVJpc2s6IGJvb2xlYW4gPSBmYWxzZTtcblxuICByaXNrQ2F0ZWdvcnlMaXN0ID0ge1xuICAgIHN0cmF0ZWdpYzoge1xuICAgICAgbGlzdDogW10sXG4gICAgICBzZWxlY3RlZExpc3Q6IFtdLFxuICAgIH0sXG4gICAgb3BlcmF0aW9uYWw6IHtcbiAgICAgIGxpc3Q6IFtdLFxuICAgICAgc2VsZWN0ZWRMaXN0OiBbXSxcbiAgICB9LFxuICAgIGNvbXBsaWFuY2U6IHtcbiAgICAgIGxpc3Q6IFtdLFxuICAgICAgc2VsZWN0ZWRMaXN0OiBbXSxcbiAgICB9LFxuICAgIG90aGVyczoge1xuICAgICAgbGlzdDogW10sXG4gICAgICBzZWxlY3RlZExpc3Q6IFtdLFxuICAgIH0sXG4gIH07XG4gIHByb2dyYW1MaXN0VXJsOiBhbnkgPSBQUk9HUkFNX0xJU1RfQVBJO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0ZVBpY2tlckJhc2VDb25maWc6IElEYXRlUGlja2VyQ29uZmlnID0ge1xuICAgIG9wZW5PbkNsaWNrOiBmYWxzZSxcbiAgICBvcGVuT25Gb2N1czogZmFsc2UsXG4gICAgaGlkZUlucHV0Q29udGFpbmVyOiB0cnVlLFxuICAgIGhpZGVPbk91dHNpZGVDbGljazogdHJ1ZSxcbiAgfTtcblxuICBmcm9tRGF0ZVBpY2tlckNvbmZpZzogSURhdGVQaWNrZXJDb25maWcgPSB7XG4gICAgLi4udGhpcy5kYXRlUGlja2VyQmFzZUNvbmZpZyxcbiAgICBtaW46IHRoaXMuZ2V0Q3VycmVudERhdGUoKSxcbiAgfTtcblxuICB0b0RhdGVQaWNrZXJDb25maWc6IElEYXRlUGlja2VyQ29uZmlnID0ge1xuICAgIC4uLnRoaXMuZGF0ZVBpY2tlckJhc2VDb25maWcsXG4gIH07XG5cbiAgaXNTbWlsZXkhOiBib29sZWFuO1xuICBzbWlsZXlNZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgZ3JvdXBMaXN0OiBhbnk7XG4gIGdyb3Vwc0VuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICB0b3RhbGdyb3VwczogYW55O1xuICBvcGVuZWREYXRlUGlja2VyOiBzdHJpbmcgPSAnJztcbiAgc2VsZWN0ZWRQcm9ncmFtczogYW55ID0ge307XG4gIGFsbFByb2dhbVNlbGVjdGVkOiBhbnlbXSA9IFtdO1xuICBwcml2YXRlIHBlbmRpbmdFZGl0UmNJZHM6IG51bWJlcltdID0gW107XG4gIHByaXZhdGUgcGVuZGluZ0VkaXRSY0VudHJpZXM6IGFueVtdID0gW107XG4gIHByaXZhdGUgZWRpdEZvcm1IeWRyYXRlZCA9IGZhbHNlO1xuICAvKiogVHJhY2tzIGluLWZsaWdodCBFRElUIGh5ZHJhdGlvbiBIVFRQIGNhbGxzOyBsb2FkZXIgc3RheXMgb24gdW50aWwgemVyby4gKi9cbiAgcHJpdmF0ZSBlZGl0SHlkcmF0aW9uQ291bnQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY3JlYXRlRGFzaGJvYXJkU2VydmljZTogQ3JlYXRlRGFzaGJvYXJkU2VydmljZSxcbiAgICBwcml2YXRlIHBhZ2luYXRpb25TZXJ2aWNlOiBQYWdpbmF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBzbmFja0JhcjogU25hY2tCYXJTZXJ2aWNlLFxuICAgIHB1YmxpYyBwb3BvdmVyU2VydmljZTogUG9wb3ZlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0ZXh0Q291bnQ6IFRleHRDb3VudFBpcGVcbiAgKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAodGhpcy5jcmVhdGVkQnkpIHtcbiAgICAgIHRoaXMubGlzdERldGFpbHMubm9uUmVtb3ZhYmxlVXNlcnNMaXN0LnB1c2godGhpcy5jcmVhdGVkQnkpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLm1vZGUgPT09ICdFRElUJyAmJlxuICAgICAgY2hhbmdlc1snZGFzaGJvYXJkRGV0YWlscyddPy5jdXJyZW50VmFsdWUgJiZcbiAgICAgIHRoaXMucmNMaXN0TG9hZGVkICYmXG4gICAgICB0aGlzLnVzZXJMaXN0TG9hZGVkICYmXG4gICAgICB0aGlzLmdyb3VwTGlzdExvYWRlZFxuICAgICkge1xuICAgICAgdGhpcy5oeWRyYXRlRWRpdEZvcm0oKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVzY2FwZScsIFsnJGV2ZW50J10pIG9uS2V5ZG93bkhhbmRsZXIoXG4gICAgZXZlbnQ6IEtleWJvYXJkRXZlbnRcbiAgKSB7XG4gICAgdGhpcy5jbG9zZS5lbWl0KHsgbW9kZTogJ2Rpc2NhcmQnIH0pO1xuICAgIHRoaXMuaXNTbWlsZXkgPSBmYWxzZTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYW5pbWF0ZUNvbnRhaW5lcigpO1xuICAgIHRoaXMuZ2V0UkNMaXN0KCk7XG4gICAgdGhpcy5jaGVja1doZXRoZXJBbGxMaXN0c0xvYWRlZCgpO1xuICAgIHRoaXMuZ2V0VXNlcnNMaXN0KCcnKTtcbiAgICB0aGlzLmdldEdyb3VwTGlzdCgpO1xuICAgIHRoaXMuZ2V0VXNlckluZm8oKTtcbiAgfVxuICBcbiAgYW5pbWF0ZUNvbnRhaW5lcigpIHtcbiAgICB0aGlzLmFuaW1hdGlvbiA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmFuaW1hdGlvbiA9IGZhbHNlO1xuICAgIH0sIDMwMCk7XG4gIH1cblxuICBnZXRVc2VySW5mbygpe1xuICAgIHRoaXMuY3JlYXRlRGFzaGJvYXJkU2VydmljZS5nZXRVc2VySW5mb3JtYXRpb24oKS5zdWJzY3JpYmUoXG4gICAgICAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5zZXRQZXJtaXNzaW9uKHJlcz8ucm9sZUFjdGlvbnMpO1xuICAgICAgICBjb25zdCBxdWlja0xpbmsgPSByZXMucXVpY2tfbGluaztcbiAgICAgICAgaWYgKHF1aWNrTGluay5yaXNrKSB7XG4gICAgICAgICAgdGhpcy5zaG93Umlza0NhdGVnb3J5ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNob3dSaXNrQ2F0ZWdvcnkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXlzIHRoZSBsaXN0aW5nIHBhZ2VzIHRoZSBsZWZ0IHNpZGUgb2YgcG9saWN5IGZvcm0gdG8gc2V0IGFuZCBlZGl0IHRoZSBkcm9wZG93biBmaWVsZHMgdmFsdWVzXG4gICAqIEBwYXJhbSB0eXBlIGhvbGRzIG5hbWUgb2YgcGFydGljdWxhciBsaXN0IGlzIHRvIGJlIGRpc3BsYXllZFxuICAgKiBAcGFyYW0gZXZlbnQgY29udGFpbnMgYm9vbGVhbiB2YWx1ZSB0byBkaXNwbGF5IHRoZSBsaXN0IG9yIG5vdFxuICAgKi9cbiAgYWN0aXZhdGVTZWxlY3Rvcih0eXBlOiBhbnksIGV2ZW50OiBib29sZWFuKSB7XG4gICAgaWYgKHR5cGUgPT0gJ2ZyZXF1ZW5jeScgfHwgdGhpcy5hY3RpdmVTZWxlY3RvciA9PSAnZnJlcXVlbmN5Jykge1xuICAgICAgdGhpcy5zaG93Q3JpdGVyaWEgPSBmYWxzZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dDcml0ZXJpYSA9IHRydWU7XG4gICAgICB9LCAxKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdyZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMnICYmIGV2ZW50KSB7XG4gICAgICB0aGlzLnN5bmNQcm9ncmFtU2VsZWN0aW9uTWFwRnJvbUZvcm0oKTtcbiAgICAgIHRoaXMuZW5zdXJlUHJvZ3JhbVNlbGVjdGlvbk1hcEZvckxpc3QoKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmVTZWxlY3RvciA9IGV2ZW50ID8gdHlwZSA6ICcnO1xuICB9XG5cbiAgb25Qcm9ncmFtU2VsZWN0aW9uQ2hhbmdlKGl0ZW1zOiBMaXN0SXRlbVtdKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFByb2dyYW1zID0gaXRlbXM7XG4gICAgdGhpcy5hbGxQcm9nYW1TZWxlY3RlZCA9IChbXSBhcyBhbnkpLmNvbmNhdCguLi5PYmplY3QudmFsdWVzKGl0ZW1zKSk7XG4gIH1cblxuICBzZWxlY3RDYXRlZ29yeSgpOiB2b2lkIHtcbiAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMgPVxuICAgICAgbm9ybWFsaXplUHJvZ3JhbUNhdGVnb3JpZXModGhpcy5hbGxQcm9nYW1TZWxlY3RlZCk7XG4gICAgdGhpcy5hcHBseVJlc3BvbnNpYmlsaXR5Q2F0ZWdvcnlXaWRnZXRGaWx0ZXJzKCk7XG4gICAgdGhpcy5hY3RpdmF0ZVNlbGVjdG9yKCcnLCBmYWxzZSk7XG4gIH1cblxuICBjaGVja0RlZmF1bHRQcm9ncmFtT25SZW1vdmUoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuYWxsUHJvZ2FtU2VsZWN0ZWQgPSB0aGlzLmFsbFByb2dhbVNlbGVjdGVkLmZpbHRlcihcbiAgICAgIChwcm9ncmFtOiBhbnkpID0+IHByb2dyYW0/LmlkICE9PSBldmVudD8uaWRcbiAgICApO1xuICAgIHRoaXMucmVtb3ZlUHJvZ3JhbShldmVudCk7XG5cbiAgfVxuXG4gIHJlbW92ZVByb2dyYW0ocHJvZ3JhbTogYW55KTogdm9pZCB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuc2VsZWN0ZWRQcm9ncmFtcyk7XG4gICAga2V5cy5mb3JFYWNoKChrZXk6IGFueSkgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNlbGVjdGVkUHJvZ3JhbXNba2V5XS5maW5kSW5kZXgoXG4gICAgICAgIChpdGVtOiBhbnkpID0+IGl0ZW0/LmlkID09PSBwcm9ncmFtPy5pZFxuICAgICAgKTtcbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFByb2dyYW1zW2tleV0uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3luY1Byb2dyYW1TZWxlY3Rpb25NYXBGcm9tRm9ybSgpOiB2b2lkIHtcbiAgICBpZiAoaGFzUHJvZ3JhbVNlbGVjdGlvbkluTWFwKHRoaXMuc2VsZWN0ZWRQcm9ncmFtcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZmxhdCA9XG4gICAgICB0aGlzLmFsbFByb2dhbVNlbGVjdGVkPy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5hbGxQcm9nYW1TZWxlY3RlZFxuICAgICAgICA6IHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcyA/PyBbXTtcbiAgICBjb25zdCBmcm9tRm9ybSA9IGJ1aWxkUHJvZ3JhbVNlbGVjdGlvbk1hcEZyb21DYXRlZ29yaWVzKFxuICAgICAgZmxhdCxcbiAgICAgIHRoaXMuYWxsQ29tcGxpYW5jZUNhdGVnb3JpZXNcbiAgICApO1xuICAgIGlmIChoYXNQcm9ncmFtU2VsZWN0aW9uSW5NYXAoZnJvbUZvcm0pKSB7XG4gICAgICB0aGlzLmFwcGx5UHJvZ3JhbVNlbGVjdGlvbk1hcChmcm9tRm9ybSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoeWRyYXRlUHJvZ3JhbXNGcm9tRGFzaGJvYXJkRGF0YShkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcHJvZ3JhbXNSYXcgPSBkYXRhPy5wcm9ncmFtcyA/PyBkYXRhPy5wcm9ncmFtSWQgPz8gZGF0YT8ucHJvZ3JhbUlkcztcbiAgICBpZiAoXG4gICAgICBBcnJheS5pc0FycmF5KHByb2dyYW1zUmF3KSAmJlxuICAgICAgcHJvZ3JhbXNSYXcubGVuZ3RoICYmXG4gICAgICB0eXBlb2YgcHJvZ3JhbXNSYXdbMF0gPT09ICdvYmplY3QnXG4gICAgKSB7XG4gICAgICBjb25zdCBjaGlwcyA9IHByb2dyYW1zUmF3Lm1hcCgocDogYW55KSA9PiAoe1xuICAgICAgICBpZDogcD8uaWQgPz8gcD8ucHJvZ3JhbUlkLFxuICAgICAgICBjYXRlZ29yeV9pZDogcD8uaWQgPz8gcD8ucHJvZ3JhbUlkLFxuICAgICAgICBuYW1lOiBwPy5uYW1lID8/IHA/Lml0ZW1fbmFtZSxcbiAgICAgICAgaXRlbV9uYW1lOiBwPy5uYW1lID8/IHA/Lml0ZW1fbmFtZSxcbiAgICAgICAgcHJvZ3JhbUlkOiBwPy5pZCA/PyBwPy5wcm9ncmFtSWQsXG4gICAgICB9KSk7XG4gICAgICB0aGlzLmFsbFByb2dhbVNlbGVjdGVkID0gbm9ybWFsaXplUHJvZ3JhbUNhdGVnb3JpZXMoY2hpcHMpO1xuICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzID0gW1xuICAgICAgICAuLi50aGlzLmFsbFByb2dhbVNlbGVjdGVkLFxuICAgICAgXTtcbiAgICAgIGNvbnN0IG1hcCA9IGJ1aWxkUHJvZ3JhbVNlbGVjdGlvbk1hcEZyb21DYXRlZ29yaWVzKFxuICAgICAgICBjaGlwcyxcbiAgICAgICAgdGhpcy5hbGxDb21wbGlhbmNlQ2F0ZWdvcmllc1xuICAgICAgKTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhtYXApLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUHJvZ3JhbXMgPSBtYXA7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9ncmFtID0gZGF0YT8ucHJvZ3JhbSA/PyB7fTtcbiAgICBjb25zdCBzZWxlY3RlZE1hcCA9IGdldFNlbGVjdGVkUHJvZ3JhbXNNYXAoZGF0YSk7XG4gICAgaWYgKHNlbGVjdGVkTWFwICYmIGhhc1Byb2dyYW1TZWxlY3Rpb25Jbk1hcChzZWxlY3RlZE1hcCkpIHtcbiAgICAgIHRoaXMuYXBwbHlQcm9ncmFtU2VsZWN0aW9uTWFwKHNlbGVjdGVkTWFwKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFByb2dyYW1zID0gcHJvZ3JhbT8uYWxsX3Byb2dyYW1zO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFsbFByb2dyYW1zKSAmJiBhbGxQcm9ncmFtcy5sZW5ndGgpIHtcbiAgICAgIGlmICh0eXBlb2YgYWxsUHJvZ3JhbXNbMF0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IG1hcCA9IGJ1aWxkUHJvZ3JhbVNlbGVjdGlvbk1hcEZyb21DYXRlZ29yaWVzKFxuICAgICAgICAgIGFsbFByb2dyYW1zLFxuICAgICAgICAgIHRoaXMuYWxsQ29tcGxpYW5jZUNhdGVnb3JpZXNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGhhc1Byb2dyYW1TZWxlY3Rpb25Jbk1hcChtYXApKSB7XG4gICAgICAgICAgdGhpcy5hcHBseVByb2dyYW1TZWxlY3Rpb25NYXAobWFwKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFsbFByb2dhbVNlbGVjdGVkID0gbm9ybWFsaXplUHJvZ3JhbUNhdGVnb3JpZXMoYWxsUHJvZ3JhbXMpO1xuICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMgPSBbXG4gICAgICAgICAgLi4udGhpcy5hbGxQcm9nYW1TZWxlY3RlZCxcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWxsUHJvZ2FtU2VsZWN0ZWQubGVuZ3RoID4gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjYXRlZ29yeUlkcyA9IGV4dHJhY3RDYXRlZ29yeUlkc0Zyb21EYXNoYm9hcmQoZGF0YSk7XG4gICAgaWYgKGNhdGVnb3J5SWRzLmxlbmd0aCkge1xuICAgICAgY29uc3Qgc3R1YnMgPSBjYXRlZ29yeUlkcy5tYXAoKGlkKSA9PiAoe1xuICAgICAgICBjYXRlZ29yeV9pZDogaWQsXG4gICAgICAgIGlkLFxuICAgICAgICBpdGVtX25hbWU6IGBDYXRlZ29yeSAke2lkfWAsXG4gICAgICB9KSk7XG4gICAgICB0aGlzLmFsbFByb2dhbVNlbGVjdGVkID0gbm9ybWFsaXplUHJvZ3JhbUNhdGVnb3JpZXMoc3R1YnMpO1xuICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzID0gW1xuICAgICAgICAuLi50aGlzLmFsbFByb2dhbVNlbGVjdGVkLFxuICAgICAgXTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5RmxhdFByb2dyYW1DYXRlZ29yaWVzKGNhdGVnb3JpZXM6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKCFjYXRlZ29yaWVzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hbGxQcm9nYW1TZWxlY3RlZCA9IG5vcm1hbGl6ZVByb2dyYW1DYXRlZ29yaWVzKGNhdGVnb3JpZXMpO1xuICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcyA9IFtcbiAgICAgIC4uLnRoaXMuYWxsUHJvZ2FtU2VsZWN0ZWQsXG4gICAgXTtcbiAgICBjb25zdCBtYXAgPSBidWlsZFByb2dyYW1TZWxlY3Rpb25NYXBGcm9tQ2F0ZWdvcmllcyhcbiAgICAgIGNhdGVnb3JpZXMsXG4gICAgICB0aGlzLmFsbENvbXBsaWFuY2VDYXRlZ29yaWVzXG4gICAgKTtcbiAgICBpZiAoaGFzUHJvZ3JhbVNlbGVjdGlvbkluTWFwKG1hcCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcm9ncmFtcyA9IG1hcDtcbiAgICB9XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVJlc3BvbnNpYmlsaXR5Q2F0ZWdvcnlXaWRnZXRGaWx0ZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkV2lkZ2V0cyA9IHRoaXMuc2VsZWN0ZWRXaWRnZXRzLmZpbHRlcihcbiAgICAgICAgKGVsZW1lbnQ6IGFueSkgPT4gZWxlbWVudC5tb2R1bGVfbmFtZSAhPSAnQ09NUExJQU5DRSdcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSaXNrQ2F0ZWdvcmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRXaWRnZXRzID0gdGhpcy5zZWxlY3RlZFdpZGdldHMuZmlsdGVyKFxuICAgICAgICAoZWxlbWVudDogYW55KSA9PiBlbGVtZW50Lm1vZHVsZV9uYW1lICE9ICdSSVNLJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBvcGVuRnJvbURhdGVQaWNrZXIoZXZlbnQ/OiBFdmVudCkge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnRvRGF0ZVBpY2tlcj8uYXBpPy5jbG9zZSgpO1xuICAgIHRoaXMub3BlbmVkRGF0ZVBpY2tlciA9ICdGUk9NX0RBVEUnO1xuICAgIHRoaXMuZnJvbURhdGVQaWNrZXI/LmFwaT8ub3BlbigpO1xuICAgIHRoaXMuZGF0ZVBpY2tlck92ZXJsYXkgPSB0cnVlO1xuICB9XG5cbiAgb3BlblRvRGF0ZVBpY2tlcihldmVudD86IEV2ZW50KSB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZnJvbURhdGVQaWNrZXI/LmFwaT8uY2xvc2UoKTtcbiAgICB0aGlzLm9wZW5lZERhdGVQaWNrZXIgPSAnVE9fREFURSc7XG4gICAgdGhpcy50b0RhdGVQaWNrZXI/LmFwaT8ub3BlbigpO1xuICAgIHRoaXMuZGF0ZVBpY2tlck92ZXJsYXkgPSB0cnVlO1xuICB9XG5cbiAgY2xvc2VGcm9tRGF0ZVBpY2tlcigpIHtcbiAgICB0aGlzLmZyb21EYXRlUGlja2VyPy5hcGk/LmNsb3NlKCk7XG4gICAgaWYgKCF0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRGcm9tRGF0ZSkge1xuICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkVG9EYXRlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5oaWRlVG9EYXRlID0gdHJ1ZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmhpZGVUb0RhdGUgPSBmYWxzZTtcbiAgICAgIH0sIDIwKTtcbiAgICAgIHRoaXMuZnJvbURhdGVQaWNrZXIuYXBpLmNsb3NlKCk7XG4gICAgICB0aGlzLmRhdGVQaWNrZXJPdmVybGF5ID0gZmFsc2U7XG4gICAgICB0aGlzLm9wZW5lZERhdGVQaWNrZXIgPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IG1pblRvRGF0ZSA9IHRoaXMuc2V0VG9EYXRlKHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZEZyb21EYXRlKTtcbiAgICB0aGlzLnRvRGF0ZVBpY2tlckNvbmZpZyA9IHsgLi4udGhpcy5kYXRlUGlja2VyQmFzZUNvbmZpZywgbWluOiBtaW5Ub0RhdGUgfTtcblxuICAgIGNvbnN0IGZyb21EYXRlID0gbmV3IERhdGUobWluVG9EYXRlLnNwbGl0KCctJykucmV2ZXJzZSgpLmpvaW4oJy0nKSk7XG4gICAgY29uc3QgdG9EYXRlID0gbmV3IERhdGUodGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkVG9EYXRlKTtcbiAgICBjb25zdCBpblZhbGlkRGF0ZSA9IGZyb21EYXRlID49IHRvRGF0ZSA/IHRydWUgOiBmYWxzZTtcbiAgICBpZiAoaW5WYWxpZERhdGUpIHtcbiAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFRvRGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuaGlkZVRvRGF0ZSA9IHRydWU7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5oaWRlVG9EYXRlID0gZmFsc2U7XG4gICAgICB9LCAyMCk7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRlUGlja2VyT3ZlcmxheSA9IGZhbHNlO1xuICAgIHRoaXMub3BlbmVkRGF0ZVBpY2tlciA9ICcnO1xuICB9XG5cbiAgY2xvc2VUb0RhdGVQaWNrZXIoKSB7XG4gICAgdGhpcy50b0RhdGVQaWNrZXI/LmFwaT8uY2xvc2UoKTtcbiAgICB0aGlzLmRhdGVQaWNrZXJPdmVybGF5ID0gZmFsc2U7XG4gICAgdGhpcy5vcGVuZWREYXRlUGlja2VyID0gJyc7XG4gIH1cblxuICBhbmltYXRlSW1hZ2UoKSB7XG4gICAgY29uc3QgY2lyY2xlSW1hZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbWFnZScpO1xuICB9XG5cbiAgc2F2ZUZyZXF1ZW5jeShldmVudFZhbHVlczogYW55KSB7XG4gICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkRnJlcXVlbmN5VHlwZSA9IGV2ZW50VmFsdWVzLmZyZXF1ZW5jeVR5cGU7XG4gICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkRnJlcXVlbmNpZXMgPSBldmVudFZhbHVlcy5mcmVxdWVuY2llcztcbiAgICB0aGlzLmRhc2hib2FyZEZvcm0uZnJlcXVlbmN5TWVzc2FnZSA9IGV2ZW50VmFsdWVzLmZyZXF1ZW5jeVN0cmluZztcbiAgICB0aGlzLmRhc2hib2FyZEZvcm0uZnJlcXVlbmN5RGF0ZSA9IGV2ZW50VmFsdWVzLnNlbGVjdGVkRGF0ZTtcbiAgICB0aGlzLmFjdGl2YXRlU2VsZWN0b3IoJycsIGZhbHNlKTtcbiAgfVxuXG4gIGdldEN1cnJlbnREYXRlKCkge1xuICAgIGxldCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgcmV0dXJuIGRheWpzKHRvZGF5KS5mb3JtYXQoJ0RELU1NLVlZWVknKTtcbiAgfVxuXG4gIHNldFRvRGF0ZShkYXRhOiBzdHJpbmcpIHtcbiAgICBsZXQgdG9kYXkgPSBuZXcgRGF0ZShkYXRhKTtcbiAgICByZXR1cm4gZGF5anModG9kYXkpLmZvcm1hdCgnREQtTU0tWVlZWScpO1xuICB9XG5cbiAgZ2V0RnJvbURhdGUoZGF0YTogc3RyaW5nKSB7XG4gICAgbGV0IHRvZGF5ID0gbmV3IERhdGUoZGF0YSk7XG4gICAgcmV0dXJuIChcbiAgICAgIHRvZGF5LmdldERhdGUoKSArICctJyArICh0b2RheS5nZXRNb250aCgpICsgMSkgKyAnLScgKyB0b2RheS5nZXRGdWxsWWVhcigpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gZGF0YSAtIHRoZSBkYXRlIHlvdSB3YW50IHRvIGZvcm1hdFxuICAgKiBAcmV0dXJucyBEYXRlIHN0cmluZyBpbiBZWVlZLU1NLUREIGZvcm1hdCwgZS5nLiAyMDI2LTA1LTE5XG4gICAqL1xuICBnZXREYXRlRm9ybWF0ZShkYXRhOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZGF5anMoZGF0YSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gIH1cblxuXG4gIGNvbmZpZ3VyZURhc2hib2FyZCgpIHtcbiAgICBsZXQgZmllbGRzU3RhdHVzID0gdGhpcy52YWxpZGF0ZURhc2hib2FyZCgpO1xuICAgIGlmICghZmllbGRzU3RhdHVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudkxvYWRlciA9IHRydWU7XG4gICAgdGhpcy5vblN1Ym1pdERhc2hib2FyZCgpO1xuICBcbiAgfVxuXG5cblxuICAvKipcbiAgICogR2V0IHVzZXJzIGxpc3QgYnkgbWFraW5nIGFwaSBjYWxsIGFuZCBwcmUgc2VsZWN0cyBhbGwgYWRtaW5zIGJ5IGFkZGluZyB0byB2aWV3ZXJzXG4gICAqIEBwYXJhbSB1cmwgY29udGFpbnMgcXVlcnkgcGFyYW1zIGZvciBvcmdhbml6YXRpb24gdXNlcnMgYXBpXG4gICAqL1xuICBnZXRVc2Vyc0xpc3QodXJsOiBhbnkpIHtcbiAgICB0aGlzLmNyZWF0ZURhc2hib2FyZFNlcnZpY2UuZ2V0QWxsVXNlcnMoKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICB0aGlzLnVzZXJzTGlzdCA9IHJlcztcbiAgICAgIHRoaXMudXNlckxpc3RMb2FkZWQgPSB0cnVlO1xuXG4gICAgICBpZiAodGhpcy5tb2RlID09PSAnRURJVCcpIHtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFZpZXdlcnMgPSB0aGlzLnNldExpc3QoXG4gICAgICAgICAgdGhpcy51c2Vyc0xpc3QsXG4gICAgICAgICAgW3RoaXMuY3JlYXRlZEJ5XSxcbiAgICAgICAgICAnbWVtYmVyX2lkJ1xuICAgICAgICApO1xuICAgICAgICB0aGlzLmxpc3REZXRhaWxzLnNlbGVjdGVkVXNlcnNMaXN0ID0gdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkVmlld2VycztcbiAgICAgICAgdGhpcy52TG9hZGVyID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRHcm91cExpc3QoKSB7XG4gICAgdGhpcy5jcmVhdGVEYXNoYm9hcmRTZXJ2aWNlLmdldEFsbEdyb3VwcygpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMudG90YWxncm91cHMgPSByZXMudG90YWxfaXRlbXM7XG4gICAgICB0aGlzLmdyb3VwTGlzdCA9IHJlcy5kYXRhO1xuICAgICAgdGhpcy5ncm91cExpc3RMb2FkZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ0VESVQnKSB7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRHcm91cCA9IHRoaXMuc2V0TGlzdChcbiAgICAgICAgICB0aGlzLmdyb3VwTGlzdCxcbiAgICAgICAgICBbdGhpcy5jcmVhdGVkQnldLFxuICAgICAgICAgICdncm91cF9pZCdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5saXN0RGV0YWlscy5zZWxlY3RlZEdyb3VwTGlzdCA9IHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZEdyb3VwO1xuICAgICAgICB0aGlzLnZMb2FkZXIgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEl0IGlzIHRvIGVuc3VyZSB3aGV0aGVyIGFsbCByZXF1aXJlZCBsaXN0cyBvbiBQb2xpY3kgZnJvbSBpcyBsb2FkZWQgZnJvbSB0aGUgYXBpIGNhbGwgb3Igbm90XG4gICAqL1xuICBjaGVja1doZXRoZXJBbGxMaXN0c0xvYWRlZCgpIHtcbiAgICAvLyBDYXRlZ29yeSB0cmVlcyBhcmUgbm8gbG9uZ2VyIGVhZ2VybHkgbG9hZGVkIGhlcmU7IHRoZXNlIGZsYWdzIHdlcmUgbmV2ZXIgZmxpcHBlZCBhbmQgYmxvY2tlZCBFRElUIGluZGVmaW5pdGVseS5cbiAgICBpZiAodGhpcy5yY0xpc3RMb2FkZWQgJiYgdGhpcy51c2VyTGlzdExvYWRlZCAmJiB0aGlzLmdyb3VwTGlzdExvYWRlZCkge1xuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ0VESVQnKSB7XG4gICAgICAgIHRoaXMuaHlkcmF0ZUVkaXRGb3JtKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZMb2FkZXIgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tXaGV0aGVyQWxsTGlzdHNMb2FkZWQoKTtcbiAgICAgIH0sIDMwMCk7XG4gICAgfVxuICB9XG5cbiAgc2V0U2VsZWN0ZWRXaWRnZXRzKGRhdGE6IGFueSkge1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICdDUkVBVEUnKSB7XG4gICAgICBjb25zdCB3aWRnZXRzQXJyYXk6IGFueSA9IFtdO1xuICAgICAgZGF0YS5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgICAgbGV0IG9iajogYW55ID0ge307XG4gICAgICAgIG9iai5tb2R1bGVfbmFtZSA9IGVsZW1lbnQubW9kdWxlO1xuICAgICAgICBvYmoud2lkZ2V0X25hbWUgPSBlbGVtZW50LnRpdGxlO1xuICAgICAgICBvYmoud2lkZ2V0X2NvZGUgPSBlbGVtZW50LmlkO1xuICAgICAgICBvYmouc3ViX3dpZGdldHMgPSBbXTtcbiAgICAgICAgb2JqLnN0YXRlID0gJ0FDVElWRSc7XG4gICAgICAgIGlmIChlbGVtZW50LnN1YldpZGdldHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGVsZW1lbnQuc3ViV2lkZ2V0cy5mb3JFYWNoKChzdWJXaWRnZXQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGV0IHN1YldpZGdldE9iamVjdDogYW55ID0ge307XG4gICAgICAgICAgICBzdWJXaWRnZXRPYmplY3Qud2lkZ2V0X25hbWUgPSBzdWJXaWRnZXQudGl0bGU7XG4gICAgICAgICAgICBzdWJXaWRnZXRPYmplY3Qud2lkZ2V0X2NvZGUgPSBzdWJXaWRnZXQuaWQ7XG4gICAgICAgICAgICBzdWJXaWRnZXRPYmplY3Quc3RhdGUgPSBzdWJXaWRnZXQudmFsdWUgPyAnQUNUSVZFJyA6ICdJTkFDVElWRSc7XG4gICAgICAgICAgICBvYmouc3ViX3dpZGdldHMucHVzaChPYmplY3QuYXNzaWduKHN1YldpZGdldE9iamVjdCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHdpZGdldHNBcnJheS5wdXNoKG9iaik7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLmNvbmZpZ3VyZVdpZGdldCA9IHdpZGdldHNBcnJheTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ0VESVQnKSB7XG4gICAgICBjb25zdCB3aWRnZXRzQXJyYXk6IGFueSA9IFtdO1xuXG4gICAgICBkYXRhLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXRoaXMuZXh0cmFjdFdpZGdldENvZGVzKHRoaXMuZGFzaGJvYXJkRm9ybS5jb25maWd1cmVXaWRnZXQpLmluY2x1ZGVzKFxuICAgICAgICAgICAgZWxlbWVudC5pZFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgbGV0IG9iajogYW55ID0ge307XG4gICAgICAgICAgb2JqLm1vZHVsZV9uYW1lID0gZWxlbWVudC5tb2R1bGU7XG4gICAgICAgICAgb2JqLl9pZCA9ICcnO1xuICAgICAgICAgIG9iai53aWRnZXRfbmFtZSA9IGVsZW1lbnQudGl0bGU7XG4gICAgICAgICAgb2JqLndpZGdldF9jb2RlID0gZWxlbWVudC5pZDtcbiAgICAgICAgICBvYmouc3ViX3dpZGdldHMgPSBbXTtcbiAgICAgICAgICBvYmouc3RhdGUgPSAnQUNUSVZFJztcbiAgICAgICAgICBpZiAoZWxlbWVudC5zdWJXaWRnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3ViV2lkZ2V0cy5mb3JFYWNoKChzdWJXaWRnZXQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBsZXQgc3ViV2lkZ2V0T2JqZWN0OiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgc3ViV2lkZ2V0T2JqZWN0Ll9pZCA9ICcnO1xuICAgICAgICAgICAgICBzdWJXaWRnZXRPYmplY3Qud2lkZ2V0X25hbWUgPSBzdWJXaWRnZXQudGl0bGU7XG4gICAgICAgICAgICAgIHN1YldpZGdldE9iamVjdC53aWRnZXRfY29kZSA9IHN1YldpZGdldC5pZDtcbiAgICAgICAgICAgICAgc3ViV2lkZ2V0T2JqZWN0LnN0YXRlID0gc3ViV2lkZ2V0LnZhbHVlID8gJ0FDVElWRScgOiAnSU5BQ1RJVkUnO1xuICAgICAgICAgICAgICBvYmouc3ViX3dpZGdldHMucHVzaChzdWJXaWRnZXRPYmplY3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5jb25maWd1cmVXaWRnZXQucHVzaChvYmopO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZFdpZGdldHMuZmluZEluZGV4KFxuICAgICAgICAgICAgKGVsZTogYW55KSA9PiBlbGUud2lkZ2V0X2NvZGUgPT0gZWxlbWVudC5pZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkV2lkZ2V0c1tpbmRleF0uc3RhdGUgPSAnQUNUSVZFJztcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkV2lkZ2V0c1tpbmRleF0uc3ViX3dpZGdldHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkV2lkZ2V0c1tpbmRleF0uc3ViX3dpZGdldHMuZm9yRWFjaChcbiAgICAgICAgICAgICAgICAoc3ViV2lkZ2V0RGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50SW5kZXggPSBlbGVtZW50LnN1YldpZGdldHMuZmluZEluZGV4KFxuICAgICAgICAgICAgICAgICAgICAoZWxlOiBhbnkpID0+IGVsZS5pZCA9PSBzdWJXaWRnZXREYXRhLndpZGdldF9jb2RlXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRJbmRleCAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBzdWJXaWRnZXREYXRhLnN0YXRlID0gZWxlbWVudC5zdWJXaWRnZXRzW2VsZW1lbnRJbmRleF0udmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICA/ICdBQ1RJVkUnXG4gICAgICAgICAgICAgICAgICAgICAgOiAnSU5BQ1RJVkUnO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLmNvbmZpZ3VyZVdpZGdldC5mb3JFYWNoKChzYXZlZFdpZGdldDogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gZGF0YS5maW5kSW5kZXgoXG4gICAgICAgICAgKGRhdGFFbGVtZW50OiBhbnkpID0+IGRhdGFFbGVtZW50LmlkID09IHNhdmVkV2lkZ2V0LndpZGdldF9jb2RlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpbmRleCA9PSAtMSkge1xuICAgICAgICAgIHNhdmVkV2lkZ2V0LnN0YXRlID0gJ0lOQUNUSVZFJztcbiAgICAgICAgICBpZiAoc2F2ZWRXaWRnZXQuc3ViX3dpZGdldHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2F2ZWRXaWRnZXQuc3ViX3dpZGdldHMuZm9yRWFjaCgoc2F2ZVN1YldpZGdldDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHNhdmVTdWJXaWRnZXQuc3RhdGUgPSAnSU5BQ1RJVkUnO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZFdpZGdldHMgPSBkYXRhO1xuICAgIHRoaXMub3BlbkNvbmZpZ3VyZVdpZGdldHMgPSBmYWxzZTtcbiAgICB0aGlzLnN1Ym1pdERhc2hib2FyZCgpO1xuICB9XG5cbiAgZXh0cmFjdFdpZGdldENvZGVzKHdpZGdldHM6IGFueVtdKSB7XG4gICAgY29uc3Qgd2lkZ2V0Q29kZXM6IGFueVtdID0gW107XG5cbiAgICB3aWRnZXRzPy5mb3JFYWNoKCh3aWRnZXQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHdpZGdldD8ud2lkZ2V0X2NvZGUpIHtcbiAgICAgICAgd2lkZ2V0Q29kZXMucHVzaCh3aWRnZXQ/LndpZGdldF9jb2RlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB3aWRnZXRDb2RlcztcbiAgfVxuXG4gIGNsb3NlQ29uZmlndXJlV2lkZ2V0cyhldmVudDogYm9vbGVhbikge1xuICAgIHRoaXMub3BlbkNvbmZpZ3VyZVdpZGdldHMgPSBldmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgbGlzdCB1c2VyJ3MgbGlzdCBiYXNlZCBvbiBwYWdpbmF0aW9uIGJ5IG1ha2luZyBhcGkgY2FsbFxuICAgKiBAcGFyYW0gZXZlbnQgc3BlY2lmaWVzIGEgYm9vbGVhbiB2YWx1ZSB0byBjYWxsIGFwaVxuICAgKi9cbiAgcGFnaW5hdGlvbkZpbHRlcihldmVudDogYW55KSB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICB0aGlzLmdldFVzZXJzTGlzdCh7XG4gICAgICAgIHA6XG4gICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5jdXJyZW50UGFnZSA9PT0gMVxuICAgICAgICAgICAgPyAnJ1xuICAgICAgICAgICAgOiB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLmN1cnJlbnRQYWdlLFxuICAgICAgICB0eXBlOiAnYWxsX2V4Y2VwdF9leGVjdXRpdmUnLFxuICAgICAgICBxOiAhdGhpcy5wYWdpbmF0aW9uU2VydmljZS5zZWFyY2hWYWx1ZVxuICAgICAgICAgID8gJydcbiAgICAgICAgICA6IHRoaXMucGFnaW5hdGlvblNlcnZpY2Uuc2VhcmNoVmFsdWUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXRSQ0xpc3QoKSB7XG4gICAgdGhpcy5jcmVhdGVEYXNoYm9hcmRTZXJ2aWNlLmdldFJlc3BvbnNpYmlsaXR5Q2VudGVyTGlzdCgpLnN1YnNjcmliZShcbiAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnJlc3BvbnNpYmlsaXR5Q2VudGVyc0xpc3QgPSB0aGlzLm5vcm1hbGl6ZVJjTGlzdChyZXMpO1xuICAgICAgICB0aGlzLnJjTGlzdExvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuYXBwbHlQZW5kaW5nUmVzcG9uc2liaWxpdHlDZW50ZXJzKCk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdFRElUJykge1xuICAgICAgICAgIGNvbnN0IGlkcyA9IHRoaXMucmVzcG9uc2liaWxpdHlDZW50ZXJzTGlzdC5maWx0ZXIoKHJjOiBhbnkpID0+IHRoaXMuZGFzaGJvYXJkRGV0YWlscz8ucmVzcG9uc2liaWxpdHlDZW50ZXJzLmluY2x1ZGVzKHJjLnJjaWQpKS5tYXAoKHJjOiBhbnkpID0+IHJjLml0ZW1faWQpO1xuICAgICAgICAgIHRoaXMuc2F2ZVNlbGVjdGVkTGlzdCgncmMnLCBpZHMpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKGVycjogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgdGhpcy5yY0xpc3RMb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmFwcGx5UGVuZGluZ1Jlc3BvbnNpYmlsaXR5Q2VudGVycygpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqICMjIyMgRGVzY3JpcHRpb25cbiAgICpcbiAgICogUmV0dXJucyB0aGUgdW5pcXVlIGFycmF5IG9mIG9iamVjdCBiYXNlZCBvbiB1bmlxdWUga2V5XG4gICAqIEBwYXJhbSBhcnJheVxuICAgKiBAcGFyYW0ga2V5XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICB1bmlxdWVCeVByb3AoYXJyYXk6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgIGFycmF5XG4gICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgKGFjYzogYW55LCBpdGVtOiBhbnkpID0+IChcbiAgICAgICAgICAgIGl0ZW0gJiYgaXRlbVtrZXldICYmIGFjYy5zZXQoaXRlbVtrZXldLCBpdGVtKSwgYWNjXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgTWFwKClcbiAgICAgICAgKVxuICAgICAgICAudmFsdWVzKClcbiAgICApO1xuICB9XG5cbiAgc2F2ZVNlbGVjdGVkTGlzdCh0eXBlOiBzdHJpbmcsIHNlbGVjdGVkSXRlbXM6IGFueSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAncmMnOlxuICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnMgPSB0aGlzLnNldExpc3QoXG4gICAgICAgICAgdGhpcy5yZXNwb25zaWJpbGl0eUNlbnRlcnNMaXN0LFxuICAgICAgICAgIHNlbGVjdGVkSXRlbXMsXG4gICAgICAgICAgJ2l0ZW1faWQnXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICBpZiAodGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkV2lkZ2V0cyA9IHRoaXMuc2VsZWN0ZWRXaWRnZXRzLmZpbHRlcihcbiAgICAgICAgICAgICAgKGVsZW1lbnQ6IGFueSkgPT4gZWxlbWVudC5tb2R1bGVfbmFtZSAhPSAnQ09NUExJQU5DRSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSaXNrQ2F0ZWdvcmllcy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFdpZGdldHMgPSB0aGlzLnNlbGVjdGVkV2lkZ2V0cy5maWx0ZXIoXG4gICAgICAgICAgICAgIChlbGVtZW50OiBhbnkpID0+IGVsZW1lbnQubW9kdWxlX25hbWUgIT0gJ1JJU0snXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3dob0NhblZpZXcnOlxuICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRWaWV3ZXJzID0gdGhpcy51bmlxdWVCeVByb3AoXG4gICAgICAgICAgc2VsZWN0ZWRJdGVtcz8udXNlcnMsXG4gICAgICAgICAgJ21lbWJlcl9pZCdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5saXN0RGV0YWlscy5zZWxlY3RlZFVzZXJzTGlzdCA9IHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFZpZXdlcnM7XG4gICAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZEdyb3VwID0gdGhpcy51bmlxdWVCeVByb3AoXG4gICAgICAgICAgc2VsZWN0ZWRJdGVtcz8uZ3JvdXBzLFxuICAgICAgICAgICdncm91cF9pZCdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5saXN0RGV0YWlscy5zZWxlY3RlZEdyb3VwTGlzdCA9IHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZEdyb3VwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Jlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcyc6XG4gICAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcyA9XG4gICAgICAgICAgbm9ybWFsaXplUHJvZ3JhbUNhdGVnb3JpZXMoXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KHNlbGVjdGVkSXRlbXMpXG4gICAgICAgICAgICAgID8gc2VsZWN0ZWRJdGVtc1xuICAgICAgICAgICAgICA6IGZsYXR0ZW5Qcm9ncmFtU2VsZWN0aW9uTWFwKHNlbGVjdGVkSXRlbXMgPz8ge30pXG4gICAgICAgICAgKTtcbiAgICAgICAgdGhpcy5hcHBseVJlc3BvbnNpYmlsaXR5Q2F0ZWdvcnlXaWRnZXRGaWx0ZXJzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmlza0NhdGVnb3J5JzpcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmlza0NhdGVnb3JpZXMgPSBzZWxlY3RlZEl0ZW1zO1xuICAgICAgICBpZiAodGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFdpZGdldHMgPSB0aGlzLnNlbGVjdGVkV2lkZ2V0cy5maWx0ZXIoXG4gICAgICAgICAgICAgIChlbGVtZW50OiBhbnkpID0+IGVsZW1lbnQubW9kdWxlX25hbWUgIT0gJ0NPTVBMSUFOQ0UnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmlza0NhdGVnb3JpZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXaWRnZXRzID0gdGhpcy5zZWxlY3RlZFdpZGdldHMuZmlsdGVyKFxuICAgICAgICAgICAgICAoZWxlbWVudDogYW55KSA9PiBlbGVtZW50Lm1vZHVsZV9uYW1lICE9ICdSSVNLJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZhdGVTZWxlY3RvcignJywgZmFsc2UpO1xuICB9XG5cbiAgcmVtb3ZlKHR5cGU6IGFueSwgZXZlbnQ6IGFueSwgcmVtb3ZlSW5kZXg/OiBhbnkpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3JjJzpcbiAgICAgICAgY29uc3QgcmNJbmRleCA9XG4gICAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzLmZpbmRJbmRleChcbiAgICAgICAgICAgIChyYzogYW55KSA9PlxuICAgICAgICAgICAgICByYy5yY19pZCA9PSBldmVudC5yY19pZCB8fFxuICAgICAgICAgICAgICByYy5pdGVtX2lkID09IGV2ZW50Lml0ZW1faWQgfHxcbiAgICAgICAgICAgICAgcmMucmNpZCA9PSBldmVudC5yY2lkXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKHJjSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgY29uc3QgcGFyZW50UmM6IGFueSA9XG4gICAgICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnNbcmNJbmRleF07XG4gICAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzLnNwbGljZShyY0luZGV4LCAxKTtcblxuICAgICAgICAgIGlmIChwYXJlbnRSYz8uaXRlbV9jaGlsZF9pZHM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHBhcmVudFJjLml0ZW1fY2hpbGRfaWRzLmZvckVhY2goKGNoaWxkRWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkUmVtb3ZlSW5kZXggPVxuICAgICAgICAgICAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVycy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgICAgICAocmVtb3ZlRWxlbWVudDogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgICByZW1vdmVFbGVtZW50LnJjX2lkID09IGNoaWxkRWxlbWVudCB8fFxuICAgICAgICAgICAgICAgICAgICByZW1vdmVFbGVtZW50Lml0ZW1faWQgPT0gY2hpbGRFbGVtZW50IHx8XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUVsZW1lbnQucmNpZCA9PSBjaGlsZEVsZW1lbnRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoY2hpbGRSZW1vdmVJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnMuc3BsaWNlKFxuICAgICAgICAgICAgICAgICAgY2hpbGRSZW1vdmVJbmRleCxcbiAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVycy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgIGlmICh0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXaWRnZXRzID0gdGhpcy5zZWxlY3RlZFdpZGdldHMuZmlsdGVyKFxuICAgICAgICAgICAgICAoZWxlbWVudDogYW55KSA9PiBlbGVtZW50Lm1vZHVsZV9uYW1lICE9ICdDT01QTElBTkNFJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJpc2tDYXRlZ29yaWVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkV2lkZ2V0cyA9IHRoaXMuc2VsZWN0ZWRXaWRnZXRzLmZpbHRlcihcbiAgICAgICAgICAgICAgKGVsZW1lbnQ6IGFueSkgPT4gZWxlbWVudC5tb2R1bGVfbmFtZSAhPSAnUklTSydcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICd3aG9DYW5WaWV3JzpcbiAgICAgICAgY29uc3QgcmV2aWV3ZXJJbmRleCA9IHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFZpZXdlcnMuZmluZEluZGV4KFxuICAgICAgICAgICh2aWV3ZXI6IGFueSkgPT4gdmlld2VyLm1lbWJlcl9pZCA9PSBldmVudC5tZW1iZXJfaWRcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkVmlld2Vycy5zcGxpY2UocmV2aWV3ZXJJbmRleCwgMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2hvQ2FuVmlld0dyb3VwJzpcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkR3JvdXAuZmluZEluZGV4KFxuICAgICAgICAgIChlbGU6IGFueSkgPT4gZWxlPy5ncm91cF9pZCA9PSBldmVudD8uZ3JvdXBfaWRcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkR3JvdXAuc3BsaWNlKGdyb3VwcywgMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzJzpcbiAgICAgICAgdGhpcy5jaGVja0RlZmF1bHRQcm9ncmFtT25SZW1vdmUoZXZlbnQpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmlza0NhdGVnb3J5JzpcbiAgICAgICAgY29uc3Qgcmlza0NhdGVnb3J5SW5kZXggPVxuICAgICAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJpc2tDYXRlZ29yaWVzLmZpbmRJbmRleChcbiAgICAgICAgICAgIChyaXNrQ2F0ZWdvcnk6IGFueSkgPT4gcmlza0NhdGVnb3J5LmNhdGVnb3J5X2lkID09IGV2ZW50LmNhdGVnb3J5X2lkXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKHJpc2tDYXRlZ29yeUluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGNvbnN0IHBhcmVudDogYW55ID1cbiAgICAgICAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJpc2tDYXRlZ29yaWVzW3Jpc2tDYXRlZ29yeUluZGV4XTtcbiAgICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSaXNrQ2F0ZWdvcmllcy5zcGxpY2UoXG4gICAgICAgICAgICByaXNrQ2F0ZWdvcnlJbmRleCxcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwYXJlbnQ/LmNoaWxkX2NhdF9pZHM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHBhcmVudC5jaGlsZF9jYXRfaWRzLmZvckVhY2goKGNoaWxkRWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbW92ZUluZGV4ID1cbiAgICAgICAgICAgICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSaXNrQ2F0ZWdvcmllcy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgICAgICAocmVtb3ZlRWxlbWVudDogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgICByZW1vdmVFbGVtZW50LmNhdGVnb3J5X2lkID09IGNoaWxkRWxlbWVudFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJpc2tDYXRlZ29yaWVzLnNwbGljZShyZW1vdmVJbmRleCwgMSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmlza0NhdGVnb3JpZXMuc3BsaWNlKHJpc2tDYXRlZ29yeUluZGV4LCAxKTtcbiAgICAgICAgaWYgKHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVycy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgIGlmICh0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXaWRnZXRzID0gdGhpcy5zZWxlY3RlZFdpZGdldHMuZmlsdGVyKFxuICAgICAgICAgICAgICAoZWxlbWVudDogYW55KSA9PiBlbGVtZW50Lm1vZHVsZV9uYW1lICE9ICdDT01QTElBTkNFJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJpc2tDYXRlZ29yaWVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkV2lkZ2V0cyA9IHRoaXMuc2VsZWN0ZWRXaWRnZXRzLmZpbHRlcihcbiAgICAgICAgICAgICAgKGVsZW1lbnQ6IGFueSkgPT4gZWxlbWVudC5tb2R1bGVfbmFtZSAhPSAnUklTSydcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHNldExpc3QobGlzdDogYW55W10sIGlkczogYW55W10sIGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0TGlzdEJ5SWRzKGxpc3QsIGlkcywgW2tleV0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRMaXN0QnlJZHMobGlzdDogYW55W10sIGlkczogYW55W10sIGtleXM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgZGF0YTogYW55W10gPSBbXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkgfHwgIUFycmF5LmlzQXJyYXkoaWRzKSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgaWRzLmZvckVhY2goKGlkOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldElkID1pZDtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBsaXN0LmZpbmRJbmRleChcbiAgICAgICAgICAobGlzdEVsZW1lbnQ6IGFueSkgPT5cbiAgICAgICAgICAgIGxpc3RFbGVtZW50Py5ba2V5XSA9PT0gdGFyZ2V0SWRcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG5cbiAgICAgICAgICBkYXRhLnB1c2gobGlzdFtpbmRleF0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwcml2YXRlIGZsYXR0ZW5SY1RyZWUobm9kZXM6IGFueSk6IGFueVtdIHtcbiAgICBjb25zdCBmbGF0OiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IHdhbGsgPSAoYXJyOiBhbnlbXSkgPT4ge1xuICAgICAgKGFyciA/PyBbXSkuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICBpZiAoIW5vZGUgfHwgdHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZsYXQucHVzaChub2RlKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobm9kZS5jaGlsZHJlbikpIHtcbiAgICAgICAgICB3YWxrKG5vZGUuY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUuaXRlbXMpKSB7XG4gICAgICAgICAgd2Fsayhub2RlLml0ZW1zKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGVzKSkge1xuICAgICAgd2Fsayhub2Rlcyk7XG4gICAgICByZXR1cm4gZmxhdC5sZW5ndGggPyBmbGF0IDogbm9kZXM7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGVzPy5kYXRhKSkge1xuICAgICAgd2Fsayhub2Rlcy5kYXRhKTtcbiAgICAgIHJldHVybiBmbGF0O1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBwcml2YXRlIGdldFJjTm9kZUlkKHJjOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiByYz8uaXRlbV9pZCA/PyByYz8ucmNfaWQgPz8gcmM/LnJjaWQgPz8gcmM/LmlkO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0TmVzdGVkQ2hpbGRJZHMobm9kZTogYW55KTogYW55W10ge1xuICAgIGNvbnN0IGlkczogYW55W10gPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3Qgd2FsayA9IChuOiBhbnkpID0+IHtcbiAgICAgIFsuLi4obj8uY2hpbGRyZW4gPz8gW10pLCAuLi4obj8uaXRlbXMgPz8gW10pXS5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XG4gICAgICAgIGlmICghY2hpbGQgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpZCA9IHRoaXMuZ2V0UmNOb2RlSWQoY2hpbGQpO1xuICAgICAgICBjb25zdCBrZXkgPSBTdHJpbmcoaWQpO1xuICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiBpZCAhPT0gJycgJiYgIXNlZW4uaGFzKGtleSkpIHtcbiAgICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgICAgIGlkcy5wdXNoKGlkKTtcbiAgICAgICAgfVxuICAgICAgICB3YWxrKGNoaWxkKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgd2Fsayhub2RlKTtcbiAgICByZXR1cm4gaWRzO1xuICB9XG5cbiAgcHJpdmF0ZSBpc05lc3RlZFJjKHBhcmVudDogYW55LCBjYW5kaWRhdGU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhcmVudElkID0gcGFyZW50Py5pdGVtX2lkO1xuICAgIGNvbnN0IGNhbmRpZGF0ZUlkID0gY2FuZGlkYXRlPy5pdGVtX2lkO1xuICAgIGlmIChwYXJlbnRJZCA9PSBudWxsIHx8IGNhbmRpZGF0ZUlkID09IG51bGwgfHwgcGFyZW50SWQgPT0gY2FuZGlkYXRlSWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBhbmNlc3RvcklkcyA9IFtcbiAgICAgIC4uLihjYW5kaWRhdGU/LnBhcmVudF9yY19pZHMgPz8gW10pLFxuICAgICAgY2FuZGlkYXRlPy5wYXJlbnRJZCxcbiAgICAgIC4uLihBcnJheS5pc0FycmF5KGNhbmRpZGF0ZT8ucGFyZW50KSB8fCBjYW5kaWRhdGU/LnBhcmVudCA9PSBudWxsXG4gICAgICAgID8gW11cbiAgICAgICAgOiBbY2FuZGlkYXRlLnBhcmVudF0pLFxuICAgIF07XG4gICAgaWYgKGFuY2VzdG9ySWRzLnNvbWUoKGlkKSA9PiBpZCA9PSBwYXJlbnRJZCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudFBhdGggPSBBcnJheS5pc0FycmF5KHBhcmVudD8ucmNfbmFtZSkgPyBwYXJlbnQucmNfbmFtZSA6IFtdO1xuICAgIGNvbnN0IGNhbmRpZGF0ZVBhdGggPSBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZT8ucmNfbmFtZSlcbiAgICAgID8gY2FuZGlkYXRlLnJjX25hbWVcbiAgICAgIDogW107XG4gICAgcmV0dXJuIChcbiAgICAgIHBhcmVudFBhdGgubGVuZ3RoID4gMCAmJlxuICAgICAgY2FuZGlkYXRlUGF0aC5sZW5ndGggPiBwYXJlbnRQYXRoLmxlbmd0aCAmJlxuICAgICAgcGFyZW50UGF0aC5ldmVyeSgobmFtZTogYW55LCBpOiBudW1iZXIpID0+IGNhbmRpZGF0ZVBhdGhbaV0gPT09IG5hbWUpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUFsbERlc2NlbmRhbnRJZHMocGFyZW50OiBhbnksIGxpc3Q6IGFueVtdKTogYW55W10ge1xuICAgIGNvbnN0IHBhcmVudElkID0gcGFyZW50Py5pdGVtX2lkO1xuICAgIGNvbnN0IHJhd0lkcyA9IG5ldyBTZXQ8YW55PigpO1xuICAgIGNvbnN0IGFkZCA9IChpZDogYW55KSA9PiB7XG4gICAgICBpZiAoaWQgIT0gbnVsbCAmJiBpZCAhPT0gJycgJiYgaWQgIT0gcGFyZW50SWQpIHtcbiAgICAgICAgcmF3SWRzLmFkZChpZCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIChwYXJlbnQ/Lml0ZW1fY2hpbGRfaWRzID8/IFtdKS5mb3JFYWNoKGFkZCk7XG4gICAgdGhpcy5jb2xsZWN0TmVzdGVkQ2hpbGRJZHMocGFyZW50KS5mb3JFYWNoKGFkZCk7XG4gICAgKGxpc3QgPz8gW10pLmZvckVhY2goKHJjOiBhbnkpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzTmVzdGVkUmMocGFyZW50LCByYykpIHtcbiAgICAgICAgYWRkKHJjLml0ZW1faWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzb2x2ZWQ6IGFueVtdID0gW107XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHJhd0lkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgY29uc3QgbWF0Y2ggPSAobGlzdCA/PyBbXSkuZmluZChcbiAgICAgICAgKHJjOiBhbnkpID0+XG4gICAgICAgICAgcmM/Lml0ZW1faWQgPT0gaWQgfHxcbiAgICAgICAgICByYz8ucmNfaWQgPT0gaWQgfHxcbiAgICAgICAgICByYz8ucmNpZCA9PSBpZCB8fFxuICAgICAgICAgIHJjPy5pZCA9PSBpZFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkSWQgPSBtYXRjaD8uaXRlbV9pZCA/PyBpZDtcbiAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhyZXNvbHZlZElkKTtcbiAgICAgIGlmICghc2Vlbi5oYXMoa2V5KSAmJiByZXNvbHZlZElkICE9IHBhcmVudElkKSB7XG4gICAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICAgIHJlc29sdmVkLnB1c2gocmVzb2x2ZWRJZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc29sdmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVSY0xpc3QobGlzdDogYW55KTogYW55W10ge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5mbGF0dGVuUmNUcmVlKGxpc3QpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBpdGVtcy5tYXAoKHJjOiBhbnkpID0+ICh7XG4gICAgICAuLi5yYyxcbiAgICAgIHJjaWQ6IHJjPy5yY2lkID8/IHJjPy5yY19pZCA/PyByYz8uaXRlbV9pZCA/PyByYz8uaWQsXG4gICAgICBpdGVtX2lkOiByYz8uaXRlbV9pZCA/PyByYz8ucmNfaWQgPz8gcmM/LnJjaWQgPz8gcmM/LmlkLFxuICAgICAgaXRlbV9uYW1lOlxuICAgICAgICByYz8uaXRlbV9uYW1lID8/XG4gICAgICAgIHJjPy5pdGVtX25hbWVfc3RyaW5nID8/XG4gICAgICAgIChBcnJheS5pc0FycmF5KHJjPy5yY19uYW1lKSA/IHJjLnJjX25hbWUuam9pbignIDwgJykgOiByYz8ucmNfbmFtZSkgPz9cbiAgICAgICAgJycsXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQubWFwKChyYzogYW55KSA9PiAoe1xuICAgICAgLi4ucmMsXG4gICAgICBpdGVtX2NoaWxkX2lkczogdGhpcy5yZXNvbHZlQWxsRGVzY2VuZGFudElkcyhyYywgbm9ybWFsaXplZCksXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUmNGcm9tVHJlZSh0cmVlOiBhbnlbXSwgaWRzOiBudW1iZXJbXSk6IGFueVtdIHtcbiAgICBpZiAoIWlkcy5sZW5ndGggfHwgIXRyZWUubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGVkOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICAgIGlkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0SWQgPSBOdW1iZXIoaWQpO1xuICAgICAgY29uc3QgbWF0Y2ggPSB0cmVlLmZpbmQoXG4gICAgICAgIChyYykgPT5cbiAgICAgICAgICBOdW1iZXIocmM/Lml0ZW1faWQpID09PSB0YXJnZXRJZCB8fFxuICAgICAgICAgIE51bWJlcihyYz8ucmNfaWQpID09PSB0YXJnZXRJZCB8fFxuICAgICAgICAgIE51bWJlcihyYz8ucmNpZCkgPT09IHRhcmdldElkIHx8XG4gICAgICAgICAgTnVtYmVyKHJjPy5pZCkgPT09IHRhcmdldElkIHx8XG4gICAgICAgICAgcmM/Lml0ZW1fY2hpbGRfaWRzPy5zb21lKChjaGlsZElkOiBhbnkpID0+IE51bWJlcihjaGlsZElkKSA9PT0gdGFyZ2V0SWQpIHx8XG4gICAgICAgICAgcmM/Lml0ZW1fcGFyZW50X2lkcz8uc29tZSgocGFyZW50SWQ6IGFueSkgPT4gTnVtYmVyKHBhcmVudElkKSA9PT0gdGFyZ2V0SWQpXG4gICAgICApO1xuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBrZXkgPSBOdW1iZXIobWF0Y2g/Lml0ZW1faWQgPz8gbWF0Y2g/LnJjX2lkID8/IG1hdGNoPy5yY2lkID8/IGlkKTtcbiAgICAgIGlmICghc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgICBzZWxlY3RlZC5wdXNoKG1hdGNoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5UHJlcmVzb2x2ZWRSY0VudHJpZXMoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnBlbmRpbmdFZGl0UmNFbnRyaWVzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdHJlZSA9IHRoaXMucmVzcG9uc2liaWxpdHlDZW50ZXJzTGlzdCA/PyBbXTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMucGVuZGluZ0VkaXRSY0VudHJpZXMubWFwKChlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgcmNpZCA9IE51bWJlcihlbnRyeT8ucmNpZCA/PyBlbnRyeT8ucmNfaWQgPz8gZW50cnk/Lml0ZW1faWQpO1xuICAgICAgY29uc3QgZnJvbVRyZWUgPVxuICAgICAgICB0cmVlLmZpbmQoKHJjKSA9PiBOdW1iZXIocmM/Lml0ZW1faWQpID09PSByY2lkKSA/P1xuICAgICAgICB0cmVlLmZpbmQoKHJjKSA9PiBOdW1iZXIocmM/LnJjaWQpID09PSByY2lkKSA/P1xuICAgICAgICB0cmVlLmZpbmQoKHJjKSA9PiBOdW1iZXIocmM/LnJjX2lkKSA9PT0gcmNpZCk7XG4gICAgICByZXR1cm4gZnJvbVRyZWUgPyB7IC4uLmZyb21UcmVlIH0gOiB7IC4uLmVudHJ5IH07XG4gICAgfSk7XG4gICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzID0gc2VsZWN0ZWQ7XG4gICAgdGhpcy5wZW5kaW5nRWRpdFJjSWRzID0gc2VsZWN0ZWQubWFwKChyYykgPT5cbiAgICAgIE51bWJlcihyYz8ucmNpZCA/PyByYz8ucmNfaWQgPz8gcmM/Lml0ZW1faWQpXG4gICAgKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlQZW5kaW5nUmVzcG9uc2liaWxpdHlDZW50ZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFwcGx5UHJlcmVzb2x2ZWRSY0VudHJpZXMoKSkge1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucmNMaXN0TG9hZGVkIHx8ICF0aGlzLnBlbmRpbmdFZGl0UmNJZHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBzZWxlY3RlZCA9IHRoaXMuc2V0TGlzdEJ5SWRzKFxuICAgICAgdGhpcy5yZXNwb25zaWJpbGl0eUNlbnRlcnNMaXN0LFxuICAgICAgdGhpcy5wZW5kaW5nRWRpdFJjSWRzLFxuICAgICAgWydpdGVtX2lkJywgJ3JjaWQnLCAncmNfaWQnLCAnaWQnXVxuICAgICk7XG4gICAgaWYgKHNlbGVjdGVkLmxlbmd0aCA8IHRoaXMucGVuZGluZ0VkaXRSY0lkcy5sZW5ndGgpIHtcbiAgICAgIHNlbGVjdGVkID0gdGhpcy5yZXNvbHZlUmNGcm9tVHJlZShcbiAgICAgICAgdGhpcy5yZXNwb25zaWJpbGl0eUNlbnRlcnNMaXN0LFxuICAgICAgICB0aGlzLnBlbmRpbmdFZGl0UmNJZHNcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVycyA9IHNlbGVjdGVkO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgYmVnaW5FZGl0SHlkcmF0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGUgIT09ICdFRElUJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVkaXRIeWRyYXRpb25Db3VudCsrO1xuICAgIHRoaXMudkxvYWRlciA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIGZpbmlzaEVkaXRIeWRyYXRpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZSAhPT0gJ0VESVQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZWRpdEh5ZHJhdGlvbkNvdW50ID0gTWF0aC5tYXgoMCwgdGhpcy5lZGl0SHlkcmF0aW9uQ291bnQgLSAxKTtcbiAgICBpZiAodGhpcy5lZGl0SHlkcmF0aW9uQ291bnQgPT09IDApIHtcbiAgICAgIHRoaXMudkxvYWRlciA9IGZhbHNlO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdHJ5Q29tcGxldGVFZGl0SHlkcmF0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICdFRElUJyAmJiB0aGlzLmVkaXRIeWRyYXRpb25Db3VudCA9PT0gMCkge1xuICAgICAgdGhpcy52TG9hZGVyID0gZmFsc2U7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3cmFwRWRpdFJlcXVlc3Q8VD4oXG4gICAgcmVxdWVzdCQ6IE9ic2VydmFibGU8VD4sXG4gICAgb25OZXh0OiAodmFsdWU6IFQpID0+IHZvaWRcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ0VESVQnKSB7XG4gICAgICB0aGlzLmJlZ2luRWRpdEh5ZHJhdGlvbigpO1xuICAgIH1cbiAgICByZXF1ZXN0JFxuICAgICAgLnBpcGUoZmluYWxpemUoKCkgPT4gdGhpcy5maW5pc2hFZGl0SHlkcmF0aW9uKCkpKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IG9uTmV4dCxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IGNvbnNvbGUuZXJyb3IoZXJyKSxcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jUHJvZ3JhbXNGb3JFZGl0KGRhdGE6IGFueSk6IHZvaWQge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmh5ZHJhdGVQcm9ncmFtc0Zyb21EYXNoYm9hcmREYXRhKGRhdGEpO1xuICAgIHRoaXMuYXBwbHlQcm9ncmFtc0Zyb21EYXNoYm9hcmRJZHMoXG4gICAgICBleHRyYWN0UHJvZ3JhbUlkc0Zyb21EYXNoYm9hcmQoZGF0YSksXG4gICAgICBleHRyYWN0Q2F0ZWdvcnlJZHNGcm9tRGFzaGJvYXJkKGRhdGEpLFxuICAgICAgZ2V0U2VsZWN0ZWRQcm9ncmFtc01hcChkYXRhKSxcbiAgICAgIGRhdGE/LnByb2dyYW1cbiAgICApO1xuICAgIGNvbnN0IGNhdGVnb3J5SWRzID0gZXh0cmFjdENhdGVnb3J5SWRzRnJvbURhc2hib2FyZChkYXRhKTtcbiAgICBpZiAoY2F0ZWdvcnlJZHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBmcm9tQ29tcGxpYW5jZSA9IHRoaXMuc2V0TGlzdChcbiAgICAgICAgdGhpcy5hbGxDb21wbGlhbmNlQ2F0ZWdvcmllcyxcbiAgICAgICAgY2F0ZWdvcnlJZHMsXG4gICAgICAgICdjYXRlZ29yeV9pZCdcbiAgICAgICk7XG4gICAgICBpZiAoZnJvbUNvbXBsaWFuY2UubGVuZ3RoICYmICF0aGlzLmFsbFByb2dhbVNlbGVjdGVkLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmFwcGx5RmxhdFByb2dyYW1DYXRlZ29yaWVzKGZyb21Db21wbGlhbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXRoaXMuYWxsUHJvZ2FtU2VsZWN0ZWQubGVuZ3RoICYmXG4gICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMubGVuZ3RoXG4gICAgKSB7XG4gICAgICB0aGlzLmFsbFByb2dhbVNlbGVjdGVkID0gW1xuICAgICAgICAuLi50aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMsXG4gICAgICBdO1xuICAgIH1cbiAgICB0aGlzLnN5bmNQcm9ncmFtU2VsZWN0aW9uTWFwRnJvbUZvcm0oKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlQcm9ncmFtc0Zyb21EYXNoYm9hcmRJZHMoXG4gICAgcHJvZ3JhbUlkczogbnVtYmVyW10sXG4gICAgY2F0ZWdvcnlJZHM6IG51bWJlcltdLFxuICAgIHNlbGVjdGVkUHJvZ3JhbXNNYXA/OiBSZWNvcmQ8c3RyaW5nLCBhbnlbXT4sXG4gICAgcHJvZ3JhbVBheWxvYWQ/OiB7IGFsbF9wcm9ncmFtcz86IGFueVtdOyBzZWxlY3RlZF9wcm9ncmFtcz86IGFueSB9XG4gICk6IHZvaWQge1xuICAgIGlmIChjYXRlZ29yeUlkcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMubG9hZFByb2dyYW1zRm9yRWRpdChcbiAgICAgICAgcHJvZ3JhbUlkcyxcbiAgICAgICAgY2F0ZWdvcnlJZHMsXG4gICAgICAgIHNlbGVjdGVkUHJvZ3JhbXNNYXAsXG4gICAgICAgIHByb2dyYW1QYXlsb2FkXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocHJvZ3JhbUlkcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMucmVzb2x2ZVByb2dyYW1JZHNGb3JFZGl0KHByb2dyYW1JZHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlUHJvZ3JhbVNlbGVjdGlvbk1hcEZvckxpc3QoKTogdm9pZCB7XG4gICAgaWYgKGhhc1Byb2dyYW1TZWxlY3Rpb25Jbk1hcCh0aGlzLnNlbGVjdGVkUHJvZ3JhbXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNhdGVnb3J5SWRzID0gbm9ybWFsaXplSWRBcnJheShcbiAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcz8ubWFwKFxuICAgICAgICAoYzogYW55KSA9PiBjPy5jYXRlZ29yeV9pZCA/PyBjPy5pZFxuICAgICAgKSA/PyBbXVxuICAgICk7XG4gICAgY29uc3QgcHJvZ3JhbUlkcyA9IFtcbiAgICAgIC4uLm5ldyBTZXQoXG4gICAgICAgICh0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMgPz8gW10pLm1hcChcbiAgICAgICAgICAoYzogYW55KSA9PiBOdW1iZXIoYz8ucHJvZ3JhbUlkID8/IGM/LnByb2dyYW1faWQgPz8gYz8ucGFyZW50SWQpXG4gICAgICAgIClcbiAgICAgICksXG4gICAgXS5maWx0ZXIoKGlkKSA9PiAhTnVtYmVyLmlzTmFOKGlkKSk7XG4gICAgaWYgKHByb2dyYW1JZHMubGVuZ3RoIHx8IGNhdGVnb3J5SWRzLmxlbmd0aCkge1xuICAgICAgdGhpcy5sb2FkUHJvZ3JhbXNGb3JFZGl0KHByb2dyYW1JZHMsIGNhdGVnb3J5SWRzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5UHJvZ3JhbVNlbGVjdGlvbk1hcChtYXA6IFJlY29yZDxzdHJpbmcsIGFueVtdPik6IHZvaWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVQcm9ncmFtU2VsZWN0aW9uTWFwKG1hcCk7XG4gICAgaWYgKCFub3JtYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRQcm9ncmFtcyA9IG5vcm1hbGl6ZWQ7XG4gICAgdGhpcy5hbGxQcm9nYW1TZWxlY3RlZCA9IGZsYXR0ZW5Qcm9ncmFtU2VsZWN0aW9uTWFwKHRoaXMuc2VsZWN0ZWRQcm9ncmFtcyk7XG4gICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzID1cbiAgICAgIG5vcm1hbGl6ZVByb2dyYW1DYXRlZ29yaWVzKHRoaXMuYWxsUHJvZ2FtU2VsZWN0ZWQpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2F0ZWdvcnlNYXRjaGVzSWQoY2F0OiBhbnksIGNhdGVnb3J5SWRTZXQ6IFNldDxudW1iZXI+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgaWQgPSBOdW1iZXIoY2F0Py5pZCk7XG4gICAgY29uc3QgY2F0ZWdvcnlJZCA9IE51bWJlcihjYXQ/LmNhdGVnb3J5X2lkKTtcbiAgICByZXR1cm4gKFxuICAgICAgKCFOdW1iZXIuaXNOYU4oaWQpICYmIGNhdGVnb3J5SWRTZXQuaGFzKGlkKSkgfHxcbiAgICAgICghTnVtYmVyLmlzTmFOKGNhdGVnb3J5SWQpICYmIGNhdGVnb3J5SWRTZXQuaGFzKGNhdGVnb3J5SWQpKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRQcm9ncmFtc0ZvckVkaXQoXG4gICAgcHJvZ3JhbUlkczogbnVtYmVyW10sXG4gICAgY2F0ZWdvcnlJZHM6IG51bWJlcltdID0gW10sXG4gICAgc2VsZWN0ZWRQcm9ncmFtc01hcD86IFJlY29yZDxzdHJpbmcsIGFueVtdPixcbiAgICBwcm9ncmFtUGF5bG9hZD86IHsgYWxsX3Byb2dyYW1zPzogYW55W107IHNlbGVjdGVkX3Byb2dyYW1zPzogYW55IH1cbiAgKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgc2VsZWN0ZWRQcm9ncmFtc01hcCAmJlxuICAgICAgdHlwZW9mIHNlbGVjdGVkUHJvZ3JhbXNNYXAgPT09ICdvYmplY3QnICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShzZWxlY3RlZFByb2dyYW1zTWFwKSAmJlxuICAgICAgaGFzUHJvZ3JhbVNlbGVjdGlvbkluTWFwKHNlbGVjdGVkUHJvZ3JhbXNNYXApXG4gICAgKSB7XG4gICAgICB0aGlzLmFwcGx5UHJvZ3JhbVNlbGVjdGlvbk1hcChzZWxlY3RlZFByb2dyYW1zTWFwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBwcm9ncmFtUGF5bG9hZCAmJlxuICAgICAgdGhpcy5oeWRyYXRlUHJvZ3JhbXNGcm9tRGFzaGJvYXJkRGF0YSh7IHByb2dyYW06IHByb2dyYW1QYXlsb2FkIH0pXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFwcm9ncmFtSWRzLmxlbmd0aCAmJiAhY2F0ZWdvcnlJZHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGVQcm9ncmFtSHlkcmF0aW9uID0gKCkgPT4gdGhpcy5maW5pc2hFZGl0SHlkcmF0aW9uKCk7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ0VESVQnKSB7XG4gICAgICB0aGlzLmJlZ2luRWRpdEh5ZHJhdGlvbigpO1xuICAgIH1cblxuICAgIHRoaXMuY3JlYXRlRGFzaGJvYXJkU2VydmljZS5nZXRTYWlsc1Byb2dyYW1MaXN0KCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBwcm9ncmFtcyA9IHBhcnNlU2FpbHNQcm9ncmFtTGlzdChyZXMpO1xuICAgICAgICBjb25zdCByZWxldmFudFByb2dyYW1zID1cbiAgICAgICAgICBwcm9ncmFtSWRzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gcHJvZ3JhbXMuZmlsdGVyKChwOiBhbnkpID0+IHByb2dyYW1JZHMuaW5jbHVkZXMoTnVtYmVyKHA/LmlkKSkpXG4gICAgICAgICAgICA6IHByb2dyYW1zO1xuXG4gICAgICAgIGlmICghY2F0ZWdvcnlJZHMubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKHByb2dyYW1JZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVQcm9ncmFtSWRzRm9yRWRpdChwcm9ncmFtSWRzLCBwcm9ncmFtcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbXBsZXRlUHJvZ3JhbUh5ZHJhdGlvbigpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhdGVnb3J5SWRTZXQgPSBuZXcgU2V0KGNhdGVnb3J5SWRzKTtcbiAgICAgICAgY29uc3QgcHJvZ3JhbXNUb0ZldGNoID1cbiAgICAgICAgICByZWxldmFudFByb2dyYW1zLmxlbmd0aCA+IDAgPyByZWxldmFudFByb2dyYW1zIDogcHJvZ3JhbXM7XG5cbiAgICAgICAgaWYgKCFwcm9ncmFtc1RvRmV0Y2gubGVuZ3RoKSB7XG4gICAgICAgICAgY29tcGxldGVQcm9ncmFtSHlkcmF0aW9uKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2F0ZWdvcnlSZXF1ZXN0cyA9IHByb2dyYW1zVG9GZXRjaC5tYXAoKHByb2dyYW06IGFueSkgPT5cbiAgICAgICAgICB0aGlzLmNyZWF0ZURhc2hib2FyZFNlcnZpY2UuZ2V0UHJvZ3JhbUNhdGVnb3JpZXMocHJvZ3JhbS5pZCkucGlwZShcbiAgICAgICAgICAgIG1hcCgoY2F0UmVzOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgIHByb2dyYW0sXG4gICAgICAgICAgICAgIGNhdGVnb3JpZXM6IGNhdFJlcz8uZGF0YT8uY2F0ZWdvcmllcyA/PyBjYXRSZXM/LmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGZvcmtKb2luKGNhdGVnb3J5UmVxdWVzdHMpXG4gICAgICAgICAgLnBpcGUoZmluYWxpemUoKCkgPT4gY29tcGxldGVQcm9ncmFtSHlkcmF0aW9uKCkpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKHJhd1Jlc3VsdHM6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHJhd1Jlc3VsdHMgYXMgQXJyYXk8e1xuICAgICAgICAgICAgICAgIHByb2dyYW06IGFueTtcbiAgICAgICAgICAgICAgICBjYXRlZ29yaWVzOiBhbnlbXTtcbiAgICAgICAgICAgICAgfT47XG4gICAgICAgICAgICAgIGNvbnN0IG1hcDogUmVjb3JkPHN0cmluZywgYW55W10+ID0ge307XG4gICAgICAgICAgICAgIHJlc3VsdHMuZm9yRWFjaCgoeyBwcm9ncmFtLCBjYXRlZ29yaWVzIH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IChjYXRlZ29yaWVzID8/IFtdKS5maWx0ZXIoKGNhdDogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeU1hdGNoZXNJZChjYXQsIGNhdGVnb3J5SWRTZXQpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICBtYXBbU3RyaW5nKHByb2dyYW0uaWQpXSA9IHNlbGVjdGVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmIChoYXNQcm9ncmFtU2VsZWN0aW9uSW5NYXAobWFwKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlQcm9ncmFtU2VsZWN0aW9uTWFwKG1hcCk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5hbGxQcm9nYW1TZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNQcm9ncmFtU2VsZWN0aW9uTWFwRnJvbUZvcm0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiBjb25zb2xlLmVycm9yKGVyciksXG4gICAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICBjb21wbGV0ZVByb2dyYW1IeWRyYXRpb24oKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQ3VzdG9tIGRhc2hib2FyZHMgb2Z0ZW4gc3RvcmUgcHJvZ3JhbSBpZHMgb25seSDigJQgcmVzb2x2ZSBuYW1lcyBmb3IgZm9ybSBjaGlwcy4gKi9cbiAgcHJpdmF0ZSByZXNvbHZlUHJvZ3JhbUlkc0ZvckVkaXQoXG4gICAgcHJvZ3JhbUlkczogbnVtYmVyW10sXG4gICAgcHJvZ3JhbXNGcm9tTGlzdD86IGFueVtdXG4gICk6IHZvaWQge1xuICAgIGlmICghcHJvZ3JhbUlkcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYXBwbHkgPSAocHJvZ3JhbXM6IGFueVtdKSA9PiB7XG4gICAgICBjb25zdCBtYXRjaGVkID0gcHJvZ3JhbXMuZmlsdGVyKChwOiBhbnkpID0+XG4gICAgICAgIHByb2dyYW1JZHMuaW5jbHVkZXMoTnVtYmVyKHA/LmlkKSlcbiAgICAgICk7XG4gICAgICBpZiAoIW1hdGNoZWQubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNoaXBzID0gbWF0Y2hlZC5tYXAoKHA6IGFueSkgPT4gKHtcbiAgICAgICAgaWQ6IHAuaWQsXG4gICAgICAgIGNhdGVnb3J5X2lkOiBwLmlkLFxuICAgICAgICBuYW1lOiBwLm5hbWUsXG4gICAgICAgIGl0ZW1fbmFtZTogcC5uYW1lLFxuICAgICAgICBwcm9ncmFtSWQ6IHAuaWQsXG4gICAgICB9KSk7XG4gICAgICB0aGlzLmFsbFByb2dhbVNlbGVjdGVkID0gbm9ybWFsaXplUHJvZ3JhbUNhdGVnb3JpZXMoY2hpcHMpO1xuICAgICAgdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzID0gW1xuICAgICAgICAuLi50aGlzLmFsbFByb2dhbVNlbGVjdGVkLFxuICAgICAgXTtcbiAgICAgIGNvbnN0IG1hcDogUmVjb3JkPHN0cmluZywgYW55W10+ID0ge307XG4gICAgICBtYXRjaGVkLmZvckVhY2goKHA6IGFueSkgPT4ge1xuICAgICAgICBtYXBbU3RyaW5nKHAuaWQpXSA9IFtdO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnNlbGVjdGVkUHJvZ3JhbXMgPSBtYXA7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfTtcblxuICAgIGlmIChwcm9ncmFtc0Zyb21MaXN0Py5sZW5ndGgpIHtcbiAgICAgIGFwcGx5KHByb2dyYW1zRnJvbUxpc3QpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdFRElUJykge1xuICAgICAgdGhpcy5iZWdpbkVkaXRIeWRyYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5jcmVhdGVEYXNoYm9hcmRTZXJ2aWNlXG4gICAgICAuZ2V0U2FpbHNQcm9ncmFtTGlzdCgpXG4gICAgICAucGlwZShmaW5hbGl6ZSgoKSA9PiB0aGlzLmZpbmlzaEVkaXRIeWRyYXRpb24oKSkpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgYXBwbHkocGFyc2VTYWlsc1Byb2dyYW1MaXN0KHJlcykpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcihlcnIpLFxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRWRpdERhc2hib2FyZERhdGEoKTogYW55IHtcbiAgICBjb25zdCByb3cgPSB0aGlzLmRhc2hib2FyZERldGFpbHMgPz8ge307XG4gICAgY29uc3QgY29yZSA9IHJvdz8uZGFzaGJvYXJkX2RldGFpbHMgPz8gcm93Py5kYXNoYm9hcmQgPz8gcm93O1xuICAgIGNvbnN0IHByb2dyYW1Tb3VyY2UgPVxuICAgICAgY29yZT8ucHJvZ3JhbXMgXG4gICAgY29uc3QgcmNTb3VyY2UgPVxuICAgICAgY29yZT8ucmVzcG9uc2liaWxpdHlDZW50ZXJzXG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ucm93LFxuICAgICAgLi4uY29yZSxcbiAgICAgIGNkaWQ6IGNvcmU/LmNkaWQgPz8gcm93Py5jZGlkLFxuICAgICAgZGFzaGJvYXJkX25hbWU6IGNvcmU/Lm5hbWUgPz8gcm93Py5kYXNoYm9hcmRfbmFtZSxcbiAgICAgIG5hbWU6IGNvcmU/Lm5hbWUgPz8gcm93Py5kYXNoYm9hcmRfbmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBjb3JlPy5kZXNjcmlwdGlvbiA/PyByb3c/LmRlc2NyaXB0aW9uLFxuICAgICAgdmlld2VyczogY29yZT8udmlld2VycyA/PyByb3c/LnZpZXdlcnMsXG4gICAgICB2aXNpYmxlX3RvX3VzZXJzOiBjb3JlPy52aXNpYmxlX3RvX3VzZXJzID8/IHJvdz8udmlzaWJsZV90b191c2VycyxcbiAgICAgIHZpc2libGVfdG9fZ3JvdXBzOiBjb3JlPy52aXNpYmxlX3RvX2dyb3VwcyA/PyByb3c/LnZpc2libGVfdG9fZ3JvdXBzLFxuICAgICAgcHJvZ3JhbXM6IHByb2dyYW1Tb3VyY2UsXG4gICAgICBwcm9ncmFtSWQ6IGV4dHJhY3RQcm9ncmFtSWRzRnJvbURhc2hib2FyZCh7XG4gICAgICAgIHByb2dyYW1zOiBwcm9ncmFtU291cmNlLFxuICAgICAgICBwcm9ncmFtOiBjb3JlPy5wcm9ncmFtID8/IHJvdz8ucHJvZ3JhbSxcbiAgICAgIH0pLFxuICAgICAgcmVzcG9uc2liaWxpdHlfY2F0ZWdvcnk6XG4gICAgICAgIGNvcmU/LnJlc3BvbnNpYmlsaXR5X2NhdGVnb3J5ID8/XG4gICAgICAgIHJvdz8ucmVzcG9uc2liaWxpdHlfY2F0ZWdvcnkgPz9cbiAgICAgICAgY29yZT8ucmVzcG9uc2liaWxpdHlDYXRlZ29yeSA/P1xuICAgICAgICBbXSxcbiAgICAgIHJjSWQ6IGNvcmUucmNJZCxcbiAgICAgIHNlbGVjdGVkUmNFbnRyaWVzOlxuICAgICAgICByb3c/LnNlbGVjdGVkUmNFbnRyaWVzID8/XG4gICAgICAgIGNvcmU/LnNlbGVjdGVkUmNFbnRyaWVzID8/XG4gICAgICAgIFtdLFxuICAgICAgcmVzcG9uc2liaWxpdHlDZW50ZXJzOiByY1NvdXJjZSxcbiAgICAgIHJlc3BvbnNpYmlsaXR5X2NlbnRlcjogcmNTb3VyY2UsXG4gICAgICByZXNwb25zaWJpbGl0eUNlbnRlcklkOiBjb3JlLnJjSWQsXG4gICAgICBwcm9ncmFtOiBjb3JlPy5wcm9ncmFtID8/IHJvdz8ucHJvZ3JhbSxcbiAgICAgIHRpbWVmcmFtZTpcbiAgICAgICAgY29yZT8udGltZWZyYW1lID8/XG4gICAgICAgIChyb3c/LnRpbWVfZnJhbWVfZnJvbSB8fCByb3c/LnRpbWVfZnJhbWVfdG9cbiAgICAgICAgICA/IHsgZnJvbTogcm93Py50aW1lX2ZyYW1lX2Zyb20sIHRvOiByb3c/LnRpbWVfZnJhbWVfdG8gfVxuICAgICAgICAgIDogdW5kZWZpbmVkKSxcbiAgICAgIHRpbWVfZnJhbWVfZnJvbTpcbiAgICAgICAgY29yZT8udGltZWZyYW1lPy5mcm9tID8/XG4gICAgICAgIGNvcmU/LnRpbWVmcmFtZT8uc3RhcnRfZGF0ZSA/P1xuICAgICAgICByb3c/LnRpbWVfZnJhbWVfZnJvbSxcbiAgICAgIHRpbWVfZnJhbWVfdG86XG4gICAgICAgIGNvcmU/LnRpbWVmcmFtZT8udG8gPz8gY29yZT8udGltZWZyYW1lPy5lbmRfZGF0ZSA/PyByb3c/LnRpbWVfZnJhbWVfdG8sXG4gICAgICBjcmVhdGVkX2J5OiBjb3JlPy5jcmVhdGVkQnkgPz8gY29yZT8uY3JlYXRlZF9ieSA/PyByb3c/LmNyZWF0ZWRfYnksXG4gICAgICBjcmVhdGVkQnk6IGNvcmU/LmNyZWF0ZWRCeSA/PyBjb3JlPy5jcmVhdGVkX2J5ID8/IHJvdz8uY3JlYXRlZEJ5LFxuICAgIH07XG4gIH1cbiAgc3VibWl0dGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgaWQncyBmcm9tIGEgcGFydGljdWxhciBsaXN0IGVsZW1lbnRzXG4gICAqIEBwYXJhbSBsaXN0IGFjdHVhbCBzZWxlY3RlZCBsaXN0XG4gICAqIEBwYXJhbSBrZXkgY29udGFpbnMga2V5IHRvIGV4dHJhY3QgaWQgZnJvbSB0aGUgbGlzdFxuICAgKi9cbiAgcmV0dXJuSWRzKGxpc3Q6IGFueVtdLCBrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBsaXN0Py5tYXAoKGVsZSkgPT4ge1xuICAgICAgaWYgKGVsZVtrZXldKSB7XG4gICAgICAgIHJldHVybiBlbGVba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIGRhdGEgc3VibWl0dGVkIG9uIGNyZWF0ZSBkYXNoYm9hcmQgZm9ybVxuICAgKi9cbiAgdmFsaWRhdGVEYXNoYm9hcmQoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnN1Ym1pdHRlZCA9IHRydWU7XG4gICAgfSwgMTAwKTtcbiAgICBjb25zdCBldmVudCA9IHRoaXMuZGFzaGJvYXJkRm9ybS5kYXNoYm9hcmROYW1lO1xuICAgIGNvbnN0IHJlID0gLyZuYnNwO3w8YnI+L2c7XG4gICAgdGhpcy5kYXNoYm9hcmRGb3JtLmRhc2hib2FyZE5hbWUgPSBldmVudC5yZXBsYWNlKHJlLCAnJykudHJpbSgpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdGhpcy5kYXNoYm9hcmRGb3JtLmRhc2hib2FyZERlc2NyaXB0aW9uVGV4dDtcbiAgICB0aGlzLmRhc2hib2FyZEZvcm0uZGFzaGJvYXJkRGVzY3JpcHRpb25UZXh0ID0gZGVzY3JpcHRpb25cbiAgICAgIC5yZXBsYWNlKHJlLCAnJylcbiAgICAgIC50cmltKCk7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuZGFzaGJvYXJkRm9ybS5kYXNoYm9hcmROYW1lIHx8XG4gICAgICB0aGlzLmRhc2hib2FyZEZvcm0uZGFzaGJvYXJkTmFtZS50cmltKCkgPT0gJycgfHxcbiAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5kYXNoYm9hcmROYW1lLmxlbmd0aCA+IDMwIHx8XG4gICAgICB0aGlzLnRleHRDb3VudC50cmFuc2Zvcm0odGhpcy5kYXNoYm9hcmRGb3JtPy5kYXNoYm9hcmREZXNjcmlwdGlvblRleHQpID5cbiAgICAgICAgMjUwIHx8XG4gICAgICAodGhpcy5kYXNoYm9hcmRGb3JtPy5zZWxlY3RlZEZyb21EYXRlICYmXG4gICAgICAgICF0aGlzLmRhc2hib2FyZEZvcm0/LnNlbGVjdGVkVG9EYXRlKSB8fFxuICAgICAgKHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVycy5sZW5ndGggPT0gMClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgYW4gYXBpIGNhbGwgdG8gY3JlYXRlIGEgZGFzaGJvYWRcbiAgICogQHBhcmFtIGRhc2hib2FyZCBjb250YWlucyBkYXNoYm9hcmRGb3JtIGRhdGFcbiAgICovXG4gIHN1Ym1pdERhc2hib2FyZCgpIHtcbiAgICB0aGlzLnN1Ym1pdHRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHZhbGlkID0gdGhpcy52YWxpZGF0ZURhc2hib2FyZCgpO1xuICAgIGlmICghdmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy52TG9hZGVyID0gdHJ1ZTtcbiAgICBjb25zdCBkYXNoYm9hcmQgPSB0aGlzLmRhc2hib2FyZEZvcm07XG4gICAgY29uc3QgcGF5bG9hZDogYW55ID0ge1xuICAgICAgdmlld2VyOiB7XG4gICAgICAgIHVzZXJJZDogdGhpcy5yZXR1cm5JZHMoZGFzaGJvYXJkLnNlbGVjdGVkVmlld2VycywgJ3VpZCcpLFxuICAgICAgICB1c2VyR3JvdXBJZDogdGhpcy5yZXR1cm5JZHMoZGFzaGJvYXJkLnNlbGVjdGVkR3JvdXAsICd1Z2lkJyksXG4gICAgICB9LFxuXG4gICAgICB3aWRnZXRfZGV0YWlsczogZGFzaGJvYXJkLmNvbmZpZ3VyZVdpZGdldCxcbiAgICAgIGRhc2hib2FyZF9pZDogdGhpcy5kYXNoYm9hcmRJZCxcbiAgICB9O1xuICBcbiAgICB0aGlzLmNyZWF0ZURhc2hib2FyZFNlcnZpY2Uuc2F2ZVdpZGdldERldGFpbHMocGF5bG9hZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLyBzYXZlV2lkZ2V0RGV0YWlscyBjYW4gcmV0dXJuIGZyZXNoZXN0IGJyaWRnZSBpZDsgbWVyZ2UgaXQgZm9yIHJlZGlyZWN0LlxuICAgICAgICBjb25zdCB3aWRnZXRQYXlsb2FkID0gcmVzPy5kYXRhID8/IHJlcyA/PyB7fTtcbiAgICAgICAgdGhpcy5jcmVhdGVkRGFzaGJvYXJkID0ge1xuICAgICAgICAgIC4uLih0aGlzLmNyZWF0ZWREYXNoYm9hcmQgPz8ge30pLFxuICAgICAgICAgIC4uLih3aWRnZXRQYXlsb2FkPy5kYXNoYm9hcmQgPz8ge30pLFxuICAgICAgICAgIGNkZGlkOlxuICAgICAgICAgICAgdGhpcy5jcmVhdGVkRGFzaGJvYXJkPy5jZGRpZCA/P1xuICAgICAgICAgICAgd2lkZ2V0UGF5bG9hZD8uY2RkaWQgPz9cbiAgICAgICAgICAgIHdpZGdldFBheWxvYWQ/LmNkaWQgPz9cbiAgICAgICAgICAgIHdpZGdldFBheWxvYWQ/LmRhc2hib2FyZF9icmlkZ2VfaWQsXG4gICAgICAgICAgY2RpZDpcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlZERhc2hib2FyZD8uY2RpZCA/P1xuICAgICAgICAgICAgd2lkZ2V0UGF5bG9hZD8uY2RpZCA/P1xuICAgICAgICAgICAgd2lkZ2V0UGF5bG9hZD8uY2RkaWQgPz9cbiAgICAgICAgICAgIHdpZGdldFBheWxvYWQ/LmRhc2hib2FyZF9icmlkZ2VfaWQsXG4gICAgICAgICAgZGFzaGJvYXJkX2JyaWRnZV9pZDpcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlZERhc2hib2FyZD8uZGFzaGJvYXJkX2JyaWRnZV9pZCA/P1xuICAgICAgICAgICAgd2lkZ2V0UGF5bG9hZD8uZGFzaGJvYXJkX2JyaWRnZV9pZCA/P1xuICAgICAgICAgICAgd2lkZ2V0UGF5bG9hZD8uZGFzaGJvYXJkQnJpZGdlSWQsXG4gICAgICAgICAgZGFzaGJvYXJkQnJpZGdlSWQ6XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZWREYXNoYm9hcmQ/LmRhc2hib2FyZEJyaWRnZUlkID8/XG4gICAgICAgICAgICB3aWRnZXRQYXlsb2FkPy5kYXNoYm9hcmRCcmlkZ2VJZCA/P1xuICAgICAgICAgICAgd2lkZ2V0UGF5bG9hZD8uZGFzaGJvYXJkX2JyaWRnZV9pZCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRJZCA9IHRoaXMuZ2V0Q3JlYXRlZERhc2hib2FyZENkaWQoKTtcbiAgICAgICAgdGhpcy52TG9hZGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNTbWlsZXkgPSB0cnVlO1xuICAgICAgICB0aGlzLnNtaWxleU1lc3NhZ2UgPSB0aGlzLm1vZGUgPT09ICdFRElUJyA/ICdUaGUgZGFzaGJvYXJkIGhhcyBiZWVuIHVwZGF0ZWQuJyA6ICdUaGUgZGFzaGJvYXJkIGhhcyBiZWVuIGNyZWF0ZWQuJztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pc1NtaWxleSA9IGZhbHNlO1xuICAgICAgICAgIGNvbnN0IGNkaWQgPSB0aGlzLmdldENyZWF0ZWREYXNoYm9hcmRDZGlkKCk7XG4gICAgICAgICAgY29uc3QgY2xvc2VNb2RlID0gdGhpcy5yZWRpcmVjdEFmdGVyQ3JlYXRlXG4gICAgICAgICAgICA/ICdjcmVhdGVkJ1xuICAgICAgICAgICAgOiB0aGlzLm1vZGUgPT09ICdFRElUJ1xuICAgICAgICAgICAgICA/ICd1cGRhdGVkJ1xuICAgICAgICAgICAgICA6ICdjcmVhdGVkJztcbiAgICAgICAgICB0aGlzLnJlZGlyZWN0QWZ0ZXJDcmVhdGUgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmNsb3NlLmVtaXQoe1xuICAgICAgICAgICAgbW9kZTogY2xvc2VNb2RlLFxuICAgICAgICAgICAgaWQ6IGNkaWQsXG4gICAgICAgICAgICBjZGlkLFxuICAgICAgICAgICAgZGFzaGJvYXJkQnJpZGdlSWQ6XG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlZERhc2hib2FyZD8uZGFzaGJvYXJkX2JyaWRnZV9pZCA/P1xuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZWREYXNoYm9hcmQ/LmRhc2hib2FyZEJyaWRnZUlkLFxuICAgICAgICAgICAgZGFzaGJvYXJkOiB0aGlzLmNyZWF0ZWREYXNoYm9hcmQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIDMwMDApO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdzYXZlV2lkZ2V0RGV0YWlscyBlcnJvciA9PicsIGVycm9yKTtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5zaG93KGVycm9yLmVycm9yLnN0YXR1c01lc3NhZ2UsICdhbGVydCcpO1xuICAgICAgICB0aGlzLnZMb2FkZXIgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KVxuXG5cbiAgfVxuXG4gIGNsb3NlQ29udGFpbmVyKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHRoaXMuY2xvc2UuZW1pdChtZXNzYWdlKTtcbiAgfVxuXG4gIG9uU3VibWl0RGFzaGJvYXJkKCkge1xuICAgIGNvbnN0IGRhc2hib2FyZCA9IHRoaXMuZGFzaGJvYXJkRm9ybTtcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XG4gICAgICBkYXNoYm9hcmRfbmFtZTogZGFzaGJvYXJkLmRhc2hib2FyZE5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogW1xuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogZGFzaGJvYXJkLmRhc2hib2FyZERlc2NyaXB0aW9uVGV4dCxcbiAgICAgICAgICBhdHRhY2htZW50czogW10sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdmlzaWJsZV90b191c2VyczogdGhpcy5yZXR1cm5JZHMoZGFzaGJvYXJkLnNlbGVjdGVkVmlld2VycywgJ3VpZCcpLFxuICAgICAgdmlzaWJsZV90b19ncm91cHM6IHRoaXMucmV0dXJuSWRzKGRhc2hib2FyZC5zZWxlY3RlZEdyb3VwLCAndWdpZCcpLFxuICAgICAgcmVzcG9uc2liaWxpdHlfY2VudGVyOiB0aGlzLnJldHVybklkcyhcbiAgICAgICAgZGFzaGJvYXJkLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzLFxuICAgICAgICAncmNpZCdcbiAgICAgICksXG4gICAgICByZXNwb25zaWJpbGl0eV9jYXRlZ29yeTogdGhpcy5yZXR1cm5JZHMoXG4gICAgICAgIGRhc2hib2FyZC5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcyxcbiAgICAgICAgJ2NhdGVnb3J5X2lkJ1xuICAgICAgKSxcbiAgICAgIHJpc2tfY2F0ZWdvcnk6IHRoaXMucmV0dXJuSWRzKFxuICAgICAgICBkYXNoYm9hcmQuc2VsZWN0ZWRSaXNrQ2F0ZWdvcmllcyxcbiAgICAgICAgJ2NhdGVnb3J5X2lkJ1xuICAgICAgKSxcbiAgICAgIGRpc3BsYXlfY3JpdGVyaWE6XG4gICAgICAgIGRhc2hib2FyZC5kaXNwbGF5Q3JpdGVyaWEgPT09ICdhbmQnXG4gICAgICAgICAgPyAnQk9USF9SQ19BTkRfQ0FURUdPUlknXG4gICAgICAgICAgOiAnUkNfT1JfQ0FURUdPUlknLFxuXG4gICAgICB3aWRnZXRfZGV0YWlsczogZGFzaGJvYXJkLmNvbmZpZ3VyZVdpZGdldCxcbiAgICAgIHByb2dyYW06IHtcbiAgICAgICAgYWxsX3Byb2dyYW1zOiB0aGlzLmFsbFByb2dhbVNlbGVjdGVkLFxuICAgICAgICBzZWxlY3RlZF9wcm9ncmFtczogdGhpcy5zZWxlY3RlZFByb2dyYW1zLFxuICAgICAgfSxcbiAgICAgIHRpbWVmcmFtZToge1xuICAgICAgICBzdGFydF9kYXRlOiBkYXNoYm9hcmQuc2VsZWN0ZWRGcm9tRGF0ZVxuICAgICAgICAgID8gdGhpcy5nZXREYXRlRm9ybWF0ZShkYXNoYm9hcmQ/LnNlbGVjdGVkRnJvbURhdGUpXG4gICAgICAgICAgOiAnJyxcbiAgICAgICAgZW5kX2RhdGU6IGRhc2hib2FyZC5zZWxlY3RlZFRvRGF0ZVxuICAgICAgICAgID8gdGhpcy5nZXREYXRlRm9ybWF0ZShkYXNoYm9hcmQ/LnNlbGVjdGVkVG9EYXRlKVxuICAgICAgICAgIDogJycsXG4gICAgICB9LFxuXG4gICAgfTtcbiAgICBjb25zdCBjcmVhdGVEYXNoYm9hcmRQYXlsb2FkID0gdGhpcy5jcmVhdGVEYXNoYm9hcmRTZXJ2aWNlLmJ1aWxkUGF5bG9hZChwYXlsb2FkKTtcbiAgICB0aGlzLnNhdmVEYXNoYm9hcmQoY3JlYXRlRGFzaGJvYXJkUGF5bG9hZCk7XG5cbiAgfVxuXG4gIHNhdmVEYXNoYm9hcmQocGF5bG9hZDogYW55KSB7XG4gICAgbGV0IGFwaUNhbGwgPSB0aGlzLmNyZWF0ZURhc2hib2FyZFNlcnZpY2UuY3JlYXRlRGFzaGJvYXJkKHBheWxvYWQpO1xuICAgIGlmKHRoaXMubW9kZSA9PT0gJ0VESVQnKSB7XG4gICAgICBhcGlDYWxsID0gdGhpcy5jcmVhdGVEYXNoYm9hcmRTZXJ2aWNlLnVwZGF0ZURhc2hib2FyZChwYXlsb2FkLCB0aGlzLmRhc2hib2FyZERldGFpbHM/LnJlY29yZElkKTtcbiAgICB9XG4gICAgYXBpQ2FsbC5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHdhc0NyZWF0ZSA9IHRoaXMubW9kZSA9PT0gJ0NSRUFURSc7XG4gICAgICAgIHRoaXMuY3JlYXRlZERhc2hib2FyZCA9IHJlcz8uZGF0YT8uZGFzaGJvYXJkID8/IG51bGw7XG4gICAgICAgIHRoaXMuZGFzaGJvYXJkRGV0YWlscyA9IHRoaXMuY3JlYXRlZERhc2hib2FyZFxuICAgICAgICB0aGlzLmRhc2hib2FyZElkID0gdGhpcy5nZXRDcmVhdGVkRGFzaGJvYXJkQ2RpZCgpO1xuICAgICAgICB0aGlzLmRhc2hib2FyZERldGFpbHNbJ3JlY29yZElkJ10gPSB0aGlzLmNyZWF0ZWREYXNoYm9hcmQ/LmlkXG4gICAgICAgIHRoaXMudkxvYWRlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9wZW5Db25maWd1cmVXaWRnZXRzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zaG93Q29tcGxpYW5jZVdpZGdldHMgPSBmYWxzZTtcbiAgICAgICAgaWYgKHdhc0NyZWF0ZSkge1xuICAgICAgICAgIHRoaXMucmVkaXJlY3RBZnRlckNyZWF0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tb2RlID0gJ0VESVQnXG5cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy52TG9hZGVyID0gZmFsc2U7XG4gICAgICAgIGlmKGVycm9yLnN0YXR1cyA9PSA0MjIpIHtcbiAgICAgICAgICB0aGlzLnNuYWNrQmFyLnNob3coXG4gICAgICAgICAgICBlcnJvci5lcnJvci5zdGF0dXNNZXNzYWdlLFxuICAgICAgICAgICAgJ2FsZXJ0J1xuICAgICAgICAgICk7ICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3JlYXRlZERhc2hib2FyZENkaWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXNoID0gdGhpcy5jcmVhdGVkRGFzaGJvYXJkO1xuICAgIGNvbnN0IGNkaWQgPVxuICAgICAgZGFzaD8uY2RkaWQgPz9cbiAgICAgIGRhc2g/LmNkaWQgPz9cbiAgICAgIGRhc2g/LmNkSWQgPz9cbiAgICAgIGRhc2g/LmRhc2hib2FyZF9icmlkZ2VfaWQgPz9cbiAgICAgIGRhc2g/LmRhc2hib2FyZEJyaWRnZUlkID8/XG4gICAgICBkYXNoPy5kYXNoYm9hcmQ/LmRhc2hib2FyZF9icmlkZ2VfaWQgPz9cbiAgICAgIHRoaXMuZGFzaGJvYXJkSWQ7XG4gICAgcmV0dXJuIGNkaWQgIT0gbnVsbCAmJiBjZGlkICE9PSAnJyA/IFN0cmluZyhjZGlkKSA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBoeWRyYXRlRWRpdEZvcm0oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWRpdEZvcm1IeWRyYXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVkaXRGb3JtSHlkcmF0ZWQgPSB0cnVlO1xuICAgIHRoaXMuZWRpdERhc2hib2FyZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVdpZGdldHNGcm9tR2V0V2lkZ2V0c1Jlc3BvbnNlKHdpZGdldHM6IHtcbiAgICB3aWRnZXRBcnI6IGFueVtdO1xuICAgIGFsbFdpZGdldHNBcnJheTogYW55W107XG4gIH0pOiB2b2lkIHtcbiAgICBjb25zdCBzYXZlZFdpZGdldHMgPSBmaWx0ZXJBY3RpdmVXaWRnZXRzKHdpZGdldHM/LndpZGdldEFyciA/PyBbXSk7XG4gICAgY29uc3QgY2F0YWxvZ1dpZGdldHMgPSB3aWRnZXRzPy5hbGxXaWRnZXRzQXJyYXk/Lmxlbmd0aFxuICAgICAgPyB3aWRnZXRzLmFsbFdpZGdldHNBcnJheVxuICAgICAgOiBzYXZlZFdpZGdldHM7XG4gICAgdGhpcy5kYXNoYm9hcmRGb3JtLmNvbmZpZ3VyZVdpZGdldCA9IHNhdmVkV2lkZ2V0cztcbiAgICB0aGlzLnNlbGVjdGVkV2lkZ2V0cyA9IFsuLi5zYXZlZFdpZGdldHNdO1xuICAgIHRoaXMuZGlzcGxheWVkV2lkZ2V0cyA9IFsuLi5jYXRhbG9nV2lkZ2V0c107XG4gIH1cblxuICAvKiogRURJVCBtb2RlIG9ubHk6IEdFVCBnZXRXaWRnZXRzP2Rhc2hib2FyZElkPXtjZGlkfSAqL1xuICBwcml2YXRlIGxvYWRFZGl0TW9kZVdpZGdldHMoY2RpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZSAhPT0gJ0VESVQnIHx8ICFjZGlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMud3JhcEVkaXRSZXF1ZXN0KFxuICAgICAgdGhpcy5jcmVhdGVEYXNoYm9hcmRTZXJ2aWNlLmZldGNoQ3VzdG9tRGFzaGJvYXJkV2lkZ2V0RGV0YWlscyhjZGlkKSxcbiAgICAgICh3aWRnZXRzKSA9PiB7XG4gICAgICAgIHRoaXMuYXBwbHlXaWRnZXRzRnJvbUdldFdpZGdldHNSZXNwb25zZSh3aWRnZXRzKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBlZGl0RGFzaGJvYXJkKCkge1xuICAgIHRoaXMudkxvYWRlciA9IHRydWU7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ0VESVQnKSB7XG4gICAgICB0aGlzLmVkaXRIeWRyYXRpb25Db3VudCA9IDA7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJ1aWxkRWRpdERhc2hib2FyZERhdGEoKTtcbiAgICB0aGlzLnBlbmRpbmdFZGl0UmNFbnRyaWVzID1cbiAgICAgIGRhdGE/LnNlbGVjdGVkUmNFbnRyaWVzID8/XG4gICAgICB0aGlzLmRhc2hib2FyZERldGFpbHM/LnNlbGVjdGVkUmNFbnRyaWVzID8/XG4gICAgICBbXTtcbiAgICBjb25zdCBlZGl0Q2RpZCA9IGdldEVkaXREYXNoYm9hcmRDZGlkKFxuICAgICAgZGF0YSxcbiAgICAgIHRoaXMuZGFzaGJvYXJkRGV0YWlscyxcbiAgICAgIHRoaXMuZGFzaGJvYXJkSWRcbiAgICApO1xuXG4gICAgdGhpcy5saXN0RGV0YWlscy5ub25SZW1vdmFibGVVc2Vyc0xpc3QgPSBbXG4gICAgICBkYXRhPy5jcmVhdGVkQnkgPz8gZGF0YT8uY3JlYXRlZF9ieSxcbiAgICBdLmZpbHRlcigoeCkgPT4geCAhPSBudWxsKTtcbiAgICB0aGlzLnBvcHVsYXRlRGFzaGJvYXJkRm9ybShkYXRhKTtcblxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdFRElUJyAmJiBlZGl0Q2RpZCkge1xuICAgICAgdGhpcy5sb2FkRWRpdE1vZGVXaWRnZXRzKGVkaXRDZGlkKTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeUNvbXBsZXRlRWRpdEh5ZHJhdGlvbigpO1xuICB9XG5cbiAgcG9wdWxhdGVEYXNoYm9hcmRGb3JtKGRhdGE6IGFueSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvbkJsb2NrID0gQXJyYXkuaXNBcnJheShkYXRhPy5kZXNjcmlwdGlvbilcbiAgICAgICAgPyBkYXRhLmRlc2NyaXB0aW9uWzBdXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uVGV4dCA9XG4gICAgICAgIGRlc2NyaXB0aW9uQmxvY2s/LmNvbnRlbnQgPz9cbiAgICAgICAgKHR5cGVvZiBkYXRhPy5kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycgPyBkYXRhLmRlc2NyaXB0aW9uIDogJycpID8/XG4gICAgICAgIGRhdGE/LmRhc2hib2FyZERlc2NyaXB0aW9uVGV4dCA/P1xuICAgICAgICAnJztcblxuICAgICAgY29uc3QgdmlzaWJsZVVzZXJzID0gZGF0YT8udmlzaWJsZV90b191c2VycyA/PyBkYXRhPy52aWV3ZXJzPy51c2VySWQgPz8gW107XG4gICAgICBjb25zdCB2aXNpYmxlVXNlcklkcyA9IGRhdGE/LnZpZXdlcnM/LnVzZXJJZCA/PyBbXTtcbiAgICAgIGNvbnN0IHZpc2libGVHcm91cHMgPSBkYXRhPy52aWV3ZXJzPy51c2VyR3JvdXBJZCA/PyBbXTtcbiAgICAgIGNvbnN0IHZpc2libGVHcm91cElkcyA9IGRhdGE/LnZpZXdlcnM/LnVzZXJHcm91cElkID8/IFtdO1xuICAgICAgdGhpcy5wZW5kaW5nRWRpdFJjRW50cmllcyA9XG4gICAgICAgIGRhdGE/LnNlbGVjdGVkUmNFbnRyaWVzID8/XG4gICAgICAgIHRoaXMuZGFzaGJvYXJkRGV0YWlscz8uc2VsZWN0ZWRSY0VudHJpZXMgPz9cbiAgICAgICAgW107XG4gICAgICB0aGlzLnBlbmRpbmdFZGl0UmNJZHMgPSBleHRyYWN0UmNJZHNGcm9tRGFzaGJvYXJkKGRhdGEpO1xuICAgICAgdGhpcy5hcHBseVByZXJlc29sdmVkUmNFbnRyaWVzKCk7XG4gICAgICBjb25zdCByaXNrQ2F0ZWdvcmllcyA9IGRhdGE/LnJpc2tfY2F0ZWdvcnkgPz8gW107XG4gICAgICBjb25zdCByaXNrQ2F0ZWdvcnlJZHMgPSAocmlza0NhdGVnb3JpZXMgPz8gW10pLm1hcCgocmlzazogYW55KSA9PlxuICAgICAgICB0eXBlb2YgcmlzayA9PT0gJ29iamVjdCcgPyByaXNrPy5jYXRlZ29yeV9pZCA/PyByaXNrPy5pZCA6IHJpc2tcbiAgICAgICk7XG4gICAgICBjb25zdCBzdGFydERhdGUgPVxuICAgICAgICBkYXRhPy50aW1lZnJhbWU/LnN0YXJ0X2RhdGUgPz9cbiAgICAgICAgZGF0YT8udGltZWZyYW1lPy5mcm9tID8/XG4gICAgICAgIGRhdGE/LnRpbWVfZnJhbWVfZnJvbTtcbiAgICAgIGNvbnN0IGVuZERhdGUgPVxuICAgICAgICBkYXRhPy50aW1lZnJhbWU/LmVuZF9kYXRlID8/XG4gICAgICAgIGRhdGE/LnRpbWVmcmFtZT8udG8gPz9cbiAgICAgICAgZGF0YT8udGltZV9mcmFtZV90bztcbiAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5kYXNoYm9hcmROYW1lID1cbiAgICAgICAgZGF0YT8uZGFzaGJvYXJkX25hbWUgPz8gZGF0YT8ubmFtZSA/PyAnJztcbiAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5kYXNoYm9hcmREZXNjcmlwdGlvblRleHQgPSBkZXNjcmlwdGlvblRleHQ7XG4gICAgICB0aGlzLmRhc2hib2FyZEZvcm0uc2VsZWN0ZWRWaWV3ZXJzID0gdGhpcy5zZXRMaXN0QnlJZHMoXG4gICAgICAgIHRoaXMudXNlcnNMaXN0LFxuICAgICAgICB2aXNpYmxlVXNlcklkcyxcbiAgICAgICAgWydtZW1iZXJfaWQnLCAndWlkJywgJ2lkJ11cbiAgICAgICk7XG4gICAgICB0aGlzLmxpc3REZXRhaWxzLnNlbGVjdGVkVXNlcnNMaXN0ID0gdGhpcy5kYXNoYm9hcmRGb3JtLnNlbGVjdGVkVmlld2VycztcbiAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZEdyb3VwID0gdGhpcy5zZXRMaXN0QnlJZHMoXG4gICAgICAgIHRoaXMuZ3JvdXBMaXN0LFxuICAgICAgICB2aXNpYmxlR3JvdXBJZHMsXG4gICAgICAgIFsnZ3JvdXBfaWQnLCAndWdpZCcsICdpZCddXG4gICAgICApO1xuICAgICAgdGhpcy5saXN0RGV0YWlscy5zZWxlY3RlZEdyb3VwTGlzdCA9IHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZEdyb3VwO1xuICAgICAgdGhpcy5hcHBseVBlbmRpbmdSZXNwb25zaWJpbGl0eUNlbnRlcnMoKTtcbiAgICAgIHRoaXMuc3luY1Byb2dyYW1zRm9yRWRpdChkYXRhKTtcbiAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFJpc2tDYXRlZ29yaWVzID1cbiAgICAgICAgdGhpcy5zZXRMaXN0KFxuICAgICAgICB0aGlzLmFsbFJpc2tDYXRlZ29yaWVzLFxuICAgICAgICByaXNrQ2F0ZWdvcnlJZHMsXG4gICAgICAgICdjYXRlZ29yeV9pZCdcbiAgICAgICk7XG4gICAgICB0aGlzLmRhc2hib2FyZEZvcm0uZGlzcGxheUNyaXRlcmlhID1cbiAgICAgICAgZGF0YT8uZGlzcGxheV9jcml0ZXJpYSA9PT0gJ0JPVEhfUkNfQU5EX0NBVEVHT1JZJyA/ICdhbmQnIDogJ29yJztcbiAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZEZyb21EYXRlID0gc3RhcnREYXRlXG4gICAgICAgID8gbmV3IERhdGUoc3RhcnREYXRlKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFRvRGF0ZSA9IGVuZERhdGVcbiAgICAgICAgPyBuZXcgRGF0ZShlbmREYXRlKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0aGlzLm1vZGUgIT09ICdFRElUJykge1xuICAgICAgICB0aGlzLnZMb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgd2lkZ2V0RGV0YWlsc1JhdyA9XG4gICAgICAgICAgZGF0YT8ud2lkZ2V0X2RldGFpbHMgPz8gZGF0YT8ud2lkZ2V0cyA/PyBbXTtcbiAgICAgICAgY29uc3Qgd2lkZ2V0RGV0YWlscyA9IEFycmF5LmlzQXJyYXkod2lkZ2V0RGV0YWlsc1JhdylcbiAgICAgICAgICA/IHdpZGdldERldGFpbHNSYXdcbiAgICAgICAgICA6IFtdO1xuICAgICAgICBjb25zdCBhbGxXaWRnZXRzUmF3ID0gZGF0YT8uYWxsX3dpZGdldHMgPz8gd2lkZ2V0RGV0YWlscztcbiAgICAgICAgY29uc3QgYWxsV2lkZ2V0cyA9IEFycmF5LmlzQXJyYXkoYWxsV2lkZ2V0c1JhdykgPyBhbGxXaWRnZXRzUmF3IDogW107XG4gICAgICAgIHRoaXMuZGFzaGJvYXJkRm9ybS5jb25maWd1cmVXaWRnZXQgPSB3aWRnZXREZXRhaWxzO1xuICAgICAgICB0aGlzLnNlbGVjdGVkV2lkZ2V0cyA9XG4gICAgICAgICAgd2lkZ2V0RGV0YWlscy5sZW5ndGggPiAwID8gWy4uLm5ldyBTZXQod2lkZ2V0RGV0YWlscyldIDogW107XG4gICAgICAgIHRoaXMuZGlzcGxheWVkV2lkZ2V0cyA9XG4gICAgICAgICAgYWxsV2lkZ2V0cy5sZW5ndGggPiAwID8gWy4uLm5ldyBTZXQoYWxsV2lkZ2V0cyldIDogW107XG4gICAgICB9XG4gICAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICAgIGNvbnN0IG1pblRvRGF0ZSA9IHRoaXMuc2V0VG9EYXRlKHN0YXJ0RGF0ZSk7XG4gICAgICAgIHRoaXMudG9EYXRlUGlja2VyQ29uZmlnID0geyAuLi50aGlzLmRhdGVQaWNrZXJCYXNlQ29uZmlnLCBtaW46IG1pblRvRGF0ZSB9O1xuICAgICAgfVxuICAgICAgdGhpcy5oaWRlVG9EYXRlID0gdHJ1ZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmhpZGVUb0RhdGUgPSBmYWxzZTtcbiAgICAgIH0sIDIwKTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcigncG9wdWxhdGUgZGFzaGJvYXJkIGVycm9yID0+JywgZXJyb3IpO1xuICAgICAgdGhpcy52TG9hZGVyID0gZmFsc2U7XG4gICAgfVxuICB9XG5cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgLy95b3VyIGNvZGUgdG8gdXBkYXRlIHRoZSBtb2RlbFxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHNldFBlcm1pc3Npb24ocm9sZUFjdGlvbnM6IGFueSkge1xuICAgIGxldCBpZkV4aXN0UmlzayA9IHJvbGVBY3Rpb25zPy5maW5kKChlbDogYW55KSA9PiBlbC5tb2R1bGVOYW1lID09ICdyaXNrJyk7XG4gICAgaWZFeGlzdFJpc2s/LnN1Yk1vZHVsZT8uZm9yRWFjaCgobW9kdWxlOiBhbnkpID0+IHtcbiAgICAgIG1vZHVsZT8ucGVybWlzc2lvbnM/LmZvckVhY2goKHBlcm1pc3Npb246IGFueSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHBlcm1pc3Npb24/LmNvZGUpIHtcbiAgICAgICAgICBjYXNlICdSUk1SJzoge1xuICAgICAgICAgICAgaWYgKHBlcm1pc3Npb24/LmRlZmF1bHRQZXJtaXNzaW9uID09IDEgfHwgcGVybWlzc2lvbj8uZW5hYmxlID09IDEpIHtcbiAgICAgICAgICAgICAgdGhpcy5pc01hbmFnZVJpc2sgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgZG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGZyb21PcGVuID0gISF0aGlzLmZyb21EYXRlUGlja2VyPy5hcmVDYWxlbmRhcnNTaG93bjtcbiAgICBjb25zdCB0b09wZW4gPSAhIXRoaXMudG9EYXRlUGlja2VyPy5hcmVDYWxlbmRhcnNTaG93bjtcbiAgICBpZiAoIXRoaXMuZGF0ZVBpY2tlck92ZXJsYXkgJiYgIWZyb21PcGVuICYmICF0b09wZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gZXZlbnQ/LnRhcmdldCBhcyBFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIXRhcmdldEVsZW1lbnQ/LmNsb3Nlc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBLZWVwIGNhbGVuZGFyIG9wZW4gd2hlbiBpbnRlcmFjdGluZyB3aXRoIHRoZSBjYWxlbmRhciBVSSBpdHNlbGZcbiAgICAvLyAoaW5jbHVkaW5nIG1vbnRoL3llYXIgbmF2aWdhdGlvbikuIFRoZSBmdWxsLXNjcmVlbiB0cmFuc3BhcmVudFxuICAgIC8vIGAuZHAtcG9wdXBgIGJhY2tkcm9wIGlzIGludGVudGlvbmFsbHkgdHJlYXRlZCBhcyBhbiBvdXRzaWRlIGNsaWNrLlxuICAgIGNvbnN0IGNsaWNrZWRJbnNpZGVDYWxlbmRhciA9ICEhdGFyZ2V0RWxlbWVudC5jbG9zZXN0KFxuICAgICAgJ2RwLWRheS1jYWxlbmRhciwgZHAtbW9udGgtY2FsZW5kYXIsIGRwLWRheS10aW1lLWNhbGVuZGFyLCBkcC10aW1lLXNlbGVjdCdcbiAgICApO1xuICAgIGNvbnN0IGNsaWNrZWRPbkRhdGVJbnB1dCA9ICEhdGFyZ2V0RWxlbWVudC5jbG9zZXN0KFxuICAgICAgJyNmcm9tX2RhdGUsICN0b19kYXRlJ1xuICAgICk7XG5cbiAgICBpZiAoY2xpY2tlZEluc2lkZUNhbGVuZGFyIHx8IGNsaWNrZWRPbkRhdGVJbnB1dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmcm9tT3BlbiB8fCB0aGlzLm9wZW5lZERhdGVQaWNrZXIgPT09ICdGUk9NX0RBVEUnKSB7XG4gICAgICB0aGlzLmNsb3NlRnJvbURhdGVQaWNrZXIoKTtcbiAgICB9XG4gICAgaWYgKHRvT3BlbiB8fCB0aGlzLm9wZW5lZERhdGVQaWNrZXIgPT09ICdUT19EQVRFJykge1xuICAgICAgdGhpcy5jbG9zZVRvRGF0ZVBpY2tlcigpO1xuICAgIH1cbiAgICB0aGlzLmRhdGVQaWNrZXJPdmVybGF5ID0gZmFsc2U7XG4gICAgdGhpcy5vcGVuZWREYXRlUGlja2VyID0gJyc7XG4gIH1cbn1cbiIsIjxhcHAtc25hY2stYmFyPjwvYXBwLXNuYWNrLWJhcj5cbjxkaXYgY2xhc3M9XCJjcmVhdGUtZGFzaGJvYXJkXCIgKm5nSWY9XCIhb3BlbkNvbmZpZ3VyZVdpZGdldHNcIj5cbiAgPGRpdiBjbGFzcz1cImNyZWF0ZS1kYXNoYm9hcmQtY29udGFpbmVyIHZ4LWQtZmxleCB2eC1qdXN0aWZ5LWVuZFwiIFtjbGFzcy5hbmltYXRlLXNsaWRlSW5SaWdodF09XCJhbmltYXRpb25cIj5cbiAgICA8ZGl2IGNsYXNzPVwibW9yZS1vcHRpb25cIiAqbmdJZj1cImFjdGl2ZVNlbGVjdG9yICYmIGFjdGl2ZVNlbGVjdG9yICE9PSAnbmFtZSdcIj5cbiAgICAgIDxhcHAtdXNlci1saXN0ICpuZ0lmPVwiYWN0aXZlU2VsZWN0b3IgPT09ICd3aG9DYW5WaWV3J1wiXG4gICAgICAgIChzYXZlU2VsZWN0ZWRVc2Vycyk9XCJzYXZlU2VsZWN0ZWRMaXN0KCd3aG9DYW5WaWV3JywgJGV2ZW50KVwiIChjbG9zZVVzZXJMaXN0KT1cImFjdGl2YXRlU2VsZWN0b3IoJycsIGZhbHNlKVwiXG4gICAgICAgIFt0b3RhbFBhZ2VzXT1cInRvdGFsUGFnZXNcIiBbdG90YWxMaXN0XT1cInRvdGFsTGlzdFwiIFtsaXN0RGV0YWlsc109XCJsaXN0RGV0YWlsc1wiIFt0b3RhbGdyb3Vwc2NvdW50XT1cInRvdGFsZ3JvdXBzXCJcbiAgICAgICAgW2ZlYXR1cmVdPVwiZmVhdHVyZVwiPjwvYXBwLXVzZXItbGlzdD5cbiAgICAgIDxhcHAtcmVzcG9uc2liaWxpdHktY2VudGVyICpuZ0lmPVwiYWN0aXZlU2VsZWN0b3IgPT09ICdyY0xpc3QnXCJcbiAgICAgICAgW3Jlc3BvbnNpYmlsaXR5Q2VudGVyc0xpc3RdPVwicmVzcG9uc2liaWxpdHlDZW50ZXJzTGlzdFwiIFtyYWRpb1NlbGVjdGlvbl09XCJmYWxzZVwiXG4gICAgICAgIFtzZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVyc109XCJcbiAgICAgICAgICBkYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzXG4gICAgICAgIFwiIFtyY0lkS2V5XT1cIidpdGVtX2lkJ1wiIChzYXZlU2VsZWN0ZWRMaXN0KT1cInNhdmVTZWxlY3RlZExpc3QoJ3JjJywgJGV2ZW50KVwiXG4gICAgICAgIChjbG9zZVJjTGlzdCk9XCJhY3RpdmF0ZVNlbGVjdG9yKCcnLCBmYWxzZSlcIj5cbiAgICAgIDwvYXBwLXJlc3BvbnNpYmlsaXR5LWNlbnRlcj5cbiAgICAgIDwhLS0gPGFwcC1jYXRlZ29yaWVzICpuZ0lmPVwiYWN0aXZlU2VsZWN0b3IgPT09ICdyZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMnXCJcbiAgICAgICAgW2NhdGVnb3J5TGlzdF09XCJyZXNwb25zaWJpbGl0eUNhdGVnb3JpZXNUcmVlXCIgW2FsbENhdGVnb3JpZXNdPVwiYWxsQ29tcGxpYW5jZUNhdGVnb3JpZXNcIlxuICAgICAgICBbY2F0ZWdvcnlJZEtleV09XCInY2F0ZWdvcnlfaWQnXCIgW3NlbGVjdGVkQ2F0ZWdvcmllc109XCJkYXNoYm9hcmRGb3JtLnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzXCJcbiAgICAgICAgKHNhdmVTZWxlY3RlZENhdGVnb3J5KT1cIlxuICAgICAgICAgIHNhdmVTZWxlY3RlZExpc3QoJ3Jlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcycsICRldmVudClcbiAgICAgICAgXCIgKGNsb3NlQ2F0ZWdvcmllc0xpc3QpPVwiYWN0aXZhdGVTZWxlY3RvcignJywgZmFsc2UpXCI+PC9hcHAtY2F0ZWdvcmllcz4gLS0+XG4gICAgICA8YXBwLWxpc3QtY29udGFpbmVyIGxpc3QgKm5nSWY9XCJhY3RpdmVTZWxlY3RvciA9PT0gJ3Jlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcydcIlxuICAgICAgICAoY2xvc2UpPVwiYWN0aXZhdGVTZWxlY3RvcignJywgZmFsc2UpXCI+XG4gICAgICAgIDxhcHAtcHJvZ3JhbS1saXN0IGJvZHkgKGl0ZW1zU2VsZWN0ZWRDaGFuZ2UpPVwib25Qcm9ncmFtU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIFtzZWxlY3RlZEl0ZW1zXT1cInNlbGVjdGVkUHJvZ3JhbXNcIiBbdXJsXT1cInByb2dyYW1MaXN0VXJsXCI+PC9hcHAtcHJvZ3JhbS1saXN0PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciB2eC1qdXN0aWZ5LWJldHdlZW4gdngtdy0xMDBcIiBmb290ZXI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxlZnQtc2lkZSB2eC1mcy0xMiB2eC1kLWZsZXhcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhbGxQcm9nYW1TZWxlY3RlZD8ubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3RlZC1jb3VudC1ib3ggdngtZnMtOSB2eC1mdy01MDAgdngtdHh0LXdoaXRlIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXIgdngtanVzdGlmeS1jZW50ZXIgdngtbGgtNFwiPlxuICAgICAgICAgICAgICAgIHt7IGFsbFByb2dhbVNlbGVjdGVkLmxlbmd0aCB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3RlZC10ZXh0XCI+XG4gICAgICAgICAgICAgICAgUHJvZ3JhbVxuICAgICAgICAgICAgICAgIHt7IGFsbFByb2dhbVNlbGVjdGVkLmxlbmd0aCA+IDEgPyBcIkNhdGVnb3JpZXNcIiA6IFwiQ2F0ZWdvcnlcIiB9fVxuICAgICAgICAgICAgICAgIFNlbGVjdGVkPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LXNpZGUgdngtZC1mbGV4XCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FuY2VsQnRuXCIgKGNsaWNrKT1cImFjdGl2YXRlU2VsZWN0b3IoJycsIGZhbHNlKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5leHRCdG5cIiAoY2xpY2spPVwiYWN0aXZhdGVTZWxlY3RvcignJywgZmFsc2UpO1wiPlxuICAgICAgICAgICAgICBOZXh0IDxpIGNsYXNzPVwiaWNvbnNcIj4mI3hlOTFlOzwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvYXBwLWxpc3QtY29udGFpbmVyPlxuXG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInZ4LWRpYWxvZy1jb250YWluZXIgc2lkZS1kaWFsb2dcIiBbY2xhc3MudGFibGV0LXdpZHRoXT1cImFjdGl2ZVNlbGVjdG9yICYmIGFjdGl2ZVNlbGVjdG9yICE9PSAnbmFtZSdcIj5cbiAgICAgIDxhcHAtbG9hZGVyLWlubGluZSAqbmdJZj1cInZMb2FkZXJcIj48L2FwcC1sb2FkZXItaW5saW5lPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiIFtjbGFzcy5kaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidngtZGlhbG9nLWJvZHktY29udGFpbmVyXCIgKHNjcm9sbCk9XCJhbmltYXRlSW1hZ2UoKVwiXG4gICAgICAgICAgW2NsYXNzLmhpZGRlbi1zY3JvbGxdPVwicG9wb3ZlclNlcnZpY2Uuc3RvcFNjcm9sbFwiPlxuICAgICAgICAgIDwhLS0gRGFzaGJvYXJkIE5hbWUgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAtcm93XCIgW2NsYXNzLmRpc2FibGVkXT1cImFjdGl2ZVNlbGVjdG9yICYmIGFjdGl2ZVNlbGVjdG9yICE9PSAnbmFtZSdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZVwiPlxuICAgICAgICAgICAgICA8aW1nIFtuZ1NyY109XCJBU1NFVFMuZGFzaEJvYXJkSWNvblwiICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAhZGFzaGJvYXJkRm9ybS5kYXNoYm9hcmROYW1lIHx8IGFjdGl2ZVNlbGVjdG9yID09PSAnbmFtZSdcbiAgICAgICAgICAgICAgICBcIiBhbHQ9XCJcIiB3aWR0aD1cIjM2XCIgaGVpZ2h0PVwiMzZcIiAvPlxuICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY2hlY2tJY29uXCIgKm5nSWY9XCJkYXNoYm9hcmRGb3JtLmRhc2hib2FyZE5hbWUgJiYgYWN0aXZlU2VsZWN0b3IgIT09ICduYW1lJ1wiXG4gICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgNTIgNTJcIj5cbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwiY2hlY2tJY29uX19jaXJjbGVcIiBjeD1cIjI2XCIgY3k9XCIyNlwiIHI9XCIyNVwiIGZpbGw9XCJub25lXCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBjbGFzcz1cImNoZWNrSWNvbl9fY2hlY2tcIiBmaWxsPVwibm9uZVwiIGQ9XCJNMTQuMSAyNy4ybDcuMSA3LjIgMTYuNy0xNi44XCIgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2eC1mb3JtLWdyb3VwIHZ4LWQtYmxvY2sgdngtbWItNFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2eC1mcy0xMSB2eC1mdy01MDAgdngtbGFiZWwtdHh0IHZ4LWQtYmxvY2sgdngtdHQtdXBwZXJjYXNlIHZ4LW1iLTIgdngtdy0xMDAgdngtbGgtNFwiPkRhc2hib2FyZFxuICAgICAgICAgICAgICAgICAgTmFtZVxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlIHZ4LXR4dC1yZWQgdngtZnMtMTYgdngtZnctNDAwXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2eC1pbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwidGV4dEZpZWxkXCIgcGxhY2Vob2xkZXI9XCJBZGQgZGFzaGJvYXJkIG5hbWUgKE1heCBsaW1pdDogMzAgY2hhcmFjdGVycykuXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkYXNoYm9hcmRGb3JtLmRhc2hib2FyZE5hbWVcIiAoa2V5ZG93bik9XCJhY3RpdmVTZWxlY3RvciA9ICduYW1lJ1wiXG4gICAgICAgICAgICAgICAgICAgIChmb2N1c2luKT1cImFjdGl2YXRlU2VsZWN0b3IoJ25hbWUnLCB0cnVlKVwiIChmb2N1c291dCk9XCJhY3RpdmF0ZVNlbGVjdG9yKCduYW1lJywgZmFsc2UpXCIgLz5cblxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb3VudGVyXCIgKm5nSWY9XCJkYXNoYm9hcmRGb3JtPy5kYXNoYm9hcmROYW1lPy5sZW5ndGggPiAwXCI+e3sgMzAgLVxuICAgICAgICAgICAgICAgICAgICBkYXNoYm9hcmRGb3JtLmRhc2hib2FyZE5hbWUubGVuZ3RoIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ2eC10eHQtZXJyb3JcIiBbYXBwU2Nyb2xsSW5WaWV3XT1cInRydWVcIiAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBzdWJtaXR0ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgKGRhc2hib2FyZEZvcm0/LmRhc2hib2FyZE5hbWU/Lmxlbmd0aCA+IDMwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgIWRhc2hib2FyZEZvcm0/LmRhc2hib2FyZE5hbWUpXG4gICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICBkYXNoYm9hcmRGb3JtLmRhc2hib2FyZE5hbWUubGVuZ3RoID4gMzBcbiAgICAgICAgICAgICAgICAgID8gXCJZb3UgaGF2ZSBleGNlZWRlZCB0aGUgbWF4aW11bSBjaGFyYWN0ZXIgbGltaXQgb2YgMzAgY2hhcmFjdGVycy5cIlxuICAgICAgICAgICAgICAgICAgOiBcIlBsZWFzZSBlbnRlciBhIG5hbWUgZm9yIHRoaXMgRGFzaGJvYXJkLlwiXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIDwvcD5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2eC1pbnB1dC1ncm91cCB2eC1tdC0yXCI+XG4gICAgICAgICAgICAgICAgICA8dmNvbXBseS1lZGl0b3IgW2VkaXRvckNvbmZpZ109XCJkYXNoYm9hcmREZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZGFzaGJvYXJkRm9ybS5kYXNoYm9hcmREZXNjcmlwdGlvblRleHRcIj48L3Zjb21wbHktZWRpdG9yPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb3VudGVyXCIgKm5nSWY9XCJkYXNoYm9hcmRGb3JtPy5kYXNoYm9hcmREZXNjcmlwdGlvblRleHQ/Lmxlbmd0aCA+IDBcIj57e1xuICAgICAgICAgICAgICAgICAgICAyNTAgLVxuICAgICAgICAgICAgICAgICAgICAoZGFzaGJvYXJkRm9ybT8uZGFzaGJvYXJkRGVzY3JpcHRpb25UZXh0IHwgdGV4dENvdW50KVxuICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidngtdHh0LWVycm9yXCIgW2FwcFNjcm9sbEluVmlld109XCJ0cnVlXCIgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgc3VibWl0dGVkICYmXG4gICAgICAgICAgICAgICAgICAgIChkYXNoYm9hcmRGb3JtPy5kYXNoYm9hcmREZXNjcmlwdGlvblRleHQgfCB0ZXh0Q291bnQpID4gMjUwXG4gICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgIFlvdSBoYXZlIGV4Y2VlZGVkIHRoZSBtYXhpbXVtIGNoYXJhY3RlciBsaW1pdCBvZiAyNTBcbiAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMuXG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBEYXNoYm9hcmQgRGlzcGxheSBDcml0ZXJpYSAgLS0+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkLWxhYmVsIHZ4LWZzLTEwIHZ4LWZ3LTUwMCB2eC10eHQtd2hpdGUgdngtdHQtdXBwZXJjYXNlIHZ4LXBsLTEgdngtcHItMSB2eC1saC00XCI+XG4gICAgICAgICAgICBEYXNoYm9hcmQgRGlzcGxheSBDcml0ZXJpYVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8YXBwLWluZm9ybWF0aW9uLWJsb2NrPjwvYXBwLWluZm9ybWF0aW9uLWJsb2NrPlxuXG4gICAgICAgICAgPCEtLSBXaG8gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAtcm93XCIgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVTZWxlY3RvciA9PT0gJ3dob0NhblZpZXcnXCIgW2NsYXNzLmRpc2FibGVkXT1cIlxuICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciAmJlxuICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciAhPT0gJ3dob0NhblZpZXcnICYmXG4gICAgICAgICAgICAgIGFjdGl2ZVNlbGVjdG9yICE9PSAnbmFtZSdcbiAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlXCI+XG4gICAgICAgICAgICAgIDxpbWcgW25nU3JjXT1cIkFTU0VUUy5kYXNoQm9hcmRVc2Vyc0ljb25cIiAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRWaWV3ZXJzPy5sZW5ndGggPT0gMCB8fFxuICAgICAgICAgICAgICAgICAgYWN0aXZlU2VsZWN0b3IgPT09ICd3aG9DYW5WaWV3J1xuICAgICAgICAgICAgICAgIFwiIGFsdD1cIlwiIHdpZHRoPVwiMzZcIiBoZWlnaHQ9XCIzNlwiIC8+XG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjaGVja0ljb25cIiAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRWaWV3ZXJzPy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciAhPT0gJ3dob0NhblZpZXcnXG4gICAgICAgICAgICAgICAgXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgNTIgNTJcIj5cbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwiY2hlY2tJY29uX19jaXJjbGVcIiBjeD1cIjI2XCIgY3k9XCIyNlwiIHI9XCIyNVwiIGZpbGw9XCJub25lXCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBjbGFzcz1cImNoZWNrSWNvbl9fY2hlY2tcIiBmaWxsPVwibm9uZVwiIGQ9XCJNMTQuMSAyNy4ybDcuMSA3LjIgMTYuNy0xNi44XCIgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2eC1mb3JtLWdyb3VwIHZ4LWQtYmxvY2sgdngtbWItNFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInZ4LWZzLTExIHZ4LWZ3LTUwMCB2eC1sYWJlbC10eHQgdngtZC1ibG9jayB2eC10dC11cHBlcmNhc2UgdngtbWItMiB2eC13LTEwMCB2eC1saC00XCI+V2hvXG4gICAgICAgICAgICAgICAgICBjYW4gdmlldyB0aGlzIGRhc2hib2FyZD88c3BhbiBjbGFzcz1cInJlcXVpcmUgdngtdHh0LXJlZCB2eC1mcy0xNiB2eC1mdy00MDBcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRhc2hib2FyZEZvcm0/LnNlbGVjdGVkVmlld2Vycz8ubGVuZ3RoID09IDBcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3RCb3hFbmFibGUgdngtcGwtMyB2eC1wci0zIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2YXRlU2VsZWN0b3IoJ3dob0NhblZpZXcnLCB0cnVlKVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdEJveFBsYWNlaG9kZXIgdngtZnMtMTMgdngtcGFyYWdyYXBoLXR4dCB2eC1saC00XCI+XG4gICAgICAgICAgICAgICAgICAgIFdobyBjYW4gdmlldyB0aGlzIGRhc2hib2FyZD9cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRhc2hib2FyZEZvcm0/LnNlbGVjdGVkVmlld2Vycz8ubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdEJveFN1Y2Nlc3MgdngtcGwtMiB2eC1wci0zIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXIgdngtanVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWdyb3Vwc0VuYWJsZWRcIiBpZD1cIm9ubHl1c2Vyc2xpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXBDb250YWluZXIgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciB2eC1wbC0yIHZ4LXByLTJcIiAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1c2VyIG9mIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkVmlld2Vycz8uc2xpY2UoMCwgMSlcbiAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImljb25zIGNyb3NzIHZ4LWZzLTEyIHZ4LXBhcmFncmFwaC10eHQgdngtbXItMVwiICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFsaXN0RGV0YWlscy5ub25SZW1vdmFibGVVc2Vyc0xpc3QuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5tZW1iZXJfaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCIgKGNsaWNrKT1cInJlbW92ZSgnd2hvQ2FuVmlldycsIHVzZXIpXCI+JiN4ZTlhZTs8L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwTmFtZSB2eC1mcy0xMSB2eC1sYWJlbC10eHRcIiBbYXJUb29sdGlwXT1cInVzZXIubWVtYmVyX25hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tLWxlZnRcIiBkZWxheT1cIjBcIiB0eXBlPVwiYmxhY2tcIiBbdG9vbHRpcE1hbmRhdG9yeV09XCJmYWxzZVwiPnt7IHVzZXIubWVtYmVyX25hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRWaWV3ZXJzPy5sZW5ndGggPiAxICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFncm91cHNFbmFibGVkXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb3VudEJ0biBncmVlbkJnIHZ4LWZzLTkgdngtZnctNTAwIHZ4LXR4dC13aGl0ZSB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyIHZ4LWp1c3RpZnktY2VudGVyIHZ4LWxoLTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwUG9wb3ZlciAoY2xpY2spPVwidXNlckxpc3QucG9wb3ZlcigpXCIgcGxhY2VtZW50PVwibGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgK3t7IGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkVmlld2Vycz8uc2xpY2UoMSkubGVuZ3RoIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8YXBwLXBvcG92ZXIgI3VzZXJMaXN0IFtkb250Q2xvc2VvbkNsaWNrXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImFjdGlvbi1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1c2VyIG9mIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkVmlld2Vyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNsaWNlIDogMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBqID0gaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyLWNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmFsdWVcIiBbYXJUb29sdGlwXT1cInVzZXI/Lm1lbWJlcl9uYW1lXCIgcGxhY2VtZW50PVwiYm90dG9tLWxlZnRcIiBkZWxheT1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYmxhY2tcIiBbdG9vbHRpcE1hbmRhdG9yeV09XCJmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImljb25zIGNyb3NzLWljb25cIiAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWxpc3REZXRhaWxzLm5vblJlbW92YWJsZVVzZXJzTGlzdC5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5tZW1iZXJfaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgJiYgIWdyb3Vwc0VuYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiAoY2xpY2spPVwicmVtb3ZlKCd3aG9DYW5WaWV3JywgdXNlcilcIj4mI3hlOTBkOzwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdXNlcj8ubWVtYmVyX25hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvYXBwLXBvcG92ZXI+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdyb3Vwc0VuYWJsZWRcIiBjbGFzcz1cInZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXBDb250YWluZXIgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciB2eC1wbC0yIHZ4LXByLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoaXBOYW1lIHZ4LWZzLTExIHZ4LWxhYmVsLXR4dFwiPlVTRVIoUyk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb3VudEJ0biBncmVlbkJnIHZ4LWZzLTkgdngtZnctNTAwIHZ4LXR4dC13aGl0ZSB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyIHZ4LWp1c3RpZnktY2VudGVyIHZ4LWxoLTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwUG9wb3ZlciAoY2xpY2spPVwidXNlckNvdW50LnBvcG92ZXIoKVwiIHBsYWNlbWVudD1cImxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkVmlld2Vycz8ubGVuZ3RoIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZ4LWZzLTEyIHZ4LXBhcmFncmFwaC10eHQgdngtbWwtMiB2eC1tci0yXCIgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkR3JvdXA/Lmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRWaWV3ZXJzPy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICBcIj4mPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRHcm91cD8ubGVuZ3RoXCIgaWQ9XCJ1c2Vyc2FuZGdyb3Vwc1wiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGlwQ29udGFpbmVyIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXIgdngtcGwtMiB2eC1wci0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwTmFtZSB2eC1mcy0xMSB2eC1sYWJlbC10eHRcIj5VU0VSIEdST1VQKFMpPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY291bnRCdG4gdngtZnMtOSB2eC1mdy01MDAgdngtdHh0LXdoaXRlIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXIgdngtanVzdGlmeS1jZW50ZXIgdngtbGgtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBQb3BvdmVyIChjbGljayk9XCJncm91cENvdW50LnBvcG92ZXIoKVwiIHBsYWNlbWVudD1cInJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZEdyb3VwPy5sZW5ndGggfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGFwcC1wb3BvdmVyICN1c2VyQ291bnQgW2RvbnRDbG9zZW9uQ2xpY2tdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiYWN0aW9uLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBkYXRhIG9mIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkVmlld2Vyc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdmF0YXItY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2YWx1ZVwiIFthclRvb2x0aXBdPVwiZGF0YS5tZW1iZXJfbmFtZVwiIHBsYWNlbWVudD1cImJvdHRvbS1sZWZ0XCIgZGVsYXk9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJsYWNrXCIgW3Rvb2x0aXBNYW5kYXRvcnldPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29ucyBjcm9zcy1pY29uXCIgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFsaXN0RGV0YWlscy5ub25SZW1vdmFibGVVc2Vyc0xpc3QuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubWVtYmVyX2lkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgKGNsaWNrKT1cInJlbW92ZSgnd2hvQ2FuVmlldycsIGRhdGEpXCI+JiN4ZTkwZDs8L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGEubWVtYmVyX25hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvYXBwLXBvcG92ZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPGFwcC1wb3BvdmVyICNncm91cENvdW50IFtkb250Q2xvc2VvbkNsaWNrXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImFjdGlvbi1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgZGF0YSBvZiBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZEdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF2YXRhci1jYXJkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZhbHVlXCIgW2FyVG9vbHRpcF09XCJkYXRhLmdyb3VwX25hbWVcIiBwbGFjZW1lbnQ9XCJib3R0b20tbGVmdFwiIGRlbGF5PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJibGFja1wiIFt0b29sdGlwTWFuZGF0b3J5XT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbnMgY3Jvc3MtaWNvblwiIChjbGljayk9XCJyZW1vdmUoJ3dob0NhblZpZXdHcm91cCcsIGRhdGEpXCI+JiN4ZTkwZDs8L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGEuZ3JvdXBfbmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9hcHAtcG9wb3Zlcj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiYWN0aXZlU2VsZWN0b3IgIT09ICd3aG9DYW5WaWV3J1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZWRpdEJ0biB2eC1mcy0xMSB2eC1mdy02MDAgdngtdHh0LWJsdWUgdngtdHQtdXBwZXJjYXNlIHZ4LXAtMCB2eC1tLTAgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmF0ZVNlbGVjdG9yKCd3aG9DYW5WaWV3JywgdHJ1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29ucyB2eC1tci0xXCI+JiN4ZTkwYzs8L2k+IEVESVRcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBSZXNwb25zaWJpbGl0eSBDZW50ZXIgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAtcm93XCIgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVTZWxlY3RvciA9PT0gJ3JjTGlzdCdcIiBbY2xhc3MuZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgIGFjdGl2ZVNlbGVjdG9yICYmXG4gICAgICAgICAgICAgIGFjdGl2ZVNlbGVjdG9yICE9PSAncmNMaXN0JyAmJlxuICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciAhPT0gJ25hbWUnXG4gICAgICAgICAgICBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZVwiPlxuICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVycz8ubGVuZ3RoID09IDAgfHxcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZVNlbGVjdG9yID09PSAncmNMaXN0J1xuICAgICAgICAgICAgICAgIFwiIFtuZ1NyY109XCJBU1NFVFMuZGFzaEJvYXJkUmNJY29uXCIgYWx0PVwiXCIgd2lkdGg9XCIzNlwiIGhlaWdodD1cIjM2XCIgLz5cbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnM/Lmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZVNlbGVjdG9yICE9PSAncmNMaXN0J1xuICAgICAgICAgICAgICAgIFwiIGNsYXNzPVwiY2hlY2tJY29uXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgNTIgNTJcIj5cbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwiY2hlY2tJY29uX19jaXJjbGVcIiBjeD1cIjI2XCIgY3k9XCIyNlwiIHI9XCIyNVwiIGZpbGw9XCJub25lXCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBjbGFzcz1cImNoZWNrSWNvbl9fY2hlY2tcIiBmaWxsPVwibm9uZVwiIGQ9XCJNMTQuMSAyNy4ybDcuMSA3LjIgMTYuNy0xNi44XCIgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2eC1mb3JtLWdyb3VwIHZ4LWQtYmxvY2sgdngtbWItNFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2eC1mcy0xMSB2eC1mdy01MDAgdngtbGFiZWwtdHh0IHZ4LWQtYmxvY2sgdngtdHQtdXBwZXJjYXNlIHZ4LW1iLTIgdngtdy0xMDAgdngtbGgtNFwiPlJFU1BPTlNJQklMSVRZXG4gICAgICAgICAgICAgICAgICBDRU5URVIoUyk8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnM/Lmxlbmd0aCA9PSAwXG4gICAgICAgICAgICAgICAgICBcIiBjbGFzcz1cInNlbGVjdEJveEVuYWJsZSB2eC1wbC0zIHZ4LXByLTMgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZhdGVTZWxlY3RvcigncmNMaXN0JywgdHJ1ZSlcIiBbY2xhc3MuZXJyb3JdPVwiXG4gICAgICAgICAgICAgICAgICAgIHN1Ym1pdHRlZCAmJlxuICAgICAgICAgICAgICAgICAgICBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVycz8ubGVuZ3RoID09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgYWxsUHJvZ2FtU2VsZWN0ZWQ/Lmxlbmd0aCA9PVxuICAgICAgICAgICAgICAgICAgICAgIDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRSaXNrQ2F0ZWdvcmllcz8ubGVuZ3RoID09IDBcbiAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdEJveFBsYWNlaG9kZXIgdngtZnMtMTMgdngtcGFyYWdyYXBoLXR4dCB2eC1saC00XCI+XG4gICAgICAgICAgICAgICAgICAgIFNlbGVjdCB0aGUgUmVzcG9uc2liaWxpdHkgQ2VudGVyKHMpIHRoYXQgeW91IHdvdWxkIGxpa2U8YnIgLz5kaXNwbGF5ZWRcbiAgICAgICAgICAgICAgICAgICAgaW4gdGhlIERhc2hib2FyZCwgaWYgYW55LlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzPy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICBcIiBjbGFzcz1cInNlbGVjdEJveFN1Y2Nlc3MgdngtcGwtMiB2eC1wci0zIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXIgdngtanVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hpcENvbnRhaW5lciB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyIHZ4LXBsLTIgdngtcHItMlwiICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgIGxldCByYyBvZiBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVycz8uc2xpY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbnMgY3Jvc3MgdngtZnMtMTIgdngtcGFyYWdyYXBoLXR4dCB2eC1tci0xXCIgKGNsaWNrKT1cInJlbW92ZSgncmMnLCByYylcIj4mI3hlOWFlOzwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwTmFtZSB2eC1mcy0xMSB2eC1sYWJlbC10eHRcIiBbYXJUb29sdGlwXT1cInJjLml0ZW1fbmFtZVwiIHBsYWNlbWVudD1cImJvdHRvbS1sZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgICBkZWxheT1cIjBcIiB0eXBlPVwiYmxhY2tcIiBbdG9vbHRpcE1hbmRhdG9yeV09XCJmYWxzZVwiPnt7IHJjLml0ZW1fbmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRSZXNwb25zaWJpbGl0eUNlbnRlcnM/Lmxlbmd0aCA+IDFcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY291bnRCdG4gdngtZnMtOSB2eC1mdy01MDAgdngtdHh0LXdoaXRlIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXIgdngtanVzdGlmeS1jZW50ZXIgdngtbGgtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgYXBwUG9wb3ZlciAoY2xpY2spPVwicmNMaXN0LnBvcG92ZXIoKVwiIHBsYWNlbWVudD1cImxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAre3tcbiAgICAgICAgICAgICAgICAgICAgICBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVycz8uc2xpY2UoMSlcbiAgICAgICAgICAgICAgICAgICAgICAubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPGFwcC1wb3BvdmVyICNyY0xpc3QgW2RvbnRDbG9zZW9uQ2xpY2tdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiYWN0aW9uLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJjIG9mIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2xpY2UgOiAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGogPSBpbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdmF0YXItY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2YWx1ZVwiIFthclRvb2x0aXBdPVwicmM/Lml0ZW1fbmFtZVwiIHBsYWNlbWVudD1cImJvdHRvbS1sZWZ0XCIgZGVsYXk9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJsYWNrXCIgW3Rvb2x0aXBNYW5kYXRvcnldPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29ucyBjcm9zcy1pY29uXCIgKGNsaWNrKT1cInJlbW92ZSgncmMnLCByYylcIj4mI3hlOTBkOzwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcmM/Lml0ZW1fbmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9hcHAtcG9wb3Zlcj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiYWN0aXZlU2VsZWN0b3IgIT09ICdyY0xpc3QnXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0QnRuIHZ4LWZzLTExIHZ4LWZ3LTYwMCB2eC10eHQtYmx1ZSB2eC10dC11cHBlcmNhc2UgdngtcC0wIHZ4LW0tMCB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2YXRlU2VsZWN0b3IoJ3JjTGlzdCcsIHRydWUpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbnMgdngtbXItMVwiPiYjeGU5MGM7PC9pPiBFRElUXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gUHJvZ3JhbSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cC1yb3dcIiBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVNlbGVjdG9yID09PSAncmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzJ1wiIFtjbGFzcy5kaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgYWN0aXZlU2VsZWN0b3IgJiZcbiAgICAgICAgICAgICAgYWN0aXZlU2VsZWN0b3IgIT09ICdyZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMnICYmXG4gICAgICAgICAgICAgIGFjdGl2ZVNlbGVjdG9yICE9PSAnbmFtZSdcbiAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlXCI+XG4gICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgIGFsbFByb2dhbVNlbGVjdGVkPy5sZW5ndGggPT1cbiAgICAgICAgICAgICAgICAgICAgMCB8fCBhY3RpdmVTZWxlY3RvciA9PT0gJ3Jlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcydcbiAgICAgICAgICAgICAgICBcIiBbbmdTcmNdPVwiQVNTRVRTLmRhc2hCb2FyZFByb2dyYW1JY29uXCIgYWx0PVwiXCIgd2lkdGg9XCIzNlwiIGhlaWdodD1cIjM2XCIgLz5cbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgYWxsUHJvZ2FtU2VsZWN0ZWQ/Lmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZVNlbGVjdG9yICE9PSAncmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzJ1xuICAgICAgICAgICAgICAgIFwiIGNsYXNzPVwiY2hlY2tJY29uXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgNTIgNTJcIj5cbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwiY2hlY2tJY29uX19jaXJjbGVcIiBjeD1cIjI2XCIgY3k9XCIyNlwiIHI9XCIyNVwiIGZpbGw9XCJub25lXCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBjbGFzcz1cImNoZWNrSWNvbl9fY2hlY2tcIiBmaWxsPVwibm9uZVwiIGQ9XCJNMTQuMSAyNy4ybDcuMSA3LjIgMTYuNy0xNi44XCIgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2eC1mb3JtLWdyb3VwIHZ4LWQtYmxvY2sgdngtbWItNFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2eC1mcy0xMSB2eC1mdy01MDAgdngtbGFiZWwtdHh0IHZ4LWQtYmxvY2sgdngtdHQtdXBwZXJjYXNlIHZ4LW1iLTIgdngtdy0xMDAgdngtbGgtNFwiPlBST0dSQU08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgYWxsUHJvZ2FtU2VsZWN0ZWQ/Lmxlbmd0aCA9PSAwXG4gICAgICAgICAgICAgICAgICBcIiBjbGFzcz1cInNlbGVjdEJveEVuYWJsZSB2eC1wbC0zIHZ4LXByLTMgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZhdGVTZWxlY3RvcigncmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzJywgdHJ1ZSlcIiBbY2xhc3MuZXJyb3JdPVwiXG4gICAgICAgICAgICAgICAgICAgIHN1Ym1pdHRlZCAmJlxuICAgICAgICAgICAgICAgICAgICBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFJlc3BvbnNpYmlsaXR5Q2VudGVycz8ubGVuZ3RoID09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgYWxsUHJvZ2FtU2VsZWN0ZWQ/Lmxlbmd0aCA9PVxuICAgICAgICAgICAgICAgICAgICAgIDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRSaXNrQ2F0ZWdvcmllcz8ubGVuZ3RoID09IDBcbiAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdEJveFBsYWNlaG9kZXIgdngtZnMtMTMgdngtcGFyYWdyYXBoLXR4dCB2eC1saC00XCI+XG4gICAgICAgICAgICAgICAgICAgIFNlbGVjdCB0aGUgUHJvZ3JhbShzKSB0aGF0IHlvdSB3b3VsZCBsaWtlIGRpc3BsYXllZCBpblxuICAgICAgICAgICAgICAgICAgICB0aGU8YnIgLz5EYXNoYm9hcmQsIGlmIGFueS5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBhbGxQcm9nYW1TZWxlY3RlZD8ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgXCIgY2xhc3M9XCJzZWxlY3RCb3hTdWNjZXNzIHZ4LXBsLTIgdngtcHItMyB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyIHZ4LWp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXBDb250YWluZXIgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciB2eC1wbC0yIHZ4LXByLTJcIiAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgckNhdGVnb3J5IG9mIGFsbFByb2dhbVNlbGVjdGVkPy5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29ucyBjcm9zcyB2eC1mcy0xMiB2eC1wYXJhZ3JhcGgtdHh0IHZ4LW1yLTFcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmUoJ3Jlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcycsIHJDYXRlZ29yeSlcIj4mI3hlOWFlOzwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwTmFtZSB2eC1mcy0xMSB2eC1sYWJlbC10eHRcIiBbYXJUb29sdGlwXT1cInJDYXRlZ29yeS5pdGVtX25hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1sZWZ0XCIgZGVsYXk9XCIwXCIgdHlwZT1cImJsYWNrXCIgW3Rvb2x0aXBNYW5kYXRvcnldPVwiZmFsc2VcIj57eyByQ2F0ZWdvcnkubmFtZVxuICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxQcm9nYW1TZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/Lmxlbmd0aCA+IDFcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY291bnRCdG4gdngtZnMtOSB2eC1mdy01MDAgdngtdHh0LXdoaXRlIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXIgdngtanVzdGlmeS1jZW50ZXIgdngtbGgtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgYXBwUG9wb3ZlciAoY2xpY2spPVwickNhdGVnb3J5TGlzdC5wb3BvdmVyKClcIiBwbGFjZW1lbnQ9XCJsZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgK3t7XG4gICAgICAgICAgICAgICAgICAgICAgYWxsUHJvZ2FtU2VsZWN0ZWQ/LnNsaWNlKFxuICAgICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgICAgICApLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxhcHAtcG9wb3ZlciAjckNhdGVnb3J5TGlzdCBbZG9udENsb3Nlb25DbGlja109XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJhY3Rpb24taXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgckNhdGVnb3J5IG9mIGFsbFByb2dhbVNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2xpY2UgOiAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGogPSBpbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdmF0YXItY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2YWx1ZVwiIFthclRvb2x0aXBdPVwickNhdGVnb3J5Py5uYW1lXCIgcGxhY2VtZW50PVwiYm90dG9tLWxlZnRcIiBkZWxheT1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYmxhY2tcIiBbdG9vbHRpcE1hbmRhdG9yeV09XCJmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImljb25zIGNyb3NzLWljb25cIiAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXNwb25zaWJpbGl0eUNhdGVnb3JpZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByQ2F0ZWdvcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj4mI3hlOTBkOzwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgckNhdGVnb3J5Py5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2FwcC1wb3BvdmVyPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJhY3RpdmVTZWxlY3RvciAhPT0gJ3Jlc3BvbnNpYmlsaXR5Q2F0ZWdvcmllcydcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVkaXRCdG4gdngtZnMtMTEgdngtZnctNjAwIHZ4LXR4dC1ibHVlIHZ4LXR0LXVwcGVyY2FzZSB2eC1wLTAgdngtbS0wIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZhdGVTZWxlY3RvcigncmVzcG9uc2liaWxpdHlDYXRlZ29yaWVzJywgdHJ1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29ucyB2eC1tci0xXCI+JiN4ZTkwYzs8L2k+IEVESVRcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICA8IS0tIFRpbWVmcmFtZSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cC1yb3dcIiBbY2xhc3MuZGlzYWJsZWRdPVwiYWN0aXZlU2VsZWN0b3IgJiYgYWN0aXZlU2VsZWN0b3IgIT09ICduYW1lJ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlXCI+XG4gICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICFkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZEZyb21EYXRlIHx8XG4gICAgICAgICAgICAgICAgICAhZGFzaGJvYXJkRm9ybT8uc2VsZWN0ZWRUb0RhdGVcbiAgICAgICAgICAgICAgICBcIiBbbmdTcmNdPVwiQVNTRVRTLmRhc2hCb2FyZFRpbWVGcmFtZUljb25cIiBhbHQ9XCJcIiB3aWR0aD1cIjM2XCIgaGVpZ2h0PVwiMzZcIiAvPlxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZEZyb21EYXRlICYmXG4gICAgICAgICAgICAgICAgICBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFRvRGF0ZVxuICAgICAgICAgICAgICAgIFwiIGNsYXNzPVwiY2hlY2tJY29uXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgNTIgNTJcIj5cbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwiY2hlY2tJY29uX19jaXJjbGVcIiBjeD1cIjI2XCIgY3k9XCIyNlwiIHI9XCIyNVwiIGZpbGw9XCJub25lXCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBjbGFzcz1cImNoZWNrSWNvbl9fY2hlY2tcIiBmaWxsPVwibm9uZVwiIGQ9XCJNMTQuMSAyNy4ybDcuMSA3LjIgMTYuNy0xNi44XCIgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2eC1mb3JtLWdyb3VwIHZ4LWQtYmxvY2sgdngtbWItNFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2eC1mcy0xMSB2eC1mdy01MDAgdngtbGFiZWwtdHh0IHZ4LWQtYmxvY2sgdngtdHQtdXBwZXJjYXNlIHZ4LW1iLTIgdngtdy0xMDAgdngtbGgtNFwiPlRJTUVGUkFNRTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidngtY29udHJvbC1wYW5lbC1zdWItbGFiZWxcIj5TZWxlY3QgaG93IGxvbmcgdGhlIHNlbGVjdGVkIGluZm9ybWF0aW9uIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAgICAgICAgICAgICAgICBPbmNlIHRoZSBzZWxlY3RlZCB0aW1lZnJhbWUgZXhwaXJlcywgdGhlIGRhc2hib2FyZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGVhY3RpdmF0ZWQgYW5kIG5vIGxvbmdlclxuICAgICAgICAgICAgICAgICAgZGlzcGxheWVkIHRvIHVzZXJzLiBJZiBubyB0aW1lZnJhbWUgaXMgc2VsZWN0ZWQsIHRoZSBpbmZvcm1hdGlvblxuICAgICAgICAgICAgICAgICAgd2lsbCBiZSBkaXNwbGF5ZWQgcGVybWFuZW50bHkuPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdngtZC1mbGV4IHZ4LWp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbnNcIj4mI3hlOTJkOzwvaT5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJmcm9tX2RhdGVcIiBbdmFsdWVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZEZyb21EYXRlIHwgZGF0ZSA6ICdkZCBNTU0geXl5eSdcbiAgICAgICAgICAgICAgICAgICAgICBcIiBbcGxhY2Vob2xkZXJdPVwiJ0Zyb20nXCIgKGNsaWNrKT1cIm9wZW5Gcm9tRGF0ZVBpY2tlcigkZXZlbnQpXCIgcmVhZG9ubHkgLz5cbiAgICAgICAgICAgICAgICAgICAgPGRwLWRhdGUtcGlja2VyICNmcm9tRGF0ZVBpY2tlciBbKG5nTW9kZWwpXT1cImRhc2hib2FyZEZvcm0uc2VsZWN0ZWRGcm9tRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgRGF0ZVwiIChvblNlbGVjdCk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlRnJvbURhdGVQaWNrZXIoKTsgZGF0ZVBpY2tlck92ZXJsYXkgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgIFwiIFtjb25maWddPVwiZnJvbURhdGVQaWNrZXJDb25maWdcIj48L2RwLWRhdGUtcGlja2VyPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheVwiIChjbGljayk9XCJjbG9zZUZyb21EYXRlUGlja2VyKClcIiAqbmdJZj1cImRhdGVQaWNrZXJPdmVybGF5XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXNlbGVjdFwiICpuZ0lmPVwiIWhpZGVUb0RhdGVcIiBbY2xhc3MuZGlzYWJsZWRdPVwiIWRhc2hib2FyZEZvcm0/LnNlbGVjdGVkRnJvbURhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29uc1wiPiYjeGU5MmQ7PC9pPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInRvX2RhdGVcIiBbdmFsdWVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXNoYm9hcmRGb3JtPy5zZWxlY3RlZFRvRGF0ZSB8IGRhdGUgOiAnZGQgTU1NIHl5eXknXG4gICAgICAgICAgICAgICAgICAgICAgXCIgW3BsYWNlaG9sZGVyXT1cIidUbydcIiAoY2xpY2spPVwib3BlblRvRGF0ZVBpY2tlcigkZXZlbnQpXCIgcmVhZG9ubHkgLz5cbiAgICAgICAgICAgICAgICAgICAgPGRwLWRhdGUtcGlja2VyICN0b0RhdGVQaWNrZXIgWyhuZ01vZGVsKV09XCJkYXNoYm9hcmRGb3JtLnNlbGVjdGVkVG9EYXRlXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0KT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VUb0RhdGVQaWNrZXIoKTsgZGF0ZVBpY2tlck92ZXJsYXkgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgIFwiIFtjb25maWddPVwidG9EYXRlUGlja2VyQ29uZmlnXCI+PC9kcC1kYXRlLXBpY2tlcj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXlcIiAoY2xpY2spPVwiY2xvc2VUb0RhdGVQaWNrZXIoKVwiICpuZ0lmPVwiZGF0ZVBpY2tlck92ZXJsYXlcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidngtdHh0LWVycm9yXCIgW2FwcFNjcm9sbEluVmlld109XCJ0cnVlXCIgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgc3VibWl0dGVkICYmXG4gICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0uc2VsZWN0ZWRGcm9tRGF0ZSAmJlxuICAgICAgICAgICAgICAgICAgICAhZGFzaGJvYXJkRm9ybS5zZWxlY3RlZFRvRGF0ZVxuICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICBTZWxlY3QgYSB0aW1lLWZyYW1lLlxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gRW1haWwgU3VtbWFyeSAtLT5cbiAgICAgICAgICA8IS0tIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1ncm91cC1yb3dcIlxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVTZWxlY3RvciA9PT0gJ2ZyZXF1ZW5jeSdcIlxuICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIlxuICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciAmJlxuICAgICAgICAgICAgICBhY3RpdmVTZWxlY3RvciAhPT0gJ2ZyZXF1ZW5jeScgJiZcbiAgICAgICAgICAgICAgYWN0aXZlU2VsZWN0b3IgIT09ICduYW1lJ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2VcIj5cbiAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICpuZ0lmPVwiIWRhc2hib2FyZEZvcm0uZnJlcXVlbmN5TWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgW25nU3JjXT1cIkFTU0VUUy5kYXNoQm9hcmRFbWFpbFN1bW1hcmllc0ljb25cIlxuICAgICAgICAgICAgICAgIGFsdD1cIlwiXG4gICAgICAgICAgICAgICAgd2lkdGg9XCIzNlwiXG4gICAgICAgICAgICAgICAgaGVpZ2h0PVwiMzZcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJkYXNoYm9hcmRGb3JtLmZyZXF1ZW5jeU1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tJY29uXCJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDUyIDUyXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tJY29uX19jaXJjbGVcIlxuICAgICAgICAgICAgICAgICAgY3g9XCIyNlwiXG4gICAgICAgICAgICAgICAgICBjeT1cIjI2XCJcbiAgICAgICAgICAgICAgICAgIHI9XCIyNVwiXG4gICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja0ljb25fX2NoZWNrXCJcbiAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgIGQ9XCJNMTQuMSAyNy4ybDcuMSA3LjIgMTYuNy0xNi44XCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm1cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZ4LWZvcm0tZ3JvdXAgdngtZC1ibG9ja1wiPlxuICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2eC1mcy0xMSB2eC1mdy01MDAgdngtbGFiZWwtdHh0IHZ4LWQtYmxvY2sgdngtdHQtdXBwZXJjYXNlIHZ4LW1iLTIgdngtdy0xMDAgdngtbGgtNFwiXG4gICAgICAgICAgICAgICAgICA+RW1haWwgU3VtbWFyaWVzPC9sYWJlbFxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ2eC1jb250cm9sLXBhbmVsLXN1Yi1sYWJlbFwiXG4gICAgICAgICAgICAgICAgICA+SWYgeW91IHdvdWxkIGxpa2UgdG8gc2VuZCBhIHN1bW1hcnkgb2YgdGhpcyBEYXNoYm9hcmQsIHBsZWFzZVxuICAgICAgICAgICAgICAgICAgc2VsZWN0IGEgZnJlcXVlbmN5KEJ5IGRlZmF1bHQgVkNvbXBseSBzZW5kcyBhIHdlZWtseVxuICAgICAgICAgICAgICAgICAgU3VtbWFyeSkuPC9sYWJlbFxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIiFkYXNoYm9hcmRGb3JtLmZyZXF1ZW5jeU1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3RCb3hFbmFibGUgdngtcGwtMyB2eC1wci0zIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2YXRlU2VsZWN0b3IoJ2ZyZXF1ZW5jeScsIHRydWUpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Qm94UGxhY2Vob2RlciB2eC1mcy0xMyB2eC1wYXJhZ3JhcGgtdHh0IHZ4LWxoLTRcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBFbWFpbCBTdW1tYXJpZXNcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkYXNoYm9hcmRGb3JtLmZyZXF1ZW5jeU1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3RCb3hTdWNjZXNzIHZ4LXBsLTIgdngtcHItMyB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyIHZ4LWp1c3RpZnktYmV0d2VlblwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdEJveFRleHQgdngtZnMtMTMgdngtcGFyYWdyYXBoLXR4dFwiXG4gICAgICAgICAgICAgICAgICAgIFthclRvb2x0aXBdPVwiZGFzaGJvYXJkRm9ybS5mcmVxdWVuY3lNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tLWxlZnRcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYmxhY2tcIlxuICAgICAgICAgICAgICAgICAgICBkZWxheT1cIjBcIlxuICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcE1hbmRhdG9yeV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiZGFzaGJvYXJkRm9ybS5mcmVxdWVuY3lNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgID48L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZEZvcm0uZnJlcXVlbmN5TWVzc2FnZSAmJlxuICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNlbGVjdG9yICE9PSAnZnJlcXVlbmN5J1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVkaXRCdG4gdngtZnMtMTEgdngtZnctNjAwIHZ4LXR4dC1ibHVlIHZ4LXR0LXVwcGVyY2FzZSB2eC1wLTAgdngtbS0wIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZhdGVTZWxlY3RvcignZnJlcXVlbmN5JywgdHJ1ZSlcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImljb25zIHZ4LW1yLTFcIj4mI3hlOTBjOzwvaT4gRURJVFxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbi1ibG9ja1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ2eC1idG4gYmxvY2sgcHJpbWFyeVwiIFtkaXNhYmxlZF09XCJhY3RpdmVTZWxlY3RvciAmJiBhY3RpdmVTZWxlY3RvciAhPT0gJ25hbWUnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjb25maWd1cmVEYXNoYm9hcmQoKVwiPlxuICAgICAgICAgICAgTmV4dDogQ29uZmlndXJlIFdpZGdldHNcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImNsb3NlLWRpYWxvZ1wiIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiYWN0aXZlU2VsZWN0b3IgJiYgYWN0aXZlU2VsZWN0b3IgIT09ICduYW1lJ1wiXG4gICAgICAgIChjbGljayk9XCJjbG9zZS5lbWl0KHsgbW9kZTogJ2Rpc2NhcmQnIH0pXCIgW2FyVG9vbHRpcF09XCInW0VzY10gdG8gY2xvc2UnXCIgcGxhY2VtZW50PVwibGVmdFwiIHR5cGU9XCJibGFja1wiIGRlbGF5PVwiMFwiXG4gICAgICAgIFt0b29sdGlwTWFuZGF0b3J5XT1cInRydWVcIiBbY2xhc3MuaGlkZV09XCJhY3RpdmVTZWxlY3RvciAmJiBhY3RpdmVTZWxlY3RvciAhPT0gJ25hbWUnXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiaWNvbnNcIj4mI3hlOTNmOzwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGRpdiBjbGFzcz1cImdsb2JhbC1jb25maXJtYXRpb24tYWxlcnRcIiAqbmdJZj1cIlxuICAgICAgICAgIHN1Ym1pdHRlZCAmJlxuICAgICAgICAgIGRhc2hib2FyZEZvcm0/LnNlbGVjdGVkUmVzcG9uc2liaWxpdHlDZW50ZXJzPy5sZW5ndGggPT0gMCBcbiAgICAgICAgXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJnbG9iYWwtY29uZmlybWF0aW9uLWFsZXJ0LXRvcFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1ibG9ja1wiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29uc1wiPiYjeGU5MzA7PC9pPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8cCBjbGFzcz1cInRleHRcIiAqbmdJZj1cInNob3dSaXNrQ2F0ZWdvcnlcIj5cbiAgICAgICAgICAgIFNlbGVjdCBhIFJlc3BvbnNpYmlsaXR5IENlbnRlciBvciBSaXNrIENhdGVnb3J5LlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8cCBjbGFzcz1cInRleHRcIiAqbmdJZj1cIiFzaG93Umlza0NhdGVnb3J5XCI+XG4gICAgICAgICAgICBTZWxlY3QgYSBSZXNwb25zaWJpbGl0eSBDZW50ZXIuXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdsb2JhbC1jb25maXJtYXRpb24tYWxlcnQtYm90dG9tXCI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJtZXNzYWdlXCI+PC9wPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJmaWxsXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzdWJtaXR0ZWQgPSBmYWxzZVwiPlxuICAgICAgICAgICAgICBPS0FZXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGFwcC1zbWlsZXktZGlhbG9nICpuZ0lmPVwiaXNTbWlsZXlcIiBbbWVzc2FnZV09XCJzbWlsZXlNZXNzYWdlXCI+PC9hcHAtc21pbGV5LWRpYWxvZz5cblxuPGFwcC1jb25maWd1cmUtd2lkZ2V0cyAqbmdJZj1cIm9wZW5Db25maWd1cmVXaWRnZXRzXCIgW21vZGVdPVwibW9kZVwiIFtkaXNwbGF5ZWRXaWRnZXRzXT1cImRpc3BsYXllZFdpZGdldHNcIlxuICBbc2hvd1Jpc2tdPVwic2hvd1Jpc2tXaWRnZXRzXCIgW3Nob3dDb21wbGlhbmNlXT1cIiFzaG93Q29tcGxpYW5jZVdpZGdldHNcIiBbc2VsZWN0ZWRXaWRnZXRzRGF0YV09XCJzZWxlY3RlZFdpZGdldHNcIlxuICAod2lkZ2V0c0RhdGFNb2RpZmllZCk9XCJzZXRTZWxlY3RlZFdpZGdldHMoJGV2ZW50KVwiXG4gIChjbG9zZUNvbmZpZ3VyZVdpZGdldHMpPVwiY2xvc2VDb25maWd1cmVXaWRnZXRzKCRldmVudClcIj48L2FwcC1jb25maWd1cmUtd2lkZ2V0cz4iXX0=