@deeksha2309/sunbird-collection-editor 8.0.7

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 (204) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/collection-editor-cursor.service.mjs +3 -0
  3. package/esm2022/lib/collection-editor-library.component.mjs +16 -0
  4. package/esm2022/lib/collection-editor-library.module.mjs +137 -0
  5. package/esm2022/lib/components/answer/answer.component.mjs +43 -0
  6. package/esm2022/lib/components/asset-browser/asset-browser.component.mjs +325 -0
  7. package/esm2022/lib/components/asset-browser/asset-browser.data.mjs +53 -0
  8. package/esm2022/lib/components/assign-page-number/assign-page-number.component.mjs +191 -0
  9. package/esm2022/lib/components/ckeditor-tool/ckeditor-tool.component.mjs +895 -0
  10. package/esm2022/lib/components/collection-icon/collection-icon.component.mjs +43 -0
  11. package/esm2022/lib/components/contentplayer-page/contentplayer-page.component.mjs +351 -0
  12. package/esm2022/lib/components/csv-upload/csv-upload.component.mjs +178 -0
  13. package/esm2022/lib/components/dialcode/dialcode.component.mjs +182 -0
  14. package/esm2022/lib/components/editor/editor.component.mjs +1125 -0
  15. package/esm2022/lib/components/fancy-tree/fancy-tree.component.mjs +529 -0
  16. package/esm2022/lib/components/header/header.component.mjs +123 -0
  17. package/esm2022/lib/components/library/library.component.mjs +242 -0
  18. package/esm2022/lib/components/library-filter/library-filter.component.mjs +149 -0
  19. package/esm2022/lib/components/library-list/library-list.component.mjs +92 -0
  20. package/esm2022/lib/components/library-player/library-player.component.mjs +62 -0
  21. package/esm2022/lib/components/manage-collaborator/manage-collaborator.component.mjs +256 -0
  22. package/esm2022/lib/components/meta-form/meta-form.component.mjs +377 -0
  23. package/esm2022/lib/components/options/options.component.mjs +144 -0
  24. package/esm2022/lib/components/plain-tree/plain-tree.component.mjs +125 -0
  25. package/esm2022/lib/components/progress-status/progress-status.component.mjs +46 -0
  26. package/esm2022/lib/components/publish-checklist/publish-checklist.component.mjs +67 -0
  27. package/esm2022/lib/components/quality-params-modal/quality-params-modal.component.mjs +52 -0
  28. package/esm2022/lib/components/question/question.component.mjs +1360 -0
  29. package/esm2022/lib/components/quml-player/quml-player.component.mjs +73 -0
  30. package/esm2022/lib/components/qumlplayer-page/qumlplayer-page.component.mjs +84 -0
  31. package/esm2022/lib/components/resource-reorder/resource-reorder.component.mjs +143 -0
  32. package/esm2022/lib/components/skeleton-loader/skeleton-loader.component.mjs +26 -0
  33. package/esm2022/lib/components/template/template.component.mjs +42 -0
  34. package/esm2022/lib/components/term-and-condition/term-and-condition.component.mjs +68 -0
  35. package/esm2022/lib/directives/telemetry-interact/telemetry-interact.directive.mjs +33 -0
  36. package/esm2022/lib/interfaces/McqForm.mjs +29 -0
  37. package/esm2022/lib/interfaces/editor.mjs +2 -0
  38. package/esm2022/lib/interfaces/framework.mjs +2 -0
  39. package/esm2022/lib/interfaces/httpOptions.mjs +2 -0
  40. package/esm2022/lib/interfaces/requestParam.mjs +2 -0
  41. package/esm2022/lib/interfaces/serverResponse.mjs +2 -0
  42. package/esm2022/lib/pipes/sanitize-html.pipe.mjs +20 -0
  43. package/esm2022/lib/services/config/category.config.json +8 -0
  44. package/esm2022/lib/services/config/config.service.mjs +27 -0
  45. package/esm2022/lib/services/config/editor.config.json +31 -0
  46. package/esm2022/lib/services/config/label.config.json +314 -0
  47. package/esm2022/lib/services/config/player.config.json +96 -0
  48. package/esm2022/lib/services/config/url.config.json +69 -0
  49. package/esm2022/lib/services/data/data.service.mjs +192 -0
  50. package/esm2022/lib/services/dialcode/dialcode.service.mjs +309 -0
  51. package/esm2022/lib/services/editor/editor.service.mjs +682 -0
  52. package/esm2022/lib/services/framework/framework.service.mjs +106 -0
  53. package/esm2022/lib/services/helper/helper.service.mjs +160 -0
  54. package/esm2022/lib/services/player/player.service.mjs +99 -0
  55. package/esm2022/lib/services/public-data/public-data.service.mjs +21 -0
  56. package/esm2022/lib/services/question/question.service.mjs +167 -0
  57. package/esm2022/lib/services/telemetry/telemetry.service.mjs +120 -0
  58. package/esm2022/lib/services/toaster/toaster.service.mjs +105 -0
  59. package/esm2022/lib/services/tree/tree.service.mjs +284 -0
  60. package/esm2022/project-sunbird-sunbird-collection-editor.mjs +5 -0
  61. package/esm2022/public-api.mjs +4 -0
  62. package/fesm2022/project-sunbird-sunbird-collection-editor.mjs +10138 -0
  63. package/fesm2022/project-sunbird-sunbird-collection-editor.mjs.map +1 -0
  64. package/index.d.ts +6 -0
  65. package/lib/assets/.gitkeep +0 -0
  66. package/lib/assets/images/MCQ.png +0 -0
  67. package/lib/assets/images/Spin.gif +0 -0
  68. package/lib/assets/images/bulkuploadfile.png +0 -0
  69. package/lib/assets/images/cancel-sign copy.png +0 -0
  70. package/lib/assets/images/cancel-sign.png +0 -0
  71. package/lib/assets/images/emptyResult.svg +1 -0
  72. package/lib/assets/images/icons-rtl.gif +0 -0
  73. package/lib/assets/images/icons.gif +0 -0
  74. package/lib/assets/images/imageicon.svg +16 -0
  75. package/lib/assets/images/imageicon_blue.svg +16 -0
  76. package/lib/assets/images/layoutoneicon.svg +16 -0
  77. package/lib/assets/images/layoutoneicon_blue.svg +16 -0
  78. package/lib/assets/images/layoutthreeicon.svg +18 -0
  79. package/lib/assets/images/layoutthreeicon_blue.svg +18 -0
  80. package/lib/assets/images/layouttwoicon.svg +18 -0
  81. package/lib/assets/images/layouttwoicon_blue.svg +18 -0
  82. package/lib/assets/images/leftalignicon.svg +17 -0
  83. package/lib/assets/images/leftalignicon_blue.svg +17 -0
  84. package/lib/assets/images/loader.gif +0 -0
  85. package/lib/assets/images/loader.svg +1 -0
  86. package/lib/assets/images/loading.gif +0 -0
  87. package/lib/assets/images/middlealignicon.svg +17 -0
  88. package/lib/assets/images/middlealignicon_blue.svg +17 -0
  89. package/lib/assets/images/question_collection.svg +18 -0
  90. package/lib/assets/images/rightalignicon.svg +17 -0
  91. package/lib/assets/images/rightalignicon_blue.svg +17 -0
  92. package/lib/assets/images/vline-rtl.gif +0 -0
  93. package/lib/assets/images/vline.gif +0 -0
  94. package/lib/assets/images/writing.png +0 -0
  95. package/lib/collection-editor-cursor.service.d.ts +5 -0
  96. package/lib/collection-editor-cursor.service.d.ts.map +1 -0
  97. package/lib/collection-editor-library.component.d.ts +9 -0
  98. package/lib/collection-editor-library.component.d.ts.map +1 -0
  99. package/lib/collection-editor-library.module.d.ts +50 -0
  100. package/lib/collection-editor-library.module.d.ts.map +1 -0
  101. package/lib/components/answer/answer.component.d.ts +24 -0
  102. package/lib/components/answer/answer.component.d.ts.map +1 -0
  103. package/lib/components/asset-browser/asset-browser.component.d.ts +81 -0
  104. package/lib/components/asset-browser/asset-browser.component.d.ts.map +1 -0
  105. package/lib/components/asset-browser/asset-browser.data.d.ts +52 -0
  106. package/lib/components/asset-browser/asset-browser.data.d.ts.map +1 -0
  107. package/lib/components/assign-page-number/assign-page-number.component.d.ts +38 -0
  108. package/lib/components/assign-page-number/assign-page-number.component.d.ts.map +1 -0
  109. package/lib/components/ckeditor-tool/ckeditor-tool.component.d.ts +161 -0
  110. package/lib/components/ckeditor-tool/ckeditor-tool.component.d.ts.map +1 -0
  111. package/lib/components/collection-icon/collection-icon.component.d.ts +18 -0
  112. package/lib/components/collection-icon/collection-icon.component.d.ts.map +1 -0
  113. package/lib/components/contentplayer-page/contentplayer-page.component.d.ts +54 -0
  114. package/lib/components/contentplayer-page/contentplayer-page.component.d.ts.map +1 -0
  115. package/lib/components/csv-upload/csv-upload.component.d.ts +42 -0
  116. package/lib/components/csv-upload/csv-upload.component.d.ts.map +1 -0
  117. package/lib/components/dialcode/dialcode.component.d.ts +48 -0
  118. package/lib/components/dialcode/dialcode.component.d.ts.map +1 -0
  119. package/lib/components/editor/editor.component.d.ts +146 -0
  120. package/lib/components/editor/editor.component.d.ts.map +1 -0
  121. package/lib/components/fancy-tree/fancy-tree.component.d.ts +77 -0
  122. package/lib/components/fancy-tree/fancy-tree.component.d.ts.map +1 -0
  123. package/lib/components/header/header.component.d.ts +46 -0
  124. package/lib/components/header/header.component.d.ts.map +1 -0
  125. package/lib/components/library/library.component.d.ts +69 -0
  126. package/lib/components/library/library.component.d.ts.map +1 -0
  127. package/lib/components/library-filter/library-filter.component.d.ts +47 -0
  128. package/lib/components/library-filter/library-filter.component.d.ts.map +1 -0
  129. package/lib/components/library-list/library-list.component.d.ts +32 -0
  130. package/lib/components/library-list/library-list.component.d.ts.map +1 -0
  131. package/lib/components/library-player/library-player.component.d.ts +24 -0
  132. package/lib/components/library-player/library-player.component.d.ts.map +1 -0
  133. package/lib/components/manage-collaborator/manage-collaborator.component.d.ts +75 -0
  134. package/lib/components/manage-collaborator/manage-collaborator.component.d.ts.map +1 -0
  135. package/lib/components/meta-form/meta-form.component.d.ts +51 -0
  136. package/lib/components/meta-form/meta-form.component.d.ts.map +1 -0
  137. package/lib/components/options/options.component.d.ts +53 -0
  138. package/lib/components/options/options.component.d.ts.map +1 -0
  139. package/lib/components/plain-tree/plain-tree.component.d.ts +20 -0
  140. package/lib/components/plain-tree/plain-tree.component.d.ts.map +1 -0
  141. package/lib/components/progress-status/progress-status.component.d.ts +25 -0
  142. package/lib/components/progress-status/progress-status.component.d.ts.map +1 -0
  143. package/lib/components/publish-checklist/publish-checklist.component.d.ts +23 -0
  144. package/lib/components/publish-checklist/publish-checklist.component.d.ts.map +1 -0
  145. package/lib/components/quality-params-modal/quality-params-modal.component.d.ts +24 -0
  146. package/lib/components/quality-params-modal/quality-params-modal.component.d.ts.map +1 -0
  147. package/lib/components/question/question.component.d.ts +215 -0
  148. package/lib/components/question/question.component.d.ts.map +1 -0
  149. package/lib/components/quml-player/quml-player.component.d.ts +26 -0
  150. package/lib/components/quml-player/quml-player.component.d.ts.map +1 -0
  151. package/lib/components/qumlplayer-page/qumlplayer-page.component.d.ts +31 -0
  152. package/lib/components/qumlplayer-page/qumlplayer-page.component.d.ts.map +1 -0
  153. package/lib/components/resource-reorder/resource-reorder.component.d.ts +45 -0
  154. package/lib/components/resource-reorder/resource-reorder.component.d.ts.map +1 -0
  155. package/lib/components/skeleton-loader/skeleton-loader.component.d.ts +13 -0
  156. package/lib/components/skeleton-loader/skeleton-loader.component.d.ts.map +1 -0
  157. package/lib/components/template/template.component.d.ts +21 -0
  158. package/lib/components/template/template.component.d.ts.map +1 -0
  159. package/lib/components/term-and-condition/term-and-condition.component.d.ts +26 -0
  160. package/lib/components/term-and-condition/term-and-condition.component.d.ts.map +1 -0
  161. package/lib/directives/telemetry-interact/telemetry-interact.directive.d.ts +27 -0
  162. package/lib/directives/telemetry-interact/telemetry-interact.directive.d.ts.map +1 -0
  163. package/lib/interfaces/McqForm.d.ts +32 -0
  164. package/lib/interfaces/McqForm.d.ts.map +1 -0
  165. package/lib/interfaces/editor.d.ts +78 -0
  166. package/lib/interfaces/editor.d.ts.map +1 -0
  167. package/lib/interfaces/framework.d.ts +46 -0
  168. package/lib/interfaces/framework.d.ts.map +1 -0
  169. package/lib/interfaces/httpOptions.d.ts +35 -0
  170. package/lib/interfaces/httpOptions.d.ts.map +1 -0
  171. package/lib/interfaces/requestParam.d.ts +24 -0
  172. package/lib/interfaces/requestParam.d.ts.map +1 -0
  173. package/lib/interfaces/serverResponse.d.ts +38 -0
  174. package/lib/interfaces/serverResponse.d.ts.map +1 -0
  175. package/lib/pipes/sanitize-html.pipe.d.ts +11 -0
  176. package/lib/pipes/sanitize-html.pipe.d.ts.map +1 -0
  177. package/lib/services/config/config.service.d.ts +13 -0
  178. package/lib/services/config/config.service.d.ts.map +1 -0
  179. package/lib/services/data/data.service.d.ts +85 -0
  180. package/lib/services/data/data.service.d.ts.map +1 -0
  181. package/lib/services/dialcode/dialcode.service.d.ts +36 -0
  182. package/lib/services/dialcode/dialcode.service.d.ts.map +1 -0
  183. package/lib/services/editor/editor.service.d.ts +150 -0
  184. package/lib/services/editor/editor.service.d.ts.map +1 -0
  185. package/lib/services/framework/framework.service.d.ts +35 -0
  186. package/lib/services/framework/framework.service.d.ts.map +1 -0
  187. package/lib/services/helper/helper.service.d.ts +41 -0
  188. package/lib/services/helper/helper.service.d.ts.map +1 -0
  189. package/lib/services/player/player.service.d.ts +33 -0
  190. package/lib/services/player/player.service.d.ts.map +1 -0
  191. package/lib/services/public-data/public-data.service.d.ts +15 -0
  192. package/lib/services/public-data/public-data.service.d.ts.map +1 -0
  193. package/lib/services/question/question.service.d.ts +30 -0
  194. package/lib/services/question/question.service.d.ts.map +1 -0
  195. package/lib/services/telemetry/telemetry.service.d.ts +45 -0
  196. package/lib/services/telemetry/telemetry.service.d.ts.map +1 -0
  197. package/lib/services/toaster/toaster.service.d.ts +50 -0
  198. package/lib/services/toaster/toaster.service.d.ts.map +1 -0
  199. package/lib/services/tree/tree.service.d.ts +51 -0
  200. package/lib/services/tree/tree.service.d.ts.map +1 -0
  201. package/package.json +32 -0
  202. package/project-sunbird-sunbird-collection-editor.d.ts.map +1 -0
  203. package/public-api.d.ts +4 -0
  204. package/public-api.d.ts.map +1 -0
@@ -0,0 +1,377 @@
1
+ import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
2
+ import { merge, of, Subject } from 'rxjs';
3
+ import * as _ from 'lodash-es';
4
+ import { takeUntil, filter, switchMap, map } from 'rxjs/operators';
5
+ import * as moment from 'moment';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../../services/editor/editor.service";
8
+ import * as i2 from "../../services/tree/tree.service";
9
+ import * as i3 from "../../services/framework/framework.service";
10
+ import * as i4 from "../../services/helper/helper.service";
11
+ import * as i5 from "../../services/config/config.service";
12
+ import * as i6 from "../../services/toaster/toaster.service";
13
+ import * as i7 from "@angular/common";
14
+ import * as i8 from "@project-sunbird/common-form-elements-full";
15
+ import * as i9 from "../collection-icon/collection-icon.component";
16
+ let framworkServiceTemp;
17
+ export class MetaFormComponent {
18
+ constructor(editorService, treeService, frameworkService, helperService, configService, toasterService) {
19
+ this.editorService = editorService;
20
+ this.treeService = treeService;
21
+ this.frameworkService = frameworkService;
22
+ this.helperService = helperService;
23
+ this.configService = configService;
24
+ this.toasterService = toasterService;
25
+ this.toolbarEmitter = new EventEmitter();
26
+ this.onComponentDestroy$ = new Subject();
27
+ this.frameworkDetails = {};
28
+ this.showAppIcon = false;
29
+ framworkServiceTemp = frameworkService;
30
+ }
31
+ ngOnInit() {
32
+ // Initialize component
33
+ }
34
+ ngOnChanges() {
35
+ this.fetchFrameWorkDetails();
36
+ this.setAppIconData();
37
+ if (_.has(this.nodeMetadata, 'data.metadata.shuffle')) {
38
+ this.setShuffleValue(this.nodeMetadata.data.metadata.shuffle);
39
+ }
40
+ }
41
+ setAppIconData() {
42
+ const isRootNode = _.get(this.nodeMetadata, 'data.root');
43
+ this.appIconConfig = _.find(_.flatten(_.map(this.rootFormConfig, 'fields')), { code: 'appIcon' });
44
+ if (_.isUndefined(this.appIconConfig)) {
45
+ this.appIconConfig = _.find(this.rootFormConfig, { code: 'appIcon' });
46
+ }
47
+ if (!_.isUndefined(this.appIconConfig) && isRootNode === true) {
48
+ this.showAppIcon = true;
49
+ }
50
+ else {
51
+ this.showAppIcon = false;
52
+ }
53
+ this.appIcon = _.get(this.nodeMetadata, 'data.metadata.appIcon');
54
+ if (this.isReviewMode()) {
55
+ this.appIconConfig = { ...this.appIconConfig, ...{ isAppIconEditable: false } };
56
+ }
57
+ else {
58
+ this.appIconConfig = { ...this.appIconConfig, ...{ isAppIconEditable: true } };
59
+ }
60
+ const ifEditable = this.ifFieldIsEditable('appIcon');
61
+ }
62
+ setShuffleValue(value) {
63
+ if (_.isBoolean(value)) {
64
+ this.helperService.setShuffleValue(value);
65
+ }
66
+ }
67
+ showShuffleMessage(event) {
68
+ this.subscription = this.helperService.shuffleValue.subscribe(shuffle => this.previousShuffleValue = shuffle);
69
+ if (_.isBoolean(event.shuffle) && event.shuffle === true && _.isBoolean(this.previousShuffleValue) && this.previousShuffleValue === false) {
70
+ this.toasterService.simpleInfo(_.get(this.configService, 'labelConfig.lbl.shuffleOnMessage'));
71
+ }
72
+ this.setShuffleValue(event.shuffle);
73
+ }
74
+ fetchFrameWorkDetails() {
75
+ if (this.frameworkService.organisationFramework) {
76
+ this.frameworkService.frameworkData$.pipe(takeUntil(this.onComponentDestroy$), filter(data => _.get(data, `frameworkdata.${this.frameworkService.organisationFramework}`))).subscribe((frameworkDetails) => {
77
+ if (frameworkDetails && !frameworkDetails.err) {
78
+ const frameworkData = frameworkDetails.frameworkdata[this.frameworkService.organisationFramework].categories;
79
+ this.frameworkDetails.frameworkData = frameworkData;
80
+ this.frameworkDetails.topicList = _.get(_.find(frameworkData, {
81
+ code: 'topic'
82
+ }), 'terms');
83
+ this.frameworkDetails.targetFrameworks = _.filter(frameworkDetails.frameworkdata, (value, key) => {
84
+ return _.includes(this.frameworkService.targetFrameworkIds, key);
85
+ });
86
+ this.attachDefaultValues();
87
+ }
88
+ });
89
+ }
90
+ else {
91
+ if (this.frameworkService.targetFrameworkIds) {
92
+ this.frameworkService.frameworkData$.pipe(takeUntil(this.onComponentDestroy$), filter(data => _.get(data, `frameworkdata.${_.first(this.frameworkService.targetFrameworkIds)}`))).subscribe((frameworkDetails) => {
93
+ if (frameworkDetails && !frameworkDetails.err) {
94
+ // const frameworkData = frameworkDetails.frameworkdata[this.frameworkService.targetFrameworkIds].categories;
95
+ // this.frameworkDetails.frameworkData = frameworkData;
96
+ // this.frameworkDetails.topicList = _.get(_.find(frameworkData, {
97
+ // code: 'topic'
98
+ // }), 'terms');
99
+ this.frameworkDetails.targetFrameworks = _.filter(frameworkDetails.frameworkdata, (value, key) => {
100
+ return _.includes(this.frameworkService.targetFrameworkIds, key);
101
+ });
102
+ this.attachDefaultValues();
103
+ }
104
+ });
105
+ }
106
+ }
107
+ }
108
+ attachDefaultValues() {
109
+ const metaDataFields = _.get(this.nodeMetadata, 'data.metadata');
110
+ // if (_.isEmpty(metaDataFields)) { return; }
111
+ const isRoot = _.get(metaDataFields, 'data.root');
112
+ const categoryMasterList = this.frameworkDetails.frameworkData ||
113
+ !isRoot && this.frameworkService.selectedOrganisationFramework &&
114
+ _.get(this.frameworkService.selectedOrganisationFramework, 'framework.categories');
115
+ // tslint:disable-next-line:max-line-length
116
+ let formConfig = (_.get(metaDataFields, 'visibility') === 'Default') ? _.cloneDeep(this.rootFormConfig) : _.cloneDeep(this.unitFormConfig);
117
+ formConfig = formConfig && _.has(_.first(formConfig), 'fields') ? formConfig : [{ name: '', fields: formConfig }];
118
+ if (!_.isEmpty(this.frameworkDetails.targetFrameworks)) {
119
+ const fieldTermsMap = new Map();
120
+ _.forEach(this.frameworkDetails.targetFrameworks, (framework) => {
121
+ _.forEach(formConfig, (section) => {
122
+ _.forEach(section.fields, field => {
123
+ const frameworkCategory = _.find(framework.categories, category => {
124
+ return category.code === field.sourceCategory && _.includes(field.code, 'target');
125
+ });
126
+ if (!_.isEmpty(frameworkCategory)) {
127
+ field.terms = _.cloneDeep(frameworkCategory.terms);
128
+ fieldTermsMap.set(field.code, field.terms);
129
+ }
130
+ });
131
+ });
132
+ });
133
+ _.forEach(formConfig, (section) => {
134
+ const fields = section.fields || [];
135
+ for (let i = 0; i < fields.length - 1; i++) {
136
+ const currentField = fields[i];
137
+ const nextField = fields[i + 1];
138
+ const nextFieldDependsOnCurrent = nextField.depends && Array.isArray(nextField.depends) && nextField.depends.includes(currentField.code);
139
+ if (currentField.terms && fieldTermsMap.has(nextField.code) && nextFieldDependsOnCurrent) {
140
+ const nextFieldTerms = fieldTermsMap.get(nextField.code);
141
+ currentField.terms.forEach(term => {
142
+ if (term && (!term.associations || _.isEmpty(term.associations))) {
143
+ term.associations = nextFieldTerms.map(nextTerm => ({
144
+ identifier: nextTerm.identifier,
145
+ code: nextTerm.code,
146
+ name: nextTerm.name,
147
+ description: nextTerm.description,
148
+ category: nextTerm.category,
149
+ status: nextTerm.status
150
+ }));
151
+ }
152
+ });
153
+ }
154
+ }
155
+ });
156
+ }
157
+ _.forEach(formConfig, (section) => {
158
+ _.forEach(section.fields, field => {
159
+ if (metaDataFields) {
160
+ if (_.has(metaDataFields, field.code)) {
161
+ field.default = _.get(metaDataFields, field.code);
162
+ }
163
+ else if (_.includes(['maxTime', 'warningTime'], field.code)) {
164
+ const value = _.get(metaDataFields, `timeLimits.${field.code}`);
165
+ field.default = !_.isEmpty(value) ?
166
+ moment.utc(moment.duration(value, 'seconds').asMilliseconds()).format(this.helperService.getTimerFormat(field)) : '';
167
+ }
168
+ }
169
+ if (field.code === 'framework') {
170
+ field.range = this.frameworkService.frameworkValues;
171
+ field.options = this.getFramework;
172
+ }
173
+ if (!_.includes(field.depends, 'framework') && !_.includes(field.code, 'target')) {
174
+ const frameworkCategory = _.find(categoryMasterList, category => {
175
+ return (category.code === field.sourceCategory || category.code === field.code);
176
+ });
177
+ if (!_.isEmpty(frameworkCategory)) {
178
+ field.terms = frameworkCategory.terms;
179
+ }
180
+ }
181
+ if (field.code === 'license') {
182
+ const defaultLicense = _.get(metaDataFields, field.code);
183
+ field.default = !_.isEmpty(defaultLicense) ? defaultLicense : this.editorService.editorConfig.context.defaultLicense;
184
+ const licenses = this.helperService.getAvailableLicenses();
185
+ field.range = licenses ? _.map(licenses, 'name') : [];
186
+ }
187
+ if (field.code === 'additionalCategories') {
188
+ const channelInfo = this.helperService.channelInfo;
189
+ const additionalCategories = _.uniq(_.get(channelInfo, `${this.configService.categoryConfig.additionalCategories[this.editorService.editorConfig.config.objectType]}`) ||
190
+ _.get(this.editorService.editorConfig, 'context.additionalCategories'));
191
+ if (!_.isEmpty(additionalCategories)) {
192
+ field.range = _.uniq(additionalCategories);
193
+ }
194
+ }
195
+ if (field.code === 'copyright') {
196
+ const channelData = this.helperService.channelInfo;
197
+ field.default = _.get(metaDataFields, field.code);
198
+ if (_.isEmpty(field.default) && this.editorService.editorConfig.config.setDefaultCopyRight) {
199
+ field.default = channelData && channelData.name;
200
+ }
201
+ }
202
+ if (field.code === 'maxQuestions') {
203
+ const activeNode = this.treeService.getActiveNode();
204
+ const rootFirstChildNode = this.editorService.getContentChildrens(activeNode);
205
+ if (rootFirstChildNode && rootFirstChildNode.length > 0) {
206
+ field.range = _.times(_.size(rootFirstChildNode), index => index + 1);
207
+ }
208
+ }
209
+ if (field.code === 'author') {
210
+ const defaultAuthor = _.get(metaDataFields, field.code);
211
+ field.default = !_.isEmpty(defaultAuthor) ? defaultAuthor : _.get(this.editorService.editorConfig, 'context.user.fullName');
212
+ }
213
+ if (field.code === 'showTimer') {
214
+ field.options = this.showTimer;
215
+ }
216
+ if (field.code === 'instructions') {
217
+ field.default = _.get(metaDataFields, 'instructions.default') || '';
218
+ }
219
+ if (field.code === 'setPeriod') {
220
+ field.default = !_.isEmpty(metaDataFields, 'endDate') ? 'Yes' : 'No';
221
+ }
222
+ if (field.code === 'allowECM') {
223
+ field.default = _.get(metaDataFields, 'recordedBy') !== 'Self' ? 'Yes' : 'No';
224
+ }
225
+ if (field.code === 'instances') {
226
+ field.default = !_.isEmpty(metaDataFields, 'instances') ? _.get(metaDataFields, 'instances.label') : '';
227
+ }
228
+ if ((_.isEmpty(field.range) || _.isEmpty(field.terms)) &&
229
+ !field.editable && !_.isEmpty(field.default)) {
230
+ if (_.has(field, 'terms')) {
231
+ field.terms = [];
232
+ if (_.isArray(field.default)) {
233
+ field.terms = field.default || [];
234
+ }
235
+ else {
236
+ field.terms.push(field.default);
237
+ }
238
+ }
239
+ else {
240
+ field.range = [];
241
+ if (_.isArray(field.default)) {
242
+ field.range = field.default;
243
+ }
244
+ else {
245
+ field.range.push(field.default);
246
+ }
247
+ }
248
+ }
249
+ if (field.inputType === 'nestedselect') {
250
+ _.map(field.range, val => {
251
+ return {
252
+ value: val.value || val,
253
+ label: val.value || val
254
+ };
255
+ });
256
+ }
257
+ const ifEditable = this.ifFieldIsEditable(field.code);
258
+ _.set(field, 'editable', ifEditable);
259
+ });
260
+ });
261
+ this.formFieldProperties = _.cloneDeep(formConfig);
262
+ console.log(this.formFieldProperties);
263
+ }
264
+ isReviewMode() {
265
+ return _.includes(['review', 'read', 'sourcingreview', 'orgreview'], this.editorService.editorMode);
266
+ }
267
+ ifFieldIsEditable(fieldCode) {
268
+ const ediorMode = this.editorService.editorMode;
269
+ if (!this.isReviewMode()) {
270
+ return true;
271
+ }
272
+ const editableFields = _.get(this.editorService.editorConfig.config, 'editableFields');
273
+ if (editableFields && !_.isEmpty(editableFields[ediorMode]) && _.includes(editableFields[ediorMode], fieldCode)) {
274
+ return true;
275
+ }
276
+ return false;
277
+ }
278
+ outputData(eventData) { }
279
+ onStatusChanges(event) {
280
+ this.toolbarEmitter.emit({ button: 'onFormStatusChange', event });
281
+ }
282
+ appIconDataHandler(event) {
283
+ this.appIcon = event.url;
284
+ this.treeService.updateAppIcon(event.url);
285
+ }
286
+ showTimer(control, depends, formGroup, loading, loaded) {
287
+ const oldValue = {};
288
+ const response = merge(..._.map(depends, depend => depend.valueChanges)).pipe(switchMap((value) => {
289
+ const isDependsInvalid = _.includes(_.map(depends, depend => depend.invalid), true);
290
+ const dependsKeyValue = _.map(depends, (depend, key) => {
291
+ return { [key]: depend.value };
292
+ });
293
+ if (!isDependsInvalid) {
294
+ const maxTimeValue = _.find(dependsKeyValue, 'maxTime');
295
+ if (maxTimeValue && maxTimeValue.maxTime === '00:00:00') {
296
+ return of(false);
297
+ }
298
+ return of(true);
299
+ }
300
+ else {
301
+ return of(false);
302
+ }
303
+ }));
304
+ return response;
305
+ }
306
+ getFramework(control, depends, formGroup, loading, loaded) {
307
+ const response = control.valueChanges.pipe(switchMap((value) => {
308
+ if (!_.isEmpty(value)) {
309
+ return framworkServiceTemp.getFrameworkCategories(value).pipe(map(res => {
310
+ const frameworkResponse = _.get(res, 'result');
311
+ framworkServiceTemp.selectedOrganisationFramework = frameworkResponse;
312
+ return frameworkResponse;
313
+ }));
314
+ }
315
+ else {
316
+ return of(null);
317
+ }
318
+ }));
319
+ return response;
320
+ }
321
+ valueChanges(event) {
322
+ if (_.has(event, 'shuffle')) {
323
+ this.showShuffleMessage(event);
324
+ }
325
+ const data = _.omit(event, ['allowECM', 'levels', 'setPeriod', 'instances']);
326
+ if (!_.isEmpty(event?.levels)) {
327
+ data.outcomeDeclaration = {
328
+ levels: this.createLeavels(event.levels)
329
+ };
330
+ }
331
+ if (!_.isEmpty(event?.instances)) {
332
+ data.instances = { label: event?.instances };
333
+ }
334
+ if (!_.isEmpty(this.appIcon) && this.showAppIcon) {
335
+ data.appIcon = this.appIcon;
336
+ }
337
+ if (this.isReviewMode() && !data.name) {
338
+ const nodeTitle = this.nodeMetadata?.data?.metadata?.name;
339
+ if (nodeTitle) {
340
+ data.name = nodeTitle;
341
+ }
342
+ }
343
+ this.toolbarEmitter.emit({ button: 'onFormValueChange', data });
344
+ this.treeService.updateNode(data);
345
+ }
346
+ createLeavels(levels) {
347
+ const obj = {};
348
+ _.forEach(levels, (el, index) => {
349
+ obj[`L${index + 1}`] = {
350
+ label: el
351
+ };
352
+ });
353
+ return obj;
354
+ }
355
+ ngOnDestroy() {
356
+ this.onComponentDestroy$.next();
357
+ this.onComponentDestroy$.complete();
358
+ if (this.subscription) {
359
+ this.subscription.unsubscribe();
360
+ }
361
+ }
362
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MetaFormComponent, deps: [{ token: i1.EditorService }, { token: i2.TreeService }, { token: i3.FrameworkService }, { token: i4.HelperService }, { token: i5.ConfigService }, { token: i6.ToasterService }], target: i0.ɵɵFactoryTarget.Component }); }
363
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MetaFormComponent, selector: "lib-meta-form", inputs: { rootFormConfig: "rootFormConfig", unitFormConfig: "unitFormConfig", nodeMetadata: "nodeMetadata" }, outputs: { toolbarEmitter: "toolbarEmitter" }, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"formFieldProperties\">\n <span class=\"meta-form\">\n <lib-collection-icon *ngIf=\"showAppIcon\" [appIcon]=\"appIcon\" [appIconConfig]=\"appIconConfig\" (iconEmitter)=\"appIconDataHandler($event)\"></lib-collection-icon>\n <sb-dynamic-form [config]=\"formFieldProperties\" (initialize)=\"outputData($event)\" (statusChanges)=\"onStatusChanges($event)\" (valueChanges)=\"valueChanges($event)\"></sb-dynamic-form>\n </span>\n</ng-container>", styles: ["@charset \"UTF-8\";.one-column-grid{display:grid;grid-template-columns:repeat(1,1fr);grid-template-rows:1fr 1fr;column-gap:.5rem}.two-column-grid{display:grid;grid-template-columns:repeat(2,1fr);column-gap:.5rem;border-bottom:solid 1px var(--gray-100)}.two-column-grid:last-child{border-bottom:none}.three-column-grid{display:grid;grid-template-columns:repeat(3,1fr);grid-template-rows:1fr 1fr;column-gap:.5rem}.formSection{padding:1.5rem 0}.formSection:first-child{padding:0 0 1.5rem}.multi-select-section-app{margin:.7rem 0!important}.multi-select-section-app label{margin-bottom:.3rem!important;z-index:inherit}.list-border{height:inherit!important;min-height:45px!important}.list-border ul{padding:0 22px 0 0!important;position:inherit!important}.list-border ul span{font-weight:500!important;font-size:.785rem;padding:1.4rem 0!important}.multi-select-container .sb-modal-dropdown-web ul{border:none!important}.sb-textbox,.topic-picker-selector,select,.sb-textarea,.list-border{border:1px solid rgba(34,36,38,.15)!important;padding:.85rem .5rem!important;border-radius:.28571429rem;font-size:.785rem!important;font-weight:500!important}.sb-keywordbox{border:1px solid rgba(34,36,38,.15)!important;padding:.45rem .5rem!important;border-radius:.28571429rem;font-size:.785rem!important;font-weight:500;padding:0!important}.sb-keywordbox .ng2-tag-input{padding:0}.sb-keywordbox .ng2-tag-input tag{margin-left:.5rem}.sb-keywordbox .ng2-tags-container{margin-top:.2rem}.sb-keywordbox .tag-wrapper,.sb-keywordbox delete-icon svg{height:24px!important;line-height:24px}label{font-size:12px!important;margin-bottom:.5rem!important;color:#121213e0;font-weight:500}.multi-select-container .caret-down.disabled+.list-border{cursor:not-allowed;background-color:#fafafa!important}\\200b .multi-select-container .list-border ul{font-size:12px!important;margin-bottom:.5rem!important;font-weight:500;color:#333;padding:0;margin:0!important;opacity:1!important;font-weight:500!important;position:inherit!important}.sb-dropdown label{padding:0!important}.sb-textarea-container .sb-textarea{height:2.9rem;padding-top:.5rem!important}.sb-textarea-container label{padding:0!important}.sb-checkbox{padding:1.5rem 0;margin-top:2rem}sb-icon-dropdown{top:10px!important;right:6px!important}.sb-textarea-container,.sb-dropdown{margin:1rem 0!important}.meta-form .dynamic-form .sb-search-input::-webkit-input-placeholder{padding-left:1.4rem!important}.meta-form .dynamic-form .required label:after{content:\"*\";margin:-.2em 0 0 .2em;color:#db2828}.meta-form .dynamic-form .required .multi-select-container .list-border ul:after{content:none!important}.meta-form .dynamic-form sb-dynamic-checkbox label{padding-left:1.5rem!important}.meta-form .dynamic-form sb-dynamic-checkbox label:after{color:#fff!important;width:1rem!important;height:1rem!important}.sb-textbox[disabled=true],[disabled=true].topic-picker-selector,.sb-textarea[disabled=true],.sb-dropdown-select[disabled],.treepicker-parent div[disabled=true]{opacity:1!important;font-weight:500!important;cursor:not-allowed;background-color:#fafafa!important}lib-meta-form sb-dynamic-form .dynamic-form{min-height:1100px}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.fs-8{font-size:.5rem}.fs-10{font-size:.625rem}.fs-12{font-size:.75rem}.fs-14{font-size:.875rem}.fs-16{font-size:1rem}.fs-18{font-size:1.125rem}.fs-20{font-size:1.25rem}.fs-22{font-size:1.375rem}.fs-24{font-size:1.5rem}.fs-26{font-size:1.625rem}.fs-28{font-size:1.75rem}.fs-30{font-size:1.875rem}.fs-36{font-size:2.25rem}\n"], dependencies: [{ kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8.DynamicFormComponent, selector: "sb-dynamic-form", inputs: ["config", "dataLoadStatusDelegate"], outputs: ["initialize", "finalize", "valueChanges", "statusChanges"] }, { kind: "component", type: i9.CollectionIconComponent, selector: "lib-collection-icon", inputs: ["appIcon", "appIconConfig"], outputs: ["iconEmitter"] }], encapsulation: i0.ViewEncapsulation.None }); }
364
+ }
365
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MetaFormComponent, decorators: [{
366
+ type: Component,
367
+ args: [{ selector: 'lib-meta-form', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"formFieldProperties\">\n <span class=\"meta-form\">\n <lib-collection-icon *ngIf=\"showAppIcon\" [appIcon]=\"appIcon\" [appIconConfig]=\"appIconConfig\" (iconEmitter)=\"appIconDataHandler($event)\"></lib-collection-icon>\n <sb-dynamic-form [config]=\"formFieldProperties\" (initialize)=\"outputData($event)\" (statusChanges)=\"onStatusChanges($event)\" (valueChanges)=\"valueChanges($event)\"></sb-dynamic-form>\n </span>\n</ng-container>", styles: ["@charset \"UTF-8\";.one-column-grid{display:grid;grid-template-columns:repeat(1,1fr);grid-template-rows:1fr 1fr;column-gap:.5rem}.two-column-grid{display:grid;grid-template-columns:repeat(2,1fr);column-gap:.5rem;border-bottom:solid 1px var(--gray-100)}.two-column-grid:last-child{border-bottom:none}.three-column-grid{display:grid;grid-template-columns:repeat(3,1fr);grid-template-rows:1fr 1fr;column-gap:.5rem}.formSection{padding:1.5rem 0}.formSection:first-child{padding:0 0 1.5rem}.multi-select-section-app{margin:.7rem 0!important}.multi-select-section-app label{margin-bottom:.3rem!important;z-index:inherit}.list-border{height:inherit!important;min-height:45px!important}.list-border ul{padding:0 22px 0 0!important;position:inherit!important}.list-border ul span{font-weight:500!important;font-size:.785rem;padding:1.4rem 0!important}.multi-select-container .sb-modal-dropdown-web ul{border:none!important}.sb-textbox,.topic-picker-selector,select,.sb-textarea,.list-border{border:1px solid rgba(34,36,38,.15)!important;padding:.85rem .5rem!important;border-radius:.28571429rem;font-size:.785rem!important;font-weight:500!important}.sb-keywordbox{border:1px solid rgba(34,36,38,.15)!important;padding:.45rem .5rem!important;border-radius:.28571429rem;font-size:.785rem!important;font-weight:500;padding:0!important}.sb-keywordbox .ng2-tag-input{padding:0}.sb-keywordbox .ng2-tag-input tag{margin-left:.5rem}.sb-keywordbox .ng2-tags-container{margin-top:.2rem}.sb-keywordbox .tag-wrapper,.sb-keywordbox delete-icon svg{height:24px!important;line-height:24px}label{font-size:12px!important;margin-bottom:.5rem!important;color:#121213e0;font-weight:500}.multi-select-container .caret-down.disabled+.list-border{cursor:not-allowed;background-color:#fafafa!important}\\200b .multi-select-container .list-border ul{font-size:12px!important;margin-bottom:.5rem!important;font-weight:500;color:#333;padding:0;margin:0!important;opacity:1!important;font-weight:500!important;position:inherit!important}.sb-dropdown label{padding:0!important}.sb-textarea-container .sb-textarea{height:2.9rem;padding-top:.5rem!important}.sb-textarea-container label{padding:0!important}.sb-checkbox{padding:1.5rem 0;margin-top:2rem}sb-icon-dropdown{top:10px!important;right:6px!important}.sb-textarea-container,.sb-dropdown{margin:1rem 0!important}.meta-form .dynamic-form .sb-search-input::-webkit-input-placeholder{padding-left:1.4rem!important}.meta-form .dynamic-form .required label:after{content:\"*\";margin:-.2em 0 0 .2em;color:#db2828}.meta-form .dynamic-form .required .multi-select-container .list-border ul:after{content:none!important}.meta-form .dynamic-form sb-dynamic-checkbox label{padding-left:1.5rem!important}.meta-form .dynamic-form sb-dynamic-checkbox label:after{color:#fff!important;width:1rem!important;height:1rem!important}.sb-textbox[disabled=true],[disabled=true].topic-picker-selector,.sb-textarea[disabled=true],.sb-dropdown-select[disabled],.treepicker-parent div[disabled=true]{opacity:1!important;font-weight:500!important;cursor:not-allowed;background-color:#fafafa!important}lib-meta-form sb-dynamic-form .dynamic-form{min-height:1100px}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.fs-8{font-size:.5rem}.fs-10{font-size:.625rem}.fs-12{font-size:.75rem}.fs-14{font-size:.875rem}.fs-16{font-size:1rem}.fs-18{font-size:1.125rem}.fs-20{font-size:1.25rem}.fs-22{font-size:1.375rem}.fs-24{font-size:1.5rem}.fs-26{font-size:1.625rem}.fs-28{font-size:1.75rem}.fs-30{font-size:1.875rem}.fs-36{font-size:2.25rem}\n"] }]
368
+ }], ctorParameters: function () { return [{ type: i1.EditorService }, { type: i2.TreeService }, { type: i3.FrameworkService }, { type: i4.HelperService }, { type: i5.ConfigService }, { type: i6.ToasterService }]; }, propDecorators: { rootFormConfig: [{
369
+ type: Input
370
+ }], unitFormConfig: [{
371
+ type: Input
372
+ }], nodeMetadata: [{
373
+ type: Input
374
+ }], toolbarEmitter: [{
375
+ type: Output
376
+ }] } });
377
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YS1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbGxlY3Rpb24tZWRpdG9yLWxpYnJhcnkvc3JjL2xpYi9jb21wb25lbnRzL21ldGEtZm9ybS9tZXRhLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29sbGVjdGlvbi1lZGl0b3ItbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvbWV0YS1mb3JtL21ldGEtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4SCxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3hELE9BQU8sS0FBSyxDQUFDLE1BQU0sV0FBVyxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVFuRSxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQzs7Ozs7Ozs7Ozs7QUFDakMsSUFBSSxtQkFBbUIsQ0FBQztBQVF4QixNQUFNLE9BQU8saUJBQWlCO0lBYTVCLFlBQW9CLGFBQTRCLEVBQVMsV0FBd0IsRUFDOUQsZ0JBQWtDLEVBQVUsYUFBNEIsRUFDdkUsYUFBNEIsRUFBVSxjQUE4QjtRQUZwRSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFTLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQzlELHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUN2RSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFVLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtR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LENBQUM7K0dBL1hVLGlCQUFpQjttR0FBakIsaUJBQWlCLHVPQ3BCOUIsc2RBS2U7OzRGRGVGLGlCQUFpQjtrQkFON0IsU0FBUzsrQkFDRSxlQUFlLGlCQUdWLGlCQUFpQixDQUFDLElBQUk7a1BBRzVCLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNJLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IG1lcmdlLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwsIGZpbHRlciwgc3dpdGNoTWFwLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBUcmVlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RyZWUvdHJlZS5zZXJ2aWNlJztcbmltcG9ydCB7IEVkaXRvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lZGl0b3IvZWRpdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgRnJhbWV3b3JrU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZyYW1ld29yay9mcmFtZXdvcmsuc2VydmljZSc7XG5pbXBvcnQgeyBIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaGVscGVyL2hlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29uZmlnL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdG9hc3Rlci90b2FzdGVyLnNlcnZpY2UnO1xuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5sZXQgZnJhbXdvcmtTZXJ2aWNlVGVtcDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLW1ldGEtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9tZXRhLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tZXRhLWZvcm0uY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgTWV0YUZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQElucHV0KCkgcm9vdEZvcm1Db25maWc6IGFueTtcbiAgQElucHV0KCkgdW5pdEZvcm1Db25maWc6IGFueTtcbiAgQElucHV0KCkgbm9kZU1ldGFkYXRhOiBhbnk7XG4gIEBPdXRwdXQoKSB0b29sYmFyRW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBwcml2YXRlIG9uQ29tcG9uZW50RGVzdHJveSQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIHB1YmxpYyBmcmFtZXdvcmtEZXRhaWxzOiBhbnkgPSB7fTtcbiAgcHVibGljIGZvcm1GaWVsZFByb3BlcnRpZXM6IGFueTtcbiAgcHVibGljIHNob3dBcHBJY29uID0gZmFsc2U7XG4gIHB1YmxpYyBhcHBJY29uQ29uZmlnOiBhbnk7XG4gIHB1YmxpYyBhcHBJY29uOiBhbnk7XG4gIHB1YmxpYyBwcmV2aW91c1NodWZmbGVWYWx1ZTogYm9vbGVhbjtcbiAgcHVibGljIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVkaXRvclNlcnZpY2U6IEVkaXRvclNlcnZpY2UsIHB1YmxpYyB0cmVlU2VydmljZTogVHJlZVNlcnZpY2UsXG4gICAgICAgICAgICAgIHB1YmxpYyBmcmFtZXdvcmtTZXJ2aWNlOiBGcmFtZXdvcmtTZXJ2aWNlLCBwcml2YXRlIGhlbHBlclNlcnZpY2U6IEhlbHBlclNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSwgcHJpdmF0ZSB0b2FzdGVyU2VydmljZTogVG9hc3RlclNlcnZpY2UpIHtcbiAgICAgICAgICAgICAgICBmcmFtd29ya1NlcnZpY2VUZW1wID0gZnJhbWV3b3JrU2VydmljZTtcbiAgICAgICAgICAgICAgIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICAvLyBJbml0aWFsaXplIGNvbXBvbmVudFxuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgdGhpcy5mZXRjaEZyYW1lV29ya0RldGFpbHMoKTtcbiAgICB0aGlzLnNldEFwcEljb25EYXRhKCk7XG4gICAgaWYgKF8uaGFzKHRoaXMubm9kZU1ldGFkYXRhLCAnZGF0YS5tZXRhZGF0YS5zaHVmZmxlJykpIHtcbiAgICAgIHRoaXMuc2V0U2h1ZmZsZVZhbHVlKHRoaXMubm9kZU1ldGFkYXRhLmRhdGEubWV0YWRhdGEuc2h1ZmZsZSk7XG4gICAgfVxuICB9XG5cbiAgc2V0QXBwSWNvbkRhdGEoKSB7XG4gICAgY29uc3QgaXNSb290Tm9kZSA9IF8uZ2V0KHRoaXMubm9kZU1ldGFkYXRhLCAnZGF0YS5yb290Jyk7XG4gICAgdGhpcy5hcHBJY29uQ29uZmlnID0gXy5maW5kKF8uZmxhdHRlbihfLm1hcCh0aGlzLnJvb3RGb3JtQ29uZmlnLCAnZmllbGRzJykpLCB7Y29kZTogJ2FwcEljb24nfSk7XG4gICAgaWYoXy5pc1VuZGVmaW5lZCh0aGlzLmFwcEljb25Db25maWcpKSB7XG4gICAgICB0aGlzLmFwcEljb25Db25maWcgPSBfLmZpbmQodGhpcy5yb290Rm9ybUNvbmZpZywge2NvZGU6ICdhcHBJY29uJ30pO1xuICAgIH1cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5hcHBJY29uQ29uZmlnKSAmJiBpc1Jvb3ROb2RlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnNob3dBcHBJY29uID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93QXBwSWNvbiA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmFwcEljb24gPSBfLmdldCh0aGlzLm5vZGVNZXRhZGF0YSwgJ2RhdGEubWV0YWRhdGEuYXBwSWNvbicpO1xuICAgIGlmICh0aGlzLmlzUmV2aWV3TW9kZSgpKSB7XG4gICAgICB0aGlzLmFwcEljb25Db25maWcgPSB7Li4udGhpcy5hcHBJY29uQ29uZmlnICwgLi4uIHtpc0FwcEljb25FZGl0YWJsZTogZmFsc2V9fTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hcHBJY29uQ29uZmlnID0gey4uLnRoaXMuYXBwSWNvbkNvbmZpZyAsIC4uLiB7aXNBcHBJY29uRWRpdGFibGU6IHRydWV9fTtcbiAgICB9XG4gICAgY29uc3QgaWZFZGl0YWJsZSA9IHRoaXMuaWZGaWVsZElzRWRpdGFibGUoJ2FwcEljb24nKTtcbiAgfVxuXG4gIHNldFNodWZmbGVWYWx1ZSh2YWx1ZSkge1xuICAgIGlmIChfLmlzQm9vbGVhbih2YWx1ZSkpIHtcbiAgICAgIHRoaXMuaGVscGVyU2VydmljZS5zZXRTaHVmZmxlVmFsdWUodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHNob3dTaHVmZmxlTWVzc2FnZShldmVudCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5oZWxwZXJTZXJ2aWNlLnNodWZmbGVWYWx1ZS5zdWJzY3JpYmUoc2h1ZmZsZSA9PiB0aGlzLnByZXZpb3VzU2h1ZmZsZVZhbHVlID0gc2h1ZmZsZSk7XG4gICAgaWYgKF8uaXNCb29sZWFuKGV2ZW50LnNodWZmbGUpICYmIGV2ZW50LnNodWZmbGUgPT09IHRydWUgJiYgXy5pc0Jvb2xlYW4odGhpcy5wcmV2aW91c1NodWZmbGVWYWx1ZSkgJiYgIHRoaXMucHJldmlvdXNTaHVmZmxlVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnNpbXBsZUluZm8oXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubGJsLnNodWZmbGVPbk1lc3NhZ2UnKSk7XG4gICAgfVxuICAgIHRoaXMuc2V0U2h1ZmZsZVZhbHVlKGV2ZW50LnNodWZmbGUpO1xuICB9XG5cbiAgZmV0Y2hGcmFtZVdvcmtEZXRhaWxzKCkge1xuICAgIGlmICh0aGlzLmZyYW1ld29ya1NlcnZpY2Uub3JnYW5pc2F0aW9uRnJhbWV3b3JrKSB7XG4gICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZnJhbWV3b3JrRGF0YSQucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMub25Db21wb25lbnREZXN0cm95JCksXG4gICAgICAgIGZpbHRlcihkYXRhID0+IF8uZ2V0KGRhdGEsIGBmcmFtZXdvcmtkYXRhLiR7dGhpcy5mcmFtZXdvcmtTZXJ2aWNlLm9yZ2FuaXNhdGlvbkZyYW1ld29ya31gKSlcbiAgICAgICkuc3Vic2NyaWJlKChmcmFtZXdvcmtEZXRhaWxzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGZyYW1ld29ya0RldGFpbHMgJiYgIWZyYW1ld29ya0RldGFpbHMuZXJyKSB7XG4gICAgICAgICAgY29uc3QgZnJhbWV3b3JrRGF0YSA9IGZyYW1ld29ya0RldGFpbHMuZnJhbWV3b3JrZGF0YVt0aGlzLmZyYW1ld29ya1NlcnZpY2Uub3JnYW5pc2F0aW9uRnJhbWV3b3JrXS5jYXRlZ29yaWVzO1xuICAgICAgICAgIHRoaXMuZnJhbWV3b3JrRGV0YWlscy5mcmFtZXdvcmtEYXRhID0gZnJhbWV3b3JrRGF0YTtcbiAgICAgICAgICB0aGlzLmZyYW1ld29ya0RldGFpbHMudG9waWNMaXN0ID0gXy5nZXQoXy5maW5kKGZyYW1ld29ya0RhdGEsIHtcbiAgICAgICAgICAgIGNvZGU6ICd0b3BpYydcbiAgICAgICAgICB9KSwgJ3Rlcm1zJyk7XG4gICAgICAgICAgdGhpcy5mcmFtZXdvcmtEZXRhaWxzLnRhcmdldEZyYW1ld29ya3MgPSBfLmZpbHRlcihmcmFtZXdvcmtEZXRhaWxzLmZyYW1ld29ya2RhdGEsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gXy5pbmNsdWRlcyh0aGlzLmZyYW1ld29ya1NlcnZpY2UudGFyZ2V0RnJhbWV3b3JrSWRzLCBrZXkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuYXR0YWNoRGVmYXVsdFZhbHVlcygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuZnJhbWV3b3JrU2VydmljZS50YXJnZXRGcmFtZXdvcmtJZHMpIHtcbiAgICAgICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmZyYW1ld29ya0RhdGEkLnBpcGUoXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMub25Db21wb25lbnREZXN0cm95JCksXG4gICAgICAgICAgZmlsdGVyKGRhdGEgPT4gXy5nZXQoZGF0YSwgYGZyYW1ld29ya2RhdGEuJHtfLmZpcnN0KHRoaXMuZnJhbWV3b3JrU2VydmljZS50YXJnZXRGcmFtZXdvcmtJZHMpfWApKVxuICAgICAgICApLnN1YnNjcmliZSgoZnJhbWV3b3JrRGV0YWlsczogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGZyYW1ld29ya0RldGFpbHMgJiYgIWZyYW1ld29ya0RldGFpbHMuZXJyKSB7XG4gICAgICAgICAgICAvLyBjb25zdCBmcmFtZXdvcmtEYXRhID0gZnJhbWV3b3JrRGV0YWlscy5mcmFtZXdvcmtkYXRhW3RoaXMuZnJhbWV3b3JrU2VydmljZS50YXJnZXRGcmFtZXdvcmtJZHNdLmNhdGVnb3JpZXM7XG4gICAgICAgICAgICAvLyB0aGlzLmZyYW1ld29ya0RldGFpbHMuZnJhbWV3b3JrRGF0YSA9IGZyYW1ld29ya0RhdGE7XG4gICAgICAgICAgICAvLyB0aGlzLmZyYW1ld29ya0RldGFpbHMudG9waWNMaXN0ID0gXy5nZXQoXy5maW5kKGZyYW1ld29ya0RhdGEsIHtcbiAgICAgICAgICAgIC8vICAgY29kZTogJ3RvcGljJ1xuICAgICAgICAgICAgLy8gfSksICd0ZXJtcycpO1xuICAgICAgICAgICAgdGhpcy5mcmFtZXdvcmtEZXRhaWxzLnRhcmdldEZyYW1ld29ya3MgPSBfLmZpbHRlcihmcmFtZXdvcmtEZXRhaWxzLmZyYW1ld29ya2RhdGEsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBfLmluY2x1ZGVzKHRoaXMuZnJhbWV3b3JrU2VydmljZS50YXJnZXRGcmFtZXdvcmtJZHMsIGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNoRGVmYXVsdFZhbHVlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXR0YWNoRGVmYXVsdFZhbHVlcygpIHtcbiAgICBjb25zdCBtZXRhRGF0YUZpZWxkcyA9IF8uZ2V0KHRoaXMubm9kZU1ldGFkYXRhLCAnZGF0YS5tZXRhZGF0YScpO1xuICAgIC8vIGlmIChfLmlzRW1wdHkobWV0YURhdGFGaWVsZHMpKSB7IHJldHVybjsgfVxuICAgIGNvbnN0IGlzUm9vdCA9IF8uZ2V0KG1ldGFEYXRhRmllbGRzLCAnZGF0YS5yb290Jyk7XG4gICAgY29uc3QgY2F0ZWdvcnlNYXN0ZXJMaXN0ID0gdGhpcy5mcmFtZXdvcmtEZXRhaWxzLmZyYW1ld29ya0RhdGEgfHxcbiAgICAhaXNSb290ICYmIHRoaXMuZnJhbWV3b3JrU2VydmljZS5zZWxlY3RlZE9yZ2FuaXNhdGlvbkZyYW1ld29yayAmJlxuICAgICBfLmdldCh0aGlzLmZyYW1ld29ya1NlcnZpY2Uuc2VsZWN0ZWRPcmdhbmlzYXRpb25GcmFtZXdvcmssICdmcmFtZXdvcmsuY2F0ZWdvcmllcycpO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICBsZXQgZm9ybUNvbmZpZzogYW55ID0gKF8uZ2V0KG1ldGFEYXRhRmllbGRzLCAndmlzaWJpbGl0eScpID09PSAnRGVmYXVsdCcpID8gXy5jbG9uZURlZXAodGhpcy5yb290Rm9ybUNvbmZpZykgOiBfLmNsb25lRGVlcCh0aGlzLnVuaXRGb3JtQ29uZmlnKTtcbiAgICBmb3JtQ29uZmlnID0gZm9ybUNvbmZpZyAmJiBfLmhhcyhfLmZpcnN0KGZvcm1Db25maWcpLCAnZmllbGRzJykgPyBmb3JtQ29uZmlnIDogW3tuYW1lOiAnJywgZmllbGRzOiBmb3JtQ29uZmlnfV07XG4gICAgaWYgKCFfLmlzRW1wdHkodGhpcy5mcmFtZXdvcmtEZXRhaWxzLnRhcmdldEZyYW1ld29ya3MpKSB7XG4gICAgICBjb25zdCBmaWVsZFRlcm1zTWFwID0gbmV3IE1hcCgpO1xuICAgICAgXy5mb3JFYWNoKHRoaXMuZnJhbWV3b3JrRGV0YWlscy50YXJnZXRGcmFtZXdvcmtzLCAoZnJhbWV3b3JrKSA9PiB7XG4gICAgICAgIF8uZm9yRWFjaChmb3JtQ29uZmlnLCAoc2VjdGlvbikgPT4ge1xuICAgICAgICAgIF8uZm9yRWFjaChzZWN0aW9uLmZpZWxkcywgZmllbGQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZnJhbWV3b3JrQ2F0ZWdvcnkgPSBfLmZpbmQoZnJhbWV3b3JrLmNhdGVnb3JpZXMsIGNhdGVnb3J5ID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNhdGVnb3J5LmNvZGUgPT09IGZpZWxkLnNvdXJjZUNhdGVnb3J5ICYmIF8uaW5jbHVkZXMoZmllbGQuY29kZSwgJ3RhcmdldCcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIV8uaXNFbXB0eShmcmFtZXdvcmtDYXRlZ29yeSkpIHtcbiAgICAgICAgICAgICAgZmllbGQudGVybXMgPSBfLmNsb25lRGVlcChmcmFtZXdvcmtDYXRlZ29yeS50ZXJtcyk7XG4gICAgICAgICAgICAgIGZpZWxkVGVybXNNYXAuc2V0KGZpZWxkLmNvZGUsIGZpZWxkLnRlcm1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgXy5mb3JFYWNoKGZvcm1Db25maWcsIChzZWN0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IHNlY3Rpb24uZmllbGRzIHx8IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50RmllbGQgPSBmaWVsZHNbaV07XG4gICAgICAgICAgY29uc3QgbmV4dEZpZWxkID0gZmllbGRzW2kgKyAxXTtcbiAgICAgICAgICBjb25zdCBuZXh0RmllbGREZXBlbmRzT25DdXJyZW50ID0gbmV4dEZpZWxkLmRlcGVuZHMgJiYgQXJyYXkuaXNBcnJheShuZXh0RmllbGQuZGVwZW5kcykgJiYgbmV4dEZpZWxkLmRlcGVuZHMuaW5jbHVkZXMoY3VycmVudEZpZWxkLmNvZGUpO1xuICAgICAgICAgIGlmIChjdXJyZW50RmllbGQudGVybXMgJiYgZmllbGRUZXJtc01hcC5oYXMobmV4dEZpZWxkLmNvZGUpICYmIG5leHRGaWVsZERlcGVuZHNPbkN1cnJlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRGaWVsZFRlcm1zID0gZmllbGRUZXJtc01hcC5nZXQobmV4dEZpZWxkLmNvZGUpO1xuICAgICAgICAgICAgY3VycmVudEZpZWxkLnRlcm1zLmZvckVhY2godGVybSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0ZXJtICYmICghdGVybS5hc3NvY2lhdGlvbnMgfHwgXy5pc0VtcHR5KHRlcm0uYXNzb2NpYXRpb25zKSkpIHsgIFxuICAgICAgICAgICAgICAgIHRlcm0uYXNzb2NpYXRpb25zID0gbmV4dEZpZWxkVGVybXMubWFwKG5leHRUZXJtID0+ICh7XG4gICAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiBuZXh0VGVybS5pZGVudGlmaWVyLFxuICAgICAgICAgICAgICAgICAgY29kZTogbmV4dFRlcm0uY29kZSxcbiAgICAgICAgICAgICAgICAgIG5hbWU6IG5leHRUZXJtLm5hbWUsXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogbmV4dFRlcm0uZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICBjYXRlZ29yeTogbmV4dFRlcm0uY2F0ZWdvcnksXG4gICAgICAgICAgICAgICAgICBzdGF0dXM6IG5leHRUZXJtLnN0YXR1c1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBfLmZvckVhY2goZm9ybUNvbmZpZywgKHNlY3Rpb24pID0+IHtcbiAgICAgIF8uZm9yRWFjaChzZWN0aW9uLmZpZWxkcywgZmllbGQgPT4ge1xuXG4gICAgICAgIGlmIChtZXRhRGF0YUZpZWxkcykge1xuICAgICAgICAgIGlmIChfLmhhcyhtZXRhRGF0YUZpZWxkcywgZmllbGQuY29kZSkpIHtcbiAgICAgICAgICAgIGZpZWxkLmRlZmF1bHQgPSBfLmdldChtZXRhRGF0YUZpZWxkcywgZmllbGQuY29kZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChfLmluY2x1ZGVzKFsnbWF4VGltZScsICd3YXJuaW5nVGltZSddLCBmaWVsZC5jb2RlKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBfLmdldChtZXRhRGF0YUZpZWxkcywgYHRpbWVMaW1pdHMuJHtmaWVsZC5jb2RlfWApO1xuICAgICAgICAgICAgZmllbGQuZGVmYXVsdCA9ICFfLmlzRW1wdHkodmFsdWUpID9cbiAgICAgICAgICAgIG1vbWVudC51dGMobW9tZW50LmR1cmF0aW9uKHZhbHVlLCAnc2Vjb25kcycpLmFzTWlsbGlzZWNvbmRzKCkpLmZvcm1hdCh0aGlzLmhlbHBlclNlcnZpY2UuZ2V0VGltZXJGb3JtYXQoZmllbGQpKSA6ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmllbGQuY29kZSA9PT0gJ2ZyYW1ld29yaycpIHtcbiAgICAgICAgICBmaWVsZC5yYW5nZSA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5mcmFtZXdvcmtWYWx1ZXM7XG4gICAgICAgICAgZmllbGQub3B0aW9ucyA9IHRoaXMuZ2V0RnJhbWV3b3JrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFfLmluY2x1ZGVzKGZpZWxkLmRlcGVuZHMsICdmcmFtZXdvcmsnKSAmJiAhXy5pbmNsdWRlcyhmaWVsZC5jb2RlLCAndGFyZ2V0JykpIHtcbiAgICAgICAgICBjb25zdCBmcmFtZXdvcmtDYXRlZ29yeSA9IF8uZmluZChjYXRlZ29yeU1hc3Rlckxpc3QsIGNhdGVnb3J5ID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIChjYXRlZ29yeS5jb2RlID09PSBmaWVsZC5zb3VyY2VDYXRlZ29yeSB8fCBjYXRlZ29yeS5jb2RlID09PSBmaWVsZC5jb2RlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIV8uaXNFbXB0eShmcmFtZXdvcmtDYXRlZ29yeSkpIHtcbiAgICAgICAgICAgICAgZmllbGQudGVybXMgPSBmcmFtZXdvcmtDYXRlZ29yeS50ZXJtcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmllbGQuY29kZSA9PT0gJ2xpY2Vuc2UnKSB7XG4gICAgICAgICAgY29uc3QgZGVmYXVsdExpY2Vuc2UgPSBfLmdldChtZXRhRGF0YUZpZWxkcywgZmllbGQuY29kZSk7XG4gICAgICAgICAgZmllbGQuZGVmYXVsdCA9ICFfLmlzRW1wdHkoZGVmYXVsdExpY2Vuc2UpID8gZGVmYXVsdExpY2Vuc2UgOiB0aGlzLmVkaXRvclNlcnZpY2UuZWRpdG9yQ29uZmlnLmNvbnRleHQuZGVmYXVsdExpY2Vuc2U7XG4gICAgICAgICAgY29uc3QgbGljZW5zZXMgPSB0aGlzLmhlbHBlclNlcnZpY2UuZ2V0QXZhaWxhYmxlTGljZW5zZXMoKTtcbiAgICAgICAgICBmaWVsZC5yYW5nZSA9IGxpY2Vuc2VzID8gXy5tYXAobGljZW5zZXMsICduYW1lJykgOiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWVsZC5jb2RlID09PSAnYWRkaXRpb25hbENhdGVnb3JpZXMnKSB7XG4gICAgICAgICAgY29uc3QgY2hhbm5lbEluZm8gPSB0aGlzLmhlbHBlclNlcnZpY2UuY2hhbm5lbEluZm87XG4gICAgICAgICAgY29uc3QgYWRkaXRpb25hbENhdGVnb3JpZXMgPSBfLnVuaXEoXy5nZXQoY2hhbm5lbEluZm8sXG4gICAgICAgICAgICBgJHt0aGlzLmNvbmZpZ1NlcnZpY2UuY2F0ZWdvcnlDb25maWcuYWRkaXRpb25hbENhdGVnb3JpZXNbdGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvckNvbmZpZy5jb25maWcub2JqZWN0VHlwZV19YCkgfHxcbiAgICAgICAgICAgXy5nZXQodGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvckNvbmZpZywgJ2NvbnRleHQuYWRkaXRpb25hbENhdGVnb3JpZXMnKSk7XG4gICAgICAgICAgaWYgKCFfLmlzRW1wdHkoYWRkaXRpb25hbENhdGVnb3JpZXMpKSB7XG4gICAgICAgICAgICBmaWVsZC5yYW5nZSA9IF8udW5pcShhZGRpdGlvbmFsQ2F0ZWdvcmllcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpZWxkLmNvZGUgID09PSAnY29weXJpZ2h0Jykge1xuICAgICAgICAgIGNvbnN0IGNoYW5uZWxEYXRhID0gdGhpcy5oZWxwZXJTZXJ2aWNlLmNoYW5uZWxJbmZvO1xuICAgICAgICAgIGZpZWxkLmRlZmF1bHQgPSBfLmdldChtZXRhRGF0YUZpZWxkcywgZmllbGQuY29kZSk7XG4gICAgICAgICAgaWYgKF8uaXNFbXB0eShmaWVsZC5kZWZhdWx0KSAmJiB0aGlzLmVkaXRvclNlcnZpY2UuZWRpdG9yQ29uZmlnLmNvbmZpZy5zZXREZWZhdWx0Q29weVJpZ2h0KSB7XG4gICAgICAgICAgICBmaWVsZC5kZWZhdWx0ID0gY2hhbm5lbERhdGEgJiYgY2hhbm5lbERhdGEubmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmllbGQuY29kZSA9PT0gJ21heFF1ZXN0aW9ucycpIHtcbiAgICAgICAgICBjb25zdCBhY3RpdmVOb2RlID0gdGhpcy50cmVlU2VydmljZS5nZXRBY3RpdmVOb2RlKCk7XG4gICAgICAgICAgY29uc3Qgcm9vdEZpcnN0Q2hpbGROb2RlID0gdGhpcy5lZGl0b3JTZXJ2aWNlLmdldENvbnRlbnRDaGlsZHJlbnMoYWN0aXZlTm9kZSk7XG4gICAgICAgICAgaWYgKHJvb3RGaXJzdENoaWxkTm9kZSAmJiByb290Rmlyc3RDaGlsZE5vZGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmllbGQucmFuZ2UgPSBfLnRpbWVzKF8uc2l6ZShyb290Rmlyc3RDaGlsZE5vZGUpLCBpbmRleCA9PiBpbmRleCArIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWVsZC5jb2RlID09PSAnYXV0aG9yJykge1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHRBdXRob3IgPSBfLmdldChtZXRhRGF0YUZpZWxkcywgZmllbGQuY29kZSk7XG4gICAgICAgICAgZmllbGQuZGVmYXVsdCA9ICFfLmlzRW1wdHkoZGVmYXVsdEF1dGhvcikgPyBkZWZhdWx0QXV0aG9yIDogIF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LnVzZXIuZnVsbE5hbWUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWVsZC5jb2RlID09PSAnc2hvd1RpbWVyJykge1xuICAgICAgICAgIGZpZWxkLm9wdGlvbnMgPSB0aGlzLnNob3dUaW1lcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmllbGQuY29kZSA9PT0gJ2luc3RydWN0aW9ucycpIHtcbiAgICAgICAgICBmaWVsZC5kZWZhdWx0ID0gXy5nZXQobWV0YURhdGFGaWVsZHMsICdpbnN0cnVjdGlvbnMuZGVmYXVsdCcpIHx8ICcnIDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmllbGQuY29kZSA9PT0gJ3NldFBlcmlvZCcpIHtcbiAgICAgICAgICBmaWVsZC5kZWZhdWx0ID0gIV8uaXNFbXB0eShtZXRhRGF0YUZpZWxkcywgJ2VuZERhdGUnKSA/ICdZZXMnIDogJ05vJyA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpZWxkLmNvZGUgPT09ICdhbGxvd0VDTScpIHtcbiAgICAgICAgICBmaWVsZC5kZWZhdWx0ID0gXy5nZXQobWV0YURhdGFGaWVsZHMsICdyZWNvcmRlZEJ5JykgIT09ICdTZWxmJyA/ICdZZXMnIDogJ05vJyA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmllbGQuY29kZSA9PT0gJ2luc3RhbmNlcycpIHtcbiAgICAgICAgICBmaWVsZC5kZWZhdWx0ID0gICFfLmlzRW1wdHkobWV0YURhdGFGaWVsZHMsICdpbnN0YW5jZXMnKSA/IF8uZ2V0KG1ldGFEYXRhRmllbGRzLCAnaW5zdGFuY2VzLmxhYmVsJykgOiAnJyA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKF8uaXNFbXB0eShmaWVsZC5yYW5nZSkgfHwgXy5pc0VtcHR5KGZpZWxkLnRlcm1zKSkgJiZcbiAgICAgICAgICAhZmllbGQuZWRpdGFibGUgJiYgIV8uaXNFbXB0eShmaWVsZC5kZWZhdWx0KSkge1xuICAgICAgICAgIGlmIChfLmhhcyhmaWVsZCwgJ3Rlcm1zJykpIHtcbiAgICAgICAgICAgIGZpZWxkLnRlcm1zID0gW107XG4gICAgICAgICAgICBpZiAoXy5pc0FycmF5KGZpZWxkLmRlZmF1bHQpKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnRlcm1zID0gZmllbGQuZGVmYXVsdCB8fCBbXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZpZWxkLnRlcm1zLnB1c2goZmllbGQuZGVmYXVsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpZWxkLnJhbmdlID0gW107XG4gICAgICAgICAgICBpZiAoXy5pc0FycmF5KGZpZWxkLmRlZmF1bHQpKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnJhbmdlID0gZmllbGQuZGVmYXVsdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZpZWxkLnJhbmdlLnB1c2goZmllbGQuZGVmYXVsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpZWxkLmlucHV0VHlwZSA9PT0gJ25lc3RlZHNlbGVjdCcpIHtcbiAgICAgICAgICBfLm1hcChmaWVsZC5yYW5nZSwgdmFsID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHZhbHVlOiB2YWwudmFsdWUgfHwgdmFsLFxuICAgICAgICAgICAgICBsYWJlbDogdmFsLnZhbHVlIHx8IHZhbFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlmRWRpdGFibGUgPSB0aGlzLmlmRmllbGRJc0VkaXRhYmxlKGZpZWxkLmNvZGUpOyBcbiAgICAgICAgXy5zZXQoZmllbGQsICdlZGl0YWJsZScsIGlmRWRpdGFibGUpO1xuXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuZm9ybUZpZWxkUHJvcGVydGllcyA9IF8uY2xvbmVEZWVwKGZvcm1Db25maWcpO1xuICAgIGNvbnNvbGUubG9nKHRoaXMuZm9ybUZpZWxkUHJvcGVydGllcyk7XG4gIH1cbiAgaXNSZXZpZXdNb2RlKCkge1xuICAgIHJldHVybiAgXy5pbmNsdWRlcyhbICdyZXZpZXcnLCAncmVhZCcsICdzb3VyY2luZ3JldmlldycsICdvcmdyZXZpZXcnIF0sIHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JNb2RlKTtcbiAgfVxuICBpZkZpZWxkSXNFZGl0YWJsZShmaWVsZENvZGUpIHtcbiAgICBjb25zdCBlZGlvck1vZGUgPSB0aGlzLmVkaXRvclNlcnZpY2UuZWRpdG9yTW9kZTtcbiAgICBpZiAoIXRoaXMuaXNSZXZpZXdNb2RlKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBlZGl0YWJsZUZpZWxkcyA9IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcuY29uZmlnLCAnZWRpdGFibGVGaWVsZHMnKTtcbiAgICBpZiAoZWRpdGFibGVGaWVsZHMgJiYgIV8uaXNFbXB0eShlZGl0YWJsZUZpZWxkc1tlZGlvck1vZGVdKSAmJiBfLmluY2x1ZGVzKGVkaXRhYmxlRmllbGRzW2VkaW9yTW9kZV0sIGZpZWxkQ29kZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgb3V0cHV0RGF0YShldmVudERhdGE6IGFueSkgeyB9XG5cbiAgb25TdGF0dXNDaGFuZ2VzKGV2ZW50KSB7XG4gICAgdGhpcy50b29sYmFyRW1pdHRlci5lbWl0KHsgYnV0dG9uOiAnb25Gb3JtU3RhdHVzQ2hhbmdlJywgZXZlbnQgfSk7XG4gIH1cblxuICBhcHBJY29uRGF0YUhhbmRsZXIoZXZlbnQpIHtcbiAgICB0aGlzLmFwcEljb24gPSBldmVudC51cmw7XG4gICAgdGhpcy50cmVlU2VydmljZS51cGRhdGVBcHBJY29uKGV2ZW50LnVybCk7XG4gIH1cblxuICBzaG93VGltZXIoY29udHJvbCwgZGVwZW5kczogRm9ybUNvbnRyb2xbXSwgZm9ybUdyb3VwOiBGb3JtR3JvdXAsIGxvYWRpbmcsIGxvYWRlZCkge1xuICAgIGNvbnN0IG9sZFZhbHVlID0ge307XG4gICAgY29uc3QgcmVzcG9uc2UgPSBtZXJnZSguLi5fLm1hcChkZXBlbmRzLCBkZXBlbmQgPT4gZGVwZW5kLnZhbHVlQ2hhbmdlcykpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgaXNEZXBlbmRzSW52YWxpZCA9IF8uaW5jbHVkZXMoXy5tYXAoZGVwZW5kcywgZGVwZW5kID0+IGRlcGVuZC5pbnZhbGlkKSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IGRlcGVuZHNLZXlWYWx1ZSA9IF8ubWFwKGRlcGVuZHMsIChkZXBlbmQsIGtleSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7IFtrZXldOiBkZXBlbmQudmFsdWUgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghaXNEZXBlbmRzSW52YWxpZCkge1xuICAgICAgICAgIGNvbnN0IG1heFRpbWVWYWx1ZSA9IF8uZmluZChkZXBlbmRzS2V5VmFsdWUsICdtYXhUaW1lJyk7XG4gICAgICAgICAgaWYgKCBtYXhUaW1lVmFsdWUgJiYgbWF4VGltZVZhbHVlLm1heFRpbWUgPT09ICcwMDowMDowMCcpIHtcbiAgICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgZ2V0RnJhbWV3b3JrKGNvbnRyb2wsIGRlcGVuZHM6IEZvcm1Db250cm9sW10sIGZvcm1Hcm91cDogRm9ybUdyb3VwLCBsb2FkaW5nLCBsb2FkZWQpIHtcbiAgICBjb25zdCByZXNwb25zZSA9ICBjb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgc3dpdGNoTWFwKCh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIGlmICghXy5pc0VtcHR5KHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBmcmFtd29ya1NlcnZpY2VUZW1wLmdldEZyYW1ld29ya0NhdGVnb3JpZXModmFsdWUpLnBpcGUobWFwKHJlcyA9PiB7XG4gICAgICAgICAgICBjb25zdCBmcmFtZXdvcmtSZXNwb25zZSA9IF8uZ2V0KHJlcywgJ3Jlc3VsdCcpO1xuICAgICAgICAgICAgZnJhbXdvcmtTZXJ2aWNlVGVtcC5zZWxlY3RlZE9yZ2FuaXNhdGlvbkZyYW1ld29yayA9IGZyYW1ld29ya1Jlc3BvbnNlO1xuICAgICAgICAgICAgcmV0dXJuIGZyYW1ld29ya1Jlc3BvbnNlO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICB2YWx1ZUNoYW5nZXMoZXZlbnQ6IGFueSkge1xuICAgIGlmIChfLmhhcyhldmVudCwgJ3NodWZmbGUnKSkge1xuICAgICAgdGhpcy5zaG93U2h1ZmZsZU1lc3NhZ2UoZXZlbnQpO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gXy5vbWl0KGV2ZW50LCBbJ2FsbG93RUNNJywgJ2xldmVscycsICdzZXRQZXJpb2QnLCAnaW5zdGFuY2VzJ10pO1xuICAgIGlmICghXy5pc0VtcHR5KGV2ZW50Py5sZXZlbHMpKSB7XG4gICAgICBkYXRhLm91dGNvbWVEZWNsYXJhdGlvbiA9IHtcbiAgICAgICAgbGV2ZWxzOiB0aGlzLmNyZWF0ZUxlYXZlbHMoZXZlbnQubGV2ZWxzKVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCFfLmlzRW1wdHkoZXZlbnQ/Lmluc3RhbmNlcykpIHtcbiAgICAgIGRhdGEuaW5zdGFuY2VzID0geyBsYWJlbDogZXZlbnQ/Lmluc3RhbmNlcyB9O1xuICAgIH1cbiAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLmFwcEljb24pICYmIHRoaXMuc2hvd0FwcEljb24pIHtcbiAgICAgIGRhdGEuYXBwSWNvbiA9IHRoaXMuYXBwSWNvbjtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMuaXNSZXZpZXdNb2RlKCkgJiYgIWRhdGEubmFtZSkge1xuICAgICAgY29uc3Qgbm9kZVRpdGxlID0gdGhpcy5ub2RlTWV0YWRhdGE/LmRhdGE/Lm1ldGFkYXRhPy5uYW1lO1xuICAgICAgaWYgKG5vZGVUaXRsZSkge1xuICAgICAgICBkYXRhLm5hbWUgPSBub2RlVGl0bGU7XG4gICAgICB9XG4gICAgfVxuICAgICAgXG4gICAgdGhpcy50b29sYmFyRW1pdHRlci5lbWl0KHsgYnV0dG9uOiAnb25Gb3JtVmFsdWVDaGFuZ2UnLCBkYXRhIH0pO1xuICAgIHRoaXMudHJlZVNlcnZpY2UudXBkYXRlTm9kZShkYXRhKTtcbiAgfVxuXG4gIGNyZWF0ZUxlYXZlbHMobGV2ZWxzKSB7XG4gICAgY29uc3Qgb2JqID0ge307XG4gICAgXy5mb3JFYWNoKGxldmVscywgKGVsLCBpbmRleCkgPT4ge1xuICAgICAgb2JqW2BMJHtpbmRleCArIDF9YF0gPSB7XG4gICAgICAgICBsYWJlbCA6IGVsXG4gICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLm9uQ29tcG9uZW50RGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMub25Db21wb25lbnREZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cbn0iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybUZpZWxkUHJvcGVydGllc1wiPlxuICA8c3BhbiBjbGFzcz1cIm1ldGEtZm9ybVwiPlxuICAgIDxsaWItY29sbGVjdGlvbi1pY29uICpuZ0lmPVwic2hvd0FwcEljb25cIiBbYXBwSWNvbl09XCJhcHBJY29uXCIgW2FwcEljb25Db25maWddPVwiYXBwSWNvbkNvbmZpZ1wiIChpY29uRW1pdHRlcik9XCJhcHBJY29uRGF0YUhhbmRsZXIoJGV2ZW50KVwiPjwvbGliLWNvbGxlY3Rpb24taWNvbj5cbiAgICA8c2ItZHluYW1pYy1mb3JtIFtjb25maWddPVwiZm9ybUZpZWxkUHJvcGVydGllc1wiIChpbml0aWFsaXplKT1cIm91dHB1dERhdGEoJGV2ZW50KVwiIChzdGF0dXNDaGFuZ2VzKT1cIm9uU3RhdHVzQ2hhbmdlcygkZXZlbnQpXCIgKHZhbHVlQ2hhbmdlcyk9XCJ2YWx1ZUNoYW5nZXMoJGV2ZW50KVwiPjwvc2ItZHluYW1pYy1mb3JtPlxuICA8L3NwYW4+XG48L25nLWNvbnRhaW5lcj4iXX0=